Defer_relation panic fixed; catalog_database overrides added
v2.0.0-alpha.5
5 features2 enhancements30 fixesThis release5 featuresNew capabilities2 enhancementsImprovements to existing features30 fixesBug fixesAI-tallied from the release notes
From the original release noteView original ↗
2.0.0-alpha.5
Released July 20, 2026
Features
- Migrate Redshift catalog macros to SHOW TABLES and SVV_REDSHIFT_COLUMNS when datasharing is enabled, so catalog generation works for cross-database relation
- Adds
defer_job_idsupport viaDBT_CLOUD_DEFER_JOB_IDenv var. When set alongsidedefer_env_id, appends?job_id=to the manifest download URL for job-specific deferral. - Add catalog_database support to v2 catalogs.yml: when set, catalog_database takes highest priority in generate_database_name over model database config and target.database. Uses the existing build_catalog_relation pattern — no new adapter method. Supported for Snowflake (all types), BigQuery (biglake_metastore), and Databricks (unity, optional, falls back to catalog_name).
- Fire telemetry event on static analysis propagation completion
- Add POST /api/v1/analytics/events relay endpoint (docs v2 → Vortex)
- docs analytics: add distribution field and hydrate server-authoritative fields (distribution, dbt_version, is_logged_in, dbt Cloud IDs) on POST /api/v1/analytics/events
Fixes
- Populate defer_relation on graph.nodes entries (models, snapshots, seeds) so node.defer_relation works in Jinja, matching dbt-core
- Correct defer_relation wire shape on graph.nodes to match dbt-core's DeferRelation dataclass (drop unique_id, add description/compiled_code/meta/tags/config)
- Prevent panic when calling
insert()on a mutable list with an out-of-bounds index; return a proper template error instead. This was the primary panic causing cascadinglock poisonedpanics in minijinja'sMutableVec. - Parse-time
config.get(name)now matches dbt-core'sParseConfigObject.get(core/dbt/context/providers.py:554) by returning""for every key exceptmeta. Themetakey keeps a permissive chainable stub (ParseConfigValue) so dbt-autofix's recommendedconfig.get('meta').custom_keymigration pattern (seedbt-autofix/manual_fixes/custom_configuration.md) keeps working during Fusion's static-analysis compile of materialization bodies. Separately,adapter.get_relationnow coercesNone/Undefinedargs to""at the strict&strunwrap so the compile-phaseCompileConfig.get('database')→Nonepath (mirroring Python'sRuntimeConfigObject.get) flows through without crashing the prefetch-recording call. Together this unblocks the Anisi customer project (account 303 / project 3580) whosesnowflake_external_tablematerialization indbt_external_tablescallsadapter.get_relation(database=config.get('database'), ...). Broader audit of where the sameNone-tolerance coercion belongs across other adapter methods is a follow-up dbt-core ↔ dbt-fusion parity investigation. - Add +resource_tags config support for seeds and snapshots in dbt_project.yml
- stop using schema cache (prefetch at parse time) for adapter.get_columns_in_relation if it's using in a selected node without using strict static analysis.
- Resolve event_time from seed and snapshot inputs for microbatch models (matches core v1)
- dbt State view reuse during full-refresh runs
- Generic test nodes with long names no longer have empty depends_on.macros in the manifest
- Spark: fix schema existence and listing on the Hive metastore.
check_schema_existsnow resolves viashow databasesinstead of the nonexistentinformation_schema.schemata(fixing snapshots and other guard-then-create paths), andlist_schemasreads theshow databasesresult column name-agnostically (namespaceon OSS Spark,databaseNameon Databricks). Databricks behavior is unchanged. - Implement symbolic linter
- Replace panic with a user-facing error when an exposure depends_on entry does not resolve to a ref(), source(), or metric() call
- Improve the Snowflake dbt State metadata error when database or schema is empty.
- model.original_file_path now resolves to the correct path in Jinja macro context during parse phase instead of returning '.'.
- persist_docs: warn about and skip columns documented in YAML that are not present in the database, instead of failing the model build or silently mis-applying column comments (ports dbt-labs/dbt-adapters#1690)
- Stop /api/v1/health from leaking the absolute index_dir path; replace with project_loaded + generation (snapshot timestamp) and an X-Docs-Generation header
- Reduce dbt State auth token request timeout to 15 seconds and retry transient auth service failures.
- Add graceful shutdown/drain to dbt docs server so rollout restarts don't reset in-flight readers
- Implement
normalize()on pytz timezone objects so unit-test fixtures usingmodules.pytz.timezone(...).normalize(...)parse instead of failing with an opaquedbt1013deserialization error - Treat an empty or zero-byte selectors.yml as no selector definitions, matching dbt Core behavior instead of raising SelectorError dbt1600
- Analysis nodes now have compiled, compiled_code, and compiled_path populated in the manifest after dbt compile
- state:modified no longer flags models whose persist_docs config is set as environment-aware Jinja.
- Include YAML-supplied generic test config in manifest raw_code.
- Restore the Snowflake warehouse using its canonical upper-cased name (matching dbt Core's
current_warehouse()-based restore), so per-modelsnowflake_warehouseoverrides no longer cause record/replay SQL mismatches - Snapshots no longer appear in their own depends_on.macros; fixed by skipping self-referential macro dep recording in the DAG listener
- LSP fix deferral for show (preview CTE) and compile file (#14542)
- Match Python re.sub behavior for empty regex matches in dbt Jinja modules.re.
- Bump Snowflake Driver to 0.21.14 to fix Timestamp Freshness
- BigQuery: treat 403 access-control failures (missing bigquery.datasets.create IAM permission or VPC Service Controls policy violations) as ignorable permission errors during schema creation, matching dbt-core; runs against centrally-provisioned datasets in governed/VPC-SC environments no longer fail on the eager CREATE SCHEMA step
- BigQuery unit tests: fixture values that are SQL expressions for STRUCT or GEOGRAPHY columns (e.g. STRUCT(...), ST_GEOGPOINT(...)) are now injected verbatim instead of being single-quoted as string literals, so BigQuery can CAST them to the target type; matches dbt-core
- Bump pyo3 workspace dependency from 0.27 to 0.29 to support Python 3.15 in CI runner images
- Fix a client-cancellation panic in the Snowflake ADBC driver on long-running queries.
- Resolve project flags case-insensitively in the Jinja flags context so a flag set in dbt_project.yml is reachable whether a macro reads it lower-case or upper-case, matching dbt Core
- Fix
show --inlinebroken when root package is disabled - Redshift POSIX regex-negation operators
!~and!~*no longer raise a false-positive dbt0101 SyntaxInvalid diagnostic (#15249) - Report cached dbt State data tests attached to unchanged views as no-change reuse.
- Stop raising a false
dbt1159"Test cannot have the same key '<key>' at the top-level and in config" when a data test has a top-level config key (e.g.where) and aconfig:block that does not set that key - state:modified no longer flags data tests whose schema.yml config uses environment-aware Jinja (where/severity/tags/meta), and now correctly detects genuine changes to a test's where/limit/severity: data tests join the wholesale unrendered_config comparison (dbt-core#15286).
- Remove synthetic materialization macro call coordinates from runtime error locations.
- Filter synthetic snapshot macro uids (snapshot.<pkg>.snapshot_<name>) from depends_on.macros in snapshot nodes; these Fusion-internal uids never appear in manifest.macros and caused a dangling reference.
- Fix unit tests on Redshift failing with an internal error (SQLSTATE XX000) when the tested model uses QUALIFY
- state:modified no longer flags seeds or snapshots whose config uses environment-aware Jinja (e.g. persist_docs, quote_columns, grants, meta), and now correctly detects genuine changes to a snapshot's meta while no longer over-selecting snapshot group-only changes: seeds and snapshots join the wholesale unrendered_config comparison (dbt-core#15286).
- Allow default generic tests to aggregate and render task-time aggregation SQL
- Prevent dbt State metadata MapReduce from stalling behind a speculative connection attempt after worker results are ready.
- Normalized back-slashes to forward-slashes for path, original_file_path and patch_path
- state:modified — retire the per-key unrendered config grafts for models and sources
- Support meta_get on Jinja map values that represent dbt node configs.
- Support context-backed Jinja map caches that use get and update.
- state:modified for data tests now follow dbt-core
TestConfigkey allowlist - Report an accurate, path-normalized error when a local: package cannot be resolved: distinguish a missing package directory ("Package directory not found") from a directory that lacks a dbt_project.yml, resolve
..segments in the reported path, and add dbt Core-style guidance - Tolerate a partially-migrated package-lock.yml that mixes the name/no-name entry forms: the deprecated lock parser now accepts (and ignores) a
namekey instead of failing the build with UnusedConfigKey (dbt1060) errors, matching dbt Core - Expose
model.pathrelative to the resource root (e.g.staging/orders.sql) in both theconfig()block and the model body, matching dbt-core; previously it was empty insideconfig()and carried themodels/prefix in the body - Fix microbatch lookback off-by-one so a lookback of N produces N+1 batches (current batch plus N previous), matching dbt-core and the microbatch docs (#15477)
- dbt retry now preserves --full-refresh from the original run, so incremental models retried after a failed full-refresh build use full-refresh (drop + recreate) semantics instead of incremental merge semantics
- Hide the internal --write-metadata flag in favor of --write-index, fix 'dbt parse --write-index' to generate the index instead of failing with a save_artifact_meta IO error, and make the dbt-index warnings reference --write-index and respect warn_error_options
- Reduce BigQuery dbt State freshness fanout by using schema-level metadata refreshes for non-override submit-time misses.
- Quote grantees when revoking grants, so revoking a grant whose name contains special characters no longer fails with a syntax error.
- Jinja parser now accepts keyword-argument names spelled like literal keywords (none, true, false), e.g. namespace(gold=0, unknown=0, none=0), matching dbt Core. Previously these raised MacroSyntaxInvalid (dbt1502): non-keyword arg after keyword arg.
- Support non-ASCII Jinja macro names in Fusion parsing.
- Ensure data tests submit zero freshness tolerance to dbt State.
- Translate legacy BigQuery seed
+column_typesaliases (e.g.float,integer,text) to their canonical types (FLOAT64/INT64/STRING) instead of failing with 'Invalid column description', matching dbt Core - Allow dbt State submissions to include upstream dependencies whose last modified timestamp could not be resolved, instead of bypassing state for the model.
- Bump BigQuery ADBC driver to 0.21.0.dev+dbt0.21.13, wiring HTTPS_PROXY/NO_PROXY support into the OAuth token-exchange transport
Under the Hood
- Serialize config for macros for manifest parity with core
- remove unused calculate_freshness_from_metadata_batch method
- Add live Snowflake ADBC client cancellation regression test
- Generic and column data tests now include their schema.yml config (where, severity, limit, tags, meta, ...) in unrendered_config, matching models/seeds/snapshots. Preparatory for correct state:modified comparison of data tests.
- Add ClickHouse to the list of non experimental adapters.
- Publish pre-release versions to Homebrew and winget during the pre-stable window, and fix the empty-version bug in the release-v2 publish jobs.
- Add clickhouse-0.1.0 ADBC driver to CDN checksums
Security
- Remove unused ad-hoc SQL query endpoints (POST /api/v1/query, GET /api/v1/tables) from dbt docs server
Contributors
- @@koletzilla
- @HannanNaeem
- @Thrasi
- @VersusFacit
- @aahel
- @aiguofer
- @ajhlee-dbt
- @ajnovice
- @akbog (#15477)
- @alexander-bogdanowicz
- @ashtonwalden
- @b-per
- @claude
- @dataders
- @debrin-og
- @eliasdefaria
- @itsnamangoyal
- @j-clemons (#14542)
- @jasonlin45
- @jcserv
- @kczimm
- @lottaquestions
- @mach-kernel
- @r-jais (#15249)
- @ragesh-g
- @sadboy
- @vgapeyev
- @xuliangs
Fetched July 20, 2026


