megachangelog
Announcement2.0.0-alpha.5

dbt v2.0.0-alpha.5

Alpha release with significant improvements to catalog generation, deferral support, state management, and bug fixes across Redshift, Snowflake, BigQuery, and Spark adapters. Includes new analytics endpoints, better error handling, and numerous stability improvements for parse-time configurations and manifest generation.

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_id support via DBT_CLOUD_DEFER_JOB_ID env var. When set alongside defer_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 cascading lock poisoned panics in minijinja's MutableVec.
  • Parse-time config.get(name) now matches dbt-core's ParseConfigObject.get (core/dbt/context/providers.py:554) by returning "" for every key except meta. The meta key keeps a permissive chainable stub (ParseConfigValue) so dbt-autofix's recommended config.get('meta').custom_key migration pattern (see dbt-autofix/manual_fixes/custom_configuration.md) keeps working during Fusion's static-analysis compile of materialization bodies. Separately, adapter.get_relation now coerces None/Undefined args to "" at the strict &str unwrap so the compile-phase CompileConfig.get('database')None path (mirroring Python's RuntimeConfigObject.get) flows through without crashing the prefetch-recording call. Together this unblocks the Anisi customer project (account 303 / project 3580) whose snowflake_external_table materialization in dbt_external_tables calls adapter.get_relation(database=config.get('database'), ...). Broader audit of where the same None-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_exists now resolves via show databases instead of the nonexistent information_schema.schemata (fixing snapshots and other guard-then-create paths), and list_schemas reads the show databases result column name-agnostically (namespace on OSS Spark, databaseName on 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 using modules.pytz.timezone(...).normalize(...) parse instead of failing with an opaque dbt1013 deserialization 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-model snowflake_warehouse overrides 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 --inline broken 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 '' at the top-level and in config" when a data test has a top-level config key (e.g. where) and a config: 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..snapshot_) 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 TestConfig key 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 name key instead of failing the build with UnusedConfigKey (dbt1060) errors, matching dbt Core
  • Expose model.path relative to the resource root (e.g. staging/orders.sql) in both the config() block and the model body, matching dbt-core; previously it was empty inside config() and carried the models/ 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_types aliases (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

coreadapterscatalogstabilityapi

Source: original entry ↗