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]