Skip to content

Cast CTAS output to Iceberg storage types#1088

Merged
Tishj merged 1 commit into
duckdb:v1.5-variegatafrom
NiclasHaderer:nh/ctas-fix
Jun 23, 2026
Merged

Cast CTAS output to Iceberg storage types#1088
Tishj merged 1 commit into
duckdb:v1.5-variegatafrom
NiclasHaderer:nh/ctas-fix

Conversation

@NiclasHaderer

Copy link
Copy Markdown
Contributor

CTAS derives its columns from the SELECT output types, but the table (and its write pipeline) is created with the Iceberg storage types. These differ for types that have no Iceberg equivalent (e.g. HUGEINT).

The CTAS write appends the SELECT chunks straight into a ColumnDataCollection typed with the storage types, so the types disagree (HUGEINT vs DECIMAL(38,0)). This trips D_ASSERT(types == input_types) in assertion builds; in release it is masked only because HUGEINT and DECIMAL(38,0) share the INT128 layout.

Fix:
Insert a projection above the CTAS plan that casts each column to its Iceberg storage type before the write. The storage types come from IcebergCreateTableRequest::CreateIcebergSchema (the same source the table is created from), and the cast reuses BoundCastExpression::AddCastToType so nested types are handled recursively. The projection is skipped when no column needs a cast.

@Tishj
Tishj merged commit fa4d3d5 into duckdb:v1.5-variegata Jun 23, 2026
27 checks passed
@Tishj

Tishj commented Jun 23, 2026

Copy link
Copy Markdown
Member

Thanks!

@NiclasHaderer

Copy link
Copy Markdown
Contributor Author

As an aside, should I start targeting main with my prs?

NiclasHaderer added a commit to motherduckdb/duckdb-iceberg that referenced this pull request Jun 23, 2026
@Tishj Tishj mentioned this pull request Jun 24, 2026
NiclasHaderer added a commit to motherduckdb/duckdb-iceberg that referenced this pull request Jun 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants