Skip to content

Commit 899c08b

Browse files
committed
Only parse FROM identifier in CTE if using Hive
1 parent d9b53a0 commit 899c08b

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

src/parser/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13958,7 +13958,7 @@ impl<'a> Parser<'a> {
1395813958
closing_paren_token: closing_paren_token.into(),
1395913959
}
1396013960
};
13961-
if self.parse_keyword(Keyword::FROM) {
13961+
if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::FROM) {
1396213962
cte.from = Some(self.parse_identifier()?);
1396313963
}
1396413964
Ok(cte)

tests/sqlparser_common.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16073,6 +16073,129 @@ fn test_select_from_first() {
1607316073
}
1607416074
}
1607516075

16076+
#[test]
16077+
fn test_select_from_first_with_cte() {
16078+
let dialects = all_dialects_where(|d| d.supports_from_first_select());
16079+
let q = "WITH test AS (FROM t SELECT a) FROM test SELECT 1";
16080+
16081+
let ast = dialects.verified_query(q);
16082+
16083+
let expected = Query {
16084+
with: Some(With {
16085+
with_token: AttachedToken::empty(),
16086+
recursive: false,
16087+
cte_tables: vec![Cte {
16088+
alias: TableAlias {
16089+
explicit: false,
16090+
name: Ident {
16091+
value: "test".to_string(),
16092+
quote_style: None,
16093+
span: Span::empty(),
16094+
},
16095+
columns: vec![],
16096+
},
16097+
query: Box::new(Query {
16098+
with: None,
16099+
body: Box::new(SetExpr::Select(Box::new(Select {
16100+
select_token: AttachedToken::empty(),
16101+
optimizer_hints: vec![],
16102+
distinct: None,
16103+
select_modifiers: None,
16104+
top: None,
16105+
projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident {
16106+
value: "a".to_string(),
16107+
quote_style: None,
16108+
span: Span::empty(),
16109+
}))],
16110+
exclude: None,
16111+
top_before_distinct: false,
16112+
into: None,
16113+
from: vec![TableWithJoins {
16114+
relation: table_from_name(ObjectName::from(vec![Ident {
16115+
value: "t".to_string(),
16116+
quote_style: None,
16117+
span: Span::empty(),
16118+
}])),
16119+
joins: vec![],
16120+
}],
16121+
lateral_views: vec![],
16122+
prewhere: None,
16123+
selection: None,
16124+
group_by: GroupByExpr::Expressions(vec![], vec![]),
16125+
cluster_by: vec![],
16126+
distribute_by: vec![],
16127+
sort_by: vec![],
16128+
having: None,
16129+
named_window: vec![],
16130+
window_before_qualify: false,
16131+
qualify: None,
16132+
value_table_mode: None,
16133+
connect_by: vec![],
16134+
flavor: SelectFlavor::FromFirst,
16135+
}))),
16136+
order_by: None,
16137+
limit_clause: None,
16138+
fetch: None,
16139+
locks: vec![],
16140+
for_clause: None,
16141+
settings: None,
16142+
format_clause: None,
16143+
pipe_operators: vec![],
16144+
}),
16145+
from: None,
16146+
materialized: None,
16147+
closing_paren_token: AttachedToken::empty(),
16148+
}],
16149+
}),
16150+
body: Box::new(SetExpr::Select(Box::new(Select {
16151+
select_token: AttachedToken::empty(),
16152+
optimizer_hints: vec![],
16153+
distinct: None,
16154+
select_modifiers: None,
16155+
top: None,
16156+
projection: vec![SelectItem::UnnamedExpr(Expr::Value(ValueWithSpan {
16157+
value: test_utils::number("1"),
16158+
span: Span::empty(),
16159+
}))],
16160+
exclude: None,
16161+
top_before_distinct: false,
16162+
into: None,
16163+
from: vec![TableWithJoins {
16164+
relation: table_from_name(ObjectName::from(vec![Ident {
16165+
value: "test".to_string(),
16166+
quote_style: None,
16167+
span: Span::empty(),
16168+
}])),
16169+
joins: vec![],
16170+
}],
16171+
lateral_views: vec![],
16172+
prewhere: None,
16173+
selection: None,
16174+
group_by: GroupByExpr::Expressions(vec![], vec![]),
16175+
cluster_by: vec![],
16176+
distribute_by: vec![],
16177+
sort_by: vec![],
16178+
having: None,
16179+
named_window: vec![],
16180+
window_before_qualify: false,
16181+
qualify: None,
16182+
value_table_mode: None,
16183+
connect_by: vec![],
16184+
flavor: SelectFlavor::FromFirst,
16185+
}))),
16186+
order_by: None,
16187+
limit_clause: None,
16188+
fetch: None,
16189+
locks: vec![],
16190+
for_clause: None,
16191+
settings: None,
16192+
format_clause: None,
16193+
pipe_operators: vec![],
16194+
};
16195+
assert_eq!(expected, ast);
16196+
assert_eq!(ast.to_string(), q);
16197+
}
16198+
1607616199
#[test]
1607716200
fn test_geometric_unary_operators() {
1607816201
// Number of points in path or polygon

0 commit comments

Comments
 (0)