alterTable method
Expresses every change operation carries, column changes, checks,
and this table's index changes.
Implementation
@override
String alterTable(AlterTable operation) {
final diff = TableDiff.of(operation);
final table = escapeName(operation.tableName);
final statements = <String>[
...operation.renamedColumns.entries.map(
(entry) => '''
ALTER TABLE $table RENAME COLUMN ${escapeName(entry.key)} TO ${escapeName(entry.value)};''',
),
for (final column in diff.droppedColumns)
'ALTER TABLE $table DROP COLUMN ${escapeName(column.name)};',
for (final column in diff.addedColumns)
'ALTER TABLE $table ADD COLUMN ${_columnDefinition(column)};',
];
for (final (old, new_) in diff.alteredColumns) {
statements.addAll(_alterColumn(operation.tableName, old, new_));
}
statements.addAll([
for (final name in {
...diff.droppedChecks.keys,
...diff.changedChecks.keys,
})
'ALTER TABLE $table DROP CONSTRAINT ${escapeName(name)};',
...{
...diff.addedChecks,
for (final changed in diff.changedChecks.entries)
changed.key: changed.value.$2,
}.entries.map(
(entry) => '''
ALTER TABLE $table ADD CONSTRAINT ${escapeName(entry.key)} CHECK (${entry.value});''',
),
for (final index in diff.droppedIndexes) dropIndex(index.name),
for (final index in diff.addedIndexes) createIndex(index),
]);
return statements.join('\n');
}