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 6c38cdca Snowflake: Add support for future grants (#1906)
6c38cdca is described below

commit 6c38cdcadb45ff5b343ea49bad23fdfeebc92cf5
Author: Yoav Cohen <59807311+yoavcl...@users.noreply.github.com>
AuthorDate: Fri Jun 27 21:21:38 2025 +0200

    Snowflake: Add support for future grants (#1906)
---
 src/ast/mod.rs            | 27 +++++++++++++++++++++++++++
 src/keywords.rs           |  1 +
 src/parser/mod.rs         | 27 +++++++++++++++++++++++++++
 tests/sqlparser_common.rs |  4 +++-
 4 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/src/ast/mod.rs b/src/ast/mod.rs
index 0f682062..19966d21 100644
--- a/src/ast/mod.rs
+++ b/src/ast/mod.rs
@@ -6920,6 +6920,12 @@ pub enum GrantObjects {
     AllSequencesInSchema { schemas: Vec<ObjectName> },
     /// Grant privileges on `ALL TABLES IN SCHEMA <schema_name> [, ...]`
     AllTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE SCHEMAS IN DATABASE <database_name> [, 
...]`
+    FutureSchemasInDatabase { databases: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE TABLES IN SCHEMA <schema_name> [, ...]`
+    FutureTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE VIEWS IN SCHEMA <schema_name> [, ...]`
+    FutureViewsInSchema { schemas: Vec<ObjectName> },
     /// Grant privileges on specific databases
     Databases(Vec<ObjectName>),
     /// Grant privileges on specific schemas
@@ -6988,6 +6994,27 @@ impl fmt::Display for GrantObjects {
                     display_comma_separated(schemas)
                 )
             }
+            GrantObjects::FutureSchemasInDatabase { databases } => {
+                write!(
+                    f,
+                    "FUTURE SCHEMAS IN DATABASE {}",
+                    display_comma_separated(databases)
+                )
+            }
+            GrantObjects::FutureTablesInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE TABLES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::FutureViewsInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE VIEWS IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
             GrantObjects::ResourceMonitors(objects) => {
                 write!(f, "RESOURCE MONITOR {}", 
display_comma_separated(objects))
             }
diff --git a/src/keywords.rs b/src/keywords.rs
index f56178c1..a8bbca3d 100644
--- a/src/keywords.rs
+++ b/src/keywords.rs
@@ -395,6 +395,7 @@ define_keywords!(
     FUNCTION,
     FUNCTIONS,
     FUSION,
+    FUTURE,
     GENERAL,
     GENERATE,
     GENERATED,
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index f1b09afb..68d89a1e 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -13691,6 +13691,33 @@ impl<'a> Parser<'a> {
                 Some(GrantObjects::AllTablesInSchema {
                     schemas: self.parse_comma_separated(|p| 
p.parse_object_name(false))?,
                 })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::SCHEMAS,
+                Keyword::IN,
+                Keyword::DATABASE,
+            ]) {
+                Some(GrantObjects::FutureSchemasInDatabase {
+                    databases: self.parse_comma_separated(|p| 
p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::TABLES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureTablesInSchema {
+                    schemas: self.parse_comma_separated(|p| 
p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::VIEWS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureViewsInSchema {
+                    schemas: self.parse_comma_separated(|p| 
p.parse_object_name(false))?,
+                })
             } else if self.parse_keywords(&[
                 Keyword::ALL,
                 Keyword::SEQUENCES,
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index 6c4ed08c..17b46e6f 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -9386,9 +9386,11 @@ fn parse_grant() {
     verified_stmt("GRANT SELECT ON VIEW view1 TO ROLE role1");
     verified_stmt("GRANT EXEC ON my_sp TO runner");
     verified_stmt("GRANT UPDATE ON my_table TO updater_role AS dbo");
-
     all_dialects_where(|d| d.identifier_quote_style("none") == Some('['))
         .verified_stmt("GRANT SELECT ON [my_table] TO [public]");
+    verified_stmt("GRANT SELECT ON FUTURE SCHEMAS IN DATABASE db1 TO ROLE 
role1");
+    verified_stmt("GRANT SELECT ON FUTURE TABLES IN SCHEMA db1.sc1 TO ROLE 
role1");
+    verified_stmt("GRANT SELECT ON FUTURE VIEWS IN SCHEMA db1.sc1 TO ROLE 
role1");
 }
 
 #[test]


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@datafusion.apache.org
For additional commands, e-mail: commits-h...@datafusion.apache.org

Reply via email to