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 {
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}