From 3fb26b73058632647fb6d6d3c9cb4b6082dc2913 Mon Sep 17 00:00:00 2001 From: christiancasazza Date: Tue, 17 Mar 2026 13:20:29 -0400 Subject: [PATCH] fix: add missing end_snapshot IS NULL filter in Postgres and MySQL get_table_structure() The PostgreSQL and MySQL metadata providers were missing 'AND end_snapshot IS NULL' in get_table_structure(), causing all historical column rows to be returned instead of only current ones. When a column's properties change (e.g. nullability), DuckLake closes the old row (end_snapshot = N) and creates a new one (end_snapshot = NULL). Without the filter, both rows are returned, creating duplicate column names in the Arrow schema, which DataFusion rejects with: Schema error: Schema contains duplicate qualified field name The DuckDB provider already has this filter via the shared SQL_GET_TABLE_COLUMNS constant. The SQLite provider has it in its inline SQL. Only PostgreSQL and MySQL were missing it. --- src/metadata_provider_mysql.rs | 2 +- src/metadata_provider_postgres.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metadata_provider_mysql.rs b/src/metadata_provider_mysql.rs index e802523..08ea16d 100644 --- a/src/metadata_provider_mysql.rs +++ b/src/metadata_provider_mysql.rs @@ -141,7 +141,7 @@ impl MetadataProvider for MySqlMetadataProvider { let rows = sqlx::query( "SELECT column_id, column_name, column_type, nulls_allowed FROM ducklake_column - WHERE table_id = ? + WHERE table_id = ? AND end_snapshot IS NULL ORDER BY column_order", ) .bind(table_id) diff --git a/src/metadata_provider_postgres.rs b/src/metadata_provider_postgres.rs index 7cbc934..568f276 100644 --- a/src/metadata_provider_postgres.rs +++ b/src/metadata_provider_postgres.rs @@ -175,7 +175,7 @@ impl MetadataProvider for PostgresMetadataProvider { let rows = sqlx::query( "SELECT column_id, column_name, column_type, nulls_allowed FROM ducklake_column - WHERE table_id = $1 + WHERE table_id = $1 AND end_snapshot IS NULL ORDER BY column_order", ) .bind(table_id)