Skip to content

Commit 304dfc5

Browse files
committed
fix: Swap parser override order for macro IF under T-SQL (Issue #5823)
Signed-off-by: Jagan Nalla <jagannalla1@gmail.com>
1 parent d15203b commit 304dfc5

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

sqlmesh/core/dialect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1123,8 +1123,8 @@ def extend_sqlglot() -> None:
11231123
_override(Parser, _parse_value)
11241124
_override(Parser, _parse_lambda)
11251125
_override(Parser, _parse_types)
1126-
_override(TSQL.Parser, Parser._parse_if)
11271126
_override(Parser, _parse_if)
1127+
_override(TSQL.Parser, Parser._parse_if)
11281128
_override(Parser, _parse_id_var)
11291129
_override(Parser, _warn_unsupported)
11301130
_override(Snowflake.Parser, _parse_table_parts)

tests/core/test_dialect.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,20 @@ def test_conditional_statement():
707707
q = parse_one("@IF(cond, VACUUM ANALYZE);", read="postgres")
708708
assert q.sql(dialect="postgres") == "@IF(cond, VACUUM ANALYZE)"
709709

710+
# Verify that the original error case from issue #5823 (Required keyword: 'true' missing) is resolved.
711+
# It must be parsed as a macro function containing an Anonymous expression rather than exp.If.
712+
q = parse_one("@IF(1 = 1, ALTER TABLE x ADD y INT);", read="tsql")
713+
assert q.sql(dialect="tsql") == "@IF(1 = 1, ALTER TABLE x ADD y INTEGER)"
714+
assert isinstance(q.this, exp.Anonymous)
715+
assert q.this.name == "IF"
716+
717+
# Note: SQLGlot's fallback Command parser strips quotes from string literal tokens when parsing unparsed commands
718+
q = parse_one("@IF(cond, PRINT 'hello');", read="tsql")
719+
assert q.sql(dialect="tsql") == "@IF(cond, PRINT hello)"
720+
721+
q = parse_one("@IF(@runtime_stage = 'evaluating', SELECT 1);", read="tsql")
722+
assert q.sql(dialect="tsql") == "@IF(@runtime_stage = 'evaluating', SELECT 1)"
723+
710724

711725
def test_model_name_cannot_be_string():
712726
with pytest.raises(ParseError) as parse_error:

0 commit comments

Comments
 (0)