From 1fb8f03e8cc58a2e8f7e27b0f191472db6bb27a2 Mon Sep 17 00:00:00 2001 From: randalboyle Date: Wed, 16 Oct 2024 17:47:13 +0100 Subject: [PATCH 1/8] adding transient dynamic table capabilities --- .../snowflake/macros/relations/dynamic_table/create.sql | 3 ++- .../snowflake/macros/relations/dynamic_table/replace.sql | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql index 4ebcf145b..7b4f54ace 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql @@ -14,6 +14,7 @@ -#} {%- set dynamic_table = relation.from_config(config.model) -%} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} {%- if dynamic_table.catalog.table_format == 'iceberg' -%} {{ _get_create_dynamic_iceberg_table_as_sql(dynamic_table, relation, sql) }} @@ -41,7 +42,7 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} - create dynamic table {{ relation }} + create {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' warehouse = {{ dynamic_table.snowflake_warehouse }} {{ optional('refresh_mode', dynamic_table.refresh_mode) }} diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql index 2e7b4566a..98fd99696 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql @@ -14,6 +14,7 @@ -#} {%- set dynamic_table = relation.from_config(config.model) -%} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} {%- if dynamic_table.catalog.table_format == 'iceberg' -%} {{ _get_replace_dynamic_iceberg_table_as_sql(dynamic_table, relation, sql) }} @@ -40,7 +41,7 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} - create or replace dynamic table {{ relation }} + create or replace {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' warehouse = {{ dynamic_table.snowflake_warehouse }} {{ optional('refresh_mode', dynamic_table.refresh_mode) }} From 065e95189eb8e577cd853a56f11414772d0b52ed Mon Sep 17 00:00:00 2001 From: randalboyle Date: Thu, 17 Oct 2024 10:38:58 +0100 Subject: [PATCH 2/8] adding changies file --- .changes/unreleased/Features-20241017-103843.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/unreleased/Features-20241017-103843.yaml diff --git a/.changes/unreleased/Features-20241017-103843.yaml b/.changes/unreleased/Features-20241017-103843.yaml new file mode 100644 index 000000000..22fb41de2 --- /dev/null +++ b/.changes/unreleased/Features-20241017-103843.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Adding capability to create transient dynamic tables. +time: 2024-10-17T10:38:43.820283+01:00 +custom: + Author: jhsb25 + Issue: "1089" From b2e4fbbb1ab73cb375de41d2ec07d2a752f717b2 Mon Sep 17 00:00:00 2001 From: randalboyle Date: Thu, 17 Oct 2024 13:16:47 +0100 Subject: [PATCH 3/8] correcting logic --- dbt/adapters/snowflake/relation.py | 2 +- .../snowflake/macros/relations/dynamic_table/create.sql | 3 ++- .../snowflake/macros/relations/dynamic_table/replace.sql | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dbt/adapters/snowflake/relation.py b/dbt/adapters/snowflake/relation.py index b6924b9b3..17aeffc9e 100644 --- a/dbt/adapters/snowflake/relation.py +++ b/dbt/adapters/snowflake/relation.py @@ -162,7 +162,7 @@ def get_ddl_prefix_for_create(self, config: RelationConfig, temporary: bool) -> support temporary relations. """ - transient_explicitly_set_true: bool = config.get("transient", False) + transient_explicitly_set_true: bool = config.extra.get("transient", False) # Temporary tables are a Snowflake feature that do not exist in the # Iceberg framework. We ignore the Iceberg status of the model. diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql index 7b4f54ace..351d27be6 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql @@ -14,7 +14,6 @@ -#} {%- set dynamic_table = relation.from_config(config.model) -%} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} {%- if dynamic_table.catalog.table_format == 'iceberg' -%} {{ _get_create_dynamic_iceberg_table_as_sql(dynamic_table, relation, sql) }} @@ -42,6 +41,8 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} + create {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' warehouse = {{ dynamic_table.snowflake_warehouse }} diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql index 98fd99696..cabf9c98f 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql @@ -14,7 +14,6 @@ -#} {%- set dynamic_table = relation.from_config(config.model) -%} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} {%- if dynamic_table.catalog.table_format == 'iceberg' -%} {{ _get_replace_dynamic_iceberg_table_as_sql(dynamic_table, relation, sql) }} @@ -41,6 +40,8 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} + create or replace {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' warehouse = {{ dynamic_table.snowflake_warehouse }} From 4cec91423983f8c7ab7ab437dd1b319170f86333 Mon Sep 17 00:00:00 2001 From: randalboyle Date: Thu, 17 Oct 2024 14:06:47 +0100 Subject: [PATCH 4/8] removing change in logic for relation --- dbt/adapters/snowflake/relation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt/adapters/snowflake/relation.py b/dbt/adapters/snowflake/relation.py index 17aeffc9e..b6924b9b3 100644 --- a/dbt/adapters/snowflake/relation.py +++ b/dbt/adapters/snowflake/relation.py @@ -162,7 +162,7 @@ def get_ddl_prefix_for_create(self, config: RelationConfig, temporary: bool) -> support temporary relations. """ - transient_explicitly_set_true: bool = config.extra.get("transient", False) + transient_explicitly_set_true: bool = config.get("transient", False) # Temporary tables are a Snowflake feature that do not exist in the # Iceberg framework. We ignore the Iceberg status of the model. From 55d41cf47065808510a1ad4e60aecddbddbcaff9 Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 18 Nov 2024 15:12:51 -0800 Subject: [PATCH 5/8] update dynamic table config to include transient --- dbt/adapters/snowflake/relation.py | 7 +++++-- .../snowflake/relation_configs/dynamic_table.py | 4 +++- .../macros/relations/dynamic_table/create.sql | 2 +- .../macros/relations/dynamic_table/replace.sql | 2 +- .../relation_tests/dynamic_table_tests/models.py | 12 ++++++++++++ .../relation_tests/dynamic_table_tests/test_basic.py | 4 ++++ tests/functional/utils.py | 2 +- 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/dbt/adapters/snowflake/relation.py b/dbt/adapters/snowflake/relation.py index b6924b9b3..97205fd9c 100644 --- a/dbt/adapters/snowflake/relation.py +++ b/dbt/adapters/snowflake/relation.py @@ -56,6 +56,7 @@ class SnowflakeRelation(BaseRelation): } ) ) + transient: Optional[bool] = None @property def is_dynamic_table(self) -> bool: @@ -147,7 +148,9 @@ def can_be_renamed(self) -> bool: """ return self.type in self.renameable_relations and not self.is_iceberg_format - def get_ddl_prefix_for_create(self, config: RelationConfig, temporary: bool) -> str: + def get_ddl_prefix_for_create( + self, config: RelationConfig, temporary: bool, transient_default: bool = True + ) -> str: """ This macro renders the appropriate DDL prefix during the create_table_as macro. It decides based on mutually exclusive table configuration options: @@ -187,7 +190,7 @@ def get_ddl_prefix_for_create(self, config: RelationConfig, temporary: bool) -> # Always supply transient on table create DDL unless user specifically sets # transient to false or unset. Might as well update the object attribute too! - elif transient_explicitly_set_true or config.get("transient", True): + elif transient_explicitly_set_true or config.get("transient", transient_default): return "transient" else: return "" diff --git a/dbt/adapters/snowflake/relation_configs/dynamic_table.py b/dbt/adapters/snowflake/relation_configs/dynamic_table.py index 7361df80a..b825904ad 100644 --- a/dbt/adapters/snowflake/relation_configs/dynamic_table.py +++ b/dbt/adapters/snowflake/relation_configs/dynamic_table.py @@ -63,6 +63,7 @@ class SnowflakeDynamicTableConfig(SnowflakeRelationConfigBase): catalog: SnowflakeCatalogConfig refresh_mode: Optional[RefreshMode] = RefreshMode.default() initialize: Optional[Initialize] = Initialize.default() + transient: Optional[bool] = False @classmethod def from_dict(cls, config_dict: Dict[str, Any]) -> Self: @@ -78,6 +79,7 @@ def from_dict(cls, config_dict: Dict[str, Any]) -> Self: "catalog": SnowflakeCatalogConfig.from_dict(config_dict["catalog"]), "refresh_mode": config_dict.get("refresh_mode"), "initialize": config_dict.get("initialize"), + "transient": config_dict.get("transient"), } return super().from_dict(kwargs_dict) @@ -92,6 +94,7 @@ def parse_relation_config(cls, relation_config: RelationConfig) -> Dict[str, Any "target_lag": relation_config.config.extra.get("target_lag"), "snowflake_warehouse": relation_config.config.extra.get("snowflake_warehouse"), "catalog": SnowflakeCatalogConfig.parse_relation_config(relation_config), + "transient": relation_config.config.extra.get("transient", False), } if refresh_mode := relation_config.config.extra.get("refresh_mode"): @@ -105,7 +108,6 @@ def parse_relation_config(cls, relation_config: RelationConfig) -> Dict[str, Any @classmethod def parse_relation_results(cls, relation_results: RelationResults) -> Dict[str, Any]: dynamic_table: "agate.Row" = relation_results["dynamic_table"].rows[0] - config_dict = { "name": dynamic_table.get("name"), "schema_name": dynamic_table.get("schema_name"), diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql index 351d27be6..e4a77f111 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql @@ -41,7 +41,7 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, False) -%} create {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql index cabf9c98f..bd756892e 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql @@ -40,7 +40,7 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False) -%} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, False) -%} create or replace {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' diff --git a/tests/functional/relation_tests/dynamic_table_tests/models.py b/tests/functional/relation_tests/dynamic_table_tests/models.py index 4dcd6cf48..49959bcb0 100644 --- a/tests/functional/relation_tests/dynamic_table_tests/models.py +++ b/tests/functional/relation_tests/dynamic_table_tests/models.py @@ -17,6 +17,18 @@ """ +DYNAMIC_TRANSIENT_TABLE = """ +{{ config( + materialized='dynamic_table', + snowflake_warehouse='DBT_TESTING', + target_lag='2 minutes', + refresh_mode='INCREMENTAL', + transient=True, +) }} +select * from {{ ref('my_seed') }} +""" + + DYNAMIC_TABLE_DOWNSTREAM = """ {{ config( materialized='dynamic_table', diff --git a/tests/functional/relation_tests/dynamic_table_tests/test_basic.py b/tests/functional/relation_tests/dynamic_table_tests/test_basic.py index 79a2241ca..a1401a411 100644 --- a/tests/functional/relation_tests/dynamic_table_tests/test_basic.py +++ b/tests/functional/relation_tests/dynamic_table_tests/test_basic.py @@ -18,6 +18,7 @@ def models(self): my_models = { "my_dynamic_table.sql": models.DYNAMIC_TABLE, "my_dynamic_table_downstream.sql": models.DYNAMIC_TABLE_DOWNSTREAM, + "my_dynamic_transient_table.sql": models.DYNAMIC_TRANSIENT_TABLE, } if self.iceberg: my_models.update( @@ -36,6 +37,9 @@ def test_dynamic_table_full_refresh(self, project): run_dbt(["run", "--full-refresh"]) assert query_relation_type(project, "my_dynamic_table") == "dynamic_table" assert query_relation_type(project, "my_dynamic_table_downstream") == "dynamic_table" + assert ( + query_relation_type(project, "my_dynamic_transient_table") == "dynamic_table_transient" + ) if self.iceberg: assert query_relation_type(project, "my_dynamic_iceberg_table") == "dynamic_table" diff --git a/tests/functional/utils.py b/tests/functional/utils.py index d185e8d2b..c935d2675 100644 --- a/tests/functional/utils.py +++ b/tests/functional/utils.py @@ -16,6 +16,7 @@ def query_relation_type(project, name: str) -> Optional[str]: select case table_type when 'BASE TABLE' then iff(is_dynamic = 'YES', 'dynamic_table', 'table') + || iff(is_transient = 'YES', '_transient', '') when 'VIEW' then 'view' when 'EXTERNAL TABLE' then 'external_table' end as relation_type @@ -25,7 +26,6 @@ def query_relation_type(project, name: str) -> Optional[str]: and table_catalog like '{relation.database.upper()}' """ results = project.run_sql(sql, fetch="all") - assert len(results) > 0, f"Relation {relation} not found" assert len(results) == 1, f"Multiple relations found" From 6148c26aafaba836606f7b7d95f49e2a1ddb7e48 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 21 Nov 2024 16:12:08 -0800 Subject: [PATCH 6/8] add behavior flag governing transient --- dbt/adapters/snowflake/impl.py | 13 ++++++++++++- .../snowflake/relation_configs/dynamic_table.py | 3 --- .../macros/relations/dynamic_table/create.sql | 7 ++++++- .../macros/relations/dynamic_table/replace.sql | 8 +++++++- .../relation_tests/dynamic_table_tests/models.py | 1 + .../dynamic_table_tests/test_basic.py | 15 +++++++++++++++ 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/dbt/adapters/snowflake/impl.py b/dbt/adapters/snowflake/impl.py index dc0926d93..770dde58d 100644 --- a/dbt/adapters/snowflake/impl.py +++ b/dbt/adapters/snowflake/impl.py @@ -92,7 +92,18 @@ def _behavior_flags(self) -> List[BehaviorFlag]: "benefits only those actively using it, we've made this behavior opt-in to " "prevent unnecessary latency for other users." ), - } + }, + { + "name": "default_dynamic_tables_to_transient", + "default": False, + "description": ( + "Standard Tables are created as transient by default. This can be overridden " + "by setting transient: false in the model config. This saves on storages costs " + "and for most users is the right decision. We are changing the default behavior for " + "dynamic tables to align with this." + "Read more: https://docs.getdbt.com/reference/resource-configs/snowflake-configs#transient-tables" + ), + }, ] @classmethod diff --git a/dbt/adapters/snowflake/relation_configs/dynamic_table.py b/dbt/adapters/snowflake/relation_configs/dynamic_table.py index b825904ad..b4021398e 100644 --- a/dbt/adapters/snowflake/relation_configs/dynamic_table.py +++ b/dbt/adapters/snowflake/relation_configs/dynamic_table.py @@ -63,7 +63,6 @@ class SnowflakeDynamicTableConfig(SnowflakeRelationConfigBase): catalog: SnowflakeCatalogConfig refresh_mode: Optional[RefreshMode] = RefreshMode.default() initialize: Optional[Initialize] = Initialize.default() - transient: Optional[bool] = False @classmethod def from_dict(cls, config_dict: Dict[str, Any]) -> Self: @@ -79,7 +78,6 @@ def from_dict(cls, config_dict: Dict[str, Any]) -> Self: "catalog": SnowflakeCatalogConfig.from_dict(config_dict["catalog"]), "refresh_mode": config_dict.get("refresh_mode"), "initialize": config_dict.get("initialize"), - "transient": config_dict.get("transient"), } return super().from_dict(kwargs_dict) @@ -94,7 +92,6 @@ def parse_relation_config(cls, relation_config: RelationConfig) -> Dict[str, Any "target_lag": relation_config.config.extra.get("target_lag"), "snowflake_warehouse": relation_config.config.extra.get("snowflake_warehouse"), "catalog": SnowflakeCatalogConfig.parse_relation_config(relation_config), - "transient": relation_config.config.extra.get("transient", False), } if refresh_mode := relation_config.config.extra.get("refresh_mode"): diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql index e4a77f111..917f1d22d 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/create.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/create.sql @@ -40,8 +40,13 @@ -- Returns: -- A valid DDL statement which will result in a new dynamic standard table. -#} + {%- if adapter.behavior.default_dynamic_tables_to_transient -%} + {%- set transient = True -%} + {%- else -%} + {%- set transient = False -%} + {%- endif -%} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, False) -%} + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, transient) -%} create {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' diff --git a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql index bd756892e..9e9600336 100644 --- a/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql +++ b/dbt/include/snowflake/macros/relations/dynamic_table/replace.sql @@ -40,7 +40,13 @@ -- A valid DDL statement which will result in a new dynamic standard table. -#} - {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, False) -%} + {%- if adapter.behavior.default_dynamic_tables_to_transient -%} + {%- set transient = True -%} + {%- else -%} + {%- set transient = False -%} + {%- endif -%} + + {%- set materialization_prefix = relation.get_ddl_prefix_for_create(config.model.config, False, transient) -%} create or replace {{ materialization_prefix }} dynamic table {{ relation }} target_lag = '{{ dynamic_table.target_lag }}' diff --git a/tests/functional/relation_tests/dynamic_table_tests/models.py b/tests/functional/relation_tests/dynamic_table_tests/models.py index 49959bcb0..ad79935b7 100644 --- a/tests/functional/relation_tests/dynamic_table_tests/models.py +++ b/tests/functional/relation_tests/dynamic_table_tests/models.py @@ -35,6 +35,7 @@ snowflake_warehouse='DBT_TESTING', target_lag='DOWNSTREAM', refresh_mode='INCREMENTAL', + transient=False, ) }} select * from {{ ref('my_seed') }} """ diff --git a/tests/functional/relation_tests/dynamic_table_tests/test_basic.py b/tests/functional/relation_tests/dynamic_table_tests/test_basic.py index a1401a411..0806873e5 100644 --- a/tests/functional/relation_tests/dynamic_table_tests/test_basic.py +++ b/tests/functional/relation_tests/dynamic_table_tests/test_basic.py @@ -50,3 +50,18 @@ class TestBasicIcebergOn(TestBasic): @pytest.fixture(scope="class") def project_config_update(self): return {"flags": {"enable_iceberg_materializations": True}} + + +class TestDefaultTransient(TestBasic): + + @pytest.fixture(scope="class") + def project_config_update(self): + return {"flags": {"default_dynamic_tables_to_transient": True}} + + def test_dynamic_table_full_refresh(self, project): + run_dbt(["run", "--full-refresh"]) + assert ( + query_relation_type(project, "my_dynamic_transient_table") == "dynamic_table_transient" + ) + assert query_relation_type(project, "my_dynamic_table_downstream") == "dynamic_table" + assert query_relation_type(project, "my_dynamic_table") == "dynamic_table_transient" From 5073f45831a881a25fc488aac0a8076a8c313d68 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 11:33:09 -0800 Subject: [PATCH 7/8] remove transient from relation.py --- dbt/adapters/snowflake/relation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dbt/adapters/snowflake/relation.py b/dbt/adapters/snowflake/relation.py index 97205fd9c..325d5b8ab 100644 --- a/dbt/adapters/snowflake/relation.py +++ b/dbt/adapters/snowflake/relation.py @@ -56,7 +56,6 @@ class SnowflakeRelation(BaseRelation): } ) ) - transient: Optional[bool] = None @property def is_dynamic_table(self) -> bool: From c35bcb192ba14102a39a3830bd4ad1dbf230a483 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 22 Nov 2024 17:28:00 -0800 Subject: [PATCH 8/8] fix test fixture --- tests/functional/relation_tests/test_relation_type_change.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/relation_tests/test_relation_type_change.py b/tests/functional/relation_tests/test_relation_type_change.py index 1024a92ca..143253e47 100644 --- a/tests/functional/relation_tests/test_relation_type_change.py +++ b/tests/functional/relation_tests/test_relation_type_change.py @@ -53,8 +53,8 @@ def uses_iceberg(self) -> bool: relations = [ Model(models.VIEW, "view"), - Model(models.TABLE, "table", "default"), - Model(models.INCREMENTAL_TABLE, "table", "default", is_incremental=True), + Model(models.TABLE, "table_transient", "default"), + Model(models.INCREMENTAL_TABLE, "table_transient", "default", is_incremental=True), Model(models.DYNAMIC_TABLE, "dynamic_table", "default"), Model(models.ICEBERG_TABLE, "table", "iceberg"), Model(models.INCREMENTAL_ICEBERG_TABLE, "table", "iceberg", is_incremental=True),