Skip to content

Commit 80cf58c

Browse files
authored
DFParser should skip unsupported COPY INTO (#14382)
* DFParser should skip unsupported COPY INTO * Add tests * Add tests * Fix typo * Fix cargo fmt
1 parent d8bc49f commit 80cf58c

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

datafusion/sql/src/parser.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ impl<'a> DFParser<'a> {
354354
self.parse_create()
355355
}
356356
Keyword::COPY => {
357+
if let Token::Word(w) = self.parser.peek_nth_token(1).token {
358+
// use native parser for COPY INTO
359+
if w.keyword == Keyword::INTO {
360+
return Ok(Statement::Statement(Box::from(
361+
self.parser.parse_statement()?,
362+
)));
363+
}
364+
}
357365
self.parser.next_token(); // COPY
358366
self.parse_copy()
359367
}
@@ -877,6 +885,7 @@ mod tests {
877885
use super::*;
878886
use sqlparser::ast::Expr::Identifier;
879887
use sqlparser::ast::{BinaryOperator, DataType, Expr, Ident};
888+
use sqlparser::dialect::SnowflakeDialect;
880889
use sqlparser::tokenizer::Span;
881890

882891
fn expect_parse_ok(sql: &str, expected: Statement) -> Result<(), ParserError> {
@@ -1403,6 +1412,23 @@ mod tests {
14031412
Ok(())
14041413
}
14051414

1415+
#[test]
1416+
fn skip_copy_into_snowflake() -> Result<(), ParserError> {
1417+
let sql = "COPY INTO foo FROM @~/staged FILE_FORMAT = (FORMAT_NAME = 'mycsv');";
1418+
let dialect = Box::new(SnowflakeDialect);
1419+
let statements = DFParser::parse_sql_with_dialect(sql, dialect.as_ref())?;
1420+
1421+
assert_eq!(
1422+
statements.len(),
1423+
1,
1424+
"Expected to parse exactly one statement"
1425+
);
1426+
if let Statement::CopyTo(_) = &statements[0] {
1427+
panic!("Expected non COPY TO statement, but was successful: {statements:?}");
1428+
}
1429+
Ok(())
1430+
}
1431+
14061432
#[test]
14071433
fn explain_copy_to_table_to_table() -> Result<(), ParserError> {
14081434
let cases = vec![

0 commit comments

Comments
 (0)