1#[cfg(not(feature = "std"))]
19use alloc::{boxed::Box, vec::Vec};
20
21use helpers::attached_token::AttachedToken;
22#[cfg(feature = "serde")]
23use serde::{Deserialize, Serialize};
24
25#[cfg(feature = "visitor")]
26use sqlparser_derive::{Visit, VisitMut};
27
28use crate::{
29 ast::*,
30 display_utils::{indented_list, SpaceOrNewline},
31 tokenizer::{Token, TokenWithSpan},
32};
33
34#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
37#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
38#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
39#[cfg_attr(feature = "visitor", visit(with = "visit_query"))]
40pub struct Query {
41 pub with: Option<With>,
43 pub body: Box<SetExpr>,
45 pub order_by: Option<OrderBy>,
47 pub limit_clause: Option<LimitClause>,
49 pub fetch: Option<Fetch>,
51 pub locks: Vec<LockClause>,
53 pub for_clause: Option<ForClause>,
57 pub settings: Option<Vec<Setting>>,
61 pub format_clause: Option<FormatClause>,
66
67 pub pipe_operators: Vec<PipeOperator>,
69}
70
71impl fmt::Display for Query {
72 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
73 if let Some(ref with) = self.with {
74 with.fmt(f)?;
75 SpaceOrNewline.fmt(f)?;
76 }
77 self.body.fmt(f)?;
78 if let Some(ref order_by) = self.order_by {
79 f.write_str(" ")?;
80 order_by.fmt(f)?;
81 }
82
83 if let Some(ref limit_clause) = self.limit_clause {
84 limit_clause.fmt(f)?;
85 }
86 if let Some(ref settings) = self.settings {
87 f.write_str(" SETTINGS ")?;
88 display_comma_separated(settings).fmt(f)?;
89 }
90 if let Some(ref fetch) = self.fetch {
91 f.write_str(" ")?;
92 fetch.fmt(f)?;
93 }
94 if !self.locks.is_empty() {
95 f.write_str(" ")?;
96 display_separated(&self.locks, " ").fmt(f)?;
97 }
98 if let Some(ref for_clause) = self.for_clause {
99 f.write_str(" ")?;
100 for_clause.fmt(f)?;
101 }
102 if let Some(ref format) = self.format_clause {
103 f.write_str(" ")?;
104 format.fmt(f)?;
105 }
106 for pipe_operator in &self.pipe_operators {
107 f.write_str(" |> ")?;
108 pipe_operator.fmt(f)?;
109 }
110 Ok(())
111 }
112}
113
114#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
120#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
121#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
122pub struct ProjectionSelect {
123 pub projection: Vec<SelectItem>,
125 pub order_by: Option<OrderBy>,
127 pub group_by: Option<GroupByExpr>,
129}
130
131impl fmt::Display for ProjectionSelect {
132 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
133 write!(f, "SELECT {}", display_comma_separated(&self.projection))?;
134 if let Some(ref group_by) = self.group_by {
135 write!(f, " {group_by}")?;
136 }
137 if let Some(ref order_by) = self.order_by {
138 write!(f, " {order_by}")?;
139 }
140 Ok(())
141 }
142}
143
144#[allow(clippy::large_enum_variant)]
147#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
148#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
149#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
150pub enum SetExpr {
151 Select(Box<Select>),
153 Query(Box<Query>),
156 SetOperation {
159 left: Box<SetExpr>,
161 op: SetOperator,
163 set_quantifier: SetQuantifier,
165 right: Box<SetExpr>,
167 },
168 Values(Values),
170 Insert(Statement),
172 Update(Statement),
174 Delete(Statement),
176 Merge(Statement),
178 Table(Box<Table>),
180}
181
182impl SetExpr {
183 pub fn as_select(&self) -> Option<&Select> {
185 if let Self::Select(select) = self {
186 Some(&**select)
187 } else {
188 None
189 }
190 }
191}
192
193impl fmt::Display for SetExpr {
194 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
195 match self {
196 SetExpr::Select(s) => s.fmt(f),
197 SetExpr::Query(q) => {
198 f.write_str("(")?;
199 q.fmt(f)?;
200 f.write_str(")")
201 }
202 SetExpr::Values(v) => v.fmt(f),
203 SetExpr::Insert(v) => v.fmt(f),
204 SetExpr::Update(v) => v.fmt(f),
205 SetExpr::Delete(v) => v.fmt(f),
206 SetExpr::Merge(v) => v.fmt(f),
207 SetExpr::Table(t) => t.fmt(f),
208 SetExpr::SetOperation {
209 left,
210 right,
211 op,
212 set_quantifier,
213 } => {
214 left.fmt(f)?;
215 SpaceOrNewline.fmt(f)?;
216 op.fmt(f)?;
217 match set_quantifier {
218 SetQuantifier::All
219 | SetQuantifier::Distinct
220 | SetQuantifier::ByName
221 | SetQuantifier::AllByName
222 | SetQuantifier::DistinctByName => {
223 f.write_str(" ")?;
224 set_quantifier.fmt(f)?;
225 }
226 SetQuantifier::None => {}
227 }
228 SpaceOrNewline.fmt(f)?;
229 right.fmt(f)?;
230 Ok(())
231 }
232 }
233 }
234}
235
236#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
237#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
238#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
239pub enum SetOperator {
241 Union,
243 Except,
245 Intersect,
247 Minus,
249}
250
251impl fmt::Display for SetOperator {
252 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
253 f.write_str(match self {
254 SetOperator::Union => "UNION",
255 SetOperator::Except => "EXCEPT",
256 SetOperator::Intersect => "INTERSECT",
257 SetOperator::Minus => "MINUS",
258 })
259 }
260}
261
262#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
266#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
267#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
268pub enum SetQuantifier {
269 All,
271 Distinct,
273 ByName,
275 AllByName,
277 DistinctByName,
279 None,
281}
282
283impl fmt::Display for SetQuantifier {
284 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
285 match self {
286 SetQuantifier::All => write!(f, "ALL"),
287 SetQuantifier::Distinct => write!(f, "DISTINCT"),
288 SetQuantifier::ByName => write!(f, "BY NAME"),
289 SetQuantifier::AllByName => write!(f, "ALL BY NAME"),
290 SetQuantifier::DistinctByName => write!(f, "DISTINCT BY NAME"),
291 SetQuantifier::None => Ok(()),
292 }
293 }
294}
295
296#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
297#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
298#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
300pub struct Table {
302 pub table_name: Option<String>,
304 pub schema_name: Option<String>,
306}
307
308impl fmt::Display for Table {
309 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
310 if let Some(ref table_name) = self.table_name {
311 if let Some(ref schema_name) = self.schema_name {
312 write!(f, "TABLE {}.{}", schema_name, table_name,)?;
313 } else {
314 write!(f, "TABLE {}", table_name)?;
315 }
316 } else {
317 write!(f, "TABLE")?;
318 }
319 Ok(())
320 }
321}
322
323#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
325#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
326#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
327pub enum SelectFlavor {
328 Standard,
330 FromFirst,
332 FromFirstNoSelect,
334}
335
336#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Default)]
354#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
355#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
356pub struct SelectModifiers {
357 pub high_priority: bool,
361 pub straight_join: bool,
365 pub sql_small_result: bool,
369 pub sql_big_result: bool,
373 pub sql_buffer_result: bool,
377 pub sql_no_cache: bool,
381 pub sql_calc_found_rows: bool,
386}
387
388impl fmt::Display for SelectModifiers {
389 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
390 if self.high_priority {
391 f.write_str(" HIGH_PRIORITY")?;
392 }
393 if self.straight_join {
394 f.write_str(" STRAIGHT_JOIN")?;
395 }
396 if self.sql_small_result {
397 f.write_str(" SQL_SMALL_RESULT")?;
398 }
399 if self.sql_big_result {
400 f.write_str(" SQL_BIG_RESULT")?;
401 }
402 if self.sql_buffer_result {
403 f.write_str(" SQL_BUFFER_RESULT")?;
404 }
405 if self.sql_no_cache {
406 f.write_str(" SQL_NO_CACHE")?;
407 }
408 if self.sql_calc_found_rows {
409 f.write_str(" SQL_CALC_FOUND_ROWS")?;
410 }
411 Ok(())
412 }
413}
414
415impl SelectModifiers {
416 pub fn is_any_set(&self) -> bool {
418 let Self {
420 high_priority,
421 straight_join,
422 sql_small_result,
423 sql_big_result,
424 sql_buffer_result,
425 sql_no_cache,
426 sql_calc_found_rows,
427 } = self;
428 *high_priority
429 || *straight_join
430 || *sql_small_result
431 || *sql_big_result
432 || *sql_buffer_result
433 || *sql_no_cache
434 || *sql_calc_found_rows
435 }
436}
437
438#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
442#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
443#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
444#[cfg_attr(feature = "visitor", visit(with = "visit_select"))]
445pub struct Select {
446 pub select_token: AttachedToken,
448 pub optimizer_hints: Vec<OptimizerHint>,
453 pub distinct: Option<Distinct>,
455 pub select_modifiers: Option<SelectModifiers>,
459 pub top: Option<Top>,
461 pub top_before_distinct: bool,
463 pub projection: Vec<SelectItem>,
465 pub exclude: Option<ExcludeSelectItem>,
470 pub into: Option<SelectInto>,
472 pub from: Vec<TableWithJoins>,
474 pub lateral_views: Vec<LateralView>,
476 pub prewhere: Option<Expr>,
481 pub selection: Option<Expr>,
483 pub connect_by: Vec<ConnectByKind>,
485 pub group_by: GroupByExpr,
487 pub cluster_by: Vec<Expr>,
489 pub distribute_by: Vec<Expr>,
491 pub sort_by: Vec<OrderByExpr>,
493 pub having: Option<Expr>,
495 pub named_window: Vec<NamedWindowDefinition>,
497 pub qualify: Option<Expr>,
499 pub window_before_qualify: bool,
504 pub value_table_mode: Option<ValueTableMode>,
506 pub flavor: SelectFlavor,
508}
509
510impl fmt::Display for Select {
511 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
512 match self.flavor {
513 SelectFlavor::Standard => {
514 write!(f, "SELECT")?;
515 }
516 SelectFlavor::FromFirst => {
517 write!(f, "FROM {} SELECT", display_comma_separated(&self.from))?;
518 }
519 SelectFlavor::FromFirstNoSelect => {
520 write!(f, "FROM {}", display_comma_separated(&self.from))?;
521 }
522 }
523
524 for hint in &self.optimizer_hints {
525 f.write_str(" ")?;
526 hint.fmt(f)?;
527 }
528
529 if let Some(value_table_mode) = self.value_table_mode {
530 f.write_str(" ")?;
531 value_table_mode.fmt(f)?;
532 }
533
534 if let Some(ref top) = self.top {
535 if self.top_before_distinct {
536 f.write_str(" ")?;
537 top.fmt(f)?;
538 }
539 }
540 if let Some(ref distinct) = self.distinct {
541 f.write_str(" ")?;
542 distinct.fmt(f)?;
543 }
544 if let Some(ref top) = self.top {
545 if !self.top_before_distinct {
546 f.write_str(" ")?;
547 top.fmt(f)?;
548 }
549 }
550
551 if let Some(ref select_modifiers) = self.select_modifiers {
552 select_modifiers.fmt(f)?;
553 }
554
555 if !self.projection.is_empty() {
556 indented_list(f, &self.projection)?;
557 }
558
559 if let Some(exclude) = &self.exclude {
560 write!(f, " {exclude}")?;
561 }
562
563 if let Some(ref into) = self.into {
564 f.write_str(" ")?;
565 into.fmt(f)?;
566 }
567
568 if self.flavor == SelectFlavor::Standard && !self.from.is_empty() {
569 SpaceOrNewline.fmt(f)?;
570 f.write_str("FROM")?;
571 indented_list(f, &self.from)?;
572 }
573 if !self.lateral_views.is_empty() {
574 for lv in &self.lateral_views {
575 lv.fmt(f)?;
576 }
577 }
578 if let Some(ref prewhere) = self.prewhere {
579 f.write_str(" PREWHERE ")?;
580 prewhere.fmt(f)?;
581 }
582 if let Some(ref selection) = self.selection {
583 SpaceOrNewline.fmt(f)?;
584 f.write_str("WHERE")?;
585 SpaceOrNewline.fmt(f)?;
586 Indent(selection).fmt(f)?;
587 }
588 for clause in &self.connect_by {
589 SpaceOrNewline.fmt(f)?;
590 clause.fmt(f)?;
591 }
592 match &self.group_by {
593 GroupByExpr::All(_) => {
594 SpaceOrNewline.fmt(f)?;
595 self.group_by.fmt(f)?;
596 }
597 GroupByExpr::Expressions(exprs, _) => {
598 if !exprs.is_empty() {
599 SpaceOrNewline.fmt(f)?;
600 self.group_by.fmt(f)?;
601 }
602 }
603 }
604 if !self.cluster_by.is_empty() {
605 SpaceOrNewline.fmt(f)?;
606 f.write_str("CLUSTER BY")?;
607 SpaceOrNewline.fmt(f)?;
608 Indent(display_comma_separated(&self.cluster_by)).fmt(f)?;
609 }
610 if !self.distribute_by.is_empty() {
611 SpaceOrNewline.fmt(f)?;
612 f.write_str("DISTRIBUTE BY")?;
613 SpaceOrNewline.fmt(f)?;
614 display_comma_separated(&self.distribute_by).fmt(f)?;
615 }
616 if !self.sort_by.is_empty() {
617 SpaceOrNewline.fmt(f)?;
618 f.write_str("SORT BY")?;
619 SpaceOrNewline.fmt(f)?;
620 Indent(display_comma_separated(&self.sort_by)).fmt(f)?;
621 }
622 if let Some(ref having) = self.having {
623 SpaceOrNewline.fmt(f)?;
624 f.write_str("HAVING")?;
625 SpaceOrNewline.fmt(f)?;
626 Indent(having).fmt(f)?;
627 }
628 if self.window_before_qualify {
629 if !self.named_window.is_empty() {
630 SpaceOrNewline.fmt(f)?;
631 f.write_str("WINDOW")?;
632 SpaceOrNewline.fmt(f)?;
633 display_comma_separated(&self.named_window).fmt(f)?;
634 }
635 if let Some(ref qualify) = self.qualify {
636 SpaceOrNewline.fmt(f)?;
637 f.write_str("QUALIFY")?;
638 SpaceOrNewline.fmt(f)?;
639 qualify.fmt(f)?;
640 }
641 } else {
642 if let Some(ref qualify) = self.qualify {
643 SpaceOrNewline.fmt(f)?;
644 f.write_str("QUALIFY")?;
645 SpaceOrNewline.fmt(f)?;
646 qualify.fmt(f)?;
647 }
648 if !self.named_window.is_empty() {
649 SpaceOrNewline.fmt(f)?;
650 f.write_str("WINDOW")?;
651 SpaceOrNewline.fmt(f)?;
652 display_comma_separated(&self.named_window).fmt(f)?;
653 }
654 }
655 Ok(())
656 }
657}
658
659#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
661#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
662#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
663pub struct LateralView {
664 pub lateral_view: Expr,
666 pub lateral_view_name: ObjectName,
668 pub lateral_col_alias: Vec<Ident>,
670 pub outer: bool,
672}
673
674impl fmt::Display for LateralView {
675 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
676 write!(
677 f,
678 " LATERAL VIEW{outer} {} {}",
679 self.lateral_view,
680 self.lateral_view_name,
681 outer = if self.outer { " OUTER" } else { "" }
682 )?;
683 if !self.lateral_col_alias.is_empty() {
684 write!(
685 f,
686 " AS {}",
687 display_comma_separated(&self.lateral_col_alias)
688 )?;
689 }
690 Ok(())
691 }
692}
693
694#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
700#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
701#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
702pub enum NamedWindowExpr {
703 NamedWindow(Ident),
713 WindowSpec(WindowSpec),
720}
721
722impl fmt::Display for NamedWindowExpr {
723 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
724 match self {
725 NamedWindowExpr::NamedWindow(named_window) => {
726 write!(f, "{named_window}")?;
727 }
728 NamedWindowExpr::WindowSpec(window_spec) => {
729 write!(f, "({window_spec})")?;
730 }
731 };
732 Ok(())
733 }
734}
735
736#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
737#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
738#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
739pub struct NamedWindowDefinition(pub Ident, pub NamedWindowExpr);
741
742impl fmt::Display for NamedWindowDefinition {
743 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
744 write!(f, "{} AS {}", self.0, self.1)
745 }
746}
747
748#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
749#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
750#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
751pub struct With {
753 pub with_token: AttachedToken,
755 pub recursive: bool,
757 pub cte_tables: Vec<Cte>,
759}
760
761impl fmt::Display for With {
762 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
763 f.write_str("WITH ")?;
764 if self.recursive {
765 f.write_str("RECURSIVE ")?;
766 }
767 display_comma_separated(&self.cte_tables).fmt(f)?;
768 Ok(())
769 }
770}
771
772#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
773#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
774#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
775pub enum CteAsMaterialized {
777 Materialized,
779 NotMaterialized,
781}
782
783impl fmt::Display for CteAsMaterialized {
784 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
785 match *self {
786 CteAsMaterialized::Materialized => {
787 write!(f, "MATERIALIZED")?;
788 }
789 CteAsMaterialized::NotMaterialized => {
790 write!(f, "NOT MATERIALIZED")?;
791 }
792 };
793 Ok(())
794 }
795}
796
797#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
802#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
803#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
804pub struct Cte {
805 pub alias: TableAlias,
807 pub query: Box<Query>,
809 pub from: Option<Ident>,
811 pub materialized: Option<CteAsMaterialized>,
813 pub closing_paren_token: AttachedToken,
815}
816
817impl fmt::Display for Cte {
818 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
819 match self.materialized.as_ref() {
820 None => {
821 self.alias.fmt(f)?;
822 f.write_str(" AS (")?;
823 NewLine.fmt(f)?;
824 Indent(&self.query).fmt(f)?;
825 NewLine.fmt(f)?;
826 f.write_str(")")?;
827 }
828 Some(materialized) => {
829 self.alias.fmt(f)?;
830 f.write_str(" AS ")?;
831 materialized.fmt(f)?;
832 f.write_str(" (")?;
833 NewLine.fmt(f)?;
834 Indent(&self.query).fmt(f)?;
835 NewLine.fmt(f)?;
836 f.write_str(")")?;
837 }
838 };
839 if let Some(ref fr) = self.from {
840 write!(f, " FROM {fr}")?;
841 }
842 Ok(())
843 }
844}
845
846#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
849#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
850#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
851pub enum SelectItemQualifiedWildcardKind {
852 ObjectName(ObjectName),
855 Expr(Expr),
858}
859
860#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
862#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
863#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
864pub enum SelectItem {
865 UnnamedExpr(Expr),
867 ExprWithAlias {
869 expr: Expr,
871 alias: Ident,
873 },
874 ExprWithAliases {
878 expr: Expr,
880 aliases: Vec<Ident>,
882 },
883 QualifiedWildcard(SelectItemQualifiedWildcardKind, WildcardAdditionalOptions),
886 Wildcard(WildcardAdditionalOptions),
888}
889
890impl fmt::Display for SelectItemQualifiedWildcardKind {
891 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
892 match &self {
893 SelectItemQualifiedWildcardKind::ObjectName(object_name) => {
894 write!(f, "{object_name}.*")
895 }
896 SelectItemQualifiedWildcardKind::Expr(expr) => write!(f, "{expr}.*"),
897 }
898 }
899}
900
901#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
908#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
909#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
910pub struct IdentWithAlias {
911 pub ident: Ident,
913 pub alias: Ident,
915}
916
917impl fmt::Display for IdentWithAlias {
918 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
919 write!(f, "{} AS {}", self.ident, self.alias)
920 }
921}
922
923#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
925#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
926#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
927pub struct WildcardAdditionalOptions {
928 pub wildcard_token: AttachedToken,
930 pub opt_ilike: Option<IlikeSelectItem>,
933 pub opt_exclude: Option<ExcludeSelectItem>,
935 pub opt_except: Option<ExceptSelectItem>,
938 pub opt_replace: Option<ReplaceSelectItem>,
943 pub opt_rename: Option<RenameSelectItem>,
945 pub opt_alias: Option<Ident>,
948}
949
950impl Default for WildcardAdditionalOptions {
951 fn default() -> Self {
952 Self {
953 wildcard_token: TokenWithSpan::wrap(Token::Mul).into(),
954 opt_ilike: None,
955 opt_exclude: None,
956 opt_except: None,
957 opt_replace: None,
958 opt_rename: None,
959 opt_alias: None,
960 }
961 }
962}
963
964impl fmt::Display for WildcardAdditionalOptions {
965 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
966 if let Some(ilike) = &self.opt_ilike {
967 write!(f, " {ilike}")?;
968 }
969 if let Some(exclude) = &self.opt_exclude {
970 write!(f, " {exclude}")?;
971 }
972 if let Some(except) = &self.opt_except {
973 write!(f, " {except}")?;
974 }
975 if let Some(replace) = &self.opt_replace {
976 write!(f, " {replace}")?;
977 }
978 if let Some(rename) = &self.opt_rename {
979 write!(f, " {rename}")?;
980 }
981 if let Some(alias) = &self.opt_alias {
982 write!(f, " AS {alias}")?;
983 }
984 Ok(())
985 }
986}
987
988#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
995#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
996#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
997pub struct IlikeSelectItem {
998 pub pattern: String,
1000}
1001
1002impl fmt::Display for IlikeSelectItem {
1003 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1004 write!(
1005 f,
1006 "ILIKE '{}'",
1007 value::escape_single_quote_string(&self.pattern)
1008 )?;
1009 Ok(())
1010 }
1011}
1012#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1020#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1021#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1022pub enum ExcludeSelectItem {
1023 Single(ObjectName),
1030 Multiple(Vec<ObjectName>),
1036}
1037
1038impl fmt::Display for ExcludeSelectItem {
1039 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1040 write!(f, "EXCLUDE")?;
1041 match self {
1042 Self::Single(column) => {
1043 write!(f, " {column}")?;
1044 }
1045 Self::Multiple(columns) => {
1046 write!(f, " ({})", display_comma_separated(columns))?;
1047 }
1048 }
1049 Ok(())
1050 }
1051}
1052
1053#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1061#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1062#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1063pub enum RenameSelectItem {
1064 Single(IdentWithAlias),
1071 Multiple(Vec<IdentWithAlias>),
1077}
1078
1079impl fmt::Display for RenameSelectItem {
1080 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1081 write!(f, "RENAME")?;
1082 match self {
1083 Self::Single(column) => {
1084 write!(f, " {column}")?;
1085 }
1086 Self::Multiple(columns) => {
1087 write!(f, " ({})", display_comma_separated(columns))?;
1088 }
1089 }
1090 Ok(())
1091 }
1092}
1093
1094#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1101#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1102#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1103pub struct ExceptSelectItem {
1104 pub first_element: Ident,
1106 pub additional_elements: Vec<Ident>,
1108}
1109
1110impl fmt::Display for ExceptSelectItem {
1111 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1112 write!(f, "EXCEPT ")?;
1113 if self.additional_elements.is_empty() {
1114 write!(f, "({})", self.first_element)?;
1115 } else {
1116 write!(
1117 f,
1118 "({}, {})",
1119 self.first_element,
1120 display_comma_separated(&self.additional_elements)
1121 )?;
1122 }
1123 Ok(())
1124 }
1125}
1126
1127#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1135#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1136#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1137pub struct ReplaceSelectItem {
1138 pub items: Vec<Box<ReplaceSelectElement>>,
1140}
1141
1142impl fmt::Display for ReplaceSelectItem {
1143 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1144 write!(f, "REPLACE")?;
1145 write!(f, " ({})", display_comma_separated(&self.items))?;
1146 Ok(())
1147 }
1148}
1149
1150#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1155#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1156#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1157pub struct ReplaceSelectElement {
1158 pub expr: Expr,
1160 pub column_name: Ident,
1162 pub as_keyword: bool,
1164}
1165
1166impl fmt::Display for ReplaceSelectElement {
1167 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1168 if self.as_keyword {
1169 write!(f, "{} AS {}", self.expr, self.column_name)
1170 } else {
1171 write!(f, "{} {}", self.expr, self.column_name)
1172 }
1173 }
1174}
1175
1176impl fmt::Display for SelectItem {
1177 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1178 use core::fmt::Write;
1179 match &self {
1180 SelectItem::UnnamedExpr(expr) => expr.fmt(f),
1181 SelectItem::ExprWithAlias { expr, alias } => {
1182 expr.fmt(f)?;
1183 f.write_str(" AS ")?;
1184 alias.fmt(f)
1185 }
1186 SelectItem::ExprWithAliases { expr, aliases } => {
1187 expr.fmt(f)?;
1188 f.write_str(" AS (")?;
1189 display_comma_separated(aliases).fmt(f)?;
1190 f.write_str(")")
1191 }
1192 SelectItem::QualifiedWildcard(kind, additional_options) => {
1193 kind.fmt(f)?;
1194 additional_options.fmt(f)
1195 }
1196 SelectItem::Wildcard(additional_options) => {
1197 f.write_char('*')?;
1198 additional_options.fmt(f)
1199 }
1200 }
1201 }
1202}
1203
1204#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1205#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1206#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1207pub struct TableWithJoins {
1209 pub relation: TableFactor,
1211 pub joins: Vec<Join>,
1213}
1214
1215impl fmt::Display for TableWithJoins {
1216 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1217 self.relation.fmt(f)?;
1218 for join in &self.joins {
1219 SpaceOrNewline.fmt(f)?;
1220 join.fmt(f)?;
1221 }
1222 Ok(())
1223 }
1224}
1225
1226#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1231#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1232#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1233pub enum ConnectByKind {
1234 ConnectBy {
1236 connect_token: AttachedToken,
1238
1239 nocycle: bool,
1243
1244 relationships: Vec<Expr>,
1246 },
1247
1248 StartWith {
1253 start_token: AttachedToken,
1255
1256 condition: Box<Expr>,
1258 },
1259}
1260
1261impl fmt::Display for ConnectByKind {
1262 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1263 match self {
1264 ConnectByKind::ConnectBy {
1265 connect_token: _,
1266 nocycle,
1267 relationships,
1268 } => {
1269 write!(
1270 f,
1271 "CONNECT BY {nocycle}{relationships}",
1272 nocycle = if *nocycle { "NOCYCLE " } else { "" },
1273 relationships = display_comma_separated(relationships)
1274 )
1275 }
1276 ConnectByKind::StartWith {
1277 start_token: _,
1278 condition,
1279 } => {
1280 write!(f, "START WITH {condition}")
1281 }
1282 }
1283 }
1284}
1285
1286#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1287#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1288#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1289pub struct Setting {
1291 pub key: Ident,
1293 pub value: Expr,
1295}
1296
1297impl fmt::Display for Setting {
1298 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1299 write!(f, "{} = {}", self.key, self.value)
1300 }
1301}
1302
1303#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1310#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1311#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1312pub struct ExprWithAlias {
1313 pub expr: Expr,
1315 pub alias: Option<Ident>,
1317}
1318
1319impl fmt::Display for ExprWithAlias {
1320 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1321 let ExprWithAlias { expr, alias } = self;
1322 write!(f, "{expr}")?;
1323 if let Some(alias) = alias {
1324 write!(f, " AS {alias}")?;
1325 }
1326 Ok(())
1327 }
1328}
1329
1330#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1337#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1338#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1339pub struct ExprWithAliasAndOrderBy {
1340 pub expr: ExprWithAlias,
1342 pub order_by: OrderByOptions,
1344}
1345
1346impl fmt::Display for ExprWithAliasAndOrderBy {
1347 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1348 write!(f, "{}{}", self.expr, self.order_by)
1349 }
1350}
1351
1352#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1354#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1355#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1356pub struct TableFunctionArgs {
1357 pub args: Vec<FunctionArg>,
1359 pub settings: Option<Vec<Setting>>,
1364}
1365
1366#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1367#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1368#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1369pub enum TableIndexHintType {
1371 Use,
1373 Ignore,
1375 Force,
1377}
1378
1379impl fmt::Display for TableIndexHintType {
1380 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1381 f.write_str(match self {
1382 TableIndexHintType::Use => "USE",
1383 TableIndexHintType::Ignore => "IGNORE",
1384 TableIndexHintType::Force => "FORCE",
1385 })
1386 }
1387}
1388
1389#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1390#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1391#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1392pub enum TableIndexType {
1394 Index,
1396 Key,
1398}
1399
1400impl fmt::Display for TableIndexType {
1401 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1402 f.write_str(match self {
1403 TableIndexType::Index => "INDEX",
1404 TableIndexType::Key => "KEY",
1405 })
1406 }
1407}
1408
1409#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1410#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1411#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1412pub enum TableIndexHintForClause {
1414 Join,
1416 OrderBy,
1418 GroupBy,
1420}
1421
1422impl fmt::Display for TableIndexHintForClause {
1423 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1424 f.write_str(match self {
1425 TableIndexHintForClause::Join => "JOIN",
1426 TableIndexHintForClause::OrderBy => "ORDER BY",
1427 TableIndexHintForClause::GroupBy => "GROUP BY",
1428 })
1429 }
1430}
1431
1432#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1433#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1434#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1435pub struct TableIndexHints {
1437 pub hint_type: TableIndexHintType,
1439 pub index_type: TableIndexType,
1441 pub for_clause: Option<TableIndexHintForClause>,
1443 pub index_names: Vec<Ident>,
1445}
1446
1447impl fmt::Display for TableIndexHints {
1448 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1449 write!(f, "{} {} ", self.hint_type, self.index_type)?;
1450 if let Some(for_clause) = &self.for_clause {
1451 write!(f, "FOR {for_clause} ")?;
1452 }
1453 write!(f, "({})", display_comma_separated(&self.index_names))
1454 }
1455}
1456
1457#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1459#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1460#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1461#[cfg_attr(feature = "visitor", visit(with = "visit_table_factor"))]
1462pub enum TableFactor {
1463 Table {
1465 #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
1466 name: ObjectName,
1468 alias: Option<TableAlias>,
1470 args: Option<TableFunctionArgs>,
1478 with_hints: Vec<Expr>,
1480 version: Option<TableVersion>,
1483 with_ordinality: bool,
1487 partitions: Vec<Ident>,
1489 json_path: Option<JsonPath>,
1491 sample: Option<TableSampleKind>,
1494 index_hints: Vec<TableIndexHints>,
1497 },
1498 Derived {
1500 lateral: bool,
1502 subquery: Box<Query>,
1504 alias: Option<TableAlias>,
1506 sample: Option<TableSampleKind>,
1508 },
1509 TableFunction {
1511 expr: Expr,
1513 alias: Option<TableAlias>,
1515 },
1516 Function {
1518 lateral: bool,
1520 name: ObjectName,
1522 args: Vec<FunctionArg>,
1524 with_ordinality: bool,
1526 alias: Option<TableAlias>,
1528 },
1529 UNNEST {
1540 alias: Option<TableAlias>,
1542 array_exprs: Vec<Expr>,
1544 with_offset: bool,
1546 with_offset_alias: Option<Ident>,
1548 with_ordinality: bool,
1550 },
1551 JsonTable {
1567 json_expr: Expr,
1569 json_path: ValueWithSpan,
1572 columns: Vec<JsonTableColumn>,
1575 alias: Option<TableAlias>,
1577 },
1578 OpenJsonTable {
1588 json_expr: Expr,
1590 json_path: Option<ValueWithSpan>,
1593 columns: Vec<OpenJsonTableColumn>,
1596 alias: Option<TableAlias>,
1598 },
1599 NestedJoin {
1606 table_with_joins: Box<TableWithJoins>,
1608 alias: Option<TableAlias>,
1610 },
1611 Pivot {
1618 table: Box<TableFactor>,
1620 aggregate_functions: Vec<ExprWithAlias>, value_column: Vec<Expr>,
1624 value_source: PivotValueSource,
1626 default_on_null: Option<Expr>,
1628 alias: Option<TableAlias>,
1630 },
1631 Unpivot {
1643 table: Box<TableFactor>,
1645 value: Expr,
1647 name: Ident,
1649 columns: Vec<ExprWithAlias>,
1651 null_inclusion: Option<NullInclusion>,
1653 alias: Option<TableAlias>,
1655 },
1656 UnpivotExpr {
1664 expression: Expr,
1666 value_alias: Ident,
1668 attribute_alias: Option<Ident>,
1670 },
1671 MatchRecognize {
1675 table: Box<TableFactor>,
1677 partition_by: Vec<Expr>,
1679 order_by: Vec<OrderByExpr>,
1681 measures: Vec<Measure>,
1683 rows_per_match: Option<RowsPerMatch>,
1685 after_match_skip: Option<AfterMatchSkip>,
1687 pattern: MatchRecognizePattern,
1689 symbols: Vec<SymbolDefinition>,
1691 alias: Option<TableAlias>,
1693 },
1694 XmlTable {
1714 namespaces: Vec<XmlNamespaceDefinition>,
1716 row_expression: Expr,
1718 passing: XmlPassingClause,
1720 columns: Vec<XmlTableColumn>,
1722 alias: Option<TableAlias>,
1724 },
1725 SemanticView {
1737 name: ObjectName,
1739 dimensions: Vec<Expr>,
1741 metrics: Vec<Expr>,
1743 facts: Vec<Expr>,
1745 where_clause: Option<Expr>,
1747 alias: Option<TableAlias>,
1749 },
1750}
1751
1752#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1754#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1755#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1756pub enum TableSampleKind {
1757 BeforeTableAlias(Box<TableSample>),
1759 AfterTableAlias(Box<TableSample>),
1761}
1762
1763#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1764#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1765#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1766pub struct TableSample {
1768 pub modifier: TableSampleModifier,
1770 pub name: Option<TableSampleMethod>,
1772 pub quantity: Option<TableSampleQuantity>,
1774 pub seed: Option<TableSampleSeed>,
1776 pub bucket: Option<TableSampleBucket>,
1778 pub offset: Option<Expr>,
1780}
1781
1782#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1783#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1784#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1785pub enum TableSampleModifier {
1787 Sample,
1789 TableSample,
1791}
1792
1793impl fmt::Display for TableSampleModifier {
1794 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1795 match self {
1796 TableSampleModifier::Sample => write!(f, "SAMPLE")?,
1797 TableSampleModifier::TableSample => write!(f, "TABLESAMPLE")?,
1798 }
1799 Ok(())
1800 }
1801}
1802
1803#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1804#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1805#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1806pub struct TableSampleQuantity {
1808 pub parenthesized: bool,
1810 pub value: Expr,
1812 pub unit: Option<TableSampleUnit>,
1814}
1815
1816impl fmt::Display for TableSampleQuantity {
1817 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1818 if self.parenthesized {
1819 write!(f, "(")?;
1820 }
1821 write!(f, "{}", self.value)?;
1822 if let Some(unit) = &self.unit {
1823 write!(f, " {unit}")?;
1824 }
1825 if self.parenthesized {
1826 write!(f, ")")?;
1827 }
1828 Ok(())
1829 }
1830}
1831
1832#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1834#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1835#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1836pub enum TableSampleMethod {
1838 Row,
1840 Bernoulli,
1842 System,
1844 Block,
1846}
1847
1848impl fmt::Display for TableSampleMethod {
1849 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1850 match self {
1851 TableSampleMethod::Bernoulli => write!(f, "BERNOULLI"),
1852 TableSampleMethod::Row => write!(f, "ROW"),
1853 TableSampleMethod::System => write!(f, "SYSTEM"),
1854 TableSampleMethod::Block => write!(f, "BLOCK"),
1855 }
1856 }
1857}
1858
1859#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1860#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1861#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1862pub struct TableSampleSeed {
1864 pub modifier: TableSampleSeedModifier,
1866 pub value: ValueWithSpan,
1868}
1869
1870impl fmt::Display for TableSampleSeed {
1871 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1872 write!(f, "{} ({})", self.modifier, self.value)?;
1873 Ok(())
1874 }
1875}
1876
1877#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1878#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1879#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1880pub enum TableSampleSeedModifier {
1882 Repeatable,
1884 Seed,
1886}
1887
1888impl fmt::Display for TableSampleSeedModifier {
1889 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1890 match self {
1891 TableSampleSeedModifier::Repeatable => write!(f, "REPEATABLE"),
1892 TableSampleSeedModifier::Seed => write!(f, "SEED"),
1893 }
1894 }
1895}
1896
1897#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1898#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1899#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1900pub enum TableSampleUnit {
1902 Rows,
1904 Percent,
1906}
1907
1908impl fmt::Display for TableSampleUnit {
1909 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1910 match self {
1911 TableSampleUnit::Percent => write!(f, "PERCENT"),
1912 TableSampleUnit::Rows => write!(f, "ROWS"),
1913 }
1914 }
1915}
1916
1917#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1918#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1919#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1920pub struct TableSampleBucket {
1922 pub bucket: ValueWithSpan,
1924 pub total: ValueWithSpan,
1926 pub on: Option<Expr>,
1928}
1929
1930impl fmt::Display for TableSampleBucket {
1931 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1932 write!(f, "BUCKET {} OUT OF {}", self.bucket, self.total)?;
1933 if let Some(on) = &self.on {
1934 write!(f, " ON {on}")?;
1935 }
1936 Ok(())
1937 }
1938}
1939impl fmt::Display for TableSample {
1940 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1941 write!(f, "{}", self.modifier)?;
1942 if let Some(name) = &self.name {
1943 write!(f, " {name}")?;
1944 }
1945 if let Some(quantity) = &self.quantity {
1946 write!(f, " {quantity}")?;
1947 }
1948 if let Some(seed) = &self.seed {
1949 write!(f, " {seed}")?;
1950 }
1951 if let Some(bucket) = &self.bucket {
1952 write!(f, " ({bucket})")?;
1953 }
1954 if let Some(offset) = &self.offset {
1955 write!(f, " OFFSET {offset}")?;
1956 }
1957 Ok(())
1958 }
1959}
1960
1961#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1963#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1964#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1965pub enum PivotValueSource {
1966 List(Vec<ExprWithAlias>),
1970 Any(Vec<OrderByExpr>),
1974 Subquery(Box<Query>),
1978}
1979
1980impl fmt::Display for PivotValueSource {
1981 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1982 match self {
1983 PivotValueSource::List(values) => write!(f, "{}", display_comma_separated(values)),
1984 PivotValueSource::Any(order_by) => {
1985 write!(f, "ANY")?;
1986 if !order_by.is_empty() {
1987 write!(f, " ORDER BY {}", display_comma_separated(order_by))?;
1988 }
1989 Ok(())
1990 }
1991 PivotValueSource::Subquery(query) => write!(f, "{query}"),
1992 }
1993 }
1994}
1995
1996#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2000#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2001#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2002pub struct Measure {
2004 pub expr: Expr,
2006 pub alias: Ident,
2008}
2009
2010impl fmt::Display for Measure {
2011 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2012 write!(f, "{} AS {}", self.expr, self.alias)
2013 }
2014}
2015
2016#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2020#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2021#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2022pub enum RowsPerMatch {
2023 OneRow,
2025 AllRows(Option<EmptyMatchesMode>),
2027}
2028
2029impl fmt::Display for RowsPerMatch {
2030 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2031 match self {
2032 RowsPerMatch::OneRow => write!(f, "ONE ROW PER MATCH"),
2033 RowsPerMatch::AllRows(mode) => {
2034 write!(f, "ALL ROWS PER MATCH")?;
2035 if let Some(mode) = mode {
2036 write!(f, " {mode}")?;
2037 }
2038 Ok(())
2039 }
2040 }
2041 }
2042}
2043
2044#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2048#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2049#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2050pub enum AfterMatchSkip {
2051 PastLastRow,
2053 ToNextRow,
2055 ToFirst(Ident),
2057 ToLast(Ident),
2059}
2060
2061impl fmt::Display for AfterMatchSkip {
2062 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2063 write!(f, "AFTER MATCH SKIP ")?;
2064 match self {
2065 AfterMatchSkip::PastLastRow => write!(f, "PAST LAST ROW"),
2066 AfterMatchSkip::ToNextRow => write!(f, " TO NEXT ROW"),
2067 AfterMatchSkip::ToFirst(symbol) => write!(f, "TO FIRST {symbol}"),
2068 AfterMatchSkip::ToLast(symbol) => write!(f, "TO LAST {symbol}"),
2069 }
2070 }
2071}
2072
2073#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2074#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2075#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2076pub enum EmptyMatchesMode {
2078 Show,
2080 Omit,
2082 WithUnmatched,
2084}
2085
2086impl fmt::Display for EmptyMatchesMode {
2087 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2088 match self {
2089 EmptyMatchesMode::Show => write!(f, "SHOW EMPTY MATCHES"),
2090 EmptyMatchesMode::Omit => write!(f, "OMIT EMPTY MATCHES"),
2091 EmptyMatchesMode::WithUnmatched => write!(f, "WITH UNMATCHED ROWS"),
2092 }
2093 }
2094}
2095
2096#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2100#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2101#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2102pub struct SymbolDefinition {
2104 pub symbol: Ident,
2106 pub definition: Expr,
2108}
2109
2110impl fmt::Display for SymbolDefinition {
2111 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2112 write!(f, "{} AS {}", self.symbol, self.definition)
2113 }
2114}
2115
2116#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2118#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2119#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2120pub enum MatchRecognizeSymbol {
2121 Named(Ident),
2123 Start,
2125 End,
2127}
2128
2129impl fmt::Display for MatchRecognizeSymbol {
2130 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2131 match self {
2132 MatchRecognizeSymbol::Named(symbol) => write!(f, "{symbol}"),
2133 MatchRecognizeSymbol::Start => write!(f, "^"),
2134 MatchRecognizeSymbol::End => write!(f, "$"),
2135 }
2136 }
2137}
2138
2139#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2143#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2144#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2145pub enum MatchRecognizePattern {
2146 Symbol(MatchRecognizeSymbol),
2148 Exclude(MatchRecognizeSymbol),
2150 Permute(Vec<MatchRecognizeSymbol>),
2152 Concat(Vec<MatchRecognizePattern>),
2154 Group(Box<MatchRecognizePattern>),
2156 Alternation(Vec<MatchRecognizePattern>),
2158 Repetition(Box<MatchRecognizePattern>, RepetitionQuantifier),
2160}
2161
2162impl fmt::Display for MatchRecognizePattern {
2163 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2164 use MatchRecognizePattern::*;
2165 match self {
2166 Symbol(symbol) => write!(f, "{symbol}"),
2167 Exclude(symbol) => write!(f, "{{- {symbol} -}}"),
2168 Permute(symbols) => write!(f, "PERMUTE({})", display_comma_separated(symbols)),
2169 Concat(patterns) => write!(f, "{}", display_separated(patterns, " ")),
2170 Group(pattern) => write!(f, "( {pattern} )"),
2171 Alternation(patterns) => write!(f, "{}", display_separated(patterns, " | ")),
2172 Repetition(pattern, op) => write!(f, "{pattern}{op}"),
2173 }
2174 }
2175}
2176
2177#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2180#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2181#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2182pub enum RepetitionQuantifier {
2183 ZeroOrMore,
2185 OneOrMore,
2187 AtMostOne,
2189 Exactly(u32),
2191 AtLeast(u32),
2193 AtMost(u32),
2195 Range(u32, u32),
2197}
2198
2199impl fmt::Display for RepetitionQuantifier {
2200 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2201 use RepetitionQuantifier::*;
2202 match self {
2203 ZeroOrMore => write!(f, "*"),
2204 OneOrMore => write!(f, "+"),
2205 AtMostOne => write!(f, "?"),
2206 Exactly(n) => write!(f, "{{{n}}}"),
2207 AtLeast(n) => write!(f, "{{{n},}}"),
2208 AtMost(n) => write!(f, "{{,{n}}}"),
2209 Range(n, m) => write!(f, "{{{n},{m}}}"),
2210 }
2211 }
2212}
2213
2214impl fmt::Display for TableFactor {
2215 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2216 match self {
2217 TableFactor::Table {
2218 name,
2219 alias,
2220 args,
2221 with_hints,
2222 version,
2223 partitions,
2224 with_ordinality,
2225 json_path,
2226 sample,
2227 index_hints,
2228 } => {
2229 name.fmt(f)?;
2230 if let Some(json_path) = json_path {
2231 json_path.fmt(f)?;
2232 }
2233 if !partitions.is_empty() {
2234 write!(f, " PARTITION ({})", display_comma_separated(partitions))?;
2235 }
2236 if let Some(args) = args {
2237 write!(f, "(")?;
2238 write!(f, "{}", display_comma_separated(&args.args))?;
2239 if let Some(ref settings) = args.settings {
2240 if !args.args.is_empty() {
2241 write!(f, ", ")?;
2242 }
2243 write!(f, "SETTINGS {}", display_comma_separated(settings))?;
2244 }
2245 write!(f, ")")?;
2246 }
2247 if *with_ordinality {
2248 write!(f, " WITH ORDINALITY")?;
2249 }
2250 if let Some(TableSampleKind::BeforeTableAlias(sample)) = sample {
2251 write!(f, " {sample}")?;
2252 }
2253 if let Some(alias) = alias {
2254 write!(f, " {alias}")?;
2255 }
2256 if !index_hints.is_empty() {
2257 write!(f, " {}", display_separated(index_hints, " "))?;
2258 }
2259 if !with_hints.is_empty() {
2260 write!(f, " WITH ({})", display_comma_separated(with_hints))?;
2261 }
2262 if let Some(version) = version {
2263 write!(f, " {version}")?;
2264 }
2265 if let Some(TableSampleKind::AfterTableAlias(sample)) = sample {
2266 write!(f, " {sample}")?;
2267 }
2268 Ok(())
2269 }
2270 TableFactor::Derived {
2271 lateral,
2272 subquery,
2273 alias,
2274 sample,
2275 } => {
2276 if *lateral {
2277 write!(f, "LATERAL ")?;
2278 }
2279 f.write_str("(")?;
2280 NewLine.fmt(f)?;
2281 Indent(subquery).fmt(f)?;
2282 NewLine.fmt(f)?;
2283 f.write_str(")")?;
2284 if let Some(alias) = alias {
2285 write!(f, " {alias}")?;
2286 }
2287 if let Some(TableSampleKind::AfterTableAlias(sample)) = sample {
2288 write!(f, " {sample}")?;
2289 }
2290 Ok(())
2291 }
2292 TableFactor::Function {
2293 lateral,
2294 name,
2295 args,
2296 with_ordinality,
2297 alias,
2298 } => {
2299 if *lateral {
2300 write!(f, "LATERAL ")?;
2301 }
2302 write!(f, "{name}")?;
2303 write!(f, "({})", display_comma_separated(args))?;
2304 if *with_ordinality {
2305 write!(f, " WITH ORDINALITY")?;
2306 }
2307 if let Some(alias) = alias {
2308 write!(f, " {alias}")?;
2309 }
2310 Ok(())
2311 }
2312 TableFactor::TableFunction { expr, alias } => {
2313 write!(f, "TABLE({expr})")?;
2314 if let Some(alias) = alias {
2315 write!(f, " {alias}")?;
2316 }
2317 Ok(())
2318 }
2319 TableFactor::UNNEST {
2320 alias,
2321 array_exprs,
2322 with_offset,
2323 with_offset_alias,
2324 with_ordinality,
2325 } => {
2326 write!(f, "UNNEST({})", display_comma_separated(array_exprs))?;
2327
2328 if *with_ordinality {
2329 write!(f, " WITH ORDINALITY")?;
2330 }
2331
2332 if let Some(alias) = alias {
2333 write!(f, " {alias}")?;
2334 }
2335 if *with_offset {
2336 write!(f, " WITH OFFSET")?;
2337 }
2338 if let Some(alias) = with_offset_alias {
2339 write!(f, " {alias}")?;
2340 }
2341 Ok(())
2342 }
2343 TableFactor::JsonTable {
2344 json_expr,
2345 json_path,
2346 columns,
2347 alias,
2348 } => {
2349 write!(
2350 f,
2351 "JSON_TABLE({json_expr}, {json_path} COLUMNS({columns}))",
2352 columns = display_comma_separated(columns)
2353 )?;
2354 if let Some(alias) = alias {
2355 write!(f, " {alias}")?;
2356 }
2357 Ok(())
2358 }
2359 TableFactor::OpenJsonTable {
2360 json_expr,
2361 json_path,
2362 columns,
2363 alias,
2364 } => {
2365 write!(f, "OPENJSON({json_expr}")?;
2366 if let Some(json_path) = json_path {
2367 write!(f, ", {json_path}")?;
2368 }
2369 write!(f, ")")?;
2370 if !columns.is_empty() {
2371 write!(f, " WITH ({})", display_comma_separated(columns))?;
2372 }
2373 if let Some(alias) = alias {
2374 write!(f, " {alias}")?;
2375 }
2376 Ok(())
2377 }
2378 TableFactor::NestedJoin {
2379 table_with_joins,
2380 alias,
2381 } => {
2382 write!(f, "({table_with_joins})")?;
2383 if let Some(alias) = alias {
2384 write!(f, " {alias}")?;
2385 }
2386 Ok(())
2387 }
2388 TableFactor::Pivot {
2389 table,
2390 aggregate_functions,
2391 value_column,
2392 value_source,
2393 default_on_null,
2394 alias,
2395 } => {
2396 write!(
2397 f,
2398 "{table} PIVOT({} FOR ",
2399 display_comma_separated(aggregate_functions),
2400 )?;
2401 if value_column.len() == 1 {
2402 write!(f, "{}", value_column[0])?;
2403 } else {
2404 write!(f, "({})", display_comma_separated(value_column))?;
2405 }
2406 write!(f, " IN ({value_source})")?;
2407 if let Some(expr) = default_on_null {
2408 write!(f, " DEFAULT ON NULL ({expr})")?;
2409 }
2410 write!(f, ")")?;
2411 if let Some(alias) = alias {
2412 write!(f, " {alias}")?;
2413 }
2414 Ok(())
2415 }
2416 TableFactor::Unpivot {
2417 table,
2418 null_inclusion,
2419 value,
2420 name,
2421 columns,
2422 alias,
2423 } => {
2424 write!(f, "{table} UNPIVOT")?;
2425 if let Some(null_inclusion) = null_inclusion {
2426 write!(f, " {null_inclusion} ")?;
2427 }
2428 write!(
2429 f,
2430 "({} FOR {} IN ({}))",
2431 value,
2432 name,
2433 display_comma_separated(columns)
2434 )?;
2435 if let Some(alias) = alias {
2436 write!(f, " {alias}")?;
2437 }
2438 Ok(())
2439 }
2440 TableFactor::UnpivotExpr {
2441 expression,
2442 value_alias,
2443 attribute_alias,
2444 } => {
2445 write!(f, "UNPIVOT {expression} AS {value_alias}")?;
2446 if let Some(attribute_alias) = attribute_alias {
2447 write!(f, " AT {attribute_alias}")?;
2448 }
2449 Ok(())
2450 }
2451 TableFactor::MatchRecognize {
2452 table,
2453 partition_by,
2454 order_by,
2455 measures,
2456 rows_per_match,
2457 after_match_skip,
2458 pattern,
2459 symbols,
2460 alias,
2461 } => {
2462 write!(f, "{table} MATCH_RECOGNIZE(")?;
2463 if !partition_by.is_empty() {
2464 write!(f, "PARTITION BY {} ", display_comma_separated(partition_by))?;
2465 }
2466 if !order_by.is_empty() {
2467 write!(f, "ORDER BY {} ", display_comma_separated(order_by))?;
2468 }
2469 if !measures.is_empty() {
2470 write!(f, "MEASURES {} ", display_comma_separated(measures))?;
2471 }
2472 if let Some(rows_per_match) = rows_per_match {
2473 write!(f, "{rows_per_match} ")?;
2474 }
2475 if let Some(after_match_skip) = after_match_skip {
2476 write!(f, "{after_match_skip} ")?;
2477 }
2478 write!(f, "PATTERN ({pattern}) ")?;
2479 write!(f, "DEFINE {})", display_comma_separated(symbols))?;
2480 if let Some(alias) = alias {
2481 write!(f, " {alias}")?;
2482 }
2483 Ok(())
2484 }
2485 TableFactor::XmlTable {
2486 row_expression,
2487 passing,
2488 columns,
2489 alias,
2490 namespaces,
2491 } => {
2492 write!(f, "XMLTABLE(")?;
2493 if !namespaces.is_empty() {
2494 write!(
2495 f,
2496 "XMLNAMESPACES({}), ",
2497 display_comma_separated(namespaces)
2498 )?;
2499 }
2500 write!(
2501 f,
2502 "{row_expression}{passing} COLUMNS {columns})",
2503 columns = display_comma_separated(columns)
2504 )?;
2505 if let Some(alias) = alias {
2506 write!(f, " {alias}")?;
2507 }
2508 Ok(())
2509 }
2510 TableFactor::SemanticView {
2511 name,
2512 dimensions,
2513 metrics,
2514 facts,
2515 where_clause,
2516 alias,
2517 } => {
2518 write!(f, "SEMANTIC_VIEW({name}")?;
2519
2520 if !dimensions.is_empty() {
2521 write!(f, " DIMENSIONS {}", display_comma_separated(dimensions))?;
2522 }
2523
2524 if !metrics.is_empty() {
2525 write!(f, " METRICS {}", display_comma_separated(metrics))?;
2526 }
2527
2528 if !facts.is_empty() {
2529 write!(f, " FACTS {}", display_comma_separated(facts))?;
2530 }
2531
2532 if let Some(where_clause) = where_clause {
2533 write!(f, " WHERE {where_clause}")?;
2534 }
2535
2536 write!(f, ")")?;
2537
2538 if let Some(alias) = alias {
2539 write!(f, " {alias}")?;
2540 }
2541
2542 Ok(())
2543 }
2544 }
2545 }
2546}
2547
2548#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2549#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2550#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2551pub struct TableAlias {
2553 pub explicit: bool,
2557 pub name: Ident,
2559 pub columns: Vec<TableAliasColumnDef>,
2561 pub at: Option<Ident>,
2567}
2568
2569impl fmt::Display for TableAlias {
2570 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2571 write!(f, "{}{}", if self.explicit { "AS " } else { "" }, self.name)?;
2572 if !self.columns.is_empty() {
2573 write!(f, " ({})", display_comma_separated(&self.columns))?;
2574 }
2575 if let Some(at) = &self.at {
2576 write!(f, " AT {at}")?;
2577 }
2578 Ok(())
2579 }
2580}
2581
2582#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2588#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2589#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2590pub struct TableAliasColumnDef {
2591 pub name: Ident,
2593 pub data_type: Option<DataType>,
2595}
2596
2597impl TableAliasColumnDef {
2598 pub fn from_name<S: Into<String>>(name: S) -> Self {
2600 TableAliasColumnDef {
2601 name: Ident::new(name),
2602 data_type: None,
2603 }
2604 }
2605}
2606
2607impl fmt::Display for TableAliasColumnDef {
2608 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2609 write!(f, "{}", self.name)?;
2610 if let Some(ref data_type) = self.data_type {
2611 write!(f, " {data_type}")?;
2612 }
2613 Ok(())
2614 }
2615}
2616
2617#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2618#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2619#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2620pub enum TableVersion {
2622 ForSystemTimeAsOf(Expr),
2625 TimestampAsOf(Expr),
2629 VersionAsOf(Expr),
2633 Function(Expr),
2636 Changes {
2646 changes: Expr,
2648 at: Expr,
2650 end: Option<Expr>,
2652 },
2653}
2654
2655impl Display for TableVersion {
2656 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2657 match self {
2658 TableVersion::ForSystemTimeAsOf(e) => write!(f, "FOR SYSTEM_TIME AS OF {e}")?,
2659 TableVersion::TimestampAsOf(e) => write!(f, "TIMESTAMP AS OF {e}")?,
2660 TableVersion::VersionAsOf(e) => write!(f, "VERSION AS OF {e}")?,
2661 TableVersion::Function(func) => write!(f, "{func}")?,
2662 TableVersion::Changes { changes, at, end } => {
2663 write!(f, "{changes} {at}")?;
2664 if let Some(end) = end {
2665 write!(f, " {end}")?;
2666 }
2667 }
2668 }
2669 Ok(())
2670 }
2671}
2672
2673#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2674#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2675#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2676pub struct Join {
2678 pub relation: TableFactor,
2680 pub global: bool,
2683 pub join_operator: JoinOperator,
2685}
2686
2687impl fmt::Display for Join {
2688 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2689 fn prefix(constraint: &JoinConstraint) -> &'static str {
2690 match constraint {
2691 JoinConstraint::Natural => "NATURAL ",
2692 _ => "",
2693 }
2694 }
2695 fn suffix(constraint: &'_ JoinConstraint) -> impl fmt::Display + '_ {
2696 struct Suffix<'a>(&'a JoinConstraint);
2697 impl fmt::Display for Suffix<'_> {
2698 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2699 match self.0 {
2700 JoinConstraint::On(expr) => write!(f, " ON {expr}"),
2701 JoinConstraint::Using(attrs) => {
2702 write!(f, " USING({})", display_comma_separated(attrs))
2703 }
2704 _ => Ok(()),
2705 }
2706 }
2707 }
2708 Suffix(constraint)
2709 }
2710 if self.global {
2711 write!(f, "GLOBAL ")?;
2712 }
2713
2714 match &self.join_operator {
2715 JoinOperator::Join(constraint) => f.write_fmt(format_args!(
2716 "{}JOIN {}{}",
2717 prefix(constraint),
2718 self.relation,
2719 suffix(constraint)
2720 )),
2721 JoinOperator::Inner(constraint) => f.write_fmt(format_args!(
2722 "{}INNER JOIN {}{}",
2723 prefix(constraint),
2724 self.relation,
2725 suffix(constraint)
2726 )),
2727 JoinOperator::Left(constraint) => f.write_fmt(format_args!(
2728 "{}LEFT JOIN {}{}",
2729 prefix(constraint),
2730 self.relation,
2731 suffix(constraint)
2732 )),
2733 JoinOperator::LeftOuter(constraint) => f.write_fmt(format_args!(
2734 "{}LEFT OUTER JOIN {}{}",
2735 prefix(constraint),
2736 self.relation,
2737 suffix(constraint)
2738 )),
2739 JoinOperator::Right(constraint) => f.write_fmt(format_args!(
2740 "{}RIGHT JOIN {}{}",
2741 prefix(constraint),
2742 self.relation,
2743 suffix(constraint)
2744 )),
2745 JoinOperator::RightOuter(constraint) => f.write_fmt(format_args!(
2746 "{}RIGHT OUTER JOIN {}{}",
2747 prefix(constraint),
2748 self.relation,
2749 suffix(constraint)
2750 )),
2751 JoinOperator::FullOuter(constraint) => f.write_fmt(format_args!(
2752 "{}FULL JOIN {}{}",
2753 prefix(constraint),
2754 self.relation,
2755 suffix(constraint)
2756 )),
2757 JoinOperator::CrossJoin(constraint) => f.write_fmt(format_args!(
2758 "CROSS JOIN {}{}",
2759 self.relation,
2760 suffix(constraint)
2761 )),
2762 JoinOperator::Semi(constraint) => f.write_fmt(format_args!(
2763 "{}SEMI JOIN {}{}",
2764 prefix(constraint),
2765 self.relation,
2766 suffix(constraint)
2767 )),
2768 JoinOperator::LeftSemi(constraint) => f.write_fmt(format_args!(
2769 "{}LEFT SEMI JOIN {}{}",
2770 prefix(constraint),
2771 self.relation,
2772 suffix(constraint)
2773 )),
2774 JoinOperator::RightSemi(constraint) => f.write_fmt(format_args!(
2775 "{}RIGHT SEMI JOIN {}{}",
2776 prefix(constraint),
2777 self.relation,
2778 suffix(constraint)
2779 )),
2780 JoinOperator::Anti(constraint) => f.write_fmt(format_args!(
2781 "{}ANTI JOIN {}{}",
2782 prefix(constraint),
2783 self.relation,
2784 suffix(constraint)
2785 )),
2786 JoinOperator::LeftAnti(constraint) => f.write_fmt(format_args!(
2787 "{}LEFT ANTI JOIN {}{}",
2788 prefix(constraint),
2789 self.relation,
2790 suffix(constraint)
2791 )),
2792 JoinOperator::RightAnti(constraint) => f.write_fmt(format_args!(
2793 "{}RIGHT ANTI JOIN {}{}",
2794 prefix(constraint),
2795 self.relation,
2796 suffix(constraint)
2797 )),
2798 JoinOperator::CrossApply => f.write_fmt(format_args!("CROSS APPLY {}", self.relation)),
2799 JoinOperator::OuterApply => f.write_fmt(format_args!("OUTER APPLY {}", self.relation)),
2800 JoinOperator::AsOf {
2801 match_condition,
2802 constraint,
2803 } => f.write_fmt(format_args!(
2804 "ASOF JOIN {} MATCH_CONDITION ({match_condition}){}",
2805 self.relation,
2806 suffix(constraint)
2807 )),
2808 JoinOperator::StraightJoin(constraint) => f.write_fmt(format_args!(
2809 "STRAIGHT_JOIN {}{}",
2810 self.relation,
2811 suffix(constraint)
2812 )),
2813 JoinOperator::ArrayJoin => f.write_fmt(format_args!("ARRAY JOIN {}", self.relation)),
2814 JoinOperator::LeftArrayJoin => {
2815 f.write_fmt(format_args!("LEFT ARRAY JOIN {}", self.relation))
2816 }
2817 JoinOperator::InnerArrayJoin => {
2818 f.write_fmt(format_args!("INNER ARRAY JOIN {}", self.relation))
2819 }
2820 }
2821 }
2822}
2823
2824#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2825#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2826#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2827pub enum JoinOperator {
2829 Join(JoinConstraint),
2831 Inner(JoinConstraint),
2833 Left(JoinConstraint),
2835 LeftOuter(JoinConstraint),
2837 Right(JoinConstraint),
2839 RightOuter(JoinConstraint),
2841 FullOuter(JoinConstraint),
2843 CrossJoin(JoinConstraint),
2845 Semi(JoinConstraint),
2847 LeftSemi(JoinConstraint),
2849 RightSemi(JoinConstraint),
2851 Anti(JoinConstraint),
2853 LeftAnti(JoinConstraint),
2855 RightAnti(JoinConstraint),
2857 CrossApply,
2859 OuterApply,
2861 AsOf {
2865 match_condition: Expr,
2867 constraint: JoinConstraint,
2869 },
2870 StraightJoin(JoinConstraint),
2874 ArrayJoin,
2878 LeftArrayJoin,
2880 InnerArrayJoin,
2882}
2883
2884#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2885#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2886#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2887pub enum JoinConstraint {
2889 On(Expr),
2891 Using(Vec<ObjectName>),
2893 Natural,
2895 None,
2897}
2898
2899#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2900#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2901#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2902pub enum OrderByKind {
2904 All(OrderByOptions),
2909
2910 Expressions(Vec<OrderByExpr>),
2912}
2913
2914#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2915#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2916#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2917#[cfg_attr(feature = "visitor", visit(with = "visit_order_by"))]
2918pub struct OrderBy {
2920 pub kind: OrderByKind,
2922
2923 pub interpolate: Option<Interpolate>,
2925}
2926
2927impl fmt::Display for OrderBy {
2928 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2929 write!(f, "ORDER BY")?;
2930 match &self.kind {
2931 OrderByKind::Expressions(exprs) => {
2932 write!(f, " {}", display_comma_separated(exprs))?;
2933 }
2934 OrderByKind::All(all) => {
2935 write!(f, " ALL{all}")?;
2936 }
2937 }
2938
2939 if let Some(ref interpolate) = self.interpolate {
2940 match &interpolate.exprs {
2941 Some(exprs) => write!(f, " INTERPOLATE ({})", display_comma_separated(exprs))?,
2942 None => write!(f, " INTERPOLATE")?,
2943 }
2944 }
2945
2946 Ok(())
2947 }
2948}
2949
2950#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2952#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2953#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2954#[cfg_attr(feature = "visitor", visit(with = "visit_order_by_expr"))]
2955pub struct OrderByExpr {
2956 pub expr: Expr,
2958 pub options: OrderByOptions,
2960 pub with_fill: Option<WithFill>,
2962}
2963
2964impl From<Ident> for OrderByExpr {
2965 fn from(ident: Ident) -> Self {
2966 OrderByExpr {
2967 expr: Expr::Identifier(ident),
2968 options: OrderByOptions::default(),
2969 with_fill: None,
2970 }
2971 }
2972}
2973
2974impl fmt::Display for OrderByExpr {
2975 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2976 write!(f, "{}", self.expr)?;
2977 write!(f, "{}", self.options)?;
2978 if let Some(ref with_fill) = self.with_fill {
2979 write!(f, " {with_fill}")?
2980 }
2981 Ok(())
2982 }
2983}
2984
2985#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2990#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2991#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2992pub struct WithFill {
2994 pub from: Option<Expr>,
2996 pub to: Option<Expr>,
2998 pub step: Option<Expr>,
3000}
3001
3002impl fmt::Display for WithFill {
3003 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3004 write!(f, "WITH FILL")?;
3005 if let Some(ref from) = self.from {
3006 write!(f, " FROM {from}")?;
3007 }
3008 if let Some(ref to) = self.to {
3009 write!(f, " TO {to}")?;
3010 }
3011 if let Some(ref step) = self.step {
3012 write!(f, " STEP {step}")?;
3013 }
3014 Ok(())
3015 }
3016}
3017
3018#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3023#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3024#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3025pub struct InterpolateExpr {
3027 pub column: Ident,
3029 pub expr: Option<Expr>,
3031}
3032
3033#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3034#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3035#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3036pub struct Interpolate {
3038 pub exprs: Option<Vec<InterpolateExpr>>,
3040}
3041
3042impl fmt::Display for InterpolateExpr {
3043 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3044 write!(f, "{}", self.column)?;
3045 if let Some(ref expr) = self.expr {
3046 write!(f, " AS {expr}")?;
3047 }
3048 Ok(())
3049 }
3050}
3051
3052#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3057#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3058#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3059pub enum OrderBySort {
3060 Asc,
3062 Desc,
3064 Using(ObjectName),
3068}
3069
3070#[derive(Default, Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3071#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3072#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3073pub struct OrderByOptions {
3075 pub sort: Option<OrderBySort>,
3077 pub nulls_first: Option<bool>,
3079}
3080
3081impl fmt::Display for OrderByOptions {
3082 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3083 match &self.sort {
3084 Some(OrderBySort::Asc) => write!(f, " ASC")?,
3085 Some(OrderBySort::Desc) => write!(f, " DESC")?,
3086 Some(OrderBySort::Using(op)) => {
3087 if op.0.len() > 1 {
3088 write!(f, " USING OPERATOR({op})")?;
3089 } else {
3090 write!(f, " USING {op}")?;
3091 }
3092 }
3093 None => (),
3094 }
3095 match self.nulls_first {
3096 Some(true) => write!(f, " NULLS FIRST")?,
3097 Some(false) => write!(f, " NULLS LAST")?,
3098 None => (),
3099 }
3100 Ok(())
3101 }
3102}
3103
3104#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3105#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3106#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3107pub enum LimitClause {
3109 LimitOffset {
3113 limit: Option<Expr>,
3115 offset: Option<Offset>,
3117 limit_by: Vec<Expr>,
3119 },
3120 OffsetCommaLimit {
3122 offset: Expr,
3124 limit: Expr,
3126 },
3127}
3128
3129impl fmt::Display for LimitClause {
3130 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3131 match self {
3132 LimitClause::LimitOffset {
3133 limit,
3134 limit_by,
3135 offset,
3136 } => {
3137 if let Some(ref limit) = limit {
3138 write!(f, " LIMIT {limit}")?;
3139 }
3140 if let Some(ref offset) = offset {
3141 write!(f, " {offset}")?;
3142 }
3143 if !limit_by.is_empty() {
3144 debug_assert!(limit.is_some());
3145 write!(f, " BY {}", display_separated(limit_by, ", "))?;
3146 }
3147 Ok(())
3148 }
3149 LimitClause::OffsetCommaLimit { offset, limit } => {
3150 write!(f, " LIMIT {offset}, {limit}")
3151 }
3152 }
3153 }
3154}
3155
3156#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3157#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3158#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3159pub struct Offset {
3161 pub value: Expr,
3163 pub rows: OffsetRows,
3165}
3166
3167impl fmt::Display for Offset {
3168 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3169 write!(f, "OFFSET {}{}", self.value, self.rows)
3170 }
3171}
3172
3173#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3175#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3176#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3177pub enum OffsetRows {
3178 None,
3180 Row,
3182 Rows,
3184}
3185
3186impl fmt::Display for OffsetRows {
3187 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3188 match self {
3189 OffsetRows::None => Ok(()),
3190 OffsetRows::Row => write!(f, " ROW"),
3191 OffsetRows::Rows => write!(f, " ROWS"),
3192 }
3193 }
3194}
3195
3196#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3208#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3209#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3210pub enum PipeOperator {
3211 Limit {
3217 expr: Expr,
3219 offset: Option<Expr>,
3221 },
3222 Where {
3228 expr: Expr,
3230 },
3231 OrderBy {
3233 exprs: Vec<OrderByExpr>,
3235 },
3236 Select {
3242 exprs: Vec<SelectItem>,
3244 },
3245 Extend {
3251 exprs: Vec<SelectItem>,
3253 },
3254 Set {
3260 assignments: Vec<Assignment>,
3262 },
3263 Drop {
3269 columns: Vec<Ident>,
3271 },
3272 As {
3278 alias: Ident,
3280 },
3281 Aggregate {
3293 full_table_exprs: Vec<ExprWithAliasAndOrderBy>,
3295 group_by_expr: Vec<ExprWithAliasAndOrderBy>,
3297 },
3298 TableSample {
3302 sample: Box<TableSample>,
3304 },
3305 Rename {
3311 mappings: Vec<IdentWithAlias>,
3313 },
3314 Union {
3320 set_quantifier: SetQuantifier,
3322 queries: Vec<Query>,
3324 },
3325 Intersect {
3331 set_quantifier: SetQuantifier,
3333 queries: Vec<Query>,
3335 },
3336 Except {
3342 set_quantifier: SetQuantifier,
3344 queries: Vec<Query>,
3346 },
3347 Call {
3353 function: Function,
3355 alias: Option<Ident>,
3357 },
3358 Pivot {
3364 aggregate_functions: Vec<ExprWithAlias>,
3366 value_column: Vec<Ident>,
3368 value_source: PivotValueSource,
3370 alias: Option<Ident>,
3372 },
3373 Unpivot {
3382 value_column: Ident,
3384 name_column: Ident,
3386 unpivot_columns: Vec<Ident>,
3388 alias: Option<Ident>,
3390 },
3391 Join(Join),
3397}
3398
3399impl fmt::Display for PipeOperator {
3400 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3401 match self {
3402 PipeOperator::Select { exprs } => {
3403 write!(f, "SELECT {}", display_comma_separated(exprs.as_slice()))
3404 }
3405 PipeOperator::Extend { exprs } => {
3406 write!(f, "EXTEND {}", display_comma_separated(exprs.as_slice()))
3407 }
3408 PipeOperator::Set { assignments } => {
3409 write!(f, "SET {}", display_comma_separated(assignments.as_slice()))
3410 }
3411 PipeOperator::Drop { columns } => {
3412 write!(f, "DROP {}", display_comma_separated(columns.as_slice()))
3413 }
3414 PipeOperator::As { alias } => {
3415 write!(f, "AS {alias}")
3416 }
3417 PipeOperator::Limit { expr, offset } => {
3418 write!(f, "LIMIT {expr}")?;
3419 if let Some(offset) = offset {
3420 write!(f, " OFFSET {offset}")?;
3421 }
3422 Ok(())
3423 }
3424 PipeOperator::Aggregate {
3425 full_table_exprs,
3426 group_by_expr,
3427 } => {
3428 write!(f, "AGGREGATE")?;
3429 if !full_table_exprs.is_empty() {
3430 write!(
3431 f,
3432 " {}",
3433 display_comma_separated(full_table_exprs.as_slice())
3434 )?;
3435 }
3436 if !group_by_expr.is_empty() {
3437 write!(f, " GROUP BY {}", display_comma_separated(group_by_expr))?;
3438 }
3439 Ok(())
3440 }
3441
3442 PipeOperator::Where { expr } => {
3443 write!(f, "WHERE {expr}")
3444 }
3445 PipeOperator::OrderBy { exprs } => {
3446 write!(f, "ORDER BY {}", display_comma_separated(exprs.as_slice()))
3447 }
3448
3449 PipeOperator::TableSample { sample } => {
3450 write!(f, "{sample}")
3451 }
3452 PipeOperator::Rename { mappings } => {
3453 write!(f, "RENAME {}", display_comma_separated(mappings))
3454 }
3455 PipeOperator::Union {
3456 set_quantifier,
3457 queries,
3458 } => Self::fmt_set_operation(f, "UNION", set_quantifier, queries),
3459 PipeOperator::Intersect {
3460 set_quantifier,
3461 queries,
3462 } => Self::fmt_set_operation(f, "INTERSECT", set_quantifier, queries),
3463 PipeOperator::Except {
3464 set_quantifier,
3465 queries,
3466 } => Self::fmt_set_operation(f, "EXCEPT", set_quantifier, queries),
3467 PipeOperator::Call { function, alias } => {
3468 write!(f, "CALL {function}")?;
3469 Self::fmt_optional_alias(f, alias)
3470 }
3471 PipeOperator::Pivot {
3472 aggregate_functions,
3473 value_column,
3474 value_source,
3475 alias,
3476 } => {
3477 write!(
3478 f,
3479 "PIVOT({} FOR {} IN ({}))",
3480 display_comma_separated(aggregate_functions),
3481 Expr::CompoundIdentifier(value_column.to_vec()),
3482 value_source
3483 )?;
3484 Self::fmt_optional_alias(f, alias)
3485 }
3486 PipeOperator::Unpivot {
3487 value_column,
3488 name_column,
3489 unpivot_columns,
3490 alias,
3491 } => {
3492 write!(
3493 f,
3494 "UNPIVOT({} FOR {} IN ({}))",
3495 value_column,
3496 name_column,
3497 display_comma_separated(unpivot_columns)
3498 )?;
3499 Self::fmt_optional_alias(f, alias)
3500 }
3501 PipeOperator::Join(join) => write!(f, "{join}"),
3502 }
3503 }
3504}
3505
3506impl PipeOperator {
3507 fn fmt_optional_alias(f: &mut fmt::Formatter<'_>, alias: &Option<Ident>) -> fmt::Result {
3509 if let Some(alias) = alias {
3510 write!(f, " AS {alias}")?;
3511 }
3512 Ok(())
3513 }
3514
3515 fn fmt_set_operation(
3517 f: &mut fmt::Formatter<'_>,
3518 operation: &str,
3519 set_quantifier: &SetQuantifier,
3520 queries: &[Query],
3521 ) -> fmt::Result {
3522 write!(f, "{operation}")?;
3523 match set_quantifier {
3524 SetQuantifier::None => {}
3525 _ => {
3526 write!(f, " {set_quantifier}")?;
3527 }
3528 }
3529 write!(f, " ")?;
3530 let parenthesized_queries: Vec<String> =
3531 queries.iter().map(|query| format!("({query})")).collect();
3532 write!(f, "{}", display_comma_separated(&parenthesized_queries))
3533 }
3534}
3535
3536#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3537#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3538#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3539pub struct Fetch {
3541 pub with_ties: bool,
3543 pub percent: bool,
3545 pub quantity: Option<Expr>,
3547}
3548
3549impl fmt::Display for Fetch {
3550 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3551 let extension = if self.with_ties { "WITH TIES" } else { "ONLY" };
3552 if let Some(ref quantity) = self.quantity {
3553 let percent = if self.percent { " PERCENT" } else { "" };
3554 write!(f, "FETCH FIRST {quantity}{percent} ROWS {extension}")
3555 } else {
3556 write!(f, "FETCH FIRST ROWS {extension}")
3557 }
3558 }
3559}
3560
3561#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3562#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3563#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3564pub struct LockClause {
3566 pub lock_type: LockType,
3568 pub of: Option<ObjectName>,
3570 pub nonblock: Option<NonBlock>,
3572}
3573
3574impl fmt::Display for LockClause {
3575 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3576 write!(f, "FOR {}", self.lock_type)?;
3577 if let Some(ref of) = self.of {
3578 write!(f, " OF {of}")?;
3579 }
3580 if let Some(ref nb) = self.nonblock {
3581 write!(f, " {nb}")?;
3582 }
3583 Ok(())
3584 }
3585}
3586
3587#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3588#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3589#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3590pub enum LockType {
3592 Share,
3594 Update,
3596}
3597
3598impl fmt::Display for LockType {
3599 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3600 let select_lock = match self {
3601 LockType::Share => "SHARE",
3602 LockType::Update => "UPDATE",
3603 };
3604 write!(f, "{select_lock}")
3605 }
3606}
3607
3608#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3609#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3610#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3611pub enum NonBlock {
3613 Nowait,
3615 SkipLocked,
3617}
3618
3619impl fmt::Display for NonBlock {
3620 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3621 let nonblock = match self {
3622 NonBlock::Nowait => "NOWAIT",
3623 NonBlock::SkipLocked => "SKIP LOCKED",
3624 };
3625 write!(f, "{nonblock}")
3626 }
3627}
3628
3629#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3630#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3631#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3632pub enum Distinct {
3634 All,
3639
3640 Distinct,
3642
3643 On(Vec<Expr>),
3645}
3646
3647impl fmt::Display for Distinct {
3648 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3649 match self {
3650 Distinct::All => write!(f, "ALL"),
3651 Distinct::Distinct => write!(f, "DISTINCT"),
3652 Distinct::On(col_names) => {
3653 let col_names = display_comma_separated(col_names);
3654 write!(f, "DISTINCT ON ({col_names})")
3655 }
3656 }
3657 }
3658}
3659
3660#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3661#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3662#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3663pub struct Top {
3665 pub with_ties: bool,
3668 pub percent: bool,
3670 pub quantity: Option<TopQuantity>,
3672}
3673
3674#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3675#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3676#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3677pub enum TopQuantity {
3679 Expr(Expr),
3681 Constant(u64),
3683}
3684
3685impl fmt::Display for Top {
3686 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3687 let extension = if self.with_ties { " WITH TIES" } else { "" };
3688 if let Some(ref quantity) = self.quantity {
3689 let percent = if self.percent { " PERCENT" } else { "" };
3690 match quantity {
3691 TopQuantity::Expr(quantity) => write!(f, "TOP ({quantity}){percent}{extension}"),
3692 TopQuantity::Constant(quantity) => {
3693 write!(f, "TOP {quantity}{percent}{extension}")
3694 }
3695 }
3696 } else {
3697 write!(f, "TOP{extension}")
3698 }
3699 }
3700}
3701
3702#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3703#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3704#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3705pub struct Values {
3707 pub explicit_row: bool,
3710 pub value_keyword: bool,
3713 pub rows: Vec<Parens<Vec<Expr>>>,
3715}
3716
3717impl fmt::Display for Values {
3718 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3719 match self.value_keyword {
3720 true => f.write_str("VALUE")?,
3721 false => f.write_str("VALUES")?,
3722 };
3723 let prefix = if self.explicit_row { "ROW" } else { "" };
3724 let mut delim = "";
3725 for row in &self.rows {
3726 f.write_str(delim)?;
3727 delim = ",";
3728 SpaceOrNewline.fmt(f)?;
3729 Indent(format_args!("{prefix}({})", display_comma_separated(row))).fmt(f)?;
3730 }
3731 Ok(())
3732 }
3733}
3734
3735#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3736#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3737#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3738pub struct SelectInto {
3740 pub temporary: bool,
3742 pub unlogged: bool,
3744 pub table: bool,
3746 pub targets: Vec<Expr>,
3751}
3752
3753impl fmt::Display for SelectInto {
3754 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3755 let temporary = if self.temporary { " TEMPORARY" } else { "" };
3756 let unlogged = if self.unlogged { " UNLOGGED" } else { "" };
3757 let table = if self.table { " TABLE" } else { "" };
3758
3759 write!(
3760 f,
3761 "INTO{}{}{} {}",
3762 temporary,
3763 unlogged,
3764 table,
3765 display_comma_separated(&self.targets)
3766 )
3767 }
3768}
3769
3770#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3775#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3776#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3777pub enum GroupByWithModifier {
3779 Rollup,
3781 Cube,
3783 Totals,
3785 GroupingSets(Expr),
3789}
3790
3791impl fmt::Display for GroupByWithModifier {
3792 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3793 match self {
3794 GroupByWithModifier::Rollup => write!(f, "WITH ROLLUP"),
3795 GroupByWithModifier::Cube => write!(f, "WITH CUBE"),
3796 GroupByWithModifier::Totals => write!(f, "WITH TOTALS"),
3797 GroupByWithModifier::GroupingSets(expr) => {
3798 write!(f, "{expr}")
3799 }
3800 }
3801 }
3802}
3803
3804#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3805#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3806#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3807#[cfg_attr(feature = "visitor", visit(with = "visit_group_by"))]
3808pub enum GroupByExpr {
3811 All(Vec<GroupByWithModifier>),
3821 Expressions(Vec<Expr>, Vec<GroupByWithModifier>),
3823}
3824
3825impl fmt::Display for GroupByExpr {
3826 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3827 match self {
3828 GroupByExpr::All(modifiers) => {
3829 write!(f, "GROUP BY ALL")?;
3830 if !modifiers.is_empty() {
3831 write!(f, " {}", display_separated(modifiers, " "))?;
3832 }
3833 Ok(())
3834 }
3835 GroupByExpr::Expressions(col_names, modifiers) => {
3836 f.write_str("GROUP BY")?;
3837 SpaceOrNewline.fmt(f)?;
3838 Indent(display_comma_separated(col_names)).fmt(f)?;
3839 if !modifiers.is_empty() {
3840 write!(f, " {}", display_separated(modifiers, " "))?;
3841 }
3842 Ok(())
3843 }
3844 }
3845 }
3846}
3847
3848#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3852#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3853#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3854pub enum FormatClause {
3855 Identifier(Ident),
3857 Null,
3859}
3860
3861impl fmt::Display for FormatClause {
3862 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3863 match self {
3864 FormatClause::Identifier(ident) => write!(f, "FORMAT {ident}"),
3865 FormatClause::Null => write!(f, "FORMAT NULL"),
3866 }
3867 }
3868}
3869
3870#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3874#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3875#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3876pub struct InputFormatClause {
3877 pub ident: Ident,
3879 pub values: Vec<Expr>,
3881}
3882
3883impl fmt::Display for InputFormatClause {
3884 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3885 write!(f, "FORMAT {}", self.ident)?;
3886
3887 if !self.values.is_empty() {
3888 write!(f, " {}", display_comma_separated(self.values.as_slice()))?;
3889 }
3890
3891 Ok(())
3892 }
3893}
3894
3895#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3897#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3898#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3899pub enum ForClause {
3900 Browse,
3902 Json {
3904 for_json: ForJson,
3906 root: Option<String>,
3908 include_null_values: bool,
3910 without_array_wrapper: bool,
3912 },
3913 Xml {
3915 for_xml: ForXml,
3917 elements: bool,
3919 binary_base64: bool,
3921 root: Option<String>,
3923 r#type: bool,
3925 },
3926}
3927
3928impl fmt::Display for ForClause {
3929 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3930 match self {
3931 ForClause::Browse => write!(f, "FOR BROWSE"),
3932 ForClause::Json {
3933 for_json,
3934 root,
3935 include_null_values,
3936 without_array_wrapper,
3937 } => {
3938 write!(f, "FOR JSON ")?;
3939 write!(f, "{for_json}")?;
3940 if let Some(root) = root {
3941 write!(f, ", ROOT('{root}')")?;
3942 }
3943 if *include_null_values {
3944 write!(f, ", INCLUDE_NULL_VALUES")?;
3945 }
3946 if *without_array_wrapper {
3947 write!(f, ", WITHOUT_ARRAY_WRAPPER")?;
3948 }
3949 Ok(())
3950 }
3951 ForClause::Xml {
3952 for_xml,
3953 elements,
3954 binary_base64,
3955 root,
3956 r#type,
3957 } => {
3958 write!(f, "FOR XML ")?;
3959 write!(f, "{for_xml}")?;
3960 if *binary_base64 {
3961 write!(f, ", BINARY BASE64")?;
3962 }
3963 if *r#type {
3964 write!(f, ", TYPE")?;
3965 }
3966 if let Some(root) = root {
3967 write!(f, ", ROOT('{root}')")?;
3968 }
3969 if *elements {
3970 write!(f, ", ELEMENTS")?;
3971 }
3972 Ok(())
3973 }
3974 }
3975 }
3976}
3977
3978#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3979#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3980#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3981pub enum ForXml {
3983 Raw(Option<String>),
3985 Auto,
3987 Explicit,
3989 Path(Option<String>),
3991}
3992
3993impl fmt::Display for ForXml {
3994 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3995 match self {
3996 ForXml::Raw(root) => {
3997 write!(f, "RAW")?;
3998 if let Some(root) = root {
3999 write!(f, "('{root}')")?;
4000 }
4001 Ok(())
4002 }
4003 ForXml::Auto => write!(f, "AUTO"),
4004 ForXml::Explicit => write!(f, "EXPLICIT"),
4005 ForXml::Path(root) => {
4006 write!(f, "PATH")?;
4007 if let Some(root) = root {
4008 write!(f, "('{root}')")?;
4009 }
4010 Ok(())
4011 }
4012 }
4013 }
4014}
4015
4016#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4017#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4018#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4019pub enum ForJson {
4021 Auto,
4023 Path,
4025}
4026
4027impl fmt::Display for ForJson {
4028 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4029 match self {
4030 ForJson::Auto => write!(f, "AUTO"),
4031 ForJson::Path => write!(f, "PATH"),
4032 }
4033 }
4034}
4035
4036#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4057#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4058#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4059pub enum JsonTableColumn {
4060 Named(JsonTableNamedColumn),
4062 ForOrdinality(Ident),
4064 Nested(JsonTableNestedColumn),
4066}
4067
4068impl fmt::Display for JsonTableColumn {
4069 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4070 match self {
4071 JsonTableColumn::Named(json_table_named_column) => {
4072 write!(f, "{json_table_named_column}")
4073 }
4074 JsonTableColumn::ForOrdinality(ident) => write!(f, "{ident} FOR ORDINALITY"),
4075 JsonTableColumn::Nested(json_table_nested_column) => {
4076 write!(f, "{json_table_nested_column}")
4077 }
4078 }
4079 }
4080}
4081
4082#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4086#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4087#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4088pub struct JsonTableNestedColumn {
4090 pub path: ValueWithSpan,
4092 pub columns: Vec<JsonTableColumn>,
4094}
4095
4096impl fmt::Display for JsonTableNestedColumn {
4097 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4098 write!(
4099 f,
4100 "NESTED PATH {} COLUMNS ({})",
4101 self.path,
4102 display_comma_separated(&self.columns)
4103 )
4104 }
4105}
4106
4107#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4115#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4116#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4117pub struct JsonTableNamedColumn {
4118 pub name: Ident,
4120 pub r#type: DataType,
4122 pub path: ValueWithSpan,
4124 pub exists: bool,
4126 pub on_empty: Option<JsonTableColumnErrorHandling>,
4128 pub on_error: Option<JsonTableColumnErrorHandling>,
4130}
4131
4132impl fmt::Display for JsonTableNamedColumn {
4133 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4134 write!(
4135 f,
4136 "{} {}{} PATH {}",
4137 self.name,
4138 self.r#type,
4139 if self.exists { " EXISTS" } else { "" },
4140 self.path
4141 )?;
4142 if let Some(on_empty) = &self.on_empty {
4143 write!(f, " {on_empty} ON EMPTY")?;
4144 }
4145 if let Some(on_error) = &self.on_error {
4146 write!(f, " {on_error} ON ERROR")?;
4147 }
4148 Ok(())
4149 }
4150}
4151
4152#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4155#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4156#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4157pub enum JsonTableColumnErrorHandling {
4159 Null,
4161 Default(ValueWithSpan),
4163 Error,
4165}
4166
4167impl fmt::Display for JsonTableColumnErrorHandling {
4168 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4169 match self {
4170 JsonTableColumnErrorHandling::Null => write!(f, "NULL"),
4171 JsonTableColumnErrorHandling::Default(json_string) => {
4172 write!(f, "DEFAULT {json_string}")
4173 }
4174 JsonTableColumnErrorHandling::Error => write!(f, "ERROR"),
4175 }
4176 }
4177}
4178
4179#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4187#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4188#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4189pub struct OpenJsonTableColumn {
4190 pub name: Ident,
4192 pub r#type: DataType,
4194 pub path: Option<String>,
4196 pub as_json: bool,
4198}
4199
4200impl fmt::Display for OpenJsonTableColumn {
4201 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4202 write!(f, "{} {}", self.name, self.r#type)?;
4203 if let Some(path) = &self.path {
4204 write!(f, " '{}'", value::escape_single_quote_string(path))?;
4205 }
4206 if self.as_json {
4207 write!(f, " AS JSON")?;
4208 }
4209 Ok(())
4210 }
4211}
4212
4213#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4220#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4221#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4222pub enum ValueTableMode {
4224 AsStruct,
4226 AsValue,
4228 DistinctAsStruct,
4230 DistinctAsValue,
4232}
4233
4234impl fmt::Display for ValueTableMode {
4235 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4236 match self {
4237 ValueTableMode::AsStruct => write!(f, "AS STRUCT"),
4238 ValueTableMode::AsValue => write!(f, "AS VALUE"),
4239 ValueTableMode::DistinctAsStruct => write!(f, "DISTINCT AS STRUCT"),
4240 ValueTableMode::DistinctAsValue => write!(f, "DISTINCT AS VALUE"),
4241 }
4242 }
4243}
4244
4245#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4247#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4248#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4249pub enum UpdateTableFromKind {
4250 BeforeSet(Vec<TableWithJoins>),
4253 AfterSet(Vec<TableWithJoins>),
4256}
4257
4258#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4260#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4261#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4262pub enum XmlTableColumnOption {
4263 NamedInfo {
4265 r#type: DataType,
4267 path: Option<Expr>,
4269 default: Option<Expr>,
4271 nullable: bool,
4273 },
4274 ForOrdinality,
4276}
4277
4278#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4291#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4292#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4293pub struct XmlTableColumn {
4294 pub name: Ident,
4296 pub option: XmlTableColumnOption,
4298}
4299
4300impl fmt::Display for XmlTableColumn {
4301 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4302 write!(f, "{}", self.name)?;
4303 match &self.option {
4304 XmlTableColumnOption::NamedInfo {
4305 r#type,
4306 path,
4307 default,
4308 nullable,
4309 } => {
4310 write!(f, " {type}")?;
4311 if let Some(p) = path {
4312 write!(f, " PATH {p}")?;
4313 }
4314 if let Some(d) = default {
4315 write!(f, " DEFAULT {d}")?;
4316 }
4317 if !*nullable {
4318 write!(f, " NOT NULL")?;
4319 }
4320 Ok(())
4321 }
4322 XmlTableColumnOption::ForOrdinality => {
4323 write!(f, " FOR ORDINALITY")
4324 }
4325 }
4326 }
4327}
4328
4329#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4331#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4332#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4333pub struct XmlPassingArgument {
4335 pub expr: Expr,
4337 pub alias: Option<Ident>,
4339 pub by_value: bool,
4341}
4342
4343impl fmt::Display for XmlPassingArgument {
4344 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4345 if self.by_value {
4346 write!(f, "BY VALUE ")?;
4347 }
4348 write!(f, "{}", self.expr)?;
4349 if let Some(alias) = &self.alias {
4350 write!(f, " AS {alias}")?;
4351 }
4352 Ok(())
4353 }
4354}
4355
4356#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4358#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4359#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4360pub struct XmlPassingClause {
4362 pub arguments: Vec<XmlPassingArgument>,
4364}
4365
4366impl fmt::Display for XmlPassingClause {
4367 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4368 if !self.arguments.is_empty() {
4369 write!(f, " PASSING {}", display_comma_separated(&self.arguments))?;
4370 }
4371 Ok(())
4372 }
4373}
4374
4375#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4379#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4380#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4381pub struct XmlNamespaceDefinition {
4382 pub uri: Expr,
4384 pub name: Ident,
4386}
4387
4388impl fmt::Display for XmlNamespaceDefinition {
4389 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4390 write!(f, "{} AS {}", self.uri, self.name)
4391 }
4392}