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