Skip to main content

safe_migrate/analysis/
mutations.rs

1// FILE: src/analysis/mutations.rs
2use crate::analysis::expr_ir::ExprIr;
3use crate::analysis::facts::{SearchPathTarget, TableConstraintFact};
4use crate::ast::identifiers::ObjectId;
5use crate::model::types::TypeKind;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum PersistenceMutation {
9    Permanent,
10    Temporary,
11    Unlogged,
12}
13
14#[derive(Clone, Debug, PartialEq)]
15pub enum Mutation {
16    CreateSchema(CreateSchemaMutation),
17    DropSchema(DropSchemaMutation),
18    CreateTable(CreateTable),
19    CreateView(CreateView),
20    CreateMaterializedView(CreateMaterializedView),
21    RefreshMaterializedView(RefreshMaterializedViewMutation),
22    CreateIndex(CreateIndex),
23    CreatePolicy(CreatePolicyMutation),
24    DropPolicy(DropPolicyMutation),
25    CreateTrigger(CreateTriggerMutation),
26    DropTrigger(DropTriggerMutation),
27    AlterTable(AlterTable),
28    CreateType(CreateTypeMutation),
29    AlterType(AlterTypeMutation),
30    CreateDomain(CreateDomainMutation),
31    AlterDomain(AlterDomainMutation),
32    DropDomain(DropDomainMutation),
33    DropType(DropTypeMutation),
34    CreateSequence(CreateSequenceMutation),
35    AlterSequence(AlterSequenceMutation),
36    DropSequence(DropSequenceMutation),
37    Rename(Rename),
38    DropTable(DropTable),
39    DropView(DropViewMutation),
40    DropMaterializedView(DropMaterializedViewMutation),
41    DropIndex(DropIndex),
42    SearchPath(SearchPathChange),
43    BeginTransaction,
44    CommitTransaction,
45    RollbackTransaction,
46    RollbackToSavepoint(RollbackToSavepointMutation),
47    Savepoint(SavepointMutation),
48    ReleaseSavepoint(ReleaseSavepointMutation),
49    CreateFunction(CreateFunctionMutation),
50    AlterFunction(AlterFunctionMutation),
51    DropFunction(DropFunctionMutation),
52    CreateProcedure(CreateProcedureMutation),
53    AlterProcedure(AlterProcedureMutation),
54    DropProcedure(DropProcedureMutation),
55    CreatePublication(CreatePublicationMutation),
56    AlterPublication(AlterPublicationMutation),
57    DropPublication(DropPublicationMutation),
58    CreateSubscription(CreateSubscriptionMutation),
59    AlterSubscription(AlterSubscriptionMutation),
60    DropSubscription(DropSubscriptionMutation),
61    CreateRole(CreateRoleMutation),
62    AlterRole(AlterRoleMutation),
63    DropRole(DropRoleMutation),
64    Grant(GrantMutation),
65    Revoke(RevokeMutation),
66    CreateDatabase(CreateDatabaseMutation),
67    AlterDatabase(AlterDatabaseMutation),
68    DropDatabase(DropDatabaseMutation),
69    Opaque(OpaqueMutation),
70    Vacuum {
71        table_id: Option<ObjectId>,
72        is_full: bool,
73    },
74}
75
76#[derive(Clone, Debug, PartialEq)]
77pub struct CreateSchemaMutation {
78    pub name: String,
79    pub if_not_exists: bool,
80}
81
82#[derive(Clone, Debug, PartialEq)]
83pub struct DropSchemaMutation {
84    pub names: Vec<String>,
85    pub if_exists: bool,
86    pub cascade: bool,
87}
88
89#[derive(Clone, Debug, PartialEq)]
90pub struct CreatePolicyMutation {
91    pub name: String,
92    pub table: ObjectId,
93    pub permissive: bool,
94    pub command: crate::analysis::facts::PolicyCommand,
95}
96
97#[derive(Clone, Debug, PartialEq)]
98pub struct DropPolicyMutation {
99    pub name: String,
100    pub table: ObjectId,
101    pub if_exists: bool,
102}
103
104#[derive(Clone, Debug, PartialEq)]
105pub struct CreateTriggerMutation {
106    pub name: String,
107    pub table: ObjectId,
108    pub function_id: ObjectId,
109}
110
111#[derive(Clone, Debug, PartialEq)]
112pub struct DropTriggerMutation {
113    pub name: String,
114    pub table: ObjectId,
115    pub if_exists: bool,
116}
117
118#[derive(Clone, Debug, PartialEq)]
119pub struct DropViewMutation {
120    pub ids: Vec<ObjectId>,
121    pub if_exists: bool,
122    pub cascade: bool,
123}
124
125#[derive(Clone, Debug, PartialEq)]
126pub struct DropMaterializedViewMutation {
127    pub ids: Vec<ObjectId>,
128    pub if_exists: bool,
129    pub cascade: bool,
130}
131
132#[derive(Clone, Debug, PartialEq)]
133pub struct CreateMaterializedView {
134    pub id: ObjectId,
135    pub depends_on: Vec<ObjectId>,
136}
137
138#[derive(Clone, Debug, PartialEq)]
139pub struct RefreshMaterializedViewMutation {
140    pub id: ObjectId,
141    pub concurrently: bool,
142}
143
144#[derive(Clone, Debug, PartialEq)]
145pub struct CreateSequenceMutation {
146    pub id: ObjectId,
147    pub if_not_exists: bool,
148    pub owned_by: Option<(ObjectId, String)>,
149}
150
151#[derive(Clone, Debug, PartialEq)]
152pub struct AlterSequenceMutation {
153    pub id: ObjectId,
154    pub owned_by: Option<(ObjectId, String)>,
155}
156
157#[derive(Clone, Debug, PartialEq)]
158pub struct DropSequenceMutation {
159    pub ids: Vec<ObjectId>,
160    pub if_exists: bool,
161    pub cascade: bool,
162}
163
164#[derive(Clone, Debug, PartialEq)]
165pub struct CreateDomainMutation {
166    pub id: ObjectId,
167    pub base_type: String,
168}
169
170#[derive(Clone, Debug, PartialEq)]
171pub struct AlterDomainMutation {
172    pub id: ObjectId,
173    pub action: Option<crate::analysis::facts::AlterDomainActionFact>,
174}
175
176#[derive(Clone, Debug, PartialEq)]
177pub struct DropDomainMutation {
178    pub ids: Vec<ObjectId>,
179    pub if_exists: bool,
180    pub cascade: bool,
181}
182
183#[derive(Clone, Debug, PartialEq)]
184pub struct DropTypeMutation {
185    pub ids: Vec<ObjectId>,
186    pub if_exists: bool,
187    pub cascade: bool,
188}
189
190#[derive(Clone, Debug, PartialEq)]
191pub struct CreateTypeMutation {
192    pub id: ObjectId,
193    pub kind: TypeKind,
194}
195
196#[derive(Clone, Debug, PartialEq)]
197pub struct AlterTypeMutation {
198    pub id: ObjectId,
199    pub action: AlterTypeActionMutation,
200}
201
202#[derive(Clone, Debug, PartialEq)]
203pub enum AlterTypeActionMutation {
204    AddValue { new_value: String },
205}
206
207#[derive(Clone, Debug, PartialEq)]
208pub struct CreateTable {
209    pub id: ObjectId,
210    pub if_not_exists: bool,
211    pub as_select: bool,
212    pub persistence: PersistenceMutation,
213    pub columns: Vec<ColumnMutation>,
214    pub foreign_keys: Vec<FkMutation>,
215    pub table_constraints: Vec<TableConstraintFact>,
216    pub partition_by: Option<String>,
217    pub partition_of: Option<ObjectId>,
218    pub partition_type: Option<String>,
219}
220
221#[derive(Clone, Debug, PartialEq)]
222pub struct ColumnMutation {
223    pub name: String,
224    pub ty: Option<String>,
225    pub not_null: bool,
226    pub is_primary_key: bool,
227    pub default: Option<ExprIr>,
228}
229
230#[derive(Clone, Debug, PartialEq)]
231pub struct FkMutation {
232    pub constraint_name: Option<String>,
233    pub to_table: ObjectId,
234    pub from_columns: Vec<String>,
235    pub to_columns: Vec<String>,
236}
237
238#[derive(Clone, Debug, PartialEq)]
239pub struct CreateView {
240    pub id: ObjectId,
241    pub or_replace: bool,
242    pub depends_on: Vec<ObjectId>,
243}
244
245#[derive(Clone, Debug, PartialEq)]
246pub struct CreateIndex {
247    pub id: ObjectId,
248    pub table: ObjectId,
249    pub if_not_exists: bool,
250    pub concurrently: bool,
251    pub using_method: Option<String>,
252    pub has_predicate: bool,
253    pub unique: bool,
254}
255
256#[derive(Clone, Debug, PartialEq)]
257pub struct AlterTable {
258    pub id: ObjectId,
259    pub action: AlterTableActionMutation,
260}
261
262#[derive(Clone, Debug, PartialEq)]
263pub struct Rename {
264    pub old_id: ObjectId,
265    pub new_id: ObjectId,
266}
267
268#[derive(Clone, Debug, PartialEq)]
269pub struct DropTable {
270    pub id: ObjectId,
271    pub if_exists: bool,
272    pub cascade: bool,
273}
274
275#[derive(Clone, Debug, PartialEq)]
276pub struct DropIndex {
277    pub id: ObjectId,
278    pub if_exists: bool,
279    pub concurrently: bool,
280}
281
282#[derive(Clone, Debug, PartialEq)]
283pub struct SearchPathChange {
284    pub target: SearchPathTarget,
285}
286
287#[derive(Clone, Debug, PartialEq)]
288pub struct SavepointMutation {
289    pub name: String,
290}
291
292#[derive(Clone, Debug, PartialEq)]
293pub struct ReleaseSavepointMutation {
294    pub name: String,
295}
296
297#[derive(Clone, Debug, PartialEq)]
298pub struct RollbackToSavepointMutation {
299    pub name: String,
300}
301
302#[derive(Clone, Debug, PartialEq)]
303pub struct CreateFunctionMutation {
304    pub id: ObjectId,
305    pub or_replace: bool,
306    pub params: Vec<crate::analysis::facts::ParamFact>,
307    pub return_type: Option<crate::analysis::facts::RetTypeFact>,
308    pub options: Vec<crate::analysis::facts::FuncOptionFact>,
309}
310
311#[derive(Clone, Debug, PartialEq)]
312pub struct AlterFunctionMutation {
313    pub id: ObjectId,
314    pub action: crate::analysis::facts::AlterFunctionAction,
315}
316
317#[derive(Clone, Debug, PartialEq)]
318pub struct DropFunctionMutation {
319    pub signatures: Vec<crate::analysis::facts::FunctionSigFact>,
320    pub if_exists: bool,
321    pub cascade: bool,
322}
323
324#[derive(Clone, Debug, PartialEq)]
325pub struct CreateProcedureMutation {
326    pub id: ObjectId,
327    pub or_replace: bool,
328    pub params: Vec<crate::analysis::facts::ParamFact>,
329    pub options: Vec<crate::analysis::facts::FuncOptionFact>,
330}
331
332#[derive(Clone, Debug, PartialEq)]
333pub struct AlterProcedureMutation {
334    pub id: ObjectId,
335    pub action: crate::analysis::facts::AlterFunctionAction,
336}
337
338#[derive(Clone, Debug, PartialEq)]
339pub struct DropProcedureMutation {
340    pub signatures: Vec<crate::analysis::facts::FunctionSigFact>,
341    pub if_exists: bool,
342    pub cascade: bool,
343}
344
345#[derive(Clone, Debug, PartialEq)]
346pub struct CreatePublicationMutation {
347    pub name: String,
348    pub scope: crate::analysis::facts::PublicationScope,
349    pub params: Vec<crate::analysis::facts::AttributeFact>,
350}
351
352#[derive(Clone, Debug, PartialEq)]
353pub struct AlterPublicationMutation {
354    pub name: String,
355}
356
357#[derive(Clone, Debug, PartialEq)]
358pub struct DropPublicationMutation {
359    pub names: Vec<String>,
360    pub if_exists: bool,
361    pub cascade: bool,
362}
363
364#[derive(Clone, Debug, PartialEq)]
365pub struct CreateSubscriptionMutation {
366    pub name: Option<String>,
367    pub connection: crate::analysis::facts::ConnectionTarget,
368    pub publications: Vec<String>,
369    pub params: Option<Vec<crate::analysis::facts::AttributeFact>>,
370}
371
372#[derive(Clone, Debug, PartialEq)]
373pub struct AlterSubscriptionMutation {
374    pub name: String,
375}
376
377#[derive(Clone, Debug, PartialEq)]
378pub struct DropSubscriptionMutation {
379    pub name: String,
380    pub if_exists: bool,
381}
382
383#[derive(Clone, Debug, PartialEq)]
384pub struct CreateRoleMutation {
385    pub name: String,
386    pub inherits: bool,
387}
388
389#[derive(Clone, Debug, PartialEq)]
390pub struct AlterRoleMutation {
391    pub name: crate::analysis::facts::RoleFact,
392    pub inherits: Option<bool>,
393}
394
395#[derive(Clone, Debug, PartialEq)]
396pub struct DropRoleMutation {
397    pub names: Vec<String>,
398    pub if_exists: bool,
399}
400
401#[derive(Clone, Debug, PartialEq)]
402pub enum ResolvedGrantTarget {
403    Tables(Vec<ObjectId>),
404    AllTablesInSchema(Vec<String>),
405}
406
407#[derive(Clone, Debug, PartialEq)]
408pub struct GrantMutation {
409    pub privileges: crate::analysis::facts::PrivilegeSpec,
410    pub target: ResolvedGrantTarget,
411    pub grantees: Vec<crate::analysis::facts::RoleFact>,
412    pub with_grant_option: bool,
413    pub granted_by: Option<crate::analysis::facts::RoleFact>,
414}
415
416#[derive(Clone, Debug, PartialEq)]
417pub struct RevokeMutation {
418    pub grant_option_only: bool,
419    pub privileges: crate::analysis::facts::PrivilegeSpec,
420    pub target: ResolvedGrantTarget,
421    pub revokees: Vec<crate::analysis::facts::RoleFact>,
422    pub granted_by: Option<crate::analysis::facts::RoleFact>,
423    pub cascade: bool,
424}
425
426#[derive(Clone, Debug, PartialEq)]
427pub struct CreateDatabaseMutation {
428    pub name: String,
429    pub options: Vec<crate::analysis::facts::DatabaseOptionFact>,
430}
431
432#[derive(Clone, Debug, PartialEq)]
433pub struct AlterDatabaseMutation {
434    pub id: ObjectId,
435    pub action: crate::analysis::facts::AlterDatabaseAction,
436}
437
438#[derive(Clone, Debug, PartialEq)]
439pub struct DropDatabaseMutation {
440    pub id: ObjectId,
441    pub if_exists: bool,
442}
443
444#[derive(Clone, Debug, PartialEq)]
445pub enum OpaqueMutation {
446    DoBlock,
447    Execute,
448    DynamicSql,
449    PrepareTransaction,
450    SetTransaction,
451    SetConstraints,
452    StateCollision(String),
453    UnresolvedReference {
454        object_kind: crate::report::violations::ObjectKind,
455        object_name: String,
456    },
457}
458
459#[derive(Clone, Debug, PartialEq)]
460pub enum AlterTableActionMutation {
461    AddColumn {
462        name: String,
463        ty: Option<String>,
464        if_not_exists: bool,
465        not_null: bool,
466        default: Option<ExprIr>,
467        depends_on: Option<(ObjectId, String)>,
468    },
469    DropColumn {
470        name: String,
471        if_exists: bool,
472    },
473    RenameColumn {
474        from: String,
475        to: String,
476    },
477    AddForeignKey {
478        constraint_name: Option<String>,
479        to_table: ObjectId,
480        from_columns: Vec<String>,
481        to_columns: Vec<String>,
482        not_valid: bool,
483    },
484    AlterConstraint {
485        name: Option<String>,
486        deferrable: bool,
487    },
488    RenameConstraint {
489        old_name: String,
490        new_name: String,
491    },
492    DropConstraint {
493        name: String,
494    },
495    AddCheckConstraint {
496        constraint_name: Option<String>,
497        not_valid: bool,
498    },
499    AddUniqueConstraint,
500    AddPrimaryKeyConstraint,
501    AddExcludeConstraint,
502    SetNotNull {
503        column: String,
504    },
505    DropNotNull {
506        column: String,
507    },
508    SetType {
509        column: String,
510        ty: String,
511        has_using: bool,
512    },
513    SetDefault {
514        column: String,
515        default: Option<ExprIr>,
516    },
517    ValidateConstraint {
518        constraint_name: String,
519    },
520    DisableTrigger {
521        trigger_name: Option<String>,
522    },
523    EnableTrigger {
524        trigger_name: Option<String>,
525    },
526    AttachPartition {
527        child: ObjectId,
528    },
529    DetachPartition {
530        child: ObjectId,
531    },
532    SetStorage {
533        column: String,
534    },
535    SetAccessMethod,
536    Opaque,
537}