Skip to content

Commit 2f8d5f6

Browse files
Merge branch 'main' into no-whitespace-parser
2 parents 03a884d + 2ceae00 commit 2f8d5f6

File tree

11 files changed

+620
-316
lines changed

11 files changed

+620
-316
lines changed

src/ast/mod.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4051,6 +4051,8 @@ pub enum Statement {
40514051
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement)
40524052
/// [MSSQL](https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16)
40534053
Merge {
4054+
/// The `MERGE` token that starts the statement.
4055+
merge_token: AttachedToken,
40544056
/// optional INTO keyword
40554057
into: bool,
40564058
/// Specifies the table to merge
@@ -4075,7 +4077,6 @@ pub enum Statement {
40754077
/// Table flag
40764078
table_flag: Option<ObjectName>,
40774079
/// Table name
4078-
40794080
#[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
40804081
table_name: ObjectName,
40814082
has_as: bool,
@@ -5438,6 +5439,7 @@ impl fmt::Display for Statement {
54385439
write!(f, "RELEASE SAVEPOINT {name}")
54395440
}
54405441
Statement::Merge {
5442+
merge_token: _,
54415443
into,
54425444
table,
54435445
source,
@@ -8570,6 +8572,8 @@ impl Display for MergeInsertKind {
85708572
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
85718573
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
85728574
pub struct MergeInsertExpr {
8575+
/// The `INSERT` token that starts the sub-expression.
8576+
pub insert_token: AttachedToken,
85738577
/// Columns (if any) specified by the insert.
85748578
///
85758579
/// Example:
@@ -8578,6 +8582,8 @@ pub struct MergeInsertExpr {
85788582
/// INSERT (product, quantity) ROW
85798583
/// ```
85808584
pub columns: Vec<Ident>,
8585+
/// The token, `[VALUES | ROW]` starting `kind`.
8586+
pub kind_token: AttachedToken,
85818587
/// The insert type used by the statement.
85828588
pub kind: MergeInsertKind,
85838589
}
@@ -8617,9 +8623,16 @@ pub enum MergeAction {
86178623
/// ```sql
86188624
/// UPDATE SET quantity = T.quantity + S.quantity
86198625
/// ```
8620-
Update { assignments: Vec<Assignment> },
8626+
Update {
8627+
/// The `UPDATE` token that starts the sub-expression.
8628+
update_token: AttachedToken,
8629+
assignments: Vec<Assignment>,
8630+
},
86218631
/// A plain `DELETE` clause
8622-
Delete,
8632+
Delete {
8633+
/// The `DELETE` token that starts the sub-expression.
8634+
delete_token: AttachedToken,
8635+
},
86238636
}
86248637

86258638
impl Display for MergeAction {
@@ -8628,10 +8641,10 @@ impl Display for MergeAction {
86288641
MergeAction::Insert(insert) => {
86298642
write!(f, "INSERT {insert}")
86308643
}
8631-
MergeAction::Update { assignments } => {
8644+
MergeAction::Update { assignments, .. } => {
86328645
write!(f, "UPDATE SET {}", display_comma_separated(assignments))
86338646
}
8634-
MergeAction::Delete => {
8647+
MergeAction::Delete { .. } => {
86358648
write!(f, "DELETE")
86368649
}
86378650
}
@@ -8650,6 +8663,8 @@ impl Display for MergeAction {
86508663
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
86518664
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
86528665
pub struct MergeClause {
8666+
/// The `WHEN` token that starts the sub-expression.
8667+
pub when_token: AttachedToken,
86538668
pub clause_kind: MergeClauseKind,
86548669
pub predicate: Option<Expr>,
86558670
pub action: MergeAction,
@@ -8658,6 +8673,7 @@ pub struct MergeClause {
86588673
impl Display for MergeClause {
86598674
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
86608675
let MergeClause {
8676+
when_token: _,
86618677
clause_kind,
86628678
predicate,
86638679
action,
@@ -8681,10 +8697,12 @@ impl Display for MergeClause {
86818697
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
86828698
pub enum OutputClause {
86838699
Output {
8700+
output_token: AttachedToken,
86848701
select_items: Vec<SelectItem>,
86858702
into_table: Option<SelectInto>,
86868703
},
86878704
Returning {
8705+
returning_token: AttachedToken,
86888706
select_items: Vec<SelectItem>,
86898707
},
86908708
}
@@ -8693,6 +8711,7 @@ impl fmt::Display for OutputClause {
86938711
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
86948712
match self {
86958713
OutputClause::Output {
8714+
output_token: _,
86968715
select_items,
86978716
into_table,
86988717
} => {
@@ -8704,7 +8723,10 @@ impl fmt::Display for OutputClause {
87048723
}
87058724
Ok(())
87068725
}
8707-
OutputClause::Returning { select_items } => {
8726+
OutputClause::Returning {
8727+
returning_token: _,
8728+
select_items,
8729+
} => {
87088730
f.write_str("RETURNING ")?;
87098731
display_comma_separated(select_items).fmt(f)
87108732
}

src/ast/query.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,7 +1902,7 @@ impl fmt::Display for TableFactor {
19021902
write!(f, " {sample}")?;
19031903
}
19041904
if let Some(alias) = alias {
1905-
write!(f, " AS {alias}")?;
1905+
write!(f, " {alias}")?;
19061906
}
19071907
if !index_hints.is_empty() {
19081908
write!(f, " {}", display_separated(index_hints, " "))?;
@@ -1932,7 +1932,7 @@ impl fmt::Display for TableFactor {
19321932
NewLine.fmt(f)?;
19331933
f.write_str(")")?;
19341934
if let Some(alias) = alias {
1935-
write!(f, " AS {alias}")?;
1935+
write!(f, " {alias}")?;
19361936
}
19371937
Ok(())
19381938
}
@@ -1948,14 +1948,14 @@ impl fmt::Display for TableFactor {
19481948
write!(f, "{name}")?;
19491949
write!(f, "({})", display_comma_separated(args))?;
19501950
if let Some(alias) = alias {
1951-
write!(f, " AS {alias}")?;
1951+
write!(f, " {alias}")?;
19521952
}
19531953
Ok(())
19541954
}
19551955
TableFactor::TableFunction { expr, alias } => {
19561956
write!(f, "TABLE({expr})")?;
19571957
if let Some(alias) = alias {
1958-
write!(f, " AS {alias}")?;
1958+
write!(f, " {alias}")?;
19591959
}
19601960
Ok(())
19611961
}
@@ -1973,13 +1973,13 @@ impl fmt::Display for TableFactor {
19731973
}
19741974

19751975
if let Some(alias) = alias {
1976-
write!(f, " AS {alias}")?;
1976+
write!(f, " {alias}")?;
19771977
}
19781978
if *with_offset {
19791979
write!(f, " WITH OFFSET")?;
19801980
}
19811981
if let Some(alias) = with_offset_alias {
1982-
write!(f, " AS {alias}")?;
1982+
write!(f, " {alias}")?;
19831983
}
19841984
Ok(())
19851985
}
@@ -1995,7 +1995,7 @@ impl fmt::Display for TableFactor {
19951995
columns = display_comma_separated(columns)
19961996
)?;
19971997
if let Some(alias) = alias {
1998-
write!(f, " AS {alias}")?;
1998+
write!(f, " {alias}")?;
19991999
}
20002000
Ok(())
20012001
}
@@ -2014,7 +2014,7 @@ impl fmt::Display for TableFactor {
20142014
write!(f, " WITH ({})", display_comma_separated(columns))?;
20152015
}
20162016
if let Some(alias) = alias {
2017-
write!(f, " AS {alias}")?;
2017+
write!(f, " {alias}")?;
20182018
}
20192019
Ok(())
20202020
}
@@ -2024,7 +2024,7 @@ impl fmt::Display for TableFactor {
20242024
} => {
20252025
write!(f, "({table_with_joins})")?;
20262026
if let Some(alias) = alias {
2027-
write!(f, " AS {alias}")?;
2027+
write!(f, " {alias}")?;
20282028
}
20292029
Ok(())
20302030
}
@@ -2051,8 +2051,8 @@ impl fmt::Display for TableFactor {
20512051
write!(f, " DEFAULT ON NULL ({expr})")?;
20522052
}
20532053
write!(f, ")")?;
2054-
if alias.is_some() {
2055-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2054+
if let Some(alias) = alias {
2055+
write!(f, " {alias}")?;
20562056
}
20572057
Ok(())
20582058
}
@@ -2075,8 +2075,8 @@ impl fmt::Display for TableFactor {
20752075
name,
20762076
display_comma_separated(columns)
20772077
)?;
2078-
if alias.is_some() {
2079-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2078+
if let Some(alias) = alias {
2079+
write!(f, " {alias}")?;
20802080
}
20812081
Ok(())
20822082
}
@@ -2109,8 +2109,8 @@ impl fmt::Display for TableFactor {
21092109
}
21102110
write!(f, "PATTERN ({pattern}) ")?;
21112111
write!(f, "DEFINE {})", display_comma_separated(symbols))?;
2112-
if alias.is_some() {
2113-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2112+
if let Some(alias) = alias {
2113+
write!(f, " {alias}")?;
21142114
}
21152115
Ok(())
21162116
}
@@ -2135,7 +2135,7 @@ impl fmt::Display for TableFactor {
21352135
columns = display_comma_separated(columns)
21362136
)?;
21372137
if let Some(alias) = alias {
2138-
write!(f, " AS {alias}")?;
2138+
write!(f, " {alias}")?;
21392139
}
21402140
Ok(())
21412141
}
@@ -2168,7 +2168,7 @@ impl fmt::Display for TableFactor {
21682168
write!(f, ")")?;
21692169

21702170
if let Some(alias) = alias {
2171-
write!(f, " AS {alias}")?;
2171+
write!(f, " {alias}")?;
21722172
}
21732173

21742174
Ok(())
@@ -2181,13 +2181,17 @@ impl fmt::Display for TableFactor {
21812181
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
21822182
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
21832183
pub struct TableAlias {
2184+
/// Tells whether the alias was introduced with an explicit, preceding "AS"
2185+
/// keyword, e.g. `AS name`. Typically, the keyword is preceding the name
2186+
/// (e.g. `.. FROM table AS t ..`).
2187+
pub explicit: bool,
21842188
pub name: Ident,
21852189
pub columns: Vec<TableAliasColumnDef>,
21862190
}
21872191

21882192
impl fmt::Display for TableAlias {
21892193
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2190-
write!(f, "{}", self.name)?;
2194+
write!(f, "{}{}", if self.explicit { "AS " } else { "" }, self.name)?;
21912195
if !self.columns.is_empty() {
21922196
write!(f, " ({})", display_comma_separated(&self.columns))?;
21932197
}

0 commit comments

Comments
 (0)