use serde::{Deserialize, Serialize};
use crate::identifier::QualifiedName;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TransactionConstraint {
InTransaction,
OutsideTransaction,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StepKind {
CreateSchema,
DropSchema,
AlterSchemaComment,
CreateTable,
DropTable,
AlterTableSetComment,
AddColumn,
DropColumn,
AlterColumnType,
SetColumnNullable,
SetColumnDefault,
SetColumnComment,
SetColumnIdentity,
SetColumnGenerated,
SetColumnStorage,
SetColumnCompression,
AddConstraint,
AddConstraintNotValid,
ValidateConstraint,
DropConstraint,
SetConstraintComment,
CreateIndex,
CreateIndexConcurrent,
DropIndex,
DropIndexConcurrent,
CreateSequence,
DropSequence,
AlterSequence,
AddCheckForNotNull,
CreateView,
DropView,
CreateMaterializedView,
DropMaterializedView,
RefreshMaterializedView,
AlterViewSetReloption,
CommentOnView,
CreateType,
DropType,
AlterTypeAddValue,
AlterTypeRenameValue,
AlterDomainAddConstraint,
AlterDomainDropConstraint,
AlterDomainSetDefault,
AlterDomainSetNotNull,
AlterTypeAddAttribute,
AlterTypeDropAttribute,
AlterTypeAlterAttributeType,
CommentOnType,
CreateOrReplaceFunction,
DropFunction,
CommentOnFunction,
CreateOrReplaceProcedure,
DropProcedure,
CommentOnProcedure,
CreateExtension,
DropExtension,
AlterExtensionUpdate,
CommentOnExtension,
CreateTrigger,
DropTrigger,
CommentOnTrigger,
AttachPartition,
DetachPartition,
CreateRole,
DropRole,
AlterRole,
GrantRoleMembership,
RevokeRoleMembership,
CommentOnRole,
AlterObjectOwner,
GrantObjectPrivilege,
RevokeObjectPrivilege,
GrantColumnPrivilege,
RevokeColumnPrivilege,
AlterDefaultPrivileges,
CreatePolicy,
DropPolicy,
AlterPolicy,
SetTableRowSecurity,
SetTableForceRowSecurity,
SetTableStorage,
SetIndexStorage,
SetMaterializedViewStorage,
CreatePublication,
DropPublication,
ReplacePublication,
AlterPublicationAddTable,
AlterPublicationDropTable,
AlterPublicationSetTable,
AlterPublicationAddSchema,
AlterPublicationDropSchema,
AlterPublicationSetPublish,
AlterPublicationSetViaRoot,
CommentOnPublication,
CreateSubscription,
DropSubscription,
AlterSubscriptionConnection,
AlterSubscriptionAddPublication,
AlterSubscriptionDropPublication,
AlterSubscriptionSetPublication,
AlterSubscriptionSetOptions,
CommentOnSubscription,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RawStep {
pub step_no: u32,
pub kind: StepKind,
pub destructive: bool,
pub destructive_reason: Option<String>,
pub intent_id: Option<u32>,
pub targets: Vec<QualifiedName>,
pub sql: String,
pub transactional: TransactionConstraint,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn step_kind_serializes_as_snake_case() {
let s = serde_json::to_string(&StepKind::CreateIndexConcurrent).unwrap();
assert_eq!(s, "\"create_index_concurrent\"");
}
#[allow(clippy::too_many_lines)] #[test]
fn step_kind_round_trips_through_serde() {
for kind in [
StepKind::CreateSchema,
StepKind::DropSchema,
StepKind::AlterSchemaComment,
StepKind::CreateTable,
StepKind::DropTable,
StepKind::AlterTableSetComment,
StepKind::AddColumn,
StepKind::DropColumn,
StepKind::AlterColumnType,
StepKind::SetColumnNullable,
StepKind::SetColumnDefault,
StepKind::SetColumnComment,
StepKind::SetColumnIdentity,
StepKind::SetColumnGenerated,
StepKind::SetColumnStorage,
StepKind::SetColumnCompression,
StepKind::AddConstraint,
StepKind::AddConstraintNotValid,
StepKind::ValidateConstraint,
StepKind::DropConstraint,
StepKind::SetConstraintComment,
StepKind::CreateIndex,
StepKind::CreateIndexConcurrent,
StepKind::DropIndex,
StepKind::DropIndexConcurrent,
StepKind::CreateSequence,
StepKind::DropSequence,
StepKind::AlterSequence,
StepKind::AddCheckForNotNull,
StepKind::CreateView,
StepKind::DropView,
StepKind::CreateMaterializedView,
StepKind::DropMaterializedView,
StepKind::RefreshMaterializedView,
StepKind::AlterViewSetReloption,
StepKind::CommentOnView,
StepKind::CreateType,
StepKind::DropType,
StepKind::AlterTypeAddValue,
StepKind::AlterTypeRenameValue,
StepKind::AlterDomainAddConstraint,
StepKind::AlterDomainDropConstraint,
StepKind::AlterDomainSetDefault,
StepKind::AlterDomainSetNotNull,
StepKind::AlterTypeAddAttribute,
StepKind::AlterTypeDropAttribute,
StepKind::AlterTypeAlterAttributeType,
StepKind::CommentOnType,
StepKind::CreateOrReplaceFunction,
StepKind::DropFunction,
StepKind::CommentOnFunction,
StepKind::CreateOrReplaceProcedure,
StepKind::DropProcedure,
StepKind::CommentOnProcedure,
StepKind::CreateExtension,
StepKind::DropExtension,
StepKind::AlterExtensionUpdate,
StepKind::CommentOnExtension,
StepKind::CreateTrigger,
StepKind::DropTrigger,
StepKind::CommentOnTrigger,
StepKind::AttachPartition,
StepKind::DetachPartition,
StepKind::CreateRole,
StepKind::DropRole,
StepKind::AlterRole,
StepKind::GrantRoleMembership,
StepKind::RevokeRoleMembership,
StepKind::CommentOnRole,
StepKind::AlterObjectOwner,
StepKind::GrantObjectPrivilege,
StepKind::RevokeObjectPrivilege,
StepKind::GrantColumnPrivilege,
StepKind::RevokeColumnPrivilege,
StepKind::AlterDefaultPrivileges,
StepKind::CreatePolicy,
StepKind::DropPolicy,
StepKind::AlterPolicy,
StepKind::SetTableRowSecurity,
StepKind::SetTableForceRowSecurity,
StepKind::SetTableStorage,
StepKind::SetIndexStorage,
StepKind::SetMaterializedViewStorage,
StepKind::CreatePublication,
StepKind::DropPublication,
StepKind::ReplacePublication,
StepKind::AlterPublicationAddTable,
StepKind::AlterPublicationDropTable,
StepKind::AlterPublicationSetTable,
StepKind::AlterPublicationAddSchema,
StepKind::AlterPublicationDropSchema,
StepKind::AlterPublicationSetPublish,
StepKind::AlterPublicationSetViaRoot,
StepKind::CommentOnPublication,
StepKind::CreateSubscription,
StepKind::DropSubscription,
StepKind::AlterSubscriptionConnection,
StepKind::AlterSubscriptionAddPublication,
StepKind::AlterSubscriptionDropPublication,
StepKind::AlterSubscriptionSetPublication,
StepKind::AlterSubscriptionSetOptions,
StepKind::CommentOnSubscription,
] {
let json = serde_json::to_string(&kind).unwrap();
let back: StepKind = serde_json::from_str(&json).unwrap();
assert_eq!(kind, back);
}
}
#[test]
fn transaction_constraint_serializes_as_snake_case() {
assert_eq!(
serde_json::to_string(&TransactionConstraint::OutsideTransaction).unwrap(),
"\"outside_transaction\"",
);
}
}