Skip to content

Commit 8d14e8e

Browse files
xitepayman-sigma
authored andcommitted
Preserve optional AS keyword in aliases (apache#2103)
1 parent 5cfb01f commit 8d14e8e

File tree

10 files changed

+202
-269
lines changed

10 files changed

+202
-269
lines changed

src/ast/query.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,7 +1908,7 @@ impl fmt::Display for TableFactor {
19081908
write!(f, " {sample}")?;
19091909
}
19101910
if let Some(alias) = alias {
1911-
write!(f, " AS {alias}")?;
1911+
write!(f, " {alias}")?;
19121912
}
19131913
if !index_hints.is_empty() {
19141914
write!(f, " {}", display_separated(index_hints, " "))?;
@@ -1938,7 +1938,7 @@ impl fmt::Display for TableFactor {
19381938
NewLine.fmt(f)?;
19391939
f.write_str(")")?;
19401940
if let Some(alias) = alias {
1941-
write!(f, " AS {alias}")?;
1941+
write!(f, " {alias}")?;
19421942
}
19431943
Ok(())
19441944
}
@@ -1961,14 +1961,14 @@ impl fmt::Display for TableFactor {
19611961
write!(f, "{name}")?;
19621962
write!(f, "({})", display_comma_separated(args))?;
19631963
if let Some(alias) = alias {
1964-
write!(f, " AS {alias}")?;
1964+
write!(f, " {alias}")?;
19651965
}
19661966
Ok(())
19671967
}
19681968
TableFactor::TableFunction { expr, alias } => {
19691969
write!(f, "TABLE({expr})")?;
19701970
if let Some(alias) = alias {
1971-
write!(f, " AS {alias}")?;
1971+
write!(f, " {alias}")?;
19721972
}
19731973
Ok(())
19741974
}
@@ -1986,13 +1986,13 @@ impl fmt::Display for TableFactor {
19861986
}
19871987

19881988
if let Some(alias) = alias {
1989-
write!(f, " AS {alias}")?;
1989+
write!(f, " {alias}")?;
19901990
}
19911991
if *with_offset {
19921992
write!(f, " WITH OFFSET")?;
19931993
}
19941994
if let Some(alias) = with_offset_alias {
1995-
write!(f, " AS {alias}")?;
1995+
write!(f, " {alias}")?;
19961996
}
19971997
Ok(())
19981998
}
@@ -2008,7 +2008,7 @@ impl fmt::Display for TableFactor {
20082008
columns = display_comma_separated(columns)
20092009
)?;
20102010
if let Some(alias) = alias {
2011-
write!(f, " AS {alias}")?;
2011+
write!(f, " {alias}")?;
20122012
}
20132013
Ok(())
20142014
}
@@ -2027,7 +2027,7 @@ impl fmt::Display for TableFactor {
20272027
write!(f, " WITH ({})", display_comma_separated(columns))?;
20282028
}
20292029
if let Some(alias) = alias {
2030-
write!(f, " AS {alias}")?;
2030+
write!(f, " {alias}")?;
20312031
}
20322032
Ok(())
20332033
}
@@ -2037,7 +2037,7 @@ impl fmt::Display for TableFactor {
20372037
} => {
20382038
write!(f, "({table_with_joins})")?;
20392039
if let Some(alias) = alias {
2040-
write!(f, " AS {alias}")?;
2040+
write!(f, " {alias}")?;
20412041
}
20422042
Ok(())
20432043
}
@@ -2064,8 +2064,8 @@ impl fmt::Display for TableFactor {
20642064
write!(f, " DEFAULT ON NULL ({expr})")?;
20652065
}
20662066
write!(f, ")")?;
2067-
if alias.is_some() {
2068-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2067+
if let Some(alias) = alias {
2068+
write!(f, " {alias}")?;
20692069
}
20702070
Ok(())
20712071
}
@@ -2088,8 +2088,8 @@ impl fmt::Display for TableFactor {
20882088
name,
20892089
display_comma_separated(columns)
20902090
)?;
2091-
if alias.is_some() {
2092-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2091+
if let Some(alias) = alias {
2092+
write!(f, " {alias}")?;
20932093
}
20942094
Ok(())
20952095
}
@@ -2122,8 +2122,8 @@ impl fmt::Display for TableFactor {
21222122
}
21232123
write!(f, "PATTERN ({pattern}) ")?;
21242124
write!(f, "DEFINE {})", display_comma_separated(symbols))?;
2125-
if alias.is_some() {
2126-
write!(f, " AS {}", alias.as_ref().unwrap())?;
2125+
if let Some(alias) = alias {
2126+
write!(f, " {alias}")?;
21272127
}
21282128
Ok(())
21292129
}
@@ -2148,7 +2148,7 @@ impl fmt::Display for TableFactor {
21482148
columns = display_comma_separated(columns)
21492149
)?;
21502150
if let Some(alias) = alias {
2151-
write!(f, " AS {alias}")?;
2151+
write!(f, " {alias}")?;
21522152
}
21532153
Ok(())
21542154
}
@@ -2181,7 +2181,7 @@ impl fmt::Display for TableFactor {
21812181
write!(f, ")")?;
21822182

21832183
if let Some(alias) = alias {
2184-
write!(f, " AS {alias}")?;
2184+
write!(f, " {alias}")?;
21852185
}
21862186

21872187
Ok(())
@@ -2194,13 +2194,17 @@ impl fmt::Display for TableFactor {
21942194
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
21952195
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
21962196
pub struct TableAlias {
2197+
/// Tells whether the alias was introduced with an explicit, preceding "AS"
2198+
/// keyword, e.g. `AS name`. Typically, the keyword is preceding the name
2199+
/// (e.g. `.. FROM table AS t ..`).
2200+
pub explicit: bool,
21972201
pub name: Ident,
21982202
pub columns: Vec<TableAliasColumnDef>,
21992203
}
22002204

22012205
impl fmt::Display for TableAlias {
22022206
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2203-
write!(f, "{}", self.name)?;
2207+
write!(f, "{}{}", if self.explicit { "AS " } else { "" }, self.name)?;
22042208
if !self.columns.is_empty() {
22052209
write!(f, " ({})", display_comma_separated(&self.columns))?;
22062210
}

src/ast/spans.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
use crate::ast::{
19-
ddl::AlterSchema, query::SelectItemQualifiedWildcardKind, AlterSchemaOperation, AlterTable,
20-
ColumnOptions, CreateOperator, CreateOperatorClass, CreateOperatorFamily, CreateView,
21-
ExportData, Owner, TypedString,
18+
use crate::{
19+
ast::{
20+
ddl::AlterSchema, query::SelectItemQualifiedWildcardKind, AlterSchemaOperation, AlterTable,
21+
ColumnOptions, CreateOperator, CreateOperatorClass, CreateOperatorFamily, CreateView,
22+
ExportData, Owner, TypedString,
23+
},
24+
tokenizer::TokenWithSpan,
2225
};
2326
use core::iter;
2427

@@ -96,6 +99,12 @@ pub trait Spanned {
9699
fn span(&self) -> Span;
97100
}
98101

102+
impl Spanned for TokenWithSpan {
103+
fn span(&self) -> Span {
104+
self.span
105+
}
106+
}
107+
99108
impl Spanned for Query {
100109
fn span(&self) -> Span {
101110
let Query {
@@ -2088,9 +2097,12 @@ impl Spanned for FunctionArgExpr {
20882097

20892098
impl Spanned for TableAlias {
20902099
fn span(&self) -> Span {
2091-
let TableAlias { name, columns } = self;
2092-
2093-
union_spans(iter::once(name.span).chain(columns.iter().map(|i| i.span())))
2100+
let TableAlias {
2101+
explicit: _,
2102+
name,
2103+
columns,
2104+
} = self;
2105+
union_spans(core::iter::once(name.span).chain(columns.iter().map(Spanned::span)))
20942106
}
20952107
}
20962108

src/parser/mod.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11171,10 +11171,15 @@ impl<'a> Parser<'a> {
1117111171
fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
1117211172
parser.dialect.is_table_factor_alias(explicit, kw, parser)
1117311173
}
11174+
let explicit = self.peek_keyword(Keyword::AS);
1117411175
match self.parse_optional_alias_inner(None, validator)? {
1117511176
Some(name) => {
1117611177
let columns = self.parse_table_alias_column_defs()?;
11177-
Ok(Some(TableAlias { name, columns }))
11178+
Ok(Some(TableAlias {
11179+
explicit,
11180+
name,
11181+
columns,
11182+
}))
1117811183
}
1117911184
None => Ok(None),
1118011185
}
@@ -12806,6 +12811,7 @@ impl<'a> Parser<'a> {
1280612811
let closing_paren_token = self.expect_token(&Token::RParen)?;
1280712812

1280812813
let alias = TableAlias {
12814+
explicit: false,
1280912815
name,
1281012816
columns: vec![],
1281112817
};
@@ -12832,7 +12838,11 @@ impl<'a> Parser<'a> {
1283212838
let query = self.parse_query()?;
1283312839
let closing_paren_token = self.expect_token(&Token::RParen)?;
1283412840

12835-
let alias = TableAlias { name, columns };
12841+
let alias = TableAlias {
12842+
explicit: false,
12843+
name,
12844+
columns,
12845+
};
1283612846
Cte {
1283712847
alias,
1283812848
query,

src/test_utils.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,9 @@ pub fn single_quoted_string(s: impl Into<String>) -> Value {
368368
Value::SingleQuotedString(s.into())
369369
}
370370

371-
pub fn table_alias(name: impl Into<String>) -> Option<TableAlias> {
371+
pub fn table_alias(explicit: bool, name: impl Into<String>) -> Option<TableAlias> {
372372
Some(TableAlias {
373+
explicit,
373374
name: Ident::new(name),
374375
columns: vec![],
375376
})
@@ -405,13 +406,14 @@ pub fn table_from_name(name: ObjectName) -> TableFactor {
405406
}
406407
}
407408

408-
pub fn table_with_alias(name: impl Into<String>, alias: impl Into<String>) -> TableFactor {
409+
pub fn table_with_alias(
410+
name: impl Into<String>,
411+
with_as_keyword: bool,
412+
alias: impl Into<String>,
413+
) -> TableFactor {
409414
TableFactor::Table {
410415
name: ObjectName::from(vec![Ident::new(name)]),
411-
alias: Some(TableAlias {
412-
name: Ident::new(alias),
413-
columns: vec![],
414-
}),
416+
alias: table_alias(with_as_keyword, alias),
415417
args: None,
416418
with_hints: vec![],
417419
version: None,

tests/sqlparser_bigquery.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,7 +1690,7 @@ fn parse_table_identifiers() {
16901690
fn parse_hyphenated_table_identifiers() {
16911691
bigquery().one_statement_parses_to(
16921692
"select * from foo-bar f join baz-qux b on f.id = b.id",
1693-
"SELECT * FROM foo-bar AS f JOIN baz-qux AS b ON f.id = b.id",
1693+
"SELECT * FROM foo-bar f JOIN baz-qux b ON f.id = b.id",
16941694
);
16951695

16961696
assert_eq!(
@@ -1766,7 +1766,7 @@ fn parse_join_constraint_unnest_alias() {
17661766
.joins,
17671767
vec![Join {
17681768
relation: TableFactor::UNNEST {
1769-
alias: table_alias("f"),
1769+
alias: table_alias(true, "f"),
17701770
array_exprs: vec![Expr::CompoundIdentifier(vec![
17711771
Ident::new("t1"),
17721772
Ident::new("a")
@@ -1841,10 +1841,7 @@ fn parse_merge() {
18411841
assert_eq!(
18421842
TableFactor::Table {
18431843
name: ObjectName::from(vec![Ident::new("inventory")]),
1844-
alias: Some(TableAlias {
1845-
name: Ident::new("T"),
1846-
columns: vec![],
1847-
}),
1844+
alias: table_alias(true, "T"),
18481845
args: Default::default(),
18491846
with_hints: Default::default(),
18501847
version: Default::default(),
@@ -1859,10 +1856,7 @@ fn parse_merge() {
18591856
assert_eq!(
18601857
TableFactor::Table {
18611858
name: ObjectName::from(vec![Ident::new("newArrivals")]),
1862-
alias: Some(TableAlias {
1863-
name: Ident::new("S"),
1864-
columns: vec![],
1865-
}),
1859+
alias: table_alias(true, "S"),
18661860
args: Default::default(),
18671861
with_hints: Default::default(),
18681862
version: Default::default(),

0 commit comments

Comments
 (0)