2.0.11
Released November 03, 2026
Features
- Add support for BigQuery query reservation configuration at model and connection levels (#15486)
- Report whether each node ran remotely, locally, or on Lake Compute in anonymous usage telemetry.
- Show a determinate progress bar for the parse phase in interactive terminals, matching the render/analyze/run experience, and name the stage in progress (building model nodes, resolving data tests, typechecking macros) during the stretches where no assets are being parsed, plus a progress indicator while the semantic manifest is validated, so the console no longer looks idle
- Rename the --run-cache-mode CLI flag to --state-mode to match the dbt State terminology it configures. --run-cache-mode is kept as a deprecated alias and will keep working, with a warning, until it is removed in a future release.
- Add state configuration to ignore external modifications on model target tables/views (only implemented for views to begin with)
- Support the
allow_jinja_file_extensionsproject flag, so resource files may carry a trailing Jinja suffix (model.sql.j2,doc.md.j2) (#16296) - Add telemetry for state selector operations to track performance and usage of modified/new/unmodified node selection
- Support authenticated private S3 downloads for dbt update manifests and binaries.
- Add DBT_CLOUD_LOGIN_HOST (and optional DBT_CLOUD_LOGIN_ACCOUNT_ID) so dbt login can authenticate through an account host's /oauth/authorize instead of the registration page, for SSO accounts the registration page cannot route.
- [docs v2] Add resource filter to lineage view to select what resource types are displayed in the DAG
- Add a feature flag registry with
--feature NAME[=VALUE]andDBT_ENGINE_FEATURESfor setting unstable features; behavior flags and the git deps fast path now resolve through it with unchanged defaults - Add the ThreadPoolWait telemetry span for runtime pool queue waits, superseding ConnectionLimitWait
- Report individual microbatch executions as MicrobatchEvaluated spans in telemetry, file logs, and Core-compatible JSON logs, and list them under their model in interactive output
- Thread pool wait spans now record the unique_id and batch_id of the node or microbatch they belong to
- Read and publish AWS Databricks Unity Catalog tables through Lake Compute using profile PAT or OAuth M2M credentials. Use canonical lower-case relation names and full-refresh existing models when adopting propagation with mixed-case database or schema names.
Fixes
- Fix modules.re functions silently dropping keyword arguments (flags=, maxsplit=, count=) (#15508)
- Emit only changed columns in Databricks column-tag alter diffs (#16246)
- Emit only changed keys in Databricks relation-tag SET TAGS diffs (#16248)
- Emit only changed Databricks column-tag keys in ALTER COLUMN SET TAGS diffs (#16272)
- Implement TableRepr methods index_of_value_in_column and count_occurrences_of_value_in_column to fix Fusion panic in dbt_utils.get_query_results_as_dict()
- Copy config.group onto the top-level group for source and singular tests, matching dbt-core (#15930)
- Snowflake interactive_table: correct the dbt1005 message for an invalid cluster_by — every entry must be non-blank, not just one
- Make insert_gateway_label idempotent so gateway host resolution no-ops when the label is already present, instead of relying on a caller-side guard
- Set tags on operation nodes so on-run-start/on-run-end hooks are discoverable when running dbt-core with --use-v2-parser (#16310)
- Allow integer
attributein thesort,join,unique, andgroupbyJinja filters (e.g.sort(attribute=0)), matching Jinja2 behavior - Match BigQuery snapshot check columns without regard to case to avoid false row changes.
- Keep the existing Databricks table when a view model that replaces it fails to build without use_materialization_v2 (#16476)
- A unit test that overrides one package macro (my_package.my_macro in overrides.macros) no longer makes the package's other macros undefined, matching dbt-core (#16477)
- Support
exposurein the list command's--resource-typeoption (#16224) - Require matching existing and target relation types for Databricks view_update_via_alter updates (#16538)
- Fix a panic when the project directory is on a Windows network share (UNC path or mapped network drive) (#16428)
- Unit tests with
overrides.varsno longer drop project vars; overrides layer over--varslike dbt Core var.has_varnow also reports vars passed with--vars, matching dbt Core- Sidecar: Fixed interpolated values for getting relation info
- docs-v2 source detail page showed the first table's description instead of the source's own
- Refresh an account-scoped OAuth session when a server rejects an access token before its cached expiry.
- Validate refreshed OAuth credentials against the cached account and host before persisting.
- Preserve Snowflake nested JSON fixture escapes and heterogeneous array values during local execution.
- Commit a rebuilt metadata index only once every table has been written, so a write that fails partway through leaves the previous index in place instead of a mix of new and stale files.
- Add copy_grants support to Snowflake dynamic tables
- Find user-installed dbt executables and Windows virtual environments reliably.
- Fix the
Downloading relationsprogress bar rendering as a stuck 0/N bar. Adapters with no per-item progress reporting now render a spinner instead; Snowflake now reports real per-schema progress so its bar fills as expected - Replace
DBT_AI_PROVIDERwithDBT_ENGINE_AI_PROVIDER(#16312) - The environment variables behind
--generate-info-schemaand--info-schema-dirare nowDBT_ENGINE_GENERATE_INFO_SCHEMAandDBT_ENGINE_INFO_SCHEMA_DIR. They were namedDBT_GENERATE_INFO_SCHEMAandDBT_INFO_SCHEMA_DIR, outside the reservedDBT_ENGINE_prefix that the engine's other variables use. The flags themselves are unchanged. - Setting
DBT_ENGINE_AI_PROVIDERno longer aborts the invocation. The variable was moved onto the reservedDBT_ENGINE_prefix without being registered as a known engine variable, sovalidate_engine_env_varsrejected it as user-authored and every command that reached setup exited 1 with dbt1005. - Support credential-independent profile metadata and scoped environment values while preserving secret access rules.
- Match BigQuery partition fields case-insensitively when inspecting existing tables (#14646)
- Accept compute_region and legacy dataproc_region together in BigQuery profiles.
- Populate complete query tags for Databricks seeds; fix materialization type for seeds to be
seedrather thantable(#15931) - BigQuery unit tests no longer leak partition pseudocolumns into expected results (#15357)
- Fix broken image links in documentation (#16288)
- Protect Windows process environment variables from project .env overrides.
- Replace deprecated DuckDB single-arrow lambdas with Python-style lambda syntax.
- Reuse cached relation metadata when checking stale views during development cloning.
- Honor valid dbt Core-generated package lock checksums for common package declarations with best-effort compatibility.
- Correct how dbt State classifies model materializations: materialized views submit as VIEW, adapter-specific materializations such as dynamic tables and metric views submit as DBT_CUSTOM (and are therefore no longer eligible as clone candidates), semantic views are no longer submitted, and full-refreshed snapshots submit as FULL
- Databricks: include all models in catalog.json for schemas with more than 50 relations (#15795)
- Report the effective dbt State defer-to target, honoring a target's
defer_to_target, instead of always reporting the default. - Order a unit test's render after the seed that materializes an overlapping source, so dbt build no longer reads the relation before the seed has created it. This ordering now also holds when the tested model is not selected, for example when only the seed and the unit test are selected
- Preserve BigQuery GEOGRAPHY, TIMESTAMP, and JSON types in dbt OSS unit test fixtures (#16410)
- Exempt ad-hoc inline (preview) nodes from the model access check, so
dbt show --inlineanddbt compile --inlinecanref()a private or protected model - Fix Redshift OAuth authentication failures with an updated ADBC driver.
- Add new STRUCT and ARRAY columns to BigQuery snapshot tables with their SQL types instead of
RECORDor the array's element type (#16350) - Keep the microbatch event-time filter on relations derived from a ref with include(), quote(), replace_path(), incorporate() or without_identifier() (#16383)
- Refresh persisted unit-test given fixture schemas so warehouse DDL changes are reflected.
- Send Redshift's case-sensitive sqlglot dialect setting to the server when enable_case_sensitive_identifier is enabled
- Fix DuckDB seeds defined in packages failing to load because the CSV path duplicated the package directory.
- Add duckdb__date dispatch macro so dbt.date() / dbt.date_spine() work on DuckDB targets
- Retry transient Redshift query-execution errors (catalog races, serialization conflicts) on the same connection
- Warn on missing persist_docs columns for Databricks table, incremental, materialized view, and streaming table; fix V2 column comments being gated on the wrong persist_docs config key
- Snowflake incremental models on catalog-linked databases (e.g. Glue) no longer fail on
DROP TABLE ... CASCADEof the__dbt_tmprelation - Time Machine replay: rebuild the relations of a recorded
list_relations_in_parallelresult instead of replaying every listed schema as empty, so--deferno longer treats nodes present in the dev schema as absent and re-points their refs at the deferred relation - Time Machine replay now preserves Snowflake column precision/scale (e.g. NUMBER(38,6), TIMESTAMP_LTZ(6)) so unit-test fixture SQL matches the recording
- Finalize invocation telemetry when execution ends even if background workers retain descendant spans.
- Fix DuckDB and Databricks incremental/snapshot builds panicking with an unhandled Arrow BinaryView type on BLOB/binary columns (#16364)
- Include the underlying cause in package hub and tarball request errors, and stop reporting a 500 status when no response was received
- Auto-exposures discovered from BI tools now carry the target's adapter instead of defaulting to Snowflake, so non-Snowflake projects no longer fail selection with dbt1005 'selected nodes need adapters the target does not declare'
- Stop emitting the
with connectionclause for BigQuery Iceberg tables usinglakehouse_catalog(LRC) whenuse_catalogs_v2is left at its default. - Inline SQL and CSV unit-test fixture file contents into the parsed manifest and resolve fixtures in dependency packages. (#16354)
- Respect project-level overrides of create_schema and other adapter macros invoked from Rust. (#16346)
- Avoid unsafe CREATE OR REPLACE TABLE operations in BigQuery incremental and snapshot materializations. (#15953)
- Fix BigQuery incremental models being recreated instead of merged when a concurrent table drop makes a dataset listing fail
- Skip per-table metadata when hydrating the BigQuery relation cache through ADBC GetObjects. (#16425)
- BigQuery freshness checks are now faster and safer. Freshness scans for different schemas now run at the same time. Freshness checks for the same schema and different nodes now share one request.
- Strip CR and BOM from PEM-headered Snowflake private keys so keys saved with Windows line endings decode correctly (#15107)
- Snowflake seeds now honor the
transientconfig instead of silently creating a permanent table - Fetch the tested model's schema for incremental unit tests with static analysis enabled instead of failing with dbt9002
- Process explainer GetExplainMessage requests in batches.
- Preserve BigQuery decimal and nested types in unit test fixtures (#16440)
- Correct the
dbt show --infohelp text, which still said a prior--generate-info-schemarun was required - DuckDB unit test fixtures for TIMESTAMP WITH TIME ZONE columns are no longer cast to a naive timestamp, which previously dropped the offset and shifted the value by the session timezone (#16470)
- Fix dbt-dist recursion on version manager shims (#16537)
- Fix
--write-indexand--dirtyruns missing files added since the last parse: new models, seeds, macros and other resources are now loaded,--dirtyselects newly added SQL models and analyses, and--no-partial-loadnow turns off the cached-state shortcut. - Honor OS-assigned loopback ports in OAuth authorization and token-exchange callback URLs.
- Recognize
$$...$$dollar-quoted strings in the Databricks SQL lexer so a;inside a metric view's YAML body (e.g. in acomment:block) no longer truncates the compiledcreate or replace viewDDL. (#16385) - Return an empty column list when Databricks get_columns_in_relation targets a missing hive_metastore relation (#16472)
- Clarify the warning for a package-lock.yml written by an older dbt version and point to
dbt deps - Removed lingering 'dbt' naming from parse-failure and warn_error_options log output, and pointed the parse-failure suggestion at the dbt v2 upgrade guide.
- Bring Databricks macros in line with dbt-databricks v1.12.4
- Fix nil pointer dereference panic in BigQuery foundry driver
- Add ability to record seeds as transient table types for Snowflake
- Convert Arrow FixedSizeList values to Jinja so Snowflake VECTOR columns do not panic when read into an agate table.
- Databricks Python models: wait for the all-purpose cluster to be running before creating the execution context, surface Command API error messages, and stop warning on an unset timeout
- Bump lake compute driver to enable jwt authentication users to no longer need a background pat to be generated.
- Repeating a single-value flag such as
--targetor--debugkeeps the last value instead of failing with a usage error, matching dbt Core. - Send allow_clones, is_defer_to_profile, and defer_enabled on dbt State submit requests for explainer parity
- [Redshift] Fix issues with external OAuth breaking for multi-threaded execution (#15555)
- Write
warn_error_optionstorun_results.jsonargs, matching dbt Core. - Databricks: views and metric views under an iceberg catalog no longer fail with 'materialized must be incremental, table, or seed' when catalogs.yml v2 is enabled. (#16474)
- Stop panicking on Jinja AgateTable comparisons; compare tables by identity like dbt 1.x (#15920)
- Fix
model.resource_typereturning model for all resource types during parse (#16637) - Build source relations the same way as
source(), so they skip the adapter's max identifier length check (matching dbt Core) and usecatalog_nameas the database - Fix BigQuery table models being dropped before every rebuild when a cluster_by entry is backtick-quoted or differs in letter case from the stored column
- Restore connection wait telemetry for runtime pool contention on task operations.
- Include semantic_manifest.json in the artifact ingest upload when the run writes it
- A microbatch model's idle time and duration no longer overcount waits of its concurrent batches; the model is idle only while none of its batches runs
- After a concurrent microbatch batch fails, batches not yet started are canceled instead of running after their model has failed
- Verify TLS certificates against the operating system's certificate store instead of a bundled CA list, so HTTPS connections work behind TLS-inspecting proxies whose CA is only installed in the OS store.
- Always mark reused passing dbt State tests as reused in run results.
Under the Hood
- Refresh README with a dbt v2.0 DAG screenshot stored in
assets/and point the CI badge at the currentdbt-labs/dbtworkflow. - Allow metadata freshness checks to use an explicit artifact directory.
- Allow base Jinja context builders to reuse a caller-provided ResultStore.
- Log a warning naming the relation when no schema is returned for a dangling source during static analysis hydration, instead of skipping it silently.
- Reuse the parsed Jinja AST when extracting unrendered config() arguments.
- Extend package metadata with cross-project environment routing fields.
- dbt-parser: avoid a second, redundant Jinja parse when statically recovering source() calls hidden in a conditional branch during model, function, and singular data test rendering
- Add a per-resource-type applicability table for adapter-specific config keys, replacing the shared WarehouseSpecificNodeConfig field list with per-(resource type, key) status. A key set on a resource type that does not support it now emits a DeprecatedConfigKey warning. On schema.yml and inline config() the key is still applied, so behavior is unchanged; in dbt_project.yml, where the key has no field to deserialize into and already warned, it is dropped.
- Time Machine replay pins the Jinja wall clock to the recording start, so wall-clock-derived SQL (e.g. a
utcnow()-based var) matches the recorded text - Add force closing of span subtrees to dbt-tracing, ending a span's structured telemetry even while other handles to it or its descendants are alive.
- docs-v2: document the overview landing-page customization block in the README
- Ignore
flags:in installed packages'dbt_project.yml: project flags, including behavior change and adapter behavior flags, only apply from the root project
Dependencies
- Update ADBC drivers to Snowflake 0.21.21, BigQuery 0.21.23, BigQuery Foundry 0.1.11, Databricks 0.21.15, Redshift 0.18.11, Spark 0.1.4, DuckDB Extended 0.0.32, Lake Compute 0.1.13, and MSSQL 1.7.1 (dbt build suffixes).
Security
- Pass git package URLs, revisions, and subdirectories to git after
--indbt deps - Harden Databricks logged-SQL credential redaction: match
credentialandencryptionclauses case-insensitively, redact every clause rather than only the first, and correctly handle option values containing commas, newlines, quotes or escaped quotes and keys containing dots. (#16053) - Checks and
dbt show --info/--inlinenow run in a DuckDB database that can read only the project metadata: no other files, no network access, and no extension installs - Upgrade gix to 0.84.0 to address security advisories in the gix dependency family.
- Update BigQuery and Spark ADBC driver builds to Go 1.26.10.
- Update rustls-webpki to 0.103.16 and webpki-root-certs to 1.0.10 to reject distrusted certificate chains.
Contributors
- @HannanNaeem (#16296, #16428)
- @Jules-G1
- @Oliver-Weng-Sorcerer
- @ShaneMcGovern (#16224)
- @TIHan
- @VaggelisD
- @aahel
- @aiguofer (#16310)
- @ajhlee-dbt (#16288, #15555, #16637)
- @akbog
- @alex-mirkin (#16383)
- @ayshukla
- @b-per (#16364)
- @chayac
- @claude
- @dataders
- @dbeatty10 (#16312)
- @debrin-og (#15931, #15795, #15920)
- @eakmanrq
- @eliasdefaria
- @ernestoongaro
- @felipecrv
- @fivetran-bradbeggs
- @fivetran-chadboyd
- @fivetran-vladimircvetanovic
- @itsannbat
- @itsnamangoyal
- @izeigerman
- @j-clemons (#16537)
- @j19s84
- @jasonlin45
- @jeremyyeo
- @jess-scott
- @joaodaher
- @kczimm
- @larspettermadsstuen (#15930)
- @lottaquestions (#16354, #16346, #16470)
- @luc-pimentel (#16477)
- @mach-kernel (#16410, #16440)
- @max-ostapenko (#15486)
- @mishamsk
- @r-jais (#15107, #16385)
- @ragesh-g (#14646, #16350, #16472)
- @sadboy
- @sd-db (#16246, #16248, #16272, #16476, #16538)
- @serramatutu (#15357)
- @srchilukoori (#15508)
- @toriwei
- @vchan
- @versusfacit
- @vrongmeal (#16053)
- @will-sargent-dbtlabs (#16474)
- @xuliangs (#15953, #16425)