mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-11 06:22:04 +00:00
Databricks: support SELECT * EXCEPT (#1261)
This commit is contained in:
parent
49d178477e
commit
5ed13b5af3
8 changed files with 63 additions and 34 deletions
|
@ -54,4 +54,9 @@ impl Dialect for BigQueryDialect {
|
||||||
fn supports_parenthesized_set_variables(&self) -> bool {
|
fn supports_parenthesized_set_variables(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select_except
|
||||||
|
fn supports_select_wildcard_except(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,4 +29,8 @@ impl Dialect for ClickHouseDialect {
|
||||||
fn supports_string_literal_backslash_escape(&self) -> bool {
|
fn supports_string_literal_backslash_escape(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn supports_select_wildcard_except(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,4 +33,9 @@ impl Dialect for DatabricksDialect {
|
||||||
fn supports_lambda_functions(&self) -> bool {
|
fn supports_lambda_functions(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-qry-select.html#syntax
|
||||||
|
fn supports_select_wildcard_except(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,4 +66,8 @@ impl Dialect for GenericDialect {
|
||||||
fn supports_parenthesized_set_variables(&self) -> bool {
|
fn supports_parenthesized_set_variables(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn supports_select_wildcard_except(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,6 +226,16 @@ pub trait Dialect: Debug + Any {
|
||||||
fn supports_parenthesized_set_variables(&self) -> bool {
|
fn supports_parenthesized_set_variables(&self) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
/// Returns true if the dialect supports an `EXCEPT` clause following a
|
||||||
|
/// wildcard in a select list.
|
||||||
|
///
|
||||||
|
/// For example
|
||||||
|
/// ```sql
|
||||||
|
/// SELECT * EXCEPT order_id FROM orders;
|
||||||
|
/// ```
|
||||||
|
fn supports_select_wildcard_except(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
/// Returns true if the dialect has a CONVERT function which accepts a type first
|
/// Returns true if the dialect has a CONVERT function which accepts a type first
|
||||||
/// and an expression second, e.g. `CONVERT(varchar, 1)`
|
/// and an expression second, e.g. `CONVERT(varchar, 1)`
|
||||||
fn convert_type_before_value(&self) -> bool {
|
fn convert_type_before_value(&self) -> bool {
|
||||||
|
|
|
@ -9704,8 +9704,7 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
let opt_except = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
|
let opt_except = if self.dialect.supports_select_wildcard_except() {
|
||||||
{
|
|
||||||
self.parse_optional_select_item_except()?
|
self.parse_optional_select_item_except()?
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
@ -1838,38 +1838,6 @@ fn parse_array_agg_func() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_select_wildcard_with_except() {
|
|
||||||
let select = bigquery_and_generic().verified_only_select("SELECT * EXCEPT (col_a) FROM data");
|
|
||||||
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
|
|
||||||
opt_except: Some(ExceptSelectItem {
|
|
||||||
first_element: Ident::new("col_a"),
|
|
||||||
additional_elements: vec![],
|
|
||||||
}),
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
assert_eq!(expected, select.projection[0]);
|
|
||||||
|
|
||||||
let select = bigquery_and_generic()
|
|
||||||
.verified_only_select("SELECT * EXCEPT (department_id, employee_id) FROM employee_table");
|
|
||||||
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
|
|
||||||
opt_except: Some(ExceptSelectItem {
|
|
||||||
first_element: Ident::new("department_id"),
|
|
||||||
additional_elements: vec![Ident::new("employee_id")],
|
|
||||||
}),
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
assert_eq!(expected, select.projection[0]);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
bigquery_and_generic()
|
|
||||||
.parse_sql_statements("SELECT * EXCEPT () FROM employee_table")
|
|
||||||
.unwrap_err()
|
|
||||||
.to_string(),
|
|
||||||
"sql parser error: Expected identifier, found: )"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_big_query_declare() {
|
fn parse_big_query_declare() {
|
||||||
for (sql, expected_names, expected_data_type, expected_assigned_expr) in [
|
for (sql, expected_names, expected_data_type, expected_assigned_expr) in [
|
||||||
|
|
|
@ -9854,3 +9854,37 @@ fn tests_select_values_without_parens_and_set_op() {
|
||||||
_ => panic!("Expected a SET OPERATION"),
|
_ => panic!("Expected a SET OPERATION"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_select_wildcard_with_except() {
|
||||||
|
let dialects = all_dialects_where(|d| d.supports_select_wildcard_except());
|
||||||
|
|
||||||
|
let select = dialects.verified_only_select("SELECT * EXCEPT (col_a) FROM data");
|
||||||
|
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
|
||||||
|
opt_except: Some(ExceptSelectItem {
|
||||||
|
first_element: Ident::new("col_a"),
|
||||||
|
additional_elements: vec![],
|
||||||
|
}),
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
assert_eq!(expected, select.projection[0]);
|
||||||
|
|
||||||
|
let select = dialects
|
||||||
|
.verified_only_select("SELECT * EXCEPT (department_id, employee_id) FROM employee_table");
|
||||||
|
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
|
||||||
|
opt_except: Some(ExceptSelectItem {
|
||||||
|
first_element: Ident::new("department_id"),
|
||||||
|
additional_elements: vec![Ident::new("employee_id")],
|
||||||
|
}),
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
assert_eq!(expected, select.projection[0]);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
dialects
|
||||||
|
.parse_sql_statements("SELECT * EXCEPT () FROM employee_table")
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
"sql parser error: Expected identifier, found: )"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue