diff --git a/sqlmesh/core/model/definition.py b/sqlmesh/core/model/definition.py index d4f23b4fc0..5b3a656a54 100644 --- a/sqlmesh/core/model/definition.py +++ b/sqlmesh/core/model/definition.py @@ -1158,11 +1158,7 @@ def _audit_metadata_hash_values(self) -> t.List[str]: for audit_name, audit_args in sorted(self.audits, key=lambda a: a[0]): metadata.append(audit_name) - if audit_name in BUILT_IN_AUDITS: - for arg_name, arg_value in audit_args.items(): - metadata.append(arg_name) - metadata.append(gen(arg_value)) - else: + if audit_name not in BUILT_IN_AUDITS: audit = self.audit_definitions[audit_name] metadata.extend( [ @@ -1172,6 +1168,9 @@ def _audit_metadata_hash_values(self) -> t.List[str]: str(audit.blocking), ] ) + for arg_name, arg_value in audit_args.items(): + metadata.append(arg_name) + metadata.append(gen(arg_value)) return metadata diff --git a/sqlmesh/migrations/v0101_include_custom_audit_args_in_fingerprint.py b/sqlmesh/migrations/v0101_include_custom_audit_args_in_fingerprint.py new file mode 100644 index 0000000000..e4ec93afa1 --- /dev/null +++ b/sqlmesh/migrations/v0101_include_custom_audit_args_in_fingerprint.py @@ -0,0 +1,9 @@ +"""Include custom audit args in the model fingerprint.""" + + +def migrate_schemas(engine_adapter, schema, **kwargs): # type: ignore + pass + + +def migrate_rows(engine_adapter, schema, **kwargs): # type: ignore + pass diff --git a/tests/core/test_model.py b/tests/core/test_model.py index 9bdc976b56..d4279a9c90 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -1665,6 +1665,37 @@ def test_audits(): assert model.tags == ["foo"] +def test_custom_audit_arg_changes_affect_fingerprint(): + def make_model(min_val: int) -> t.Any: + expressions = d.parse( + f""" + MODEL ( + name db.model, + audits (check_count(min := {min_val})) + ); + SELECT 1 AS id; + """ + ) + audit_definitions = { + "check_count": load_audit( + d.parse( + "AUDIT (name check_count); SELECT * FROM @this_model HAVING COUNT(*) < @min" + ), + dialect="duckdb", + ) + } + return load_sql_based_model( + expressions, + path=Path("./examples/sushi/models/test_model.sql"), + audit_definitions=audit_definitions, + ) + + model_a = make_model(33111) + model_b = make_model(5142) + + assert model_a.audit_metadata_hash() != model_b.audit_metadata_hash() + + def test_enable_audits_from_model_defaults(): expressions = d.parse( """