dbt OSS changelog
All notable changes to this project will be documented in this file.
- This file covers dbt OSS v2.0. For changelogs for other dbt Engines, refer to:
- Changes are listed under the (pre)release in which they first appear. Subsequent releases include changes from previous releases.
- "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version.
- Do not edit this file directly. This file is auto-generated using changie. For details on how to document a change, see the contributing guide.
2.0.5
Released September 18, 2026
Fixes
- Both Legacy/Foundry BigQuery drivers now continue on ADBC.GetObjects 404/403. This fixes a possible usage of "REPLACE TABLE" instead of "MERGE" for incremental tables (#16331)
Contributors
2.0.4
Released September 16, 2026
2.0.3
Released September 15, 2026
Under the Hood
- Add PyPI banner for dbt-oss mirroring the existing dbt-core banner, without the dbt-core namespace deprecation notice
Contributors
2.0.2
Released September 15, 2026
Fixes
- Restore the bundled docs UI in the Python wheel builds, so
dbt docs generate produces a working docs site again for pip-installed dbt.
Contributors
2.0.1
Released September 14, 2026
Under the Hood
- Attribute --infer-schemas columns from declared YAML schema before binding via a CatalogProviderList wrapper, instead of mixing them into InferSchemaRegistry
Contributors
2.0.0
Released September 14, 2026
Features
- Install agent skills (AgentSkills-format
SKILL.md directories) from installed packages and the project's own skill-paths when packages are installed, gated on the new ai_provider flag. (#14556)
- Support native Databricks metric view materializations (#15616)
- [ClickHouse] Connection-level settings (profile custom_settings plus v1-parity synchronous-operation defaults), default database wired to the profile schema, literal '?' in SQL, and dbt identified as
dbt/<version> in the HTTP User-Agent (system.query_log.http_user_agent), via the new adbc_clickhouse driver (#14585)
Fixes
- Preserve compiled SQL output for inline compile commands in quiet mode (#14538)
- Fix the dbt-docs-server Docker image: it now downloads a released dbt binary from the dbt-core GitHub Releases and verifies it against the release's published SHA256SUMS, tracking the newest release carrying a Linux binary instead of pinning a stale version (override with
--build-arg DBT_VERSION=). The documented docker build command now works verbatim from either the repo root or the crate directory, a .dockerignore keeps the build context empty, and the image is multi-stage, multi-arch, health-checked, and runs as an unprivileged user. (#15856)
- Rename dbt v2 CLI branding from Fusion/dbt-core to dbt (proprietary) and dbt-oss (OSS), updating --version/--help output and several Fusion-branded warning/error messages to say dbt instead.
Contributors
2.0.0-rc.2
Released September 08, 2026
Features
- [ClickHouse] dbt unit tests are supported; multi-statement SQL containing ClickHouse backslash escapes is now split correctly by the statement splitter (#14585)
- [ClickHouse]
table now compatible with MVs (mv_on_schema_change defaults to fail, repopulate_from_mvs_on_full_refresh replays the MV queries), materialized_view supports on_schema_change, in-place refresh-schedule updates (MODIFY REFRESH) with safe transition errors, multi-MV update/rename flows and refreshable: false, and projections accept the index form with up-front validation. (#14585)
- Add beta support for the Snowflake interactive_table materialization, covering static and dynamic interactive tables and config-change detection for target_lag and warehouse settings (#11798)
Fixes
- Respect full refresh when view_update_via_alter is enabled for Databricks views. (#14359)
- Keep column metadata local to each column instead of inheriting parent resource metadata. (#16097)
- Detect Databricks materialized view query changes and require full refresh when compiled SQL changes (#16123)
- Skip Databricks get_relation_config tag and column-tag metadata queries when the model does not configure tags (#16057)
- Fix state:modified missing a snowflake_interactive_warehouses-only config change, which could cause a --select state:modified run to skip a model whose interactive-warehouse attach/detach reconciliation needed to run
- Fix blank or whitespace-only refresh_warehouse/snowflake_warehouse values being treated as configured, which could bypass interactive_table's target_lag warehouse validation and render an invalid warehouse = clause in generated DDL for both interactive and dynamic tables
- Fix cluster_by change detection for Snowflake dynamic and interactive tables: strip the LINEAR type descriptor SHOW DYNAMIC TABLES wraps cluster_by in, and compare quoted identifiers case-sensitively instead of folding them
- Strip double-quote delimiters from a warehouse name before comparing it case-insensitively during dynamic/interactive table configuration-change detection: SHOW never echoes the quotes back, so a quoted warehouse value never compared equal to its own readback and fired a spurious ALTER on every run
- Treat a single-quoted string literal inside a clustering expression (e.g. to_char(ts, 'MON')) as case-sensitive data during configuration-change detection: the surrounding expression text was folded correctly, but a literal's exact case, and any )/, characters embedded inside it, previously corrupted the comparison and could cause an unnecessary full refresh on every run. Live-verified against Snowflake
Contributors
2.0.0-rc.1
Released September 02, 2026
Features
- Add Exasol adapter (Phase 1): connection/auth with TLS and timeout profile options, metadata adapter, agate/seed type conversion (incl. HASHTYPE) and typed SQL literals, reserved-keyword auto-quoting, and the full macro bundle — materializations (table/view/incremental append·merge·delete+insert·microbatch), snapshots (timestamp/check, hard deletes), model contracts and constraints, on_schema_change, grants, persist_docs for tables and views, catalog generation, source-freshness, cross-database utils (dateadd/datediff/last_day/hash/bool_or/listagg/safe_cast/equals/split_part), distribute_by/partition_by/primary_key configs, and interactive dbt init setup
- Add Databricks query tags with automatic dbt metadata and profile- and model-level configuration. (#15701)
- Fusion accepts Databricks Python environment_key and environment_dependencies and uses them on serverless job submit (https://github.com/databricks/dbt-databricks/issues/1636). (#15966)
- Add parse-safe views (dbt.graph_nodes, dbt.models, dbt.seeds, dbt.tests, dbt.snapshots, dbt.sources, dbt.analyses, dbt.operations, dbt.functions, dbt.columns) so standalone querying of an exported index (views.sql) never silently exposes a compile-only or never-populated column at parse time.
- [ClickHouse] New configs available: definer, sql_security, inserts_only. Available but not working yet: projections, codec. (#14585)
- [ClickHouse] Model settings and query_settings configs now render into DDL, and version-gated DDL uses the real server version via a once-per-process probe. (#14585)
- [ClickHouse] clickhouse_s3source() renders the s3() table function, and model contracts are enforced end-to-end (constraint rendering, per-column codec/ttl, real column types). (#14585)
- Track ref()/source()/this call provenance during Jinja rendering (on_this_reference listener hook), powering the dbt.hard_coded_reference (DBT05) lint rule (#16080)
- [ClickHouse] Incremental strategies now resolve and validate exactly like the Python adapter (delete+insert, insert_overwrite, microbatch), and on_schema_change (fail/append_new_columns/sync_all_columns) works on incremental models with codec-aware ALTERs. (#14585)
Fixes
- Fix regression in log-format-file use (#15685)
- Allow Databricks incremental models to use
delete+insert with correctly quoted unique keys (#15250)
- Include invocation IDs in default Databricks query comments and preserve run-operation connection names (#15689)
- Disambiguate generated generic-test SQL asset paths on name collisions so tests on different models/columns that flatten to the same generated name are no longer silently dropped from the manifest
- Stop the v2 parser emitting a null
macros key for unit tests that set overrides without macros, which made dbt-core fail to deserialize the fusion-produced manifest (#16009)
- Accept sequence-valued column_types, mapping-valued event_time, scalar policy_tags, and the legacy data-paths alias to match dbt-core's YAML config acceptance
- Preserve declaration order when rendering Databricks table properties (#16036)
- Databricks: emit INSERT BY NAME REPLACE WHERE only when DBR 18.0+ supports the combination, and warn when insert_overwrite cannot honor REPLACE ON on older clusters (#15999)
- The download-at-install sdist now declares the runtime dependencies and
requires-python of the wheel it installs, so uv pip install dbt-core/dbt-oss no longer produces an unimportable package
- Apply Databricks model and column constraints only when contract.enforced is true (#16056)
- Accept the config value shapes dbt Core tolerates but Fusion rejected - mapping-valued constraints, list-valued dist, and unquoted YAML 1.1 booleans (yes/no/on/off) in contract.enforced, contract.alias_types, docs.show, and the BigQuery partition_by booleans
- Keep a singular test that refs a disabled model in the manifest nodes with enabled=false, and stop emitting a user-visible NodeNotFoundOrDisabled warning for it, matching dbt-core
Under the Hood
- The oss CLI now builds as a binary named
dbt instead of dbt-sa-cli (build output is at target/<profile>/dbt)
- Pre-release
dbt-core sdists (2.x and up) now print an install-time notice pointing at the dbt and dbt-oss distributions
Security
- Skip symlink, hard link, and device entries when extracting package tarballs instead of extracting them as-is
Contributors
2.0.0-beta.2
Released August 18, 2026
Features
- Add support for ClickHouse Dictionary materialization (#14580)
- Clickhouse: Add more settings and missing internal methods (#14587)
- Add support for ClickHouse's index definition (#14583)
- [dbt-fusion] (fabric) support
authentication: ActiveDirectoryAccessToken, authenticating with a pre-minted Entra bearer token from the access_token profile field (#15926)
- Add relation-scoped catalog macro (get_catalog_relations) for ClickHouse, fixing catalog fetch failures with --write-catalog (#14585)
- Seed data types are not Nullable for ClickHouse. Fix incorrect primary key declaration when configured as a list' (#14585)
Contributors
2.0.0-beta.1
Released August 10, 2026
Features
- Provide option of using default profile.yml during init
- Allow continue running children on parent error
- Implement selector selector method
- Support overloaded UDFs via overrides block in function YAML
- Implement dbt state explain in Fusion
- Test optimization to skip provably redundant tests
- Add
cargo xtask apply-ci-goldies to fetch CI logs via gh and apply golden-file patches onto the current worktree.
- Support Databricks Azure service principal (Microsoft Entra ID) authentication via
azure_client_id/azure_client_secret (auth_type azure-client-secret), matching dbt-core/dbt-databricks
- Add Docker and docker compose support for self-hosting the dbt docs server (dbt docs serve)
- Clickhouse: Add missing configurations for ClickHouse table materialization (#14585)
- Add --infer-schemas, --skip-type-checking, and --show-sources flags for catalog-free binding to bind SQL without introspection.
- Support pseudocolumns (e.g. BigQuery's _FILE_NAME) in unit tests
- Add machine-readable JSON output for dbt --format json --version
- Add the dbt.import_ctes (DBT01) lint rule, requiring every ref()/source() to be imported through a top-level CTE
- Add opt-in Redshift grants support for groups and roles
- Support dbt node selection (--select/--exclude/--selector) for lint and format in both symbolic and rendered render modes
- Add unit tests to the Jinja graph object
- Add error_code and error_message fields to the dbt login Vortex telemetry event
- dbt State: speculatively submit models, snapshots, and data tests while the dependency last-modified prefetch is still in flight, so nodes no longer block on the full prefetch before a cache decision
- Report the dbt invocation ID (and dbt platform run ID when present) with dbt State telemetry so runs can be correlated end to end
- Skip provably redundant accepted-values data tests
- Add undocumented
dbt internal get-distribution-info command for resolving dbt release-channel and distribution info, falling back to <dbt> --version to infer generation and distribution when a target dbt doesn't support the command itself. --all now discovers every dbt on PATH concurrently and skips the doomed internal probe for non-native (script) installs, cutting multi-install discovery time substantially. Each probe is now bounded by a wait/graceful-terminate/forceful-kill timeout so a hung or badly-behaved dbt on PATH can't stall or block discovery indefinitely. When a Homebrew-tap conflict identifies an already-installed dbt Cloud CLI, get-distribution-info now also reports its uninstall command
- When a Snowflake metadata warehouse is configured, dbt State now fetches table last-modified freshness metadata with one query per schema in parallel (bounded by the configured thread count), instead of running the per-schema dumps sequentially
- Support dbt State configs on snapshots and data tests
- [BigQuery] Link to docs for Storage API errors (#15544, #13600)