typeorm 0.3.6-dev.1197d1d → 0.3.6-dev.49cbe23

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 (228) 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/data-source/DataSourceOptions.d.ts +2 -1
  7. package/browser/data-source/DataSourceOptions.js.map +1 -1
  8. package/browser/decorator/Index.js +1 -0
  9. package/browser/decorator/Index.js.map +1 -1
  10. package/browser/decorator/columns/PrimaryColumn.js +4 -1
  11. package/browser/decorator/columns/PrimaryColumn.js.map +1 -1
  12. package/browser/decorator/options/ColumnOptions.d.ts +2 -2
  13. package/browser/decorator/options/ColumnOptions.js.map +1 -1
  14. package/browser/decorator/options/IndexOptions.d.ts +8 -0
  15. package/browser/decorator/options/IndexOptions.js.map +1 -1
  16. package/browser/driver/DriverFactory.js +4 -0
  17. package/browser/driver/DriverFactory.js.map +1 -1
  18. package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
  19. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  20. package/browser/driver/cockroachdb/CockroachQueryRunner.js +133 -11
  21. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  22. package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
  23. package/browser/driver/mysql/MysqlDriver.js +94 -23
  24. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  25. package/browser/driver/mysql/MysqlQueryRunner.js +203 -24
  26. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  27. package/browser/driver/oracle/OracleDriver.js +79 -15
  28. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  29. package/browser/driver/oracle/OracleQueryRunner.js +118 -21
  30. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  31. package/browser/driver/postgres/PostgresDriver.js +95 -18
  32. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  33. package/browser/driver/postgres/PostgresQueryRunner.js +60 -38
  34. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  35. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  36. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js +3 -0
  37. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  38. package/browser/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  39. package/browser/driver/spanner/SpannerConnectionOptions.js +3 -0
  40. package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  41. package/browser/driver/spanner/SpannerDriver.d.ts +241 -0
  42. package/browser/driver/spanner/SpannerDriver.js +604 -0
  43. package/browser/driver/spanner/SpannerDriver.js.map +1 -0
  44. package/browser/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  45. package/browser/driver/spanner/SpannerQueryRunner.js +1445 -0
  46. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -0
  47. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
  48. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  49. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
  50. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  51. package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  52. package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
  53. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  54. package/browser/driver/sqlserver/SqlServerQueryRunner.js +153 -17
  55. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  56. package/browser/driver/types/ColumnTypes.d.ts +1 -1
  57. package/browser/driver/types/ColumnTypes.js.map +1 -1
  58. package/browser/driver/types/DatabaseType.d.ts +1 -1
  59. package/browser/driver/types/DatabaseType.js.map +1 -1
  60. package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  61. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  62. package/browser/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  63. package/browser/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  64. package/browser/entity-schema/EntitySchemaTransformer.js +1 -0
  65. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  66. package/browser/find-options/FindOneOptions.d.ts +1 -1
  67. package/browser/find-options/FindOneOptions.js.map +1 -1
  68. package/browser/find-options/FindOptionsUtils.d.ts +2 -1
  69. package/browser/find-options/FindOptionsUtils.js +2 -1
  70. package/browser/find-options/FindOptionsUtils.js.map +1 -1
  71. package/browser/logger/AdvancedConsoleLogger.d.ts +1 -1
  72. package/browser/logger/AdvancedConsoleLogger.js +1 -1
  73. package/browser/logger/AdvancedConsoleLogger.js.map +1 -1
  74. package/browser/metadata/ColumnMetadata.d.ts +2 -2
  75. package/browser/metadata/ColumnMetadata.js.map +1 -1
  76. package/browser/metadata/IndexMetadata.d.ts +8 -0
  77. package/browser/metadata/IndexMetadata.js +9 -0
  78. package/browser/metadata/IndexMetadata.js.map +1 -1
  79. package/browser/metadata-args/IndexMetadataArgs.d.ts +8 -0
  80. package/browser/metadata-args/IndexMetadataArgs.js.map +1 -1
  81. package/browser/metadata-builder/EntityMetadataBuilder.js +13 -6
  82. package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  83. package/browser/metadata-builder/EntityMetadataValidator.js +8 -0
  84. package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
  85. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
  86. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  87. package/browser/platform/PlatformTools.js +5 -0
  88. package/browser/platform/PlatformTools.js.map +1 -1
  89. package/browser/query-builder/InsertQueryBuilder.js +15 -3
  90. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  91. package/browser/query-builder/QueryExpressionMap.d.ts +1 -1
  92. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  93. package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
  94. package/browser/query-builder/SelectQueryBuilder.js +25 -4
  95. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  96. package/browser/query-builder/UpdateQueryBuilder.js +18 -7
  97. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  98. package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
  99. package/browser/query-runner/BaseQueryRunner.js +25 -1
  100. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  101. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  102. package/browser/schema-builder/RdbmsSchemaBuilder.js +26 -6
  103. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  104. package/browser/schema-builder/options/TableColumnOptions.d.ts +2 -2
  105. package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
  106. package/browser/schema-builder/options/TableIndexOptions.d.ts +8 -0
  107. package/browser/schema-builder/options/TableIndexOptions.js.map +1 -1
  108. package/browser/schema-builder/table/TableColumn.d.ts +2 -2
  109. package/browser/schema-builder/table/TableColumn.js.map +1 -1
  110. package/browser/schema-builder/table/TableIndex.d.ts +8 -0
  111. package/browser/schema-builder/table/TableIndex.js +3 -0
  112. package/browser/schema-builder/table/TableIndex.js.map +1 -1
  113. package/cache/DbQueryResultCache.js +9 -1
  114. package/cache/DbQueryResultCache.js.map +1 -1
  115. package/cache/RedisQueryResultCache.js +3 -0
  116. package/cache/RedisQueryResultCache.js.map +1 -1
  117. package/commands/InitCommand.js +1 -1
  118. package/commands/InitCommand.js.map +1 -1
  119. package/commands/MigrationGenerateCommand.js +3 -2
  120. package/commands/MigrationGenerateCommand.js.map +1 -1
  121. package/data-source/DataSourceOptions.d.ts +2 -1
  122. package/data-source/DataSourceOptions.js.map +1 -1
  123. package/decorator/Index.js +1 -0
  124. package/decorator/Index.js.map +1 -1
  125. package/decorator/columns/PrimaryColumn.js +4 -1
  126. package/decorator/columns/PrimaryColumn.js.map +1 -1
  127. package/decorator/options/ColumnOptions.d.ts +2 -2
  128. package/decorator/options/ColumnOptions.js.map +1 -1
  129. package/decorator/options/IndexOptions.d.ts +8 -0
  130. package/decorator/options/IndexOptions.js.map +1 -1
  131. package/driver/DriverFactory.js +4 -0
  132. package/driver/DriverFactory.js.map +1 -1
  133. package/driver/cockroachdb/CockroachDriver.js +4 -1
  134. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  135. package/driver/cockroachdb/CockroachQueryRunner.js +133 -11
  136. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  137. package/driver/mysql/MysqlDriver.d.ts +1 -0
  138. package/driver/mysql/MysqlDriver.js +94 -23
  139. package/driver/mysql/MysqlDriver.js.map +1 -1
  140. package/driver/mysql/MysqlQueryRunner.js +203 -24
  141. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  142. package/driver/oracle/OracleDriver.js +79 -15
  143. package/driver/oracle/OracleDriver.js.map +1 -1
  144. package/driver/oracle/OracleQueryRunner.js +118 -21
  145. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  146. package/driver/postgres/PostgresDriver.js +95 -18
  147. package/driver/postgres/PostgresDriver.js.map +1 -1
  148. package/driver/postgres/PostgresQueryRunner.js +60 -38
  149. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  150. package/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  151. package/driver/spanner/SpannerConnectionCredentialsOptions.js +4 -0
  152. package/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  153. package/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  154. package/driver/spanner/SpannerConnectionOptions.js +4 -0
  155. package/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  156. package/driver/spanner/SpannerDriver.d.ts +241 -0
  157. package/driver/spanner/SpannerDriver.js +608 -0
  158. package/driver/spanner/SpannerDriver.js.map +1 -0
  159. package/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  160. package/driver/spanner/SpannerQueryRunner.js +1449 -0
  161. package/driver/spanner/SpannerQueryRunner.js.map +1 -0
  162. package/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
  163. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  164. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
  165. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  166. package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  167. package/driver/sqlserver/SqlServerDriver.js +99 -26
  168. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  169. package/driver/sqlserver/SqlServerQueryRunner.js +153 -17
  170. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  171. package/driver/types/ColumnTypes.d.ts +1 -1
  172. package/driver/types/ColumnTypes.js.map +1 -1
  173. package/driver/types/DatabaseType.d.ts +1 -1
  174. package/driver/types/DatabaseType.js.map +1 -1
  175. package/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  176. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  177. package/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  178. package/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  179. package/entity-schema/EntitySchemaTransformer.js +1 -0
  180. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  181. package/find-options/FindOneOptions.d.ts +1 -1
  182. package/find-options/FindOneOptions.js.map +1 -1
  183. package/find-options/FindOptionsUtils.d.ts +2 -1
  184. package/find-options/FindOptionsUtils.js +2 -1
  185. package/find-options/FindOptionsUtils.js.map +1 -1
  186. package/logger/AdvancedConsoleLogger.d.ts +1 -1
  187. package/logger/AdvancedConsoleLogger.js +1 -1
  188. package/logger/AdvancedConsoleLogger.js.map +1 -1
  189. package/metadata/ColumnMetadata.d.ts +2 -2
  190. package/metadata/ColumnMetadata.js.map +1 -1
  191. package/metadata/IndexMetadata.d.ts +8 -0
  192. package/metadata/IndexMetadata.js +9 -0
  193. package/metadata/IndexMetadata.js.map +1 -1
  194. package/metadata-args/IndexMetadataArgs.d.ts +8 -0
  195. package/metadata-args/IndexMetadataArgs.js.map +1 -1
  196. package/metadata-builder/EntityMetadataBuilder.js +13 -6
  197. package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  198. package/metadata-builder/EntityMetadataValidator.js +8 -0
  199. package/metadata-builder/EntityMetadataValidator.js.map +1 -1
  200. package/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
  201. package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  202. package/package.json +1 -1
  203. package/platform/PlatformTools.js +5 -0
  204. package/platform/PlatformTools.js.map +1 -1
  205. package/query-builder/InsertQueryBuilder.js +15 -3
  206. package/query-builder/InsertQueryBuilder.js.map +1 -1
  207. package/query-builder/QueryExpressionMap.d.ts +1 -1
  208. package/query-builder/QueryExpressionMap.js.map +1 -1
  209. package/query-builder/SelectQueryBuilder.d.ts +1 -1
  210. package/query-builder/SelectQueryBuilder.js +25 -4
  211. package/query-builder/SelectQueryBuilder.js.map +1 -1
  212. package/query-builder/UpdateQueryBuilder.js +18 -7
  213. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  214. package/query-runner/BaseQueryRunner.d.ts +10 -0
  215. package/query-runner/BaseQueryRunner.js +25 -1
  216. package/query-runner/BaseQueryRunner.js.map +1 -1
  217. package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  218. package/schema-builder/RdbmsSchemaBuilder.js +26 -6
  219. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  220. package/schema-builder/options/TableColumnOptions.d.ts +2 -2
  221. package/schema-builder/options/TableColumnOptions.js.map +1 -1
  222. package/schema-builder/options/TableIndexOptions.d.ts +8 -0
  223. package/schema-builder/options/TableIndexOptions.js.map +1 -1
  224. package/schema-builder/table/TableColumn.d.ts +2 -2
  225. package/schema-builder/table/TableColumn.js.map +1 -1
  226. package/schema-builder/table/TableIndex.d.ts +8 -0
  227. package/schema-builder/table/TableIndex.js +3 -0
  228. package/schema-builder/table/TableIndex.js.map +1 -1
