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
@@ -457,6 +457,31 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
457
457
  downQueries.push(this.dropIndexSql(table, index));
458
458
  });
459
459
  }
460
+ // if table have column with generated type, we must add the expression to the metadata table
461
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
462
+ for (const column of generatedColumns) {
463
+ const parsedTableName = this.driver.parseTableName(table);
464
+ if (!parsedTableName.schema) {
465
+ parsedTableName.schema = await this.getCurrentSchema();
466
+ }
467
+ const insertQuery = this.insertTypeormMetadataSql({
468
+ database: parsedTableName.database,
469
+ schema: parsedTableName.schema,
470
+ table: parsedTableName.tableName,
471
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
472
+ name: column.name,
473
+ value: column.asExpression,
474
+ });
475
+ const deleteQuery = this.deleteTypeormMetadataSql({
476
+ database: parsedTableName.database,
477
+ schema: parsedTableName.schema,
478
+ table: parsedTableName.tableName,
479
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
480
+ name: column.name,
481
+ });
482
+ upQueries.push(insertQuery);
483
+ downQueries.push(deleteQuery);
484
+ }
460
485
  await this.executeQueries(upQueries, downQueries);
461
486
  }
462
487
  /**
@@ -489,6 +514,31 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
489
514
  table.foreignKeys.forEach((foreignKey) => upQueries.push(this.dropForeignKeySql(table, foreignKey)));
490
515
  upQueries.push(this.dropTableSql(table));
491
516
  downQueries.push(this.createTableSql(table, createForeignKeys));
517
+ // if table had columns with generated type, we must remove the expression from the metadata table
518
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
519
+ for (const column of generatedColumns) {
520
+ const parsedTableName = this.driver.parseTableName(table);
521
+ if (!parsedTableName.schema) {
522
+ parsedTableName.schema = await this.getCurrentSchema();
523
+ }
524
+ const deleteQuery = this.deleteTypeormMetadataSql({
525
+ database: parsedTableName.database,
526
+ schema: parsedTableName.schema,
527
+ table: parsedTableName.tableName,
528
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
529
+ name: column.name,
530
+ });
531
+ const insertQuery = this.insertTypeormMetadataSql({
532
+ database: parsedTableName.database,
533
+ schema: parsedTableName.schema,
534
+ table: parsedTableName.tableName,
535
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
536
+ name: column.name,
537
+ value: column.asExpression,
538
+ });
539
+ upQueries.push(deleteQuery);
540
+ downQueries.push(insertQuery);
541
+ }
492
542
  await this.executeQueries(upQueries, downQueries);
493
543
  }
494
544
  /**
@@ -656,6 +706,29 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
656
706
  const defaultName = this.connection.namingStrategy.defaultConstraintName(table, column.name);
657
707
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} DROP CONSTRAINT "${defaultName}"`));
658
708
  }
709
+ if (column.generatedType && column.asExpression) {
710
+ const parsedTableName = this.driver.parseTableName(table);
711
+ if (!parsedTableName.schema) {
712
+ parsedTableName.schema = await this.getCurrentSchema();
713
+ }
714
+ const insertQuery = this.insertTypeormMetadataSql({
715
+ database: parsedTableName.database,
716
+ schema: parsedTableName.schema,
717
+ table: parsedTableName.tableName,
718
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
719
+ name: column.name,
720
+ value: column.asExpression,
721
+ });
722
+ const deleteQuery = this.deleteTypeormMetadataSql({
723
+ database: parsedTableName.database,
724
+ schema: parsedTableName.schema,
725
+ table: parsedTableName.tableName,
726
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
727
+ name: column.name,
728
+ });
729
+ upQueries.push(insertQuery);
730
+ downQueries.push(deleteQuery);
731
+ }
659
732
  await this.executeQueries(upQueries, downQueries);
660
733
  clonedTable.addColumn(column);
661
734
  this.replaceCachedTable(table, clonedTable);
@@ -708,7 +781,9 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
708
781
  if ((newColumn.isGenerated !== oldColumn.isGenerated &&
709
782
  newColumn.generationStrategy !== "uuid") ||
710
783
  newColumn.type !== oldColumn.type ||
711
- newColumn.length !== oldColumn.length) {
784
+ newColumn.length !== oldColumn.length ||
785
+ newColumn.asExpression !== oldColumn.asExpression ||
786
+ newColumn.generatedType !== oldColumn.generatedType) {
712
787
  // SQL Server does not support changing of IDENTITY column, so we must drop column and recreate it again.
713
788
  // Also, we recreate column if column type changed
714
789
  await this.dropColumn(table, oldColumn);
@@ -982,6 +1057,29 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
982
1057
  upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} DROP CONSTRAINT "${defaultName}"`));
983
1058
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT "${defaultName}" DEFAULT ${column.default} FOR "${column.name}"`));
984
1059
  }
1060
+ if (column.generatedType && column.asExpression) {
1061
+ const parsedTableName = this.driver.parseTableName(table);
1062
+ if (!parsedTableName.schema) {
1063
+ parsedTableName.schema = await this.getCurrentSchema();
1064
+ }
1065
+ const deleteQuery = this.deleteTypeormMetadataSql({
1066
+ database: parsedTableName.database,
1067
+ schema: parsedTableName.schema,
1068
+ table: parsedTableName.tableName,
1069
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1070
+ name: column.name,
1071
+ });
1072
+ const insertQuery = this.insertTypeormMetadataSql({
1073
+ database: parsedTableName.database,
1074
+ schema: parsedTableName.schema,
1075
+ table: parsedTableName.tableName,
1076
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1077
+ name: column.name,
1078
+ value: column.asExpression,
1079
+ });
1080
+ upQueries.push(deleteQuery);
1081
+ downQueries.push(insertQuery);
1082
+ }
985
1083
  upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN "${column.name}"`));
986
1084
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(table, column, false, false)}`));
987
1085
  await this.executeQueries(upQueries, downQueries);
@@ -1430,12 +1528,9 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1430
1528
  const currentDatabase = await this.getCurrentDatabase();
1431
1529
  const dbTables = [];
1432
1530
  if (!tableNames) {
1433
- const databasesSql = `
1434
- SELECT DISTINCT
1435
- "name"
1436
- FROM "master"."dbo"."sysdatabases"
1437
- WHERE "name" NOT IN ('master', 'model', 'msdb')
1438
- `;
1531
+ const databasesSql = `SELECT DISTINCT "name" ` +
1532
+ `FROM "master"."dbo"."sysdatabases" ` +
1533
+ `WHERE "name" NOT IN ('master', 'model', 'msdb')`;
1439
1534
  const dbDatabases = await this.query(databasesSql);
1440
1535
  const tablesSql = dbDatabases
1441
1536
  .map(({ name }) => {
@@ -1500,7 +1595,10 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1500
1595
  const condition = tables
1501
1596
  .map(({ TABLE_SCHEMA, TABLE_NAME }) => `("TABLE_SCHEMA" = '${TABLE_SCHEMA}' AND "TABLE_NAME" = '${TABLE_NAME}')`)
1502
1597
  .join("OR");
1503
- return `SELECT * FROM "${TABLE_CATALOG}"."INFORMATION_SCHEMA"."COLUMNS" WHERE (${condition})`;
1598
+ return (`SELECT "COLUMNS".*, "cc"."is_persisted", "cc"."definition" ` +
1599
+ `FROM "${TABLE_CATALOG}"."INFORMATION_SCHEMA"."COLUMNS" ` +
1600
+ `LEFT JOIN "sys"."computed_columns" "cc" ON COL_NAME("cc"."object_id", "cc"."column_id") = "column_name" ` +
1601
+ `WHERE (${condition})`);
1504
1602
  })
1505
1603
  .join(" UNION ALL ");
1506
1604
  const constraintsSql = Object.entries(dbTablesByCatalog)
@@ -1600,13 +1698,14 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1600
1698
  table.name = this.driver.buildTableName(dbTable["TABLE_NAME"], schema, db);
1601
1699
  const defaultCollation = dbCollations.find((dbCollation) => dbCollation["NAME"] === dbTable["TABLE_CATALOG"]);
1602
1700
  // create columns from the loaded columns
1603
- table.columns = dbColumns
1604
- .filter((dbColumn) => dbColumn["TABLE_NAME"] === dbTable["TABLE_NAME"] &&
1701
+ table.columns = await Promise.all(dbColumns
1702
+ .filter((dbColumn) => dbColumn["TABLE_NAME"] ===
1703
+ dbTable["TABLE_NAME"] &&
1605
1704
  dbColumn["TABLE_SCHEMA"] ===
1606
1705
  dbTable["TABLE_SCHEMA"] &&
1607
1706
  dbColumn["TABLE_CATALOG"] ===
1608
1707
  dbTable["TABLE_CATALOG"])
1609
- .map((dbColumn) => {
1708
+ .map(async (dbColumn) => {
1610
1709
  const columnConstraints = dbConstraints.filter((dbConstraint) => dbConstraint["TABLE_NAME"] ===
1611
1710
  dbColumn["TABLE_NAME"] &&
1612
1711
  dbConstraint["TABLE_SCHEMA"] ===
@@ -1628,7 +1727,8 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1628
1727
  dbConstraint["COLUMN_NAME"] !==
1629
1728
  dbColumn["COLUMN_NAME"]);
1630
1729
  });
1631
- const isPrimary = !!columnConstraints.find((constraint) => constraint["CONSTRAINT_TYPE"] === "PRIMARY KEY");
1730
+ const isPrimary = !!columnConstraints.find((constraint) => constraint["CONSTRAINT_TYPE"] ===
1731
+ "PRIMARY KEY");
1632
1732
  const isGenerated = !!dbIdentityColumns.find((column) => column["TABLE_NAME"] ===
1633
1733
  dbColumn["TABLE_NAME"] &&
1634
1734
  column["TABLE_SCHEMA"] ===
@@ -1639,7 +1739,8 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1639
1739
  dbColumn["COLUMN_NAME"]);
1640
1740
  const tableColumn = new TableColumn_1.TableColumn();
1641
1741
  tableColumn.name = dbColumn["COLUMN_NAME"];
1642
- tableColumn.type = dbColumn["DATA_TYPE"].toLowerCase();
1742
+ tableColumn.type =
1743
+ dbColumn["DATA_TYPE"].toLowerCase();
1643
1744
  // check only columns that have length property
1644
1745
  if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
1645
1746
  dbColumn["CHARACTER_MAXIMUM_LENGTH"]) {
@@ -1662,7 +1763,8 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1662
1763
  dbColumn["NUMERIC_PRECISION"];
1663
1764
  if (dbColumn["NUMERIC_SCALE"] !== null &&
1664
1765
  !this.isDefaultColumnScale(table, tableColumn, dbColumn["NUMERIC_SCALE"]))
1665
- tableColumn.scale = dbColumn["NUMERIC_SCALE"];
1766
+ tableColumn.scale =
1767
+ dbColumn["NUMERIC_SCALE"];
1666
1768
  }
1667
1769
  if (tableColumn.type === "nvarchar") {
1668
1770
  // Check if this is an enum
@@ -1722,8 +1824,31 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1722
1824
  ? dbColumn["DATETIME_PRECISION"]
1723
1825
  : undefined;
1724
1826
  }
1827
+ if (dbColumn["is_persisted"] !== null &&
1828
+ dbColumn["is_persisted"] !== undefined &&
1829
+ dbColumn["definition"]) {
1830
+ tableColumn.generatedType =
1831
+ dbColumn["is_persisted"] === true
1832
+ ? "STORED"
1833
+ : "VIRTUAL";
1834
+ // We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
1835
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
1836
+ database: dbTable["TABLE_CATALOG"],
1837
+ schema: dbTable["TABLE_SCHEMA"],
1838
+ table: dbTable["TABLE_NAME"],
1839
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1840
+ name: tableColumn.name,
1841
+ });
1842
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
1843
+ if (results[0] && results[0].value) {
1844
+ tableColumn.asExpression = results[0].value;
1845
+ }
1846
+ else {
1847
+ tableColumn.asExpression = "";
1848
+ }
1849
+ }
1725
1850
  return tableColumn;
1726
- });
1851
+ }));
1727
1852
  // find unique constraints of table, group them by constraint name and build TableUnique.
1728
1853
  const tableUniqueConstraints = OrmUtils_1.OrmUtils.uniq(dbConstraints.filter((dbConstraint) => dbConstraint["TABLE_NAME"] ===
1729
1854
  dbTable["TABLE_NAME"] &&
@@ -2100,8 +2225,19 @@ class SqlServerQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
2100
2225
  }
2101
2226
  if (column.collation)
2102
2227
  c += " COLLATE " + column.collation;
2103
- if (column.isNullable !== true)
2104
- c += " NOT NULL";
2228
+ if (column.asExpression) {
2229
+ c += ` AS (${column.asExpression})`;
2230
+ if (column.generatedType === "STORED") {
2231
+ c += ` PERSISTED`;
2232
+ // NOT NULL can be specified for computed columns only if PERSISTED is also specified
2233
+ if (column.isNullable !== true)
2234
+ c += " NOT NULL";
2235
+ }
2236
+ }
2237
+ else {
2238
+ if (column.isNullable !== true)
2239
+ c += " NOT NULL";
2240
+ }
2105
2241
  if (column.isGenerated === true &&
2106
2242
  column.generationStrategy === "increment" &&
2107
2243
  !skipIdentity)