You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by al...@apache.org on 2025/02/04 20:43:55 UTC

(datafusion) branch main updated: DFParser should skip unsupported COPY INTO (#14382)

This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 80cf58c52f DFParser should skip unsupported COPY INTO (#14382)
80cf58c52f is described below

commit 80cf58c52f985e072f3b70e6adcb2697d9470283
Author: Artem Osipov <59...@users.noreply.github.com>
AuthorDate: Tue Feb 4 23:43:51 2025 +0300

    DFParser should skip unsupported COPY INTO (#14382)
    
    * DFParser should skip unsupported COPY INTO
    
    * Add tests
    
    * Add tests
    
    * Fix typo
    
    * Fix cargo fmt
---
 datafusion/sql/src/parser.rs | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/datafusion/sql/src/parser.rs b/datafusion/sql/src/parser.rs
index e836fa89bf..cc42ec1bf3 100644
--- a/datafusion/sql/src/parser.rs
+++ b/datafusion/sql/src/parser.rs
@@ -354,6 +354,14 @@ impl<'a> DFParser<'a> {
                         self.parse_create()
                     }
                     Keyword::COPY => {
+                        if let Token::Word(w) = self.parser.peek_nth_token(1).token {
+                            // use native parser for COPY INTO
+                            if w.keyword == Keyword::INTO {
+                                return Ok(Statement::Statement(Box::from(
+                                    self.parser.parse_statement()?,
+                                )));
+                            }
+                        }
                         self.parser.next_token(); // COPY
                         self.parse_copy()
                     }
@@ -877,6 +885,7 @@ mod tests {
     use super::*;
     use sqlparser::ast::Expr::Identifier;
     use sqlparser::ast::{BinaryOperator, DataType, Expr, Ident};
+    use sqlparser::dialect::SnowflakeDialect;
     use sqlparser::tokenizer::Span;
 
     fn expect_parse_ok(sql: &str, expected: Statement) -> Result<(), ParserError> {
@@ -1403,6 +1412,23 @@ mod tests {
         Ok(())
     }
 
+    #[test]
+    fn skip_copy_into_snowflake() -> Result<(), ParserError> {
+        let sql = "COPY INTO foo FROM @~/staged FILE_FORMAT = (FORMAT_NAME = 'mycsv');";
+        let dialect = Box::new(SnowflakeDialect);
+        let statements = DFParser::parse_sql_with_dialect(sql, dialect.as_ref())?;
+
+        assert_eq!(
+            statements.len(),
+            1,
+            "Expected to parse exactly one statement"
+        );
+        if let Statement::CopyTo(_) = &statements[0] {
+            panic!("Expected non COPY TO statement, but was successful: {statements:?}");
+        }
+        Ok(())
+    }
+
     #[test]
     fn explain_copy_to_table_to_table() -> Result<(), ParserError> {
         let cases = vec![


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org