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 referenced_key: Option<String>,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub name: Option<String>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub object_id: Option<[u8; 16]>,
96 pub table: String,
97 #[serde(default, skip_serializing_if = "Option::is_none")]
98 pub column: Option<String>,
99 #[serde(default)]
100 pub on_update: ForeignKeyAction,
101 #[serde(default)]
102 pub on_delete: ForeignKeyAction,
103 #[serde(default)]
104 pub match_type: ForeignKeyMatch,
105 #[serde(default = "default_true")]
106 pub enforced: bool,
107 #[serde(default = "default_true")]
108 pub validated: bool,
109 #[serde(default)]
110 pub deferrable: bool,
111 #[serde(default)]
112 pub initially_deferred: bool,
113 #[serde(default)]
115 pub period: bool,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct CreateTable {
120 pub name: String,
121 pub qualifier: String,
123 pub columns: Vec<ColumnDef>,
124 pub if_not_exists: bool,
127 #[allow(dead_code)]
130 pub checks: Vec<TableCheck>,
131 pub foreign_keys: Vec<ForeignKey>,
133 #[serde(default)]
138 pub key_constraints: Vec<TableKeyConstraint>,
139 #[serde(default)]
141 pub persistence: RelationPersistence,
142 #[serde(default)]
144 pub on_commit: OnCommitAction,
145 #[serde(default)]
149 pub hierarchy: TableHierarchy,
150}
151
152#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
154pub struct DeferredCreateTable {
155 pub name: String,
156 pub persistence: RelationPersistence,
157 pub definition_sql: String,
158}
159
160#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
161pub enum TableKeyConstraintKind {
162 PrimaryKey,
163 Unique,
164}
165
166#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
168pub struct TableKeyConstraint {
169 pub name: Option<String>,
170 pub kind: TableKeyConstraintKind,
171 pub columns: Vec<String>,
172 #[serde(default)]
175 pub nulls_not_distinct: bool,
176 #[serde(default)]
178 pub without_overlaps: bool,
179}
180
181#[derive(Debug, Clone, Default, Serialize, Deserialize)]
186pub struct TableConstraintSet {
187 #[serde(default)]
188 pub checks: Vec<TableCheck>,
189 #[serde(default)]
190 pub foreign_keys: Vec<ForeignKey>,
191 #[serde(default)]
192 pub key_constraints: Vec<TableKeyConstraint>,
193 #[serde(default)]
195 pub persistence: RelationPersistence,
196 #[serde(default)]
198 pub on_commit: OnCommitAction,
199 #[serde(default)]
201 pub hierarchy: TableHierarchy,
202}
203
204#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct TableCheck {
208 pub name: Option<String>,
209 pub expr: Expr,
210 #[serde(default = "default_true")]
211 pub enforced: bool,
212 #[serde(default = "default_true")]
213 pub validated: bool,
214 #[serde(default)]
215 pub no_inherit: bool,
216 #[serde(default, skip_serializing_if = "Option::is_none")]
218 pub partition_constraint: Option<DetachedPartitionConstraint>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct DetachedPartitionConstraint {
223 pub spec: PartitionSpec,
224 pub bound: PartitionBound,
225}
226
227#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
229#[allow(clippy::struct_excessive_bools)]
230pub struct ForeignKey {
231 #[serde(default, skip_serializing_if = "Option::is_none")]
233 pub referenced_key: Option<String>,
234 pub name: Option<String>,
235 #[serde(default, skip_serializing_if = "Option::is_none")]
238 pub object_id: Option<[u8; 16]>,
239 pub local_columns: Vec<String>,
240 pub ref_table: String,
241 pub ref_columns: Vec<String>,
242 #[serde(default)]
243 pub on_update: ForeignKeyAction,
244 #[serde(default)]
245 pub on_delete: ForeignKeyAction,
246 #[serde(default)]
250 pub on_delete_set_columns: Vec<String>,
251 #[serde(default)]
252 pub match_type: ForeignKeyMatch,
253 #[serde(default = "default_true")]
254 pub enforced: bool,
255 #[serde(default = "default_true")]
256 pub validated: bool,
257 #[serde(default)]
258 pub deferrable: bool,
259 #[serde(default)]
260 pub initially_deferred: bool,
261 #[serde(default)]
263 pub period: bool,
264}
265
266const fn default_true() -> bool {
267 true
268}
269
270#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
271pub enum ForeignKeyAction {
272 #[default]
273 NoAction,
274 Restrict,
275 Cascade,
276 SetNull,
277 SetDefault,
278}
279
280#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
281pub enum ForeignKeyMatch {
282 #[default]
283 Simple,
284 Full,
285}