From 2fa91a2176eabb419231c32d4e271c5a79edacea Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Thu, 4 Jun 2026 10:14:47 -0700 Subject: [PATCH] fix: interval macro unit Signed-off-by: Vincent Chan --- sqlmesh/core/dialect.py | 11 +++++++++++ tests/core/test_dialect.py | 2 ++ 2 files changed, 13 insertions(+) diff --git a/sqlmesh/core/dialect.py b/sqlmesh/core/dialect.py index add30d1189..d7b8a0d63a 100644 --- a/sqlmesh/core/dialect.py +++ b/sqlmesh/core/dialect.py @@ -745,6 +745,16 @@ def _whens_sql(self: Generator, expression: exp.Whens) -> str: return self.wrap(self.expressions(expression, sep=" ", indent=False)) +def _parse_interval_span(self: Parser, this: exp.Expr) -> exp.Interval: + interval = self.__parse_interval_span(this) # type: ignore + # Without this, @unit in `INTERVAL @value @unit` is misread as an alias. + if not interval.args.get("unit") and self._match(TokenType.PARAMETER): + macro = _parse_macro(self) + if macro is not None: + interval.set("unit", macro) + return interval + + def _override(klass: t.Type[Tokenizer | Parser], func: t.Callable) -> None: name = func.__name__ setattr(klass, f"_{name}", getattr(klass, name)) @@ -1126,6 +1136,7 @@ def extend_sqlglot() -> None: _override(TSQL.Parser, Parser._parse_if) _override(Parser, _parse_if) _override(Parser, _parse_id_var) + _override(Parser, _parse_interval_span) _override(Parser, _warn_unsupported) _override(Snowflake.Parser, _parse_table_parts) diff --git a/tests/core/test_dialect.py b/tests/core/test_dialect.py index 3b8df28f8b..53295c4faa 100644 --- a/tests/core/test_dialect.py +++ b/tests/core/test_dialect.py @@ -291,6 +291,8 @@ def test_macro_format(): assert parse_one("@EACH(ARRAY(1,2), x -> x)").sql() == "@EACH(ARRAY(1, 2), x -> x)" assert parse_one("INTERVAL @x DAY").sql() == "INTERVAL @x DAY" assert parse_one("INTERVAL @'@{bar}' DAY").sql() == "INTERVAL @'@{bar}' DAY" + assert parse_one("INTERVAL @x @y").sql() == "INTERVAL @x @y" + assert parse_one("INTERVAL 1 @y").sql() == "INTERVAL '1' @y" def test_format_body_macros():