Skip to content

Commit

Permalink
Support Snowflake - allow number as placeholder (e.g. :1) (apache#1001
Browse files Browse the repository at this point in the history
)
  • Loading branch information
yuval-illumex authored and serprex committed Nov 6, 2023
1 parent fea3960 commit a71b258
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4802,7 +4802,14 @@ impl<'a> Parser<'a> {
Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
Token::Placeholder(ref s) => Ok(Value::Placeholder(s.to_string())),
tok @ Token::Colon | tok @ Token::AtSign => {
let ident = self.parse_identifier()?;
// Not calling self.parse_identifier()? because only in placeholder we want to check numbers as idfentifies
// This because snowflake allows numbers as placeholders
let next_token = self.next_token();
let ident = match next_token.token {
Token::Word(w) => Ok(w.to_ident()),
Token::Number(w, false) => Ok(Ident::new(w)),
_ => self.expected("placeholder", next_token),
}?;
let placeholder = tok.to_string() + &ident.value;
Ok(Value::Placeholder(placeholder))
}
Expand Down
14 changes: 14 additions & 0 deletions tests/sqlparser_snowflake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,20 @@ fn test_snowflake_trim() {
);
}

#[test]
fn test_number_placeholder() {
let sql_only_select = "SELECT :1";
let select = snowflake().verified_only_select(sql_only_select);
assert_eq!(
&Expr::Value(Value::Placeholder(":1".into())),
expr_from_projection(only(&select.projection))
);

snowflake()
.parse_sql_statements("alter role 1 with name = 'foo'")
.expect_err("should have failed");
}

#[test]
fn parse_position_not_function_columns() {
snowflake_and_generic()
Expand Down

0 comments on commit a71b258

Please sign in to comment.