NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #721 most downloaded on PyPI
With dbt, data analysts and engineers can build analytics the way engineers build applications.
Last release 16 days ago
18 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
4 versions withdrawn
withdrawn after publishing
8 years old
370 releases · first in 2019
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
One column per quarter.
Nothing published for this version
Nothing published for this version
[ClickHouse] dbt unit tests are supported; multi-statement SQL containing ClickHouse backslash escapes is now split correctly by the statement splitte
Released September 08, 2026
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 Exasol adapter (Phase 1): connection/auth with TLS and timeout profile options, metadata adapter, agate/seed type conversion (incl. HASHTYPE) and
Released September 02, 2026
delete+insert with correctly quoted unique keys (#15250)macros key for unit tests that set overrides without macros, which made dbt-core fail to deserialize the fusion-produced manifest (#16009)requires-python of the wheel it installs, so uv pip install dbt-core/dbt-oss no longer produces an unimportable packagedbt instead of dbt-sa-cli (build output is at target/<profile>/dbt)dbt-core sdists (2.x and up) now print an install-time notice pointing at the dbt and dbt-oss distributionsAdd support for ClickHouse Dictionary materialization
Released August 18, 2026
authentication: ActiveDirectoryAccessToken, authenticating with a pre-minted Entra bearer token from the access_token profile field (#15926)Normalize deprecation_date to a timezone-aware timestamp in manifest.json so dbt Core consumers can parse it without a TypeError
Released August 10, 2026
cargo xtask apply-ci-goldies to fetch CI logs via gh and apply golden-file patches onto the current worktree.azure_client_id/azure_client_secret (auth_type azure-client-secret), matching dbt-core/dbt-databricksdbt 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 commandtry_or_compiler_error type-check warning message ("a optional argument argument" -> "an optional argument") (#15323)@ graph operator (and the equivalent childrens_parents YAML selector) returning an empty set when applied to a leaf node. It now correctly returns the node together with its ancestors. (#15280)alias_types is enabled (e.g. FLOAT -> FLOAT64), matching dbt Core. (#14097)is_serverless profile flag (plus serverless_work_group and serverless_acct_id) so Serverless workgroups reached via a non-serverless host (e.g. an SSM port-forward) are treated as Serverless and no longer require cluster_id, matching dbt Core.expiration_timestamp relation option (and render options in dbt-core's insertion order) when hours_to_expiration is present but renders to a non-numeric value such as null, matching dbt Core instead of dropping the option@ graph operator (and the equivalent childrens_parents YAML selector) returning an empty set when applied to a leaf node. It now correctly returns the node together with its ancestors. (#15280)transient config is present., whether inherited from a project-wide default or set explicitly on the model.failures as null for skipped nodes), matching dbt Core and fixing downstream consumers such as the dbt-artifacts packagenull config in the dbt_project.yml models hierarchy so it clears a value inherited from a higher level (starting with hours_to_expiration), and ensure a more-specific level's value always overrides a cleared parent, matching dbt Core precedenceALTER TABLE ... ADD COLUMN to include the database qualifierclone_chain_depth_limit to the server to help make correct clone decisionsTABLE no longer panic with a driver fatal error (#15661)filter and saved_queries.query_params.where, which stay verbatim for MetricFlow (#14468)static_analysis config from state:modified comparisons for sources, snapshots, functions, and analyses, matching dbt-core (which has no such field)meta change when a config key was relocated into +meta between the previous-state manifest and the current project (e.g. by dbt-autofix, when a config key has no field on Fusion's typed config struct)constraints as a valid model config() key (previously rejected as an unrecognized key), matching dbt-core's behavior of accepting it without enforcing it — only the schema.yml constraints: model property is enforced. Cache-invalidation systems like dbt State/Run Cache now correctly react to constraint changes authored either way.target.name in ['dev'] | as_bool — which Jinja parses as a containment check against the filtered list — no longer fails with "cannot perform a containment check on this value"config() value is undefinedtimedelta.total_seconds() truncating to whole seconds, so sub-second durations no longer return 0.0. Also makes non-zero sub-second timedeltas truthy and normalizes days/seconds/microseconds and str() for negative durations, matching Python. (#15756)elementary.foo, dbt_utils.bar). Membership in a package's macro list was a linear scan on every access, so the cost grew with the number of macros in the package; it is now a hash lookup. On a project using elementary (~1000 macros), this takes an on-run-end hook that iterates the graph from ~1.6x slower than dbt Core to parity. (#14455)ref() or source() instead of panicking during compilation. Because the panic happened at compile time, one malformed call previously took down parsing for every other model and macro in the project.AdapterResponse is now backed by a ValueMap. This paves the way to adding arbitrary keys to AdapterResponse.DbtNodeState submission from Python to RustTolerate a partially-migrated package-lock.yml that mixes the name/no-name entry forms: the deprecated lock parser now accepts (and ignores) a name ke…
Released July 20, 2026
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.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.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.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.normalize() on pytz timezone objects so unit-test fixtures using modules.pytz.timezone(...).normalize(...) parse instead of failing with an opaque dbt1013 deserialization errorcurrent_warehouse()-based restore), so per-model snowflake_warehouse overrides no longer cause record/replay SQL mismatchesshow --inline broken when root package is disabled!~ and !~* no longer raise a false-positive dbt0101 SyntaxInvalid diagnostic (#15249)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 a config: block that does not set that keyTestConfig key allowlist.. segments in the reported path, and add dbt Core-style guidancename key instead of failing the build with UnusedConfigKey (dbt1060) errors, matching dbt Coremodel.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+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[dbt-fusion] DuckDB: read-write Horizon and Unity (Iceberg REST) catalogs via duckdb 1.5.4 / duckdb-iceberg#1017 write-compat ATTACH options (stage_cr
Released July 06, 2026
USE / RESET USE when datasharing is enabled and the node targets a non-default databasecompletions subcommand from dbt help output[dbt-fusion] For versioned models, automatically create a view at the unsuffixed model name (e.g. dim_customers) pointing to the latest version (e.g.
Released June 29, 2026
dim_customers) pointing to the latest version (e.g. dim_customers_v2). Enabled by default; disable per-model with latest_version_pointer: {enabled: false} or globally with the project flag latest_version_pointer_enabled_by_default: false. Customize the pointer alias via the latest_version_pointer.alias config or by overriding the generate_latest_version_pointer_alias macro.dbt man --schema catalogs to export a type-discriminated JSON schema for catalogs.yml v2+compute config on unit_test nodes, allowing a unit_test to override the global --compute flag (e.g. +compute: sidecar under global --compute remote).reservation config for BigQuery, allowing query jobs to be routed to a specific BigQuery reservation at the profile, project (+reservation), or model ({{ config(reservation=...) }}) level.param: str){% snapshot snp.sql %}) by stopping at the first dot, matching dbt-core behaviordo blocks (e.g. {%- do a.append(x), b.append(y) -%})rows|first.col) in minijinja parserdrop table instead of an invalid drop external. Spark 4 reports managed Hive tables as EXTERNAL (TRANSLATED_TO_EXTERNAL), which broke --full-refresh over Thriftdbt system uninstall from removing a binary owned by Homebrew, pip, or winget; surface the package manager's uninstall command insteadvalid_snapshot_target--help shows a focused summarymanage_state to invocation telemetry to track dbt State management (auto-deferral) enablementAuthChain or an OAuthInteractiveResolver directly.pypi publish --download-base-url <url> --target <triple>... builds the download-at-install sdist (downloads the release wheels, hashes the live bytes, assembles the sdist) and publishes it (filetype=sdist) to PyPI[dbt-fusion] Added --empty support in seed command.
Released June 18, 2026
brew install dbt from the official tap.dbt system update now refuses to overwrite a binary managed by a package manager unless --force is passed.cargo conformance fetch/push sync the bucket and collect --start/--end + log-overlap --days N enable multi-day analysiscargo conformance report: a self-contained static HTML UI for an log-overlap run — templates ranked by impact, the concrete strings filling each drain3 <*> wildcard, and drill-down into the original log linesSTRUCT keys that were not string.selector: shorthand being silently ignored inside exclude/union, and fix nested exclude being dropped from the serialized manifest (#15140)Relation now renders properly when the region is set on project or databasemodel storing none values as undefinedfull_refresh: false config on microbatch models under dbt build --full-refreshcargo ci homebrew render and cargo ci homebrew publish subcommands for rendering and publishing Homebrew formulas.publish-homebrew.yml workflow that renders the formula and pushes it to a Homebrew tap. Used by the release pipeline and invokable ad-hoc via workflow_dispatch.DistInfoProvider gains a default server_version() method so env!("CARGO_PKG_VERSION") is defined in one place.resolve-repro subcommand (run_id → S3 artifact path via Datadog) and broaden fetch-repro to resolve the Teleport app + bucket per cell (global prod/prod-emea/prod-au, us-multicell, jp1), with --app/--aws-role/--bucket overrides for cells whose account isn't auto-resolved (eu/us2/us3/onprem)fix(#12947): handle float NodeVersion in version_to_str by @tauhid621 in https://github.com/dbt-labs/dbt-core/pull/12948
packages.yml and dependencies.yml by @dbeatty10 in https://github.com/dbt-labs/dbt-core/pull/12902Full Changelog: https://github.com/dbt-labs/dbt-core/compare/v1.12.0b1...v2.0.0-alpha.1
Released June 01, 2026
First alpha release of dbt Core v2.0, the ground-up rewrite in Rust that is the foundation of the Fusion engine.
dbt-core 1.12.5 - September 15, 2026
Dimension to satisfy the metricflow-semantic-interfaces protocol and bump the metricflow floor to 0.213.0 (#, #)dbt-core PyPI description pointing users to the v2 install docs (#)dbt-core 1.12.4 - September 08, 2026
Require sqlparse>=0.5.5,<0.7.0 , sqlparse 0.6.0 is the fixed release for CVE-2026-54284 , CVE-2026-59893 , CVE-2026-59894 and CVE-2026-71491 (parser d…
x-ms-blob-type: BlockBlob header and accept 201 Created when uploading artifacts to an Azure Blob Storage signed URL, so artifact ingestion no longer fails with 400 MissingRequiredHeader on Azure-hosted regions. Upload errors now include the storage provider's error code alongside the status code. (#N/A)sqlparse>=0.5.5,<0.7.0, sqlparse 0.6.0 is the fixed release for CVE-2026-54284, CVE-2026-59893, CVE-2026-59894 and CVE-2026-71491 (parser denial-of-service). (#15988)Warn users if they are using a deprecated dbt version
query_tags, zorder, options, unique_tmp_table_suffix, skip_optimize) in jsonschema validation so they no longer raise spurious CustomKeyInConfigDeprecation warnings (dbt-databricks#1540, dbt-databricks#1302) (#N/A)Add OpenTelemetry span instrumentation for node and hook execution, gated behind the --snowflake-projects-otel flag (off by default)
dbt build node count ("X of Y") being inflated when unit tests are selected, by adding the unit test count to num_nodes exactly once instead of on every dequeue while run_count is still 0 (#11185)Fix npm security vulnerabilities as of June 2024 (dbt-docs/#513)
dbt login command and the bundled dbt-state plugin (including --manage-state/manage_state and the DBT_ENGINE_STATE_* env vars), reverting PRs (#NA)graph object, enabling tools like dbt-project-evaluator to run checks on unit tests. (#12033)dim_customers) for versioned models, opt-in via latest_version_pointer_enabled_by_default flag or per-model latest_version_pointer config (#7442)overloads block in function YAML entries (#12250)packages.yml and dependencies.yml. Resolves URLs from a configured environment variable when present, otherwise falls back to constructing an SSH URL. (#12874)Reused to NodeStatus and RunStatus (#12912)--manage-state on the CLI, sets DBT_ENGINE_MANAGE_STATE=true, or sets manage_state to true in the flags block of dbt_project.yml (equivalently in the config block of profiles.yml). Discovery filters disabled modules before importlib.import_module is called, so the default opt-in-off state incurs no import cost. (#13014)--use-v2-parser to delegate parsing to the fusion parser, load its manifest.json into a runtime Manifest, and bypass dbt-core's parser. Configurable via --v2-parser / DBT_ENGINE_V2_PARSER (defaults to dbt-core-experimental-parser parse) or the flags: section of dbt_project.yml. (#13029)require_unique_project_resource_names (#12152)function with --exclude-resource-type flag (#12143)NoNodesForSelectionCriteria three times during build command (#11627)dbt deps --add-package crash when packages.yml contains warn-unpinned: false (#9104)dbt deps --add-package duplicate detection with better cross-source matching and word boundaries (#12239)CustomKeyInConfigDeprecation for config key alias in sql (#12396)static_analysis: off being interpreted as boolean false instead of string "off" in manifest.json (#12015)DBT_ENGINE prefixed env vars picked up by CLI (#12583)require_ref_searches_node_package_before_root (#12324)support_custom_ref_kwargs (#12148)dbt show and dbt compile filtered out every result when --select used a graph operator (+model, model+, @model) or a method selector (e.g. tag:foo, state:modified, fqn:model). The membership check ran against the raw --select strings, so any non-bare selector matched nothing. Filter the streamed ShowNode / CompiledNode events by the resolved set of directly-selected unique_ids instead, using the same selector parser dbt already uses for execution. The substring fix from #12562 (originally #12539) is preserved structurally. (#12562)name, falling back to the column name to match the existing dimension behavior (#DI-4133)version_to_str returning empty string for float NodeVersion values, causing unquoted YAML version scalars (e.g. v: 4.5) to be silently dropped and mis-routed as non-versioned models (#12947)Reused node status in on-run-end summary printer so plugins that emit RunResult(status=Reused, ...) don't crash with unhandled result. (#12972)selector: method so a circular selector dependency raises a clean DbtRecursionError instead of crashing the process. The previous code relied on Python's default recursion limit (1000) tripping before the OS thread stack overflowed, but on platforms with smaller default stacks (notably Windows, ~1 MB vs ~8 MB on Linux/macOS) the margin can disappear once instrumentation (e.g. coverage) or stack-heavy plugins join the call chain. Lower the limit locally (restored in finally) so the catchable RecursionError fires first on every platform. (#13014)--manage-state when DBT_ENGINE_MANAGE_STATE is set to false. The bundled dbt-state plugin reads DBT_ENGINE_MANAGE_STATE directly in its initialize(), so a CLI override of an opt-out env var was previously dropped silently: PluginManager loaded the plugin but the plugin self-disabled on import. PluginManager now normalizes os.environ to the Click-resolved value before importing each bundled plugin, so all three opt-in surfaces (--manage-state CLI, DBT_ENGINE_MANAGE_STATE env var, manage_state in dbt_project.yml / profiles.yml) behave consistently end-to-end. (#13014)~ in --v2-parser paths. Fusion hard-errors on unknown DBT_ENGINE_* vars, so enabling the v2 parser via DBT_ENGINE_USE_V2_PARSER previously broke the handoff. Stripping is keyed off click-bound options, so future core-only DBT_ENGINE_* additions are handled automatically. Non-click vars (DBT_ENGINE_STATE_*, recorder, deps) pass through unchanged. (#13029)direct_parents attribute to model nodes carrying the nearest public ancestors only, and emit it in dbt ls --output=json for models. Lineage consumers can now render DAG edges from direct_parents instead of depends_on.nodes, which carries the full transitive closure across plugin boundaries (still required for node selection and cycle detection). The new attribute is runtime-only and is stripped during manifest serialization, so the manifest.json contract is unchanged. (#)warn_or_error handler method (#8133)click minimum to 8.3.0 (#12378)pytest-logbook and logbook test dependencies from both the default and ci hatch envs. dbt-core dropped its logbook-based logger in (#NA)dbt-core-experimental-parser to 2.0.0a1 (#13065)dbt-core-experimental-parser to 2.0.0a3 (#15391)dbt-core-experimental-parser to 2.0.0a4 (#13065)Thanks to @colin-rogers-dbt for writing this biography of Alecia Beth Moore-Hart (P!NK)—a famous Philadelphian, and the namesake of this dbt Core release.
If you existed on the planet between 2000 and 2012 you have heard her music. The kind of pop music that's inescapable; relentlessly played, parodied, derided and loved. Songs that were sincere to the point of discomfort, unconcerned with following a formula, with no subject being off limits.
Their writer and singer, Alecia Beth Moore-Hart, was born September 8, 1979 in Doylestown, Pennsylvania a small town roughly 40 miles outside of Philadelphia. Growing up in a volatile household she nearly didn't make it: nearly overdosing at a rave on Thanksgiving at 16 years old. The DJ told her to come back the following night for a guest spot on the condition she never touch hard drugs again. She showed up the following night and by the following week was auditioning for labels the following week. What has followed is an unlikely career spanning nine albums and countless tours for millions of fans.
A career defined not be her first album: a commercially successful pop album that she personally hated but by her second. She used the leverage bought by her grammy winning cover of "Lady Marmalade" for the Moulin Rouge soundtrack to demand the freedom to make the album she wanted. The result was "Missundaztood", a confessional genre bending mashup of blues, hip hop and rockl made largely with Linda Perry of 4 Non Blondes. Topically, it covers her parents' divorce, her own self-loathing and the absurdity of pop fame. The label expected disaster. It sold fifteen million copies. The rest is history.
Add hints for cli users based on dbt usage
Flags introduced in 1.9 and 1.10 defaults to true
Remove the experimental dbt login command and the bundled dbt-state plugin (including --manage-state/manage_state and the DBT_ENGINE_STATE_* env vars)
dbt login command and the bundled dbt-state plugin (including --manage-state/manage_state and the DBT_ENGINE_STATE_* env vars), reverting PRs (#NA)dbt-core-experimental-parser to 2.0.0a3 (#15391)dbt-core-experimental-parser to 2.0.0a4 (#13065)Allow for setting of OSI documents directory as project config
direct_parents attribute to model nodes carrying the nearest public ancestors only, and emit it in dbt ls --output=json for models. Lineage consumers can now render DAG edges from direct_parents instead of depends_on.nodes, which carries the full transitive closure across plugin boundaries (still required for node selection and cycle detection). The new attribute is runtime-only and is stripped during manifest serialization, so the manifest.json contract is unchanged. (#)Make MAXIMUM_SEED_SIZE_MIB configurable (#7117, #7124)
dim_customers) for versioned models, opt-in via latest_version_pointer_enabled_by_default flag or per-model latest_version_pointer config (#7442)packages.yml and dependencies.yml. Resolves URLs from a configured environment variable when present, otherwise falls back to constructing an SSH URL. (#12874)--manage-state on the CLI, sets DBT_ENGINE_MANAGE_STATE=true, or sets manage_state to true in the flags block of dbt_project.yml (equivalently in the config block of profiles.yml). Discovery filters disabled modules before importlib.import_module is called, so the default opt-in-off state incurs no import cost. (#13014)--use-v2-parser to delegate parsing to the fusion parser, load its manifest.json into a runtime Manifest, and bypass dbt-core's parser. Configurable via --v2-parser / DBT_ENGINE_V2_PARSER (defaults to dbt-core-experimental-parser parse) or the flags: section of dbt_project.yml. (#13029)version_to_str returning empty string for float NodeVersion values, causing unquoted YAML version scalars (e.g. v: 4.5) to be silently dropped and mis-routed as non-versioned models (#12947)Reused node status in on-run-end summary printer so plugins that emit RunResult(status=Reused, ...) don't crash with unhandled result. (#12972)selector: method so a circular selector dependency raises a clean DbtRecursionError instead of crashing the process. The previous code relied on Python's default recursion limit (1000) tripping before the OS thread stack overflowed, but on platforms with smaller default stacks (notably Windows, ~1 MB vs ~8 MB on Linux/macOS) the margin can disappear once instrumentation (e.g. coverage) or stack-heavy plugins join the call chain. Lower the limit locally (restored in finally) so the catchable RecursionError fires first on every platform. (#13014)--manage-state when DBT_ENGINE_MANAGE_STATE is set to false. The bundled dbt-state plugin reads DBT_ENGINE_MANAGE_STATE directly in its initialize(), so a CLI override of an opt-out env var was previously dropped silently: PluginManager loaded the plugin but the plugin self-disabled on import. PluginManager now normalizes os.environ to the Click-resolved value before importing each bundled plugin, so all three opt-in surfaces (--manage-state CLI, DBT_ENGINE_MANAGE_STATE env var, manage_state in dbt_project.yml / profiles.yml) behave consistently end-to-end. (#13014)~ in --v2-parser paths. Fusion hard-errors on unknown DBT_ENGINE_* vars, so enabling the v2 parser via DBT_ENGINE_USE_V2_PARSER previously broke the handoff. Stripping is keyed off click-bound options, so future core-only DBT_ENGINE_* additions are handled automatically. Non-click vars (DBT_ENGINE_STATE_*, recorder, deps) pass through unchanged. (#13029)dbt-core-experimental-parser to 2.0.0a1 (#13065)Fix npm security vulnerabilities as of June 2024 (dbt-docs/#513)
graph object, enabling tools like dbt-project-evaluator to run checks on unit tests. (#12033)overloads block in function YAML entries (#12250)Reused to NodeStatus and RunStatus (#12912)require_unique_project_resource_names (#12152)function with --exclude-resource-type flag (#12143)NoNodesForSelectionCriteria three times during build command (#11627)dbt deps --add-package crash when packages.yml contains warn-unpinned: false (#9104)dbt deps --add-package duplicate detection with better cross-source matching and word boundaries (#12239)CustomKeyInConfigDeprecation for config key alias in sql (#12396)static_analysis: off being interpreted as boolean false instead of string "off" in manifest.json (#12015)DBT_ENGINE prefixed env vars picked up by CLI (#12583)require_ref_searches_node_package_before_root (#12324)support_custom_ref_kwargs (#12148)dbt show and dbt compile filtered out every result when --select used a graph operator (+model, model+, @model) or a method selector (e.g. tag:foo, state:modified, fqn:model). The membership check ran against the raw --select strings, so any non-bare selector matched nothing. Filter the streamed ShowNode / CompiledNode events by the resolved set of directly-selected unique_ids instead, using the same selector parser dbt already uses for execution. The substring fix from #12562 (originally #12539) is preserved structurally. (#12562)name, falling back to the column name to match the existing dimension behavior (#DI-4133)warn_or_error handler method (#8133)click minimum to 8.3.0 (#12378)pytest-logbook and logbook test dependencies from both the default and ci hatch envs. dbt-core dropped its logbook-based logger in (#NA)dbt-core 1.11.15 - September 08, 2026
Require sqlparse>=0.5.5,<0.7.0 , sqlparse 0.6.0 is the fixed release for CVE-2026-54284 , CVE-2026-59893 , CVE-2026-59894 and CVE-2026-71491 (parser d…
sqlparse>=0.5.5,<0.7.0, sqlparse 0.6.0 is the fixed release for CVE-2026-54284, CVE-2026-59893, CVE-2026-59894 and CVE-2026-71491 (parser denial-of-service). (#15988)Warn users if they are using a deprecated dbt version
Stop emitting spurious deprecation warnings for state model configs (pre_clone, lag_tolerance, require_fresh_data_from, etc.) by adding the ModelState…
state model configs (pre_clone, lag_tolerance, require_fresh_data_from, etc.) by adding the ModelState schema to the bundled jsonschemas (#13016)Restore dbt-adapters upper bound to <2.0 (reverting the temporary <1.24 cap) now that the breaking change in dbt-adapters 1.24.0 has been addressed. (…
Pinned dbt-adapters<1.24 to avoid breaking changes in 1.24 JS UDFs. Ref https://github.com/dbt-labs/dbt-adapters/issues/1926
Update jsonschemas for more accurate deprecation warnings: macro.config should not warn
static_analysis: off being interpreted as boolean false instead of string "off" in manifest.json (#12015)Fix npm security vulnerabilities as of June 2024 (dbt-docs/#513)
DBT_ENGINE prefixed env vars picked up by CLI (#12583)Fix dbt retry for microbatch models to use the original invocation time instead of the current time when recomputing batches
add config.meta_get to python model parsing
Dont fire config problem event if loaded_at_query is defined for adapters that dont support metadata-based freshness
Skip raising CustomKeyInConfigDeprecation for config key alias in sql
Stop raising deprecation warnings for internal python model configs
Address Click 8.2+ deprecation warning
Address Click 8.2+ deprecation warning
## dbt-core 1.11.1 - December 19, 2025 ### Dependencies - Bump minimum click to 8.2.0 (#12305) ### Contributors - @QMalcolm
…to varchar(10)) incorrectly triggered a breaking change error fo
overrides property for sources (#11566)quoting.snowflake_ignore_case is set. (#11882)function nodes (#11923)list command (#11967)function macro to jinja context (#11972)type property to function nodes (#12042, #12037).freshness is equal to node's .config.freshness (#11717)GenericJSONSchemaValidationDeprecation a "preview" deprecation (#11814)str type when block.contents is None (#11492)functions from being filtered by empty and event_time (#12066)ref support in function nodes (#12076)type into it's config (#12101)require_unique_project_resource_names (#12152)function with --exclude-resource-type flag (#12143)NoNodesForSelectionCriteria three times during build command (#11627)dbt deps --add-package crash when packages.yml contains warn-unpinned: false (#9104)dbt deps --add-package duplicate detection with better cross-source matching and word boundaries (#12239)4.19.1 (#11740)Thanks to @reubenmc for writing this biography of Juan R. Torruella—a famous Philadelphian, and the namesake of this dbt Core release.
Juan R. Torruella collected lives the way most people collect titles. He was the first Hispanic judge on the U.S. Court of Appeals for the First Circuit, a four-time Summer Olympian who captained the Puerto Rican team, and the author of Global Intrigues, a sweeping account of the diplomatic context of the Spanish–American War and the United States’ rise to world power.
Torruella was born in Old San Juan on June 7, 1933, to his father Juan N. Torruella, a dentist who became a lawyer, and his mother, Belén del Valle de Torruella. At his father’s urging, Torreulla earned a B.S. from the Wharton School of the University of Pennsylvania in 1954 and a J.D. from Boston University in 1957. He would keep returning to school, picking up a Master of Laws from the University of Virginia School of Law, a Master’s in Public Administration from the University of Puerto Rico, and a Master’s in European History from Oxford.
After finishing law school, Torruella originally planned to take the bar exam in Massachusetts. However, after coming down with mumps the day before the test, he returned to his native Puerto Rico, where he clerked for a justice of the Puerto Rico Supreme Court, became an attorney for the National Labor Relations Board, and later entered private practice, becoming a partner at Fiddler, Gonzalez & Rodriguez. President Ford nominated him to the U.S. District Court for Puerto Rico in 1974. He served as chief judge from 1982 to 1984, and was then elevated to the U.S. Court of Appeals First Circuit by then president Ronald Reagan.
Off the bench, Torruella was a ferocious sailor, competing in four consecutive Summer Olympics across three different boat classes and captaining the Puerto Rican Olympic team. He completed several long-distance voyages, including a return trans-Atlantic crossing to commemorate the 500th anniversary of the European discovery of the Americas, and an 8,000-mile trip from the Caribbean Sea to Buenos Aires.
Alongside all of this, Torruella remained a staunch advocate for Puerto Rico’s political and legal status. When Torruella was nominated to the appeals court, he reminded those who congratulated him that he had never lost sight of his roots, remarking that, “I am aware that my actions will not only be used to measure me, but also the community from which I so proudly come. This is a heavy burden, but one whose challenge I gladly accept.”
Do not raise deprecation warning when encountering dataset or project configs for bigquery
Raise jsonschema-based deprecation warnings by default
dbt deps --add-package duplicate detection with better cross-source matching and word boundaries (#12239)…to varchar(10)) incorrectly triggered a breaking change error fo
require_unique_project_resource_names (#12152)function with --exclude-resource-type flag (#12143)NoNodesForSelectionCriteria three times during build command (#11627)dbt deps --add-package crash when packages.yml contains warn-unpinned: false (#9104)Allow for defining funciton arguments with default values
Allow for the specification of function volatility (#QMalcolm)
type into it's config (#12101)Support function nodes for unit tested models
Fix property names of function nodes (arguments.data_type, returns, returns.data_type)
11561 (#deprecate, #--models,--model,, #and, #-m, #flags)
overrides property for sources (#11566)quoting.snowflake_ignore_case is set. (#11882)function nodes (#11923)list command (#11967)function macro to jinja context (#11972)type property to function nodes (#12042, #12037).freshness is equal to node's .config.freshness (#11717)GenericJSONSchemaValidationDeprecation a "preview" deprecation (#11814)str type when block.contents is None (#11492)4.19.1 (#11740)Warn users if they are using a deprecated dbt version
Restore dbt-adapters upper bound to <2.0 (reverting the temporary <1.24 cap) now that the breaking change in dbt-adapters 1.24.0 has been addressed. (…
Fix docker os dependency install issue
Fix dbt retry for microbatch models to use the original invocation time instead of the current time when recomputing batches
Add add_catalog_integration call even if we have a pre-existing manifest
Implement config.meta_get and config.meta_require
## dbt-core 1.10.17 - December 20, 2025 ### Fixes - Upper bound sqlmesh to <0.5.5
Fix generation of deprecations summary
NoNodesForSelectionCriteria three times during build command (#11627)Your coding agent can read these notes before it upgrades. Set up the MCP server →