typeorm 0.3.5 → 0.3.6-dev.2d8afbe

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 (235) hide show
  1. package/README.md +33 -13
  2. package/browser/cache/DbQueryResultCache.js +9 -1
  3. package/browser/cache/DbQueryResultCache.js.map +1 -1
  4. package/browser/cache/RedisQueryResultCache.js +3 -0
  5. package/browser/cache/RedisQueryResultCache.js.map +1 -1
  6. package/browser/cli-ts-node-commonjs.js +0 -0
  7. package/browser/cli-ts-node-esm.js +0 -0
  8. package/browser/data-source/BaseDataSourceOptions.d.ts +1 -2
  9. package/browser/data-source/BaseDataSourceOptions.js.map +1 -1
  10. package/browser/data-source/DataSourceOptions.d.ts +2 -1
  11. package/browser/data-source/DataSourceOptions.js.map +1 -1
  12. package/browser/decorator/Index.js +1 -0
  13. package/browser/decorator/Index.js.map +1 -1
  14. package/browser/decorator/columns/PrimaryColumn.js +4 -1
  15. package/browser/decorator/columns/PrimaryColumn.js.map +1 -1
  16. package/browser/decorator/options/ColumnOptions.d.ts +3 -2
  17. package/browser/decorator/options/ColumnOptions.js.map +1 -1
  18. package/browser/decorator/options/IndexOptions.d.ts +8 -0
  19. package/browser/decorator/options/IndexOptions.js.map +1 -1
  20. package/browser/driver/DriverFactory.js +4 -0
  21. package/browser/driver/DriverFactory.js.map +1 -1
  22. package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
  23. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  24. package/browser/driver/cockroachdb/CockroachQueryRunner.js +133 -11
  25. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  26. package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
  27. package/browser/driver/mysql/MysqlDriver.js +94 -23
  28. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  29. package/browser/driver/mysql/MysqlQueryRunner.js +203 -24
  30. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  31. package/browser/driver/oracle/OracleDriver.js +79 -15
  32. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  33. package/browser/driver/oracle/OracleQueryRunner.js +118 -21
  34. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  35. package/browser/driver/postgres/PostgresDriver.js +95 -18
  36. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  37. package/browser/driver/postgres/PostgresQueryRunner.js +60 -38
  38. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  39. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  40. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js +3 -0
  41. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  42. package/browser/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  43. package/browser/driver/spanner/SpannerConnectionOptions.js +3 -0
  44. package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  45. package/browser/driver/spanner/SpannerDriver.d.ts +241 -0
  46. package/browser/driver/spanner/SpannerDriver.js +604 -0
  47. package/browser/driver/spanner/SpannerDriver.js.map +1 -0
  48. package/browser/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  49. package/browser/driver/spanner/SpannerQueryRunner.js +1445 -0
  50. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -0
  51. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
  52. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  53. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
  54. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  55. package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  56. package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
  57. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  58. package/browser/driver/sqlserver/SqlServerQueryRunner.js +153 -17
  59. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  60. package/browser/driver/types/ColumnTypes.d.ts +1 -1
  61. package/browser/driver/types/ColumnTypes.js.map +1 -1
  62. package/browser/driver/types/DatabaseType.d.ts +1 -1
  63. package/browser/driver/types/DatabaseType.js.map +1 -1
  64. package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  65. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  66. package/browser/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  67. package/browser/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  68. package/browser/entity-schema/EntitySchemaTransformer.js +1 -0
  69. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  70. package/browser/find-options/FindOneOptions.d.ts +1 -1
  71. package/browser/find-options/FindOneOptions.js.map +1 -1
  72. package/browser/find-options/FindOptionsUtils.d.ts +2 -1
  73. package/browser/find-options/FindOptionsUtils.js +2 -1
  74. package/browser/find-options/FindOptionsUtils.js.map +1 -1
  75. package/browser/logger/AdvancedConsoleLogger.d.ts +1 -1
  76. package/browser/logger/AdvancedConsoleLogger.js +1 -1
  77. package/browser/logger/AdvancedConsoleLogger.js.map +1 -1
  78. package/browser/metadata/ColumnMetadata.d.ts +2 -2
  79. package/browser/metadata/ColumnMetadata.js.map +1 -1
  80. package/browser/metadata/IndexMetadata.d.ts +8 -0
  81. package/browser/metadata/IndexMetadata.js +9 -0
  82. package/browser/metadata/IndexMetadata.js.map +1 -1
  83. package/browser/metadata-args/IndexMetadataArgs.d.ts +8 -0
  84. package/browser/metadata-args/IndexMetadataArgs.js.map +1 -1
  85. package/browser/metadata-builder/EntityMetadataBuilder.js +13 -6
  86. package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  87. package/browser/metadata-builder/EntityMetadataValidator.js +8 -0
  88. package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
  89. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
  90. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  91. package/browser/platform/PlatformTools.js +5 -0
  92. package/browser/platform/PlatformTools.js.map +1 -1
  93. package/browser/query-builder/InsertQueryBuilder.js +15 -3
  94. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  95. package/browser/query-builder/QueryExpressionMap.d.ts +1 -1
  96. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  97. package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
  98. package/browser/query-builder/SelectQueryBuilder.js +25 -4
  99. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  100. package/browser/query-builder/UpdateQueryBuilder.js +18 -7
  101. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  102. package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
  103. package/browser/query-runner/BaseQueryRunner.js +25 -1
  104. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  105. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  106. package/browser/schema-builder/RdbmsSchemaBuilder.js +26 -6
  107. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  108. package/browser/schema-builder/options/TableColumnOptions.d.ts +2 -2
  109. package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
  110. package/browser/schema-builder/options/TableIndexOptions.d.ts +8 -0
  111. package/browser/schema-builder/options/TableIndexOptions.js.map +1 -1
  112. package/browser/schema-builder/table/TableColumn.d.ts +2 -2
  113. package/browser/schema-builder/table/TableColumn.js.map +1 -1
  114. package/browser/schema-builder/table/TableIndex.d.ts +8 -0
  115. package/browser/schema-builder/table/TableIndex.js +3 -0
  116. package/browser/schema-builder/table/TableIndex.js.map +1 -1
  117. package/cache/DbQueryResultCache.js +9 -1
  118. package/cache/DbQueryResultCache.js.map +1 -1
  119. package/cache/RedisQueryResultCache.js +3 -0
  120. package/cache/RedisQueryResultCache.js.map +1 -1
  121. package/cli-ts-node-commonjs.js +0 -0
  122. package/cli-ts-node-esm.js +0 -0
  123. package/cli.js +0 -0
  124. package/commands/InitCommand.js +1 -1
  125. package/commands/InitCommand.js.map +1 -1
  126. package/data-source/BaseDataSourceOptions.d.ts +1 -2
  127. package/data-source/BaseDataSourceOptions.js.map +1 -1
  128. package/data-source/DataSourceOptions.d.ts +2 -1
  129. package/data-source/DataSourceOptions.js.map +1 -1
  130. package/decorator/Index.js +1 -0
  131. package/decorator/Index.js.map +1 -1
  132. package/decorator/columns/PrimaryColumn.js +4 -1
  133. package/decorator/columns/PrimaryColumn.js.map +1 -1
  134. package/decorator/options/ColumnOptions.d.ts +3 -2
  135. package/decorator/options/ColumnOptions.js.map +1 -1
  136. package/decorator/options/IndexOptions.d.ts +8 -0
  137. package/decorator/options/IndexOptions.js.map +1 -1
  138. package/driver/DriverFactory.js +4 -0
  139. package/driver/DriverFactory.js.map +1 -1
  140. package/driver/cockroachdb/CockroachDriver.js +4 -1
  141. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  142. package/driver/cockroachdb/CockroachQueryRunner.js +133 -11
  143. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  144. package/driver/mysql/MysqlDriver.d.ts +1 -0
  145. package/driver/mysql/MysqlDriver.js +94 -23
  146. package/driver/mysql/MysqlDriver.js.map +1 -1
  147. package/driver/mysql/MysqlQueryRunner.js +203 -24
  148. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  149. package/driver/oracle/OracleDriver.js +79 -15
  150. package/driver/oracle/OracleDriver.js.map +1 -1
  151. package/driver/oracle/OracleQueryRunner.js +118 -21
  152. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  153. package/driver/postgres/PostgresDriver.js +95 -18
  154. package/driver/postgres/PostgresDriver.js.map +1 -1
  155. package/driver/postgres/PostgresQueryRunner.js +60 -38
  156. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  157. package/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  158. package/driver/spanner/SpannerConnectionCredentialsOptions.js +4 -0
  159. package/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  160. package/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  161. package/driver/spanner/SpannerConnectionOptions.js +4 -0
  162. package/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  163. package/driver/spanner/SpannerDriver.d.ts +241 -0
  164. package/driver/spanner/SpannerDriver.js +608 -0
  165. package/driver/spanner/SpannerDriver.js.map +1 -0
  166. package/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  167. package/driver/spanner/SpannerQueryRunner.js +1449 -0
  168. package/driver/spanner/SpannerQueryRunner.js.map +1 -0
  169. package/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
  170. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  171. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
  172. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  173. package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  174. package/driver/sqlserver/SqlServerDriver.js +99 -26
  175. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  176. package/driver/sqlserver/SqlServerQueryRunner.js +153 -17
  177. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  178. package/driver/types/ColumnTypes.d.ts +1 -1
  179. package/driver/types/ColumnTypes.js.map +1 -1
  180. package/driver/types/DatabaseType.d.ts +1 -1
  181. package/driver/types/DatabaseType.js.map +1 -1
  182. package/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  183. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  184. package/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  185. package/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  186. package/entity-schema/EntitySchemaTransformer.js +1 -0
  187. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  188. package/find-options/FindOneOptions.d.ts +1 -1
  189. package/find-options/FindOneOptions.js.map +1 -1
  190. package/find-options/FindOptionsUtils.d.ts +2 -1
  191. package/find-options/FindOptionsUtils.js +2 -1
  192. package/find-options/FindOptionsUtils.js.map +1 -1
  193. package/logger/AdvancedConsoleLogger.d.ts +1 -1
  194. package/logger/AdvancedConsoleLogger.js +1 -1
  195. package/logger/AdvancedConsoleLogger.js.map +1 -1
  196. package/metadata/ColumnMetadata.d.ts +2 -2
  197. package/metadata/ColumnMetadata.js.map +1 -1
  198. package/metadata/IndexMetadata.d.ts +8 -0
  199. package/metadata/IndexMetadata.js +9 -0
  200. package/metadata/IndexMetadata.js.map +1 -1
  201. package/metadata-args/IndexMetadataArgs.d.ts +8 -0
  202. package/metadata-args/IndexMetadataArgs.js.map +1 -1
  203. package/metadata-builder/EntityMetadataBuilder.js +13 -6
  204. package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  205. package/metadata-builder/EntityMetadataValidator.js +8 -0
  206. package/metadata-builder/EntityMetadataValidator.js.map +1 -1
  207. package/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
  208. package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  209. package/package.json +1 -261
  210. package/platform/PlatformTools.js +5 -0
  211. package/platform/PlatformTools.js.map +1 -1
  212. package/query-builder/InsertQueryBuilder.js +15 -3
  213. package/query-builder/InsertQueryBuilder.js.map +1 -1
  214. package/query-builder/QueryExpressionMap.d.ts +1 -1
  215. package/query-builder/QueryExpressionMap.js.map +1 -1
  216. package/query-builder/SelectQueryBuilder.d.ts +1 -1
  217. package/query-builder/SelectQueryBuilder.js +25 -4
  218. package/query-builder/SelectQueryBuilder.js.map +1 -1
  219. package/query-builder/UpdateQueryBuilder.js +18 -7
  220. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  221. package/query-runner/BaseQueryRunner.d.ts +10 -0
  222. package/query-runner/BaseQueryRunner.js +25 -1
  223. package/query-runner/BaseQueryRunner.js.map +1 -1
  224. package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  225. package/schema-builder/RdbmsSchemaBuilder.js +26 -6
  226. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  227. package/schema-builder/options/TableColumnOptions.d.ts +2 -2
  228. package/schema-builder/options/TableColumnOptions.js.map +1 -1
  229. package/schema-builder/options/TableIndexOptions.d.ts +8 -0
  230. package/schema-builder/options/TableIndexOptions.js.map +1 -1
  231. package/schema-builder/table/TableColumn.d.ts +2 -2
  232. package/schema-builder/table/TableColumn.js.map +1 -1
  233. package/schema-builder/table/TableIndex.d.ts +8 -0
  234. package/schema-builder/table/TableIndex.js +3 -0
  235. package/schema-builder/table/TableIndex.js.map +1 -1