@@ -315,6 +315,26 @@ export class MysqlQueryRunner extends BaseQueryRunner {
315
315
  // createTable does not need separate method to create foreign keys, because it create fk's in the same query with table creation.
316
316
  if (createForeignKeys)
317
317
  table.foreignKeys.forEach((foreignKey) => downQueries.push(this.dropForeignKeySql(table, foreignKey)));
318
+ // if table has column with generated type, we must add the expression to the metadata table
319
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
320
+ for (const column of generatedColumns) {
321
+ const currentDatabase = await this.getCurrentDatabase();
322
+ const insertQuery = this.insertTypeormMetadataSql({
323
+ schema: currentDatabase,
324
+ table: table.name,
325
+ type: MetadataTableType.GENERATED_COLUMN,
326
+ name: column.name,
327
+ value: column.asExpression,
328
+ });
329
+ const deleteQuery = this.deleteTypeormMetadataSql({
330
+ schema: currentDatabase,
331
+ table: table.name,
332
+ type: MetadataTableType.GENERATED_COLUMN,
333
+ name: column.name,
334
+ });
335
+ upQueries.push(insertQuery);
336
+ downQueries.push(deleteQuery);
337
+ }
318
338
  return this.executeQueries(upQueries, downQueries);
319
339
  }
320
340
  /**
@@ -339,6 +359,26 @@ export class MysqlQueryRunner extends BaseQueryRunner {
339
359
  table.indices.forEach((index) => upQueries.push(this.dropIndexSql(table, index)));
340
360
  upQueries.push(this.dropTableSql(table));
341
361
  downQueries.push(this.createTableSql(table, createForeignKeys));
362
+ // if table had columns with generated type, we must remove the expression from the metadata table
363
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
364
+ for (const column of generatedColumns) {
365
+ const currentDatabase = await this.getCurrentDatabase();
366
+ const deleteQuery = this.deleteTypeormMetadataSql({
367
+ schema: currentDatabase,
368
+ table: table.name,
369
+ type: MetadataTableType.GENERATED_COLUMN,
370
+ name: column.name,
371
+ });
372
+ const insertQuery = this.insertTypeormMetadataSql({
373
+ schema: currentDatabase,
374
+ table: table.name,
375
+ type: MetadataTableType.GENERATED_COLUMN,
376
+ name: column.name,
377
+ value: column.asExpression,
378
+ });
379
+ upQueries.push(deleteQuery);
380
+ downQueries.push(insertQuery);
381
+ }
342
382
  await this.executeQueries(upQueries, downQueries);
343
383
  }
344
384
  /**
@@ -484,6 +524,24 @@ export class MysqlQueryRunner extends BaseQueryRunner {
484
524
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${column.name}\` ${this.buildCreateColumnSql(nonGeneratedColumn, true)}`));
485
525
  }
486
526
  }
527
+ if (column.generatedType && column.asExpression) {
528
+ const currentDatabase = await this.getCurrentDatabase();
529
+ const insertQuery = this.insertTypeormMetadataSql({
530
+ schema: currentDatabase,
531
+ table: table.name,
532
+ type: MetadataTableType.GENERATED_COLUMN,
533
+ name: column.name,
534
+ value: column.asExpression,
535
+ });
536
+ const deleteQuery = this.deleteTypeormMetadataSql({
537
+ schema: currentDatabase,
538
+ table: table.name,
539
+ type: MetadataTableType.GENERATED_COLUMN,
540
+ name: column.name,
541
+ });
542
+ upQueries.push(insertQuery);
543
+ downQueries.push(deleteQuery);
544
+ }
487
545
  // create column index
488
546
  const columnIndex = clonedTable.indices.find((index) => index.columnNames.length === 1 &&
489
547
  index.columnNames[0] === column.name);
@@ -560,7 +618,12 @@ export class MysqlQueryRunner extends BaseQueryRunner {
560
618
  newColumn.generationStrategy !== "uuid") ||
561
619
  oldColumn.type !== newColumn.type ||
562
620
  oldColumn.length !== newColumn.length ||
563
- oldColumn.generatedType !== newColumn.generatedType) {
621
+ (oldColumn.generatedType &&
622
+ newColumn.generatedType &&
623
+ oldColumn.generatedType !== newColumn.generatedType) ||
624
+ (!oldColumn.generatedType &&
625
+ newColumn.generatedType === "VIRTUAL") ||
626
+ (oldColumn.generatedType === "VIRTUAL" && !newColumn.generatedType)) {
564
627
  await this.dropColumn(table, oldColumn);
565
628
  await this.addColumn(table, newColumn);
566
629
  // update cloned table
@@ -636,6 +699,77 @@ export class MysqlQueryRunner extends BaseQueryRunner {
636
699
  if (this.isColumnChanged(oldColumn, newColumn, true, true)) {
637
700
  upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${oldColumn.name}\` ${this.buildCreateColumnSql(newColumn, true)}`));
638
701
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${newColumn.name}\` ${this.buildCreateColumnSql(oldColumn, true)}`));
702
+ if (oldColumn.generatedType && !newColumn.generatedType) {
703
+ // if column changed from generated to non-generated, delete record from typeorm metadata
704
+ const currentDatabase = await this.getCurrentDatabase();
705
+ const deleteQuery = this.deleteTypeormMetadataSql({
706
+ schema: currentDatabase,
707
+ table: table.name,
708
+ type: MetadataTableType.GENERATED_COLUMN,
709
+ name: oldColumn.name,
710
+ });
711
+ const insertQuery = this.insertTypeormMetadataSql({
712
+ schema: currentDatabase,
713
+ table: table.name,
714
+ type: MetadataTableType.GENERATED_COLUMN,
715
+ name: oldColumn.name,
716
+ value: oldColumn.asExpression,
717
+ });
718
+ upQueries.push(deleteQuery);
719
+ downQueries.push(insertQuery);
720
+ }
721
+ else if (!oldColumn.generatedType &&
722
+ newColumn.generatedType) {
723
+ // if column changed from non-generated to generated, insert record into typeorm metadata
724
+ const currentDatabase = await this.getCurrentDatabase();
725
+ const insertQuery = this.insertTypeormMetadataSql({
726
+ schema: currentDatabase,
727
+ table: table.name,
728
+ type: MetadataTableType.GENERATED_COLUMN,
729
+ name: newColumn.name,
730
+ value: newColumn.asExpression,
731
+ });
732
+ const deleteQuery = this.deleteTypeormMetadataSql({
733
+ schema: currentDatabase,
734
+ table: table.name,
735
+ type: MetadataTableType.GENERATED_COLUMN,
736
+ name: newColumn.name,
737
+ });
738
+ upQueries.push(insertQuery);
739
+ downQueries.push(deleteQuery);
740
+ }
741
+ else if (oldColumn.asExpression !== newColumn.asExpression) {
742
+ // if only expression changed, just update it in typeorm_metadata table
743
+ const currentDatabase = await this.getCurrentDatabase();
744
+ const updateQuery = this.connection
745
+ .createQueryBuilder()
746
+ .update(this.getTypeormMetadataTableName())
747
+ .set({ value: newColumn.asExpression })
748
+ .where("`type` = :type", {
749
+ type: MetadataTableType.GENERATED_COLUMN,
750
+ })
751
+ .andWhere("`name` = :name", { name: oldColumn.name })
752
+ .andWhere("`schema` = :schema", {
753
+ schema: currentDatabase,
754
+ })
755
+ .andWhere("`table` = :table", { table: table.name })
756
+ .getQueryAndParameters();
757
+ const revertUpdateQuery = this.connection
758
+ .createQueryBuilder()
759
+ .update(this.getTypeormMetadataTableName())
760
+ .set({ value: oldColumn.asExpression })
761
+ .where("`type` = :type", {
762
+ type: MetadataTableType.GENERATED_COLUMN,
763
+ })
764
+ .andWhere("`name` = :name", { name: newColumn.name })
765
+ .andWhere("`schema` = :schema", {
766
+ schema: currentDatabase,
767
+ })
768
+ .andWhere("`table` = :table", { table: table.name })
769
+ .getQueryAndParameters();
770
+ upQueries.push(new Query(updateQuery[0], updateQuery[1]));
771
+ downQueries.push(new Query(revertUpdateQuery[0], revertUpdateQuery[1]));
772
+ }
639
773
  }
640
774
  if (newColumn.isPrimary !== oldColumn.isPrimary) {
641
775
  // if table have generated column, we must drop AUTO_INCREMENT before changing primary constraints.
@@ -814,6 +948,24 @@ export class MysqlQueryRunner extends BaseQueryRunner {
814
948
  }
815
949
  upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN \`${column.name}\``));
816
950
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(column, true)}`));
951
+ if (column.generatedType && column.asExpression) {
952
+ const currentDatabase = await this.getCurrentDatabase();
953
+ const deleteQuery = this.deleteTypeormMetadataSql({
954
+ schema: currentDatabase,
955
+ table: table.name,
956
+ type: MetadataTableType.GENERATED_COLUMN,
957
+ name: column.name,
958
+ });
959
+ const insertQuery = this.insertTypeormMetadataSql({
960
+ schema: currentDatabase,
961
+ table: table.name,
962
+ type: MetadataTableType.GENERATED_COLUMN,
963
+ name: column.name,
964
+ value: column.asExpression,
965
+ });
966
+ upQueries.push(deleteQuery);
967
+ downQueries.push(insertQuery);
968
+ }
817
969
  await this.executeQueries(upQueries, downQueries);
818
970
  clonedTable.removeColumn(column);
819
971
  this.replaceCachedTable(table, clonedTable);
@@ -1349,11 +1501,12 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1349
1501
  table.database = dbTable["TABLE_SCHEMA"];
1350
1502
  table.name = this.driver.buildTableName(dbTable["TABLE_NAME"], undefined, db);
1351
1503
  // create columns from the loaded columns
1352
- table.columns = dbColumns
1353
- .filter((dbColumn) => dbColumn["TABLE_NAME"] === dbTable["TABLE_NAME"] &&
1504
+ table.columns = await Promise.all(dbColumns
1505
+ .filter((dbColumn) => dbColumn["TABLE_NAME"] ===
1506
+ dbTable["TABLE_NAME"] &&
1354
1507
  dbColumn["TABLE_SCHEMA"] ===
1355
1508
  dbTable["TABLE_SCHEMA"])
1356
- .map((dbColumn) => {
1509
+ .map(async (dbColumn) => {
1357
1510
  const columnUniqueIndices = dbIndices.filter((dbIndex) => {
1358
1511
  return (dbIndex["TABLE_NAME"] ===
1359
1512
  dbTable["TABLE_NAME"] &&
@@ -1361,7 +1514,8 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1361
1514
  dbTable["TABLE_SCHEMA"] &&
1362
1515
  dbIndex["COLUMN_NAME"] ===
1363
1516
  dbColumn["COLUMN_NAME"] &&
1364
- parseInt(dbIndex["NON_UNIQUE"], 10) === 0);
1517
+ parseInt(dbIndex["NON_UNIQUE"], 10) ===
1518
+ 0);
1365
1519
  });
1366
1520
  const tableMetadata = this.connection.entityMetadatas.find((metadata) => this.getTablePath(table) ===
1367
1521
  this.getTablePath(metadata));
@@ -1382,9 +1536,11 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1382
1536
  });
1383
1537
  const tableColumn = new TableColumn();
1384
1538
  tableColumn.name = dbColumn["COLUMN_NAME"];
1385
- tableColumn.type = dbColumn["DATA_TYPE"].toLowerCase();
1539
+ tableColumn.type =
1540
+ dbColumn["DATA_TYPE"].toLowerCase();
1386
1541
  tableColumn.zerofill =
1387
- dbColumn["COLUMN_TYPE"].indexOf("zerofill") !== -1;
1542
+ dbColumn["COLUMN_TYPE"].indexOf("zerofill") !==
1543
+ -1;
1388
1544
  tableColumn.unsigned = tableColumn.zerofill
1389
1545
  ? true
1390
1546
  : dbColumn["COLUMN_TYPE"].indexOf("unsigned") !== -1;
@@ -1398,7 +1554,8 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1398
1554
  }
1399
1555
  if (dbColumn["COLUMN_DEFAULT"] === null ||
1400
1556
  dbColumn["COLUMN_DEFAULT"] === undefined ||
1401
- (isMariaDb && dbColumn["COLUMN_DEFAULT"] === "NULL")) {
1557
+ (isMariaDb &&
1558
+ dbColumn["COLUMN_DEFAULT"] === "NULL")) {
1402
1559
  tableColumn.default = undefined;
1403
1560
  }
1404
1561
  else if (/^CURRENT_TIMESTAMP(\([0-9]*\))?$/i.test(dbColumn["COLUMN_DEFAULT"])) {
@@ -1420,23 +1577,41 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1420
1577
  // New versions of MariaDB return expressions in lowercase. We need to set it in
1421
1578
  // uppercase so the comparison in MysqlDriver#compareExtraValues does not fail.
1422
1579
  tableColumn.onUpdate = dbColumn["EXTRA"]
1423
- .substring(dbColumn["EXTRA"].indexOf("on update") + 10)
1580
+ .substring(dbColumn["EXTRA"].indexOf("on update") +
1581
+ 10)
1424
1582
  .toUpperCase();
1425
1583
  }
1426
1584
  if (dbColumn["GENERATION_EXPRESSION"]) {
1427
- tableColumn.asExpression =
1428
- dbColumn["GENERATION_EXPRESSION"];
1429
1585
  tableColumn.generatedType =
1430
1586
  dbColumn["EXTRA"].indexOf("VIRTUAL") !== -1
1431
1587
  ? "VIRTUAL"
1432
1588
  : "STORED";
1589
+ // We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
1590
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
1591
+ schema: dbTable["TABLE_SCHEMA"],
1592
+ table: dbTable["TABLE_NAME"],
1593
+ type: MetadataTableType.GENERATED_COLUMN,
1594
+ name: tableColumn.name,
1595
+ });
1596
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
1597
+ if (results[0] && results[0].value) {
1598
+ tableColumn.asExpression = results[0].value;
1599
+ }
1600
+ else {
1601
+ tableColumn.asExpression = "";
1602
+ }
1433
1603
  }
1434
1604
  tableColumn.isUnique =
1435
1605
  columnUniqueIndices.length > 0 &&
1436
1606
  !hasIgnoredIndex &&
1437
1607
  !isConstraintComposite;
1438
- tableColumn.isNullable =
1439
- dbColumn["IS_NULLABLE"] === "YES";
1608
+ if (isMariaDb && tableColumn.generatedType) {
1609
+ // do nothing - MariaDB does not support NULL/NOT NULL expressions for generated columns
1610
+ }
1611
+ else {
1612
+ tableColumn.isNullable =
1613
+ dbColumn["IS_NULLABLE"] === "YES";
1614
+ }
1440
1615
  tableColumn.isPrimary = dbPrimaryKeys.some((dbPrimaryKey) => {
1441
1616
  return (dbPrimaryKey["TABLE_NAME"] ===
1442
1617
  dbColumn["TABLE_NAME"] &&
@@ -1446,11 +1621,13 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1446
1621
  dbColumn["COLUMN_NAME"]);
1447
1622
  });
1448
1623
  tableColumn.isGenerated =
1449
- dbColumn["EXTRA"].indexOf("auto_increment") !== -1;
1624
+ dbColumn["EXTRA"].indexOf("auto_increment") !==
1625
+ -1;
1450
1626
  if (tableColumn.isGenerated)
1451
1627
  tableColumn.generationStrategy = "increment";
1452
1628
  tableColumn.comment =
1453
- typeof dbColumn["COLUMN_COMMENT"] === "string" &&
1629
+ typeof dbColumn["COLUMN_COMMENT"] ===
1630
+ "string" &&
1454
1631
  dbColumn["COLUMN_COMMENT"].length === 0
1455
1632
  ? undefined
1456
1633
  : dbColumn["COLUMN_COMMENT"];
@@ -1462,16 +1639,18 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1462
1639
  : dbColumn["CHARACTER_SET_NAME"];
1463
1640
  if (dbColumn["COLLATION_NAME"])
1464
1641
  tableColumn.collation =
1465
- dbColumn["COLLATION_NAME"] === defaultCollation
1642
+ dbColumn["COLLATION_NAME"] ===
1643
+ defaultCollation
1466
1644
  ? undefined
1467
1645
  : dbColumn["COLLATION_NAME"];
1468
1646
  // check only columns that have length property
1469
1647
  if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
1470
1648
  dbColumn["CHARACTER_MAXIMUM_LENGTH"]) {
1471
1649
  const length = dbColumn["CHARACTER_MAXIMUM_LENGTH"].toString();
1472
- tableColumn.length = !this.isDefaultColumnLength(table, tableColumn, length)
1473
- ? length
1474
- : "";
1650
+ tableColumn.length =
1651
+ !this.isDefaultColumnLength(table, tableColumn, length)
1652
+ ? length
1653
+ : "";
1475
1654
  }
1476
1655
  if (tableColumn.type === "decimal" ||
1477
1656
  tableColumn.type === "double" ||
@@ -1504,7 +1683,7 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1504
1683
  tableColumn.precision = parseInt(dbColumn["DATETIME_PRECISION"]);
1505
1684
  }
1506
1685
  return tableColumn;
1507
- });
1686
+ }));
1508
1687
  // find foreign key constraints of table, group them by constraint name and build TableForeignKey.
1509
1688
  const tableForeignKeyConstraints = OrmUtils.uniq(dbForeignKeys.filter((dbForeignKey) => {
1510
1689
  return (dbForeignKey["TABLE_NAME"] ===
@@ -1801,6 +1980,10 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1801
1980
  else {
1802
1981
  c = `\`${column.name}\` ${this.connection.driver.createFullType(column)}`;
1803
1982
  }
1983
+ if (column.charset)
1984
+ c += ` CHARACTER SET "${column.charset}"`;
1985
+ if (column.collation)
1986
+ c += ` COLLATE "${column.collation}"`;
1804
1987
  if (column.asExpression)
1805
1988
  c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
1806
1989
  // if you specify ZEROFILL for a numeric column, MySQL automatically adds the UNSIGNED attribute to that column.
@@ -1814,10 +1997,6 @@ export class MysqlQueryRunner extends BaseQueryRunner {
1814
1997
  c += ` (${column.enum
1815
1998
  .map((value) => "'" + value.replace(/'/g, "''") + "'")
1816
1999
  .join(", ")})`;
1817
- if (column.charset)
1818
- c += ` CHARACTER SET "${column.charset}"`;
1819
- if (column.collation)
1820
- c += ` COLLATE "${column.collation}"`;
1821
2000
  const isMariaDb = this.driver.options.type === "mariadb";
1822
2001
  if (isMariaDb &&
1823
2002
  column.asExpression &&