#16354·dbt-core

[v2 Bug] Unit test `format: sql` fixture files compile to the literal `None`

Author: arborlukeCreated Sep 18, 2026Updated Sep 18, 2026
Labelstriage

Is this a new bug in dbt v2.x compared to the latest version of dbt 1.x?

  • I believe this is a new bug in dbt v2.x
  • I have searched the existing issues and could not find a duplicate

Current Behavior

Under the v2 parser, a unit test given input declared as format: sql with a fixture: file reference compiles with the fixture body replaced by the literal string None. The fixture file is never read.

The generated CTE is therefore invalid:

sql
with __dbt__cte__upstream_model as (
None
) select id, label from __dbt__cte__upstream_model

The warehouse then reports the CTE as a missing object. On Snowflake:

Database Error
  002003 (42S02): SQL compilation error:
  Object '__DBT__CTE__UPSTREAM_MODEL' does not exist or not authorized.

Two things make this hard to diagnose:

  1. There is no warning at parse time that the fixture file was not found. The parse succeeds and the failure surfaces only as a warehouse error at execution.
  2. The error names the CTE as a missing object, which points a reader at grants, lineage, or the model's FROM clause. The actual fault is the empty CTE body.

Expected Behavior

The fixture file's contents are inlined as the CTE body, as they are under the 1.x Python parser:

sql
with __dbt__cte__upstream_model as (
select 1 as id, 'a' as label
) select id, label from __dbt__cte__upstream_model

Failing that, a parse-time error naming the fixture that could not be resolved, rather than emitting None and deferring to the warehouse.

Steps To Reproduce

Minimal project. dbt_project.yml contains:

yaml
flags:
  use_v2_parser: true

models/upstream_model.sql:

sql
select 1 as id, 'a' as label

models/downstream_model.sql:

sql
select id, label from {{ ref('upstream_model') }}

models/schema.yml:

yaml
version: 2
unit_tests:
  - name: test_downstream_model
    model: downstream_model
    given:
      - input: ref('upstream_model')
        format: sql
        fixture: upstream_rows
    expect:
      rows:
        - {id: 1, label: a}

tests/fixtures/upstream_rows.sql:

sql
select 1 as id, 'a' as label

Then:

  1. dbt build --select upstream_model (so the unit test has a target schema)
  2. dbt test --select test_downstream_model — fails
  3. Inspect target/compiled/<project>/models/schema.yml/models/test_downstream_model.sql and note the CTE body is None
  4. Re-run step 2 with DBT_ENGINE_USE_V2_PARSER=0 — the CTE body contains the fixture SQL and the test passes

Step 4 is the A/B: same dbt-core version, same project, same adapter, only the parser differs.

Parser Compiled CTE body Result
v2 None ERROR
1.x Python (DBT_ENGINE_USE_V2_PARSER=0) the fixture SQL PASS

Substituting the same SQL inline resolves it, which further isolates the fault to file resolution rather than to SQL fixtures generally:

yaml
      - input: ref('upstream_model')
        format: sql
        rows: |
          select 1 as id, 'a' as label

Relevant log output

bash
Completed with 1 error, 0 partial successes, and 0 warnings:

[ERROR]: in unit_test test_downstream_model (models/schema.yml)
  Runtime Error in unit_test test_downstream_model (models/schema.yml)
  An error occurred during execution of unit test 'test_downstream_model'.
  There may be an error in the unit test definition: check the data types.
   Database Error
    002003 (42S02): SQL compilation error:
    Object '__DBT__CTE__UPSTREAM_MODEL' does not exist or not authorized.

Done. PASS=0 WARN=0 ERROR=1 SKIP=0 NO-OP=0 REUSED=0 TOTAL=1

Environment

markdown
- OS: macOS (Darwin 27.0.0)
- CPU: ARM
- dbt distribution and version: reproduced on two combinations
  - dbt-core 1.12.4 with dbt-core-experimental-parser 2.0.0rc2
  - dbt-core 1.12.5 with dbt-core-experimental-parser 2.0.4
- adapter: dbt-snowflake 1.12.0 and 1.12.1

Which database adapter are you using?

snowflake

Is this a discrepancy vs. dbt 1.x?

  • Yes — this works in dbt 1.x but not in dbt v2.x

Additional Context

Present in both the release candidate and the current GA parser (2.0.4), so it is not fixed by upgrading within the 2.0.x line.

One consequence worth flagging: --exclude resource_type:test does not exclude resource_type:unit_test, so a build that deliberately skips tests still runs unit tests. A project using SQL fixture files will therefore see a scheduled production build fail on this, with an error that reads like a permissions problem.

I have not tested whether format: csv fixture files are affected.