dbt found two relations in your warehouse with similar database identifiers
dbt docs generate. That command queries your warehouse’s information schema for every relation in the schemas your project uses, then matches each relation back to a node in your dbt™ project. It lowercases both sides to compare them.
Your warehouse holds two physical relations whose names differ only by letter case. Both lowercase to the same name, so dbt cannot tell which one the node refers to, and it stops before writing the catalog.
On warehouses that uppercase unquoted identifiers, such as Snowflake, this happens when one relation is created unquoted (MY_TABLE, stored uppercase) and another is created quoted ("My_Table", stored as written). A quoted CREATE TABLE, an ingestion tool that quotes identifiers, or a shared database you do not control are the usual origins.
Three things are worth knowing before you start looking:
- The duplicate is in your warehouse, not in your dbt™ project. Searching your repository or comparing branches finds only one model or source definition, which is correct. That single definition is the one dbt cannot match to a relation.
dbt compilecannot detect this. Compile parses the project and renders Jinja; it never queries the information schema. A green compile run tells you nothing about whether the Catalog will build.- Setting
quotinginsources.ymldoes not fix it. Quoting controls how dbt™ writes the identifier when it queries your data. The catalog matcher lowercases regardless, so both relations still collide.
-
List both relations. On Snowflake:
-
Compare
created,last_alteredandrow_countacross the two rows to work out which relation your pipeline actually writes to. -
Drop or rename the other one. The mixed-case relation must be quoted to address it:
-
Rebuild the Catalog. You can wait for the overnight refresh, run
paradime catalog refreshfrom your terminal, or add the Refresh Paradime Catalog command to a Bolt schedule.