diff --git a/crates/sqlquack-syntax/src/parser/_helpers/ddl/snowflake_alter_tables.rs b/crates/sqlquack-syntax/src/parser/_helpers/ddl/snowflake_alter_tables.rs index a24737cb9..052d1e68c 100644 --- a/crates/sqlquack-syntax/src/parser/_helpers/ddl/snowflake_alter_tables.rs +++ b/crates/sqlquack-syntax/src/parser/_helpers/ddl/snowflake_alter_tables.rs @@ -174,7 +174,7 @@ impl Parser { Ok(Some(alter_object(kind, head, action, parts))) } - /// Parse ALTER SHARE: UNSET COMMENT typed; ADD, REMOVE, SET and UNSET TAG are left to the fallback. + /// Parse ALTER SHARE: UNSET COMMENT typed; ADD, REMOVE, SET and other UNSETs are left to the fallback. fn parse_alter_share(&mut self) -> Result> { let start = self.current - 1; let head = self.parse_alter_object_head()?; @@ -186,8 +186,10 @@ impl Parser { self.text_at(0).unwrap_or_default().as_str(), self.text_at(1).as_deref(), ) { - ("UNSET", Some("TAG")) | ("ADD" | "REMOVE" | "SET", _) => {} - ("UNSET", _) => return Err(self.parse_error("Expected COMMENT or TAG after UNSET")), + ("UNSET", None | Some(";")) => { + return Err(self.parse_error("Expected a property after UNSET")) + } + ("ADD" | "REMOVE" | "SET" | "UNSET", _) => {} _ => return Err(self.parse_error("Expected ADD, REMOVE, SET or UNSET")), } self.current = start; diff --git a/crates/sqlquack-syntax/tests/parser/test_snowflake_alter_gaps.rs b/crates/sqlquack-syntax/tests/parser/test_snowflake_alter_gaps.rs index 793451abf..95e0cdeb9 100644 --- a/crates/sqlquack-syntax/tests/parser/test_snowflake_alter_gaps.rs +++ b/crates/sqlquack-syntax/tests/parser/test_snowflake_alter_gaps.rs @@ -37,7 +37,8 @@ fn given_snowflake_table_sequence_and_share_actions_when_parsing_then_only_docum AcceptanceTestCase { description: "a file is no name (recorded syntax error)", sql: "ALTER EXTERNAL TABLE v1 REMOVE FILES ( m1 ) ;", dialect: Dialect::Snowflake, expected_accepted: false }, AcceptanceTestCase { description: "a share unsets its comment (recorded semantic error)", sql: "ALTER SHARE v1 UNSET COMMENT ;", dialect: Dialect::Snowflake, expected_accepted: true }, AcceptanceTestCase { description: "a share keeps its ADD action", sql: "ALTER SHARE v1 ADD ACCOUNTS = a1 ;", dialect: Dialect::Snowflake, expected_accepted: true }, - AcceptanceTestCase { description: "a share unsets COMMENT or TAG only", sql: "ALTER SHARE v1 UNSET m1 ;", dialect: Dialect::Snowflake, expected_accepted: false }, + AcceptanceTestCase { description: "a share unsets any named property (recorded semantic error 1420)", sql: "ALTER SHARE v1 UNSET v1 ;", dialect: Dialect::Snowflake, expected_accepted: true }, + AcceptanceTestCase { description: "UNSET names a property (catalogued reject)", sql: "ALTER SHARE v1 UNSET ;", dialect: Dialect::Snowflake, expected_accepted: false }, AcceptanceTestCase { description: "a user group is an organization user group (recorded syntax error)", sql: "ALTER USER GROUP v1 ADD ORGANIZATION USERS v1 ;", dialect: Dialect::Snowflake, expected_accepted: false }, AcceptanceTestCase { description: "an organization user group adds users", sql: "ALTER ORGANIZATION USER GROUP IF EXISTS v1 ADD ORGANIZATION USERS v1 , v1 ;", dialect: Dialect::Snowflake, expected_accepted: true }, ];