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