typeorm 0.2.40-dev.e80f97d → 0.2.41-dev.2d0abe7

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 (101) hide show
  1. package/browser/cache/DbQueryResultCache.js +12 -3
  2. package/browser/cache/DbQueryResultCache.js.map +1 -1
  3. package/browser/driver/aurora-data-api/AuroraDataApiQueryRunner.js +33 -39
  4. package/browser/driver/aurora-data-api/AuroraDataApiQueryRunner.js.map +1 -1
  5. package/browser/driver/cockroachdb/CockroachQueryRunner.js +24 -30
  6. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  7. package/browser/driver/mongodb/MongoConnectionOptions.d.ts +4 -0
  8. package/browser/driver/mongodb/MongoConnectionOptions.js.map +1 -1
  9. package/browser/driver/mongodb/MongoQueryRunner.d.ts +2 -0
  10. package/browser/driver/mongodb/MongoQueryRunner.js +3 -0
  11. package/browser/driver/mongodb/MongoQueryRunner.js.map +1 -1
  12. package/browser/driver/mysql/MysqlQueryRunner.js +37 -39
  13. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  14. package/browser/driver/oracle/OracleDriver.js +1 -1
  15. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  16. package/browser/driver/oracle/OracleQueryRunner.js +13 -24
  17. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  18. package/browser/driver/postgres/PostgresDriver.d.ts +1 -0
  19. package/browser/driver/postgres/PostgresDriver.js +16 -7
  20. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  21. package/browser/driver/postgres/PostgresQueryRunner.d.ts +5 -0
  22. package/browser/driver/postgres/PostgresQueryRunner.js +314 -135
  23. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  24. package/browser/driver/sap/SapQueryRunner.js +36 -42
  25. package/browser/driver/sap/SapQueryRunner.js.map +1 -1
  26. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +8 -14
  27. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  28. package/browser/driver/sqlserver/SqlServerQueryRunner.js +31 -33
  29. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  30. package/browser/driver/types/MetadataTableType.d.ts +5 -0
  31. package/browser/driver/types/MetadataTableType.js +8 -0
  32. package/browser/driver/types/MetadataTableType.js.map +1 -0
  33. package/browser/find-options/FindTreeOptions.d.ts +5 -1
  34. package/browser/find-options/FindTreeOptions.js.map +1 -1
  35. package/browser/migration/MigrationExecutor.js +55 -48
  36. package/browser/migration/MigrationExecutor.js.map +1 -1
  37. package/browser/query-runner/BaseQueryRunner.d.ts +23 -0
  38. package/browser/query-runner/BaseQueryRunner.js +37 -0
  39. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  40. package/browser/query-runner/QueryRunner.d.ts +5 -0
  41. package/browser/query-runner/QueryRunner.js.map +1 -1
  42. package/browser/repository/FindTreesOptions.d.ts +9 -0
  43. package/browser/repository/FindTreesOptions.js +3 -0
  44. package/browser/repository/FindTreesOptions.js.map +1 -0
  45. package/browser/repository/TreeRepository.d.ts +4 -1
  46. package/browser/repository/TreeRepository.js +8 -4
  47. package/browser/repository/TreeRepository.js.map +1 -1
  48. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +5 -1
  49. package/browser/schema-builder/RdbmsSchemaBuilder.js +58 -49
  50. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  51. package/cache/DbQueryResultCache.js +12 -3
  52. package/cache/DbQueryResultCache.js.map +1 -1
  53. package/driver/aurora-data-api/AuroraDataApiQueryRunner.js +33 -39
  54. package/driver/aurora-data-api/AuroraDataApiQueryRunner.js.map +1 -1
  55. package/driver/cockroachdb/CockroachQueryRunner.js +24 -30
  56. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  57. package/driver/mongodb/MongoConnectionOptions.d.ts +4 -0
  58. package/driver/mongodb/MongoConnectionOptions.js.map +1 -1
  59. package/driver/mongodb/MongoQueryRunner.d.ts +2 -0
  60. package/driver/mongodb/MongoQueryRunner.js +3 -0
  61. package/driver/mongodb/MongoQueryRunner.js.map +1 -1
  62. package/driver/mysql/MysqlQueryRunner.js +37 -39
  63. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  64. package/driver/oracle/OracleDriver.js +1 -1
  65. package/driver/oracle/OracleDriver.js.map +1 -1
  66. package/driver/oracle/OracleQueryRunner.js +13 -24
  67. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  68. package/driver/postgres/PostgresDriver.d.ts +1 -0
  69. package/driver/postgres/PostgresDriver.js +16 -7
  70. package/driver/postgres/PostgresDriver.js.map +1 -1
  71. package/driver/postgres/PostgresQueryRunner.d.ts +5 -0
  72. package/driver/postgres/PostgresQueryRunner.js +314 -135
  73. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  74. package/driver/sap/SapQueryRunner.js +36 -42
  75. package/driver/sap/SapQueryRunner.js.map +1 -1
  76. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +8 -14
  77. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  78. package/driver/sqlserver/SqlServerQueryRunner.js +31 -33
  79. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  80. package/driver/types/MetadataTableType.d.ts +5 -0
  81. package/driver/types/MetadataTableType.js +11 -0
  82. package/driver/types/MetadataTableType.js.map +1 -0
  83. package/find-options/FindTreeOptions.d.ts +5 -1
  84. package/find-options/FindTreeOptions.js.map +1 -1
  85. package/migration/MigrationExecutor.js +55 -48
  86. package/migration/MigrationExecutor.js.map +1 -1
  87. package/package.json +1 -1
  88. package/query-runner/BaseQueryRunner.d.ts +23 -0
  89. package/query-runner/BaseQueryRunner.js +37 -0
  90. package/query-runner/BaseQueryRunner.js.map +1 -1
  91. package/query-runner/QueryRunner.d.ts +5 -0
  92. package/query-runner/QueryRunner.js.map +1 -1
  93. package/repository/FindTreesOptions.d.ts +9 -0
  94. package/repository/FindTreesOptions.js +4 -0
  95. package/repository/FindTreesOptions.js.map +1 -0
  96. package/repository/TreeRepository.d.ts +4 -1
  97. package/repository/TreeRepository.js +7 -3
  98. package/repository/TreeRepository.js.map +1 -1
  99. package/schema-builder/RdbmsSchemaBuilder.d.ts +5 -1
  100. package/schema-builder/RdbmsSchemaBuilder.js +58 -49
  101. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
@@ -18,6 +18,7 @@ import { Query } from "../Query";
18
18
  import { VersionUtils } from "../../util/VersionUtils";
19
19
  import { TypeORMError } from "../../error";
20
20
  import { QueryResult } from "../../query-runner/QueryResult";
21
+ import { MetadataTableType } from "../types/MetadataTableType";
21
22
  /**
22
23
  * Runs queries on a single postgres database connection.
23
24
  */
@@ -219,23 +220,25 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
219
220
  if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime)
220
221
  this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);
221
222
  result = new QueryResult();
222
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rows')) {
223
- result.records = raw.rows;
224
- }
225
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rowCount')) {
226
- result.affected = raw.rowCount;
227
- }
228
- switch (raw.command) {
229
- case "DELETE":
230
- case "UPDATE":
231
- // for UPDATE and DELETE query additionally return number of affected rows
232
- result.raw = [raw.rows, raw.rowCount];
233
- break;
234
- default:
235
- result.raw = raw.rows;
236
- }
237
- if (!useStructuredResult) {
238
- return [2 /*return*/, result.raw];
223
+ if (raw) {
224
+ if (raw.hasOwnProperty('rows')) {
225
+ result.records = raw.rows;
226
+ }
227
+ if (raw.hasOwnProperty('rowCount')) {
228
+ result.affected = raw.rowCount;
229
+ }
230
+ switch (raw.command) {
231
+ case "DELETE":
232
+ case "UPDATE":
233
+ // for UPDATE and DELETE query additionally return number of affected rows
234
+ result.raw = [raw.rows, raw.rowCount];
235
+ break;
236
+ default:
237
+ result.raw = raw.rows;
238
+ }
239
+ if (!useStructuredResult) {
240
+ return [2 /*return*/, result.raw];
241
+ }
239
242
  }
240
243
  return [2 /*return*/, result];
241
244
  case 4:
@@ -506,35 +509,35 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
506
509
  if (createForeignKeys === void 0) { createForeignKeys = true; }
507
510
  if (createIndices === void 0) { createIndices = true; }
508
511
  return __awaiter(this, void 0, void 0, function () {
509
- var isTableExist, upQueries, downQueries, enumColumns, createdEnumTypes, enumColumns_1, enumColumns_1_1, column, hasEnum, enumName, e_1_1;
510
- var e_1, _a;
512
+ var isTableExist, upQueries, downQueries, enumColumns, createdEnumTypes, enumColumns_1, enumColumns_1_1, column, hasEnum, enumName, e_1_1, generatedColumns, generatedColumns_1, generatedColumns_1_1, column, tableNameWithSchema, tableName, schema, insertQuery, deleteQuery, e_2_1;
513
+ var e_1, _a, e_2, _b;
511
514
  var _this = this;
512
- return __generator(this, function (_b) {
513
- switch (_b.label) {
515
+ return __generator(this, function (_c) {
516
+ switch (_c.label) {
514
517
  case 0:
515
518
  if (!ifNotExist) return [3 /*break*/, 2];
516
519
  return [4 /*yield*/, this.hasTable(table)];
517
520
  case 1:
518
- isTableExist = _b.sent();
521
+ isTableExist = _c.sent();
519
522
  if (isTableExist)
520
523
  return [2 /*return*/, Promise.resolve()];
521
- _b.label = 2;
524
+ _c.label = 2;
522
525
  case 2:
523
526
  upQueries = [];
524
527
  downQueries = [];
525
528
  enumColumns = table.columns.filter(function (column) { return column.type === "enum" || column.type === "simple-enum"; });
526
529
  createdEnumTypes = [];
527
- _b.label = 3;
530
+ _c.label = 3;
528
531
  case 3:
529
- _b.trys.push([3, 8, 9, 10]);
532
+ _c.trys.push([3, 8, 9, 10]);
530
533
  enumColumns_1 = __values(enumColumns), enumColumns_1_1 = enumColumns_1.next();
531
- _b.label = 4;
534
+ _c.label = 4;
532
535
  case 4:
533
536
  if (!!enumColumns_1_1.done) return [3 /*break*/, 7];
534
537
  column = enumColumns_1_1.value;
535
538
  return [4 /*yield*/, this.hasEnumType(table, column)];
536
539
  case 5:
537
- hasEnum = _b.sent();
540
+ hasEnum = _c.sent();
538
541
  enumName = this.buildEnumName(table, column);
539
542
  // if enum with the same "enumName" is defined more then once, me must prevent double creation
540
543
  if (!hasEnum && createdEnumTypes.indexOf(enumName) === -1) {
@@ -542,13 +545,13 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
542
545
  upQueries.push(this.createEnumTypeSql(table, column, enumName));
543
546
  downQueries.push(this.dropEnumTypeSql(table, column, enumName));
544
547
  }
545
- _b.label = 6;
548
+ _c.label = 6;
546
549
  case 6:
547
550
  enumColumns_1_1 = enumColumns_1.next();
548
551
  return [3 /*break*/, 4];
549
552
  case 7: return [3 /*break*/, 10];
550
553
  case 8:
551
- e_1_1 = _b.sent();
554
+ e_1_1 = _c.sent();
552
555
  e_1 = { error: e_1_1 };
553
556
  return [3 /*break*/, 10];
554
557
  case 9:
@@ -558,6 +561,54 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
558
561
  finally { if (e_1) throw e_1.error; }
559
562
  return [7 /*endfinally*/];
560
563
  case 10:
564
+ generatedColumns = table.columns.filter(function (column) { return column.generatedType === "STORED" && column.asExpression; });
565
+ _c.label = 11;
566
+ case 11:
567
+ _c.trys.push([11, 16, 17, 18]);
568
+ generatedColumns_1 = __values(generatedColumns), generatedColumns_1_1 = generatedColumns_1.next();
569
+ _c.label = 12;
570
+ case 12:
571
+ if (!!generatedColumns_1_1.done) return [3 /*break*/, 15];
572
+ column = generatedColumns_1_1.value;
573
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
574
+ case 13:
575
+ tableNameWithSchema = (_c.sent()).split('.');
576
+ tableName = tableNameWithSchema[1];
577
+ schema = tableNameWithSchema[0];
578
+ insertQuery = this.insertTypeormMetadataSql({
579
+ database: this.driver.database,
580
+ schema: schema,
581
+ table: tableName,
582
+ type: MetadataTableType.GENERATED_COLUMN,
583
+ name: column.name,
584
+ value: column.asExpression
585
+ });
586
+ deleteQuery = this.deleteTypeormMetadataSql({
587
+ database: this.driver.database,
588
+ schema: schema,
589
+ table: tableName,
590
+ type: MetadataTableType.GENERATED_COLUMN,
591
+ name: column.name
592
+ });
593
+ upQueries.push(deleteQuery);
594
+ upQueries.push(insertQuery);
595
+ downQueries.push(deleteQuery);
596
+ _c.label = 14;
597
+ case 14:
598
+ generatedColumns_1_1 = generatedColumns_1.next();
599
+ return [3 /*break*/, 12];
600
+ case 15: return [3 /*break*/, 18];
601
+ case 16:
602
+ e_2_1 = _c.sent();
603
+ e_2 = { error: e_2_1 };
604
+ return [3 /*break*/, 18];
605
+ case 17:
606
+ try {
607
+ if (generatedColumns_1_1 && !generatedColumns_1_1.done && (_b = generatedColumns_1.return)) _b.call(generatedColumns_1);
608
+ }
609
+ finally { if (e_2) throw e_2.error; }
610
+ return [7 /*endfinally*/];
611
+ case 18:
561
612
  upQueries.push(this.createTableSql(table, createForeignKeys));
562
613
  downQueries.push(this.dropTableSql(table));
563
614
  // if createForeignKeys is true, we must drop created foreign keys in down query.
@@ -574,8 +625,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
574
625
  });
575
626
  }
576
627
  return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
577
- case 11:
578
- _b.sent();
628
+ case 19:
629
+ _c.sent();
579
630
  return [2 /*return*/];
580
631
  }
581
632
  });
@@ -693,8 +744,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
693
744
  */
694
745
  PostgresQueryRunner.prototype.renameTable = function (oldTableOrName, newTableName) {
695
746
  return __awaiter(this, void 0, void 0, function () {
696
- var upQueries, downQueries, oldTable, _a, newTable, _b, schemaName, oldTableName, columnNames, oldPkName, newPkName, enumColumns, enumColumns_2, enumColumns_2_1, column, oldEnumType, e_2_1;
697
- var e_2, _c;
747
+ var upQueries, downQueries, oldTable, _a, newTable, _b, schemaName, oldTableName, columnNames, oldPkName, newPkName, enumColumns, enumColumns_2, enumColumns_2_1, column, oldEnumType, e_3_1;
748
+ var e_3, _c;
698
749
  var _this = this;
699
750
  return __generator(this, function (_d) {
700
751
  switch (_d.label) {
@@ -792,14 +843,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
792
843
  return [3 /*break*/, 5];
793
844
  case 8: return [3 /*break*/, 11];
794
845
  case 9:
795
- e_2_1 = _d.sent();
796
- e_2 = { error: e_2_1 };
846
+ e_3_1 = _d.sent();
847
+ e_3 = { error: e_3_1 };
797
848
  return [3 /*break*/, 11];
798
849
  case 10:
799
850
  try {
800
851
  if (enumColumns_2_1 && !enumColumns_2_1.done && (_c = enumColumns_2.return)) _c.call(enumColumns_2);
801
852
  }
802
- finally { if (e_2) throw e_2.error; }
853
+ finally { if (e_3) throw e_3.error; }
803
854
  return [7 /*endfinally*/];
804
855
  case 11: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
805
856
  case 12:
@@ -814,7 +865,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
814
865
  */
815
866
  PostgresQueryRunner.prototype.addColumn = function (tableOrName, column) {
816
867
  return __awaiter(this, void 0, void 0, function () {
817
- var table, _a, clonedTable, upQueries, downQueries, hasEnum, primaryColumns, pkName_1, columnNames_1, pkName, columnNames, columnIndex, uniqueConstraint;
868
+ var table, _a, clonedTable, upQueries, downQueries, hasEnum, primaryColumns, pkName_1, columnNames_1, pkName, columnNames, columnIndex, uniqueConstraint, tableNameWithSchema, tableName, schema, insertQuery, deleteQuery;
818
869
  return __generator(this, function (_b) {
819
870
  switch (_b.label) {
820
871
  case 0:
@@ -873,13 +924,39 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
873
924
  upQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " ADD CONSTRAINT \"" + uniqueConstraint.name + "\" UNIQUE (\"" + column.name + "\")"));
874
925
  downQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " DROP CONSTRAINT \"" + uniqueConstraint.name + "\""));
875
926
  }
927
+ if (!(column.generatedType === "STORED" && column.asExpression)) return [3 /*break*/, 7];
928
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
929
+ case 6:
930
+ tableNameWithSchema = (_b.sent()).split('.');
931
+ tableName = tableNameWithSchema[1];
932
+ schema = tableNameWithSchema[0];
933
+ insertQuery = this.insertTypeormMetadataSql({
934
+ database: this.driver.database,
935
+ schema: schema,
936
+ table: tableName,
937
+ type: MetadataTableType.GENERATED_COLUMN,
938
+ name: column.name,
939
+ value: column.asExpression
940
+ });
941
+ deleteQuery = this.deleteTypeormMetadataSql({
942
+ database: this.driver.database,
943
+ schema: schema,
944
+ table: tableName,
945
+ type: MetadataTableType.GENERATED_COLUMN,
946
+ name: column.name
947
+ });
948
+ upQueries.push(deleteQuery);
949
+ upQueries.push(insertQuery);
950
+ downQueries.push(deleteQuery);
951
+ _b.label = 7;
952
+ case 7:
876
953
  // create column's comment
877
954
  if (column.comment) {
878
955
  upQueries.push(new Query("COMMENT ON COLUMN " + this.escapePath(table) + ".\"" + column.name + "\" IS " + this.escapeComment(column.comment)));
879
956
  downQueries.push(new Query("COMMENT ON COLUMN " + this.escapePath(table) + ".\"" + column.name + "\" IS " + this.escapeComment(column.comment)));
880
957
  }
881
958
  return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
882
- case 6:
959
+ case 8:
883
960
  _b.sent();
884
961
  clonedTable.addColumn(column);
885
962
  this.replaceCachedTable(table, clonedTable);
@@ -893,8 +970,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
893
970
  */
894
971
  PostgresQueryRunner.prototype.addColumns = function (tableOrName, columns) {
895
972
  return __awaiter(this, void 0, void 0, function () {
896
- var columns_1, columns_1_1, column, e_3_1;
897
- var e_3, _a;
973
+ var columns_1, columns_1_1, column, e_4_1;
974
+ var e_4, _a;
898
975
  return __generator(this, function (_b) {
899
976
  switch (_b.label) {
900
977
  case 0:
@@ -913,14 +990,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
913
990
  return [3 /*break*/, 1];
914
991
  case 4: return [3 /*break*/, 7];
915
992
  case 5:
916
- e_3_1 = _b.sent();
917
- e_3 = { error: e_3_1 };
993
+ e_4_1 = _b.sent();
994
+ e_4 = { error: e_4_1 };
918
995
  return [3 /*break*/, 7];
919
996
  case 6:
920
997
  try {
921
998
  if (columns_1_1 && !columns_1_1.done && (_a = columns_1.return)) _a.call(columns_1);
922
999
  }
923
- finally { if (e_3) throw e_3.error; }
1000
+ finally { if (e_4) throw e_4.error; }
924
1001
  return [7 /*endfinally*/];
925
1002
  case 7: return [2 /*return*/];
926
1003
  }
@@ -965,7 +1042,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
965
1042
  */
966
1043
  PostgresQueryRunner.prototype.changeColumn = function (tableOrName, oldTableColumnOrName, newColumn) {
967
1044
  return __awaiter(this, void 0, void 0, function () {
968
- var table, _a, clonedTable, upQueries, downQueries, defaultValueChanged, oldColumn, oldEnumType, primaryColumns, columnNames, oldPkName, newPkName, sequencePath, sequenceName, newSequencePath, newSequenceName, up, down, oldTableColumn, arraySuffix, newEnumName, oldEnumName, oldEnumNameWithoutSchema, oldEnumNameWithSchema_old, oldEnumNameWithoutSchema_old, upType, downType, primaryColumns, pkName, columnNames, column, pkName, columnNames, primaryColumn, column, pkName, columnNames, uniqueConstraint, uniqueConstraint;
1045
+ var table, _a, clonedTable, upQueries, downQueries, defaultValueChanged, oldColumn, oldEnumType, primaryColumns, columnNames, oldPkName, newPkName, sequencePath, sequenceName, newSequencePath, newSequenceName, up, down, oldTableColumn, arraySuffix, newEnumName, oldEnumName, oldEnumNameWithoutSchema, oldEnumNameWithSchema_old, oldEnumNameWithoutSchema_old, upType, downType, primaryColumns, pkName, columnNames, column, pkName, columnNames, primaryColumn, column, pkName, columnNames, uniqueConstraint, uniqueConstraint, tableNameWithSchema, tableName, schema;
969
1046
  var _this = this;
970
1047
  return __generator(this, function (_b) {
971
1048
  switch (_b.label) {
@@ -988,7 +1065,11 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
988
1065
  : table.columns.find(function (column) { return column.name === oldTableColumnOrName; });
989
1066
  if (!oldColumn)
990
1067
  throw new TypeORMError("Column \"" + oldTableColumnOrName + "\" was not found in the \"" + table.name + "\" table.");
991
- if (!(oldColumn.type !== newColumn.type || oldColumn.length !== newColumn.length || newColumn.isArray !== oldColumn.isArray)) return [3 /*break*/, 6];
1068
+ if (!(oldColumn.type !== newColumn.type
1069
+ || oldColumn.length !== newColumn.length
1070
+ || newColumn.isArray !== oldColumn.isArray
1071
+ || (!oldColumn.generatedType && newColumn.generatedType === "STORED")
1072
+ || (oldColumn.asExpression !== newColumn.asExpression && newColumn.generatedType === "STORED"))) return [3 /*break*/, 6];
992
1073
  // To avoid data conversion, we just recreate column
993
1074
  return [4 /*yield*/, this.dropColumn(table, oldColumn)];
994
1075
  case 4:
@@ -999,7 +1080,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
999
1080
  _b.sent();
1000
1081
  // update cloned table
1001
1082
  clonedTable = table.clone();
1002
- return [3 /*break*/, 10];
1083
+ return [3 /*break*/, 11];
1003
1084
  case 6:
1004
1085
  if (!(oldColumn.name !== newColumn.name)) return [3 /*break*/, 9];
1005
1086
  // rename column
@@ -1221,9 +1302,45 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1221
1302
  upQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " ALTER COLUMN \"" + newColumn.name + "\" TYPE " + this.driver.createFullType(newColumn)));
1222
1303
  downQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " ALTER COLUMN \"" + newColumn.name + "\" TYPE " + this.driver.createFullType(oldColumn)));
1223
1304
  }
1224
- _b.label = 10;
1225
- case 10: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1226
- case 11:
1305
+ if (!(newColumn.generatedType !== oldColumn.generatedType)) return [3 /*break*/, 11];
1306
+ if (!(!newColumn.generatedType || newColumn.generatedType === "VIRTUAL")) return [3 /*break*/, 11];
1307
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
1308
+ case 10:
1309
+ tableNameWithSchema = (_b.sent()).split('.');
1310
+ tableName = tableNameWithSchema[1];
1311
+ schema = tableNameWithSchema[0];
1312
+ upQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " RENAME COLUMN \"" + oldColumn.name + "\" TO \"TEMP_OLD_" + oldColumn.name + "\""));
1313
+ upQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " ADD " + this.buildCreateColumnSql(table, newColumn)));
1314
+ upQueries.push(new Query("UPDATE " + this.escapePath(table) + " SET \"" + newColumn.name + "\" = \"TEMP_OLD_" + oldColumn.name + "\""));
1315
+ upQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " DROP COLUMN \"TEMP_OLD_" + oldColumn.name + "\""));
1316
+ upQueries.push(this.deleteTypeormMetadataSql({
1317
+ database: this.driver.database,
1318
+ schema: schema,
1319
+ table: tableName,
1320
+ type: MetadataTableType.GENERATED_COLUMN,
1321
+ name: oldColumn.name
1322
+ }));
1323
+ // However, we can't copy it back on downgrade. It needs to regenerate.
1324
+ downQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " DROP COLUMN \"" + newColumn.name + "\""));
1325
+ downQueries.push(new Query("ALTER TABLE " + this.escapePath(table) + " ADD " + this.buildCreateColumnSql(table, oldColumn)));
1326
+ downQueries.push(this.deleteTypeormMetadataSql({
1327
+ database: this.driver.database,
1328
+ schema: schema,
1329
+ table: tableName,
1330
+ type: MetadataTableType.GENERATED_COLUMN,
1331
+ name: newColumn.name
1332
+ }));
1333
+ downQueries.push(this.insertTypeormMetadataSql({
1334
+ database: this.driver.database,
1335
+ schema: schema,
1336
+ table: tableName,
1337
+ type: MetadataTableType.GENERATED_COLUMN,
1338
+ name: oldColumn.name,
1339
+ value: oldColumn.asExpression
1340
+ }));
1341
+ _b.label = 11;
1342
+ case 11: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1343
+ case 12:
1227
1344
  _b.sent();
1228
1345
  this.replaceCachedTable(table, clonedTable);
1229
1346
  return [2 /*return*/];
@@ -1236,8 +1353,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1236
1353
  */
1237
1354
  PostgresQueryRunner.prototype.changeColumns = function (tableOrName, changedColumns) {
1238
1355
  return __awaiter(this, void 0, void 0, function () {
1239
- var changedColumns_1, changedColumns_1_1, _a, oldColumn, newColumn, e_4_1;
1240
- var e_4, _b;
1356
+ var changedColumns_1, changedColumns_1_1, _a, oldColumn, newColumn, e_5_1;
1357
+ var e_5, _b;
1241
1358
  return __generator(this, function (_c) {
1242
1359
  switch (_c.label) {
1243
1360
  case 0:
@@ -1256,14 +1373,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1256
1373
  return [3 /*break*/, 1];
1257
1374
  case 4: return [3 /*break*/, 7];
1258
1375
  case 5:
1259
- e_4_1 = _c.sent();
1260
- e_4 = { error: e_4_1 };
1376
+ e_5_1 = _c.sent();
1377
+ e_5 = { error: e_5_1 };
1261
1378
  return [3 /*break*/, 7];
1262
1379
  case 6:
1263
1380
  try {
1264
1381
  if (changedColumns_1_1 && !changedColumns_1_1.done && (_b = changedColumns_1.return)) _b.call(changedColumns_1);
1265
1382
  }
1266
- finally { if (e_4) throw e_4.error; }
1383
+ finally { if (e_5) throw e_5.error; }
1267
1384
  return [7 /*endfinally*/];
1268
1385
  case 7: return [2 /*return*/];
1269
1386
  }
@@ -1275,7 +1392,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1275
1392
  */
1276
1393
  PostgresQueryRunner.prototype.dropColumn = function (tableOrName, columnOrName) {
1277
1394
  return __awaiter(this, void 0, void 0, function () {
1278
- var table, _a, column, clonedTable, upQueries, downQueries, pkName, columnNames, tableColumn, pkName_2, columnNames_2, columnIndex, columnCheck, columnUnique, hasEnum, enumType, escapedEnumName;
1395
+ var table, _a, column, clonedTable, upQueries, downQueries, pkName, columnNames, tableColumn, pkName_2, columnNames_2, columnIndex, columnCheck, columnUnique, hasEnum, enumType, escapedEnumName, tableNameWithSchema, tableName, schema, insertQuery, deleteQuery;
1279
1396
  return __generator(this, function (_b) {
1280
1397
  switch (_b.label) {
1281
1398
  case 0:
@@ -1342,8 +1459,33 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1342
1459
  upQueries.push(this.dropEnumTypeSql(table, column, escapedEnumName));
1343
1460
  downQueries.push(this.createEnumTypeSql(table, column, escapedEnumName));
1344
1461
  _b.label = 6;
1345
- case 6: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1462
+ case 6:
1463
+ if (!(column.generatedType === "STORED")) return [3 /*break*/, 8];
1464
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
1346
1465
  case 7:
1466
+ tableNameWithSchema = (_b.sent()).split('.');
1467
+ tableName = tableNameWithSchema[1];
1468
+ schema = tableNameWithSchema[0];
1469
+ insertQuery = this.deleteTypeormMetadataSql({
1470
+ database: this.driver.database,
1471
+ schema: schema,
1472
+ table: tableName,
1473
+ type: MetadataTableType.GENERATED_COLUMN,
1474
+ name: column.name
1475
+ });
1476
+ deleteQuery = this.insertTypeormMetadataSql({
1477
+ database: this.driver.database,
1478
+ schema: schema,
1479
+ table: tableName,
1480
+ type: MetadataTableType.GENERATED_COLUMN,
1481
+ name: column.name,
1482
+ value: column.asExpression
1483
+ });
1484
+ upQueries.push(insertQuery);
1485
+ downQueries.push(deleteQuery);
1486
+ _b.label = 8;
1487
+ case 8: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1488
+ case 9:
1347
1489
  _b.sent();
1348
1490
  clonedTable.removeColumn(column);
1349
1491
  this.replaceCachedTable(table, clonedTable);
@@ -1357,8 +1499,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1357
1499
  */
1358
1500
  PostgresQueryRunner.prototype.dropColumns = function (tableOrName, columns) {
1359
1501
  return __awaiter(this, void 0, void 0, function () {
1360
- var columns_2, columns_2_1, column, e_5_1;
1361
- var e_5, _a;
1502
+ var columns_2, columns_2_1, column, e_6_1;
1503
+ var e_6, _a;
1362
1504
  return __generator(this, function (_b) {
1363
1505
  switch (_b.label) {
1364
1506
  case 0:
@@ -1377,14 +1519,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1377
1519
  return [3 /*break*/, 1];
1378
1520
  case 4: return [3 /*break*/, 7];
1379
1521
  case 5:
1380
- e_5_1 = _b.sent();
1381
- e_5 = { error: e_5_1 };
1522
+ e_6_1 = _b.sent();
1523
+ e_6 = { error: e_6_1 };
1382
1524
  return [3 /*break*/, 7];
1383
1525
  case 6:
1384
1526
  try {
1385
1527
  if (columns_2_1 && !columns_2_1.done && (_a = columns_2.return)) _a.call(columns_2);
1386
1528
  }
1387
- finally { if (e_5) throw e_5.error; }
1529
+ finally { if (e_6) throw e_6.error; }
1388
1530
  return [7 /*endfinally*/];
1389
1531
  case 7: return [2 /*return*/];
1390
1532
  }
@@ -1540,8 +1682,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1540
1682
  */
1541
1683
  PostgresQueryRunner.prototype.createUniqueConstraints = function (tableOrName, uniqueConstraints) {
1542
1684
  return __awaiter(this, void 0, void 0, function () {
1543
- var uniqueConstraints_1, uniqueConstraints_1_1, uniqueConstraint, e_6_1;
1544
- var e_6, _a;
1685
+ var uniqueConstraints_1, uniqueConstraints_1_1, uniqueConstraint, e_7_1;
1686
+ var e_7, _a;
1545
1687
  return __generator(this, function (_b) {
1546
1688
  switch (_b.label) {
1547
1689
  case 0:
@@ -1560,14 +1702,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1560
1702
  return [3 /*break*/, 1];
1561
1703
  case 4: return [3 /*break*/, 7];
1562
1704
  case 5:
1563
- e_6_1 = _b.sent();
1564
- e_6 = { error: e_6_1 };
1705
+ e_7_1 = _b.sent();
1706
+ e_7 = { error: e_7_1 };
1565
1707
  return [3 /*break*/, 7];
1566
1708
  case 6:
1567
1709
  try {
1568
1710
  if (uniqueConstraints_1_1 && !uniqueConstraints_1_1.done && (_a = uniqueConstraints_1.return)) _a.call(uniqueConstraints_1);
1569
1711
  }
1570
- finally { if (e_6) throw e_6.error; }
1712
+ finally { if (e_7) throw e_7.error; }
1571
1713
  return [7 /*endfinally*/];
1572
1714
  case 7: return [2 /*return*/];
1573
1715
  }
@@ -1611,8 +1753,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1611
1753
  */
1612
1754
  PostgresQueryRunner.prototype.dropUniqueConstraints = function (tableOrName, uniqueConstraints) {
1613
1755
  return __awaiter(this, void 0, void 0, function () {
1614
- var uniqueConstraints_2, uniqueConstraints_2_1, uniqueConstraint, e_7_1;
1615
- var e_7, _a;
1756
+ var uniqueConstraints_2, uniqueConstraints_2_1, uniqueConstraint, e_8_1;
1757
+ var e_8, _a;
1616
1758
  return __generator(this, function (_b) {
1617
1759
  switch (_b.label) {
1618
1760
  case 0:
@@ -1631,14 +1773,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1631
1773
  return [3 /*break*/, 1];
1632
1774
  case 4: return [3 /*break*/, 7];
1633
1775
  case 5:
1634
- e_7_1 = _b.sent();
1635
- e_7 = { error: e_7_1 };
1776
+ e_8_1 = _b.sent();
1777
+ e_8 = { error: e_8_1 };
1636
1778
  return [3 /*break*/, 7];
1637
1779
  case 6:
1638
1780
  try {
1639
1781
  if (uniqueConstraints_2_1 && !uniqueConstraints_2_1.done && (_a = uniqueConstraints_2.return)) _a.call(uniqueConstraints_2);
1640
1782
  }
1641
- finally { if (e_7) throw e_7.error; }
1783
+ finally { if (e_8) throw e_8.error; }
1642
1784
  return [7 /*endfinally*/];
1643
1785
  case 7: return [2 /*return*/];
1644
1786
  }
@@ -1886,8 +2028,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1886
2028
  */
1887
2029
  PostgresQueryRunner.prototype.createForeignKeys = function (tableOrName, foreignKeys) {
1888
2030
  return __awaiter(this, void 0, void 0, function () {
1889
- var foreignKeys_1, foreignKeys_1_1, foreignKey, e_8_1;
1890
- var e_8, _a;
2031
+ var foreignKeys_1, foreignKeys_1_1, foreignKey, e_9_1;
2032
+ var e_9, _a;
1891
2033
  return __generator(this, function (_b) {
1892
2034
  switch (_b.label) {
1893
2035
  case 0:
@@ -1906,14 +2048,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1906
2048
  return [3 /*break*/, 1];
1907
2049
  case 4: return [3 /*break*/, 7];
1908
2050
  case 5:
1909
- e_8_1 = _b.sent();
1910
- e_8 = { error: e_8_1 };
2051
+ e_9_1 = _b.sent();
2052
+ e_9 = { error: e_9_1 };
1911
2053
  return [3 /*break*/, 7];
1912
2054
  case 6:
1913
2055
  try {
1914
2056
  if (foreignKeys_1_1 && !foreignKeys_1_1.done && (_a = foreignKeys_1.return)) _a.call(foreignKeys_1);
1915
2057
  }
1916
- finally { if (e_8) throw e_8.error; }
2058
+ finally { if (e_9) throw e_9.error; }
1917
2059
  return [7 /*endfinally*/];
1918
2060
  case 7: return [2 /*return*/];
1919
2061
  }
@@ -1957,8 +2099,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1957
2099
  */
1958
2100
  PostgresQueryRunner.prototype.dropForeignKeys = function (tableOrName, foreignKeys) {
1959
2101
  return __awaiter(this, void 0, void 0, function () {
1960
- var foreignKeys_2, foreignKeys_2_1, foreignKey, e_9_1;
1961
- var e_9, _a;
2102
+ var foreignKeys_2, foreignKeys_2_1, foreignKey, e_10_1;
2103
+ var e_10, _a;
1962
2104
  return __generator(this, function (_b) {
1963
2105
  switch (_b.label) {
1964
2106
  case 0:
@@ -1977,14 +2119,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1977
2119
  return [3 /*break*/, 1];
1978
2120
  case 4: return [3 /*break*/, 7];
1979
2121
  case 5:
1980
- e_9_1 = _b.sent();
1981
- e_9 = { error: e_9_1 };
2122
+ e_10_1 = _b.sent();
2123
+ e_10 = { error: e_10_1 };
1982
2124
  return [3 /*break*/, 7];
1983
2125
  case 6:
1984
2126
  try {
1985
2127
  if (foreignKeys_2_1 && !foreignKeys_2_1.done && (_a = foreignKeys_2.return)) _a.call(foreignKeys_2);
1986
2128
  }
1987
- finally { if (e_9) throw e_9.error; }
2129
+ finally { if (e_10) throw e_10.error; }
1988
2130
  return [7 /*endfinally*/];
1989
2131
  case 7: return [2 /*return*/];
1990
2132
  }
@@ -2028,8 +2170,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2028
2170
  */
2029
2171
  PostgresQueryRunner.prototype.createIndices = function (tableOrName, indices) {
2030
2172
  return __awaiter(this, void 0, void 0, function () {
2031
- var indices_1, indices_1_1, index, e_10_1;
2032
- var e_10, _a;
2173
+ var indices_1, indices_1_1, index, e_11_1;
2174
+ var e_11, _a;
2033
2175
  return __generator(this, function (_b) {
2034
2176
  switch (_b.label) {
2035
2177
  case 0:
@@ -2048,14 +2190,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2048
2190
  return [3 /*break*/, 1];
2049
2191
  case 4: return [3 /*break*/, 7];
2050
2192
  case 5:
2051
- e_10_1 = _b.sent();
2052
- e_10 = { error: e_10_1 };
2193
+ e_11_1 = _b.sent();
2194
+ e_11 = { error: e_11_1 };
2053
2195
  return [3 /*break*/, 7];
2054
2196
  case 6:
2055
2197
  try {
2056
2198
  if (indices_1_1 && !indices_1_1.done && (_a = indices_1.return)) _a.call(indices_1);
2057
2199
  }
2058
- finally { if (e_10) throw e_10.error; }
2200
+ finally { if (e_11) throw e_11.error; }
2059
2201
  return [7 /*endfinally*/];
2060
2202
  case 7: return [2 /*return*/];
2061
2203
  }
@@ -2099,8 +2241,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2099
2241
  */
2100
2242
  PostgresQueryRunner.prototype.dropIndices = function (tableOrName, indices) {
2101
2243
  return __awaiter(this, void 0, void 0, function () {
2102
- var indices_2, indices_2_1, index, e_11_1;
2103
- var e_11, _a;
2244
+ var indices_2, indices_2_1, index, e_12_1;
2245
+ var e_12, _a;
2104
2246
  return __generator(this, function (_b) {
2105
2247
  switch (_b.label) {
2106
2248
  case 0:
@@ -2119,14 +2261,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2119
2261
  return [3 /*break*/, 1];
2120
2262
  case 4: return [3 /*break*/, 7];
2121
2263
  case 5:
2122
- e_11_1 = _b.sent();
2123
- e_11 = { error: e_11_1 };
2264
+ e_12_1 = _b.sent();
2265
+ e_12 = { error: e_12_1 };
2124
2266
  return [3 /*break*/, 7];
2125
2267
  case 6:
2126
2268
  try {
2127
2269
  if (indices_2_1 && !indices_2_1.done && (_a = indices_2.return)) _a.call(indices_2);
2128
2270
  }
2129
- finally { if (e_11) throw e_11.error; }
2271
+ finally { if (e_12) throw e_12.error; }
2130
2272
  return [7 /*endfinally*/];
2131
2273
  case 7: return [2 /*return*/];
2132
2274
  }
@@ -2270,7 +2412,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2270
2412
  query = "SELECT \"t\".* FROM " + this.escapePath(this.getTypeormMetadataTableName()) + " \"t\" " +
2271
2413
  "INNER JOIN \"pg_catalog\".\"pg_class\" \"c\" ON \"c\".\"relname\" = \"t\".\"name\" " +
2272
2414
  "INNER JOIN \"pg_namespace\" \"n\" ON \"n\".\"oid\" = \"c\".\"relnamespace\" AND \"n\".\"nspname\" = \"t\".\"schema\" " +
2273
- ("WHERE \"t\".\"type\" IN ('VIEW', 'MATERIALIZED_VIEW') " + (viewsCondition ? "AND (" + viewsCondition + ")" : ""));
2415
+ ("WHERE \"t\".\"type\" IN ('" + MetadataTableType.VIEW + "', '" + MetadataTableType.MATERIALIZED_VIEW + "') " + (viewsCondition ? "AND (" + viewsCondition + ")" : ""));
2274
2416
  return [4 /*yield*/, this.query(query)];
2275
2417
  case 4:
2276
2418
  dbViews = _a.sent();
@@ -2281,7 +2423,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2281
2423
  view.schema = dbView["schema"];
2282
2424
  view.name = _this.driver.buildTableName(dbView["name"], schema);
2283
2425
  view.expression = dbView["value"];
2284
- view.materialized = dbView["type"] === "MATERIALIZED_VIEW";
2426
+ view.materialized = dbView["type"] === MetadataTableType.MATERIALIZED_VIEW;
2285
2427
  return view;
2286
2428
  })];
2287
2429
  }
@@ -2432,7 +2574,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2432
2574
  return [4 /*yield*/, Promise.all(dbColumns
2433
2575
  .filter(function (dbColumn) { return (dbColumn["table_name"] === dbTable["table_name"] && dbColumn["table_schema"] === dbTable["table_schema"]); })
2434
2576
  .map(function (dbColumn) { return __awaiter(_this, void 0, void 0, function () {
2435
- var columnConstraints, tableColumn, name_1, builtEnumName, enumName, sql, results, type, geometryColumnSql, results, geographyColumnSql, results, length_1, match, uniqueConstraint, isConstraintComposite, serialDefaultName, serialDefaultPath, defaultWithoutQuotes;
2577
+ var columnConstraints, tableColumn, name_1, builtEnumName, enumName, sql, results, type, geometryColumnSql, results, geographyColumnSql, results, length_1, match, uniqueConstraints, isConstraintComposite, serialDefaultName, serialDefaultPath, defaultWithoutQuotes, asExpressionQuery, results;
2436
2578
  return __generator(this, function (_a) {
2437
2579
  switch (_a.label) {
2438
2580
  case 0:
@@ -2531,13 +2673,13 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2531
2673
  }
2532
2674
  tableColumn.isNullable = dbColumn["is_nullable"] === "YES";
2533
2675
  tableColumn.isPrimary = !!columnConstraints.find(function (constraint) { return constraint["constraint_type"] === "PRIMARY"; });
2534
- uniqueConstraint = columnConstraints.find(function (constraint) { return constraint["constraint_type"] === "UNIQUE"; });
2535
- isConstraintComposite = uniqueConstraint
2536
- ? !!dbConstraints.find(function (dbConstraint) { return dbConstraint["constraint_type"] === "UNIQUE"
2676
+ uniqueConstraints = columnConstraints.filter(function (constraint) { return constraint["constraint_type"] === "UNIQUE"; });
2677
+ isConstraintComposite = uniqueConstraints.every(function (uniqueConstraint) {
2678
+ return dbConstraints.some(function (dbConstraint) { return dbConstraint["constraint_type"] === "UNIQUE"
2537
2679
  && dbConstraint["constraint_name"] === uniqueConstraint["constraint_name"]
2538
- && dbConstraint["column_name"] !== dbColumn["column_name"]; })
2539
- : false;
2540
- tableColumn.isUnique = !!uniqueConstraint && !isConstraintComposite;
2680
+ && dbConstraint["column_name"] !== dbColumn["column_name"]; });
2681
+ });
2682
+ tableColumn.isUnique = uniqueConstraints.length > 0 && !isConstraintComposite;
2541
2683
  if (dbColumn.is_identity === "YES") { // Postgres 10+ Identity column
2542
2684
  tableColumn.isGenerated = true;
2543
2685
  tableColumn.generationStrategy = "identity";
@@ -2558,10 +2700,30 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2558
2700
  tableColumn.default = dbColumn["column_default"];
2559
2701
  }
2560
2702
  else {
2561
- tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\[\]\"]+/g, "");
2703
+ tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\.\[\]\"]+/g, "");
2562
2704
  tableColumn.default = tableColumn.default.replace(/^(-?\d+)$/, "'$1'");
2563
2705
  }
2564
2706
  }
2707
+ if (!(dbColumn["is_generated"] === "ALWAYS" && dbColumn["generation_expression"])) return [3 /*break*/, 9];
2708
+ // In postgres there is no VIRTUAL generated column type
2709
+ tableColumn.generatedType = "STORED";
2710
+ asExpressionQuery = "SELECT * FROM \"typeorm_metadata\" "
2711
+ + (" WHERE \"table\" = '" + dbTable["table_name"] + "'")
2712
+ + (" AND \"name\" = '" + tableColumn.name + "'")
2713
+ + (" AND \"schema\" = '" + dbTable["table_schema"] + "'")
2714
+ + (" AND \"database\" = '" + this.driver.database + "'")
2715
+ + (" AND \"type\" = '" + MetadataTableType.GENERATED_COLUMN + "'");
2716
+ return [4 /*yield*/, this.query(asExpressionQuery)];
2717
+ case 8:
2718
+ results = _a.sent();
2719
+ if (results[0] && results[0].value) {
2720
+ tableColumn.asExpression = results[0].value;
2721
+ }
2722
+ else {
2723
+ tableColumn.asExpression = "";
2724
+ }
2725
+ _a.label = 9;
2726
+ case 9:
2565
2727
  tableColumn.comment = dbColumn["description"] ? dbColumn["description"] : undefined;
2566
2728
  if (dbColumn["character_set_name"])
2567
2729
  tableColumn.charset = dbColumn["character_set_name"];
@@ -2759,24 +2921,19 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2759
2921
  };
2760
2922
  PostgresQueryRunner.prototype.insertViewDefinitionSql = function (view) {
2761
2923
  return __awaiter(this, void 0, void 0, function () {
2762
- var currentSchema, _a, schema, name, type, expression, _b, query, parameters;
2763
- return __generator(this, function (_c) {
2764
- switch (_c.label) {
2924
+ var currentSchema, _a, schema, name, type, expression;
2925
+ return __generator(this, function (_b) {
2926
+ switch (_b.label) {
2765
2927
  case 0: return [4 /*yield*/, this.getCurrentSchema()];
2766
2928
  case 1:
2767
- currentSchema = _c.sent();
2929
+ currentSchema = _b.sent();
2768
2930
  _a = this.driver.parseTableName(view), schema = _a.schema, name = _a.tableName;
2769
2931
  if (!schema) {
2770
2932
  schema = currentSchema;
2771
2933
  }
2772
- type = view.materialized ? "MATERIALIZED_VIEW" : "VIEW";
2934
+ type = view.materialized ? MetadataTableType.MATERIALIZED_VIEW : MetadataTableType.VIEW;
2773
2935
  expression = typeof view.expression === "string" ? view.expression.trim() : view.expression(this.connection).getQuery();
2774
- _b = __read(this.connection.createQueryBuilder()
2775
- .insert()
2776
- .into(this.getTypeormMetadataTableName())
2777
- .values({ type: type, schema: schema, name: name, value: expression })
2778
- .getQueryAndParameters(), 2), query = _b[0], parameters = _b[1];
2779
- return [2 /*return*/, new Query(query, parameters)];
2936
+ return [2 /*return*/, this.insertTypeormMetadataSql({ type: type, schema: schema, name: name, value: expression })];
2780
2937
  }
2781
2938
  });
2782
2939
  });
@@ -2793,25 +2950,18 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2793
2950
  */
2794
2951
  PostgresQueryRunner.prototype.deleteViewDefinitionSql = function (view) {
2795
2952
  return __awaiter(this, void 0, void 0, function () {
2796
- var currentSchema, _a, schema, name, type, qb, _b, query, parameters;
2797
- return __generator(this, function (_c) {
2798
- switch (_c.label) {
2953
+ var currentSchema, _a, schema, name, type;
2954
+ return __generator(this, function (_b) {
2955
+ switch (_b.label) {
2799
2956
  case 0: return [4 /*yield*/, this.getCurrentSchema()];
2800
2957
  case 1:
2801
- currentSchema = _c.sent();
2958
+ currentSchema = _b.sent();
2802
2959
  _a = this.driver.parseTableName(view), schema = _a.schema, name = _a.tableName;
2803
2960
  if (!schema) {
2804
2961
  schema = currentSchema;
2805
2962
  }
2806
- type = view.materialized ? "MATERIALIZED_VIEW" : "VIEW";
2807
- qb = this.connection.createQueryBuilder();
2808
- _b = __read(qb.delete()
2809
- .from(this.getTypeormMetadataTableName())
2810
- .where(qb.escape("type") + " = :type", { type: type })
2811
- .andWhere(qb.escape("schema") + " = :schema", { schema: schema })
2812
- .andWhere(qb.escape("name") + " = :name", { name: name })
2813
- .getQueryAndParameters(), 2), query = _b[0], parameters = _b[1];
2814
- return [2 /*return*/, new Query(query, parameters)];
2963
+ type = view.materialized ? MetadataTableType.MATERIALIZED_VIEW : MetadataTableType.VIEW;
2964
+ return [2 /*return*/, this.deleteTypeormMetadataSql({ type: type, schema: schema, name: name })];
2815
2965
  }
2816
2966
  });
2817
2967
  });
@@ -3062,6 +3212,28 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
3062
3212
  }
3063
3213
  return "\"" + tableName + "\"";
3064
3214
  };
3215
+ /**
3216
+ * Get the table name with table schema
3217
+ * Note: Without ' or "
3218
+ */
3219
+ PostgresQueryRunner.prototype.getTableNameWithSchema = function (target) {
3220
+ return __awaiter(this, void 0, void 0, function () {
3221
+ var tableName, schemaResult, schema;
3222
+ return __generator(this, function (_a) {
3223
+ switch (_a.label) {
3224
+ case 0:
3225
+ tableName = target instanceof Table ? target.name : target;
3226
+ if (!(tableName.indexOf(".") === -1)) return [3 /*break*/, 2];
3227
+ return [4 /*yield*/, this.query("SELECT current_schema()")];
3228
+ case 1:
3229
+ schemaResult = _a.sent();
3230
+ schema = schemaResult[0]["current_schema"];
3231
+ return [2 /*return*/, schema + "." + tableName];
3232
+ case 2: return [2 /*return*/, tableName.split(".")[0] + "." + tableName.split(".")[1]];
3233
+ }
3234
+ });
3235
+ });
3236
+ };
3065
3237
  /**
3066
3238
  * Builds a query for create column.
3067
3239
  */
@@ -3088,16 +3260,23 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
3088
3260
  else if (!column.isGenerated || column.type === "uuid") {
3089
3261
  c += " " + this.connection.driver.createFullType(column);
3090
3262
  }
3091
- if (column.charset)
3092
- c += " CHARACTER SET \"" + column.charset + "\"";
3093
- if (column.collation)
3094
- c += " COLLATE \"" + column.collation + "\"";
3095
- if (column.isNullable !== true)
3096
- c += " NOT NULL";
3097
- if (column.default !== undefined && column.default !== null)
3098
- c += " DEFAULT " + column.default;
3099
- if (column.isGenerated && column.generationStrategy === "uuid" && !column.default)
3100
- c += " DEFAULT " + this.driver.uuidGenerator;
3263
+ // CHARACTER SET, COLLATE, NOT NULL and DEFAULT do not exist on generated (virtual) columns
3264
+ // Also, postgres only supports the stored generated column type
3265
+ if (column.generatedType === "STORED" && column.asExpression) {
3266
+ c += " GENERATED ALWAYS AS (" + column.asExpression + ") STORED";
3267
+ }
3268
+ else {
3269
+ if (column.charset)
3270
+ c += " CHARACTER SET \"" + column.charset + "\"";
3271
+ if (column.collation)
3272
+ c += " COLLATE \"" + column.collation + "\"";
3273
+ if (column.isNullable !== true)
3274
+ c += " NOT NULL";
3275
+ if (column.default !== undefined && column.default !== null)
3276
+ c += " DEFAULT " + column.default;
3277
+ if (column.isGenerated && column.generationStrategy === "uuid" && !column.default)
3278
+ c += " DEFAULT " + this.driver.uuidGenerator;
3279
+ }
3101
3280
  return c;
3102
3281
  };
3103
3282
  /**