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.
Files changed (171) hide show
  1. package/browser/data-source/DataSource.js +1 -1
  2. package/browser/data-source/DataSource.js.map +1 -1
  3. package/browser/decorator/options/SpatialColumnOptions.d.ts +2 -1
  4. package/browser/decorator/options/SpatialColumnOptions.js.map +1 -1
  5. package/browser/driver/Driver.d.ts +1 -1
  6. package/browser/driver/Driver.js.map +1 -1
  7. package/browser/driver/DriverUtils.js +1 -1
  8. package/browser/driver/DriverUtils.js.map +1 -1
  9. package/browser/driver/aurora-mysql/AuroraMysqlDriver.d.ts +2 -1
  10. package/browser/driver/aurora-mysql/AuroraMysqlDriver.js +1 -1
  11. package/browser/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  12. package/browser/driver/cockroachdb/CockroachConnectionOptions.d.ts +5 -0
  13. package/browser/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
  14. package/browser/driver/cockroachdb/CockroachDriver.d.ts +19 -14
  15. package/browser/driver/cockroachdb/CockroachDriver.js +128 -13
  16. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  17. package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +28 -0
  18. package/browser/driver/cockroachdb/CockroachQueryRunner.js +283 -11
  19. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  20. package/browser/driver/mongodb/MongoDriver.d.ts +5 -0
  21. package/browser/driver/mongodb/MongoDriver.js.map +1 -1
  22. package/browser/driver/mysql/MysqlDriver.d.ts +2 -1
  23. package/browser/driver/mysql/MysqlDriver.js +1 -1
  24. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  25. package/browser/driver/oracle/OracleDriver.d.ts +5 -0
  26. package/browser/driver/oracle/OracleDriver.js +4 -0
  27. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  28. package/browser/driver/oracle/OracleQueryRunner.js +15 -7
  29. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  30. package/browser/driver/postgres/PostgresDriver.d.ts +2 -1
  31. package/browser/driver/postgres/PostgresDriver.js +1 -1
  32. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  33. package/browser/driver/postgres/PostgresQueryRunner.js +11 -36
  34. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  35. package/browser/driver/sap/SapDriver.d.ts +5 -0
  36. package/browser/driver/sap/SapDriver.js +4 -0
  37. package/browser/driver/sap/SapDriver.js.map +1 -1
  38. package/browser/driver/spanner/SpannerDriver.d.ts +2 -1
  39. package/browser/driver/spanner/SpannerDriver.js +1 -1
  40. package/browser/driver/spanner/SpannerDriver.js.map +1 -1
  41. package/browser/driver/sqlite/SqliteConnectionOptions.d.ts +7 -0
  42. package/browser/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
  43. package/browser/driver/sqlite/SqliteDriver.js +5 -0
  44. package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
  45. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -1
  46. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
  47. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  48. package/browser/driver/sqlserver/SqlServerDriver.d.ts +5 -0
  49. package/browser/driver/sqlserver/SqlServerDriver.js +4 -0
  50. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  51. package/browser/driver/types/GeoJsonTypes.d.ts +87 -0
  52. package/browser/driver/types/GeoJsonTypes.js +3 -0
  53. package/browser/driver/types/GeoJsonTypes.js.map +1 -0
  54. package/browser/driver/types/UpsertType.d.ts +1 -1
  55. package/browser/driver/types/UpsertType.js.map +1 -1
  56. package/browser/entity-manager/EntityManager.js +2 -0
  57. package/browser/entity-manager/EntityManager.js.map +1 -1
  58. package/browser/find-options/mongodb/MongoFindOneOptions.d.ts +2 -2
  59. package/browser/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
  60. package/browser/index.d.ts +1 -0
  61. package/browser/index.js +1 -0
  62. package/browser/index.js.map +1 -1
  63. package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -1
  64. package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  65. package/browser/migration/MigrationExecutor.js +1 -1
  66. package/browser/migration/MigrationExecutor.js.map +1 -1
  67. package/browser/platform/BrowserPlatformTools.js +2 -2
  68. package/browser/platform/BrowserPlatformTools.js.map +1 -1
  69. package/browser/query-builder/InsertOrUpdateOptions.d.ts +2 -0
  70. package/browser/query-builder/InsertOrUpdateOptions.js.map +1 -1
  71. package/browser/query-builder/InsertQueryBuilder.d.ts +4 -4
  72. package/browser/query-builder/InsertQueryBuilder.js +80 -74
  73. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  74. package/browser/query-builder/QueryBuilder.d.ts +4 -0
  75. package/browser/query-builder/QueryBuilder.js +28 -8
  76. package/browser/query-builder/QueryBuilder.js.map +1 -1
  77. package/browser/query-builder/QueryExpressionMap.d.ts +7 -0
  78. package/browser/query-builder/QueryExpressionMap.js +4 -0
  79. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  80. package/browser/query-builder/SelectQueryBuilder.d.ts +4 -0
  81. package/browser/query-builder/SelectQueryBuilder.js +29 -4
  82. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  83. package/browser/query-builder/UpdateQueryBuilder.js +1 -2
  84. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  85. package/browser/repository/UpsertOptions.d.ts +7 -0
  86. package/browser/repository/UpsertOptions.js.map +1 -1
  87. package/data-source/DataSource.js +1 -1
  88. package/data-source/DataSource.js.map +1 -1
  89. package/decorator/options/SpatialColumnOptions.d.ts +2 -1
  90. package/decorator/options/SpatialColumnOptions.js.map +1 -1
  91. package/driver/Driver.d.ts +1 -1
  92. package/driver/Driver.js.map +1 -1
  93. package/driver/DriverUtils.js +1 -1
  94. package/driver/DriverUtils.js.map +1 -1
  95. package/driver/aurora-mysql/AuroraMysqlDriver.d.ts +2 -1
  96. package/driver/aurora-mysql/AuroraMysqlDriver.js +1 -1
  97. package/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  98. package/driver/cockroachdb/CockroachConnectionOptions.d.ts +5 -0
  99. package/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
  100. package/driver/cockroachdb/CockroachDriver.d.ts +19 -14
  101. package/driver/cockroachdb/CockroachDriver.js +128 -13
  102. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  103. package/driver/cockroachdb/CockroachQueryRunner.d.ts +28 -0
  104. package/driver/cockroachdb/CockroachQueryRunner.js +283 -11
  105. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  106. package/driver/mongodb/MongoDriver.d.ts +5 -0
  107. package/driver/mongodb/MongoDriver.js.map +1 -1
  108. package/driver/mysql/MysqlDriver.d.ts +2 -1
  109. package/driver/mysql/MysqlDriver.js +1 -1
  110. package/driver/mysql/MysqlDriver.js.map +1 -1
  111. package/driver/oracle/OracleDriver.d.ts +5 -0
  112. package/driver/oracle/OracleDriver.js +4 -0
  113. package/driver/oracle/OracleDriver.js.map +1 -1
  114. package/driver/oracle/OracleQueryRunner.js +15 -7
  115. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  116. package/driver/postgres/PostgresDriver.d.ts +2 -1
  117. package/driver/postgres/PostgresDriver.js +1 -1
  118. package/driver/postgres/PostgresDriver.js.map +1 -1
  119. package/driver/postgres/PostgresQueryRunner.js +11 -36
  120. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  121. package/driver/sap/SapDriver.d.ts +5 -0
  122. package/driver/sap/SapDriver.js +4 -0
  123. package/driver/sap/SapDriver.js.map +1 -1
  124. package/driver/spanner/SpannerDriver.d.ts +2 -1
  125. package/driver/spanner/SpannerDriver.js +1 -1
  126. package/driver/spanner/SpannerDriver.js.map +1 -1
  127. package/driver/sqlite/SqliteConnectionOptions.d.ts +7 -0
  128. package/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
  129. package/driver/sqlite/SqliteDriver.js +5 -0
  130. package/driver/sqlite/SqliteDriver.js.map +1 -1
  131. package/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -1
  132. package/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
  133. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  134. package/driver/sqlserver/SqlServerDriver.d.ts +5 -0
  135. package/driver/sqlserver/SqlServerDriver.js +4 -0
  136. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  137. package/driver/types/GeoJsonTypes.d.ts +87 -0
  138. package/driver/types/GeoJsonTypes.js +4 -0
  139. package/driver/types/GeoJsonTypes.js.map +1 -0
  140. package/driver/types/UpsertType.d.ts +1 -1
  141. package/driver/types/UpsertType.js.map +1 -1
  142. package/entity-manager/EntityManager.js +2 -0
  143. package/entity-manager/EntityManager.js.map +1 -1
  144. package/find-options/mongodb/MongoFindOneOptions.d.ts +2 -2
  145. package/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
  146. package/index.d.ts +1 -0
  147. package/index.js +1 -0
  148. package/index.js.map +1 -1
  149. package/metadata-builder/RelationJoinColumnBuilder.js +2 -1
  150. package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  151. package/migration/MigrationExecutor.js +1 -1
  152. package/migration/MigrationExecutor.js.map +1 -1
  153. package/package.json +1 -1
  154. package/query-builder/InsertOrUpdateOptions.d.ts +2 -0
  155. package/query-builder/InsertOrUpdateOptions.js.map +1 -1
  156. package/query-builder/InsertQueryBuilder.d.ts +4 -4
  157. package/query-builder/InsertQueryBuilder.js +80 -74
  158. package/query-builder/InsertQueryBuilder.js.map +1 -1
  159. package/query-builder/QueryBuilder.d.ts +4 -0
  160. package/query-builder/QueryBuilder.js +28 -8
  161. package/query-builder/QueryBuilder.js.map +1 -1
  162. package/query-builder/QueryExpressionMap.d.ts +7 -0
  163. package/query-builder/QueryExpressionMap.js +4 -0
  164. package/query-builder/QueryExpressionMap.js.map +1 -1
  165. package/query-builder/SelectQueryBuilder.d.ts +4 -0
  166. package/query-builder/SelectQueryBuilder.js +29 -4
  167. package/query-builder/SelectQueryBuilder.js.map +1 -1
  168. package/query-builder/UpdateQueryBuilder.js +1 -2
  169. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  170. package/repository/UpsertOptions.d.ts +7 -0
  171. 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 [dbColumns, dbConstraints, dbIndices, dbForeignKeys,] = await Promise.all([
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
- const type = dbColumn["crdb_sql_type"]
1609
- .replace("[]", "")
1610
- .toLowerCase();
1611
- tableColumn.type =
1612
- this.connection.driver.normalizeType({
1613
- type: type,
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 (!column.isGenerated)
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
  }