@@ -854,6 +854,55 @@ def test_create_prod_table_exists(mocker: MockerFixture, adapter_mock, make_snap
854854 )
855855
856856
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+
857906def test_create_only_dev_table_exists (mocker : MockerFixture , adapter_mock , make_snapshot ):
858907 model = load_sql_based_model (
859908 parse ( # type: ignore
0 commit comments