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
@@ -21,6 +21,7 @@ var Query_1 = require("../Query");
21
21
  var VersionUtils_1 = require("../../util/VersionUtils");
22
22
  var error_1 = require("../../error");
23
23
  var QueryResult_1 = require("../../query-runner/QueryResult");
24
+ var MetadataTableType_1 = require("../types/MetadataTableType");
24
25
  /**
25
26
  * Runs queries on a single postgres database connection.
26
27
  */
@@ -222,23 +223,25 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
222
223
  if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime)
223
224
  this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);
224
225
  result = new QueryResult_1.QueryResult();
225
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rows')) {
226
- result.records = raw.rows;
227
- }
228
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rowCount')) {
229
- result.affected = raw.rowCount;
230
- }
231
- switch (raw.command) {
232
- case "DELETE":
233
- case "UPDATE":
234
- // for UPDATE and DELETE query additionally return number of affected rows
235
- result.raw = [raw.rows, raw.rowCount];
236
- break;
237
- default:
238
- result.raw = raw.rows;
239
- }
240
- if (!useStructuredResult) {
241
- return [2 /*return*/, result.raw];
226
+ if (raw) {
227
+ if (raw.hasOwnProperty('rows')) {
228
+ result.records = raw.rows;
229
+ }
230
+ if (raw.hasOwnProperty('rowCount')) {
231
+ result.affected = raw.rowCount;
232
+ }
233
+ switch (raw.command) {
234
+ case "DELETE":
235
+ case "UPDATE":
236
+ // for UPDATE and DELETE query additionally return number of affected rows
237
+ result.raw = [raw.rows, raw.rowCount];
238
+ break;
239
+ default:
240
+ result.raw = raw.rows;
241
+ }
242
+ if (!useStructuredResult) {
243
+ return [2 /*return*/, result.raw];
244
+ }
242
245
  }
243
246
  return [2 /*return*/, result];
244
247
  case 4:
@@ -509,35 +512,35 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
509
512
  if (createForeignKeys === void 0) { createForeignKeys = true; }
510
513
  if (createIndices === void 0) { createIndices = true; }
511
514
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
512
- var isTableExist, upQueries, downQueries, enumColumns, createdEnumTypes, enumColumns_1, enumColumns_1_1, column, hasEnum, enumName, e_1_1;
513
- var e_1, _a;
515
+ 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;
516
+ var e_1, _a, e_2, _b;
514
517
  var _this = this;
515
- return (0, tslib_1.__generator)(this, function (_b) {
516
- switch (_b.label) {
518
+ return (0, tslib_1.__generator)(this, function (_c) {
519
+ switch (_c.label) {
517
520
  case 0:
518
521
  if (!ifNotExist) return [3 /*break*/, 2];
519
522
  return [4 /*yield*/, this.hasTable(table)];
520
523
  case 1:
521
- isTableExist = _b.sent();
524
+ isTableExist = _c.sent();
522
525
  if (isTableExist)
523
526
  return [2 /*return*/, Promise.resolve()];
524
- _b.label = 2;
527
+ _c.label = 2;
525
528
  case 2:
526
529
  upQueries = [];
527
530
  downQueries = [];
528
531
  enumColumns = table.columns.filter(function (column) { return column.type === "enum" || column.type === "simple-enum"; });
529
532
  createdEnumTypes = [];
530
- _b.label = 3;
533
+ _c.label = 3;
531
534
  case 3:
532
- _b.trys.push([3, 8, 9, 10]);
535
+ _c.trys.push([3, 8, 9, 10]);
533
536
  enumColumns_1 = (0, tslib_1.__values)(enumColumns), enumColumns_1_1 = enumColumns_1.next();
534
- _b.label = 4;
537
+ _c.label = 4;
535
538
  case 4:
536
539
  if (!!enumColumns_1_1.done) return [3 /*break*/, 7];
537
540
  column = enumColumns_1_1.value;
538
541
  return [4 /*yield*/, this.hasEnumType(table, column)];
539
542
  case 5:
540
- hasEnum = _b.sent();
543
+ hasEnum = _c.sent();
541
544
  enumName = this.buildEnumName(table, column);
542
545
  // if enum with the same "enumName" is defined more then once, me must prevent double creation
543
546
  if (!hasEnum && createdEnumTypes.indexOf(enumName) === -1) {
@@ -545,13 +548,13 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
545
548
  upQueries.push(this.createEnumTypeSql(table, column, enumName));
546
549
  downQueries.push(this.dropEnumTypeSql(table, column, enumName));
547
550
  }
548
- _b.label = 6;
551
+ _c.label = 6;
549
552
  case 6:
550
553
  enumColumns_1_1 = enumColumns_1.next();
551
554
  return [3 /*break*/, 4];
552
555
  case 7: return [3 /*break*/, 10];
553
556
  case 8:
554
- e_1_1 = _b.sent();
557
+ e_1_1 = _c.sent();
555
558
  e_1 = { error: e_1_1 };
556
559
  return [3 /*break*/, 10];
557
560
  case 9:
@@ -561,6 +564,54 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
561
564
  finally { if (e_1) throw e_1.error; }
562
565
  return [7 /*endfinally*/];
563
566
  case 10:
567
+ generatedColumns = table.columns.filter(function (column) { return column.generatedType === "STORED" && column.asExpression; });
568
+ _c.label = 11;
569
+ case 11:
570
+ _c.trys.push([11, 16, 17, 18]);
571
+ generatedColumns_1 = (0, tslib_1.__values)(generatedColumns), generatedColumns_1_1 = generatedColumns_1.next();
572
+ _c.label = 12;
573
+ case 12:
574
+ if (!!generatedColumns_1_1.done) return [3 /*break*/, 15];
575
+ column = generatedColumns_1_1.value;
576
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
577
+ case 13:
578
+ tableNameWithSchema = (_c.sent()).split('.');
579
+ tableName = tableNameWithSchema[1];
580
+ schema = tableNameWithSchema[0];
581
+ insertQuery = this.insertTypeormMetadataSql({
582
+ database: this.driver.database,
583
+ schema: schema,
584
+ table: tableName,
585
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
586
+ name: column.name,
587
+ value: column.asExpression
588
+ });
589
+ deleteQuery = this.deleteTypeormMetadataSql({
590
+ database: this.driver.database,
591
+ schema: schema,
592
+ table: tableName,
593
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
594
+ name: column.name
595
+ });
596
+ upQueries.push(deleteQuery);
597
+ upQueries.push(insertQuery);
598
+ downQueries.push(deleteQuery);
599
+ _c.label = 14;
600
+ case 14:
601
+ generatedColumns_1_1 = generatedColumns_1.next();
602
+ return [3 /*break*/, 12];
603
+ case 15: return [3 /*break*/, 18];
604
+ case 16:
605
+ e_2_1 = _c.sent();
606
+ e_2 = { error: e_2_1 };
607
+ return [3 /*break*/, 18];
608
+ case 17:
609
+ try {
610
+ if (generatedColumns_1_1 && !generatedColumns_1_1.done && (_b = generatedColumns_1.return)) _b.call(generatedColumns_1);
611
+ }
612
+ finally { if (e_2) throw e_2.error; }
613
+ return [7 /*endfinally*/];
614
+ case 18:
564
615
  upQueries.push(this.createTableSql(table, createForeignKeys));
565
616
  downQueries.push(this.dropTableSql(table));
566
617
  // if createForeignKeys is true, we must drop created foreign keys in down query.
@@ -577,8 +628,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
577
628
  });
578
629
  }
579
630
  return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
580
- case 11:
581
- _b.sent();
631
+ case 19:
632
+ _c.sent();
582
633
  return [2 /*return*/];
583
634
  }
584
635
  });
@@ -696,8 +747,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
696
747
  */
697
748
  PostgresQueryRunner.prototype.renameTable = function (oldTableOrName, newTableName) {
698
749
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
699
- var upQueries, downQueries, oldTable, _a, newTable, _b, schemaName, oldTableName, columnNames, oldPkName, newPkName, enumColumns, enumColumns_2, enumColumns_2_1, column, oldEnumType, e_2_1;
700
- var e_2, _c;
750
+ var upQueries, downQueries, oldTable, _a, newTable, _b, schemaName, oldTableName, columnNames, oldPkName, newPkName, enumColumns, enumColumns_2, enumColumns_2_1, column, oldEnumType, e_3_1;
751
+ var e_3, _c;
701
752
  var _this = this;
702
753
  return (0, tslib_1.__generator)(this, function (_d) {
703
754
  switch (_d.label) {
@@ -795,14 +846,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
795
846
  return [3 /*break*/, 5];
796
847
  case 8: return [3 /*break*/, 11];
797
848
  case 9:
798
- e_2_1 = _d.sent();
799
- e_2 = { error: e_2_1 };
849
+ e_3_1 = _d.sent();
850
+ e_3 = { error: e_3_1 };
800
851
  return [3 /*break*/, 11];
801
852
  case 10:
802
853
  try {
803
854
  if (enumColumns_2_1 && !enumColumns_2_1.done && (_c = enumColumns_2.return)) _c.call(enumColumns_2);
804
855
  }
805
- finally { if (e_2) throw e_2.error; }
856
+ finally { if (e_3) throw e_3.error; }
806
857
  return [7 /*endfinally*/];
807
858
  case 11: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
808
859
  case 12:
@@ -817,7 +868,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
817
868
  */
818
869
  PostgresQueryRunner.prototype.addColumn = function (tableOrName, column) {
819
870
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
820
- var table, _a, clonedTable, upQueries, downQueries, hasEnum, primaryColumns, pkName_1, columnNames_1, pkName, columnNames, columnIndex, uniqueConstraint;
871
+ var table, _a, clonedTable, upQueries, downQueries, hasEnum, primaryColumns, pkName_1, columnNames_1, pkName, columnNames, columnIndex, uniqueConstraint, tableNameWithSchema, tableName, schema, insertQuery, deleteQuery;
821
872
  return (0, tslib_1.__generator)(this, function (_b) {
822
873
  switch (_b.label) {
823
874
  case 0:
@@ -876,13 +927,39 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
876
927
  upQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " ADD CONSTRAINT \"" + uniqueConstraint.name + "\" UNIQUE (\"" + column.name + "\")"));
877
928
  downQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " DROP CONSTRAINT \"" + uniqueConstraint.name + "\""));
878
929
  }
930
+ if (!(column.generatedType === "STORED" && column.asExpression)) return [3 /*break*/, 7];
931
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
932
+ case 6:
933
+ tableNameWithSchema = (_b.sent()).split('.');
934
+ tableName = tableNameWithSchema[1];
935
+ schema = tableNameWithSchema[0];
936
+ insertQuery = this.insertTypeormMetadataSql({
937
+ database: this.driver.database,
938
+ schema: schema,
939
+ table: tableName,
940
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
941
+ name: column.name,
942
+ value: column.asExpression
943
+ });
944
+ deleteQuery = this.deleteTypeormMetadataSql({
945
+ database: this.driver.database,
946
+ schema: schema,
947
+ table: tableName,
948
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
949
+ name: column.name
950
+ });
951
+ upQueries.push(deleteQuery);
952
+ upQueries.push(insertQuery);
953
+ downQueries.push(deleteQuery);
954
+ _b.label = 7;
955
+ case 7:
879
956
  // create column's comment
880
957
  if (column.comment) {
881
958
  upQueries.push(new Query_1.Query("COMMENT ON COLUMN " + this.escapePath(table) + ".\"" + column.name + "\" IS " + this.escapeComment(column.comment)));
882
959
  downQueries.push(new Query_1.Query("COMMENT ON COLUMN " + this.escapePath(table) + ".\"" + column.name + "\" IS " + this.escapeComment(column.comment)));
883
960
  }
884
961
  return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
885
- case 6:
962
+ case 8:
886
963
  _b.sent();
887
964
  clonedTable.addColumn(column);
888
965
  this.replaceCachedTable(table, clonedTable);
@@ -896,8 +973,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
896
973
  */
897
974
  PostgresQueryRunner.prototype.addColumns = function (tableOrName, columns) {
898
975
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
899
- var columns_1, columns_1_1, column, e_3_1;
900
- var e_3, _a;
976
+ var columns_1, columns_1_1, column, e_4_1;
977
+ var e_4, _a;
901
978
  return (0, tslib_1.__generator)(this, function (_b) {
902
979
  switch (_b.label) {
903
980
  case 0:
@@ -916,14 +993,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
916
993
  return [3 /*break*/, 1];
917
994
  case 4: return [3 /*break*/, 7];
918
995
  case 5:
919
- e_3_1 = _b.sent();
920
- e_3 = { error: e_3_1 };
996
+ e_4_1 = _b.sent();
997
+ e_4 = { error: e_4_1 };
921
998
  return [3 /*break*/, 7];
922
999
  case 6:
923
1000
  try {
924
1001
  if (columns_1_1 && !columns_1_1.done && (_a = columns_1.return)) _a.call(columns_1);
925
1002
  }
926
- finally { if (e_3) throw e_3.error; }
1003
+ finally { if (e_4) throw e_4.error; }
927
1004
  return [7 /*endfinally*/];
928
1005
  case 7: return [2 /*return*/];
929
1006
  }
@@ -968,7 +1045,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
968
1045
  */
969
1046
  PostgresQueryRunner.prototype.changeColumn = function (tableOrName, oldTableColumnOrName, newColumn) {
970
1047
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
971
- 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;
1048
+ 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;
972
1049
  var _this = this;
973
1050
  return (0, tslib_1.__generator)(this, function (_b) {
974
1051
  switch (_b.label) {
@@ -991,7 +1068,11 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
991
1068
  : table.columns.find(function (column) { return column.name === oldTableColumnOrName; });
992
1069
  if (!oldColumn)
993
1070
  throw new error_1.TypeORMError("Column \"" + oldTableColumnOrName + "\" was not found in the \"" + table.name + "\" table.");
994
- if (!(oldColumn.type !== newColumn.type || oldColumn.length !== newColumn.length || newColumn.isArray !== oldColumn.isArray)) return [3 /*break*/, 6];
1071
+ if (!(oldColumn.type !== newColumn.type
1072
+ || oldColumn.length !== newColumn.length
1073
+ || newColumn.isArray !== oldColumn.isArray
1074
+ || (!oldColumn.generatedType && newColumn.generatedType === "STORED")
1075
+ || (oldColumn.asExpression !== newColumn.asExpression && newColumn.generatedType === "STORED"))) return [3 /*break*/, 6];
995
1076
  // To avoid data conversion, we just recreate column
996
1077
  return [4 /*yield*/, this.dropColumn(table, oldColumn)];
997
1078
  case 4:
@@ -1002,7 +1083,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1002
1083
  _b.sent();
1003
1084
  // update cloned table
1004
1085
  clonedTable = table.clone();
1005
- return [3 /*break*/, 10];
1086
+ return [3 /*break*/, 11];
1006
1087
  case 6:
1007
1088
  if (!(oldColumn.name !== newColumn.name)) return [3 /*break*/, 9];
1008
1089
  // rename column
@@ -1224,9 +1305,45 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1224
1305
  upQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " ALTER COLUMN \"" + newColumn.name + "\" TYPE " + this.driver.createFullType(newColumn)));
1225
1306
  downQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " ALTER COLUMN \"" + newColumn.name + "\" TYPE " + this.driver.createFullType(oldColumn)));
1226
1307
  }
1227
- _b.label = 10;
1228
- case 10: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1229
- case 11:
1308
+ if (!(newColumn.generatedType !== oldColumn.generatedType)) return [3 /*break*/, 11];
1309
+ if (!(!newColumn.generatedType || newColumn.generatedType === "VIRTUAL")) return [3 /*break*/, 11];
1310
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
1311
+ case 10:
1312
+ tableNameWithSchema = (_b.sent()).split('.');
1313
+ tableName = tableNameWithSchema[1];
1314
+ schema = tableNameWithSchema[0];
1315
+ upQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " RENAME COLUMN \"" + oldColumn.name + "\" TO \"TEMP_OLD_" + oldColumn.name + "\""));
1316
+ upQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " ADD " + this.buildCreateColumnSql(table, newColumn)));
1317
+ upQueries.push(new Query_1.Query("UPDATE " + this.escapePath(table) + " SET \"" + newColumn.name + "\" = \"TEMP_OLD_" + oldColumn.name + "\""));
1318
+ upQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " DROP COLUMN \"TEMP_OLD_" + oldColumn.name + "\""));
1319
+ upQueries.push(this.deleteTypeormMetadataSql({
1320
+ database: this.driver.database,
1321
+ schema: schema,
1322
+ table: tableName,
1323
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1324
+ name: oldColumn.name
1325
+ }));
1326
+ // However, we can't copy it back on downgrade. It needs to regenerate.
1327
+ downQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " DROP COLUMN \"" + newColumn.name + "\""));
1328
+ downQueries.push(new Query_1.Query("ALTER TABLE " + this.escapePath(table) + " ADD " + this.buildCreateColumnSql(table, oldColumn)));
1329
+ downQueries.push(this.deleteTypeormMetadataSql({
1330
+ database: this.driver.database,
1331
+ schema: schema,
1332
+ table: tableName,
1333
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1334
+ name: newColumn.name
1335
+ }));
1336
+ downQueries.push(this.insertTypeormMetadataSql({
1337
+ database: this.driver.database,
1338
+ schema: schema,
1339
+ table: tableName,
1340
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1341
+ name: oldColumn.name,
1342
+ value: oldColumn.asExpression
1343
+ }));
1344
+ _b.label = 11;
1345
+ case 11: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1346
+ case 12:
1230
1347
  _b.sent();
