Skip to content

Commit 09854d8

Browse files
committed
Feedback
1 parent 899c08b commit 09854d8

4 files changed

Lines changed: 42 additions & 116 deletions

File tree

src/dialect/hive.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,11 @@ impl Dialect for HiveDialect {
7272
fn supports_group_by_with_modifier(&self) -> bool {
7373
true
7474
}
75+
76+
// TODO: The parsing of the FROM keyword seems wrong, as it happens within the CTE.
77+
// See https://github.com/apache/datafusion-sqlparser-rs/issues/2236 for more details.
78+
/// See <https://hive.apache.org/docs/latest/language/common-table-expression/>
79+
fn supports_from_first_insert(&self) -> bool {
80+
true
81+
}
7582
}

src/dialect/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,21 @@ pub trait Dialect: Debug + Any {
648648
false
649649
}
650650

651+
/// Return true if the dialect supports "FROM-first" inserts.
652+
///
653+
/// Example:
654+
/// ```sql
655+
/// WITH cte AS (SELECT key FROM src)
656+
/// FROM cte
657+
/// INSERT OVERWRITE table my_table
658+
/// SELECT *
659+
///
660+
/// See <https://hive.apache.org/docs/latest/language/common-table-expression/>
661+
/// ```
662+
fn supports_from_first_insert(&self) -> bool {
663+
false
664+
}
665+
651666
/// Return true if the dialect supports pipe operator.
652667
///
653668
/// Example:

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 dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::FROM) {
13961+
if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
1396213962
cte.from = Some(self.parse_identifier()?);
1396313963
}
1396413964
Ok(cte)

tests/sqlparser_common.rs

Lines changed: 19 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -16069,7 +16069,6 @@ fn test_select_from_first() {
1606916069
pipe_operators: vec![],
1607016070
};
1607116071
assert_eq!(expected, ast);
16072-
assert_eq!(ast.to_string(), q);
1607316072
}
1607416073
}
1607516074

@@ -16080,120 +16079,25 @@ fn test_select_from_first_with_cte() {
1608016079

1608116080
let ast = dialects.verified_query(q);
1608216081

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);
16082+
let ast_select = ast.body.as_select().unwrap();
16083+
16084+
let expected_body_select_projection =
16085+
vec![SelectItem::UnnamedExpr(Expr::Value(ValueWithSpan {
16086+
value: test_utils::number("1"),
16087+
span: Span::empty(),
16088+
}))];
16089+
16090+
let expected_body_from = vec![TableWithJoins {
16091+
relation: table_from_name(ObjectName::from(vec![Ident {
16092+
value: "test".to_string(),
16093+
quote_style: None,
16094+
span: Span::empty(),
16095+
}])),
16096+
joins: vec![],
16097+
}];
16098+
16099+
assert_eq!(ast_select.projection, expected_body_select_projection);
16100+
assert_eq!(ast_select.from, expected_body_from);
1619716101
}
1619816102

1619916103
#[test]

0 commit comments

Comments
 (0)