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 pub primary_key: bool,
22 pub not_null: bool,
23 #[serde(default)]
26 pub not_null_explicit: bool,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub not_null_name: Option<String>,
32 #[serde(default = "default_true")]
35 pub not_null_validated: bool,
36 #[serde(default)]
39 pub not_null_no_inherit: bool,
40 #[serde(
42 default,
43 deserialize_with = "deserialize_auto_increment",
44 skip_serializing_if = "Option::is_none"
45 )]
46 pub auto_increment: Option<AutoIncrement>,
47 #[serde(default)]
50 pub unique: bool,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
55 pub default: Option<Expr>,
56 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub generated: Option<GeneratedColumn>,
61 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub check: Option<Expr>,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub check_name: Option<String>,
67 #[serde(default = "default_true")]
68 pub check_enforced: bool,
69 #[serde(default = "default_true")]
70 pub check_validated: bool,
71 #[serde(default)]
72 pub check_no_inherit: bool,
73 #[serde(default, skip_serializing_if = "Option::is_none")]
75 pub references: Option<ForeignKeyRef>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80#[allow(clippy::struct_excessive_bools)]
81pub struct ForeignKeyRef {
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub name: Option<String>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub object_id: Option<[u8; 16]>,
88 pub table: String,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub column: Option<String>,
91 #[serde(default)]
92 pub on_update: ForeignKeyAction,
93 #[serde(default)]
94 pub on_delete: ForeignKeyAction,
95 #[serde(default)]
96 pub match_type: ForeignKeyMatch,
97 #[serde(default = "default_true")]
98 pub enforced: bool,
99 #[serde(default = "default_true")]
100 pub validated: bool,
101 #[serde(default)]
102 pub deferrable: bool,
103 #[serde(default)]
104 pub initially_deferred: bool,
105 #[serde(default)]
107 pub period: bool,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct CreateTable {
112 pub name: String,
113 pub qualifier: String,
115 pub columns: Vec<ColumnDef>,
116 pub if_not_exists: bool,
119 #[allow(dead_code)]
122 pub checks: Vec<TableCheck>,
123 pub foreign_keys: Vec<ForeignKey>,
125 #[serde(default)]
130 pub key_constraints: Vec<TableKeyConstraint>,
131 #[serde(default)]
133 pub persistence: RelationPersistence,
134 #[serde(default)]
136 pub on_commit: OnCommitAction,
137 #[serde(default)]
141 pub hierarchy: TableHierarchy,
142}
143
144#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
145pub enum TableKeyConstraintKind {
146 PrimaryKey,
147 Unique,
148}
149
150#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
152pub struct TableKeyConstraint {
153 pub name: Option<String>,
154 pub kind: TableKeyConstraintKind,
155 pub columns: Vec<String>,
156 #[serde(default)]
159 pub nulls_not_distinct: bool,
160 #[serde(default)]
162 pub without_overlaps: bool,
163}
164
165#[derive(Debug, Clone, Default, Serialize, Deserialize)]
170pub struct TableConstraintSet {
171 #[serde(default)]
172 pub checks: Vec<TableCheck>,
173 #[serde(default)]
174 pub foreign_keys: Vec<ForeignKey>,
175 #[serde(default)]
176 pub key_constraints: Vec<TableKeyConstraint>,
177 #[serde(default)]
179 pub persistence: RelationPersistence,
180 #[serde(default)]
182 pub on_commit: OnCommitAction,
183 #[serde(default)]
185 pub hierarchy: TableHierarchy,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct TableCheck {
192 pub name: Option<String>,
193 pub expr: Expr,
194 #[serde(default = "default_true")]
195 pub enforced: bool,
196 #[serde(default = "default_true")]
197 pub validated: bool,
198 #[serde(default)]
199 pub no_inherit: bool,
200 #[serde(default, skip_serializing_if = "Option::is_none")]
202 pub partition_constraint: Option<DetachedPartitionConstraint>,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
206pub struct DetachedPartitionConstraint {
207 pub spec: PartitionSpec,
208 pub bound: PartitionBound,
209}
210
211#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
213#[allow(clippy::struct_excessive_bools)]
214pub struct ForeignKey {
215 pub name: Option<String>,
216 #[serde(default, skip_serializing_if = "Option::is_none")]
219 pub object_id: Option<[u8; 16]>,
220 pub local_columns: Vec<String>,
221 pub ref_table: String,
222 pub ref_columns: Vec<String>,
223 #[serde(default)]
224 pub on_update: ForeignKeyAction,
225 #[serde(default)]
226 pub on_delete: ForeignKeyAction,
227 #[serde(default)]
231 pub on_delete_set_columns: Vec<String>,
232 #[serde(default)]
233 pub match_type: ForeignKeyMatch,
234 #[serde(default = "default_true")]
235 pub enforced: bool,
236 #[serde(default = "default_true")]
237 pub validated: bool,
238 #[serde(default)]
239 pub deferrable: bool,
240 #[serde(default)]
241 pub initially_deferred: bool,
242 #[serde(default)]
244 pub period: bool,
245}
246
247const fn default_true() -> bool {
248 true
249}
250
251#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
252pub enum ForeignKeyAction {
253 #[default]
254 NoAction,
255 Restrict,
256 Cascade,
257 SetNull,
258 SetDefault,
259}
260
261#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
262pub enum ForeignKeyMatch {
263 #[default]
264 Simple,
265 Full,
266}