Fix parse COPY INTO stage names without parens for SnowFlake (#1187)

Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
This commit is contained in:
Maciej Obuchowski 2024-04-07 14:45:59 +02:00 committed by GitHub
parent 20c5754784
commit 17ef71e42b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 47 additions and 1 deletions

View file

@ -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('%'),
@ -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

View file

@ -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"#;