mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-07-07 17:04:59 +00:00
Support snowflake double dot notation for object name (#1540)
This commit is contained in:
parent
96f7c0277a
commit
f4f112d7d6
4 changed files with 57 additions and 0 deletions
|
@ -365,6 +365,16 @@ pub trait Dialect: Debug + Any {
|
||||||
self.supports_trailing_commas()
|
self.supports_trailing_commas()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the dialect supports double dot notation for object names
|
||||||
|
///
|
||||||
|
/// Example
|
||||||
|
/// ```sql
|
||||||
|
/// SELECT * FROM db_name..table_name
|
||||||
|
/// ```
|
||||||
|
fn supports_object_name_double_dot_notation(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Dialect-specific infix parser override
|
/// Dialect-specific infix parser override
|
||||||
///
|
///
|
||||||
/// This method is called to parse the next infix expression.
|
/// This method is called to parse the next infix expression.
|
||||||
|
|
|
@ -54,6 +54,14 @@ impl Dialect for SnowflakeDialect {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Snowflake supports double-dot notation when the schema name is not specified
|
||||||
|
// In this case the default PUBLIC schema is used
|
||||||
|
//
|
||||||
|
// see https://docs.snowflake.com/en/sql-reference/name-resolution#resolution-when-schema-omitted-double-dot-notation
|
||||||
|
fn supports_object_name_double_dot_notation(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
fn is_identifier_part(&self, ch: char) -> bool {
|
fn is_identifier_part(&self, ch: char) -> bool {
|
||||||
ch.is_ascii_lowercase()
|
ch.is_ascii_lowercase()
|
||||||
|| ch.is_ascii_uppercase()
|
|| ch.is_ascii_uppercase()
|
||||||
|
|
|
@ -8457,6 +8457,13 @@ impl<'a> Parser<'a> {
|
||||||
pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
|
pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
|
||||||
let mut idents = vec![];
|
let mut idents = vec![];
|
||||||
loop {
|
loop {
|
||||||
|
if self.dialect.supports_object_name_double_dot_notation()
|
||||||
|
&& idents.len() == 1
|
||||||
|
&& self.consume_token(&Token::Period)
|
||||||
|
{
|
||||||
|
// Empty string here means default schema
|
||||||
|
idents.push(Ident::new(""));
|
||||||
|
}
|
||||||
idents.push(self.parse_identifier(in_table_clause)?);
|
idents.push(self.parse_identifier(in_table_clause)?);
|
||||||
if !self.consume_token(&Token::Period) {
|
if !self.consume_token(&Token::Period) {
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2866,3 +2866,35 @@ fn test_projection_with_nested_trailing_commas() {
|
||||||
let sql = "SELECT a, b, FROM c, (SELECT d, e, FROM f, LATERAL FLATTEN(input => events))";
|
let sql = "SELECT a, b, FROM c, (SELECT d, e, FROM f, LATERAL FLATTEN(input => events))";
|
||||||
let _ = snowflake().parse_sql_statements(sql).unwrap();
|
let _ = snowflake().parse_sql_statements(sql).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sf_double_dot_notation() {
|
||||||
|
snowflake().verified_stmt("SELECT * FROM db_name..table_name");
|
||||||
|
snowflake().verified_stmt("SELECT * FROM x, y..z JOIN a..b AS b ON x.id = b.id");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
snowflake()
|
||||||
|
.parse_sql_statements("SELECT * FROM X.Y..")
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
"sql parser error: Expected: identifier, found: ."
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
snowflake()
|
||||||
|
.parse_sql_statements("SELECT * FROM X..Y..Z")
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
"sql parser error: Expected: identifier, found: ."
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
// Ensure we don't parse leading token
|
||||||
|
snowflake()
|
||||||
|
.parse_sql_statements("SELECT * FROM .X.Y")
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
"sql parser error: Expected: identifier, found: ."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_double_dot_notation_wrong_position() {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue