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 schema_name) = self.schema_name {
311 write!(
312 f,
313 "TABLE {}.{}",
314 schema_name,
315 self.table_name.as_ref().unwrap(),
316 )?;
317 } else {
318 write!(f, "TABLE {}", self.table_name.as_ref().unwrap(),)?;
319 }
320 Ok(())
321 }
322}
323
324#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
326#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
327#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
328pub enum SelectFlavor {
329 Standard,
331 FromFirst,
333 FromFirstNoSelect,
335}
336
337#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Default)]
355#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
356#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
357pub struct SelectModifiers {
358 pub high_priority: bool,
362 pub straight_join: bool,
366 pub sql_small_result: bool,
370 pub sql_big_result: bool,
374 pub sql_buffer_result: bool,
378 pub sql_no_cache: bool,
382 pub sql_calc_found_rows: bool,
387}
388
389impl fmt::Display for SelectModifiers {
390 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
391 if self.high_priority {
392 f.write_str(" HIGH_PRIORITY")?;
393 }
394 if self.straight_join {
395 f.write_str(" STRAIGHT_JOIN")?;
396 }
397 if self.sql_small_result {
398 f.write_str(" SQL_SMALL_RESULT")?;
399 }
400 if self.sql_big_result {
401 f.write_str(" SQL_BIG_RESULT")?;
402 }
403 if self.sql_buffer_result {
404 f.write_str(" SQL_BUFFER_RESULT")?;
405 }
406 if self.sql_no_cache {
407 f.write_str(" SQL_NO_CACHE")?;
408 }
409 if self.sql_calc_found_rows {
410 f.write_str(" SQL_CALC_FOUND_ROWS")?;
411 }
412 Ok(())
413 }
414}
415
416impl SelectModifiers {
417 pub fn is_any_set(&self) -> bool {
419 let Self {
421 high_priority,
422 straight_join,
423 sql_small_result,
424 sql_big_result,
425 sql_buffer_result,
426 sql_no_cache,
427 sql_calc_found_rows,
428 } = self;
429 *high_priority
430 || *straight_join
431 || *sql_small_result
432 || *sql_big_result
433 || *sql_buffer_result
434 || *sql_no_cache
435 || *sql_calc_found_rows
436 }
437}
438
439#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
443#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
444#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
445#[cfg_attr(feature = "visitor", visit(with = "visit_select"))]
446pub struct Select {
447 pub select_token: AttachedToken,
449 pub optimizer_hints: Vec<OptimizerHint>,
454 pub distinct: Option<Distinct>,
456 pub select_modifiers: Option<SelectModifiers>,
460 pub top: Option<Top>,
462 pub top_before_distinct: bool,
464 pub projection: Vec<SelectItem>,
466 pub exclude: Option<ExcludeSelectItem>,
471 pub into: Option<SelectInto>,
473 pub from: Vec<TableWithJoins>,
475 pub lateral_views: Vec<LateralView>,
477 pub prewhere: Option<Expr>,
482 pub selection: Option<Expr>,
484 pub connect_by: Vec<ConnectByKind>,
486 pub group_by: GroupByExpr,
488 pub cluster_by: Vec<Expr>,
490 pub distribute_by: Vec<Expr>,
492 pub sort_by: Vec<OrderByExpr>,
494 pub having: Option<Expr>,
496 pub named_window: Vec<NamedWindowDefinition>,
498 pub qualify: Option<Expr>,
500 pub window_before_qualify: bool,
505 pub value_table_mode: Option<ValueTableMode>,
507 pub flavor: SelectFlavor,
509}
510
511impl fmt::Display for Select {
512 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
513 match self.flavor {
514 SelectFlavor::Standard => {
515 write!(f, "SELECT")?;
516 }
517 SelectFlavor::FromFirst => {
518 write!(f, "FROM {} SELECT", display_comma_separated(&self.from))?;
519 }
520 SelectFlavor::FromFirstNoSelect => {
521 write!(f, "FROM {}", display_comma_separated(&self.from))?;
522 }
523 }
524
525 for hint in &self.optimizer_hints {
526 f.write_str(" ")?;
527 hint.fmt(f)?;
528 }
529
530 if let Some(value_table_mode) = self.value_table_mode {
531 f.write_str(" ")?;
532 value_table_mode.fmt(f)?;
533 }
534
535 if let Some(ref top) = self.top {
536 if self.top_before_distinct {
537 f.write_str(" ")?;
538 top.fmt(f)?;
539 }
540 }
541 if let Some(ref distinct) = self.distinct {
542 f.write_str(" ")?;
543 distinct.fmt(f)?;
544 }
545 if let Some(ref top) = self.top {
546 if !self.top_before_distinct {
547 f.write_str(" ")?;
548 top.fmt(f)?;
549 }
550 }
551
552 if let Some(ref select_modifiers) = self.select_modifiers {
553 select_modifiers.fmt(f)?;
554 }
555
556 if !self.projection.is_empty() {
557 indented_list(f, &self.projection)?;
558 }
559
560 if let Some(exclude) = &self.exclude {
561 write!(f, " {exclude}")?;
562 }
563
564 if let Some(ref into) = self.into {
565 f.write_str(" ")?;
566 into.fmt(f)?;
567 }
568
569 if self.flavor == SelectFlavor::Standard && !self.from.is_empty() {
570 SpaceOrNewline.fmt(f)?;
571 f.write_str("FROM")?;
572 indented_list(f, &self.from)?;
573 }
574 if !self.lateral_views.is_empty() {
575 for lv in &self.lateral_views {
576 lv.fmt(f)?;
577 }
578 }
579 if let Some(ref prewhere) = self.prewhere {
580 f.write_str(" PREWHERE ")?;
581 prewhere.fmt(f)?;
582 }
583 if let Some(ref selection) = self.selection {
584 SpaceOrNewline.fmt(f)?;
585 f.write_str("WHERE")?;
586 SpaceOrNewline.fmt(f)?;
587 Indent(selection).fmt(f)?;
588 }
589 for clause in &self.connect_by {
590 SpaceOrNewline.fmt(f)?;
591 clause.fmt(f)?;
592 }
593 match &self.group_by {
594 GroupByExpr::All(_) => {
595 SpaceOrNewline.fmt(f)?;
596 self.group_by.fmt(f)?;
597 }
598 GroupByExpr::Expressions(exprs, _) => {
599 if !exprs.is_empty() {
600 SpaceOrNewline.fmt(f)?;
601 self.group_by.fmt(f)?;
602 }
603 }
604 }
605 if !self.cluster_by.is_empty() {
606 SpaceOrNewline.fmt(f)?;
607 f.write_str("CLUSTER BY")?;
608 SpaceOrNewline.fmt(f)?;
609 Indent(display_comma_separated(&self.cluster_by)).fmt(f)?;
610 }
611 if !self.distribute_by.is_empty() {
612 SpaceOrNewline.fmt(f)?;
613 f.write_str("DISTRIBUTE BY")?;
614 SpaceOrNewline.fmt(f)?;
615 display_comma_separated(&self.distribute_by).fmt(f)?;
616 }
617 if !self.sort_by.is_empty() {
618 SpaceOrNewline.fmt(f)?;
619 f.write_str("SORT BY")?;
620 SpaceOrNewline.fmt(f)?;
621 Indent(display_comma_separated(&self.sort_by)).fmt(f)?;
622 }
623 if let Some(ref having) = self.having {
624 SpaceOrNewline.fmt(f)?;
625 f.write_str("HAVING")?;
626 SpaceOrNewline.fmt(f)?;
627 Indent(having).fmt(f)?;
628 }
629 if self.window_before_qualify {
630 if !self.named_window.is_empty() {
631 SpaceOrNewline.fmt(f)?;
632 f.write_str("WINDOW")?;
633 SpaceOrNewline.fmt(f)?;
634 display_comma_separated(&self.named_window).fmt(f)?;
635 }
636 if let Some(ref qualify) = self.qualify {
637 SpaceOrNewline.fmt(f)?;
638 f.write_str("QUALIFY")?;
639 SpaceOrNewline.fmt(f)?;
640 qualify.fmt(f)?;
641 }
642 } else {
643 if let Some(ref qualify) = self.qualify {
644 SpaceOrNewline.fmt(f)?;
645 f.write_str("QUALIFY")?;
646 SpaceOrNewline.fmt(f)?;
647 qualify.fmt(f)?;
648 }
649 if !self.named_window.is_empty() {
650 SpaceOrNewline.fmt(f)?;
651 f.write_str("WINDOW")?;
652 SpaceOrNewline.fmt(f)?;
653 display_comma_separated(&self.named_window).fmt(f)?;
654 }
655 }
656 Ok(())
657 }
658}
659
660#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
662#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
663#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
664pub struct LateralView {
665 pub lateral_view: Expr,
667 pub lateral_view_name: ObjectName,
669 pub lateral_col_alias: Vec<Ident>,
671 pub outer: bool,
673}
674
675impl fmt::Display for LateralView {
676 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
677 write!(
678 f,
679 " LATERAL VIEW{outer} {} {}",
680 self.lateral_view,
681 self.lateral_view_name,
682 outer = if self.outer { " OUTER" } else { "" }
683 )?;
684 if !self.lateral_col_alias.is_empty() {
685 write!(
686 f,
687 " AS {}",
688 display_comma_separated(&self.lateral_col_alias)
689 )?;
690 }
691 Ok(())
692 }
693}
694
695#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
701#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
702#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
703pub enum NamedWindowExpr {
704 NamedWindow(Ident),
714 WindowSpec(WindowSpec),
721}
722
723impl fmt::Display for NamedWindowExpr {
724 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
725 match self {
726 NamedWindowExpr::NamedWindow(named_window) => {
727 write!(f, "{named_window}")?;
728 }
729 NamedWindowExpr::WindowSpec(window_spec) => {
730 write!(f, "({window_spec})")?;
731 }
732 };
733 Ok(())
734 }
735}
736
737#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
738#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
739#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
740pub struct NamedWindowDefinition(pub Ident, pub NamedWindowExpr);
742
743impl fmt::Display for NamedWindowDefinition {
744 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
745 write!(f, "{} AS {}", self.0, self.1)
746 }
747}
748
749#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
750#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
751#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
752pub struct With {
754 pub with_token: AttachedToken,
756 pub recursive: bool,
758 pub cte_tables: Vec<Cte>,
760}
761
762impl fmt::Display for With {
763 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
764 f.write_str("WITH ")?;
765 if self.recursive {
766 f.write_str("RECURSIVE ")?;
767 }
768 display_comma_separated(&self.cte_tables).fmt(f)?;
769 Ok(())
770 }
771}
772
773#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
774#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
775#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
776pub enum CteAsMaterialized {
778 Materialized,
780 NotMaterialized,
782}
783
784impl fmt::Display for CteAsMaterialized {
785 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
786 match *self {
787 CteAsMaterialized::Materialized => {
788 write!(f, "MATERIALIZED")?;
789 }
790 CteAsMaterialized::NotMaterialized => {
791 write!(f, "NOT MATERIALIZED")?;
792 }
793 };
794 Ok(())
795 }
796}
797
798#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
803#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
804#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
805pub struct Cte {
806 pub alias: TableAlias,
808 pub query: Box<Query>,
810 pub from: Option<Ident>,
812 pub materialized: Option<CteAsMaterialized>,
814 pub closing_paren_token: AttachedToken,
816}
817
818impl fmt::Display for Cte {
819 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
820 match self.materialized.as_ref() {
821 None => {
822 self.alias.fmt(f)?;
823 f.write_str(" AS (")?;
824 NewLine.fmt(f)?;
825 Indent(&self.query).fmt(f)?;
826 NewLine.fmt(f)?;
827 f.write_str(")")?;
828 }
829 Some(materialized) => {
830 self.alias.fmt(f)?;
831 f.write_str(" AS ")?;
832 materialized.fmt(f)?;
833 f.write_str(" (")?;
834 NewLine.fmt(f)?;
835 Indent(&self.query).fmt(f)?;
836 NewLine.fmt(f)?;
837 f.write_str(")")?;
838 }
839 };
840 if let Some(ref fr) = self.from {
841 write!(f, " FROM {fr}")?;
842 }
843 Ok(())
844 }
845}
846
847#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
850#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
851#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
852pub enum SelectItemQualifiedWildcardKind {
853 ObjectName(ObjectName),
856 Expr(Expr),
859}
860
861#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
863#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
864#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
865pub enum SelectItem {
866 UnnamedExpr(Expr),
868 ExprWithAlias {
870 expr: Expr,
872 alias: Ident,
874 },
875 ExprWithAliases {
879 expr: Expr,
881 aliases: Vec<Ident>,
883 },
884 QualifiedWildcard(SelectItemQualifiedWildcardKind, WildcardAdditionalOptions),
887 Wildcard(WildcardAdditionalOptions),
889}
890
891impl fmt::Display for SelectItemQualifiedWildcardKind {
892 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
893 match &self {
894 SelectItemQualifiedWildcardKind::ObjectName(object_name) => {
895 write!(f, "{object_name}.*")
896 }
897 SelectItemQualifiedWildcardKind::Expr(expr) => write!(f, "{expr}.*"),
898 }
899 }
900}
901
902#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
909#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
910#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
911pub struct IdentWithAlias {
912 pub ident: Ident,
914 pub alias: Ident,
916}
917
918impl fmt::Display for IdentWithAlias {
919 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
920 write!(f, "{} AS {}", self.ident, self.alias)
921 }
922}
923
924#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
926#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
927#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
928pub struct WildcardAdditionalOptions {
929 pub wildcard_token: AttachedToken,
931 pub opt_ilike: Option<IlikeSelectItem>,
934 pub opt_exclude: Option<ExcludeSelectItem>,
936 pub opt_except: Option<ExceptSelectItem>,
939 pub opt_replace: Option<ReplaceSelectItem>,
944 pub opt_rename: Option<RenameSelectItem>,
946 pub opt_alias: Option<Ident>,
949}
950
951impl Default for WildcardAdditionalOptions {
952 fn default() -> Self {
953 Self {
954 wildcard_token: TokenWithSpan::wrap(Token::Mul).into(),
955 opt_ilike: None,
956 opt_exclude: None,
957 opt_except: None,
958 opt_replace: None,
959 opt_rename: None,
960 opt_alias: None,
961 }
962 }
963}
964
965impl fmt::Display for WildcardAdditionalOptions {
966 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
967 if let Some(ilike) = &self.opt_ilike {
968 write!(f, " {ilike}")?;
969 }
970 if let Some(exclude) = &self.opt_exclude {
971 write!(f, " {exclude}")?;
972 }
973 if let Some(except) = &self.opt_except {
974 write!(f, " {except}")?;
975 }
976 if let Some(replace) = &self.opt_replace {
977 write!(f, " {replace}")?;
978 }
979 if let Some(rename) = &self.opt_rename {
980 write!(f, " {rename}")?;
981 }
982 if let Some(alias) = &self.opt_alias {
983 write!(f, " AS {alias}")?;
984 }
985 Ok(())
986 }
987}
988
989#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
996#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
997#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
998pub struct IlikeSelectItem {
999 pub pattern: String,
1001}
1002
1003impl fmt::Display for IlikeSelectItem {
1004 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1005 write!(
1006 f,
1007 "ILIKE '{}'",
1008 value::escape_single_quote_string(&self.pattern)
1009 )?;
1010 Ok(())
1011 }
1012}
1013#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1021#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1022#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1023pub enum ExcludeSelectItem {
1024 Single(ObjectName),
1031 Multiple(Vec<ObjectName>),
1037}
1038
1039impl fmt::Display for ExcludeSelectItem {
1040 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1041 write!(f, "EXCLUDE")?;
1042 match self {
1043 Self::Single(column) => {
1044 write!(f, " {column}")?;
1045 }
1046 Self::Multiple(columns) => {
1047 write!(f, " ({})", display_comma_separated(columns))?;
1048 }
1049 }
1050 Ok(())
1051 }
1052}
1053
1054#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1062#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1063#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1064pub enum RenameSelectItem {
1065 Single(IdentWithAlias),
1072 Multiple(Vec<IdentWithAlias>),
1078}
1079
1080impl fmt::Display for RenameSelectItem {
1081 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1082 write!(f, "RENAME")?;
1083 match self {
1084 Self::Single(column) => {
1085 write!(f, " {column}")?;
1086 }
1087 Self::Multiple(columns) => {
1088 write!(f, " ({})", display_comma_separated(columns))?;
1089 }
1090 }
1091 Ok(())
1092 }
1093}
1094
1095#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1102#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1103#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1104pub struct ExceptSelectItem {
1105 pub first_element: Ident,
1107 pub additional_elements: Vec<Ident>,
1109}
1110
1111impl fmt::Display for ExceptSelectItem {
1112 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1113 write!(f, "EXCEPT ")?;
1114 if self.additional_elements.is_empty() {
1115 write!(f, "({})", self.first_element)?;
1116 } else {
1117 write!(
1118 f,
1119 "({}, {})",
1120 self.first_element,
1121 display_comma_separated(&self.additional_elements)
1122 )?;
1123 }
1124 Ok(())
1125 }
1126}
1127
1128#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1136#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1137#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1138pub struct ReplaceSelectItem {
1139 pub items: Vec<Box<ReplaceSelectElement>>,
1141}
1142
1143impl fmt::Display for ReplaceSelectItem {
1144 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1145 write!(f, "REPLACE")?;
1146 write!(f, " ({})", display_comma_separated(&self.items))?;
1147 Ok(())
1148 }
1149}
1150
1151#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1156#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1157#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1158pub struct ReplaceSelectElement {
1159 pub expr: Expr,
1161 pub column_name: Ident,
1163 pub as_keyword: bool,
1165}
1166
1167impl fmt::Display for ReplaceSelectElement {
1168 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1169 if self.as_keyword {
1170 write!(f, "{} AS {}", self.expr, self.column_name)
1171 } else {
1172 write!(f, "{} {}", self.expr, self.column_name)
1173 }
1174 }
1175}
1176
1177impl fmt::Display for SelectItem {
1178 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1179 use core::fmt::Write;
1180 match &self {
1181 SelectItem::UnnamedExpr(expr) => expr.fmt(f),
1182 SelectItem::ExprWithAlias { expr, alias } => {
1183 expr.fmt(f)?;
1184 f.write_str(" AS ")?;
1185 alias.fmt(f)
1186 }
1187 SelectItem::ExprWithAliases { expr, aliases } => {
1188 expr.fmt(f)?;
1189 f.write_str(" AS (")?;
1190 display_comma_separated(aliases).fmt(f)?;
1191 f.write_str(")")
1192 }
1193 SelectItem::QualifiedWildcard(kind, additional_options) => {
1194 kind.fmt(f)?;
1195 additional_options.fmt(f)
1196 }
1197 SelectItem::Wildcard(additional_options) => {
1198 f.write_char('*')?;
1199 additional_options.fmt(f)
1200 }
1201 }
1202 }
1203}
1204
1205#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1206#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1207#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1208pub struct TableWithJoins {
1210 pub relation: TableFactor,
1212 pub joins: Vec<Join>,
1214}
1215
1216impl fmt::Display for TableWithJoins {
1217 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1218 self.relation.fmt(f)?;
1219 for join in &self.joins {
1220 SpaceOrNewline.fmt(f)?;
1221 join.fmt(f)?;
1222 }
1223 Ok(())
1224 }
1225}
1226
1227#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1232#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1233#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1234pub enum ConnectByKind {
1235 ConnectBy {
1237 connect_token: AttachedToken,
1239
1240 nocycle: bool,
1244
1245 relationships: Vec<Expr>,
1247 },
1248
1249 StartWith {
1254 start_token: AttachedToken,
1256
1257 condition: Box<Expr>,
1259 },
1260}
1261
1262impl fmt::Display for ConnectByKind {
1263 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1264 match self {
1265 ConnectByKind::ConnectBy {
1266 connect_token: _,
1267 nocycle,
1268 relationships,
1269 } => {
1270 write!(
1271 f,
1272 "CONNECT BY {nocycle}{relationships}",
1273 nocycle = if *nocycle { "NOCYCLE " } else { "" },
1274 relationships = display_comma_separated(relationships)
1275 )
1276 }
1277 ConnectByKind::StartWith {
1278 start_token: _,
1279 condition,
1280 } => {
1281 write!(f, "START WITH {condition}")
1282 }
1283 }
1284 }
1285}
1286
1287#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1288#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1289#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1290pub struct Setting {
1292 pub key: Ident,
1294 pub value: Expr,
1296}
1297
1298impl fmt::Display for Setting {
1299 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1300 write!(f, "{} = {}", self.key, self.value)
1301 }
1302}
1303
1304#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1311#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1312#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1313pub struct ExprWithAlias {
1314 pub expr: Expr,
1316 pub alias: Option<Ident>,
1318}
1319
1320impl fmt::Display for ExprWithAlias {
1321 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1322 let ExprWithAlias { expr, alias } = self;
1323 write!(f, "{expr}")?;
1324 if let Some(alias) = alias {
1325 write!(f, " AS {alias}")?;
1326 }
1327 Ok(())
1328 }
1329}
1330
1331#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1338#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1339#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1340pub struct ExprWithAliasAndOrderBy {
1341 pub expr: ExprWithAlias,
1343 pub order_by: OrderByOptions,
1345}
1346
1347impl fmt::Display for ExprWithAliasAndOrderBy {
1348 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1349 write!(f, "{}{}", self.expr, self.order_by)
1350 }
1351}
1352
1353#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1355#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1356#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1357pub struct TableFunctionArgs {
1358 pub args: Vec<FunctionArg>,
1360 pub settings: Option<Vec<Setting>>,
1365}
1366
1367#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1368#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1369#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1370pub enum TableIndexHintType {
1372 Use,
1374 Ignore,
1376 Force,
1378}
1379
1380impl fmt::Display for TableIndexHintType {
1381 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1382 f.write_str(match self {
1383 TableIndexHintType::Use => "USE",
1384 TableIndexHintType::Ignore => "IGNORE",
1385 TableIndexHintType::Force => "FORCE",
1386 })
1387 }
1388}
1389
1390#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1391#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1392#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1393pub enum TableIndexType {
1395 Index,
1397 Key,
1399}
1400
1401impl fmt::Display for TableIndexType {
1402 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1403 f.write_str(match self {
1404 TableIndexType::Index => "INDEX",
1405 TableIndexType::Key => "KEY",
1406 })
1407 }
1408}
1409
1410#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1411#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1412#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1413pub enum TableIndexHintForClause {
1415 Join,
1417 OrderBy,
1419 GroupBy,
1421}
1422
1423impl fmt::Display for TableIndexHintForClause {
1424 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1425 f.write_str(match self {
1426 TableIndexHintForClause::Join => "JOIN",
1427 TableIndexHintForClause::OrderBy => "ORDER BY",
1428 TableIndexHintForClause::GroupBy => "GROUP BY",
1429 })
1430 }
1431}
1432
1433#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1434#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1435#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1436pub struct TableIndexHints {
1438 pub hint_type: TableIndexHintType,
1440 pub index_type: TableIndexType,
1442 pub for_clause: Option<TableIndexHintForClause>,
1444 pub index_names: Vec<Ident>,
1446}
1447
1448impl fmt::Display for TableIndexHints {
1449 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1450 write!(f, "{} {} ", self.hint_type, self.index_type)?;
1451 if let Some(for_clause) = &self.for_clause {
1452 write!(f, "FOR {for_clause} ")?;
1453 }
1454 write!(f, "({})", display_comma_separated(&self.index_names))
1455 }
1456}
1457
1458#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1460#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1461#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1462#[cfg_attr(feature = "visitor", visit(with = "visit_table_factor"))]
1463pub enum TableFactor {
1464 Table {
1466 #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
1467 name: ObjectName,
1469 alias: Option<TableAlias>,
1471 args: Option<TableFunctionArgs>,
1479 with_hints: Vec<Expr>,
1481 version: Option<TableVersion>,
1484 with_ordinality: bool,
1488 partitions: Vec<Ident>,
1490 json_path: Option<JsonPath>,
1492 sample: Option<TableSampleKind>,
1495 index_hints: Vec<TableIndexHints>,
1498 },
1499 Derived {
1501 lateral: bool,
1503 subquery: Box<Query>,
1505 alias: Option<TableAlias>,
1507 sample: Option<TableSampleKind>,
1509 },
1510 TableFunction {
1512 expr: Expr,
1514 alias: Option<TableAlias>,
1516 },
1517 Function {
1519 lateral: bool,
1521 name: ObjectName,
1523 args: Vec<FunctionArg>,
1525 with_ordinality: bool,
1527 alias: Option<TableAlias>,
1529 },
1530 UNNEST {
1541 alias: Option<TableAlias>,
1543 array_exprs: Vec<Expr>,
1545 with_offset: bool,
1547 with_offset_alias: Option<Ident>,
1549 with_ordinality: bool,
1551 },
1552 JsonTable {
1568 json_expr: Expr,
1570 json_path: ValueWithSpan,
1573 columns: Vec<JsonTableColumn>,
1576 alias: Option<TableAlias>,
1578 },
1579 OpenJsonTable {
1589 json_expr: Expr,
1591 json_path: Option<ValueWithSpan>,
1594 columns: Vec<OpenJsonTableColumn>,
1597 alias: Option<TableAlias>,
1599 },
1600 NestedJoin {
1607 table_with_joins: Box<TableWithJoins>,
1609 alias: Option<TableAlias>,
1611 },
1612 Pivot {
1619 table: Box<TableFactor>,
1621 aggregate_functions: Vec<ExprWithAlias>, value_column: Vec<Expr>,
1625 value_source: PivotValueSource,
1627 default_on_null: Option<Expr>,
1629 alias: Option<TableAlias>,
1631 },
1632 Unpivot {
1644 table: Box<TableFactor>,
1646 value: Expr,
1648 name: Ident,
1650 columns: Vec<ExprWithAlias>,
1652 null_inclusion: Option<NullInclusion>,
1654 alias: Option<TableAlias>,
1656 },
1657 MatchRecognize {
1661 table: Box<TableFactor>,
1663 partition_by: Vec<Expr>,
1665 order_by: Vec<OrderByExpr>,
1667 measures: Vec<Measure>,
1669 rows_per_match: Option<RowsPerMatch>,
1671 after_match_skip: Option<AfterMatchSkip>,
1673 pattern: MatchRecognizePattern,
1675 symbols: Vec<SymbolDefinition>,
1677 alias: Option<TableAlias>,
1679 },
1680 XmlTable {
1700 namespaces: Vec<XmlNamespaceDefinition>,
1702 row_expression: Expr,
1704 passing: XmlPassingClause,
1706 columns: Vec<XmlTableColumn>,
1708 alias: Option<TableAlias>,
1710 },
1711 SemanticView {
1723 name: ObjectName,
1725 dimensions: Vec<Expr>,
1727 metrics: Vec<Expr>,
1729 facts: Vec<Expr>,
1731 where_clause: Option<Expr>,
1733 alias: Option<TableAlias>,
1735 },
1736}
1737
1738#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1740#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1741#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1742pub enum TableSampleKind {
1743 BeforeTableAlias(Box<TableSample>),
1745 AfterTableAlias(Box<TableSample>),
1747}
1748
1749#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1750#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1751#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1752pub struct TableSample {
1754 pub modifier: TableSampleModifier,
1756 pub name: Option<TableSampleMethod>,
1758 pub quantity: Option<TableSampleQuantity>,
1760 pub seed: Option<TableSampleSeed>,
1762 pub bucket: Option<TableSampleBucket>,
1764 pub offset: Option<Expr>,
1766}
1767
1768#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1769#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1770#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1771pub enum TableSampleModifier {
1773 Sample,
1775 TableSample,
1777}
1778
1779impl fmt::Display for TableSampleModifier {
1780 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1781 match self {
1782 TableSampleModifier::Sample => write!(f, "SAMPLE")?,
1783 TableSampleModifier::TableSample => write!(f, "TABLESAMPLE")?,
1784 }
1785 Ok(())
1786 }
1787}
1788
1789#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1790#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1791#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1792pub struct TableSampleQuantity {
1794 pub parenthesized: bool,
1796 pub value: Expr,
1798 pub unit: Option<TableSampleUnit>,
1800}
1801
1802impl fmt::Display for TableSampleQuantity {
1803 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1804 if self.parenthesized {
1805 write!(f, "(")?;
1806 }
1807 write!(f, "{}", self.value)?;
1808 if let Some(unit) = &self.unit {
1809 write!(f, " {unit}")?;
1810 }
1811 if self.parenthesized {
1812 write!(f, ")")?;
1813 }
1814 Ok(())
1815 }
1816}
1817
1818#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1820#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1821#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1822pub enum TableSampleMethod {
1824 Row,
1826 Bernoulli,
1828 System,
1830 Block,
1832}
1833
1834impl fmt::Display for TableSampleMethod {
1835 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1836 match self {
1837 TableSampleMethod::Bernoulli => write!(f, "BERNOULLI"),
1838 TableSampleMethod::Row => write!(f, "ROW"),
1839 TableSampleMethod::System => write!(f, "SYSTEM"),
1840 TableSampleMethod::Block => write!(f, "BLOCK"),
1841 }
1842 }
1843}
1844
1845#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1846#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1847#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1848pub struct TableSampleSeed {
1850 pub modifier: TableSampleSeedModifier,
1852 pub value: ValueWithSpan,
1854}
1855
1856impl fmt::Display for TableSampleSeed {
1857 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1858 write!(f, "{} ({})", self.modifier, self.value)?;
1859 Ok(())
1860 }
1861}
1862
1863#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1864#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1865#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1866pub enum TableSampleSeedModifier {
1868 Repeatable,
1870 Seed,
1872}
1873
1874impl fmt::Display for TableSampleSeedModifier {
1875 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1876 match self {
1877 TableSampleSeedModifier::Repeatable => write!(f, "REPEATABLE"),
1878 TableSampleSeedModifier::Seed => write!(f, "SEED"),
1879 }
1880 }
1881}
1882
1883#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
1884#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1885#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1886pub enum TableSampleUnit {
1888 Rows,
1890 Percent,
1892}
1893
1894impl fmt::Display for TableSampleUnit {
1895 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1896 match self {
1897 TableSampleUnit::Percent => write!(f, "PERCENT"),
1898 TableSampleUnit::Rows => write!(f, "ROWS"),
1899 }
1900 }
1901}
1902
1903#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1904#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1905#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1906pub struct TableSampleBucket {
1908 pub bucket: ValueWithSpan,
1910 pub total: ValueWithSpan,
1912 pub on: Option<Expr>,
1914}
1915
1916impl fmt::Display for TableSampleBucket {
1917 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1918 write!(f, "BUCKET {} OUT OF {}", self.bucket, self.total)?;
1919 if let Some(on) = &self.on {
1920 write!(f, " ON {on}")?;
1921 }
1922 Ok(())
1923 }
1924}
1925impl fmt::Display for TableSample {
1926 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1927 write!(f, "{}", self.modifier)?;
1928 if let Some(name) = &self.name {
1929 write!(f, " {name}")?;
1930 }
1931 if let Some(quantity) = &self.quantity {
1932 write!(f, " {quantity}")?;
1933 }
1934 if let Some(seed) = &self.seed {
1935 write!(f, " {seed}")?;
1936 }
1937 if let Some(bucket) = &self.bucket {
1938 write!(f, " ({bucket})")?;
1939 }
1940 if let Some(offset) = &self.offset {
1941 write!(f, " OFFSET {offset}")?;
1942 }
1943 Ok(())
1944 }
1945}
1946
1947#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1949#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1950#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1951pub enum PivotValueSource {
1952 List(Vec<ExprWithAlias>),
1956 Any(Vec<OrderByExpr>),
1960 Subquery(Box<Query>),
1964}
1965
1966impl fmt::Display for PivotValueSource {
1967 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1968 match self {
1969 PivotValueSource::List(values) => write!(f, "{}", display_comma_separated(values)),
1970 PivotValueSource::Any(order_by) => {
1971 write!(f, "ANY")?;
1972 if !order_by.is_empty() {
1973 write!(f, " ORDER BY {}", display_comma_separated(order_by))?;
1974 }
1975 Ok(())
1976 }
1977 PivotValueSource::Subquery(query) => write!(f, "{query}"),
1978 }
1979 }
1980}
1981
1982#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
1986#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1987#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
1988pub struct Measure {
1990 pub expr: Expr,
1992 pub alias: Ident,
1994}
1995
1996impl fmt::Display for Measure {
1997 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1998 write!(f, "{} AS {}", self.expr, self.alias)
1999 }
2000}
2001
2002#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2006#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2007#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2008pub enum RowsPerMatch {
2009 OneRow,
2011 AllRows(Option<EmptyMatchesMode>),
2013}
2014
2015impl fmt::Display for RowsPerMatch {
2016 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2017 match self {
2018 RowsPerMatch::OneRow => write!(f, "ONE ROW PER MATCH"),
2019 RowsPerMatch::AllRows(mode) => {
2020 write!(f, "ALL ROWS PER MATCH")?;
2021 if let Some(mode) = mode {
2022 write!(f, " {mode}")?;
2023 }
2024 Ok(())
2025 }
2026 }
2027 }
2028}
2029
2030#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2034#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2035#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2036pub enum AfterMatchSkip {
2037 PastLastRow,
2039 ToNextRow,
2041 ToFirst(Ident),
2043 ToLast(Ident),
2045}
2046
2047impl fmt::Display for AfterMatchSkip {
2048 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2049 write!(f, "AFTER MATCH SKIP ")?;
2050 match self {
2051 AfterMatchSkip::PastLastRow => write!(f, "PAST LAST ROW"),
2052 AfterMatchSkip::ToNextRow => write!(f, " TO NEXT ROW"),
2053 AfterMatchSkip::ToFirst(symbol) => write!(f, "TO FIRST {symbol}"),
2054 AfterMatchSkip::ToLast(symbol) => write!(f, "TO LAST {symbol}"),
2055 }
2056 }
2057}
2058
2059#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2060#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2061#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2062pub enum EmptyMatchesMode {
2064 Show,
2066 Omit,
2068 WithUnmatched,
2070}
2071
2072impl fmt::Display for EmptyMatchesMode {
2073 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2074 match self {
2075 EmptyMatchesMode::Show => write!(f, "SHOW EMPTY MATCHES"),
2076 EmptyMatchesMode::Omit => write!(f, "OMIT EMPTY MATCHES"),
2077 EmptyMatchesMode::WithUnmatched => write!(f, "WITH UNMATCHED ROWS"),
2078 }
2079 }
2080}
2081
2082#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2086#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2087#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2088pub struct SymbolDefinition {
2090 pub symbol: Ident,
2092 pub definition: Expr,
2094}
2095
2096impl fmt::Display for SymbolDefinition {
2097 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2098 write!(f, "{} AS {}", self.symbol, self.definition)
2099 }
2100}
2101
2102#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2104#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2105#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2106pub enum MatchRecognizeSymbol {
2107 Named(Ident),
2109 Start,
2111 End,
2113}
2114
2115impl fmt::Display for MatchRecognizeSymbol {
2116 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2117 match self {
2118 MatchRecognizeSymbol::Named(symbol) => write!(f, "{symbol}"),
2119 MatchRecognizeSymbol::Start => write!(f, "^"),
2120 MatchRecognizeSymbol::End => write!(f, "$"),
2121 }
2122 }
2123}
2124
2125#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2129#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2130#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2131pub enum MatchRecognizePattern {
2132 Symbol(MatchRecognizeSymbol),
2134 Exclude(MatchRecognizeSymbol),
2136 Permute(Vec<MatchRecognizeSymbol>),
2138 Concat(Vec<MatchRecognizePattern>),
2140 Group(Box<MatchRecognizePattern>),
2142 Alternation(Vec<MatchRecognizePattern>),
2144 Repetition(Box<MatchRecognizePattern>, RepetitionQuantifier),
2146}
2147
2148impl fmt::Display for MatchRecognizePattern {
2149 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2150 use MatchRecognizePattern::*;
2151 match self {
2152 Symbol(symbol) => write!(f, "{symbol}"),
2153 Exclude(symbol) => write!(f, "{{- {symbol} -}}"),
2154 Permute(symbols) => write!(f, "PERMUTE({})", display_comma_separated(symbols)),
2155 Concat(patterns) => write!(f, "{}", display_separated(patterns, " ")),
2156 Group(pattern) => write!(f, "( {pattern} )"),
2157 Alternation(patterns) => write!(f, "{}", display_separated(patterns, " | ")),
2158 Repetition(pattern, op) => write!(f, "{pattern}{op}"),
2159 }
2160 }
2161}
2162
2163#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2166#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2167#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2168pub enum RepetitionQuantifier {
2169 ZeroOrMore,
2171 OneOrMore,
2173 AtMostOne,
2175 Exactly(u32),
2177 AtLeast(u32),
2179 AtMost(u32),
2181 Range(u32, u32),
2183}
2184
2185impl fmt::Display for RepetitionQuantifier {
2186 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2187 use RepetitionQuantifier::*;
2188 match self {
2189 ZeroOrMore => write!(f, "*"),
2190 OneOrMore => write!(f, "+"),
2191 AtMostOne => write!(f, "?"),
2192 Exactly(n) => write!(f, "{{{n}}}"),
2193 AtLeast(n) => write!(f, "{{{n},}}"),
2194 AtMost(n) => write!(f, "{{,{n}}}"),
2195 Range(n, m) => write!(f, "{{{n},{m}}}"),
2196 }
2197 }
2198}
2199
2200impl fmt::Display for TableFactor {
2201 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2202 match self {
2203 TableFactor::Table {
2204 name,
2205 alias,
2206 args,
2207 with_hints,
2208 version,
2209 partitions,
2210 with_ordinality,
2211 json_path,
2212 sample,
2213 index_hints,
2214 } => {
2215 name.fmt(f)?;
2216 if let Some(json_path) = json_path {
2217 json_path.fmt(f)?;
2218 }
2219 if !partitions.is_empty() {
2220 write!(f, "PARTITION ({})", display_comma_separated(partitions))?;
2221 }
2222 if let Some(args) = args {
2223 write!(f, "(")?;
2224 write!(f, "{}", display_comma_separated(&args.args))?;
2225 if let Some(ref settings) = args.settings {
2226 if !args.args.is_empty() {
2227 write!(f, ", ")?;
2228 }
2229 write!(f, "SETTINGS {}", display_comma_separated(settings))?;
2230 }
2231 write!(f, ")")?;
2232 }
2233 if *with_ordinality {
2234 write!(f, " WITH ORDINALITY")?;
2235 }
2236 if let Some(TableSampleKind::BeforeTableAlias(sample)) = sample {
2237 write!(f, " {sample}")?;
2238 }
2239 if let Some(alias) = alias {
2240 write!(f, " {alias}")?;
2241 }
2242 if !index_hints.is_empty() {
2243 write!(f, " {}", display_separated(index_hints, " "))?;
2244 }
2245 if !with_hints.is_empty() {
2246 write!(f, " WITH ({})", display_comma_separated(with_hints))?;
2247 }
2248 if let Some(version) = version {
2249 write!(f, " {version}")?;
2250 }
2251 if let Some(TableSampleKind::AfterTableAlias(sample)) = sample {
2252 write!(f, " {sample}")?;
2253 }
2254 Ok(())
2255 }
2256 TableFactor::Derived {
2257 lateral,
2258 subquery,
2259 alias,
2260 sample,
2261 } => {
2262 if *lateral {
2263 write!(f, "LATERAL ")?;
2264 }
2265 f.write_str("(")?;
2266 NewLine.fmt(f)?;
2267 Indent(subquery).fmt(f)?;
2268 NewLine.fmt(f)?;
2269 f.write_str(")")?;
2270 if let Some(alias) = alias {
2271 write!(f, " {alias}")?;
2272 }
2273 if let Some(TableSampleKind::AfterTableAlias(sample)) = sample {
2274 write!(f, " {sample}")?;
2275 }
2276 Ok(())
2277 }
2278 TableFactor::Function {
2279 lateral,
2280 name,
2281 args,
2282 with_ordinality,
2283 alias,
2284 } => {
2285 if *lateral {
2286 write!(f, "LATERAL ")?;
2287 }
2288 write!(f, "{name}")?;
2289 write!(f, "({})", display_comma_separated(args))?;
2290 if *with_ordinality {
2291 write!(f, " WITH ORDINALITY")?;
2292 }
2293 if let Some(alias) = alias {
2294 write!(f, " {alias}")?;
2295 }
2296 Ok(())
2297 }
2298 TableFactor::TableFunction { expr, alias } => {
2299 write!(f, "TABLE({expr})")?;
2300 if let Some(alias) = alias {
2301 write!(f, " {alias}")?;
2302 }
2303 Ok(())
2304 }
2305 TableFactor::UNNEST {
2306 alias,
2307 array_exprs,
2308 with_offset,
2309 with_offset_alias,
2310 with_ordinality,
2311 } => {
2312 write!(f, "UNNEST({})", display_comma_separated(array_exprs))?;
2313
2314 if *with_ordinality {
2315 write!(f, " WITH ORDINALITY")?;
2316 }
2317
2318 if let Some(alias) = alias {
2319 write!(f, " {alias}")?;
2320 }
2321 if *with_offset {
2322 write!(f, " WITH OFFSET")?;
2323 }
2324 if let Some(alias) = with_offset_alias {
2325 write!(f, " {alias}")?;
2326 }
2327 Ok(())
2328 }
2329 TableFactor::JsonTable {
2330 json_expr,
2331 json_path,
2332 columns,
2333 alias,
2334 } => {
2335 write!(
2336 f,
2337 "JSON_TABLE({json_expr}, {json_path} COLUMNS({columns}))",
2338 columns = display_comma_separated(columns)
2339 )?;
2340 if let Some(alias) = alias {
2341 write!(f, " {alias}")?;
2342 }
2343 Ok(())
2344 }
2345 TableFactor::OpenJsonTable {
2346 json_expr,
2347 json_path,
2348 columns,
2349 alias,
2350 } => {
2351 write!(f, "OPENJSON({json_expr}")?;
2352 if let Some(json_path) = json_path {
2353 write!(f, ", {json_path}")?;
2354 }
2355 write!(f, ")")?;
2356 if !columns.is_empty() {
2357 write!(f, " WITH ({})", display_comma_separated(columns))?;
2358 }
2359 if let Some(alias) = alias {
2360 write!(f, " {alias}")?;
2361 }
2362 Ok(())
2363 }
2364 TableFactor::NestedJoin {
2365 table_with_joins,
2366 alias,
2367 } => {
2368 write!(f, "({table_with_joins})")?;
2369 if let Some(alias) = alias {
2370 write!(f, " {alias}")?;
2371 }
2372 Ok(())
2373 }
2374 TableFactor::Pivot {
2375 table,
2376 aggregate_functions,
2377 value_column,
2378 value_source,
2379 default_on_null,
2380 alias,
2381 } => {
2382 write!(
2383 f,
2384 "{table} PIVOT({} FOR ",
2385 display_comma_separated(aggregate_functions),
2386 )?;
2387 if value_column.len() == 1 {
2388 write!(f, "{}", value_column[0])?;
2389 } else {
2390 write!(f, "({})", display_comma_separated(value_column))?;
2391 }
2392 write!(f, " IN ({value_source})")?;
2393 if let Some(expr) = default_on_null {
2394 write!(f, " DEFAULT ON NULL ({expr})")?;
2395 }
2396 write!(f, ")")?;
2397 if let Some(alias) = alias {
2398 write!(f, " {alias}")?;
2399 }
2400 Ok(())
2401 }
2402 TableFactor::Unpivot {
2403 table,
2404 null_inclusion,
2405 value,
2406 name,
2407 columns,
2408 alias,
2409 } => {
2410 write!(f, "{table} UNPIVOT")?;
2411 if let Some(null_inclusion) = null_inclusion {
2412 write!(f, " {null_inclusion} ")?;
2413 }
2414 write!(
2415 f,
2416 "({} FOR {} IN ({}))",
2417 value,
2418 name,
2419 display_comma_separated(columns)
2420 )?;
2421 if let Some(alias) = alias {
2422 write!(f, " {alias}")?;
2423 }
2424 Ok(())
2425 }
2426 TableFactor::MatchRecognize {
2427 table,
2428 partition_by,
2429 order_by,
2430 measures,
2431 rows_per_match,
2432 after_match_skip,
2433 pattern,
2434 symbols,
2435 alias,
2436 } => {
2437 write!(f, "{table} MATCH_RECOGNIZE(")?;
2438 if !partition_by.is_empty() {
2439 write!(f, "PARTITION BY {} ", display_comma_separated(partition_by))?;
2440 }
2441 if !order_by.is_empty() {
2442 write!(f, "ORDER BY {} ", display_comma_separated(order_by))?;
2443 }
2444 if !measures.is_empty() {
2445 write!(f, "MEASURES {} ", display_comma_separated(measures))?;
2446 }
2447 if let Some(rows_per_match) = rows_per_match {
2448 write!(f, "{rows_per_match} ")?;
2449 }
2450 if let Some(after_match_skip) = after_match_skip {
2451 write!(f, "{after_match_skip} ")?;
2452 }
2453 write!(f, "PATTERN ({pattern}) ")?;
2454 write!(f, "DEFINE {})", display_comma_separated(symbols))?;
2455 if let Some(alias) = alias {
2456 write!(f, " {alias}")?;
2457 }
2458 Ok(())
2459 }
2460 TableFactor::XmlTable {
2461 row_expression,
2462 passing,
2463 columns,
2464 alias,
2465 namespaces,
2466 } => {
2467 write!(f, "XMLTABLE(")?;
2468 if !namespaces.is_empty() {
2469 write!(
2470 f,
2471 "XMLNAMESPACES({}), ",
2472 display_comma_separated(namespaces)
2473 )?;
2474 }
2475 write!(
2476 f,
2477 "{row_expression}{passing} COLUMNS {columns})",
2478 columns = display_comma_separated(columns)
2479 )?;
2480 if let Some(alias) = alias {
2481 write!(f, " {alias}")?;
2482 }
2483 Ok(())
2484 }
2485 TableFactor::SemanticView {
2486 name,
2487 dimensions,
2488 metrics,
2489 facts,
2490 where_clause,
2491 alias,
2492 } => {
2493 write!(f, "SEMANTIC_VIEW({name}")?;
2494
2495 if !dimensions.is_empty() {
2496 write!(f, " DIMENSIONS {}", display_comma_separated(dimensions))?;
2497 }
2498
2499 if !metrics.is_empty() {
2500 write!(f, " METRICS {}", display_comma_separated(metrics))?;
2501 }
2502
2503 if !facts.is_empty() {
2504 write!(f, " FACTS {}", display_comma_separated(facts))?;
2505 }
2506
2507 if let Some(where_clause) = where_clause {
2508 write!(f, " WHERE {where_clause}")?;
2509 }
2510
2511 write!(f, ")")?;
2512
2513 if let Some(alias) = alias {
2514 write!(f, " {alias}")?;
2515 }
2516
2517 Ok(())
2518 }
2519 }
2520 }
2521}
2522
2523#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2524#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2525#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2526pub struct TableAlias {
2528 pub explicit: bool,
2532 pub name: Ident,
2534 pub columns: Vec<TableAliasColumnDef>,
2536 pub at: Option<Ident>,
2542}
2543
2544impl fmt::Display for TableAlias {
2545 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2546 write!(f, "{}{}", if self.explicit { "AS " } else { "" }, self.name)?;
2547 if !self.columns.is_empty() {
2548 write!(f, " ({})", display_comma_separated(&self.columns))?;
2549 }
2550 if let Some(at) = &self.at {
2551 write!(f, " AT {at}")?;
2552 }
2553 Ok(())
2554 }
2555}
2556
2557#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2563#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2564#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2565pub struct TableAliasColumnDef {
2566 pub name: Ident,
2568 pub data_type: Option<DataType>,
2570}
2571
2572impl TableAliasColumnDef {
2573 pub fn from_name<S: Into<String>>(name: S) -> Self {
2575 TableAliasColumnDef {
2576 name: Ident::new(name),
2577 data_type: None,
2578 }
2579 }
2580}
2581
2582impl fmt::Display for TableAliasColumnDef {
2583 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2584 write!(f, "{}", self.name)?;
2585 if let Some(ref data_type) = self.data_type {
2586 write!(f, " {data_type}")?;
2587 }
2588 Ok(())
2589 }
2590}
2591
2592#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2593#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2594#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2595pub enum TableVersion {
2597 ForSystemTimeAsOf(Expr),
2600 TimestampAsOf(Expr),
2604 VersionAsOf(Expr),
2608 Function(Expr),
2611 Changes {
2621 changes: Expr,
2623 at: Expr,
2625 end: Option<Expr>,
2627 },
2628}
2629
2630impl Display for TableVersion {
2631 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2632 match self {
2633 TableVersion::ForSystemTimeAsOf(e) => write!(f, "FOR SYSTEM_TIME AS OF {e}")?,
2634 TableVersion::TimestampAsOf(e) => write!(f, "TIMESTAMP AS OF {e}")?,
2635 TableVersion::VersionAsOf(e) => write!(f, "VERSION AS OF {e}")?,
2636 TableVersion::Function(func) => write!(f, "{func}")?,
2637 TableVersion::Changes { changes, at, end } => {
2638 write!(f, "{changes} {at}")?;
2639 if let Some(end) = end {
2640 write!(f, " {end}")?;
2641 }
2642 }
2643 }
2644 Ok(())
2645 }
2646}
2647
2648#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2649#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2650#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2651pub struct Join {
2653 pub relation: TableFactor,
2655 pub global: bool,
2658 pub join_operator: JoinOperator,
2660}
2661
2662impl fmt::Display for Join {
2663 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2664 fn prefix(constraint: &JoinConstraint) -> &'static str {
2665 match constraint {
2666 JoinConstraint::Natural => "NATURAL ",
2667 _ => "",
2668 }
2669 }
2670 fn suffix(constraint: &'_ JoinConstraint) -> impl fmt::Display + '_ {
2671 struct Suffix<'a>(&'a JoinConstraint);
2672 impl fmt::Display for Suffix<'_> {
2673 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2674 match self.0 {
2675 JoinConstraint::On(expr) => write!(f, " ON {expr}"),
2676 JoinConstraint::Using(attrs) => {
2677 write!(f, " USING({})", display_comma_separated(attrs))
2678 }
2679 _ => Ok(()),
2680 }
2681 }
2682 }
2683 Suffix(constraint)
2684 }
2685 if self.global {
2686 write!(f, "GLOBAL ")?;
2687 }
2688
2689 match &self.join_operator {
2690 JoinOperator::Join(constraint) => f.write_fmt(format_args!(
2691 "{}JOIN {}{}",
2692 prefix(constraint),
2693 self.relation,
2694 suffix(constraint)
2695 )),
2696 JoinOperator::Inner(constraint) => f.write_fmt(format_args!(
2697 "{}INNER JOIN {}{}",
2698 prefix(constraint),
2699 self.relation,
2700 suffix(constraint)
2701 )),
2702 JoinOperator::Left(constraint) => f.write_fmt(format_args!(
2703 "{}LEFT JOIN {}{}",
2704 prefix(constraint),
2705 self.relation,
2706 suffix(constraint)
2707 )),
2708 JoinOperator::LeftOuter(constraint) => f.write_fmt(format_args!(
2709 "{}LEFT OUTER JOIN {}{}",
2710 prefix(constraint),
2711 self.relation,
2712 suffix(constraint)
2713 )),
2714 JoinOperator::Right(constraint) => f.write_fmt(format_args!(
2715 "{}RIGHT JOIN {}{}",
2716 prefix(constraint),
2717 self.relation,
2718 suffix(constraint)
2719 )),
2720 JoinOperator::RightOuter(constraint) => f.write_fmt(format_args!(
2721 "{}RIGHT OUTER JOIN {}{}",
2722 prefix(constraint),
2723 self.relation,
2724 suffix(constraint)
2725 )),
2726 JoinOperator::FullOuter(constraint) => f.write_fmt(format_args!(
2727 "{}FULL JOIN {}{}",
2728 prefix(constraint),
2729 self.relation,
2730 suffix(constraint)
2731 )),
2732 JoinOperator::CrossJoin(constraint) => f.write_fmt(format_args!(
2733 "CROSS JOIN {}{}",
2734 self.relation,
2735 suffix(constraint)
2736 )),
2737 JoinOperator::Semi(constraint) => f.write_fmt(format_args!(
2738 "{}SEMI JOIN {}{}",
2739 prefix(constraint),
2740 self.relation,
2741 suffix(constraint)
2742 )),
2743 JoinOperator::LeftSemi(constraint) => f.write_fmt(format_args!(
2744 "{}LEFT SEMI JOIN {}{}",
2745 prefix(constraint),
2746 self.relation,
2747 suffix(constraint)
2748 )),
2749 JoinOperator::RightSemi(constraint) => f.write_fmt(format_args!(
2750 "{}RIGHT SEMI JOIN {}{}",
2751 prefix(constraint),
2752 self.relation,
2753 suffix(constraint)
2754 )),
2755 JoinOperator::Anti(constraint) => f.write_fmt(format_args!(
2756 "{}ANTI JOIN {}{}",
2757 prefix(constraint),
2758 self.relation,
2759 suffix(constraint)
2760 )),
2761 JoinOperator::LeftAnti(constraint) => f.write_fmt(format_args!(
2762 "{}LEFT ANTI JOIN {}{}",
2763 prefix(constraint),
2764 self.relation,
2765 suffix(constraint)
2766 )),
2767 JoinOperator::RightAnti(constraint) => f.write_fmt(format_args!(
2768 "{}RIGHT ANTI JOIN {}{}",
2769 prefix(constraint),
2770 self.relation,
2771 suffix(constraint)
2772 )),
2773 JoinOperator::CrossApply => f.write_fmt(format_args!("CROSS APPLY {}", self.relation)),
2774 JoinOperator::OuterApply => f.write_fmt(format_args!("OUTER APPLY {}", self.relation)),
2775 JoinOperator::AsOf {
2776 match_condition,
2777 constraint,
2778 } => f.write_fmt(format_args!(
2779 "ASOF JOIN {} MATCH_CONDITION ({match_condition}){}",
2780 self.relation,
2781 suffix(constraint)
2782 )),
2783 JoinOperator::StraightJoin(constraint) => f.write_fmt(format_args!(
2784 "STRAIGHT_JOIN {}{}",
2785 self.relation,
2786 suffix(constraint)
2787 )),
2788 JoinOperator::ArrayJoin => f.write_fmt(format_args!("ARRAY JOIN {}", self.relation)),
2789 JoinOperator::LeftArrayJoin => {
2790 f.write_fmt(format_args!("LEFT ARRAY JOIN {}", self.relation))
2791 }
2792 JoinOperator::InnerArrayJoin => {
2793 f.write_fmt(format_args!("INNER ARRAY JOIN {}", self.relation))
2794 }
2795 }
2796 }
2797}
2798
2799#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2800#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2801#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2802pub enum JoinOperator {
2804 Join(JoinConstraint),
2806 Inner(JoinConstraint),
2808 Left(JoinConstraint),
2810 LeftOuter(JoinConstraint),
2812 Right(JoinConstraint),
2814 RightOuter(JoinConstraint),
2816 FullOuter(JoinConstraint),
2818 CrossJoin(JoinConstraint),
2820 Semi(JoinConstraint),
2822 LeftSemi(JoinConstraint),
2824 RightSemi(JoinConstraint),
2826 Anti(JoinConstraint),
2828 LeftAnti(JoinConstraint),
2830 RightAnti(JoinConstraint),
2832 CrossApply,
2834 OuterApply,
2836 AsOf {
2840 match_condition: Expr,
2842 constraint: JoinConstraint,
2844 },
2845 StraightJoin(JoinConstraint),
2849 ArrayJoin,
2853 LeftArrayJoin,
2855 InnerArrayJoin,
2857}
2858
2859#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2860#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2861#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2862pub enum JoinConstraint {
2864 On(Expr),
2866 Using(Vec<ObjectName>),
2868 Natural,
2870 None,
2872}
2873
2874#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2875#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2876#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2877pub enum OrderByKind {
2879 All(OrderByOptions),
2884
2885 Expressions(Vec<OrderByExpr>),
2887}
2888
2889#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2890#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2891#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2892pub struct OrderBy {
2894 pub kind: OrderByKind,
2896
2897 pub interpolate: Option<Interpolate>,
2899}
2900
2901impl fmt::Display for OrderBy {
2902 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2903 write!(f, "ORDER BY")?;
2904 match &self.kind {
2905 OrderByKind::Expressions(exprs) => {
2906 write!(f, " {}", display_comma_separated(exprs))?;
2907 }
2908 OrderByKind::All(all) => {
2909 write!(f, " ALL{all}")?;
2910 }
2911 }
2912
2913 if let Some(ref interpolate) = self.interpolate {
2914 match &interpolate.exprs {
2915 Some(exprs) => write!(f, " INTERPOLATE ({})", display_comma_separated(exprs))?,
2916 None => write!(f, " INTERPOLATE")?,
2917 }
2918 }
2919
2920 Ok(())
2921 }
2922}
2923
2924#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2926#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2927#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2928pub struct OrderByExpr {
2929 pub expr: Expr,
2931 pub options: OrderByOptions,
2933 pub with_fill: Option<WithFill>,
2935}
2936
2937impl From<Ident> for OrderByExpr {
2938 fn from(ident: Ident) -> Self {
2939 OrderByExpr {
2940 expr: Expr::Identifier(ident),
2941 options: OrderByOptions::default(),
2942 with_fill: None,
2943 }
2944 }
2945}
2946
2947impl fmt::Display for OrderByExpr {
2948 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2949 write!(f, "{}{}", self.expr, self.options)?;
2950 if let Some(ref with_fill) = self.with_fill {
2951 write!(f, " {with_fill}")?
2952 }
2953 Ok(())
2954 }
2955}
2956
2957#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2962#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2963#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2964pub struct WithFill {
2966 pub from: Option<Expr>,
2968 pub to: Option<Expr>,
2970 pub step: Option<Expr>,
2972}
2973
2974impl fmt::Display for WithFill {
2975 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2976 write!(f, "WITH FILL")?;
2977 if let Some(ref from) = self.from {
2978 write!(f, " FROM {from}")?;
2979 }
2980 if let Some(ref to) = self.to {
2981 write!(f, " TO {to}")?;
2982 }
2983 if let Some(ref step) = self.step {
2984 write!(f, " STEP {step}")?;
2985 }
2986 Ok(())
2987 }
2988}
2989
2990#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2995#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2996#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2997pub struct InterpolateExpr {
2999 pub column: Ident,
3001 pub expr: Option<Expr>,
3003}
3004
3005#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3006#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3007#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3008pub struct Interpolate {
3010 pub exprs: Option<Vec<InterpolateExpr>>,
3012}
3013
3014impl fmt::Display for InterpolateExpr {
3015 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3016 write!(f, "{}", self.column)?;
3017 if let Some(ref expr) = self.expr {
3018 write!(f, " AS {expr}")?;
3019 }
3020 Ok(())
3021 }
3022}
3023
3024#[derive(Default, Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3025#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3026#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3027pub struct OrderByOptions {
3029 pub asc: Option<bool>,
3031 pub nulls_first: Option<bool>,
3033}
3034
3035impl fmt::Display for OrderByOptions {
3036 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3037 match self.asc {
3038 Some(true) => write!(f, " ASC")?,
3039 Some(false) => write!(f, " DESC")?,
3040 None => (),
3041 }
3042 match self.nulls_first {
3043 Some(true) => write!(f, " NULLS FIRST")?,
3044 Some(false) => write!(f, " NULLS LAST")?,
3045 None => (),
3046 }
3047 Ok(())
3048 }
3049}
3050
3051#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3052#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3053#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3054pub enum LimitClause {
3056 LimitOffset {
3060 limit: Option<Expr>,
3062 offset: Option<Offset>,
3064 limit_by: Vec<Expr>,
3066 },
3067 OffsetCommaLimit {
3069 offset: Expr,
3071 limit: Expr,
3073 },
3074}
3075
3076impl fmt::Display for LimitClause {
3077 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3078 match self {
3079 LimitClause::LimitOffset {
3080 limit,
3081 limit_by,
3082 offset,
3083 } => {
3084 if let Some(ref limit) = limit {
3085 write!(f, " LIMIT {limit}")?;
3086 }
3087 if let Some(ref offset) = offset {
3088 write!(f, " {offset}")?;
3089 }
3090 if !limit_by.is_empty() {
3091 debug_assert!(limit.is_some());
3092 write!(f, " BY {}", display_separated(limit_by, ", "))?;
3093 }
3094 Ok(())
3095 }
3096 LimitClause::OffsetCommaLimit { offset, limit } => {
3097 write!(f, " LIMIT {offset}, {limit}")
3098 }
3099 }
3100 }
3101}
3102
3103#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3104#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3105#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3106pub struct Offset {
3108 pub value: Expr,
3110 pub rows: OffsetRows,
3112}
3113
3114impl fmt::Display for Offset {
3115 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3116 write!(f, "OFFSET {}{}", self.value, self.rows)
3117 }
3118}
3119
3120#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3122#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3123#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3124pub enum OffsetRows {
3125 None,
3127 Row,
3129 Rows,
3131}
3132
3133impl fmt::Display for OffsetRows {
3134 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3135 match self {
3136 OffsetRows::None => Ok(()),
3137 OffsetRows::Row => write!(f, " ROW"),
3138 OffsetRows::Rows => write!(f, " ROWS"),
3139 }
3140 }
3141}
3142
3143#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3155#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3156#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3157pub enum PipeOperator {
3158 Limit {
3164 expr: Expr,
3166 offset: Option<Expr>,
3168 },
3169 Where {
3175 expr: Expr,
3177 },
3178 OrderBy {
3180 exprs: Vec<OrderByExpr>,
3182 },
3183 Select {
3189 exprs: Vec<SelectItem>,
3191 },
3192 Extend {
3198 exprs: Vec<SelectItem>,
3200 },
3201 Set {
3207 assignments: Vec<Assignment>,
3209 },
3210 Drop {
3216 columns: Vec<Ident>,
3218 },
3219 As {
3225 alias: Ident,
3227 },
3228 Aggregate {
3240 full_table_exprs: Vec<ExprWithAliasAndOrderBy>,
3242 group_by_expr: Vec<ExprWithAliasAndOrderBy>,
3244 },
3245 TableSample {
3249 sample: Box<TableSample>,
3251 },
3252 Rename {
3258 mappings: Vec<IdentWithAlias>,
3260 },
3261 Union {
3267 set_quantifier: SetQuantifier,
3269 queries: Vec<Query>,
3271 },
3272 Intersect {
3278 set_quantifier: SetQuantifier,
3280 queries: Vec<Query>,
3282 },
3283 Except {
3289 set_quantifier: SetQuantifier,
3291 queries: Vec<Query>,
3293 },
3294 Call {
3300 function: Function,
3302 alias: Option<Ident>,
3304 },
3305 Pivot {
3311 aggregate_functions: Vec<ExprWithAlias>,
3313 value_column: Vec<Ident>,
3315 value_source: PivotValueSource,
3317 alias: Option<Ident>,
3319 },
3320 Unpivot {
3329 value_column: Ident,
3331 name_column: Ident,
3333 unpivot_columns: Vec<Ident>,
3335 alias: Option<Ident>,
3337 },
3338 Join(Join),
3344}
3345
3346impl fmt::Display for PipeOperator {
3347 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3348 match self {
3349 PipeOperator::Select { exprs } => {
3350 write!(f, "SELECT {}", display_comma_separated(exprs.as_slice()))
3351 }
3352 PipeOperator::Extend { exprs } => {
3353 write!(f, "EXTEND {}", display_comma_separated(exprs.as_slice()))
3354 }
3355 PipeOperator::Set { assignments } => {
3356 write!(f, "SET {}", display_comma_separated(assignments.as_slice()))
3357 }
3358 PipeOperator::Drop { columns } => {
3359 write!(f, "DROP {}", display_comma_separated(columns.as_slice()))
3360 }
3361 PipeOperator::As { alias } => {
3362 write!(f, "AS {alias}")
3363 }
3364 PipeOperator::Limit { expr, offset } => {
3365 write!(f, "LIMIT {expr}")?;
3366 if let Some(offset) = offset {
3367 write!(f, " OFFSET {offset}")?;
3368 }
3369 Ok(())
3370 }
3371 PipeOperator::Aggregate {
3372 full_table_exprs,
3373 group_by_expr,
3374 } => {
3375 write!(f, "AGGREGATE")?;
3376 if !full_table_exprs.is_empty() {
3377 write!(
3378 f,
3379 " {}",
3380 display_comma_separated(full_table_exprs.as_slice())
3381 )?;
3382 }
3383 if !group_by_expr.is_empty() {
3384 write!(f, " GROUP BY {}", display_comma_separated(group_by_expr))?;
3385 }
3386 Ok(())
3387 }
3388
3389 PipeOperator::Where { expr } => {
3390 write!(f, "WHERE {expr}")
3391 }
3392 PipeOperator::OrderBy { exprs } => {
3393 write!(f, "ORDER BY {}", display_comma_separated(exprs.as_slice()))
3394 }
3395
3396 PipeOperator::TableSample { sample } => {
3397 write!(f, "{sample}")
3398 }
3399 PipeOperator::Rename { mappings } => {
3400 write!(f, "RENAME {}", display_comma_separated(mappings))
3401 }
3402 PipeOperator::Union {
3403 set_quantifier,
3404 queries,
3405 } => Self::fmt_set_operation(f, "UNION", set_quantifier, queries),
3406 PipeOperator::Intersect {
3407 set_quantifier,
3408 queries,
3409 } => Self::fmt_set_operation(f, "INTERSECT", set_quantifier, queries),
3410 PipeOperator::Except {
3411 set_quantifier,
3412 queries,
3413 } => Self::fmt_set_operation(f, "EXCEPT", set_quantifier, queries),
3414 PipeOperator::Call { function, alias } => {
3415 write!(f, "CALL {function}")?;
3416 Self::fmt_optional_alias(f, alias)
3417 }
3418 PipeOperator::Pivot {
3419 aggregate_functions,
3420 value_column,
3421 value_source,
3422 alias,
3423 } => {
3424 write!(
3425 f,
3426 "PIVOT({} FOR {} IN ({}))",
3427 display_comma_separated(aggregate_functions),
3428 Expr::CompoundIdentifier(value_column.to_vec()),
3429 value_source
3430 )?;
3431 Self::fmt_optional_alias(f, alias)
3432 }
3433 PipeOperator::Unpivot {
3434 value_column,
3435 name_column,
3436 unpivot_columns,
3437 alias,
3438 } => {
3439 write!(
3440 f,
3441 "UNPIVOT({} FOR {} IN ({}))",
3442 value_column,
3443 name_column,
3444 display_comma_separated(unpivot_columns)
3445 )?;
3446 Self::fmt_optional_alias(f, alias)
3447 }
3448 PipeOperator::Join(join) => write!(f, "{join}"),
3449 }
3450 }
3451}
3452
3453impl PipeOperator {
3454 fn fmt_optional_alias(f: &mut fmt::Formatter<'_>, alias: &Option<Ident>) -> fmt::Result {
3456 if let Some(alias) = alias {
3457 write!(f, " AS {alias}")?;
3458 }
3459 Ok(())
3460 }
3461
3462 fn fmt_set_operation(
3464 f: &mut fmt::Formatter<'_>,
3465 operation: &str,
3466 set_quantifier: &SetQuantifier,
3467 queries: &[Query],
3468 ) -> fmt::Result {
3469 write!(f, "{operation}")?;
3470 match set_quantifier {
3471 SetQuantifier::None => {}
3472 _ => {
3473 write!(f, " {set_quantifier}")?;
3474 }
3475 }
3476 write!(f, " ")?;
3477 let parenthesized_queries: Vec<String> =
3478 queries.iter().map(|query| format!("({query})")).collect();
3479 write!(f, "{}", display_comma_separated(&parenthesized_queries))
3480 }
3481}
3482
3483#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3484#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3485#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3486pub struct Fetch {
3488 pub with_ties: bool,
3490 pub percent: bool,
3492 pub quantity: Option<Expr>,
3494}
3495
3496impl fmt::Display for Fetch {
3497 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3498 let extension = if self.with_ties { "WITH TIES" } else { "ONLY" };
3499 if let Some(ref quantity) = self.quantity {
3500 let percent = if self.percent { " PERCENT" } else { "" };
3501 write!(f, "FETCH FIRST {quantity}{percent} ROWS {extension}")
3502 } else {
3503 write!(f, "FETCH FIRST ROWS {extension}")
3504 }
3505 }
3506}
3507
3508#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3509#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3510#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3511pub struct LockClause {
3513 pub lock_type: LockType,
3515 pub of: Option<ObjectName>,
3517 pub nonblock: Option<NonBlock>,
3519}
3520
3521impl fmt::Display for LockClause {
3522 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3523 write!(f, "FOR {}", &self.lock_type)?;
3524 if let Some(ref of) = self.of {
3525 write!(f, " OF {of}")?;
3526 }
3527 if let Some(ref nb) = self.nonblock {
3528 write!(f, " {nb}")?;
3529 }
3530 Ok(())
3531 }
3532}
3533
3534#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3535#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3536#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3537pub enum LockType {
3539 Share,
3541 Update,
3543}
3544
3545impl fmt::Display for LockType {
3546 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3547 let select_lock = match self {
3548 LockType::Share => "SHARE",
3549 LockType::Update => "UPDATE",
3550 };
3551 write!(f, "{select_lock}")
3552 }
3553}
3554
3555#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3556#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3557#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3558pub enum NonBlock {
3560 Nowait,
3562 SkipLocked,
3564}
3565
3566impl fmt::Display for NonBlock {
3567 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3568 let nonblock = match self {
3569 NonBlock::Nowait => "NOWAIT",
3570 NonBlock::SkipLocked => "SKIP LOCKED",
3571 };
3572 write!(f, "{nonblock}")
3573 }
3574}
3575
3576#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3577#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3578#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3579pub enum Distinct {
3581 All,
3586
3587 Distinct,
3589
3590 On(Vec<Expr>),
3592}
3593
3594impl fmt::Display for Distinct {
3595 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3596 match self {
3597 Distinct::All => write!(f, "ALL"),
3598 Distinct::Distinct => write!(f, "DISTINCT"),
3599 Distinct::On(col_names) => {
3600 let col_names = display_comma_separated(col_names);
3601 write!(f, "DISTINCT ON ({col_names})")
3602 }
3603 }
3604 }
3605}
3606
3607#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3608#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3609#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3610pub struct Top {
3612 pub with_ties: bool,
3615 pub percent: bool,
3617 pub quantity: Option<TopQuantity>,
3619}
3620
3621#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3622#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3623#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3624pub enum TopQuantity {
3626 Expr(Expr),
3628 Constant(u64),
3630}
3631
3632impl fmt::Display for Top {
3633 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3634 let extension = if self.with_ties { " WITH TIES" } else { "" };
3635 if let Some(ref quantity) = self.quantity {
3636 let percent = if self.percent { " PERCENT" } else { "" };
3637 match quantity {
3638 TopQuantity::Expr(quantity) => write!(f, "TOP ({quantity}){percent}{extension}"),
3639 TopQuantity::Constant(quantity) => {
3640 write!(f, "TOP {quantity}{percent}{extension}")
3641 }
3642 }
3643 } else {
3644 write!(f, "TOP{extension}")
3645 }
3646 }
3647}
3648
3649#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3650#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3651#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3652pub struct Values {
3654 pub explicit_row: bool,
3657 pub value_keyword: bool,
3660 pub rows: Vec<Parens<Vec<Expr>>>,
3662}
3663
3664impl fmt::Display for Values {
3665 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3666 match self.value_keyword {
3667 true => f.write_str("VALUE")?,
3668 false => f.write_str("VALUES")?,
3669 };
3670 let prefix = if self.explicit_row { "ROW" } else { "" };
3671 let mut delim = "";
3672 for row in &self.rows {
3673 f.write_str(delim)?;
3674 delim = ",";
3675 SpaceOrNewline.fmt(f)?;
3676 Indent(format_args!("{prefix}({})", display_comma_separated(row))).fmt(f)?;
3677 }
3678 Ok(())
3679 }
3680}
3681
3682#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3683#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3684#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3685pub struct SelectInto {
3687 pub temporary: bool,
3689 pub unlogged: bool,
3691 pub table: bool,
3693 pub name: ObjectName,
3695}
3696
3697impl fmt::Display for SelectInto {
3698 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3699 let temporary = if self.temporary { " TEMPORARY" } else { "" };
3700 let unlogged = if self.unlogged { " UNLOGGED" } else { "" };
3701 let table = if self.table { " TABLE" } else { "" };
3702
3703 write!(f, "INTO{}{}{} {}", temporary, unlogged, table, self.name)
3704 }
3705}
3706
3707#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3712#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3713#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3714pub enum GroupByWithModifier {
3716 Rollup,
3718 Cube,
3720 Totals,
3722 GroupingSets(Expr),
3726}
3727
3728impl fmt::Display for GroupByWithModifier {
3729 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3730 match self {
3731 GroupByWithModifier::Rollup => write!(f, "WITH ROLLUP"),
3732 GroupByWithModifier::Cube => write!(f, "WITH CUBE"),
3733 GroupByWithModifier::Totals => write!(f, "WITH TOTALS"),
3734 GroupByWithModifier::GroupingSets(expr) => {
3735 write!(f, "{expr}")
3736 }
3737 }
3738 }
3739}
3740
3741#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3742#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3743#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3744pub enum GroupByExpr {
3747 All(Vec<GroupByWithModifier>),
3757 Expressions(Vec<Expr>, Vec<GroupByWithModifier>),
3759}
3760
3761impl fmt::Display for GroupByExpr {
3762 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3763 match self {
3764 GroupByExpr::All(modifiers) => {
3765 write!(f, "GROUP BY ALL")?;
3766 if !modifiers.is_empty() {
3767 write!(f, " {}", display_separated(modifiers, " "))?;
3768 }
3769 Ok(())
3770 }
3771 GroupByExpr::Expressions(col_names, modifiers) => {
3772 f.write_str("GROUP BY")?;
3773 SpaceOrNewline.fmt(f)?;
3774 Indent(display_comma_separated(col_names)).fmt(f)?;
3775 if !modifiers.is_empty() {
3776 write!(f, " {}", display_separated(modifiers, " "))?;
3777 }
3778 Ok(())
3779 }
3780 }
3781 }
3782}
3783
3784#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3788#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3789#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3790pub enum FormatClause {
3791 Identifier(Ident),
3793 Null,
3795}
3796
3797impl fmt::Display for FormatClause {
3798 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3799 match self {
3800 FormatClause::Identifier(ident) => write!(f, "FORMAT {ident}"),
3801 FormatClause::Null => write!(f, "FORMAT NULL"),
3802 }
3803 }
3804}
3805
3806#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3810#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3811#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3812pub struct InputFormatClause {
3813 pub ident: Ident,
3815 pub values: Vec<Expr>,
3817}
3818
3819impl fmt::Display for InputFormatClause {
3820 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3821 write!(f, "FORMAT {}", self.ident)?;
3822
3823 if !self.values.is_empty() {
3824 write!(f, " {}", display_comma_separated(self.values.as_slice()))?;
3825 }
3826
3827 Ok(())
3828 }
3829}
3830
3831#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3833#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3834#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3835pub enum ForClause {
3836 Browse,
3838 Json {
3840 for_json: ForJson,
3842 root: Option<String>,
3844 include_null_values: bool,
3846 without_array_wrapper: bool,
3848 },
3849 Xml {
3851 for_xml: ForXml,
3853 elements: bool,
3855 binary_base64: bool,
3857 root: Option<String>,
3859 r#type: bool,
3861 },
3862}
3863
3864impl fmt::Display for ForClause {
3865 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3866 match self {
3867 ForClause::Browse => write!(f, "FOR BROWSE"),
3868 ForClause::Json {
3869 for_json,
3870 root,
3871 include_null_values,
3872 without_array_wrapper,
3873 } => {
3874 write!(f, "FOR JSON ")?;
3875 write!(f, "{for_json}")?;
3876 if let Some(root) = root {
3877 write!(f, ", ROOT('{root}')")?;
3878 }
3879 if *include_null_values {
3880 write!(f, ", INCLUDE_NULL_VALUES")?;
3881 }
3882 if *without_array_wrapper {
3883 write!(f, ", WITHOUT_ARRAY_WRAPPER")?;
3884 }
3885 Ok(())
3886 }
3887 ForClause::Xml {
3888 for_xml,
3889 elements,
3890 binary_base64,
3891 root,
3892 r#type,
3893 } => {
3894 write!(f, "FOR XML ")?;
3895 write!(f, "{for_xml}")?;
3896 if *binary_base64 {
3897 write!(f, ", BINARY BASE64")?;
3898 }
3899 if *r#type {
3900 write!(f, ", TYPE")?;
3901 }
3902 if let Some(root) = root {
3903 write!(f, ", ROOT('{root}')")?;
3904 }
3905 if *elements {
3906 write!(f, ", ELEMENTS")?;
3907 }
3908 Ok(())
3909 }
3910 }
3911 }
3912}
3913
3914#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3915#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3916#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3917pub enum ForXml {
3919 Raw(Option<String>),
3921 Auto,
3923 Explicit,
3925 Path(Option<String>),
3927}
3928
3929impl fmt::Display for ForXml {
3930 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3931 match self {
3932 ForXml::Raw(root) => {
3933 write!(f, "RAW")?;
3934 if let Some(root) = root {
3935 write!(f, "('{root}')")?;
3936 }
3937 Ok(())
3938 }
3939 ForXml::Auto => write!(f, "AUTO"),
3940 ForXml::Explicit => write!(f, "EXPLICIT"),
3941 ForXml::Path(root) => {
3942 write!(f, "PATH")?;
3943 if let Some(root) = root {
3944 write!(f, "('{root}')")?;
3945 }
3946 Ok(())
3947 }
3948 }
3949 }
3950}
3951
3952#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3953#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3954#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3955pub enum ForJson {
3957 Auto,
3959 Path,
3961}
3962
3963impl fmt::Display for ForJson {
3964 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3965 match self {
3966 ForJson::Auto => write!(f, "AUTO"),
3967 ForJson::Path => write!(f, "PATH"),
3968 }
3969 }
3970}
3971
3972#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
3993#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
3994#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
3995pub enum JsonTableColumn {
3996 Named(JsonTableNamedColumn),
3998 ForOrdinality(Ident),
4000 Nested(JsonTableNestedColumn),
4002}
4003
4004impl fmt::Display for JsonTableColumn {
4005 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4006 match self {
4007 JsonTableColumn::Named(json_table_named_column) => {
4008 write!(f, "{json_table_named_column}")
4009 }
4010 JsonTableColumn::ForOrdinality(ident) => write!(f, "{ident} FOR ORDINALITY"),
4011 JsonTableColumn::Nested(json_table_nested_column) => {
4012 write!(f, "{json_table_nested_column}")
4013 }
4014 }
4015 }
4016}
4017
4018#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4022#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4023#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4024pub struct JsonTableNestedColumn {
4026 pub path: ValueWithSpan,
4028 pub columns: Vec<JsonTableColumn>,
4030}
4031
4032impl fmt::Display for JsonTableNestedColumn {
4033 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4034 write!(
4035 f,
4036 "NESTED PATH {} COLUMNS ({})",
4037 self.path,
4038 display_comma_separated(&self.columns)
4039 )
4040 }
4041}
4042
4043#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4051#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4052#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4053pub struct JsonTableNamedColumn {
4054 pub name: Ident,
4056 pub r#type: DataType,
4058 pub path: ValueWithSpan,
4060 pub exists: bool,
4062 pub on_empty: Option<JsonTableColumnErrorHandling>,
4064 pub on_error: Option<JsonTableColumnErrorHandling>,
4066}
4067
4068impl fmt::Display for JsonTableNamedColumn {
4069 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4070 write!(
4071 f,
4072 "{} {}{} PATH {}",
4073 self.name,
4074 self.r#type,
4075 if self.exists { " EXISTS" } else { "" },
4076 self.path
4077 )?;
4078 if let Some(on_empty) = &self.on_empty {
4079 write!(f, " {on_empty} ON EMPTY")?;
4080 }
4081 if let Some(on_error) = &self.on_error {
4082 write!(f, " {on_error} ON ERROR")?;
4083 }
4084 Ok(())
4085 }
4086}
4087
4088#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4091#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4092#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4093pub enum JsonTableColumnErrorHandling {
4095 Null,
4097 Default(ValueWithSpan),
4099 Error,
4101}
4102
4103impl fmt::Display for JsonTableColumnErrorHandling {
4104 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4105 match self {
4106 JsonTableColumnErrorHandling::Null => write!(f, "NULL"),
4107 JsonTableColumnErrorHandling::Default(json_string) => {
4108 write!(f, "DEFAULT {json_string}")
4109 }
4110 JsonTableColumnErrorHandling::Error => write!(f, "ERROR"),
4111 }
4112 }
4113}
4114
4115#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4123#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4124#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4125pub struct OpenJsonTableColumn {
4126 pub name: Ident,
4128 pub r#type: DataType,
4130 pub path: Option<String>,
4132 pub as_json: bool,
4134}
4135
4136impl fmt::Display for OpenJsonTableColumn {
4137 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4138 write!(f, "{} {}", self.name, self.r#type)?;
4139 if let Some(path) = &self.path {
4140 write!(f, " '{}'", value::escape_single_quote_string(path))?;
4141 }
4142 if self.as_json {
4143 write!(f, " AS JSON")?;
4144 }
4145 Ok(())
4146 }
4147}
4148
4149#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4156#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4157#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4158pub enum ValueTableMode {
4160 AsStruct,
4162 AsValue,
4164 DistinctAsStruct,
4166 DistinctAsValue,
4168}
4169
4170impl fmt::Display for ValueTableMode {
4171 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4172 match self {
4173 ValueTableMode::AsStruct => write!(f, "AS STRUCT"),
4174 ValueTableMode::AsValue => write!(f, "AS VALUE"),
4175 ValueTableMode::DistinctAsStruct => write!(f, "DISTINCT AS STRUCT"),
4176 ValueTableMode::DistinctAsValue => write!(f, "DISTINCT AS VALUE"),
4177 }
4178 }
4179}
4180
4181#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4183#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4184#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4185pub enum UpdateTableFromKind {
4186 BeforeSet(Vec<TableWithJoins>),
4189 AfterSet(Vec<TableWithJoins>),
4192}
4193
4194#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4196#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4197#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4198pub enum XmlTableColumnOption {
4199 NamedInfo {
4201 r#type: DataType,
4203 path: Option<Expr>,
4205 default: Option<Expr>,
4207 nullable: bool,
4209 },
4210 ForOrdinality,
4212}
4213
4214#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4227#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4228#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4229pub struct XmlTableColumn {
4230 pub name: Ident,
4232 pub option: XmlTableColumnOption,
4234}
4235
4236impl fmt::Display for XmlTableColumn {
4237 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4238 write!(f, "{}", self.name)?;
4239 match &self.option {
4240 XmlTableColumnOption::NamedInfo {
4241 r#type,
4242 path,
4243 default,
4244 nullable,
4245 } => {
4246 write!(f, " {type}")?;
4247 if let Some(p) = path {
4248 write!(f, " PATH {p}")?;
4249 }
4250 if let Some(d) = default {
4251 write!(f, " DEFAULT {d}")?;
4252 }
4253 if !*nullable {
4254 write!(f, " NOT NULL")?;
4255 }
4256 Ok(())
4257 }
4258 XmlTableColumnOption::ForOrdinality => {
4259 write!(f, " FOR ORDINALITY")
4260 }
4261 }
4262 }
4263}
4264
4265#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4267#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4268#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4269pub struct XmlPassingArgument {
4271 pub expr: Expr,
4273 pub alias: Option<Ident>,
4275 pub by_value: bool,
4277}
4278
4279impl fmt::Display for XmlPassingArgument {
4280 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4281 if self.by_value {
4282 write!(f, "BY VALUE ")?;
4283 }
4284 write!(f, "{}", self.expr)?;
4285 if let Some(alias) = &self.alias {
4286 write!(f, " AS {alias}")?;
4287 }
4288 Ok(())
4289 }
4290}
4291
4292#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4294#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4295#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4296pub struct XmlPassingClause {
4298 pub arguments: Vec<XmlPassingArgument>,
4300}
4301
4302impl fmt::Display for XmlPassingClause {
4303 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4304 if !self.arguments.is_empty() {
4305 write!(f, " PASSING {}", display_comma_separated(&self.arguments))?;
4306 }
4307 Ok(())
4308 }
4309}
4310
4311#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
4315#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
4316#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
4317pub struct XmlNamespaceDefinition {
4318 pub uri: Expr,
4320 pub name: Ident,
4322}
4323
4324impl fmt::Display for XmlNamespaceDefinition {
4325 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4326 write!(f, "{} AS {}", self.uri, self.name)
4327 }
4328}