diff --git a/Cargo.lock b/Cargo.lock index a39884795ed6..f26e87beff58 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5884,7 +5884,7 @@ dependencies = [ [[package]] name = "sqlparser" version = "0.55.0" -source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=12655c2be19d4796236154f8826e23f84d2978b0#12655c2be19d4796236154f8826e23f84d2978b0" +source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=4a91f2fd6af1b6d413621949e724c55c34f8a29b#4a91f2fd6af1b6d413621949e724c55c34f8a29b" dependencies = [ "log", "recursive", @@ -5894,7 +5894,7 @@ dependencies = [ [[package]] name = "sqlparser_derive" version = "0.3.0" -source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=12655c2be19d4796236154f8826e23f84d2978b0#12655c2be19d4796236154f8826e23f84d2978b0" +source = "git+https://github.com/Embucket/datafusion-sqlparser-rs.git?rev=4a91f2fd6af1b6d413621949e724c55c34f8a29b#4a91f2fd6af1b6d413621949e724c55c34f8a29b" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index c4880b9b0cca..f559f0d171af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -164,7 +164,7 @@ recursive = "0.1.1" regex = "1.8" rstest = "0.24.0" serde_json = "1" -sqlparser = { git = "https://github.com/Embucket/datafusion-sqlparser-rs.git", rev = "12655c2be19d4796236154f8826e23f84d2978b0", features = [ +sqlparser = { git = "https://github.com/Embucket/datafusion-sqlparser-rs.git", rev = "4a91f2fd6af1b6d413621949e724c55c34f8a29b", features = [ "visitor", ] } tempfile = "3" diff --git a/datafusion/sql/src/parser.rs b/datafusion/sql/src/parser.rs index 3b204731b10f..108b8edfd87b 100644 --- a/datafusion/sql/src/parser.rs +++ b/datafusion/sql/src/parser.rs @@ -470,6 +470,12 @@ impl<'a> DFParser<'a> { Token::Word(w) => { match w.keyword { Keyword::CREATE => { + if let Token::Word(w) = self.parser.peek_nth_token(2).token { + // use native parser for CREATE EXTERNAL VOLUME + if w.keyword == Keyword::VOLUME { + return self.parse_and_handle_statement(); + } + } self.parser.next_token(); // CREATE self.parse_create() } @@ -1595,6 +1601,24 @@ mod tests { Ok(()) } + #[test] + fn skip_external_volume() -> Result<(), DataFusionError> { + let sql = "CREATE OR REPLACE EXTERNAL VOLUME exvol STORAGE_LOCATIONS = + ((NAME = 's3' STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my-example-bucket/' ))"; + 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::CreateExternalTable(_) = &statements[0] { + panic!("Expected non CREATE EXTERNAL TABLE statement, but was successful: {statements:?}"); + } + Ok(()) + } + #[test] fn explain_copy_to_table_to_table() -> Result<(), DataFusionError> { let cases = vec![