-
Notifications
You must be signed in to change notification settings - Fork 23
Description
Is there an existing issue for this?
- I have searched the existing issues
Current Behavior
Hello, I am the author of the dbt_constraints package and I am attempting to add support for dbt-oracle.
I am receiving the following error when my code runs adapter.get_relation():
Encountered an error:
Compilation Error in operation dbt_constraints-on-run-end-0 (./dbt_project.yml)
When searching for a relation, dbt found an approximate match. Instead of guessing
which relation to use, dbt will move on. Please delete DBT_USER.dim_customers, or rename it to be less ambiguous.
Searched for: dbt_user.dim_customers
Found: DBT_USER.dim_customers
I have a schema named DBT_USER and I have specified the the schema in upper case in my profile.
I believe the root cause is how dbt-oracle changes the case of objects in your catalog.sql:
select
lower(tables.table_catalog) as "table_database",
lower(tables.table_schema) as "table_schema",
lower(tables.table_name) as "table_name",
lower(tables.table_type) as "table_type",
all_tab_comments.comments as "table_comment",
lower(columns.column_name) as "column_name",
ordinal_position as "column_index",
lower(case
when data_type like '%CHAR%'
then data_type || '(' || cast(char_length as varchar(10)) || ')'
else data_type
end) as "column_type",
all_col_comments.comments as "column_comment",
tables.table_schema as "table_owner"
from tables
I work for Snowflake and our database uses exactly the same conventions as Oracle for how identifiers are treated with and without quotes. Identifiers become upper case if not quoted and case sensitive if quoted. Therefore, I think it can be helpful to compare some of your code against the dbt-Labs code for dbt-Snowflake. In the dbt-Labs implementation of dbt-Snowflake they do not adjust the case of our databases, schemas, tables, or columns in the catalog.sql
There could also be an issue with the oracle__get_columns_in_relation macro:
select
lower(column_name) as "name",
lower(data_type) as "type",
char_length as "character_maximum_length",
numeric_precision as "numeric_precision",
numeric_scale as "numeric_scale"
from columns
In the snowflake__get_columns_in_relation macro dbt-labs uses DESCRIBE TABLE to retrieve columns and they do not change the case of column names or data types (upper case just like Oracle).
I reviewed all the SQL lookups dbt-Labs uses for Snowflake and I consistently see they use UPPER() = UPPER() in their WHERE clauses but in all other cases their metadata lookups preserve the case for databases, schema, tables, and columns. I recommend dbt-Oracle should do the same.
Expected Behavior
No response
Steps To Reproduce
No response
Relevant log output using --debug flag enabled
No response
Environment
- OS: MacOS
- Python: 3.8.13
- dbt: 1.0.6What Oracle database version are you using dbt with?
Oracle XE 21c
Additional Context
No response