alterTable method

  1. @override
String alterTable(
  1. AlterTable operation
)
override

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');
}