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 {
205        new_value: String,
206        neighbor: Option<String>,
207        before: bool,
208    },
209}
210
211#[derive(Clone, Debug, PartialEq)]
212pub struct CreateTable {
213    pub id: ObjectId,
214    pub if_not_exists: bool,
215    pub as_select: bool,
216    pub persistence: PersistenceMutation,
217    pub columns: Vec<ColumnMutation>,
218    pub foreign_keys: Vec<FkMutation>,
219    pub table_constraints: Vec<TableConstraintFact>,
220    pub partition_by: Option<String>,
221    pub partition_of: Option<ObjectId>,
222    pub partition_type: Option<String>,
223}
224
225#[derive(Clone, Debug, PartialEq)]
226pub struct ColumnMutation {
227    pub name: String,
228    pub ty: Option<String>,
229    pub not_null: bool,
230    pub is_primary_key: bool,
231    pub default: Option<ExprIr>,
232}
233
234#[derive(Clone, Debug, PartialEq)]
235pub struct FkMutation {
236    pub constraint_name: Option<String>,
237    pub to_table: ObjectId,
238    pub from_columns: Vec<String>,
239    pub to_columns: Vec<String>,
240}
241
242#[derive(Clone, Debug, PartialEq)]
243pub struct CreateView {
244    pub id: ObjectId,
245    pub or_replace: bool,
246    pub depends_on: Vec<ObjectId>,
247}
248
249#[derive(Clone, Debug, PartialEq)]
250pub struct CreateIndex {
251    pub id: ObjectId,
252    pub table: ObjectId,
253    pub if_not_exists: bool,
254    pub concurrently: bool,
255    pub using_method: Option<String>,
256    pub has_predicate: bool,
257    pub unique: bool,
258}
259
260#[derive(Clone, Debug, PartialEq)]
261pub struct AlterTable {
262    pub id: ObjectId,
263    pub action: AlterTableActionMutation,
264}
265
266#[derive(Clone, Debug, PartialEq)]
267pub struct Rename {
268    pub old_id: ObjectId,
269    pub new_id: ObjectId,
270}
271
272#[derive(Clone, Debug, PartialEq)]
273pub struct DropTable {
274    pub id: ObjectId,
275    pub if_exists: bool,
276    pub cascade: bool,
277}
278
279#[derive(Clone, Debug, PartialEq)]
280pub struct DropIndex {
281    pub id: ObjectId,
282    pub if_exists: bool,
283    pub concurrently: bool,
284}
285
286#[derive(Clone, Debug, PartialEq)]
287pub struct SearchPathChange {
288    pub target: SearchPathTarget,
289}
290
291#[derive(Clone, Debug, PartialEq)]
292pub struct SavepointMutation {
293    pub name: String,
294}
295
296#[derive(Clone, Debug, PartialEq)]
297pub struct ReleaseSavepointMutation {
298    pub name: String,
299}
300
301#[derive(Clone, Debug, PartialEq)]
302pub struct RollbackToSavepointMutation {
303    pub name: String,
304}
305
306#[derive(Clone, Debug, PartialEq)]
307pub struct CreateFunctionMutation {
308    pub id: ObjectId,
309    pub or_replace: bool,
310    pub params: Vec<crate::analysis::facts::ParamFact>,
311    pub return_type: Option<crate::analysis::facts::RetTypeFact>,
312    pub options: Vec<crate::analysis::facts::FuncOptionFact>,
313}
314
315#[derive(Clone, Debug, PartialEq)]
316pub struct AlterFunctionMutation {
317    pub id: ObjectId,
318    pub action: crate::analysis::facts::AlterFunctionAction,
319}
320
321#[derive(Clone, Debug, PartialEq)]
322pub struct DropFunctionMutation {
323    pub signatures: Vec<crate::analysis::facts::FunctionSigFact>,
324    pub if_exists: bool,
325    pub cascade: bool,
326}
327
328#[derive(Clone, Debug, PartialEq)]
329pub struct CreateProcedureMutation {
330    pub id: ObjectId,
331    pub or_replace: bool,
332    pub params: Vec<crate::analysis::facts::ParamFact>,
333    pub options: Vec<crate::analysis::facts::FuncOptionFact>,
334}
335
336#[derive(Clone, Debug, PartialEq)]
337pub struct AlterProcedureMutation {
338    pub id: ObjectId,
339    pub action: crate::analysis::facts::AlterFunctionAction,
340}
341
342#[derive(Clone, Debug, PartialEq)]
343pub struct DropProcedureMutation {
344    pub signatures: Vec<crate::analysis::facts::FunctionSigFact>,
345    pub if_exists: bool,
346    pub cascade: bool,
347}
348
349#[derive(Clone, Debug, PartialEq)]
350pub struct CreatePublicationMutation {
351    pub name: String,
352    pub scope: crate::analysis::facts::PublicationScope,
353    pub params: Vec<crate::analysis::facts::AttributeFact>,
354}
355
356#[derive(Clone, Debug, PartialEq)]
357pub struct AlterPublicationMutation {
358    pub name: String,
359}
360
361#[derive(Clone, Debug, PartialEq)]
362pub struct DropPublicationMutation {
363    pub names: Vec<String>,
364    pub if_exists: bool,
365    pub cascade: bool,
366}
367
368#[derive(Clone, Debug, PartialEq)]
369pub struct CreateSubscriptionMutation {
370    pub name: Option<String>,
371    pub connection: crate::analysis::facts::ConnectionTarget,
372    pub publications: Vec<String>,
373    pub params: Option<Vec<crate::analysis::facts::AttributeFact>>,
374}
375
376#[derive(Clone, Debug, PartialEq)]
377pub struct AlterSubscriptionMutation {
378    pub name: String,
379}
380
381#[derive(Clone, Debug, PartialEq)]
382pub struct DropSubscriptionMutation {
383    pub name: String,
384    pub if_exists: bool,
385}
386
387#[derive(Clone, Debug, PartialEq)]
388pub struct CreateRoleMutation {
389    pub name: String,
390    pub inherits: bool,
391}
392
393#[derive(Clone, Debug, PartialEq)]
394pub struct AlterRoleMutation {
395    pub name: crate::analysis::facts::RoleFact,
396    pub inherits: Option<bool>,
397}
398
399#[derive(Clone, Debug, PartialEq)]
400pub struct DropRoleMutation {
401    pub names: Vec<String>,
402    pub if_exists: bool,
403}
404
405#[derive(Clone, Debug, PartialEq)]
406pub enum ResolvedGrantTarget {
407    Tables(Vec<ObjectId>),
408    AllTablesInSchema(Vec<String>),
409}
410
411#[derive(Clone, Debug, PartialEq)]
412pub struct GrantMutation {
413    pub privileges: crate::analysis::facts::PrivilegeSpec,
414    pub target: ResolvedGrantTarget,
415    pub grantees: Vec<crate::analysis::facts::RoleFact>,
416    pub with_grant_option: bool,
417    pub granted_by: Option<crate::analysis::facts::RoleFact>,
418}
419
420#[derive(Clone, Debug, PartialEq)]
421pub struct RevokeMutation {
422    pub grant_option_only: bool,
423    pub privileges: crate::analysis::facts::PrivilegeSpec,
424    pub target: ResolvedGrantTarget,
425    pub revokees: Vec<crate::analysis::facts::RoleFact>,
426    pub granted_by: Option<crate::analysis::facts::RoleFact>,
427    pub cascade: bool,
428}
429
430#[derive(Clone, Debug, PartialEq)]
431pub struct CreateDatabaseMutation {
432    pub name: String,
433    pub options: Vec<crate::analysis::facts::DatabaseOptionFact>,
434}
435
436#[derive(Clone, Debug, PartialEq)]
437pub struct AlterDatabaseMutation {
438    pub id: ObjectId,
439    pub action: crate::analysis::facts::AlterDatabaseAction,
440}
441
442#[derive(Clone, Debug, PartialEq)]
443pub struct DropDatabaseMutation {
444    pub id: ObjectId,
445    pub if_exists: bool,
446}
447
448#[derive(Clone, Debug, PartialEq)]
449pub enum OpaqueMutation {
450    DoBlock,
451    Execute,
452    DynamicSql,
453    PrepareTransaction,
454    SetTransaction,
455    SetConstraints,
456    StateCollision(String),
457    UnresolvedReference {
458        object_kind: crate::report::violations::ObjectKind,
459        object_name: String,
460    },
461}
462
463#[derive(Clone, Debug, PartialEq)]
464pub enum AlterTableActionMutation {
465    AddColumn {
466        name: String,
467        ty: Option<String>,
468        if_not_exists: bool,
469        not_null: bool,
470        default: Option<ExprIr>,
471        depends_on: Option<(ObjectId, String)>,
472    },
473    DropColumn {
474        name: String,
475        if_exists: bool,
476    },
477    RenameColumn {
478        from: String,
479        to: String,
480    },
481    AddForeignKey {
482        constraint_name: Option<String>,
483        to_table: ObjectId,
484        from_columns: Vec<String>,
485        to_columns: Vec<String>,
486        not_valid: bool,
487    },
488    AlterConstraint {
489        name: Option<String>,
490        deferrable: bool,
491    },
492    RenameConstraint {
493        old_name: String,
494        new_name: String,
495    },
496    DropConstraint {
497        name: String,
498    },
499    AddCheckConstraint {
500        constraint_name: Option<String>,
501        not_valid: bool,
502    },
503    AddUniqueConstraint {
504        constraint_name: Option<String>,
505    },
506    AddPrimaryKeyConstraint,
507    AddExcludeConstraint,
508    SetNotNull {
509        column: String,
510    },
511    DropNotNull {
512        column: String,
513    },
514    SetType {
515        column: String,
516        ty: String,
517        has_using: bool,
518    },
519    SetDefault {
520        column: String,
521        default: Option<ExprIr>,
522    },
523    ValidateConstraint {
524        constraint_name: String,
525    },
526    DisableTrigger {
527        trigger_name: Option<String>,
528    },
529    EnableTrigger {
530        trigger_name: Option<String>,
531    },
532    AttachPartition {
533        child: ObjectId,
534    },
535    DetachPartition {
536        child: ObjectId,
537    },
538    SetStorage {
539        column: String,
540    },
541    SetAccessMethod,
542    Opaque,
543}