1use serde::{Deserialize, Serialize};
10
11use super::{
12 deserialize_auto_increment, AutoIncrement, ColumnType, Expr, GeneratedColumn, OnCommitAction,
13 PartitionBound, PartitionSpec, RelationPersistence, TableHierarchy,
14};
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[allow(clippy::struct_excessive_bools)]
18pub struct ColumnDef {
19 pub name: String,
20 pub ty: ColumnType,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub object_id: Option<[u8; 16]>,
24 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub missing_value: Option<uqa_core::Value>,
27 pub primary_key: bool,
28 pub not_null: bool,
29 #[serde(default)]
32 pub not_null_explicit: bool,
33 #[serde(default, skip_serializing_if = "Option::is_none")]
37 pub not_null_name: Option<String>,
38 #[serde(default = "default_true")]
41 pub not_null_validated: bool,
42 #[serde(default)]
45 pub not_null_no_inherit: bool,
46 #[serde(
48 default,
49 deserialize_with = "deserialize_auto_increment",
50 skip_serializing_if = "Option::is_none"
51 )]
52 pub auto_increment: Option<AutoIncrement>,
53 #[serde(default)]
56 pub unique: bool,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub default: Option<Expr>,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub generated: Option<GeneratedColumn>,
67 #[serde(default, skip_serializing_if = "Option::is_none")]
70 pub check: Option<Expr>,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
72 pub check_name: Option<String>,
73 #[serde(default = "default_true")]
74 pub check_enforced: bool,
75 #[serde(default = "default_true")]
76 pub check_validated: bool,
77 #[serde(default)]
78 pub check_no_inherit: bool,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub references: Option<ForeignKeyRef>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
86#[allow(clippy::struct_excessive_bools)]
87pub struct ForeignKeyRef {
88 #[serde(default, skip_serializing_if = "Option::is_none")]
89 pub name: Option<String>,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub object_id: Option<[u8; 16]>,
94 pub table: String,
95 #[serde(default, skip_serializing_if = "Option::is_none")]
96 pub column: Option<String>,
97 #[serde(default)]
98 pub on_update: ForeignKeyAction,
99 #[serde(default)]
100 pub on_delete: ForeignKeyAction,
101 #[serde(default)]
102 pub match_type: ForeignKeyMatch,
103 #[serde(default = "default_true")]
104 pub enforced: bool,
105 #[serde(default = "default_true")]
106 pub validated: bool,
107 #[serde(default)]
108 pub deferrable: bool,
109 #[serde(default)]
110 pub initially_deferred: bool,
111 #[serde(default)]
113 pub period: bool,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct CreateTable {
118 pub name: String,
119 pub qualifier: String,
121 pub columns: Vec<ColumnDef>,
122 pub if_not_exists: bool,
125 #[allow(dead_code)]
128 pub checks: Vec<TableCheck>,
129 pub foreign_keys: Vec<ForeignKey>,
131 #[serde(default)]
136 pub key_constraints: Vec<TableKeyConstraint>,
137 #[serde(default)]
139 pub persistence: RelationPersistence,
140 #[serde(default)]
142 pub on_commit: OnCommitAction,
143 #[serde(default)]
147 pub hierarchy: TableHierarchy,
148}
149
150#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
151pub enum TableKeyConstraintKind {
152 PrimaryKey,
153 Unique,
154}
155
156#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
158pub struct TableKeyConstraint {
159 pub name: Option<String>,
160 pub kind: TableKeyConstraintKind,
161 pub columns: Vec<String>,
162 #[serde(default)]
165 pub nulls_not_distinct: bool,
166 #[serde(default)]
168 pub without_overlaps: bool,
169}
170
171#[derive(Debug, Clone, Default, Serialize, Deserialize)]
176pub struct TableConstraintSet {
177 #[serde(default)]
178 pub checks: Vec<TableCheck>,
179 #[serde(default)]
180 pub foreign_keys: Vec<ForeignKey>,
181 #[serde(default)]
182 pub key_constraints: Vec<TableKeyConstraint>,
183 #[serde(default)]
185 pub persistence: RelationPersistence,
186 #[serde(default)]
188 pub on_commit: OnCommitAction,
189 #[serde(default)]
191 pub hierarchy: TableHierarchy,
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct TableCheck {
198 pub name: Option<String>,
199 pub expr: Expr,
200 #[serde(default = "default_true")]
201 pub enforced: bool,
202 #[serde(default = "default_true")]
203 pub validated: bool,
204 #[serde(default)]
205 pub no_inherit: bool,
206 #[serde(default, skip_serializing_if = "Option::is_none")]
208 pub partition_constraint: Option<DetachedPartitionConstraint>,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize)]
212pub struct DetachedPartitionConstraint {
213 pub spec: PartitionSpec,
214 pub bound: PartitionBound,
215}
216
217#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
219#[allow(clippy::struct_excessive_bools)]
220pub struct ForeignKey {
221 pub name: Option<String>,
222 #[serde(default, skip_serializing_if = "Option::is_none")]
225 pub object_id: Option<[u8; 16]>,
226 pub local_columns: Vec<String>,
227 pub ref_table: String,
228 pub ref_columns: Vec<String>,
229 #[serde(default)]
230 pub on_update: ForeignKeyAction,
231 #[serde(default)]
232 pub on_delete: ForeignKeyAction,
233 #[serde(default)]
237 pub on_delete_set_columns: Vec<String>,
238 #[serde(default)]
239 pub match_type: ForeignKeyMatch,
240 #[serde(default = "default_true")]
241 pub enforced: bool,
242 #[serde(default = "default_true")]
243 pub validated: bool,
244 #[serde(default)]
245 pub deferrable: bool,
246 #[serde(default)]
247 pub initially_deferred: bool,
248 #[serde(default)]
250 pub period: bool,
251}
252
253const fn default_true() -> bool {
254 true
255}
256
257#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
258pub enum ForeignKeyAction {
259 #[default]
260 NoAction,
261 Restrict,
262 Cascade,
263 SetNull,
264 SetDefault,
265}
266
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
268pub enum ForeignKeyMatch {
269 #[default]
270 Simple,
271 Full,
272}