Returns SQL statements to apply a table difference (add/drop/alter columns, indexes, foreign keys).
(diff: TableDifference, safe?: boolean)
| 481 | |
| 482 | /** Returns SQL statements to apply a table difference (add/drop/alter columns, indexes, foreign keys). */ |
| 483 | alterTable(diff: TableDifference, safe?: boolean): string[] { |
| 484 | const ret: string[] = []; |
| 485 | const [schemaName, tableName] = this.splitTableName(diff.name); |
| 486 | |
| 487 | if (this.platform.supportsNativeEnums()) { |
| 488 | const changedNativeEnums: [enumName: string, itemsNew: string[], itemsOld: string[]][] = []; |
| 489 | |
| 490 | for (const { column, changedProperties } of Object.values(diff.changedColumns)) { |
| 491 | if (!column.nativeEnumName) { |
| 492 | continue; |
| 493 | } |
| 494 | |
| 495 | const key = |
| 496 | schemaName && schemaName !== this.platform.getDefaultSchemaName() && !column.nativeEnumName.includes('.') |
| 497 | ? schemaName + '.' + column.nativeEnumName |
| 498 | : column.nativeEnumName; |
| 499 | |
| 500 | if (changedProperties.has('enumItems') && key in diff.fromTable.nativeEnums) { |
| 501 | changedNativeEnums.push([column.nativeEnumName, column.enumItems!, diff.fromTable.nativeEnums[key].items]); |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | Utils.removeDuplicates(changedNativeEnums).forEach(([enumName, itemsNew, itemsOld]) => { |
| 506 | // postgres allows only adding new items |
| 507 | const newItems = itemsNew.filter(val => !itemsOld.includes(val)); |
| 508 | |
| 509 | if (enumName.includes('.')) { |
| 510 | const [enumSchemaName, rawEnumName] = enumName.split('.'); |
| 511 | ret.push( |
| 512 | ...newItems.map(val => this.getAlterNativeEnumSQL(rawEnumName, enumSchemaName, val, itemsNew, itemsOld)), |
| 513 | ); |
| 514 | return; |
| 515 | } |
| 516 | |
| 517 | ret.push(...newItems.map(val => this.getAlterNativeEnumSQL(enumName, schemaName, val, itemsNew, itemsOld))); |
| 518 | }); |
| 519 | } |
| 520 | |
| 521 | for (const index of Object.values(diff.removedIndexes)) { |
| 522 | ret.push(this.dropIndex(diff.name, index)); |
| 523 | } |
| 524 | |
| 525 | for (const index of Object.values(diff.changedIndexes)) { |
| 526 | ret.push(this.dropIndex(diff.name, index)); |
| 527 | } |
| 528 | |
| 529 | for (const check of Object.values(diff.removedChecks)) { |
| 530 | ret.push(this.dropConstraint(diff.name, check.name)); |
| 531 | } |
| 532 | |
| 533 | for (const check of Object.values(diff.changedChecks)) { |
| 534 | ret.push(this.dropConstraint(diff.name, check.name)); |
| 535 | } |
| 536 | |
| 537 | if (!safe) { |
| 538 | for (const trigger of Object.values(diff.removedTriggers)) { |
| 539 | ret.push(this.dropTrigger(diff.toTable, trigger)); |
| 540 | } |
nothing calls this directly
no test coverage detected