diff --git a/src/query-builder/SelectQueryBuilder.ts b/src/query-builder/SelectQueryBuilder.ts index 821be3186c3..11cb61b0a47 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -36,6 +36,7 @@ import {SelectQueryBuilderOption} from "./SelectQueryBuilderOption"; import {ObjectUtils} from "../util/ObjectUtils"; import {DriverUtils} from "../driver/DriverUtils"; import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver"; +import {CockroachDriver} from "../driver/cockroachdb/CockroachDriver"; /** * Allows to build complex sql queries in a fashion way and execute those queries. @@ -1787,6 +1788,16 @@ export class SelectQueryBuilder extends QueryBuilder implements return `${distinctAlias}.${propertyName}`; }).join(" || ") + ")) as \"cnt\""; + } else if (this.connection.driver instanceof CockroachDriver) { + countSql = `COUNT(DISTINCT(CONCAT(` + metadata.primaryColumns.map((primaryColumn, index) => { + const propertyName = this.escape(primaryColumn.databaseName); + return `${distinctAlias}.${propertyName}::text`; + }).join(", ") + "))) as \"cnt\""; + } else if (this.connection.driver instanceof OracleDriver) { + countSql = `COUNT(DISTINCT(` + metadata.primaryColumns.map((primaryColumn, index) => { + const propertyName = this.escape(primaryColumn.databaseName); + return `${distinctAlias}.${propertyName}`; + }).join(" || ") + ")) as \"cnt\""; } else { countSql = `COUNT(DISTINCT(CONCAT(` + metadata.primaryColumns.map((primaryColumn, index) => { const propertyName = this.escape(primaryColumn.databaseName); diff --git a/test/functional/query-builder/count/entity/Test.ts b/test/functional/query-builder/count/entity/Test.ts new file mode 100644 index 00000000000..360fce0ac07 --- /dev/null +++ b/test/functional/query-builder/count/entity/Test.ts @@ -0,0 +1,13 @@ +import {Entity, PrimaryColumn} from "../../../../../src"; + +@Entity("tests") +export class Test { + @PrimaryColumn() + varcharField: string; + + @PrimaryColumn("uuid") + uuidField: string; + + @PrimaryColumn() + intField: number; +} diff --git a/test/functional/query-builder/count/query-builder-count.ts b/test/functional/query-builder/count/query-builder-count.ts new file mode 100644 index 00000000000..39990f9d38b --- /dev/null +++ b/test/functional/query-builder/count/query-builder-count.ts @@ -0,0 +1,22 @@ +import {closeTestingConnections, createTestingConnections, reloadTestingDatabases} from "../../../utils/test-utils"; +import {Connection} from "../../../../src/connection/Connection"; +import {expect} from "chai"; +import {Test} from "./entity/Test"; + +describe("query builder > count", () => { + + let connections: Connection[]; + before(async () => connections = await createTestingConnections({ + entities: [Test], + schemaCreate: true, + dropSchema: true, + })); + beforeEach(() => reloadTestingDatabases(connections)); + after(() => closeTestingConnections(connections)); + + it("Count query should be completed successfully", () => Promise.all(connections.map(async connection => { + const count = await connection.getRepository(Test).count(); + expect(count).to.be.equal(0); + }))); + +});