1use crate::ast::{
2 Action, Cage, Condition, Distance, Expr, GroupByMode, IndexDef, Join, LockMode, OverridingKind,
3 SampleMethod, SetOp, TableConstraint,
4};
5
6#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
8pub struct Qail {
9 pub action: Action,
11 pub table: String,
13 pub columns: Vec<Expr>,
15 pub joins: Vec<Join>,
17 pub cages: Vec<Cage>,
19 pub distinct: bool,
21 pub index_def: Option<IndexDef>,
23 pub table_constraints: Vec<TableConstraint>,
25 pub set_ops: Vec<(SetOp, Box<Qail>)>,
27 pub having: Vec<Condition>,
29 pub group_by_mode: GroupByMode,
31 pub ctes: Vec<CTEDef>,
33 pub distinct_on: Vec<Expr>,
35 pub returning: Option<Vec<Expr>>,
37 pub on_conflict: Option<OnConflict>,
39 #[serde(default)]
41 pub merge: Option<Merge>,
42 pub source_query: Option<Box<Qail>>,
44 pub channel: Option<String>,
46 pub payload: Option<String>,
48 pub savepoint_name: Option<String>,
50 pub from_tables: Vec<String>,
52 pub using_tables: Vec<String>,
54 pub lock_mode: Option<LockMode>,
56 pub skip_locked: bool,
58 pub fetch: Option<(u64, bool)>,
60 pub default_values: bool,
62 pub overriding: Option<OverridingKind>,
64 pub sample: Option<(SampleMethod, f64, Option<u64>)>,
66 pub only_table: bool,
68 pub vector: Option<Vec<f32>>,
71 pub score_threshold: Option<f32>,
73 pub vector_name: Option<String>,
75 pub with_vector: bool,
77 pub vector_size: Option<u64>,
79 pub distance: Option<Distance>,
81 pub on_disk: Option<bool>,
83 pub function_def: Option<crate::ast::FunctionDef>,
86 pub trigger_def: Option<crate::ast::TriggerDef>,
88 pub policy_def: Option<crate::migrate::policy::RlsPolicy>,
90 #[serde(default)]
97 pub view_security_invoker: bool,
98}
99
100#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
102pub struct CTEDef {
103 pub name: String,
105 pub recursive: bool,
107 pub columns: Vec<String>,
109 pub base_query: Box<Qail>,
111 pub recursive_query: Option<Box<Qail>>,
113 pub source_table: Option<String>,
115}
116
117#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
119pub struct OnConflict {
120 pub columns: Vec<String>,
122 pub action: ConflictAction,
124 #[serde(default)]
131 pub where_conditions: Vec<Condition>,
132}
133
134#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
136pub enum ConflictAction {
137 DoNothing,
139 DoUpdate {
141 assignments: Vec<(String, Expr)>,
143 },
144}
145
146#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
148pub struct Merge {
149 pub target_alias: Option<String>,
151 pub source: MergeSource,
153 pub on: Vec<Condition>,
155 pub clauses: Vec<MergeClause>,
157}
158
159#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
161pub enum MergeSource {
162 Table {
164 name: String,
166 alias: Option<String>,
168 },
169 Query {
171 query: Box<Qail>,
173 alias: Option<String>,
175 },
176}
177
178#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
180pub struct MergeClause {
181 pub match_kind: MergeMatchKind,
183 pub condition: Vec<Condition>,
185 pub action: MergeAction,
187}
188
189#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
191pub enum MergeMatchKind {
192 Matched,
194 NotMatchedByTarget,
196 NotMatchedBySource,
198}
199
200#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
202pub enum MergeAction {
203 Update {
205 assignments: Vec<(String, Expr)>,
207 },
208 Insert {
210 columns: Vec<String>,
212 values: Vec<Expr>,
214 },
215 Delete,
217 DoNothing,
219}
220
221impl Default for OnConflict {
222 fn default() -> Self {
223 Self {
224 columns: vec![],
225 action: ConflictAction::DoNothing,
226 where_conditions: Vec::new(),
227 }
228 }
229}
230
231impl ConflictAction {
232 pub(crate) fn update_assignments(&self) -> Option<&[(String, Expr)]> {
233 match self {
234 Self::DoNothing => None,
235 Self::DoUpdate { assignments } => Some(assignments),
236 }
237 }
238}
239
240impl Default for Qail {
241 fn default() -> Self {
242 Self {
243 action: Action::Get,
244 table: String::new(),
245 columns: vec![],
246 joins: vec![],
247 cages: vec![],
248 distinct: false,
249 index_def: None,
250 table_constraints: vec![],
251 set_ops: vec![],
252 having: vec![],
253 group_by_mode: GroupByMode::Simple,
254 ctes: vec![],
255 distinct_on: vec![],
256 returning: None,
257 on_conflict: None,
258 merge: None,
259 source_query: None,
260 channel: None,
261 payload: None,
262 savepoint_name: None,
263 from_tables: vec![],
264 using_tables: vec![],
265 lock_mode: None,
266 skip_locked: false,
267 fetch: None,
268 default_values: false,
269 overriding: None,
270 sample: None,
271 only_table: false,
272 vector: None,
274 score_threshold: None,
275 vector_name: None,
276 with_vector: false,
277 vector_size: None,
278 distance: None,
279 on_disk: None,
280 function_def: None,
282 trigger_def: None,
283 policy_def: None,
284 view_security_invoker: false,
285 }
286 }
287}
288
289mod advanced;
291mod constructors;
292mod cte;
293mod merge;
294mod query;
295mod rls;
296mod vector;
297
298impl std::fmt::Display for Qail {
299 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
300 use crate::fmt::Formatter;
302 match Formatter::new().format(self) {
303 Ok(s) => write!(f, "{}", s),
304 Err(_) => write!(f, "{:?}", self), }
306 }
307}