diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs index 8ffaf5944c..1d9d983e53 100644 --- a/src/dialect/snowflake.rs +++ b/src/dialect/snowflake.rs @@ -155,6 +155,10 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result { + 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 { } _ => { parser.prev_token(); - from_stage = parser.parse_object_name(false)?; + from_stage = parse_snowflake_stage_name(parser)?; stage_params = parse_stage_params(parser)?; // as diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index 65755f685a..49b440506d 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -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"#;