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 f49c30fe Postgres: Support parenthesized `SET` options for `ALTER 
TABLE` (#1947)
f49c30fe is described below

commit f49c30feb6d5984f96cdc3a87dbf09b6b4b3ad04
Author: carl <[email protected]>
AuthorDate: Wed Jul 23 11:53:17 2025 -0400

    Postgres: Support parenthesized `SET` options for `ALTER TABLE` (#1947)
    
    Co-authored-by: Ifeanyi Ubah <[email protected]>
---
 src/ast/ddl.rs            | 13 +++++++++++++
 src/ast/spans.rs          |  3 +++
 src/parser/mod.rs         | 13 +++++++++----
 tests/sqlparser_common.rs | 28 ++++++++++++++++++++++++++++
 4 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs
index 51e05784..92936a6f 100644
--- a/src/ast/ddl.rs
+++ b/src/ast/ddl.rs
@@ -351,6 +351,16 @@ pub enum AlterTableOperation {
     ValidateConstraint {
         name: Ident,
     },
+    /// Arbitrary parenthesized `SET` options.
+    ///
+    /// Example:
+    /// ```sql
+    /// SET (scale_factor = 0.01, threshold = 500)`
+    /// ```
+    /// 
[PostgreSQL](https://www.postgresql.org/docs/current/sql-altertable.html)
+    SetOptionsParens {
+        options: Vec<SqlOption>,
+    },
 }
 
 /// An `ALTER Policy` (`Statement::AlterPolicy`) operation
@@ -791,6 +801,9 @@ impl fmt::Display for AlterTableOperation {
             AlterTableOperation::ValidateConstraint { name } => {
                 write!(f, "VALIDATE CONSTRAINT {name}")
             }
+            AlterTableOperation::SetOptionsParens { options } => {
+                write!(f, "SET ({})", display_comma_separated(options))
+            }
         }
     }
 }
diff --git a/src/ast/spans.rs b/src/ast/spans.rs
index 4deedca0..91523925 100644
--- a/src/ast/spans.rs
+++ b/src/ast/spans.rs
@@ -1202,6 +1202,9 @@ impl Spanned for AlterTableOperation {
             AlterTableOperation::Lock { .. } => Span::empty(),
             AlterTableOperation::ReplicaIdentity { .. } => Span::empty(),
             AlterTableOperation::ValidateConstraint { name } => name.span,
+            AlterTableOperation::SetOptionsParens { options } => {
+                union_spans(options.iter().map(|i| i.span()))
+            }
         }
     }
 }
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 5ac19d13..058423f1 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -9045,17 +9045,22 @@ impl<'a> Parser<'a> {
             let name = self.parse_identifier()?;
             AlterTableOperation::ValidateConstraint { name }
         } else {
-            let options: Vec<SqlOption> =
+            let mut options =
                 self.parse_options_with_keywords(&[Keyword::SET, 
Keyword::TBLPROPERTIES])?;
             if !options.is_empty() {
                 AlterTableOperation::SetTblProperties {
                     table_properties: options,
                 }
             } else {
-                return self.expected(
-                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, or 
SET TBLPROPERTIES after ALTER TABLE",
+                options = self.parse_options(Keyword::SET)?;
+                if !options.is_empty() {
+                    AlterTableOperation::SetOptionsParens { options }
+                } else {
+                    return self.expected(
+                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, 
SET, or SET TBLPROPERTIES after ALTER TABLE",
                     self.peek_token(),
-                );
+                  );
+                }
             }
         };
         Ok(operation)
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index 5ae12ff4..074d9eab 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -4728,6 +4728,34 @@ fn parse_alter_table() {
         }
         _ => unreachable!(),
     }
+
+    let set_storage_parameters = "ALTER TABLE tab SET 
(autovacuum_vacuum_scale_factor = 0.01, autovacuum_vacuum_threshold = 500)";
+    match alter_table_op(verified_stmt(set_storage_parameters)) {
+        AlterTableOperation::SetOptionsParens { options } => {
+            assert_eq!(
+                options,
+                [
+                    SqlOption::KeyValue {
+                        key: Ident {
+                            value: 
"autovacuum_vacuum_scale_factor".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        },
+                        value: 
Expr::Value(test_utils::number("0.01").with_empty_span()),
+                    },
+                    SqlOption::KeyValue {
+                        key: Ident {
+                            value: "autovacuum_vacuum_threshold".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        },
+                        value: 
Expr::Value(test_utils::number("500").with_empty_span()),
+                    }
+                ],
+            );
+        }
+        _ => unreachable!(),
+    }
 }
 
 #[test]


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

Reply via email to