Skip to content

Commit 65317ed

Browse files
Support Snowflake - allow number as placeholder (e.g. :1) (apache#1001)
1 parent 7993384 commit 65317ed

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/parser/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4759,7 +4759,14 @@ impl<'a> Parser<'a> {
47594759
Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
47604760
Token::Placeholder(ref s) => Ok(Value::Placeholder(s.to_string())),
47614761
tok @ Token::Colon | tok @ Token::AtSign => {
4762-
let ident = self.parse_identifier()?;
4762+
// Not calling self.parse_identifier()? because only in placeholder we want to check numbers as idfentifies
4763+
// This because snowflake allows numbers as placeholders
4764+
let next_token = self.next_token();
4765+
let ident = match next_token.token {
4766+
Token::Word(w) => Ok(w.to_ident()),
4767+
Token::Number(w, false) => Ok(Ident::new(w)),
4768+
_ => self.expected("placeholder", next_token),
4769+
}?;
47634770
let placeholder = tok.to_string() + &ident.value;
47644771
Ok(Value::Placeholder(placeholder))
47654772
}

tests/sqlparser_snowflake.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,20 @@ fn test_snowflake_trim() {
10791079
);
10801080
}
10811081

1082+
#[test]
1083+
fn test_number_placeholder() {
1084+
let sql_only_select = "SELECT :1";
1085+
let select = snowflake().verified_only_select(sql_only_select);
1086+
assert_eq!(
1087+
&Expr::Value(Value::Placeholder(":1".into())),
1088+
expr_from_projection(only(&select.projection))
1089+
);
1090+
1091+
snowflake()
1092+
.parse_sql_statements("alter role 1 with name = 'foo'")
1093+
.expect_err("should have failed");
1094+
}
1095+
10821096
#[test]
10831097
fn parse_position_not_function_columns() {
10841098
snowflake_and_generic()

0 commit comments

Comments
 (0)