Skip to content

Commit 2555f71

Browse files
fix: allow snowflake to accept values without parens (#1249)
1 parent a14faa3 commit 2555f71

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

src/parser/mod.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8422,6 +8422,29 @@ impl<'a> Parser<'a> {
84228422
// appearing alone in parentheses (e.g. `FROM (mytable)`)
84238423
self.expected("joined table", self.peek_token())
84248424
}
8425+
} else if dialect_of!(self is SnowflakeDialect | DatabricksDialect | GenericDialect)
8426+
&& self.parse_keyword(Keyword::VALUES)
8427+
{
8428+
// Snowflake and Databricks allow syntax like below:
8429+
// SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
8430+
// where there are no parentheses around the VALUES clause.
8431+
let values = SetExpr::Values(self.parse_values(false)?);
8432+
let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
8433+
Ok(TableFactor::Derived {
8434+
lateral: false,
8435+
subquery: Box::new(Query {
8436+
with: None,
8437+
body: Box::new(values),
8438+
order_by: vec![],
8439+
limit: None,
8440+
limit_by: vec![],
8441+
offset: None,
8442+
fetch: None,
8443+
locks: vec![],
8444+
for_clause: None,
8445+
}),
8446+
alias,
8447+
})
84258448
} else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
84268449
&& self.parse_keyword(Keyword::UNNEST)
84278450
{

tests/sqlparser_common.rs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ use sqlparser::ast::SelectItem::UnnamedExpr;
2525
use sqlparser::ast::TableFactor::{Pivot, Unpivot};
2626
use sqlparser::ast::*;
2727
use sqlparser::dialect::{
28-
AnsiDialect, BigQueryDialect, ClickHouseDialect, Dialect, DuckDbDialect, GenericDialect,
29-
HiveDialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect, SQLiteDialect,
30-
SnowflakeDialect,
28+
AnsiDialect, BigQueryDialect, ClickHouseDialect, DatabricksDialect, Dialect, DuckDbDialect,
29+
GenericDialect, HiveDialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect,
30+
SQLiteDialect, SnowflakeDialect,
3131
};
3232
use sqlparser::keywords::ALL_KEYWORDS;
3333
use sqlparser::parser::{Parser, ParserError, ParserOptions};
@@ -9728,3 +9728,52 @@ fn parse_within_group() {
97289728
"OVER (PARTITION BY department)",
97299729
));
97309730
}
9731+
9732+
#[test]
9733+
fn tests_select_values_without_parens() {
9734+
let dialects = TestedDialects {
9735+
dialects: vec![
9736+
Box::new(GenericDialect {}),
9737+
Box::new(SnowflakeDialect {}),
9738+
Box::new(DatabricksDialect {}),
9739+
],
9740+
options: None,
9741+
};
9742+
let sql = "SELECT * FROM VALUES (1, 2), (2,3) AS tbl (id, val)";
9743+
let canonical = "SELECT * FROM (VALUES (1, 2), (2, 3)) AS tbl (id, val)";
9744+
dialects.verified_only_select_with_canonical(sql, canonical);
9745+
}
9746+
9747+
#[test]
9748+
fn tests_select_values_without_parens_and_set_op() {
9749+
let dialects = TestedDialects {
9750+
dialects: vec![
9751+
Box::new(GenericDialect {}),
9752+
Box::new(SnowflakeDialect {}),
9753+
Box::new(DatabricksDialect {}),
9754+
],
9755+
options: None,
9756+
};
9757+
let sql = "SELECT id + 1, name FROM VALUES (1, 'Apple'), (2, 'Banana'), (3, 'Orange') AS fruits (id, name) UNION ALL SELECT 5, 'Strawberry'";
9758+
let canonical = "SELECT id + 1, name FROM (VALUES (1, 'Apple'), (2, 'Banana'), (3, 'Orange')) AS fruits (id, name) UNION ALL SELECT 5, 'Strawberry'";
9759+
let query = dialects.verified_query_with_canonical(sql, canonical);
9760+
match *query.body {
9761+
SetExpr::SetOperation {
9762+
op,
9763+
set_quantifier: _,
9764+
left,
9765+
right,
9766+
} => {
9767+
assert_eq!(SetOperator::Union, op);
9768+
match *left {
9769+
SetExpr::Select(_) => {}
9770+
_ => panic!("Expected a SELECT statement"),
9771+
}
9772+
match *right {
9773+
SetExpr::Select(_) => {}
9774+
_ => panic!("Expected a SELECT statement"),
9775+
}
9776+
}
9777+
_ => panic!("Expected a SET OPERATION"),
9778+
}
9779+
}

0 commit comments

Comments
 (0)