@@ -414,3 +414,65 @@ def my_signal(batch):
414414 day_delta = 3 ,
415415 was_evaluated = False ,
416416 )
417+
418+
419+ @use_terminal_console
420+ def test_registered_and_unregistered_external_models (
421+ ctx : TestContext , tmp_path : pathlib .Path , mocker : MockerFixture
422+ ):
423+ """
424+ Scenario: Ensure that external models are queried for their last modified timestamp
425+ regardless of whether they are present in the "external_models.yaml" file (registered) or not (unregistered)
426+ """
427+
428+ adapter = ctx .engine_adapter
429+ context , schema , (registered_external_table ,) = initialize_context (
430+ ctx , tmp_path , num_external_models = 1
431+ )
432+
433+ current_catalog = ctx .engine_adapter .get_current_catalog ()
434+
435+ def normalize_external_table_name (external_table_name ) -> str :
436+ from sqlglot import exp
437+
438+ normalized = exp .normalize_table_name (
439+ f"{ current_catalog } .{ external_table_name } " , dialect = ctx .dialect
440+ )
441+ return exp .table_name (normalized , dialect = ctx .dialect , identify = True )
442+
443+ unregistered_external_table = f"{ schema } .unregistered_external_table"
444+
445+ adapter .execute (
446+ f"CREATE TABLE { unregistered_external_table } AS (SELECT 1 AS col)" ,
447+ quote_identifiers = False ,
448+ )
449+
450+ create_model (
451+ "new_model" ,
452+ schema ,
453+ f"SELECT * FROM { unregistered_external_table } , { registered_external_table } " ,
454+ tmp_path ,
455+ )
456+
457+ context .load ()
458+ context .plan (auto_apply = True , no_prompts = True )
459+
460+ spy = mocker .spy (
461+ sqlmesh .core .engine_adapter .SnowflakeEngineAdapter , "get_table_last_modified_ts"
462+ )
463+ assert_model_evaluation (
464+ lambda : context .run (),
465+ day_delta = 1 ,
466+ was_evaluated = False ,
467+ )
468+
469+ assert spy .call_args_list
470+
471+ # The first argument of "get_table_last_modified_ts" is a list of external table names in normalized form
472+ # Ensure that this contains both external tables (registered and unregistered)
473+ assert sorted (spy .call_args [0 ][1 ]) == sorted (
474+ [
475+ normalize_external_table_name (registered_external_table ),
476+ normalize_external_table_name (unregistered_external_table ),
477+ ]
478+ )
0 commit comments