From 6396430beb6876745f3364df7734ff0b28ea20c1 Mon Sep 17 00:00:00 2001 From: osipovartem Date: Wed, 14 Oct 2026 18:33:09 +0300 Subject: [PATCH] Parse Snowflake ADD COLUMN IF NOT EXISTS --- src/parser/mod.rs | 2 +- tests/sqlparser_snowflake.rs | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 20216d8862..4a4d2e6af3 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -10265,7 +10265,7 @@ impl<'a> Parser<'a> { } else { let column_keyword = self.parse_keyword(Keyword::COLUMN); - let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect) + let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | SnowflakeDialect | GenericDialect) { self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]) || if_not_exists diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index 859ed7bd1e..7f5a42c0ac 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -35,6 +35,26 @@ mod test_utils; #[cfg(test)] use pretty_assertions::assert_eq; +#[test] +fn snowflake_alter_table_add_column_if_not_exists() { + for sql in [ + "ALTER TABLE t ADD IF NOT EXISTS value NUMBER", + "ALTER TABLE t ADD COLUMN IF NOT EXISTS value NUMBER", + ] { + let Statement::AlterTable(AlterTable { operations, .. }) = snowflake().verified_stmt(sql) + else { + panic!("expected ALTER TABLE"); + }; + assert!(matches!( + operations.as_slice(), + [AlterTableOperation::AddColumn { + if_not_exists: true, + .. + }] + )); + } +} + #[test] fn test_snowflake_create_table() { let sql = "CREATE TABLE _my_$table (am00unt number)";