1use 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}