Skip to content

Commit 7672498

Browse files
committed
Negative test for Snowflake
1 parent 6a6fe12 commit 7672498

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

src/dialect/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub use self::postgresql::PostgreSqlDialect;
4949
pub use self::redshift::RedshiftSqlDialect;
5050
pub use self::snowflake::SnowflakeDialect;
5151
pub use self::sqlite::SQLiteDialect;
52-
use crate::ast::{ColumnOption, Expr, GranteesType, Ident, Statement};
52+
use crate::ast::{ColumnOption, Expr, GranteesType, Ident, ObjectNamePart, Statement};
5353
pub use crate::keywords;
5454
use crate::keywords::Keyword;
5555
use crate::parser::{Parser, ParserError};
@@ -1082,7 +1082,11 @@ pub trait Dialect: Debug + Any {
10821082
/// programmatically.
10831083
///
10841084
/// - [Snowflake](https://docs.snowflake.com/en/sql-reference/identifier-literal)
1085-
fn is_identifier_generating_function_name(&self, _ident: &Ident) -> bool {
1085+
fn is_identifier_generating_function_name(
1086+
&self,
1087+
_ident: &Ident,
1088+
_name_parts: &[ObjectNamePart],
1089+
) -> bool {
10861090
false
10871091
}
10881092
}

src/dialect/snowflake.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ use crate::ast::helpers::stmt_data_loading::{
2525
use crate::ast::{
2626
ColumnOption, ColumnPolicy, ColumnPolicyProperty, CopyIntoSnowflakeKind, Ident,
2727
IdentityParameters, IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind,
28-
IdentityPropertyOrder, ObjectName, RowAccessPolicy, ShowObjects, SqlOption, Statement,
29-
TagsColumnOption, WrappedCollection,
28+
IdentityPropertyOrder, ObjectName, ObjectNamePart, RowAccessPolicy, ShowObjects, SqlOption,
29+
Statement, TagsColumnOption, WrappedCollection,
3030
};
3131
use crate::dialect::{Dialect, Precedence};
3232
use crate::keywords::Keyword;
@@ -368,8 +368,16 @@ impl Dialect for SnowflakeDialect {
368368
true
369369
}
370370

371-
fn is_identifier_generating_function_name(&self, ident: &Ident) -> bool {
372-
ident.quote_style.is_none() && ident.value.to_lowercase() == "identifier"
371+
fn is_identifier_generating_function_name(
372+
&self,
373+
ident: &Ident,
374+
name_parts: &[ObjectNamePart],
375+
) -> bool {
376+
ident.quote_style.is_none()
377+
&& ident.value.to_lowercase() == "identifier"
378+
&& !name_parts
379+
.iter()
380+
.any(|p| matches!(p, ObjectNamePart::Function(_)))
373381
}
374382

375383
// For example: `SELECT IDENTIFIER('alias1').* FROM tbl AS alias1`

src/parser/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10409,7 +10409,10 @@ impl<'a> Parser<'a> {
1040910409
parts.push(ObjectNamePart::Identifier(Ident::new("")));
1041010410
} else {
1041110411
let ident = self.parse_identifier()?;
10412-
let part = if self.dialect.is_identifier_generating_function_name(&ident) {
10412+
let part = if self
10413+
.dialect
10414+
.is_identifier_generating_function_name(&ident, &parts)
10415+
{
1041310416
self.expect_token(&Token::LParen)?;
1041410417
let args: Vec<FunctionArg> =
1041510418
self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;

tests/sqlparser_snowflake.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4350,4 +4350,20 @@ fn test_snowflake_identifier_function() {
43504350
}
43514351
_ => unreachable!(),
43524352
}
4353+
4354+
// Cannot have more than one IDENTIFIER part in an object name
4355+
assert_eq!(
4356+
snowflake()
4357+
.parse_sql_statements(
4358+
"CREATE TABLE IDENTIFIER('db1').IDENTIFIER('sc1').IDENTIFIER('tbl') (id INT)"
4359+
)
4360+
.is_err(),
4361+
true
4362+
);
4363+
assert_eq!(
4364+
snowflake()
4365+
.parse_sql_statements("CREATE TABLE IDENTIFIER('db1')..IDENTIFIER('tbl') (id INT)")
4366+
.is_err(),
4367+
true
4368+
);
43534369
}

0 commit comments

Comments
 (0)