typeorm 0.3.12-dev.ae91c05 → 0.3.12-dev.b8704f8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/data-source/DataSource.js +1 -1
- package/browser/data-source/DataSource.js.map +1 -1
- package/browser/decorator/options/SpatialColumnOptions.d.ts +2 -1
- package/browser/decorator/options/SpatialColumnOptions.js.map +1 -1
- package/browser/driver/Driver.d.ts +1 -1
- package/browser/driver/Driver.js.map +1 -1
- package/browser/driver/DriverUtils.js +1 -1
- package/browser/driver/DriverUtils.js.map +1 -1
- package/browser/driver/aurora-mysql/AuroraMysqlDriver.d.ts +2 -1
- package/browser/driver/aurora-mysql/AuroraMysqlDriver.js +1 -1
- package/browser/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachConnectionOptions.d.ts +5 -0
- package/browser/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachDriver.d.ts +19 -14
- package/browser/driver/cockroachdb/CockroachDriver.js +128 -13
- package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +28 -0
- package/browser/driver/cockroachdb/CockroachQueryRunner.js +283 -11
- package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/browser/driver/mongodb/MongoDriver.d.ts +5 -0
- package/browser/driver/mongodb/MongoDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.d.ts +2 -1
- package/browser/driver/mysql/MysqlDriver.js +1 -1
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.d.ts +5 -0
- package/browser/driver/oracle/OracleDriver.js +4 -0
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/oracle/OracleQueryRunner.js +15 -7
- package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/browser/driver/postgres/PostgresDriver.d.ts +2 -1
- package/browser/driver/postgres/PostgresDriver.js +1 -1
- package/browser/driver/postgres/PostgresDriver.js.map +1 -1
- package/browser/driver/postgres/PostgresQueryRunner.js +11 -36
- package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/browser/driver/sap/SapDriver.d.ts +5 -0
- package/browser/driver/sap/SapDriver.js +4 -0
- package/browser/driver/sap/SapDriver.js.map +1 -1
- package/browser/driver/spanner/SpannerDriver.d.ts +2 -1
- package/browser/driver/spanner/SpannerDriver.js +1 -1
- package/browser/driver/spanner/SpannerDriver.js.map +1 -1
- package/browser/driver/sqlite/SqliteConnectionOptions.d.ts +7 -0
- package/browser/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/browser/driver/sqlite/SqliteDriver.js +5 -0
- package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerDriver.d.ts +5 -0
- package/browser/driver/sqlserver/SqlServerDriver.js +4 -0
- package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/browser/driver/types/GeoJsonTypes.d.ts +87 -0
- package/browser/driver/types/GeoJsonTypes.js +3 -0
- package/browser/driver/types/GeoJsonTypes.js.map +1 -0
- package/browser/driver/types/UpsertType.d.ts +1 -1
- package/browser/driver/types/UpsertType.js.map +1 -1
- package/browser/entity-manager/EntityManager.js +2 -0
- package/browser/entity-manager/EntityManager.js.map +1 -1
- package/browser/find-options/mongodb/MongoFindOneOptions.d.ts +2 -2
- package/browser/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
- package/browser/index.d.ts +1 -0
- package/browser/index.js +1 -0
- package/browser/index.js.map +1 -1
- package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -1
- package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/browser/migration/MigrationExecutor.js +1 -1
- package/browser/migration/MigrationExecutor.js.map +1 -1
- package/browser/platform/BrowserPlatformTools.js +2 -2
- package/browser/platform/BrowserPlatformTools.js.map +1 -1
- package/browser/query-builder/InsertOrUpdateOptions.d.ts +2 -0
- package/browser/query-builder/InsertOrUpdateOptions.js.map +1 -1
- package/browser/query-builder/InsertQueryBuilder.d.ts +4 -4
- package/browser/query-builder/InsertQueryBuilder.js +80 -74
- package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryBuilder.d.ts +4 -0
- package/browser/query-builder/QueryBuilder.js +28 -8
- package/browser/query-builder/QueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryExpressionMap.d.ts +7 -0
- package/browser/query-builder/QueryExpressionMap.js +4 -0
- package/browser/query-builder/QueryExpressionMap.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.d.ts +4 -0
- package/browser/query-builder/SelectQueryBuilder.js +29 -4
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/browser/query-builder/UpdateQueryBuilder.js +1 -2
- package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/browser/repository/UpsertOptions.d.ts +7 -0
- package/browser/repository/UpsertOptions.js.map +1 -1
- package/data-source/DataSource.js +1 -1
- package/data-source/DataSource.js.map +1 -1
- package/decorator/options/SpatialColumnOptions.d.ts +2 -1
- package/decorator/options/SpatialColumnOptions.js.map +1 -1
- package/driver/Driver.d.ts +1 -1
- package/driver/Driver.js.map +1 -1
- package/driver/DriverUtils.js +1 -1
- package/driver/DriverUtils.js.map +1 -1
- package/driver/aurora-mysql/AuroraMysqlDriver.d.ts +2 -1
- package/driver/aurora-mysql/AuroraMysqlDriver.js +1 -1
- package/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
- package/driver/cockroachdb/CockroachConnectionOptions.d.ts +5 -0
- package/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/driver/cockroachdb/CockroachDriver.d.ts +19 -14
- package/driver/cockroachdb/CockroachDriver.js +128 -13
- package/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/driver/cockroachdb/CockroachQueryRunner.d.ts +28 -0
- package/driver/cockroachdb/CockroachQueryRunner.js +283 -11
- package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/driver/mongodb/MongoDriver.d.ts +5 -0
- package/driver/mongodb/MongoDriver.js.map +1 -1
- package/driver/mysql/MysqlDriver.d.ts +2 -1
- package/driver/mysql/MysqlDriver.js +1 -1
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/oracle/OracleDriver.d.ts +5 -0
- package/driver/oracle/OracleDriver.js +4 -0
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/oracle/OracleQueryRunner.js +15 -7
- package/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/driver/postgres/PostgresDriver.d.ts +2 -1
- package/driver/postgres/PostgresDriver.js +1 -1
- package/driver/postgres/PostgresDriver.js.map +1 -1
- package/driver/postgres/PostgresQueryRunner.js +11 -36
- package/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/driver/sap/SapDriver.d.ts +5 -0
- package/driver/sap/SapDriver.js +4 -0
- package/driver/sap/SapDriver.js.map +1 -1
- package/driver/spanner/SpannerDriver.d.ts +2 -1
- package/driver/spanner/SpannerDriver.js +1 -1
- package/driver/spanner/SpannerDriver.js.map +1 -1
- package/driver/sqlite/SqliteConnectionOptions.d.ts +7 -0
- package/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/driver/sqlite/SqliteDriver.js +5 -0
- package/driver/sqlite/SqliteDriver.js.map +1 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/driver/sqlserver/SqlServerDriver.d.ts +5 -0
- package/driver/sqlserver/SqlServerDriver.js +4 -0
- package/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/driver/types/GeoJsonTypes.d.ts +87 -0
- package/driver/types/GeoJsonTypes.js +4 -0
- package/driver/types/GeoJsonTypes.js.map +1 -0
- package/driver/types/UpsertType.d.ts +1 -1
- package/driver/types/UpsertType.js.map +1 -1
- package/entity-manager/EntityManager.js +2 -0
- package/entity-manager/EntityManager.js.map +1 -1
- package/find-options/mongodb/MongoFindOneOptions.d.ts +2 -2
- package/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/metadata-builder/RelationJoinColumnBuilder.js +2 -1
- package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/migration/MigrationExecutor.js +1 -1
- package/migration/MigrationExecutor.js.map +1 -1
- package/package.json +1 -1
- package/query-builder/InsertOrUpdateOptions.d.ts +2 -0
- package/query-builder/InsertOrUpdateOptions.js.map +1 -1
- package/query-builder/InsertQueryBuilder.d.ts +4 -4
- package/query-builder/InsertQueryBuilder.js +80 -74
- package/query-builder/InsertQueryBuilder.js.map +1 -1
- package/query-builder/QueryBuilder.d.ts +4 -0
- package/query-builder/QueryBuilder.js +28 -8
- package/query-builder/QueryBuilder.js.map +1 -1
- package/query-builder/QueryExpressionMap.d.ts +7 -0
- package/query-builder/QueryExpressionMap.js +4 -0
- package/query-builder/QueryExpressionMap.js.map +1 -1
- package/query-builder/SelectQueryBuilder.d.ts +4 -0
- package/query-builder/SelectQueryBuilder.js +29 -4
- package/query-builder/SelectQueryBuilder.js.map +1 -1
- package/query-builder/UpdateQueryBuilder.js +1 -2
- package/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/repository/UpsertOptions.d.ts +7 -0
- package/repository/UpsertOptions.js.map +1 -1
|
@@ -20,6 +20,7 @@ const TableExclusion_1 = require("../../schema-builder/table/TableExclusion");
|
|
|
20
20
|
const error_1 = require("../../error");
|
|
21
21
|
const MetadataTableType_1 = require("../types/MetadataTableType");
|
|
22
22
|
const InstanceChecker_1 = require("../../util/InstanceChecker");
|
|
23
|
+
const VersionUtils_1 = require("../../util/VersionUtils");
|
|
23
24
|
/**
|
|
24
25
|
* Runs queries on a single postgres database connection.
|
|
25
26
|
*/
|
|
@@ -82,6 +83,9 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
82
83
|
* You cannot use query runner methods once its released.
|
|
83
84
|
*/
|
|
84
85
|
release() {
|
|
86
|
+
if (this.isReleased) {
|
|
87
|
+
return Promise.resolve();
|
|
88
|
+
}
|
|
85
89
|
this.isReleased = true;
|
|
86
90
|
if (this.releaseCallback)
|
|
87
91
|
this.releaseCallback();
|
|
@@ -359,6 +363,20 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
359
363
|
}
|
|
360
364
|
const upQueries = [];
|
|
361
365
|
const downQueries = [];
|
|
366
|
+
// if table have column with ENUM type, we must create this type in postgres.
|
|
367
|
+
const enumColumns = table.columns.filter((column) => column.type === "enum" || column.type === "simple-enum");
|
|
368
|
+
const createdEnumTypes = [];
|
|
369
|
+
for (const column of enumColumns) {
|
|
370
|
+
// TODO: Should also check if values of existing type matches expected ones
|
|
371
|
+
const hasEnum = await this.hasEnumType(table, column);
|
|
372
|
+
const enumName = this.buildEnumName(table, column);
|
|
373
|
+
// if enum with the same "enumName" is defined more then once, me must prevent double creation
|
|
374
|
+
if (!hasEnum && createdEnumTypes.indexOf(enumName) === -1) {
|
|
375
|
+
createdEnumTypes.push(enumName);
|
|
376
|
+
upQueries.push(this.createEnumTypeSql(table, column, enumName));
|
|
377
|
+
downQueries.push(this.dropEnumTypeSql(table, column, enumName));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
362
380
|
table.columns
|
|
363
381
|
.filter((column) => column.isGenerated &&
|
|
364
382
|
column.generationStrategy === "increment")
|
|
@@ -572,6 +590,16 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
572
590
|
// replace constraint name
|
|
573
591
|
foreignKey.name = newForeignKeyName;
|
|
574
592
|
});
|
|
593
|
+
// rename ENUM types
|
|
594
|
+
const enumColumns = newTable.columns.filter((column) => column.type === "enum" || column.type === "simple-enum");
|
|
595
|
+
for (let column of enumColumns) {
|
|
596
|
+
// skip renaming for user-defined enum name
|
|
597
|
+
if (column.enumName)
|
|
598
|
+
continue;
|
|
599
|
+
const oldEnumType = await this.getUserDefinedTypeName(oldTable, column);
|
|
600
|
+
upQueries.push(new Query_1.Query(`ALTER TYPE "${oldEnumType.schema}"."${oldEnumType.name}" RENAME TO ${this.buildEnumName(newTable, column, false)}`));
|
|
601
|
+
downQueries.push(new Query_1.Query(`ALTER TYPE ${this.buildEnumName(newTable, column)} RENAME TO "${oldEnumType.name}"`));
|
|
602
|
+
}
|
|
575
603
|
await this.executeQueries(upQueries, downQueries);
|
|
576
604
|
}
|
|
577
605
|
/**
|
|
@@ -587,6 +615,13 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
587
615
|
if (column.generationStrategy === "increment") {
|
|
588
616
|
throw new error_1.TypeORMError(`Adding sequential generated columns into existing table is not supported`);
|
|
589
617
|
}
|
|
618
|
+
if (column.type === "enum" || column.type === "simple-enum") {
|
|
619
|
+
const hasEnum = await this.hasEnumType(table, column);
|
|
620
|
+
if (!hasEnum) {
|
|
621
|
+
upQueries.push(this.createEnumTypeSql(table, column));
|
|
622
|
+
downQueries.push(this.dropEnumTypeSql(table, column));
|
|
623
|
+
}
|
|
624
|
+
}
|
|
590
625
|
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(table, column)}`));
|
|
591
626
|
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN "${column.name}"`));
|
|
592
627
|
// create or update primary key constraint
|
|
@@ -714,6 +749,7 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
714
749
|
let clonedTable = table.clone();
|
|
715
750
|
const upQueries = [];
|
|
716
751
|
const downQueries = [];
|
|
752
|
+
let defaultValueChanged = false;
|
|
717
753
|
const oldColumn = InstanceChecker_1.InstanceChecker.isTableColumn(oldTableColumnOrName)
|
|
718
754
|
? oldTableColumnOrName
|
|
719
755
|
: table.columns.find((column) => column.name === oldTableColumnOrName);
|
|
@@ -721,6 +757,7 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
721
757
|
throw new error_1.TypeORMError(`Column "${oldTableColumnOrName}" was not found in the "${table.name}" table.`);
|
|
722
758
|
if (oldColumn.type !== newColumn.type ||
|
|
723
759
|
oldColumn.length !== newColumn.length ||
|
|
760
|
+
newColumn.isArray !== oldColumn.isArray ||
|
|
724
761
|
oldColumn.generatedType !== newColumn.generatedType ||
|
|
725
762
|
oldColumn.asExpression !== newColumn.asExpression) {
|
|
726
763
|
// To avoid data conversion, we just recreate column
|
|
@@ -734,6 +771,13 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
734
771
|
// rename column
|
|
735
772
|
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} RENAME COLUMN "${oldColumn.name}" TO "${newColumn.name}"`));
|
|
736
773
|
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} RENAME COLUMN "${newColumn.name}" TO "${oldColumn.name}"`));
|
|
774
|
+
// rename ENUM type
|
|
775
|
+
if (oldColumn.type === "enum" ||
|
|
776
|
+
oldColumn.type === "simple-enum") {
|
|
777
|
+
const oldEnumType = await this.getUserDefinedTypeName(table, oldColumn);
|
|
778
|
+
upQueries.push(new Query_1.Query(`ALTER TYPE "${oldEnumType.schema}"."${oldEnumType.name}" RENAME TO ${this.buildEnumName(table, newColumn, false)}`));
|
|
779
|
+
downQueries.push(new Query_1.Query(`ALTER TYPE ${this.buildEnumName(table, newColumn)} RENAME TO "${oldEnumType.name}"`));
|
|
780
|
+
}
|
|
737
781
|
// rename column primary key constraint
|
|
738
782
|
if (oldColumn.isPrimary === true &&
|
|
739
783
|
!oldColumn.primaryKeyConstraintName) {
|
|
@@ -901,6 +945,57 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
901
945
|
downQueries.push(this.createUniqueConstraintSql(table, uniqueConstraint));
|
|
902
946
|
}
|
|
903
947
|
}
|
|
948
|
+
if ((newColumn.type === "enum" ||
|
|
949
|
+
newColumn.type === "simple-enum") &&
|
|
950
|
+
(oldColumn.type === "enum" ||
|
|
951
|
+
oldColumn.type === "simple-enum") &&
|
|
952
|
+
(!OrmUtils_1.OrmUtils.isArraysEqual(newColumn.enum, oldColumn.enum) ||
|
|
953
|
+
newColumn.enumName !== oldColumn.enumName)) {
|
|
954
|
+
const arraySuffix = newColumn.isArray ? "[]" : "";
|
|
955
|
+
// "public"."new_enum"
|
|
956
|
+
const newEnumName = this.buildEnumName(table, newColumn);
|
|
957
|
+
// "public"."old_enum"
|
|
958
|
+
const oldEnumName = this.buildEnumName(table, oldColumn);
|
|
959
|
+
// "old_enum"
|
|
960
|
+
const oldEnumNameWithoutSchema = this.buildEnumName(table, oldColumn, false);
|
|
961
|
+
//"public"."old_enum_old"
|
|
962
|
+
const oldEnumNameWithSchema_old = this.buildEnumName(table, oldColumn, true, false, true);
|
|
963
|
+
//"old_enum_old"
|
|
964
|
+
const oldEnumNameWithoutSchema_old = this.buildEnumName(table, oldColumn, false, false, true);
|
|
965
|
+
// rename old ENUM
|
|
966
|
+
upQueries.push(new Query_1.Query(`ALTER TYPE ${oldEnumName} RENAME TO ${oldEnumNameWithoutSchema_old}`));
|
|
967
|
+
downQueries.push(new Query_1.Query(`ALTER TYPE ${oldEnumNameWithSchema_old} RENAME TO ${oldEnumNameWithoutSchema}`));
|
|
968
|
+
// create new ENUM
|
|
969
|
+
upQueries.push(this.createEnumTypeSql(table, newColumn, newEnumName));
|
|
970
|
+
downQueries.push(this.dropEnumTypeSql(table, newColumn, newEnumName));
|
|
971
|
+
// if column have default value, we must drop it to avoid issues with type casting
|
|
972
|
+
if (oldColumn.default !== null &&
|
|
973
|
+
oldColumn.default !== undefined) {
|
|
974
|
+
// mark default as changed to prevent double update
|
|
975
|
+
defaultValueChanged = true;
|
|
976
|
+
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${oldColumn.name}" DROP DEFAULT`));
|
|
977
|
+
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${oldColumn.name}" SET DEFAULT ${oldColumn.default}`));
|
|
978
|
+
}
|
|
979
|
+
// build column types
|
|
980
|
+
const upType = `${newEnumName}${arraySuffix} USING "${newColumn.name}"::"text"::${newEnumName}${arraySuffix}`;
|
|
981
|
+
const downType = `${oldEnumNameWithSchema_old}${arraySuffix} USING "${newColumn.name}"::"text"::${oldEnumNameWithSchema_old}${arraySuffix}`;
|
|
982
|
+
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" TYPE ${upType}`));
|
|
983
|
+
// we add a delay here since for some reason cockroachdb fails with
|
|
984
|
+
// "cannot drop type because other objects still depend on it" error
|
|
985
|
+
// if we are trying to drop type right after we altered it.
|
|
986
|
+
upQueries.push(new Query_1.Query(`SELECT pg_sleep(0.1)`));
|
|
987
|
+
downQueries.push(new Query_1.Query(`SELECT pg_sleep(0.1)`));
|
|
988
|
+
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" TYPE ${downType}`));
|
|
989
|
+
// restore column default or create new one
|
|
990
|
+
if (newColumn.default !== null &&
|
|
991
|
+
newColumn.default !== undefined) {
|
|
992
|
+
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT ${newColumn.default}`));
|
|
993
|
+
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" DROP DEFAULT`));
|
|
994
|
+
}
|
|
995
|
+
// remove old ENUM
|
|
996
|
+
upQueries.push(this.dropEnumTypeSql(table, oldColumn, oldEnumNameWithSchema_old));
|
|
997
|
+
downQueries.push(this.createEnumTypeSql(table, oldColumn, oldEnumNameWithSchema_old));
|
|
998
|
+
}
|
|
904
999
|
if (oldColumn.isGenerated !== newColumn.isGenerated &&
|
|
905
1000
|
newColumn.generationStrategy !== "uuid") {
|
|
906
1001
|
if (newColumn.isGenerated) {
|
|
@@ -917,7 +1012,8 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
917
1012
|
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT unique_rowid()`));
|
|
918
1013
|
}
|
|
919
1014
|
}
|
|
920
|
-
if (newColumn.default !== oldColumn.default
|
|
1015
|
+
if (newColumn.default !== oldColumn.default &&
|
|
1016
|
+
!defaultValueChanged) {
|
|
921
1017
|
if (newColumn.default !== null &&
|
|
922
1018
|
newColumn.default !== undefined) {
|
|
923
1019
|
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" SET DEFAULT ${newColumn.default}`));
|
|
@@ -936,6 +1032,12 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
936
1032
|
}
|
|
937
1033
|
}
|
|
938
1034
|
}
|
|
1035
|
+
if ((newColumn.spatialFeatureType || "").toLowerCase() !==
|
|
1036
|
+
(oldColumn.spatialFeatureType || "").toLowerCase() ||
|
|
1037
|
+
newColumn.srid !== oldColumn.srid) {
|
|
1038
|
+
upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" TYPE ${this.driver.createFullType(newColumn)}`));
|
|
1039
|
+
downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name}" TYPE ${this.driver.createFullType(oldColumn)}`));
|
|
1040
|
+
}
|
|
939
1041
|
await this.executeQueries(upQueries, downQueries);
|
|
940
1042
|
this.replaceCachedTable(table, clonedTable);
|
|
941
1043
|
}
|
|
@@ -1042,6 +1144,16 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1042
1144
|
upQueries.push(deleteQuery);
|
|
1043
1145
|
downQueries.push(insertQuery);
|
|
1044
1146
|
}
|
|
1147
|
+
// drop enum type
|
|
1148
|
+
if (column.type === "enum" || column.type === "simple-enum") {
|
|
1149
|
+
const hasEnum = await this.hasEnumType(table, column);
|
|
1150
|
+
if (hasEnum) {
|
|
1151
|
+
const enumType = await this.getUserDefinedTypeName(table, column);
|
|
1152
|
+
const escapedEnumName = `"${enumType.schema}"."${enumType.name}"`;
|
|
1153
|
+
upQueries.push(this.dropEnumTypeSql(table, column, escapedEnumName));
|
|
1154
|
+
downQueries.push(this.createEnumTypeSql(table, column, escapedEnumName));
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1045
1157
|
await this.executeQueries(upQueries, downQueries);
|
|
1046
1158
|
clonedTable.removeColumn(column);
|
|
1047
1159
|
this.replaceCachedTable(table, clonedTable);
|
|
@@ -1391,6 +1503,7 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1391
1503
|
if (!isAnotherTransactionActive)
|
|
1392
1504
|
await this.startTransaction();
|
|
1393
1505
|
try {
|
|
1506
|
+
const version = await this.getVersion();
|
|
1394
1507
|
const selectViewDropsQuery = `SELECT 'DROP VIEW IF EXISTS "' || schemaname || '"."' || viewname || '" CASCADE;' as "query" ` +
|
|
1395
1508
|
`FROM "pg_views" WHERE "schemaname" IN (${schemaNamesString})`;
|
|
1396
1509
|
const dropViewQueries = await this.query(selectViewDropsQuery);
|
|
@@ -1401,6 +1514,10 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1401
1514
|
const selectSequenceDropsQuery = `SELECT 'DROP SEQUENCE "' || sequence_schema || '"."' || sequence_name || '";' as "query" FROM "information_schema"."sequences" WHERE "sequence_schema" IN (${schemaNamesString})`;
|
|
1402
1515
|
const sequenceDropQueries = await this.query(selectSequenceDropsQuery);
|
|
1403
1516
|
await Promise.all(sequenceDropQueries.map((q) => this.query(q["query"])));
|
|
1517
|
+
// drop enum types. Supported starting from v20.2.19.
|
|
1518
|
+
if (VersionUtils_1.VersionUtils.isGreaterOrEqual(version, "20.2.19")) {
|
|
1519
|
+
await this.dropEnumTypes(schemaNamesString);
|
|
1520
|
+
}
|
|
1404
1521
|
if (!isAnotherTransactionActive)
|
|
1405
1522
|
await this.commitTransaction();
|
|
1406
1523
|
}
|
|
@@ -1535,11 +1652,21 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1535
1652
|
`INNER JOIN "pg_class" "cl" ON "cl"."oid" = "con"."confrelid" ` +
|
|
1536
1653
|
`INNER JOIN "pg_namespace" "ns" ON "cl"."relnamespace" = "ns"."oid" ` +
|
|
1537
1654
|
`INNER JOIN "pg_attribute" "att2" ON "att2"."attrelid" = "con"."conrelid" AND "att2"."attnum" = "con"."parent"`;
|
|
1538
|
-
const
|
|
1655
|
+
const tableSchemas = dbTables
|
|
1656
|
+
.map((dbTable) => `'${dbTable.table_schema}'`)
|
|
1657
|
+
.join(", ");
|
|
1658
|
+
const enumsSql = `SELECT "t"."typname" AS "name", string_agg("e"."enumlabel", '|') AS "value" ` +
|
|
1659
|
+
`FROM "pg_enum" "e" ` +
|
|
1660
|
+
`INNER JOIN "pg_type" "t" ON "t"."oid" = "e"."enumtypid" ` +
|
|
1661
|
+
`INNER JOIN "pg_namespace" "n" ON "n"."oid" = "t"."typnamespace" ` +
|
|
1662
|
+
`WHERE "n"."nspname" IN (${tableSchemas}) ` +
|
|
1663
|
+
`GROUP BY "t"."typname"`;
|
|
1664
|
+
const [dbColumns, dbConstraints, dbIndices, dbForeignKeys, dbEnums,] = await Promise.all([
|
|
1539
1665
|
this.query(columnsSql),
|
|
1540
1666
|
this.query(constraintsSql),
|
|
1541
1667
|
this.query(indicesSql),
|
|
1542
1668
|
this.query(foreignKeysSql),
|
|
1669
|
+
this.query(enumsSql),
|
|
1543
1670
|
]);
|
|
1544
1671
|
// create tables for loaded tables
|
|
1545
1672
|
return Promise.all(dbTables.map(async (dbTable) => {
|
|
@@ -1603,15 +1730,39 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1603
1730
|
tableColumn.scale = undefined;
|
|
1604
1731
|
}
|
|
1605
1732
|
}
|
|
1733
|
+
// docs: https://www.postgresql.org/docs/current/xtypes.html
|
|
1734
|
+
// When you define a new base type, PostgreSQL automatically provides support for arrays of that type.
|
|
1735
|
+
// The array type typically has the same name as the base type with the underscore character (_) prepended.
|
|
1736
|
+
// ----
|
|
1737
|
+
// so, we must remove this underscore character from enum type name
|
|
1738
|
+
let udtName = dbColumn["udt_name"];
|
|
1739
|
+
if (udtName.indexOf("_") === 0) {
|
|
1740
|
+
udtName = udtName.substr(1, udtName.length);
|
|
1741
|
+
}
|
|
1742
|
+
const enumType = dbEnums.find((dbEnum) => {
|
|
1743
|
+
return dbEnum["name"] === udtName;
|
|
1744
|
+
});
|
|
1745
|
+
if (enumType) {
|
|
1746
|
+
// check if `enumName` is specified by user
|
|
1747
|
+
const builtEnumName = this.buildEnumName(table, tableColumn, false, true);
|
|
1748
|
+
const enumName = builtEnumName !== enumType["name"]
|
|
1749
|
+
? enumType["name"]
|
|
1750
|
+
: undefined;
|
|
1751
|
+
tableColumn.type = "enum";
|
|
1752
|
+
tableColumn.enum = enumType["value"].split("|");
|
|
1753
|
+
tableColumn.enumName = enumName;
|
|
1754
|
+
}
|
|
1606
1755
|
if (dbColumn["data_type"].toLowerCase() === "array") {
|
|
1607
1756
|
tableColumn.isArray = true;
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1757
|
+
if (!enumType) {
|
|
1758
|
+
const type = dbColumn["crdb_sql_type"]
|
|
1759
|
+
.replace("[]", "")
|
|
1760
|
+
.toLowerCase();
|
|
1761
|
+
tableColumn.type =
|
|
1762
|
+
this.connection.driver.normalizeType({
|
|
1763
|
+
type: type,
|
|
1764
|
+
});
|
|
1765
|
+
}
|
|
1615
1766
|
}
|
|
1616
1767
|
// check only columns that have length property
|
|
1617
1768
|
if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
|
|
@@ -1680,6 +1831,10 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1680
1831
|
tableColumn.default = dbColumn["column_default"].replace(/:::[\w\s\[\]\"]+/g, "");
|
|
1681
1832
|
tableColumn.default =
|
|
1682
1833
|
tableColumn.default.replace(/^(-?[\d\.]+)$/, "($1)");
|
|
1834
|
+
if (enumType) {
|
|
1835
|
+
tableColumn.default =
|
|
1836
|
+
tableColumn.default.replace(`.${enumType["name"]}`, "");
|
|
1837
|
+
}
|
|
1683
1838
|
}
|
|
1684
1839
|
}
|
|
1685
1840
|
if (dbColumn["is_generated"] === "YES" &&
|
|
@@ -1710,6 +1865,25 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1710
1865
|
if (dbColumn["character_set_name"])
|
|
1711
1866
|
tableColumn.charset =
|
|
1712
1867
|
dbColumn["character_set_name"];
|
|
1868
|
+
if (tableColumn.type === "geometry" ||
|
|
1869
|
+
tableColumn.type === "geography") {
|
|
1870
|
+
const sql = `SELECT * FROM (` +
|
|
1871
|
+
`SELECT "f_table_schema" "table_schema", "f_table_name" "table_name", ` +
|
|
1872
|
+
`"f_${tableColumn.type}_column" "column_name", "srid", "type" ` +
|
|
1873
|
+
`FROM "${tableColumn.type}_columns"` +
|
|
1874
|
+
`) AS _ ` +
|
|
1875
|
+
`WHERE "column_name" = '${dbColumn["column_name"]}' AND ` +
|
|
1876
|
+
`"table_schema" = '${dbColumn["table_schema"]}' AND ` +
|
|
1877
|
+
`"table_name" = '${dbColumn["table_name"]}'`;
|
|
1878
|
+
const results = await this.query(sql);
|
|
1879
|
+
if (results.length > 0) {
|
|
1880
|
+
tableColumn.spatialFeatureType =
|
|
1881
|
+
results[0].type;
|
|
1882
|
+
tableColumn.srid = results[0].srid
|
|
1883
|
+
? parseInt(results[0].srid)
|
|
1884
|
+
: undefined;
|
|
1885
|
+
}
|
|
1886
|
+
}
|
|
1713
1887
|
return tableColumn;
|
|
1714
1888
|
}));
|
|
1715
1889
|
// find unique constraints of table, group them by constraint name and build TableUnique.
|
|
@@ -1892,6 +2066,13 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1892
2066
|
.forEach((it) => (sql += `; COMMENT ON COLUMN ${this.escapePath(table)}."${it.name}" IS ${this.escapeComment(it.comment)}`));
|
|
1893
2067
|
return new Query_1.Query(sql);
|
|
1894
2068
|
}
|
|
2069
|
+
/**
|
|
2070
|
+
* Loads Cockroachdb version.
|
|
2071
|
+
*/
|
|
2072
|
+
async getVersion() {
|
|
2073
|
+
const result = await this.query(`SELECT version()`);
|
|
2074
|
+
return result[0]["version"].replace(/^CockroachDB CCL v([\d\.]+) .*$/, "$1");
|
|
2075
|
+
}
|
|
1895
2076
|
/**
|
|
1896
2077
|
* Builds drop table sql.
|
|
1897
2078
|
*/
|
|
@@ -1945,6 +2126,51 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1945
2126
|
name,
|
|
1946
2127
|
});
|
|
1947
2128
|
}
|
|
2129
|
+
/**
|
|
2130
|
+
* Drops ENUM type from given schemas.
|
|
2131
|
+
*/
|
|
2132
|
+
async dropEnumTypes(schemaNames) {
|
|
2133
|
+
const selectDropsQuery = `SELECT 'DROP TYPE IF EXISTS "' || n.nspname || '"."' || t.typname || '";' as "query" FROM "pg_type" "t" ` +
|
|
2134
|
+
`INNER JOIN "pg_enum" "e" ON "e"."enumtypid" = "t"."oid" ` +
|
|
2135
|
+
`INNER JOIN "pg_namespace" "n" ON "n"."oid" = "t"."typnamespace" ` +
|
|
2136
|
+
`WHERE "n"."nspname" IN (${schemaNames}) GROUP BY "n"."nspname", "t"."typname"`;
|
|
2137
|
+
const dropQueries = await this.query(selectDropsQuery);
|
|
2138
|
+
await Promise.all(dropQueries.map((q) => this.query(q["query"])));
|
|
2139
|
+
}
|
|
2140
|
+
/**
|
|
2141
|
+
* Checks if enum with the given name exist in the database.
|
|
2142
|
+
*/
|
|
2143
|
+
async hasEnumType(table, column) {
|
|
2144
|
+
let { schema } = this.driver.parseTableName(table);
|
|
2145
|
+
if (!schema) {
|
|
2146
|
+
schema = await this.getCurrentSchema();
|
|
2147
|
+
}
|
|
2148
|
+
const enumName = this.buildEnumName(table, column, false, true);
|
|
2149
|
+
const sql = `SELECT "n"."nspname", "t"."typname" FROM "pg_type" "t" ` +
|
|
2150
|
+
`INNER JOIN "pg_namespace" "n" ON "n"."oid" = "t"."typnamespace" ` +
|
|
2151
|
+
`WHERE "n"."nspname" = '${schema}' AND "t"."typname" = '${enumName}'`;
|
|
2152
|
+
const result = await this.query(sql);
|
|
2153
|
+
return result.length ? true : false;
|
|
2154
|
+
}
|
|
2155
|
+
/**
|
|
2156
|
+
* Builds create ENUM type sql.
|
|
2157
|
+
*/
|
|
2158
|
+
createEnumTypeSql(table, column, enumName) {
|
|
2159
|
+
if (!enumName)
|
|
2160
|
+
enumName = this.buildEnumName(table, column);
|
|
2161
|
+
const enumValues = column
|
|
2162
|
+
.enum.map((value) => `'${value.replace("'", "''")}'`)
|
|
2163
|
+
.join(", ");
|
|
2164
|
+
return new Query_1.Query(`CREATE TYPE ${enumName} AS ENUM(${enumValues})`);
|
|
2165
|
+
}
|
|
2166
|
+
/**
|
|
2167
|
+
* Builds create ENUM type sql.
|
|
2168
|
+
*/
|
|
2169
|
+
dropEnumTypeSql(table, column, enumName) {
|
|
2170
|
+
if (!enumName)
|
|
2171
|
+
enumName = this.buildEnumName(table, column);
|
|
2172
|
+
return new Query_1.Query(`DROP TYPE ${enumName}`);
|
|
2173
|
+
}
|
|
1948
2174
|
/**
|
|
1949
2175
|
* Builds create index sql.
|
|
1950
2176
|
* UNIQUE indices creates as UNIQUE constraints.
|
|
@@ -1953,7 +2179,7 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
1953
2179
|
const columns = index.columnNames
|
|
1954
2180
|
.map((columnName) => `"${columnName}"`)
|
|
1955
2181
|
.join(", ");
|
|
1956
|
-
return new Query_1.Query(`CREATE INDEX "${index.name}" ON ${this.escapePath(table)} (${columns}) ${index.where ? "WHERE " + index.where : ""}`);
|
|
2182
|
+
return new Query_1.Query(`CREATE ${index.isUnique ? "UNIQUE " : ""}INDEX "${index.name}" ON ${this.escapePath(table)} ${index.isSpatial ? "USING GiST " : ""}(${columns}) ${index.where ? "WHERE " + index.where : ""}`);
|
|
1957
2183
|
}
|
|
1958
2184
|
/**
|
|
1959
2185
|
* Builds drop index sql.
|
|
@@ -2066,6 +2292,46 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
2066
2292
|
? `${schema}.${this.buildSequenceName(table, columnOrName)}`
|
|
2067
2293
|
: this.buildSequenceName(table, columnOrName);
|
|
2068
2294
|
}
|
|
2295
|
+
/**
|
|
2296
|
+
* Builds ENUM type name from given table and column.
|
|
2297
|
+
*/
|
|
2298
|
+
buildEnumName(table, column, withSchema = true, disableEscape, toOld) {
|
|
2299
|
+
const { schema, tableName } = this.driver.parseTableName(table);
|
|
2300
|
+
let enumName = column.enumName
|
|
2301
|
+
? column.enumName
|
|
2302
|
+
: `${tableName}_${column.name.toLowerCase()}_enum`;
|
|
2303
|
+
if (schema && withSchema)
|
|
2304
|
+
enumName = `${schema}.${enumName}`;
|
|
2305
|
+
if (toOld)
|
|
2306
|
+
enumName = enumName + "_old";
|
|
2307
|
+
return enumName
|
|
2308
|
+
.split(".")
|
|
2309
|
+
.map((i) => {
|
|
2310
|
+
return disableEscape ? i : `"${i}"`;
|
|
2311
|
+
})
|
|
2312
|
+
.join(".");
|
|
2313
|
+
}
|
|
2314
|
+
async getUserDefinedTypeName(table, column) {
|
|
2315
|
+
let { schema, tableName: name } = this.driver.parseTableName(table);
|
|
2316
|
+
if (!schema) {
|
|
2317
|
+
schema = await this.getCurrentSchema();
|
|
2318
|
+
}
|
|
2319
|
+
const result = await this.query(`SELECT "udt_schema", "udt_name" ` +
|
|
2320
|
+
`FROM "information_schema"."columns" WHERE "table_schema" = '${schema}' AND "table_name" = '${name}' AND "column_name"='${column.name}'`);
|
|
2321
|
+
// docs: https://www.postgresql.org/docs/current/xtypes.html
|
|
2322
|
+
// When you define a new base type, PostgreSQL automatically provides support for arrays of that type.
|
|
2323
|
+
// The array type typically has the same name as the base type with the underscore character (_) prepended.
|
|
2324
|
+
// ----
|
|
2325
|
+
// so, we must remove this underscore character from enum type name
|
|
2326
|
+
let udtName = result[0]["udt_name"];
|
|
2327
|
+
if (udtName.indexOf("_") === 0) {
|
|
2328
|
+
udtName = udtName.substr(1, udtName.length);
|
|
2329
|
+
}
|
|
2330
|
+
return {
|
|
2331
|
+
schema: result[0]["udt_schema"],
|
|
2332
|
+
name: udtName,
|
|
2333
|
+
};
|
|
2334
|
+
}
|
|
2069
2335
|
/**
|
|
2070
2336
|
* Escapes a given comment so it's safe to include in a query.
|
|
2071
2337
|
*/
|
|
@@ -2102,8 +2368,14 @@ class CockroachQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
|
|
|
2102
2368
|
c += " UUID DEFAULT gen_random_uuid()";
|
|
2103
2369
|
}
|
|
2104
2370
|
}
|
|
2105
|
-
if (
|
|
2371
|
+
if (column.type === "enum" || column.type === "simple-enum") {
|
|
2372
|
+
c += " " + this.buildEnumName(table, column);
|
|
2373
|
+
if (column.isArray)
|
|
2374
|
+
c += " array";
|
|
2375
|
+
}
|
|
2376
|
+
else if (!column.isGenerated) {
|
|
2106
2377
|
c += " " + this.connection.driver.createFullType(column);
|
|
2378
|
+
}
|
|
2107
2379
|
if (column.asExpression) {
|
|
2108
2380
|
c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
|
|
2109
2381
|
}
|