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

iffyio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new c6983910 Add the alter table ON COMMIT option to Snowflake (#1606)
c6983910 is described below

commit c69839102ae4854cd5d50a799ab7fd48c8919eda
Author: Yoav Cohen <[email protected]>
AuthorDate: Tue Dec 17 08:39:59 2024 +0100

    Add the alter table ON COMMIT option to Snowflake (#1606)
---
 src/dialect/snowflake.rs     |  4 ++++
 src/parser/mod.rs            | 36 ++++++++++++++++++++----------------
 tests/sqlparser_snowflake.rs |  9 +++++++++
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs
index 77d2ccff..50e383db 100644
--- a/src/dialect/snowflake.rs
+++ b/src/dialect/snowflake.rs
@@ -377,6 +377,10 @@ pub fn parse_create_table(
                     parser.expect_token(&Token::RParen)?;
                     builder = builder.with_tags(Some(tags));
                 }
+                Keyword::ON if parser.parse_keyword(Keyword::COMMIT) => {
+                    let on_commit = 
Some(parser.parse_create_table_on_commit()?);
+                    builder = builder.on_commit(on_commit);
+                }
                 _ => {
                     return parser.expected("end of statement", next_token);
                 }
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 7d70460b..ca46bb60 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -6155,22 +6155,11 @@ impl<'a> Parser<'a> {
             None
         };
 
-        let on_commit: Option<OnCommit> =
-            if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, 
Keyword::DELETE, Keyword::ROWS])
-            {
-                Some(OnCommit::DeleteRows)
-            } else if self.parse_keywords(&[
-                Keyword::ON,
-                Keyword::COMMIT,
-                Keyword::PRESERVE,
-                Keyword::ROWS,
-            ]) {
-                Some(OnCommit::PreserveRows)
-            } else if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, 
Keyword::DROP]) {
-                Some(OnCommit::Drop)
-            } else {
-                None
-            };
+        let on_commit = if self.parse_keywords(&[Keyword::ON, 
Keyword::COMMIT]) {
+            Some(self.parse_create_table_on_commit()?)
+        } else {
+            None
+        };
 
         let strict = self.parse_keyword(Keyword::STRICT);
 
@@ -6226,6 +6215,21 @@ impl<'a> Parser<'a> {
             .build())
     }
 
+    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, 
ParserError> {
+        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
+            Ok(OnCommit::DeleteRows)
+        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
+            Ok(OnCommit::PreserveRows)
+        } else if self.parse_keywords(&[Keyword::DROP]) {
+            Ok(OnCommit::Drop)
+        } else {
+            parser_err!(
+                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
+                self.peek_token()
+            )
+        }
+    }
+
     /// Parse configuration like partitioning, clustering information during 
the table creation.
     ///
     /// 
[BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs
index adb8f813..9fe14783 100644
--- a/tests/sqlparser_snowflake.rs
+++ b/tests/sqlparser_snowflake.rs
@@ -355,6 +355,15 @@ fn test_snowflake_create_table_column_comment() {
     }
 }
 
+#[test]
+fn test_snowflake_create_table_on_commit() {
+    snowflake().verified_stmt(
+        r#"CREATE LOCAL TEMPORARY TABLE "AAA"."foo" ("bar" INTEGER) ON COMMIT 
PRESERVE ROWS"#,
+    );
+    snowflake().verified_stmt(r#"CREATE TABLE "AAA"."foo" ("bar" INTEGER) ON 
COMMIT DELETE ROWS"#);
+    snowflake().verified_stmt(r#"CREATE TABLE "AAA"."foo" ("bar" INTEGER) ON 
COMMIT DROP"#);
+}
+
 #[test]
 fn test_snowflake_create_local_table() {
     match snowflake().verified_stmt("CREATE TABLE my_table (a INT)") {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to