dbt-labs / dbt-labs/dbt

feat(clickhouse): support for model contracts

Open
#14,581 1 comment 0 reactions 0 assignees View on GitHub
adapter:clickhouse area:adapters engine:v2 type:feature
Dominant language
Rust
Stars
13.8k
Forks
2.6k
Avg merge
21h 31m
Merged PRs (30d)
56

Description

## Context

The vendored `dbt-clickhouse` macro package implements contract enforcement via `clickhouse__get_assert_columns_equivalent` in `macros/column_spec_ddl.sql`. This macro is invoked whenever a ClickHouse model has `contract: enforced: true` set. It requires two adapter methods to be properly wired for ClickHouse:

```jinja
{%- set sql_file_provided_columns = adapter.get_column_schema_from_query(sql) -%}
{%- set sql_columns = adapter.format_columns(sql_file_provided_columns) -%}
```

## Work items

### `adapter.get_column_schema_from_query(sql)`
Already exists as a generic Fusion base adapter method. Needs verification that it handles ClickHouse's type system correctly — ClickHouse has unusual types (`LowCardinality(String)`, `Nullable(UInt64)`, `DateTime64(3)`, etc.) that may require ClickHouse-specific handling in the returned column schema.

### `adapter.format_columns(sql_file_provided_columns)`
Takes the raw column schema objects from `get_column_schema_from_query` and normalizes them into `{name, data_type}` dicts for comparison against YAML contract columns. Needs to exist as a generic or ClickHouse-specific method and produce output comparable to what the YAML contract specifies.

## Scope

Neither method is called for normal (non-contract) models — this is entirely gated behind `contract: enforced: true`. Safe to defer until basic table/view/incremental materializations are stable.

## References
- Macro: `macros/column_spec_ddl.sql` in dbt-labs/fs#9883
- Beta materializations issue (distributed/dictionary/S3): dbt-labs/dbt-core#14580
- Athena precedent: dbt-labs/fs#9460

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.