@@ -854,6 +854,55 @@ def test_create_prod_table_exists(mocker: MockerFixture, adapter_mock, make_snap
854
854
)
855
855
856
856
857
+ def test_pre_hook_forward_only_clone (
858
+ mocker : MockerFixture , make_mocked_engine_adapter , make_snapshot
859
+ ):
860
+ """
861
+ Verifies that pre-statements are executed when creating a clone of a forward-only model.
862
+ """
863
+ pre_statement = """CREATE TEMPORARY FUNCTION "example_udf"("x" BIGINT) AS ("x" + 1)"""
864
+ model = load_sql_based_model (
865
+ parse ( # type: ignore
866
+ f"""
867
+ MODEL (
868
+ name test_schema.test_model,
869
+ kind INCREMENTAL_BY_TIME_RANGE (
870
+ time_column ds
871
+ )
872
+ );
873
+
874
+ { pre_statement } ;
875
+
876
+ SELECT a::int, ds::string FROM tbl;
877
+ """
878
+ ),
879
+ )
880
+
881
+ snapshot = make_snapshot (model )
882
+ snapshot .categorize_as (SnapshotChangeCategory .BREAKING , forward_only = True )
883
+ snapshot .previous_versions = snapshot .all_versions
884
+
885
+ adapter = make_mocked_engine_adapter (EngineAdapter )
886
+ adapter .with_settings = lambda ** kwargs : adapter
887
+ adapter .table_exists = lambda _ : True # type: ignore
888
+ adapter .SUPPORTS_CLONING = True
889
+ mocker .patch .object (
890
+ adapter ,
891
+ "get_data_objects" ,
892
+ return_value = [],
893
+ )
894
+ mocker .patch .object (
895
+ adapter ,
896
+ "get_alter_operations" ,
897
+ return_value = [],
898
+ )
899
+
900
+ evaluator = SnapshotEvaluator (adapter )
901
+
902
+ evaluator .create ([snapshot ], {}, deployability_index = DeployabilityIndex .none_deployable ())
903
+ adapter .cursor .execute .assert_any_call (pre_statement )
904
+
905
+
857
906
def test_create_only_dev_table_exists (mocker : MockerFixture , adapter_mock , make_snapshot ):
858
907
model = load_sql_based_model (
859
908
parse ( # type: ignore
0 commit comments