1231
1348
  this.replaceCachedTable(table, clonedTable);
1232
1349
  return [2 /*return*/];
@@ -1239,8 +1356,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1239
1356
  */
1240
1357
  PostgresQueryRunner.prototype.changeColumns = function (tableOrName, changedColumns) {
1241
1358
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1242
- var changedColumns_1, changedColumns_1_1, _a, oldColumn, newColumn, e_4_1;
1243
- var e_4, _b;
1359
+ var changedColumns_1, changedColumns_1_1, _a, oldColumn, newColumn, e_5_1;
1360
+ var e_5, _b;
1244
1361
  return (0, tslib_1.__generator)(this, function (_c) {
1245
1362
  switch (_c.label) {
1246
1363
  case 0:
@@ -1259,14 +1376,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1259
1376
  return [3 /*break*/, 1];
1260
1377
  case 4: return [3 /*break*/, 7];
1261
1378
  case 5:
1262
- e_4_1 = _c.sent();
1263
- e_4 = { error: e_4_1 };
1379
+ e_5_1 = _c.sent();
1380
+ e_5 = { error: e_5_1 };
1264
1381
  return [3 /*break*/, 7];
1265
1382
  case 6:
1266
1383
  try {
1267
1384
  if (changedColumns_1_1 && !changedColumns_1_1.done && (_b = changedColumns_1.return)) _b.call(changedColumns_1);
1268
1385
  }
1269
- finally { if (e_4) throw e_4.error; }
1386
+ finally { if (e_5) throw e_5.error; }
1270
1387
  return [7 /*endfinally*/];
1271
1388
  case 7: return [2 /*return*/];
1272
1389
  }
@@ -1278,7 +1395,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1278
1395
  */
1279
1396
  PostgresQueryRunner.prototype.dropColumn = function (tableOrName, columnOrName) {
1280
1397
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1281
- var table, _a, column, clonedTable, upQueries, downQueries, pkName, columnNames, tableColumn, pkName_2, columnNames_2, columnIndex, columnCheck, columnUnique, hasEnum, enumType, escapedEnumName;
1398
+ 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;
1282
1399
  return (0, tslib_1.__generator)(this, function (_b) {
1283
1400
  switch (_b.label) {
1284
1401
  case 0:
@@ -1345,8 +1462,33 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1345
1462
  upQueries.push(this.dropEnumTypeSql(table, column, escapedEnumName));
1346
1463
  downQueries.push(this.createEnumTypeSql(table, column, escapedEnumName));
1347
1464
  _b.label = 6;
1348
- case 6: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1465
+ case 6:
1466
+ if (!(column.generatedType === "STORED")) return [3 /*break*/, 8];
1467
+ return [4 /*yield*/, this.getTableNameWithSchema(table.name)];
1349
1468
  case 7:
1469
+ tableNameWithSchema = (_b.sent()).split('.');
1470
+ tableName = tableNameWithSchema[1];
1471
+ schema = tableNameWithSchema[0];
1472
+ insertQuery = this.deleteTypeormMetadataSql({
1473
+ database: this.driver.database,
1474
+ schema: schema,
1475
+ table: tableName,
1476
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1477
+ name: column.name
1478
+ });
1479
+ deleteQuery = this.insertTypeormMetadataSql({
1480
+ database: this.driver.database,
1481
+ schema: schema,
1482
+ table: tableName,
1483
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1484
+ name: column.name,
1485
+ value: column.asExpression
1486
+ });
1487
+ upQueries.push(insertQuery);
1488
+ downQueries.push(deleteQuery);
1489
+ _b.label = 8;
1490
+ case 8: return [4 /*yield*/, this.executeQueries(upQueries, downQueries)];
1491
+ case 9:
1350
1492
  _b.sent();
1351
1493
  clonedTable.removeColumn(column);
1352
1494
  this.replaceCachedTable(table, clonedTable);
@@ -1360,8 +1502,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1360
1502
  */
1361
1503
  PostgresQueryRunner.prototype.dropColumns = function (tableOrName, columns) {
1362
1504
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1363
- var columns_2, columns_2_1, column, e_5_1;
1364
- var e_5, _a;
1505
+ var columns_2, columns_2_1, column, e_6_1;
1506
+ var e_6, _a;
1365
1507
  return (0, tslib_1.__generator)(this, function (_b) {
1366
1508
  switch (_b.label) {
1367
1509
  case 0:
@@ -1380,14 +1522,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1380
1522
  return [3 /*break*/, 1];
1381
1523
  case 4: return [3 /*break*/, 7];
1382
1524
  case 5:
1383
- e_5_1 = _b.sent();
1384
- e_5 = { error: e_5_1 };
1525
+ e_6_1 = _b.sent();
1526
+ e_6 = { error: e_6_1 };
1385
1527
  return [3 /*break*/, 7];
1386
1528
  case 6:
1387
1529
  try {
1388
1530
  if (columns_2_1 && !columns_2_1.done && (_a = columns_2.return)) _a.call(columns_2);
1389
1531
  }
1390
- finally { if (e_5) throw e_5.error; }
1532
+ finally { if (e_6) throw e_6.error; }
1391
1533
  return [7 /*endfinally*/];
1392
1534
  case 7: return [2 /*return*/];
1393
1535
  }
@@ -1543,8 +1685,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1543
1685
  */
1544
1686
  PostgresQueryRunner.prototype.createUniqueConstraints = function (tableOrName, uniqueConstraints) {
1545
1687
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1546
- var uniqueConstraints_1, uniqueConstraints_1_1, uniqueConstraint, e_6_1;
1547
- var e_6, _a;
1688
+ var uniqueConstraints_1, uniqueConstraints_1_1, uniqueConstraint, e_7_1;
1689
+ var e_7, _a;
1548
1690
  return (0, tslib_1.__generator)(this, function (_b) {
1549
1691
  switch (_b.label) {
1550
1692
  case 0:
@@ -1563,14 +1705,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1563
1705
  return [3 /*break*/, 1];
1564
1706
  case 4: return [3 /*break*/, 7];
1565
1707
  case 5:
1566
- e_6_1 = _b.sent();
1567
- e_6 = { error: e_6_1 };
1708
+ e_7_1 = _b.sent();
1709
+ e_7 = { error: e_7_1 };
1568
1710
  return [3 /*break*/, 7];
1569
1711
  case 6:
1570
1712
  try {
1571
1713
  if (uniqueConstraints_1_1 && !uniqueConstraints_1_1.done && (_a = uniqueConstraints_1.return)) _a.call(uniqueConstraints_1);
1572
1714
  }
1573
- finally { if (e_6) throw e_6.error; }
1715
+ finally { if (e_7) throw e_7.error; }
1574
1716
  return [7 /*endfinally*/];
1575
1717
  case 7: return [2 /*return*/];
1576
1718
  }
@@ -1614,8 +1756,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1614
1756
  */
1615
1757
  PostgresQueryRunner.prototype.dropUniqueConstraints = function (tableOrName, uniqueConstraints) {
1616
1758
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1617
- var uniqueConstraints_2, uniqueConstraints_2_1, uniqueConstraint, e_7_1;
1618
- var e_7, _a;
1759
+ var uniqueConstraints_2, uniqueConstraints_2_1, uniqueConstraint, e_8_1;
1760
+ var e_8, _a;
1619
1761
  return (0, tslib_1.__generator)(this, function (_b) {
1620
1762
  switch (_b.label) {
1621
1763
  case 0:
@@ -1634,14 +1776,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1634
1776
  return [3 /*break*/, 1];
1635
1777
  case 4: return [3 /*break*/, 7];
1636
1778
  case 5:
1637
- e_7_1 = _b.sent();
1638
- e_7 = { error: e_7_1 };
1779
+ e_8_1 = _b.sent();
1780
+ e_8 = { error: e_8_1 };
1639
1781
  return [3 /*break*/, 7];
1640
1782
  case 6:
1641
1783
  try {
1642
1784
  if (uniqueConstraints_2_1 && !uniqueConstraints_2_1.done && (_a = uniqueConstraints_2.return)) _a.call(uniqueConstraints_2);
1643
1785
  }
1644
- finally { if (e_7) throw e_7.error; }
1786
+ finally { if (e_8) throw e_8.error; }
1645
1787
  return [7 /*endfinally*/];
1646
1788
  case 7: return [2 /*return*/];
1647
1789
  }
@@ -1889,8 +2031,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1889
2031
  */
1890
2032
  PostgresQueryRunner.prototype.createForeignKeys = function (tableOrName, foreignKeys) {
1891
2033
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1892
- var foreignKeys_1, foreignKeys_1_1, foreignKey, e_8_1;
1893
- var e_8, _a;
2034
+ var foreignKeys_1, foreignKeys_1_1, foreignKey, e_9_1;
2035
+ var e_9, _a;
1894
2036
  return (0, tslib_1.__generator)(this, function (_b) {
1895
2037
  switch (_b.label) {
1896
2038
  case 0:
@@ -1909,14 +2051,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1909
2051
  return [3 /*break*/, 1];
1910
2052
  case 4: return [3 /*break*/, 7];
1911
2053
  case 5:
1912
- e_8_1 = _b.sent();
1913
- e_8 = { error: e_8_1 };
2054
+ e_9_1 = _b.sent();
2055
+ e_9 = { error: e_9_1 };
1914
2056
  return [3 /*break*/, 7];
1915
2057
  case 6:
1916
2058
  try {
1917
2059
  if (foreignKeys_1_1 && !foreignKeys_1_1.done && (_a = foreignKeys_1.return)) _a.call(foreignKeys_1);
1918
2060
  }
1919
- finally { if (e_8) throw e_8.error; }
2061
+ finally { if (e_9) throw e_9.error; }
1920
2062
  return [7 /*endfinally*/];
1921
2063
  case 7: return [2 /*return*/];
1922
2064
  }
@@ -1960,8 +2102,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1960
2102
  */
1961
2103
  PostgresQueryRunner.prototype.dropForeignKeys = function (tableOrName, foreignKeys) {
1962
2104
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
1963
- var foreignKeys_2, foreignKeys_2_1, foreignKey, e_9_1;
1964
- var e_9, _a;
2105
+ var foreignKeys_2, foreignKeys_2_1, foreignKey, e_10_1;
2106
+ var e_10, _a;
1965
2107
  return (0, tslib_1.__generator)(this, function (_b) {
1966
2108
  switch (_b.label) {
1967
2109
  case 0:
@@ -1980,14 +2122,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
1980
2122
  return [3 /*break*/, 1];
1981
2123
  case 4: return [3 /*break*/, 7];
1982
2124
  case 5:
1983
- e_9_1 = _b.sent();
1984
- e_9 = { error: e_9_1 };
2125
+ e_10_1 = _b.sent();
2126
+ e_10 = { error: e_10_1 };
1985
2127
  return [3 /*break*/, 7];
1986
2128
  case 6:
1987
2129
  try {
1988
2130
  if (foreignKeys_2_1 && !foreignKeys_2_1.done && (_a = foreignKeys_2.return)) _a.call(foreignKeys_2);
1989
2131
  }
1990
- finally { if (e_9) throw e_9.error; }
2132
+ finally { if (e_10) throw e_10.error; }
1991
2133
  return [7 /*endfinally*/];
1992
2134
  case 7: return [2 /*return*/];
1993
2135
  }
@@ -2031,8 +2173,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2031
2173
  */
2032
2174
  PostgresQueryRunner.prototype.createIndices = function (tableOrName, indices) {
2033
2175
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
2034
- var indices_1, indices_1_1, index, e_10_1;
2035
- var e_10, _a;
2176
+ var indices_1, indices_1_1, index, e_11_1;
2177
+ var e_11, _a;
2036
2178
  return (0, tslib_1.__generator)(this, function (_b) {
2037
2179
  switch (_b.label) {
2038
2180
  case 0:
@@ -2051,14 +2193,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2051
2193
  return [3 /*break*/, 1];
2052
2194
  case 4: return [3 /*break*/, 7];
2053
2195
  case 5:
2054
- e_10_1 = _b.sent();
2055
- e_10 = { error: e_10_1 };
2196
+ e_11_1 = _b.sent();
2197
+ e_11 = { error: e_11_1 };
2056
2198
  return [3 /*break*/, 7];
2057
2199
  case 6:
2058
2200
  try {
2059
2201
  if (indices_1_1 && !indices_1_1.done && (_a = indices_1.return)) _a.call(indices_1);
2060
2202
  }
2061
- finally { if (e_10) throw e_10.error; }
2203
+ finally { if (e_11) throw e_11.error; }
2062
2204
  return [7 /*endfinally*/];
2063
2205
  case 7: return [2 /*return*/];
2064
2206
  }
@@ -2102,8 +2244,8 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2102
2244
  */
2103
2245
  PostgresQueryRunner.prototype.dropIndices = function (tableOrName, indices) {
2104
2246
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
2105
- var indices_2, indices_2_1, index, e_11_1;
2106
- var e_11, _a;
2247
+ var indices_2, indices_2_1, index, e_12_1;
2248
+ var e_12, _a;
2107
2249
  return (0, tslib_1.__generator)(this, function (_b) {
2108
2250
  switch (_b.label) {
2109
2251
  case 0:
@@ -2122,14 +2264,14 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2122
2264
  return [3 /*break*/, 1];
2123
2265
  case 4: return [3 /*break*/, 7];
2124
2266
  case 5:
2125
- e_11_1 = _b.sent();
2126
- e_11 = { error: e_11_1 };
2267
+ e_12_1 = _b.sent();
2268
+ e_12 = { error: e_12_1 };
2127
2269
  return [3 /*break*/, 7];
2128
2270
  case 6:
2129
2271
  try {
2130
2272
  if (indices_2_1 && !indices_2_1.done && (_a = indices_2.return)) _a.call(indices_2);
2131
2273
  }
2132
- finally { if (e_11) throw e_11.error; }
2274
+ finally { if (e_12) throw e_12.error; }
2133
2275
  return [7 /*endfinally*/];
2134
2276
  case 7: return [2 /*return*/];
2135
2277
  }
@@ -2273,7 +2415,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2273
2415
  query = "SELECT \"t\".* FROM " + this.escapePath(this.getTypeormMetadataTableName()) + " \"t\" " +
2274
2416
  "INNER JOIN \"pg_catalog\".\"pg_class\" \"c\" ON \"c\".\"relname\" = \"t\".\"name\" " +
2275
2417
  "INNER JOIN \"pg_namespace\" \"n\" ON \"n\".\"oid\" = \"c\".\"relnamespace\" AND \"n\".\"nspname\" = \"t\".\"schema\" " +
2276
- ("WHERE \"t\".\"type\" IN ('VIEW', 'MATERIALIZED_VIEW') " + (viewsCondition ? "AND (" + viewsCondition + ")" : ""));
2418
+ ("WHERE \"t\".\"type\" IN ('" + MetadataTableType_1.MetadataTableType.VIEW + "', '" + MetadataTableType_1.MetadataTableType.MATERIALIZED_VIEW + "') " + (viewsCondition ? "AND (" + viewsCondition + ")" : ""));
2277
2419
  return [4 /*yield*/, this.query(query)];
2278
2420
  case 4:
2279
2421
  dbViews = _a.sent();
@@ -2284,7 +2426,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2284
2426
  view.schema = dbView["schema"];
2285
2427
  view.name = _this.driver.buildTableName(dbView["name"], schema);
2286
2428
  view.expression = dbView["value"];
2287
- view.materialized = dbView["type"] === "MATERIALIZED_VIEW";
2429
+ view.materialized = dbView["type"] === MetadataTableType_1.MetadataTableType.MATERIALIZED_VIEW;
2288
2430
  return view;
2289
2431
  })];
2290
2432
  }
@@ -2435,7 +2577,7 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2435
2577
  return [4 /*yield*/, Promise.all(dbColumns
2436
2578
  .filter(function (dbColumn) { return (dbColumn["table_name"] === dbTable["table_name"] && dbColumn["table_schema"] === dbTable["table_schema"]); })
2437
2579
  .map(function (dbColumn) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
2438
- var columnConstraints, tableColumn, name, builtEnumName, enumName, sql, results, type, geometryColumnSql, results, geographyColumnSql, results, length, match, uniqueConstraint, isConstraintComposite, serialDefaultName, serialDefaultPath, defaultWithoutQuotes;
2580
+ var columnConstraints, tableColumn, name, builtEnumName, enumName, sql, results, type, geometryColumnSql, results, geographyColumnSql, results, length, match, uniqueConstraints, isConstraintComposite, serialDefaultName, serialDefaultPath, defaultWithoutQuotes, asExpressionQuery, results;
2439
2581
  return (0, tslib_1.__generator)(this, function (_a) {
2440
2582
  switch (_a.label) {
2441
2583
  case 0:
@@ -2535,13 +2677,13 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2535
2677
  }
2536
2678
  tableColumn.isNullable = dbColumn["is_nullable"] === "YES";
2537
2679
  tableColumn.isPrimary = !!columnConstraints.find(function (constraint) { return constraint["constraint_type"] === "PRIMARY"; });
2538
- uniqueConstraint = columnConstraints.find(function (constraint) { return constraint["constraint_type"] === "UNIQUE"; });
2539
- isConstraintComposite = uniqueConstraint
2540
- ? !!dbConstraints.find(function (dbConstraint) { return dbConstraint["constraint_type"] === "UNIQUE"
2680
+ uniqueConstraints = columnConstraints.filter(function (constraint) { return constraint["constraint_type"] === "UNIQUE"; });
2681
+ isConstraintComposite = uniqueConstraints.every(function (uniqueConstraint) {
2682
+ return dbConstraints.some(function (dbConstraint) { return dbConstraint["constraint_type"] === "UNIQUE"
2541
2683
  && dbConstraint["constraint_name"] === uniqueConstraint["constraint_name"]
2542
- && dbConstraint["column_name"] !== dbColumn["column_name"]; })
2543
- : false;
2544
- tableColumn.isUnique = !!uniqueConstraint && !isConstraintComposite;
2684
+ && dbConstraint["column_name"] !== dbColumn["column_name"]; });
2685
+ });
2686
+ tableColumn.isUnique = uniqueConstraints.length > 0 && !isConstraintComposite;
2545
2687
  if (dbColumn.is_identity === "YES") { // Postgres 10+ Identity column
2546
2688
  tableColumn.isGenerated = true;
2547
2689
  tableColumn.generationStrategy = "identity";
@@ -2562,10 +2704,30 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2562
2704
  tableColumn.default = dbColumn["column_default"];
2563
2705
  }
2564
2706
  else {
2565
- tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\[\]\"]+/g, "");
2707
+ tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\.\[\]\"]+/g, "");
2566
2708
  tableColumn.default = tableColumn.default.replace(/^(-?\d+)$/, "'$1'");
2567
2709
  }
2568
2710
  }
2711
+ if (!(dbColumn["is_generated"] === "ALWAYS" && dbColumn["generation_expression"])) return [3 /*break*/, 9];
2712
+ // In postgres there is no VIRTUAL generated column type
2713
+ tableColumn.generatedType = "STORED";
2714
+ asExpressionQuery = "SELECT * FROM \"typeorm_metadata\" "
2715
+ + (" WHERE \"table\" = '" + dbTable["table_name"] + "'")
2716
+ + (" AND \"name\" = '" + tableColumn.name + "'")
2717
+ + (" AND \"schema\" = '" + dbTable["table_schema"] + "'")
2718
+ + (" AND \"database\" = '" + this.driver.database + "'")
2719
+ + (" AND \"type\" = '" + MetadataTableType_1.MetadataTableType.GENERATED_COLUMN + "'");
2720
+ return [4 /*yield*/, this.query(asExpressionQuery)];
2721
+ case 8:
2722
+ results = _a.sent();
2723
+ if (results[0] && results[0].value) {
2724
+ tableColumn.asExpression = results[0].value;
2725
+ }
2726
+ else {
2727
+ tableColumn.asExpression = "";
2728
+ }
2729
+ _a.label = 9;
2730
+ case 9:
2569
2731
  tableColumn.comment = dbColumn["description"] ? dbColumn["description"] : undefined;
2570
2732
  if (dbColumn["character_set_name"])
2571
2733
  tableColumn.charset = dbColumn["character_set_name"];
@@ -2763,24 +2925,19 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2763
2925
  };
2764
2926
  PostgresQueryRunner.prototype.insertViewDefinitionSql = function (view) {
2765
2927
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
2766
- var currentSchema, _a, schema, name, type, expression, _b, query, parameters;
2767
- return (0, tslib_1.__generator)(this, function (_c) {
2768
- switch (_c.label) {
2928
+ var currentSchema, _a, schema, name, type, expression;
2929
+ return (0, tslib_1.__generator)(this, function (_b) {
2930
+ switch (_b.label) {
2769
2931
  case 0: return [4 /*yield*/, this.getCurrentSchema()];
2770
2932
  case 1:
2771
- currentSchema = _c.sent();
2933
+ currentSchema = _b.sent();
2772
2934
  _a = this.driver.parseTableName(view), schema = _a.schema, name = _a.tableName;
2773
2935
  if (!schema) {
2774
2936
  schema = currentSchema;
2775
2937
  }
2776
- type = view.materialized ? "MATERIALIZED_VIEW" : "VIEW";
2938
+ type = view.materialized ? MetadataTableType_1.MetadataTableType.MATERIALIZED_VIEW : MetadataTableType_1.MetadataTableType.VIEW;
2777
2939
  expression = typeof view.expression === "string" ? view.expression.trim() : view.expression(this.connection).getQuery();
2778
- _b = (0, tslib_1.__read)(this.connection.createQueryBuilder()
2779
- .insert()
2780
- .into(this.getTypeormMetadataTableName())
2781
- .values({ type: type, schema: schema, name: name, value: expression })
2782
- .getQueryAndParameters(), 2), query = _b[0], parameters = _b[1];
2783
- return [2 /*return*/, new Query_1.Query(query, parameters)];
2940
+ return [2 /*return*/, this.insertTypeormMetadataSql({ type: type, schema: schema, name: name, value: expression })];
2784
2941
  }
2785
2942
  });
2786
2943
  });
@@ -2797,25 +2954,18 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
2797
2954
  */
2798
2955
  PostgresQueryRunner.prototype.deleteViewDefinitionSql = function (view) {
2799
2956
  return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
2800
- var currentSchema, _a, schema, name, type, qb, _b, query, parameters;
2801
- return (0, tslib_1.__generator)(this, function (_c) {
2802
- switch (_c.label) {
2957
+ var currentSchema, _a, schema, name, type;
2958
+ return (0, tslib_1.__generator)(this, function (_b) {
2959
+ switch (_b.label) {
2803
2960
  case 0: return [4 /*yield*/, this.getCurrentSchema()];
2804
2961
  case 1:
2805
- currentSchema = _c.sent();
2962
+ currentSchema = _b.sent();
2806
2963
  _a = this.driver.parseTableName(view), schema = _a.schema, name = _a.tableName;
2807
2964
  if (!schema) {
2808
2965
  schema = currentSchema;
2809
2966
  }
2810
- type = view.materialized ? "MATERIALIZED_VIEW" : "VIEW";
2811
- qb = this.connection.createQueryBuilder();
2812
- _b = (0, tslib_1.__read)(qb.delete()
2813
- .from(this.getTypeormMetadataTableName())
2814
- .where(qb.escape("type") + " = :type", { type: type })
2815
- .andWhere(qb.escape("schema") + " = :schema", { schema: schema })
2816
- .andWhere(qb.escape("name") + " = :name", { name: name })
2817
- .getQueryAndParameters(), 2), query = _b[0], parameters = _b[1];
2818
- return [2 /*return*/, new Query_1.Query(query, parameters)];
2967
+ type = view.materialized ? MetadataTableType_1.MetadataTableType.MATERIALIZED_VIEW : MetadataTableType_1.MetadataTableType.VIEW;
2968
+ return [2 /*return*/, this.deleteTypeormMetadataSql({ type: type, schema: schema, name: name })];
2819
2969
  }
2820
2970
  });
2821
2971
  });
@@ -3066,6 +3216,28 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
3066
3216
  }
3067
3217
  return "\"" + tableName + "\"";
3068
3218
  };
3219
+ /**
3220
+ * Get the table name with table schema
3221
+ * Note: Without ' or "
3222
+ */
3223
+ PostgresQueryRunner.prototype.getTableNameWithSchema = function (target) {
3224
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
3225
+ var tableName, schemaResult, schema;
3226
+ return (0, tslib_1.__generator)(this, function (_a) {
3227
+ switch (_a.label) {
3228
+ case 0:
3229
+ tableName = target instanceof Table_1.Table ? target.name : target;
3230
+ if (!(tableName.indexOf(".") === -1)) return [3 /*break*/, 2];
3231
+ return [4 /*yield*/, this.query("SELECT current_schema()")];
3232
+ case 1:
3233
+ schemaResult = _a.sent();
3234
+ schema = schemaResult[0]["current_schema"];
3235
+ return [2 /*return*/, schema + "." + tableName];
3236
+ case 2: return [2 /*return*/, tableName.split(".")[0] + "." + tableName.split(".")[1]];
3237
+ }
3238
+ });
3239
+ });
3240
+ };
3069
3241
  /**
3070
3242
  * Builds a query for create column.
3071
3243
  */
@@ -3092,16 +3264,23 @@ var PostgresQueryRunner = /** @class */ (function (_super) {
3092
3264
  else if (!column.isGenerated || column.type === "uuid") {
3093
3265
  c += " " + this.connection.driver.createFullType(column);
3094
3266
  }
3095
- if (column.charset)
3096
- c += " CHARACTER SET \"" + column.charset + "\"";
3097
- if (column.collation)
3098
- c += " COLLATE \"" + column.collation + "\"";
3099
- if (column.isNullable !== true)
3100
- c += " NOT NULL";
3101
- if (column.default !== undefined && column.default !== null)
3102
- c += " DEFAULT " + column.default;
3103
- if (column.isGenerated && column.generationStrategy === "uuid" && !column.default)
3104
- c += " DEFAULT " + this.driver.uuidGenerator;
3267
+ // CHARACTER SET, COLLATE, NOT NULL and DEFAULT do not exist on generated (virtual) columns
3268
+ // Also, postgres only supports the stored generated column type
3269
+ if (column.generatedType === "STORED" && column.asExpression) {
3270
+ c += " GENERATED ALWAYS AS (" + column.asExpression + ") STORED";
3271
+ }
3272
+ else {
3273
+ if (column.charset)
3274
+ c += " CHARACTER SET \"" + column.charset + "\"";
3275
+ if (column.collation)
3276
+ c += " COLLATE \"" + column.collation + "\"";
3277
+ if (column.isNullable !== true)
3278
+ c += " NOT NULL";
3279
+ if (column.default !== undefined && column.default !== null)
3280
+ c += " DEFAULT " + column.default;
3281
+ if (column.isGenerated && column.generationStrategy === "uuid" && !column.default)
3282
+ c += " DEFAULT " + this.driver.uuidGenerator;
3283
+ }
3105
3284
  return c;
3106
3285
  };
3107
3286
  /**