1515 bool_validator ,
1616 default_catalog_validator ,
1717 depends_on_validator ,
18- expression_validator ,
1918 sort_python_env ,
2019 sorted_python_env_payloads ,
2120)
22- from sqlmesh .core .model .common import make_python_env , single_value_or_tuple
21+ from sqlmesh .core .model .common import make_python_env , single_value_or_tuple , ParsableSql
2322from sqlmesh .core .node import _Node
2423from sqlmesh .core .renderer import QueryRenderer
2524from sqlmesh .utils .date import TimeLike
@@ -67,15 +66,26 @@ class AuditMixin(AuditCommonMetaMixin):
6766 jinja_macros: A registry of jinja macros to use when rendering the audit query.
6867 """
6968
70- query : t . Union [ exp . Query , d . JinjaQuery ]
69+ query_ : ParsableSql
7170 defaults : t .Dict [str , exp .Expression ]
72- expressions_ : t .Optional [t .List [exp . Expression ]]
71+ expressions_ : t .Optional [t .List [ParsableSql ]]
7372 jinja_macros : JinjaMacroRegistry
7473 formatting : t .Optional [bool ]
7574
75+ @property
76+ def query (self ) -> t .Union [exp .Query , d .JinjaQuery ]:
77+ return t .cast (t .Union [exp .Query , d .JinjaQuery ], self .query_ .parse (self .dialect ))
78+
7679 @property
7780 def expressions (self ) -> t .List [exp .Expression ]:
78- return self .expressions_ or []
81+ if not self .expressions_ :
82+ return []
83+ result = []
84+ for e in self .expressions_ :
85+ parsed = e .parse (self .dialect )
86+ if not isinstance (parsed , exp .Semicolon ):
87+ result .append (parsed )
88+ return result
7989
8090 @property
8191 def macro_definitions (self ) -> t .List [d .MacroDef ]:
@@ -122,16 +132,16 @@ class ModelAudit(PydanticModel, AuditMixin, frozen=True):
122132 skip : bool = False
123133 blocking : bool = True
124134 standalone : t .Literal [False ] = False
125- query : t . Union [ exp . Query , d . JinjaQuery ]
135+ query_ : ParsableSql = Field ( alias = "query" )
126136 defaults : t .Dict [str , exp .Expression ] = {}
127- expressions_ : t .Optional [t .List [exp . Expression ]] = Field (default = None , alias = "expressions" )
137+ expressions_ : t .Optional [t .List [ParsableSql ]] = Field (default = None , alias = "expressions" )
128138 jinja_macros : JinjaMacroRegistry = JinjaMacroRegistry ()
129139 formatting : t .Optional [bool ] = Field (default = None , exclude = True )
130140
131141 _path : t .Optional [Path ] = None
132142
133143 # Validators
134- _query_validator = expression_validator
144+ _query_validator = ParsableSql . validator ()
135145 _bool_validator = bool_validator
136146 _string_validator = audit_string_validator
137147 _map_validator = audit_map_validator
@@ -153,9 +163,9 @@ class StandaloneAudit(_Node, AuditMixin):
153163 skip : bool = False
154164 blocking : bool = False
155165 standalone : t .Literal [True ] = True
156- query : t . Union [ exp . Query , d . JinjaQuery ]
166+ query_ : ParsableSql = Field ( alias = "query" )
157167 defaults : t .Dict [str , exp .Expression ] = {}
158- expressions_ : t .Optional [t .List [exp . Expression ]] = Field (default = None , alias = "expressions" )
168+ expressions_ : t .Optional [t .List [ParsableSql ]] = Field (default = None , alias = "expressions" )
159169 jinja_macros : JinjaMacroRegistry = JinjaMacroRegistry ()
160170 default_catalog : t .Optional [str ] = None
161171 depends_on_ : t .Optional [t .Set [str ]] = Field (default = None , alias = "depends_on" )
@@ -165,7 +175,7 @@ class StandaloneAudit(_Node, AuditMixin):
165175 source_type : t .Literal ["audit" ] = "audit"
166176
167177 # Validators
168- _query_validator = expression_validator
178+ _query_validator = ParsableSql . validator ()
169179 _bool_validator = bool_validator
170180 _string_validator = audit_string_validator
171181 _map_validator = audit_map_validator
@@ -276,8 +286,8 @@ def metadata_hash(self) -> str:
276286 self .cron_tz .key if self .cron_tz else None ,
277287 ]
278288
279- query = self . render_audit_query () or self .query
280- data .append ( gen ( query ) )
289+ data . append ( self .query_ . sql )
290+ data .extend ([ e . sql for e in self . expressions_ or []] )
281291 self ._metadata_hash = hash_data (data )
282292 return self ._metadata_hash
283293
@@ -461,11 +471,17 @@ def load_audit(
461471 if project is not None :
462472 extra_kwargs ["project" ] = project
463473
464- dialect = meta_fields .pop ("dialect" , dialect )
474+ dialect = meta_fields .pop ("dialect" , dialect ) or ""
475+
476+ parsable_query = ParsableSql .from_parsed_expression (query , dialect , use_meta_sql = True )
477+ parsable_statements = [
478+ ParsableSql .from_parsed_expression (s , dialect , use_meta_sql = True ) for s in statements
479+ ]
480+
465481 try :
466482 audit = audit_class (
467- query = query ,
468- expressions = statements ,
483+ query = parsable_query ,
484+ expressions = parsable_statements ,
469485 dialect = dialect ,
470486 ** extra_kwargs ,
471487 ** meta_fields ,
0 commit comments