github dbt-labs/dbt-core v1.12.0
dbt-core v1.12.0

5 hours ago

dbt-core 1.12.0 - Alecia Beth Moore-Hart (P!NK) (July 16, 2026)

Breaking Changes

  • Remove the experimental dbt login command and the bundled dbt-state plugin (including --manage-state/manage_state and the DBT_ENGINE_STATE_* env vars), reverting PRs (#NA)
  • Flags introduced in 1.9 and 1.10 defaults to true (#12713)

Features

  • Make MAXIMUM_SEED_SIZE_MIB configurable (#7117, #7124)
  • Support partial parsing for function nodes (#12072)
  • Add UnparsedMetricV2 to read in new-style YAML Semantic Layer Metrics. (#12157)
  • Allow for defining funciton arguments with default values (#12044)
  • Add directory change instruction after dbt init (#9041)
  • Raise jsonschema-based deprecation warnings by default (#12240)
  • 🐛 ⛄ Disable unit tests whose model is disabled (#10540)
  • Implement config.meta_get and config.meta_require (#12012)
  • Deprecate null return values from generate_schema_name macro, behind require_valid_schema_from_generate_schema_name flag (#12347)
  • Add ability to indicate dbt Model also represents a Semantic Model. (Not fully supported yet.) (#.)
  • Added ability to parse semantic layer dimensions added to columns as part of new YAML. (Not ready for use until more of the new yaml is implemented.) (#.)
  • Add parsing for new YAML for semantic layer entities attached to dbt models. (#12395)
  • Process semantic metrics in v2 YAML if they are not merged into a model. (#12161)
  • Add parsing for v2 metrics on models and finish implementing their dependency behaviors. (#12397)
  • Add the ability to process derived semantic entities to dbt models, as required by new YAML schema. (#12401)
  • Enable parsing derived dimensions for v2 semantic layer YAML. (#12404)
  • Add unit tests to the Jinja graph object, enabling tools like dbt-project-evaluator to run checks on unit tests. (#12033)
  • Implement agg_time_dimension for new semantic YAML. (#12410)
  • Implement parsing of semantic model object-style configuration in v2 semantic YAML. (#12413)
  • Implement primary_entity field for semantic models in semantic YAML v2. (#12414)
  • add config.meta_get to python model parsing (#12458)
  • Allow jinja suffixed extensions for markdown and sql files (#11097, #3484)
  • Allow continue running child on parent error (#2142)
  • Added support for vars.yml to declare project variables (#11144, #2955)
  • execute dbt debug logic after creating a new project in dbt init (#12510)
  • Write compiled SQL for snapshots to target/compiled/ during dbt compile (#7867)
  • Add "selector" selector method (#5009)
  • env vars can now be loaded from .env file (#12106)
  • dbt seed now supports --empty to create the tables without loading data (#8981)
  • automatically create a latest-version pointer (e.g. dim_customers) for versioned models, opt-in via latest_version_pointer_enabled_by_default flag or per-model latest_version_pointer config (#7442)
  • Add catalogs.yml usage tracking (#1122)
  • Add --sql flag to dbt run-operation for executing ad-hoc SQL/Jinja statements (#12478)
  • support for javascript udfs (#12332)
  • Allow event deferral for Parse events (#12339)
  • Support overloaded UDFs via overloads block in function YAML entries (#12250)
  • Add support for private git packages in packages.yml and dependencies.yml. Resolves URLs from a configured environment variable when present, otherwise falls back to constructing an SSH URL. (#12874)
  • Add support for python 3.14 (#12098)
  • Add Reused to NodeStatus and RunStatus (#12912)
  • Add per-overload start and result log events for overloaded UDFs (LogStartOverload, LogOverloadResult) (#12250)
  • Add catalogs.yml v2 support gated behind use_catalogs_v2 flag, with adapter-owned bridge architecture (#12930)
  • Begin writing OSI SL document at end of parsing (#12786)
  • Support parsing OSI semantic layer documents from a project's OSI/ directory into the dbt manifest (#12787)
  • Bundle the dbt-state plugin (>=2.18,<3.0) as an install dependency of dbt-core. The plugin is opt-in: PluginManager skips auto-discovery unless the user passes --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)
  • Add --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)
  • Add support for user settings with flags reading writing (#13031)
  • Add dbt login command (#13032)
  • Tolerate dbt Fusion-specific warn_error_options names instead of erroring, emitting a note that they are ignored because they are specific to the dbt Fusion engine (#12885)
  • Add catalog_database field to CatalogWriteIntegrationConfig (v1) so catalogs.yml can set a database-name override for any catalog type; works in conjunction with the dbt-adapters get_catalog_database_override method to give catalog_database highest priority in generate_database_name (#15156)
  • Add hints for cli users based on dbt usage (#15510)

Fixes

  • Address Click 8.2+ deprecation warning (#12038)
  • Allow dbt deps to run when vars lack defaults in dbt_project.yml (#8913)
  • Include macros in unit test parsing (#10157)
  • Restore DuplicateResourceNameError for intra-project node name duplication, behind behavior flag require_unique_project_resource_names (#12152)
  • Allow the usage of function with --exclude-resource-type flag (#12143)
  • Fix bug where schemas of functions weren't guaranteed to exist (#12142)
  • 🐛 ⛄ Correctly reference foreign key references when --defer and --state provided (#11885)
  • Fix generation of deprecations summary (#12146)
  • 🐛 ⛄ Add exception when using --state and referring to a removed test (#10630)
  • 🐛 ⛄ Stop emitting NoNodesForSelectionCriteria three times during build command (#11627)
  • 🐛 ⛄ Fix long Python stack traces appearing when package dependencies have incompatible version requirements (#12049)
  • 🐛 ⛄ Fixed issue where changing data type size/precision/scale (e.g., varchar(3) to varchar(10)) incorrectly triggered a breaking change error fo (#11186)
  • 🐛 ⛄ Support unit testing models that depend on sources with the same name (#11975, #10433)
  • Fix bug in partial parsing when updating a model with a schema file that is referenced by a singular test (#12223)
  • 🐛 ⛄ Avoid retrying successful run-operation commands (#11850)
  • 🐛 ⛄ Fix dbt deps --add-package crash when packages.yml contains warn-unpinned: false (#9104)
  • 🐛 ⛄ Improve dbt deps --add-package duplicate detection with better cross-source matching and word boundaries (#12239)
  • 🐛 ⛄ Fix false positive deprecation warning of pre/post-hook SQL configs (#12244)
  • 🐛 ⛄ Fix ref resolution within package when duplicate nodes exist, behind require_ref_searches_node_package_before_root behavior change flag (#11351)
  • Ensure recent deprecation warnings include event name in message (#12264)
  • Improve error message clarity when detecting nodes with space in name (#11835)
  • 🐛 ⛄Propagate exceptions for NodeFinished callbacks in dbtRunner (#11612)
  • Adds omitted return statement to RuntimeConfigObject.meta_require method (#12288)
  • Do not raise deprecation warning when encountering dataset or project configs for bigquery (#12285)
  • Pin sqlparse <0.5.5 to avoid max tokens issue (#12303)
  • Avoid deadlock edgecases of concurret microbatch/batch execution (#11420)
  • Begin emitting deprecation warnings for DSI produced ValidationFutureError issues (#NA)
  • Add @requires.catalogs decorator to compile command to fix REST Catalog-Linked database compilation (#12353)
  • Validate and filter out non-existent columns from seed column types (#12379)
  • Fix false deprecation warning (#12327)
  • Return correctly resolved project path when changing dirs (#9138)
  • Normalize whitespace prior to computing partial parsing checksum when loading model files (#12432)
  • Dont fire config problem event if loaded_at_query is defined for adapters that dont support metadata-based freshness (#12451)
  • Stop raising deprecation warnings for internal python model configs (#12314)
  • Fix foreign key constraint ref() resolving to deferred relation even when target model is selected for build (#12455)
  • Skip raising CustomKeyInConfigDeprecation for config key alias in sql (#12396)
  • Provide user-friendly validations that dimensions with 'validity_params' also have granularities. (#12473)
  • Use resolved profile and target names to allow partial parsing for default profile and target (#7612)
  • Ensure that all locked packages are installed in packages directory (#12509)
  • Fix static_analysis: off being interpreted as boolean false instead of string "off" in manifest.json (#12015)
  • Set expr to column name for column-based dimensions and entities when the semantic layer name differs from the column name, so MetricFlow queries the correct warehouse column (#12512)
  • Correctly map 'hidden' field of metrics to 'is_private' field in manifests. (#12518)
  • Fix dbt retry for microbatch models to use the original invocation time instead of the current time when recomputing batches (#11423)
  • Fix Dimension() jinja in nested metric filters (input_metrics, numerator, denominator) being incorrectly rendered during YAML parsing for v2 semantic layer schema (#12529)
  • Improve logic for detecting config with missing plus prefix in dbt_project.yml (#12371)
  • Fix v2 metric parsing using model name instead of custom semantic_model.name for generated_from, causing conversion metric validation to fail (#12532)
  • Fix doc() Jinja in derived_semantics dimension and entity descriptions being incorrectly rendered during v2 YAML parsing (#12535)
  • Enable sql_header config for data tests gated behind require_sql_header_in_test_configs behavior change flag. (#9775)
  • Better error formatting for semantic manifest validation errors (#9849)
  • Allow macros invoked via run-operation to ref() private and protected models (#8248)
  • Better error and warnings logs with [WARNING] / [ERROR] messages prepended to the logs (#9849)
  • Fix substring match bug in show and compile task selection causing models with reserved substrings in name to be incorrectly filtered (#12539)
  • Add config and allow meta and docs to exist under it for macros (#12383, #9447)
  • DBT_ENGINE prefixed env vars picked up by CLI (#12583)
  • Fix state:modified not detecting .yml property changes for resource_type:function (#12547)
  • Fix duplicate CTE race condition in ephemeral model compilation (#12602)
  • Allow deferral for UDFs (#12080)
  • Resolve full node description while running udfs for better logging (#12600)
  • Update URL and name of behavior change flag for require_ref_searches_node_package_before_root (#12324)
  • Raise PropertyMovedToConfigDeprecation instead of MissingArgumentsPropertyInGenericTestDeprecation (#12572)
  • Fix list-type metric filters under models key being incorrectly rendered at parse time, causing 'Dimension is undefined' errors (#12618)
  • Add @requires.catalogs decorator to test command to fix custom catalog integration support (#12662)
  • Raise custom key in config deprecation warning for invalid config keys in dbt_project.yml (#12542)
  • Fix IndexError when parsing semantic model that references a disabled or missing model (#12671)
  • Support custom ref kwargs in unit tests and generic data tests, behind behavior flag support_custom_ref_kwargs (#12148)
  • Fix AttributeError when docs block argument is non-constant (#12673)
  • Fix AttributeError when generic test config is non-dictionary (#12674)
  • handle jinja2.Undefined in msgpack_encoder (#12677)
  • Fix inheritance for defaults.agg_time_dimension in semantic models. (#12678)
  • Fix case-insensitive env var lookup on Windows (#10422)
  • Ensure MAX_GROUPING_TOKENS and MAX_GROUPING_DEPTH default to None independently (#12694)
  • Fix EISDIR error when compiling snapshots where a snapshot name matches the source filename (#12568)
  • fix: guard against KeyError for custom constraints in same_contract() (#12699)
  • Suppress stacktrace when snapshot validation fails due to missing strategy or unique_key (#12692)
  • Fixed a bug where UDF function schema was not available in jinja context of on-run-end hook (#12516)
  • fix: handle null tables value in source YAML to prevent TypeError (#12704)
  • We can now enable/disable analyses from dbt_project.yml on a project level or a folder level (#11427)
  • Fix "Cannot use selector" error in dbt source freshness (#12718)
  • Ensure property depr checks check for aliases with plus prefix (#12327)
  • Include exception message in run_results.json for run-operation failures (#12730)
  • fix: exclude test_name not inherited when using selector method (#12753)
  • catch InvalidFieldValue and raise ParsingError during context config generation (#12758)
  • Improve partial parsing of semantic models using new-style yaml. (#12763)
  • Fix regression where node.path for snapshots in subdirectories omitted the subdirectory path (#12783)
  • Skip schema-time rendering of version-level data_tests so they can be rendered later with full context (#12805)
  • Sources and Semantic Model now raise a warning if name contains spaces. Use REQUIRE_SOURCE_AND_SEMANTIC_MODEL_NAMES_WITHOUT_SPACES to raise errors instead. (#12767)
  • Add back the removed descriptions render condition (#12865)
  • Fix regression from #12562 where 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)
  • Allow column-level entity definitions in V2 semantic YAML to omit name, falling back to the column name to match the existing dimension behavior (#DI-4133)
  • Fix 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)
  • Reconstruct unrendered config kwarg values as readable expressions instead of raw AST repr (#15336)
  • Handle Reused node status in on-run-end summary printer so plugins that emit RunResult(status=Reused, ...) don't crash with unhandled result. (#12972)
  • Skip jsonschema_validation if adapter_type is not available (#12992)
  • Fix deferred function references to use alias instead of bare name (#12895)
  • Cap the Python recursion limit while resolving the 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)
  • Honor --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)
  • Strip dbt-core-only DBT_ENGINE_* env vars (e.g. DBT_ENGINE_USE_V2_PARSER, DBT_ENGINE_V2_PARSER) from the v2-parser subprocess env, and expand ~ 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)
  • Write manage_state user_settings in all platform login flows unless explicitly disabled (#13032)
  • Make sure that expires_at in oauth_sessions is int so that its rust interoperable (#13032)
  • Allow for setting of OSI documents directory as project config (#13088)
  • Support lowercase "osi" directory (#13087)
  • Add a 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 the latest_version_pointer collision check quoting/case aware so an unquoted latest-version alias differing from the pointer name only by case is correctly detected on case-insensitive warehouses (#15210)
  • Fix intermittent "references a model that does not exist" parsing error when unit testing versioned models, caused by non-deterministic filesystem parse order (#11139)
  • Fix partial parsing ghost-duplicate that raised a false "found two data_tests" error by cleaning up disabled generic and singular test nodes on schema re-parse (#)
  • Carry ref/source/function dependencies declared inside an overloaded UDF's overload body onto the root function node, so they are not dropped from the DAG when the overload SQL file is absorbed (#15501)
  • Update reuse relations hint text (#15510)
  • Fix macro namespace resolution so a dbt project named after a macro no longer crashes with 'MacroGenerator' during dispatch (#15556)
  • Persist hint_ts in dbt_home and gate rw on bare Except clause to be more defensive (#15510)

Docs

Under the Hood

  • Update schema file order test (#11869)
  • Update jsonschemas for schema.yml and dbt_project.yml deprecations (#12180)
  • Replace setuptools and tox with hatch for build, test, and environment management. (#12151)
  • Add add_catalog_integration call even if we have a pre-existing manifest (#12262)
  • Bump lower bound for dbt-common to 1.37.2 (#12284)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Handle missing column time granularities during parsing. (#12472)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Make test case for parsing metric filters slightly more robust. (#12528)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Unpin sqlparse dependency, and introduce --sqlparse CLI option for configuring sqlparse limits (#12329)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Update jsonschemas for more accurate deprecation warnings: macro.config should not warn (#12670)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Update the naming of the jsonschema file used for project files (#NA)
  • Recategorize unhandled exceptions to DbtException subclasses (#11191)
  • Ensure catalogs.yml is loaded for any command that requires loading a manifest (#12705)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Improve error message for bad semantic_model config object with disallowed fields in V2 SL YAML. (#12766)
  • Improve type hinting for BaseRunner so that more type errors are caught during development (#12803)
  • sync JSON schemas from dbt-fusion (#N/A)
  • GenericSqlRunner (used for programmatic SQL execution via SqlCompileRunner/SqlExecuteRunner) is now a standalone class instead of inheriting from CompileRunner. This fixes a latent AttributeError in handle_exception and correctly separates the programmatic SQL execution path from the DAG runner hierarchy. (#12811)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Drop usage of deprecated warn_or_error handler method (#8133)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Annotate PARAM_TYPE_MAP to fix mypy failure with click 8.4.0 (#N/A)
  • Allow-list additional DBT_ENGINE_STATE_* engine env vars (EMIT_REUSED_STATUS, OAUTH_CLIENT_ID, AUTH_URL, TOKEN_URL, API_URL) (#13002)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Add v2-parser telemetry — forward dbt-core's invocation_id and set DBT_INVOCATION_ENV=dbt-core-v2-parser on the parser subprocess so embedded telemetry correlates with the host invocation, and emit V2ParserStart/V2ParserEnd events around the handoff so pre-startup failures (missing binary, schema mismatch) are also captured. Bumps dbt-protos lower bound to 1.0.514 for the new event messages. (#13029)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Reduce parse-time memory and macro-generation overhead by virtualizing macros and switching flat_graph/WritableManifest to lazy no-copy views (#15524)

Dependencies

  • Use EventCatcher from dbt-common instead of maintaining a local copy (#12124)
  • Upgrading dbt-semantic-interfaces to 0.10.x (#None)
  • Bump minimum click to 8.2.0 (#12305)
  • Bump DSI minimum to 0.10.2 (#NA)
  • Bump dbt-protos minimum to 1.0.418 (#NA)
  • Move click minimum to 8.3.0 (#12378)
  • Bump minimum version of dbt-common to 1.37.3 (#12575)
  • Bump libpq-dev in Docker image from 13.23-0+deb11u1 to 13.23-0+deb11u2 to fix build failure due to superseded package version (#NA)
  • Begin depending on MetricFlow instead of dbt-semantic-interfaces (#12893)
  • Bump libpq-dev in Docker image from 13.23-0+deb11u2 to 13.23-0+deb11u3 to fix build failure due to superseded package version (#NA)
  • Remove unused pytest-logbook and logbook test dependencies from both the default and ci hatch envs. dbt-core dropped its logbook-based logger in (#NA)
  • Bump dbt-adapters lower bound to >=1.24.1 (#12985)
  • Bump the minimum dbt-core-experimental-parser to 2.0.0a1 (#13065)
  • Bump the minimum dbt-core-experimental-parser to 2.0.0a3 (#15391)
  • Bump ca-certificates, libpq-dev, and openssh-client in Docker image to current bullseye versions to fix Docker release build failure caused by superseded package versions (#NA)
  • Bump the minimum dbt-core-experimental-parser to 2.0.0a4 (#13065)
  • Bump dbt-adapters to 1.24.5 lowerbound (#, #)

Contributors


Alecia Beth Moore-Hart (P!NK) (b. 1979)

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.

Don't miss a new dbt-core release

NewReleases is sending notifications on new releases.