diff --git a/fluss-lake/fluss-lake-lance/src/main/java/com/alibaba/fluss/lake/lance/LanceLakeCatalog.java b/fluss-lake/fluss-lake-lance/src/main/java/com/alibaba/fluss/lake/lance/LanceLakeCatalog.java index daaf26eb2a..827c9582d7 100644 --- a/fluss-lake/fluss-lake-lance/src/main/java/com/alibaba/fluss/lake/lance/LanceLakeCatalog.java +++ b/fluss-lake/fluss-lake-lance/src/main/java/com/alibaba/fluss/lake/lance/LanceLakeCatalog.java @@ -18,6 +18,7 @@ package com.alibaba.fluss.lake.lance; import com.alibaba.fluss.config.Configuration; +import com.alibaba.fluss.exception.InvalidTableException; import com.alibaba.fluss.lake.lakestorage.LakeCatalog; import com.alibaba.fluss.lake.lance.utils.LanceArrowUtils; import com.alibaba.fluss.lake.lance.utils.LanceDatasetAdapter; @@ -58,6 +59,12 @@ public LanceLakeCatalog(Configuration config) { @Override public void createTable(TablePath tablePath, TableDescriptor tableDescriptor) { + // currently, we don't support primary key table for lance + if (tableDescriptor.hasPrimaryKey()) { + throw new InvalidTableException( + "Currently, we don't support tiering a primary key table to Lance"); + } + LanceConfig config = LanceConfig.from( options.toMap(), tablePath.getDatabaseName(), tablePath.getTableName()); diff --git a/fluss-lake/fluss-lake-lance/src/test/java/com/alibaba/fluss/lake/lance/LakeEnabledTableCreateITCase.java b/fluss-lake/fluss-lake-lance/src/test/java/com/alibaba/fluss/lake/lance/LakeEnabledTableCreateITCase.java index e0c16e30dd..1b071e8674 100644 --- a/fluss-lake/fluss-lake-lance/src/test/java/com/alibaba/fluss/lake/lance/LakeEnabledTableCreateITCase.java +++ b/fluss-lake/fluss-lake-lance/src/test/java/com/alibaba/fluss/lake/lance/LakeEnabledTableCreateITCase.java @@ -23,6 +23,7 @@ import com.alibaba.fluss.config.ConfigOptions; import com.alibaba.fluss.config.Configuration; import com.alibaba.fluss.exception.FlussRuntimeException; +import com.alibaba.fluss.exception.InvalidTableException; import com.alibaba.fluss.lake.lance.utils.LanceDatasetAdapter; import com.alibaba.fluss.metadata.DataLakeFormat; import com.alibaba.fluss.metadata.Schema; @@ -49,6 +50,7 @@ import static com.alibaba.fluss.metadata.TableDescriptor.OFFSET_COLUMN_NAME; import static com.alibaba.fluss.metadata.TableDescriptor.TIMESTAMP_COLUMN_NAME; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** ITCase for create lake enabled table with lance as lake storage. */ class LakeEnabledTableCreateITCase { @@ -201,4 +203,24 @@ void testLogTable() throws Exception { logC18, logC19)); assertThat(expectedSchema).isEqualTo(LanceDatasetAdapter.getSchema(config).get()); } + + @Test + void testPrimaryKeyTable() throws Exception { + TableDescriptor pkTable = + TableDescriptor.builder() + .schema( + Schema.newBuilder() + .column("pk_c1", DataTypes.INT()) + .column("pk_c2", DataTypes.STRING()) + .primaryKey("pk_c1") + .build()) + .distributedBy(BUCKET_NUM) + .property(ConfigOptions.TABLE_DATALAKE_ENABLED, true) + .build(); + TablePath pkTablePath = TablePath.of(DATABASE, "pk_table"); + assertThatThrownBy(() -> admin.createTable(pkTablePath, pkTable, false).get()) + .cause() + .isInstanceOf(InvalidTableException.class) + .hasMessage("Currently, we don't support tiering a primary key table to Lance"); + } }