@@ -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