@@ -454,6 +454,31 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
454
454
  downQueries.push(this.dropIndexSql(table, index));
455
455
  });
456
456
  }
457
+ // if table have column with generated type, we must add the expression to the metadata table
458
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
459
+ for (const column of generatedColumns) {
460
+ const parsedTableName = this.driver.parseTableName(table);
461
+ if (!parsedTableName.schema) {
462
+ parsedTableName.schema = await this.getCurrentSchema();
463
+ }
464
+ const insertQuery = this.insertTypeormMetadataSql({
465
+ database: parsedTableName.database,
466
+ schema: parsedTableName.schema,
467
+ table: parsedTableName.tableName,
468
+ type: MetadataTableType.GENERATED_COLUMN,
469
+ name: column.name,
470
+ value: column.asExpression,
471
+ });
472
+ const deleteQuery = this.deleteTypeormMetadataSql({
473
+ database: parsedTableName.database,
474
+ schema: parsedTableName.schema,
475
+ table: parsedTableName.tableName,
476
+ type: MetadataTableType.GENERATED_COLUMN,
477
+ name: column.name,
478
+ });
479
+ upQueries.push(insertQuery);
480
+ downQueries.push(deleteQuery);
481
+ }
457
482
  await this.executeQueries(upQueries, downQueries);
