dbt adapter conformance¶
tests/conformance/ runs the official dbt adapter test suite
(dbt-tests-adapter)
against duckrun (cores.yml, conformance job). The card is
regenerated on every push to main, so it may be ahead of the published PyPI release.
Every still-failing test falls into one of these categories:
- No persistent views. Delta has no view primitive, so a
materialized='view'model is a transient DuckDB catalog view, and the tests that swap a modeltable → view(TestSimpleMaterializationsDuckDB::test_base,changing_relation_type) have nowhere durable to land. Rewriting Delta data on a materialization change is deliberately not done. - Deliberate rejection of silently-divergent merge configs.
merge_on_using_columnsand a clauseaction: errorhave no delta-rs equivalent, so duckrun raises instead of running something else;test_ducklake_valid_single_updatestays red on purpose.merge_clausesandmerge_update_set_expressionsare translated and pass. - delta-rs and DuckDB limits.
sync_all_columnsneeds column drops, which delta-rs cannot do (schema evolution is add-only);QuotingFalseexpects a compile error for unquoted identifiers with spaces, which DuckDB permits.
dbt adapter conformance — duckrun¶
┌────────────────────────────────────────────────────────┐
│ ✅ 153 passed ❌ 4 failed 💥 0 errors ⏭️ 10 skipped │
│ 167 total · 92% passing │
└────────────────────────────────────────────────────────┘
By suite¶
| Suite | Pass rate | ✅ | ❌ | 💥 | ⏭️ | Total |
|---|---|---|---|---|---|---|
aliases |
██████████ 100% |
2 | 0 | 0 | 0 | 2 |
caching |
██████████ 100% |
2 | 0 | 0 | 0 | 2 |
concurrency |
██████████ 100% |
2 | 0 | 0 | 0 | 2 |
constraints |
██████████ 100% |
19 | 0 | 0 | 0 | 19 |
drop_relation |
██████████ 100% |
3 | 0 | 0 | 0 | 3 |
empty |
██████████ 100% |
2 | 0 | 0 | 0 | 2 |
ephemeral |
██████████ 100% |
3 | 0 | 0 | 0 | 3 |
fast_seed |
██████████ 100% |
4 | 0 | 0 | 0 | 4 |
get_columns_in_relation |
██████████ 100% |
2 | 0 | 0 | 0 | 2 |
incremental_microbatch |
██████████ 100% |
14 | 0 | 0 | 0 | 14 |
simple_snapshot |
██████████ 100% |
10 | 0 | 0 | 0 | 10 |
store_test_failures |
██████████ 100% |
1 | 0 | 0 | 0 | 1 |
unit_testing |
██████████ 100% |
5 | 0 | 0 | 0 | 5 |
unit_testing_incremental |
██████████ 100% |
15 | 0 | 0 | 0 | 15 |
basic |
█████████░ 94% |
15 | 1 | 0 | 0 | 16 |
utils |
█████████░ 88% |
28 | 0 | 0 | 4 | 32 |
persist_docs |
████████░░ 80% |
4 | 0 | 0 | 1 | 5 |
incremental |
████████░░ 76% |
22 | 2 | 0 | 5 | 29 |
changing_relation_type |
░░░░░░░░░░ 0% |
0 | 1 | 0 | 0 | 1 |
| Total | █████████░ 92% |
153 | 4 | 0 | 10 | 167 |
Incremental / write support¶
| Capability | Notes | |
|---|---|---|
materialized='table' (overwrite) |
✅ | full rewrite each run (delta_rs overwrite) |
first run / --full-refresh |
✅ | overwrites |
append |
✅ | append; auto-fenced when the model reads {{ this }} (else a blind append); default when no unique_key |
merge (upsert) |
✅ | update matched + insert new, on unique_key; default with unique_key |
insert (insert-only) |
✅ | insert new keys only (idempotent / dedupe) |
merge_update_columns |
✅ | update only the listed columns on match |
merge_exclude_columns |
✅ | update every column except the listed ones |
incremental_predicates |
✅ | AND-ed into the merge condition (merge strategy) |
merge_update_condition / merge_insert_condition |
✅ | honored as delta_rs per-clause predicates (gate which rows update / insert) |
on_schema_change='append_new_columns' |
✅ | new columns added via delta_rs schema evolution |
on_schema_change='fail' |
✅ | raises if the model's columns drift from the table |
partition_by |
✅ | Delta partition columns |
on_schema_change='sync_all_columns' |
⚠️ | add-only — delta_rs can't drop columns |
delete+insert |
✅ | true delete+insert (duplicate-tolerant): delete the matched keys, insert every incoming row, committed as one fenced overwrite pinned to the version read (delta_rs has no two-commit delete+insert) |
microbatch strategy |
✅ | per-batch atomic replaceWhere on the event_time window (single Delta commit, snapshot-pinned) |
merge_clauses / merge_update_set_expressions / merge_on_using_columns |
❌ | dbt-duckdb-specific, no delta_rs equivalent — rejected with a clear error, never silently ignored |
| model contracts — column name/type/count | ✅ | enforced via dbt's assert_columns_equivalent preflight before the write |
constraints — not null |
✅ | pre-write guard on the staged rows; a null fails the run and leaves the prior table intact |
constraints — check / primary_key / foreign_key |
❌ | not enforceable against a delta_scan view; declared but not checked |