use serde::{Deserialize, Serialize};
use super::{
default_true, AutoIncrementKind, ColumnDeclaration, ColumnDef, ColumnType, DeferredSQLError,
EventEnableMode, Expr, ForeignKey, IdentitySequenceDeclaration, PartitionBound,
RelationPersistence, RoleSpecification, SequenceDeclaration, TableCheck, TableKeyConstraint,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlterTableStmt {
pub table: String,
pub qualifier: String,
pub if_exists: bool,
#[serde(default = "default_true")]
pub recurse: bool,
pub actions: Vec<AlterTableAction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[expect(
clippy::large_enum_variant,
reason = "preserves the stable AST serde shape"
)]
pub enum AlterTableAction {
AddInheritance {
parent: String,
},
DropInheritance {
parent: String,
},
AttachPartition {
partition: String,
bound: PartitionBound,
},
DetachPartition {
partition: String,
concurrently: bool,
finalize: bool,
},
AddColumn {
column: ColumnDef,
#[serde(default)]
checks: Vec<TableCheck>,
#[serde(default)]
foreign_keys: Vec<ForeignKey>,
#[serde(default)]
key_constraints: Vec<TableKeyConstraint>,
if_not_exists: bool,
#[serde(default)]
declaration: ColumnDeclaration,
},
AddKeyConstraint {
constraint: TableKeyConstraint,
},
AddCheckConstraint {
constraint: TableCheck,
},
AddForeignKeyConstraint {
constraint: ForeignKey,
},
AddNotNullConstraint {
name: Option<String>,
column: String,
validated: bool,
no_inherit: bool,
},
ValidateConstraint {
name: String,
},
AlterConstraint {
name: String,
enforceability: Option<bool>,
deferrability: Option<(bool, bool)>,
no_inherit: Option<bool>,
},
DropConstraint {
name: String,
if_exists: bool,
cascade: bool,
},
DropColumn {
name: String,
if_exists: bool,
cascade: bool,
},
RenameColumn {
from: String,
to: String,
},
RenameTable {
to: String,
},
RenameTrigger {
from: String,
to: String,
},
RenameConstraint {
from: String,
to: String,
},
RenameRule {
from: String,
to: String,
},
SetPersistence {
persistence: RelationPersistence,
},
ChangeOwner {
owner: RoleSpecification,
},
SetSchema {
schema: String,
},
SetTriggerEnableMode {
name: Option<String>,
user_only: bool,
mode: EventEnableMode,
},
SetRuleEnableMode {
name: String,
mode: EventEnableMode,
},
SetDefault {
name: String,
default: Expr,
},
DropDefault {
name: String,
},
SetExpression {
name: String,
expression: Expr,
},
DropExpression {
name: String,
if_exists: bool,
},
SetNotNull {
name: String,
},
DropNotNull {
name: String,
},
AlterColumnType {
name: String,
ty: ColumnType,
#[serde(default, skip_serializing_if = "Option::is_none")]
using: Option<Expr>,
},
AddIdentity {
name: String,
kind: AutoIncrementKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
declaration: Option<Box<IdentitySequenceDeclaration>>,
},
SetIdentity {
name: String,
kind: Option<AutoIncrementKind>,
repeated_kind: bool,
#[serde(default)]
sequence: SequenceDeclaration,
#[serde(default, skip_serializing_if = "Option::is_none")]
error: Option<DeferredSQLError>,
},
DropIdentity {
name: String,
if_exists: bool,
},
}