Skip to content

Commit

Permalink
Fix parse COPY INTO stage names without parens for SnowFlake (#1187)
Browse files Browse the repository at this point in the history
Signed-off-by: Maciej Obuchowski <[email protected]>
  • Loading branch information
mobuchowski authored Apr 7, 2024
1 parent 20c5754 commit 17ef71e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/dialect/snowflake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result<Ident, ParserE
parser.prev_token();
break;
}
Token::RParen => {
parser.prev_token();
break;
}
Token::AtSign => ident.push('@'),
Token::Tilde => ident.push('~'),
Token::Mod => ident.push('%'),
Expand Down Expand Up @@ -219,7 +223,7 @@ pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
}
_ => {
parser.prev_token();
from_stage = parser.parse_object_name(false)?;
from_stage = parse_snowflake_stage_name(parser)?;
stage_params = parse_stage_params(parser)?;

// as
Expand Down
42 changes: 42 additions & 0 deletions tests/sqlparser_snowflake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1337,6 +1337,48 @@ fn test_snowflake_stage_object_names() {
}
}

#[test]
fn test_snowflake_copy_into() {
let sql = "COPY INTO a.b FROM @namespace.stage_name";
assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
match snowflake().verified_stmt(sql) {
Statement::CopyIntoSnowflake {
into, from_stage, ..
} => {
assert_eq!(into, ObjectName(vec![Ident::new("a"), Ident::new("b")]));
assert_eq!(
from_stage,
ObjectName(vec![Ident::new("@namespace"), Ident::new("stage_name")])
)
}
_ => unreachable!(),
}
}

#[test]
fn test_snowflake_copy_into_stage_name_ends_with_parens() {
let sql = "COPY INTO SCHEMA.SOME_MONITORING_SYSTEM FROM (SELECT t.$1:st AS st FROM @schema.general_finished)";
assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
match snowflake().verified_stmt(sql) {
Statement::CopyIntoSnowflake {
into, from_stage, ..
} => {
assert_eq!(
into,
ObjectName(vec![
Ident::new("SCHEMA"),
Ident::new("SOME_MONITORING_SYSTEM")
])
);
assert_eq!(
from_stage,
ObjectName(vec![Ident::new("@schema"), Ident::new("general_finished")])
)
}
_ => unreachable!(),
}
}

#[test]
fn test_snowflake_trim() {
let real_sql = r#"SELECT customer_id, TRIM(sub_items.value:item_price_id, '"', "a") AS item_price_id FROM models_staging.subscriptions"#;
Expand Down

0 comments on commit 17ef71e

Please sign in to comment.