use super::super::duplicate::Duplicate;
use super::super::model::AlterColumn;
use super::super::trigger::{Direction, Trigger};
use super::super::{new_ref, Plan};
pub(super) fn plan(op: &AlterColumn, latest_schema: &str) -> Plan {
let duplicate = Duplicate {
table: &op.table,
column: &op.column,
column_type: op.column_type.as_deref(),
nullable: op.nullable.unwrap_or(true),
default: None,
};
let mut plan = Plan {
statements: vec![duplicate.add_column()],
..Plan::default()
};
let shadow = duplicate.shadow_name();
let default_up = new_ref(&op.column);
plan.statements.extend(
Trigger {
table: &op.table,
physical_column: &shadow,
direction: Direction::Up,
expression: op.up.as_deref().unwrap_or(&default_up),
latest_schema,
}
.install(),
);
if let Some(down) = &op.down {
plan.statements.extend(
Trigger {
table: &op.table,
physical_column: &op.column,
direction: Direction::Down,
expression: down,
latest_schema,
}
.install(),
);
}
plan.backfill_tables.push(op.table.clone());
plan.promotions.push((op.table.clone(), op.column.clone()));
if let Some(name) = &op.name {
plan.renames
.push((op.table.clone(), op.column.clone(), name.clone()));
}
plan
}