dbt-labs / dbt-labs/dbt-adapters
[Bug] `snowflake_dml_explicit_transaction` macro incompatible with Snowflake unmanaged Iceberg tables (error 091586)
- Dominant language
- Python
- Stars
- 233
- Forks
- 362
- Avg merge
- 3d 22h
- Merged PRs (30d)
- 9
Description
### Is this a new bug?
- [x] I believe this is a new bug
- [x] I have searched the existing issues, and I could not find an existing issue for this bug
### Which packages are affected?
- [ ] dbt-adapters
- [ ] dbt-tests-adapter
- [ ] dbt-athena
- [ ] dbt-athena-community
- [ ] dbt-bigquery
- [ ] dbt-postgres
- [ ] dbt-redshift
- [x] dbt-snowflake
- [ ] dbt-spark
### Current Behavior
When using the `insert_overwrite` incremental strategy against a Snowflake **unmanaged Iceberg table** (externally cataloged via AWS Glue, etc.), dbt fails with:
```
091586 (42601): Unmanaged Iceberg tables cannot be modified within a multi-statement transaction.
```
The root cause is that `snowflake_dml_explicit_transaction` unconditionally wraps all DML in `BEGIN/COMMIT`. Snowflake's engine intentionally blocks DML on unmanaged Iceberg tables inside multi-statement transactions because it cannot guarantee rollback semantics against an external catalog (Glue, etc.).
### Expected Behavior
The `INSERT OVERWRITE` runs successfully. Since `INSERT OVERWRITE` is an inherently atomic single statement, the `BEGIN/COMMIT` wrapper provides no additional atomicity benefit and should be skipped for unmanaged Iceberg targets.
### Steps To Reproduce
**Steps to reproduce**
1. Create an unmanaged Iceberg table backed by an external catalog (e.g. AWS Glue via `CATALOG_SOURCE = ICEBERG_REST`).
2. Define a dbt model with `materialized='incremental'` and `incremental_strategy='insert_overwrite'` targeting that table.
3. Run `dbt run --select `.
In Snowflake
```
CREATE OR REPLACE CATALOG INTEGRATION glue_rest_catalog_int
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'iceberg_sujan_db'
REST_CONFIG = (
CATALOG_URI = 'https://glue.us-west-1.amazonaws.com/iceberg'
CATALOG_API_TYPE = AWS_GLUE
CATALOG_NAME = 'xxx'
)
REST_AUTHENTICATION = (
TYPE = SIGV4
SIGV4_IAM_ROLE = 'arn:aws:iam::xxx:role/snowflake-glue-role'
SIGV4_SIGNING_REGION = 'us-west-1'
)
ENABLED = TRUE;
-- Create writable unmanaged Iceberg table
CREATE OR REPLACE ICEBERG TABLE test_iceberg_rest
CATALOG_TABLE_NAME = 'test_iceberg_table'
CATALOG = 'glue_rest_catalog_int'
EXTERNAL_VOLUME = 'exvol';
INSERT INTO test_iceberg_rest VALUES (1, 'test', current_timestamp());
```
Now select the values from the table via dbt project
```
{{ config(
materialized='incremental',
incremental_strategy='insert_overwrite',
alias='test_iceberg_rest'
) }}
SELECT
1 AS id,
'repro_test' AS name,
current_timestamp() AS created_at
EXECUTE DBT PROJECT FROM WORKSPACE "USER$"."PUBLIC"."DEFAULT$"
PROJECT_ROOT='/iceberg_repro'
ARGS = 'run --select iceberg_test';
```
Error:
```
First error in model 'iceberg_test': Database Error in model iceberg_test (models/iceberg_test.sql)
091586 (42601): Unmanaged Iceberg tables cannot be modified within a multi-statement transaction.
compiled code at /tmp/dbt/target/run/iceberg_repro/models/iceberg_test.sql.
Context: DBT 1.9.4, Command: dbt run.
Check logs/dbt.log for more details.
```
### Relevant log output
```shell
```
### Environment
```markdown
- dbt-snowflake version: 1.9.4
- Snowflake error code: 091586
- Catalog type: AWS Glue (ICEBERG_REST)
- Strategy: `insert_overwrite`
```
### Additional Context
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.