From 36e3332bab96a8565bebacfa59801a7a23858c75 Mon Sep 17 00:00:00 2001 From: Junfan Zhang Date: Wed, 28 Jan 2026 14:21:15 +0800 Subject: [PATCH 1/2] [iceberg] fast fail when creating table of iceberg with multi key fields --- .../org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java b/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java index 9ca70b12622..9f7d320d466 100644 --- a/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java +++ b/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java @@ -92,6 +92,13 @@ protected Catalog getIcebergCatalog() { @Override public void createTable(TablePath tablePath, TableDescriptor tableDescriptor, Context context) throws TableAlreadyExistException { + // validate single key field requirement + List keys = tableDescriptor.getBucketKeys(); + checkArgument( + keys.size() == 1, + "Key fields must have exactly one field for iceberg format, but got: %s", + keys); + // convert Fluss table path to iceberg table boolean isPkTable = tableDescriptor.hasPrimaryKey(); TableIdentifier icebergId = toIcebergTableIdentifier(tablePath); From 5ceda9be5a0c953eee6b2d9c9030cf7897532eeb Mon Sep 17 00:00:00 2001 From: Junfan Zhang Date: Wed, 4 Feb 2026 13:37:51 +0800 Subject: [PATCH 2/2] fix --- .../org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java | 6 +++--- .../apache/fluss/lake/iceberg/IcebergLakeCatalogTest.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java b/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java index 9f7d320d466..7db0a1957a0 100644 --- a/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java +++ b/fluss-lake/fluss-lake-iceberg/src/main/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalog.java @@ -92,11 +92,11 @@ protected Catalog getIcebergCatalog() { @Override public void createTable(TablePath tablePath, TableDescriptor tableDescriptor, Context context) throws TableAlreadyExistException { - // validate single key field requirement + // validate at most one key field requirement List keys = tableDescriptor.getBucketKeys(); checkArgument( - keys.size() == 1, - "Key fields must have exactly one field for iceberg format, but got: %s", + keys.size() <= 1, + "Iceberg format supports at most one bucket key, but got: %s", keys); // convert Fluss table path to iceberg table diff --git a/fluss-lake/fluss-lake-iceberg/src/test/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalogTest.java b/fluss-lake/fluss-lake-iceberg/src/test/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalogTest.java index 991a3286884..30f2b82f1c0 100644 --- a/fluss-lake/fluss-lake-iceberg/src/test/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalogTest.java +++ b/fluss-lake/fluss-lake-iceberg/src/test/java/org/apache/fluss/lake/iceberg/IcebergLakeCatalogTest.java @@ -290,8 +290,8 @@ void rejectsPrimaryKeyTableWithMultipleBucketKeys() { tablePath, tableDescriptor, new TestingLakeCatalogContext())) - .isInstanceOf(UnsupportedOperationException.class) - .hasMessageContaining("Only one bucket key is supported for Iceberg"); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Iceberg format supports at most one bucket key"); } @Test @@ -442,8 +442,8 @@ void rejectsLogTableWithMultipleBucketKeys() { tablePath, tableDescriptor, new TestingLakeCatalogContext())) - .isInstanceOf(UnsupportedOperationException.class) - .hasMessageContaining("Only one bucket key is supported for Iceberg"); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Iceberg format supports at most one bucket key"); } @ParameterizedTest