Skip to content

Commit 4ede0f0

Browse files
committed
Add support for + char in Snowflake stage names
1 parent 93450cc commit 4ede0f0

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/dialect/snowflake.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result<Ident, ParserE
718718
Token::Tilde => ident.push('~'),
719719
Token::Mod => ident.push('%'),
720720
Token::Div => ident.push('/'),
721+
Token::Plus => ident.push('+'),
721722
Token::Word(w) => ident.push_str(&w.to_string()),
722723
_ => return parser.expected("stage name identifier", parser.peek_token()),
723724
}

tests/sqlparser_snowflake.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2581,6 +2581,26 @@ fn test_snowflake_copy_into() {
25812581
}
25822582
_ => unreachable!(),
25832583
}
2584+
2585+
// Test for non-ident characters in stage names
2586+
let sql = "COPY INTO a.b FROM @namespace.stage_name/x@x~x%x+";
2587+
assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
2588+
match snowflake().verified_stmt(sql) {
2589+
Statement::CopyIntoSnowflake { into, from_obj, .. } => {
2590+
assert_eq!(
2591+
into,
2592+
ObjectName::from(vec![Ident::new("a"), Ident::new("b")])
2593+
);
2594+
assert_eq!(
2595+
from_obj,
2596+
Some(ObjectName::from(vec![
2597+
Ident::new("@namespace"),
2598+
Ident::new("stage_name/x@x~x%x+")
2599+
]))
2600+
)
2601+
}
2602+
_ => unreachable!(),
2603+
}
25842604
}
25852605

25862606
#[test]
@@ -4231,4 +4251,4 @@ fn test_snowflake_create_view_with_composite_policy_name() {
42314251
let create_view_with_tag =
42324252
r#"CREATE VIEW X (COL WITH MASKING POLICY foo.bar.baz) AS SELECT * FROM Y"#;
42334253
snowflake().verified_stmt(create_view_with_tag);
4234-
}
4254+
}

0 commit comments

Comments
 (0)