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
@@ -318,6 +318,26 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
318
318
  // createTable does not need separate method to create foreign keys, because it create fk's in the same query with table creation.
319
319
  if (createForeignKeys)
320
320
  table.foreignKeys.forEach((foreignKey) => downQueries.push(this.dropForeignKeySql(table, foreignKey)));
321
+ // if table has column with generated type, we must add the expression to the metadata table
322
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
323
+ for (const column of generatedColumns) {
324
+ const currentDatabase = await this.getCurrentDatabase();
325
+ const insertQuery = this.insertTypeormMetadataSql({
326
+ schema: currentDatabase,
327
+ table: table.name,
328
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
329
+ name: column.name,
330
+ value: column.asExpression,
331
+ });
332
+ const deleteQuery = this.deleteTypeormMetadataSql({
333
+ schema: currentDatabase,
334
+ table: table.name,
335
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
336
+ name: column.name,
337
+ });
338
+ upQueries.push(insertQuery);
339
+ downQueries.push(deleteQuery);
340
+ }
321
341
  return this.executeQueries(upQueries, downQueries);
322
342
  }
323
343
  /**
@@ -342,6 +362,26 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
342
362
  table.indices.forEach((index) => upQueries.push(this.dropIndexSql(table, index)));
343
363
  upQueries.push(this.dropTableSql(table));
344
364
  downQueries.push(this.createTableSql(table, createForeignKeys));
365
+ // if table had columns with generated type, we must remove the expression from the metadata table
366
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
367
+ for (const column of generatedColumns) {
368
+ const currentDatabase = await this.getCurrentDatabase();
369
+ const deleteQuery = this.deleteTypeormMetadataSql({
370
+ schema: currentDatabase,
371
+ table: table.name,
372
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
373
+ name: column.name,
374
+ });
375
+ const insertQuery = this.insertTypeormMetadataSql({
376
+ schema: currentDatabase,
377
+ table: table.name,
378
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
379
+ name: column.name,
380
+ value: column.asExpression,
381
+ });
382
+ upQueries.push(deleteQuery);
383
+ downQueries.push(insertQuery);
384
+ }
345
385
  await this.executeQueries(upQueries, downQueries);
346
386
  }
347
387
  /**
@@ -487,6 +527,24 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
487
527
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${column.name}\` ${this.buildCreateColumnSql(nonGeneratedColumn, true)}`));
488
528
  }
489
529
  }
530
+ if (column.generatedType && column.asExpression) {
531
+ const currentDatabase = await this.getCurrentDatabase();
532
+ const insertQuery = this.insertTypeormMetadataSql({
533
+ schema: currentDatabase,
534
+ table: table.name,
535
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
536
+ name: column.name,
537
+ value: column.asExpression,
538
+ });
539
+ const deleteQuery = this.deleteTypeormMetadataSql({
540
+ schema: currentDatabase,
541
+ table: table.name,
542
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
543
+ name: column.name,
544
+ });
545
+ upQueries.push(insertQuery);
546
+ downQueries.push(deleteQuery);
547
+ }
490
548
  // create column index
491
549
  const columnIndex = clonedTable.indices.find((index) => index.columnNames.length === 1 &&
492
550
  index.columnNames[0] === column.name);
@@ -563,7 +621,12 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
563
621
  newColumn.generationStrategy !== "uuid") ||
564
622
  oldColumn.type !== newColumn.type ||
565
623
  oldColumn.length !== newColumn.length ||
566
- oldColumn.generatedType !== newColumn.generatedType) {
624
+ (oldColumn.generatedType &&
625
+ newColumn.generatedType &&
626
+ oldColumn.generatedType !== newColumn.generatedType) ||
627
+ (!oldColumn.generatedType &&
628
+ newColumn.generatedType === "VIRTUAL") ||
629
+ (oldColumn.generatedType === "VIRTUAL" && !newColumn.generatedType)) {
567
630
  await this.dropColumn(table, oldColumn);
568
631
  await this.addColumn(table, newColumn);
569
632
  // update cloned table
@@ -639,6 +702,77 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
639
702
  if (this.isColumnChanged(oldColumn, newColumn, true, true)) {
640
703
  upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${oldColumn.name}\` ${this.buildCreateColumnSql(newColumn, true)}`));
641
704
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${newColumn.name}\` ${this.buildCreateColumnSql(oldColumn, true)}`));
705
+ if (oldColumn.generatedType && !newColumn.generatedType) {
706
+ // if column changed from generated to non-generated, delete record from typeorm metadata
707
+ const currentDatabase = await this.getCurrentDatabase();
708
+ const deleteQuery = this.deleteTypeormMetadataSql({
709
+ schema: currentDatabase,
710
+ table: table.name,
711
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
712
+ name: oldColumn.name,
713
+ });
714
+ const insertQuery = this.insertTypeormMetadataSql({
715
+ schema: currentDatabase,
716
+ table: table.name,
717
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
718
+ name: oldColumn.name,
719
+ value: oldColumn.asExpression,
720
+ });
721
+ upQueries.push(deleteQuery);
722
+ downQueries.push(insertQuery);
723
+ }
724
+ else if (!oldColumn.generatedType &&
725
+ newColumn.generatedType) {
726
+ // if column changed from non-generated to generated, insert record into typeorm metadata
727
+ const currentDatabase = await this.getCurrentDatabase();
728
+ const insertQuery = this.insertTypeormMetadataSql({
729
+ schema: currentDatabase,
730
+ table: table.name,
731
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
732
+ name: newColumn.name,
733
+ value: newColumn.asExpression,
734
+ });
735
+ const deleteQuery = this.deleteTypeormMetadataSql({
736
+ schema: currentDatabase,
737
+ table: table.name,
738
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
739
+ name: newColumn.name,
740
+ });
741
+ upQueries.push(insertQuery);
742
+ downQueries.push(deleteQuery);
743
+ }
744
+ else if (oldColumn.asExpression !== newColumn.asExpression) {
745
+ // if only expression changed, just update it in typeorm_metadata table
746
+ const currentDatabase = await this.getCurrentDatabase();
747
+ const updateQuery = this.connection
748
+ .createQueryBuilder()
749
+ .update(this.getTypeormMetadataTableName())
750
+ .set({ value: newColumn.asExpression })
751
+ .where("`type` = :type", {
752
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
753
+ })
754
+ .andWhere("`name` = :name", { name: oldColumn.name })
755
+ .andWhere("`schema` = :schema", {
756
+ schema: currentDatabase,
757
+ })
758
+ .andWhere("`table` = :table", { table: table.name })
759
+ .getQueryAndParameters();
760
+ const revertUpdateQuery = this.connection
761
+ .createQueryBuilder()
762
+ .update(this.getTypeormMetadataTableName())
763
+ .set({ value: oldColumn.asExpression })
764
+ .where("`type` = :type", {
765
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
766
+ })
767
+ .andWhere("`name` = :name", { name: newColumn.name })
768
+ .andWhere("`schema` = :schema", {
769
+ schema: currentDatabase,
770
+ })
771
+ .andWhere("`table` = :table", { table: table.name })
772
+ .getQueryAndParameters();
773
+ upQueries.push(new Query_1.Query(updateQuery[0], updateQuery[1]));
774
+ downQueries.push(new Query_1.Query(revertUpdateQuery[0], revertUpdateQuery[1]));
775
+ }
642
776
  }
643
777
  if (newColumn.isPrimary !== oldColumn.isPrimary) {
644
778
  // if table have generated column, we must drop AUTO_INCREMENT before changing primary constraints.
@@ -817,6 +951,24 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
817
951
  }
818
952
  upQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN \`${column.name}\``));
819
953
  downQueries.push(new Query_1.Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(column, true)}`));
954
+ if (column.generatedType && column.asExpression) {
955
+ const currentDatabase = await this.getCurrentDatabase();
956
+ const deleteQuery = this.deleteTypeormMetadataSql({
957
+ schema: currentDatabase,
958
+ table: table.name,
959
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
960
+ name: column.name,
961
+ });
962
+ const insertQuery = this.insertTypeormMetadataSql({
963
+ schema: currentDatabase,
964
+ table: table.name,
965
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
966
+ name: column.name,
967
+ value: column.asExpression,
968
+ });
969
+ upQueries.push(deleteQuery);
970
+ downQueries.push(insertQuery);
971
+ }
820
972
  await this.executeQueries(upQueries, downQueries);
821
973
  clonedTable.removeColumn(column);
822
974
  this.replaceCachedTable(table, clonedTable);
@@ -1352,11 +1504,12 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1352
1504
  table.database = dbTable["TABLE_SCHEMA"];
1353
1505
  table.name = this.driver.buildTableName(dbTable["TABLE_NAME"], undefined, db);
1354
1506
  // create columns from the loaded columns
1355
- table.columns = dbColumns
1356
- .filter((dbColumn) => dbColumn["TABLE_NAME"] === dbTable["TABLE_NAME"] &&
1507
+ table.columns = await Promise.all(dbColumns
1508
+ .filter((dbColumn) => dbColumn["TABLE_NAME"] ===
1509
+ dbTable["TABLE_NAME"] &&
1357
1510
  dbColumn["TABLE_SCHEMA"] ===
1358
1511
  dbTable["TABLE_SCHEMA"])
1359
- .map((dbColumn) => {
1512
+ .map(async (dbColumn) => {
1360
1513
  const columnUniqueIndices = dbIndices.filter((dbIndex) => {
1361
1514
  return (dbIndex["TABLE_NAME"] ===
1362
1515
  dbTable["TABLE_NAME"] &&
@@ -1364,7 +1517,8 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1364
1517
  dbTable["TABLE_SCHEMA"] &&
1365
1518
  dbIndex["COLUMN_NAME"] ===
1366
1519
  dbColumn["COLUMN_NAME"] &&
1367
- parseInt(dbIndex["NON_UNIQUE"], 10) === 0);
1520
+ parseInt(dbIndex["NON_UNIQUE"], 10) ===
1521
+ 0);
1368
1522
  });
1369
1523
  const tableMetadata = this.connection.entityMetadatas.find((metadata) => this.getTablePath(table) ===
1370
1524
  this.getTablePath(metadata));
@@ -1385,9 +1539,11 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1385
1539
  });
1386
1540
  const tableColumn = new TableColumn_1.TableColumn();
1387
1541
  tableColumn.name = dbColumn["COLUMN_NAME"];
1388
- tableColumn.type = dbColumn["DATA_TYPE"].toLowerCase();
1542
+ tableColumn.type =
1543
+ dbColumn["DATA_TYPE"].toLowerCase();
1389
1544
  tableColumn.zerofill =
1390
- dbColumn["COLUMN_TYPE"].indexOf("zerofill") !== -1;
1545
+ dbColumn["COLUMN_TYPE"].indexOf("zerofill") !==
1546
+ -1;
1391
1547
  tableColumn.unsigned = tableColumn.zerofill
1392
1548
  ? true
1393
1549
  : dbColumn["COLUMN_TYPE"].indexOf("unsigned") !== -1;
@@ -1401,7 +1557,8 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1401
1557
  }
1402
1558
  if (dbColumn["COLUMN_DEFAULT"] === null ||
1403
1559
  dbColumn["COLUMN_DEFAULT"] === undefined ||
1404
- (isMariaDb && dbColumn["COLUMN_DEFAULT"] === "NULL")) {
1560
+ (isMariaDb &&
1561
+ dbColumn["COLUMN_DEFAULT"] === "NULL")) {
1405
1562
  tableColumn.default = undefined;
1406
1563
  }
1407
1564
  else if (/^CURRENT_TIMESTAMP(\([0-9]*\))?$/i.test(dbColumn["COLUMN_DEFAULT"])) {
@@ -1423,23 +1580,41 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1423
1580
  // New versions of MariaDB return expressions in lowercase. We need to set it in
1424
1581
  // uppercase so the comparison in MysqlDriver#compareExtraValues does not fail.
1425
1582
  tableColumn.onUpdate = dbColumn["EXTRA"]
1426
- .substring(dbColumn["EXTRA"].indexOf("on update") + 10)
1583
+ .substring(dbColumn["EXTRA"].indexOf("on update") +
1584
+ 10)
1427
1585
  .toUpperCase();
1428
1586
  }
1429
1587
  if (dbColumn["GENERATION_EXPRESSION"]) {
1430
- tableColumn.asExpression =
1431
- dbColumn["GENERATION_EXPRESSION"];
1432
1588
  tableColumn.generatedType =
1433
1589
  dbColumn["EXTRA"].indexOf("VIRTUAL") !== -1
1434
1590
  ? "VIRTUAL"
1435
1591
  : "STORED";
1592
+ // We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
1593
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
1594
+ schema: dbTable["TABLE_SCHEMA"],
1595
+ table: dbTable["TABLE_NAME"],
1596
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1597
+ name: tableColumn.name,
1598
+ });
1599
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
1600
+ if (results[0] && results[0].value) {
1601
+ tableColumn.asExpression = results[0].value;
1602
+ }
1603
+ else {
1604
+ tableColumn.asExpression = "";
1605
+ }
1436
1606
  }
1437
1607
  tableColumn.isUnique =
1438
1608
  columnUniqueIndices.length > 0 &&
1439
1609
  !hasIgnoredIndex &&
1440
1610
  !isConstraintComposite;
1441
- tableColumn.isNullable =
1442
- dbColumn["IS_NULLABLE"] === "YES";
1611
+ if (isMariaDb && tableColumn.generatedType) {
1612
+ // do nothing - MariaDB does not support NULL/NOT NULL expressions for generated columns
1613
+ }
1614
+ else {
1615
+ tableColumn.isNullable =
1616
+ dbColumn["IS_NULLABLE"] === "YES";
1617
+ }
1443
1618
  tableColumn.isPrimary = dbPrimaryKeys.some((dbPrimaryKey) => {
1444
1619
  return (dbPrimaryKey["TABLE_NAME"] ===
1445
1620
  dbColumn["TABLE_NAME"] &&
@@ -1449,11 +1624,13 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1449
1624
  dbColumn["COLUMN_NAME"]);
1450
1625
  });
1451
1626
  tableColumn.isGenerated =
1452
- dbColumn["EXTRA"].indexOf("auto_increment") !== -1;
1627
+ dbColumn["EXTRA"].indexOf("auto_increment") !==
1628
+ -1;
1453
1629
  if (tableColumn.isGenerated)
1454
1630
  tableColumn.generationStrategy = "increment";
1455
1631
  tableColumn.comment =
1456
- typeof dbColumn["COLUMN_COMMENT"] === "string" &&
1632
+ typeof dbColumn["COLUMN_COMMENT"] ===
1633
+ "string" &&
1457
1634
  dbColumn["COLUMN_COMMENT"].length === 0
1458
1635
  ? undefined
1459
1636
  : dbColumn["COLUMN_COMMENT"];
@@ -1465,16 +1642,18 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1465
1642
  : dbColumn["CHARACTER_SET_NAME"];
1466
1643
  if (dbColumn["COLLATION_NAME"])
1467
1644
  tableColumn.collation =
1468
- dbColumn["COLLATION_NAME"] === defaultCollation
1645
+ dbColumn["COLLATION_NAME"] ===
1646
+ defaultCollation
1469
1647
  ? undefined
1470
1648
  : dbColumn["COLLATION_NAME"];
1471
1649
  // check only columns that have length property
1472
1650
  if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
1473
1651
  dbColumn["CHARACTER_MAXIMUM_LENGTH"]) {
1474
1652
  const length = dbColumn["CHARACTER_MAXIMUM_LENGTH"].toString();
1475
- tableColumn.length = !this.isDefaultColumnLength(table, tableColumn, length)
1476
- ? length
1477
- : "";
1653
+ tableColumn.length =
1654
+ !this.isDefaultColumnLength(table, tableColumn, length)
1655
+ ? length
1656
+ : "";
1478
1657
  }
1479
1658
  if (tableColumn.type === "decimal" ||
1480
1659
  tableColumn.type === "double" ||
@@ -1507,7 +1686,7 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1507
1686
  tableColumn.precision = parseInt(dbColumn["DATETIME_PRECISION"]);
1508
1687
  }
1509
1688
  return tableColumn;
1510
- });
1689
+ }));
1511
1690
  // find foreign key constraints of table, group them by constraint name and build TableForeignKey.
1512
1691
  const tableForeignKeyConstraints = OrmUtils_1.OrmUtils.uniq(dbForeignKeys.filter((dbForeignKey) => {
1513
1692
  return (dbForeignKey["TABLE_NAME"] ===
@@ -1804,6 +1983,10 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1804
1983
  else {
1805
1984
  c = `\`${column.name}\` ${this.connection.driver.createFullType(column)}`;
1806
1985
  }
1986
+ if (column.charset)
1987
+ c += ` CHARACTER SET "${column.charset}"`;
1988
+ if (column.collation)
1989
+ c += ` COLLATE "${column.collation}"`;
1807
1990
  if (column.asExpression)
1808
1991
  c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
1809
1992
  // if you specify ZEROFILL for a numeric column, MySQL automatically adds the UNSIGNED attribute to that column.
@@ -1817,10 +2000,6 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1817
2000
  c += ` (${column.enum
1818
2001
  .map((value) => "'" + value.replace(/'/g, "''") + "'")
1819
2002
  .join(", ")})`;
1820
- if (column.charset)
1821
- c += ` CHARACTER SET "${column.charset}"`;
1822
- if (column.collation)
1823
- c += ` COLLATE "${column.collation}"`;
1824
2003
  const isMariaDb = this.driver.options.type === "mariadb";
1825
2004
  if (isMariaDb &&
1826
2005
  column.asExpression &&