@@ -1774,6 +1774,72 @@ def test_new_forward_only_model_concurrent_versions(init_and_plan_context: t.Cal
17741774 assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "b" : {0 : None }}
17751775
17761776
1777+ @freeze_time ("2023-01-08 15:00:00" )
1778+ def test_new_forward_only_model_same_dev_environment (init_and_plan_context : t .Callable ):
1779+ context , plan = init_and_plan_context ("examples/sushi" )
1780+ context .apply (plan )
1781+
1782+ new_model_expr = d .parse (
1783+ """
1784+ MODEL (
1785+ name memory.sushi.new_model,
1786+ kind INCREMENTAL_BY_TIME_RANGE (
1787+ time_column ds,
1788+ forward_only TRUE,
1789+ on_destructive_change 'allow',
1790+ ),
1791+ );
1792+
1793+ SELECT '2023-01-07' AS ds, 1 AS a;
1794+ """
1795+ )
1796+ new_model = load_sql_based_model (new_model_expr )
1797+
1798+ # Add the first version of the model and apply it to dev.
1799+ context .upsert_model (new_model )
1800+ snapshot_a = context .get_snapshot (new_model .name )
1801+ plan_a = context .plan ("dev" , no_prompts = True )
1802+ snapshot_a = plan_a .snapshots [snapshot_a .snapshot_id ]
1803+
1804+ assert snapshot_a .snapshot_id in plan_a .context_diff .new_snapshots
1805+ assert snapshot_a .snapshot_id in plan_a .context_diff .added
1806+ assert snapshot_a .change_category == SnapshotChangeCategory .BREAKING
1807+
1808+ context .apply (plan_a )
1809+
1810+ df = context .fetchdf ("SELECT * FROM memory.sushi__dev.new_model" )
1811+ assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "a" : {0 : 1 }}
1812+
1813+ new_model_alt_expr = d .parse (
1814+ """
1815+ MODEL (
1816+ name memory.sushi.new_model,
1817+ kind INCREMENTAL_BY_TIME_RANGE (
1818+ time_column ds,
1819+ forward_only TRUE,
1820+ on_destructive_change 'allow',
1821+ ),
1822+ );
1823+
1824+ SELECT '2023-01-07' AS ds, 1 AS b;
1825+ """
1826+ )
1827+ new_model_alt = load_sql_based_model (new_model_alt_expr )
1828+
1829+ # Add the second version of the model and apply it to the same environment.
1830+ context .upsert_model (new_model_alt )
1831+ snapshot_b = context .get_snapshot (new_model_alt .name )
1832+
1833+ context .invalidate_environment ("dev" , sync = True )
1834+ plan_b = context .plan ("dev" , no_prompts = True )
1835+ snapshot_b = plan_b .snapshots [snapshot_b .snapshot_id ]
1836+
1837+ context .apply (plan_b )
1838+
1839+ df = context .fetchdf ("SELECT * FROM memory.sushi__dev.new_model" ).replace ({np .nan : None })
1840+ assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "b" : {0 : 1 }}
1841+
1842+
17771843def test_plan_twice_with_star_macro_yields_no_diff (tmp_path : Path ):
17781844 init_example_project (tmp_path , dialect = "duckdb" )
17791845
@@ -2564,7 +2630,7 @@ def get_default_catalog_and_non_tables(
25642630 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
25652631 assert len (prod_views ) == 13
25662632 assert len (dev_views ) == 0
2567- assert len (user_default_tables ) == 13
2633+ assert len (user_default_tables ) == 16
25682634 assert state_metadata .schemas == ["sqlmesh" ]
25692635 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
25702636 {
@@ -2583,7 +2649,7 @@ def get_default_catalog_and_non_tables(
25832649 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
25842650 assert len (prod_views ) == 13
25852651 assert len (dev_views ) == 13
2586- assert len (user_default_tables ) == 13
2652+ assert len (user_default_tables ) == 16
25872653 assert len (non_default_tables ) == 0
25882654 assert state_metadata .schemas == ["sqlmesh" ]
25892655 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
@@ -2603,7 +2669,7 @@ def get_default_catalog_and_non_tables(
26032669 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
26042670 assert len (prod_views ) == 13
26052671 assert len (dev_views ) == 26
2606- assert len (user_default_tables ) == 13
2672+ assert len (user_default_tables ) == 16
26072673 assert len (non_default_tables ) == 0
26082674 assert state_metadata .schemas == ["sqlmesh" ]
26092675 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
@@ -2624,7 +2690,7 @@ def get_default_catalog_and_non_tables(
26242690 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
26252691 assert len (prod_views ) == 13
26262692 assert len (dev_views ) == 13
2627- assert len (user_default_tables ) == 13
2693+ assert len (user_default_tables ) == 16
26282694 assert len (non_default_tables ) == 0
26292695 assert state_metadata .schemas == ["sqlmesh" ]
26302696 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
0 commit comments