Skip to content

Commit 17ef71e

Browse files
authored
Fix parse COPY INTO stage names without parens for SnowFlake (apache#1187)
Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
1 parent 20c5754 commit 17ef71e

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/dialect/snowflake.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result<Ident, ParserE
155155
parser.prev_token();
156156
break;
157157
}
158+
Token::RParen => {
159+
parser.prev_token();
160+
break;
161+
}
158162
Token::AtSign => ident.push('@'),
159163
Token::Tilde => ident.push('~'),
160164
Token::Mod => ident.push('%'),
@@ -219,7 +223,7 @@ pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
219223
}
220224
_ => {
221225
parser.prev_token();
222-
from_stage = parser.parse_object_name(false)?;
226+
from_stage = parse_snowflake_stage_name(parser)?;
223227
stage_params = parse_stage_params(parser)?;
224228

225229
// as

tests/sqlparser_snowflake.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,48 @@ fn test_snowflake_stage_object_names() {
13371337
}
13381338
}
13391339

1340+
#[test]
1341+
fn test_snowflake_copy_into() {
1342+
let sql = "COPY INTO a.b FROM @namespace.stage_name";
1343+
assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
1344+
match snowflake().verified_stmt(sql) {
1345+
Statement::CopyIntoSnowflake {
1346+
into, from_stage, ..
1347+
} => {
1348+
assert_eq!(into, ObjectName(vec![Ident::new("a"), Ident::new("b")]));
1349+
assert_eq!(
1350+
from_stage,
1351+
ObjectName(vec![Ident::new("@namespace"), Ident::new("stage_name")])
1352+
)
1353+
}
1354+
_ => unreachable!(),
1355+
}
1356+
}
1357+
1358+
#[test]
1359+
fn test_snowflake_copy_into_stage_name_ends_with_parens() {
1360+
let sql = "COPY INTO SCHEMA.SOME_MONITORING_SYSTEM FROM (SELECT t.$1:st AS st FROM @schema.general_finished)";
1361+
assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
1362+
match snowflake().verified_stmt(sql) {
1363+
Statement::CopyIntoSnowflake {
1364+
into, from_stage, ..
1365+
} => {
1366+
assert_eq!(
1367+
into,
1368+
ObjectName(vec![
1369+
Ident::new("SCHEMA"),
1370+
Ident::new("SOME_MONITORING_SYSTEM")
1371+
])
1372+
);
1373+
assert_eq!(
1374+
from_stage,
1375+
ObjectName(vec![Ident::new("@schema"), Ident::new("general_finished")])
1376+
)
1377+
}
1378+
_ => unreachable!(),
1379+
}
1380+
}
1381+
13401382
#[test]
13411383
fn test_snowflake_trim() {
13421384
let real_sql = r#"SELECT customer_id, TRIM(sub_items.value:item_price_id, '"', "a") AS item_price_id FROM models_staging.subscriptions"#;

0 commit comments

Comments
 (0)