Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/metadata_writer_sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,11 @@ impl MetadataWriter for SqliteMetadataWriter {
columns: &[ColumnDef],
snapshot_id: i64,
) -> Result<Vec<i64>> {
if columns.is_empty() {
return Err(crate::DuckLakeError::InvalidConfig(
"Table must have at least one column".to_string(),
));
}
block_on(async {
// Use a transaction to ensure atomicity: if column insertion fails,
// we don't leave existing columns marked as ended
Expand Down Expand Up @@ -328,6 +333,11 @@ impl MetadataWriter for SqliteMetadataWriter {
columns: &[ColumnDef],
mode: WriteMode,
) -> Result<WriteSetupResult> {
if columns.is_empty() {
return Err(crate::DuckLakeError::InvalidConfig(
"Table must have at least one column".to_string(),
));
}
block_on(async {
let mut tx = self.pool.begin().await?;

Expand Down
23 changes: 23 additions & 0 deletions tests/write_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -909,3 +909,26 @@ async fn test_append_reorder_columns() {
.value(0);
assert_eq!(count, 4);
}

#[tokio::test(flavor = "multi_thread")]
async fn test_zero_column_table_rejected() {
let (writer, _temp_dir) = create_test_env().await;
let object_store = create_object_store();

// An empty Arrow schema (zero columns)
let schema = Arc::new(Schema::empty());

let batch = RecordBatch::new_empty(schema.clone());

let table_writer = DuckLakeTableWriter::new(Arc::new(writer), object_store).unwrap();
let result = table_writer
.write_table("main", "empty_cols", &[batch])
.await;
assert!(result.is_err(), "Zero-column table should be rejected");
let err = result.unwrap_err().to_string();
assert!(
err.contains("at least one column"),
"Error should mention needing at least one column: {}",
err
);
}
Loading