458
483
  }
459
484
  /**
@@ -486,6 +511,31 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
486
511
  table.foreignKeys.forEach((foreignKey) => upQueries.push(this.dropForeignKeySql(table, foreignKey)));
487
512
  upQueries.push(this.dropTableSql(table));
488
513
  downQueries.push(this.createTableSql(table, createForeignKeys));
514
+ // if table had columns with generated type, we must remove the expression from the metadata table
515
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
516
+ for (const column of generatedColumns) {
517
+ const parsedTableName = this.driver.parseTableName(table);
518
+ if (!parsedTableName.schema) {
519
+ parsedTableName.schema = await this.getCurrentSchema();
520
+ }
521
+ const deleteQuery = this.deleteTypeormMetadataSql({
522
+ database: parsedTableName.database,
523
+ schema: parsedTableName.schema,
524
+ table: parsedTableName.tableName,
525
+ type: MetadataTableType.GENERATED_COLUMN,
526
+ name: column.name,
527
+ });
528
+ const insertQuery = this.insertTypeormMetadataSql({
529
+ database: parsedTableName.database,
530
+ schema: parsedTableName.schema,
531
+ table: parsedTableName.tableName,
532
+ type: MetadataTableType.GENERATED_COLUMN,
533
+ name: column.name,
534
+ value: column.asExpression,
535
+ });
536
+ upQueries.push(deleteQuery);
537
+ downQueries.push(insertQuery);
538
+ }
489
539
  await this.executeQueries(upQueries, downQueries);
490
540
  }
491
541
  /**
@@ -653,6 +703,29 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
653
703
  const defaultName = this.connection.namingStrategy.defaultConstraintName(table, column.name);
654
704
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP CONSTRAINT "${defaultName}"`));
655
705
  }
706
+ if (column.generatedType && column.asExpression) {
707
+ const parsedTableName = this.driver.parseTableName(table);
708
+ if (!parsedTableName.schema) {
709
+ parsedTableName.schema = await this.getCurrentSchema();
710
+ }
711
+ const insertQuery = this.insertTypeormMetadataSql({
712
+ database: parsedTableName.database,
713
+ schema: parsedTableName.schema,
714
+ table: parsedTableName.tableName,
715
+ type: MetadataTableType.GENERATED_COLUMN,
716
+ name: column.name,
717
+ value: column.asExpression,
718
+ });
719
+ const deleteQuery = this.deleteTypeormMetadataSql({
720
+ database: parsedTableName.database,
721
+ schema: parsedTableName.schema,
722
+ table: parsedTableName.tableName,
723
+ type: MetadataTableType.GENERATED_COLUMN,
724
+ name: column.name,
725
+ });
726
+ upQueries.push(insertQuery);
727
+ downQueries.push(deleteQuery);
728
+ }
656
729
  await this.executeQueries(upQueries, downQueries);
657
730
  clonedTable.addColumn(column);
658
731
  this.replaceCachedTable(table, clonedTable);
@@ -705,7 +778,9 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
705
778
  if ((newColumn.isGenerated !== oldColumn.isGenerated &&
706
779
  newColumn.generationStrategy !== "uuid") ||
707
780
  newColumn.type !== oldColumn.type ||
708
- newColumn.length !== oldColumn.length) {
781
+ newColumn.length !== oldColumn.length ||
782
+ newColumn.asExpression !== oldColumn.asExpression ||
783
+ newColumn.generatedType !== oldColumn.generatedType) {
709
784
  // SQL Server does not support changing of IDENTITY column, so we must drop column and recreate it again.
710
785
  // Also, we recreate column if column type changed
711
786
  await this.dropColumn(table, oldColumn);
@@ -979,6 +1054,29 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
979
1054
  upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP CONSTRAINT "${defaultName}"`));
980
1055
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT "${defaultName}" DEFAULT ${column.default} FOR "${column.name}"`));
981
1056
  }
1057
+ if (column.generatedType && column.asExpression) {
1058
+ const parsedTableName = this.driver.parseTableName(table);
1059
+ if (!parsedTableName.schema) {
1060
+ parsedTableName.schema = await this.getCurrentSchema();
1061
+ }
1062
+ const deleteQuery = this.deleteTypeormMetadataSql({
1063
+ database: parsedTableName.database,
1064
+ schema: parsedTableName.schema,
1065
+ table: parsedTableName.tableName,
1066
+ type: MetadataTableType.GENERATED_COLUMN,
1067
+ name: column.name,
1068
+ });
1069
+ const insertQuery = this.insertTypeormMetadataSql({
1070
+ database: parsedTableName.database,
1071
+ schema: parsedTableName.schema,
1072
+ table: parsedTableName.tableName,
1073
+ type: MetadataTableType.GENERATED_COLUMN,
1074
+ name: column.name,
1075
+ value: column.asExpression,
1076
+ });
1077
+ upQueries.push(deleteQuery);
1078
+ downQueries.push(insertQuery);
1079
+ }
982
1080
  upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN "${column.name}"`));
983
1081
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(table, column, false, false)}`));
984
1082
  await this.executeQueries(upQueries, downQueries);
@@ -1427,12 +1525,9 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1427
1525
  const currentDatabase = await this.getCurrentDatabase();
1428
1526
  const dbTables = [];
1429
1527
  if (!tableNames) {
1430
- const databasesSql = `
1431
- SELECT DISTINCT
1432
- "name"
1433
- FROM "master"."dbo"."sysdatabases"
1434
- WHERE "name" NOT IN ('master', 'model', 'msdb')
1435
- `;
1528
+ const databasesSql = `SELECT DISTINCT "name" ` +
1529
+ `FROM "master"."dbo"."sysdatabases" ` +
1530
+ `WHERE "name" NOT IN ('master', 'model', 'msdb')`;
1436
1531
  const dbDatabases = await this.query(databasesSql);
1437
1532
  const tablesSql = dbDatabases
1438
1533
  .map(({ name }) => {
@@ -1497,7 +1592,10 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1497
1592
  const condition = tables
1498
1593
  .map(({ TABLE_SCHEMA, TABLE_NAME }) => `("TABLE_SCHEMA" = '${TABLE_SCHEMA}' AND "TABLE_NAME" = '${TABLE_NAME}')`)
1499
1594
  .join("OR");
1500
- return `SELECT * FROM "${TABLE_CATALOG}"."INFORMATION_SCHEMA"."COLUMNS" WHERE (${condition})`;
1595
+ return (`SELECT "COLUMNS".*, "cc"."is_persisted", "cc"."definition" ` +
1596
+ `FROM "${TABLE_CATALOG}"."INFORMATION_SCHEMA"."COLUMNS" ` +
1597
+ `LEFT JOIN "sys"."computed_columns" "cc" ON COL_NAME("cc"."object_id", "cc"."column_id") = "column_name" ` +
1598
+ `WHERE (${condition})`);
1501
1599
  })
1502
1600
  .join(" UNION ALL ");
1503
1601
  const constraintsSql = Object.entries(dbTablesByCatalog)
@@ -1597,13 +1695,14 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1597
1695
  table.name = this.driver.buildTableName(dbTable["TABLE_NAME"], schema, db);
1598
1696
  const defaultCollation = dbCollations.find((dbCollation) => dbCollation["NAME"] === dbTable["TABLE_CATALOG"]);
1599
1697
  // create columns from the loaded columns
1600
- table.columns = dbColumns
1601
- .filter((dbColumn) => dbColumn["TABLE_NAME"] === dbTable["TABLE_NAME"] &&
1698
+ table.columns = await Promise.all(dbColumns
1699
+ .filter((dbColumn) => dbColumn["TABLE_NAME"] ===
1700
+ dbTable["TABLE_NAME"] &&
1602
1701
  dbColumn["TABLE_SCHEMA"] ===
1603
1702
  dbTable["TABLE_SCHEMA"] &&
1604
1703
  dbColumn["TABLE_CATALOG"] ===
1605
1704
  dbTable["TABLE_CATALOG"])
1606
- .map((dbColumn) => {
1705
+ .map(async (dbColumn) => {
1607
1706
  const columnConstraints = dbConstraints.filter((dbConstraint) => dbConstraint["TABLE_NAME"] ===
1608
1707
  dbColumn["TABLE_NAME"] &&
1609
1708
  dbConstraint["TABLE_SCHEMA"] ===
@@ -1625,7 +1724,8 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1625
1724
  dbConstraint["COLUMN_NAME"] !==
1626
1725
  dbColumn["COLUMN_NAME"]);
1627
1726
  });
1628
- const isPrimary = !!columnConstraints.find((constraint) => constraint["CONSTRAINT_TYPE"] === "PRIMARY KEY");
1727
+ const isPrimary = !!columnConstraints.find((constraint) => constraint["CONSTRAINT_TYPE"] ===
1728
+ "PRIMARY KEY");
1629
1729
  const isGenerated = !!dbIdentityColumns.find((column) => column["TABLE_NAME"] ===
1630
1730
  dbColumn["TABLE_NAME"] &&
1631
1731
  column["TABLE_SCHEMA"] ===
@@ -1636,7 +1736,8 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1636
1736
  dbColumn["COLUMN_NAME"]);
1637
1737
  const tableColumn = new TableColumn();
1638
1738
  tableColumn.name = dbColumn["COLUMN_NAME"];
1639
- tableColumn.type = dbColumn["DATA_TYPE"].toLowerCase();
1739
+ tableColumn.type =
1740
+ dbColumn["DATA_TYPE"].toLowerCase();
1640
1741
  // check only columns that have length property
1641
1742
  if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
1642
1743
  dbColumn["CHARACTER_MAXIMUM_LENGTH"]) {
@@ -1659,7 +1760,8 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1659
1760
  dbColumn["NUMERIC_PRECISION"];
1660
1761
  if (dbColumn["NUMERIC_SCALE"] !== null &&
1661
1762
  !this.isDefaultColumnScale(table, tableColumn, dbColumn["NUMERIC_SCALE"]))
1662
- tableColumn.scale = dbColumn["NUMERIC_SCALE"];
1763
+ tableColumn.scale =
1764
+ dbColumn["NUMERIC_SCALE"];
1663
1765
  }
1664
1766
  if (tableColumn.type === "nvarchar") {
1665
1767
  // Check if this is an enum
@@ -1719,8 +1821,31 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
1719
1821
  ? dbColumn["DATETIME_PRECISION"]
1720
1822
  : undefined;
1721
1823
  }
1824
+ if (dbColumn["is_persisted"] !== null &&
1825
+ dbColumn["is_persisted"] !== undefined &&
1826
+ dbColumn["definition"]) {
1827
+ tableColumn.generatedType =
1828
+ dbColumn["is_persisted"] === true
1829
+ ? "STORED"
1830
+ : "VIRTUAL";
1831
+ // We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
1832
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
1833
+ database: dbTable["TABLE_CATALOG"],
1834
+ schema: dbTable["TABLE_SCHEMA"],
1835
+ table: dbTable["TABLE_NAME"],
1836
+ type: MetadataTableType.GENERATED_COLUMN,
1837
+ name: tableColumn.name,
1838
+ });
1839
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
1840
+ if (results[0] && results[0].value) {
1841
+ tableColumn.asExpression = results[0].value;
1842
+ }
1843
+ else {
1844
+ tableColumn.asExpression = "";
1845
+ }
1846
+ }
1722
1847
  return tableColumn;
1723
- });
1848
+ }));
1724
1849
  // find unique constraints of table, group them by constraint name and build TableUnique.
1725
1850
  const tableUniqueConstraints = OrmUtils.uniq(dbConstraints.filter((dbConstraint) => dbConstraint["TABLE_NAME"] ===
1726
1851
  dbTable["TABLE_NAME"] &&
@@ -2097,8 +2222,19 @@ export class SqlServerQueryRunner extends BaseQueryRunner {
2097
2222
  }
2098
2223
  if (column.collation)
2099
2224
  c += " COLLATE " + column.collation;
2100
- if (column.isNullable !== true)
2101
- c += " NOT NULL";
2225
+ if (column.asExpression) {
2226
+ c += ` AS (${column.asExpression})`;
2227
+ if (column.generatedType === "STORED") {
2228
+ c += ` PERSISTED`;
2229
+ // NOT NULL can be specified for computed columns only if PERSISTED is also specified
2230
+ if (column.isNullable !== true)
2231
+ c += " NOT NULL";
2232
+ }
2233
+ }
2234
+ else {
2235
+ if (column.isNullable !== true)
2236
+ c += " NOT NULL";
2237
+ }
2102
2238
  if (column.isGenerated === true &&
2103
2239
  column.generationStrategy === "increment" &&
2104
2240
  !skipIdentity)