This is an automated email from the ASF dual-hosted git repository.
yuzelin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new a1fbb339c9 [core] Validate create table for format table with primary
key (#5732)
a1fbb339c9 is described below
commit a1fbb339c937aca4e159213871ca1a1215b36fec
Author: Jingsong Lee <[email protected]>
AuthorDate: Wed Jun 11 17:02:09 2025 +0800
[core] Validate create table for format table with primary key (#5732)
---
.../org/apache/paimon/catalog/AbstractCatalog.java | 4 ++--
.../org/apache/paimon/catalog/CatalogUtils.java | 25 +++++++++++++++-------
.../java/org/apache/paimon/rest/RESTCatalog.java | 4 ++--
.../org/apache/paimon/catalog/CatalogTestBase.java | 12 +++++++++++
4 files changed, 33 insertions(+), 12 deletions(-)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
index c69d2b4691..e4206cad9f 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
@@ -70,7 +70,7 @@ import static
org.apache.paimon.catalog.CatalogUtils.checkNotSystemDatabase;
import static org.apache.paimon.catalog.CatalogUtils.checkNotSystemTable;
import static org.apache.paimon.catalog.CatalogUtils.isSystemDatabase;
import static
org.apache.paimon.catalog.CatalogUtils.listPartitionsFromFileSystem;
-import static org.apache.paimon.catalog.CatalogUtils.validateAutoCreateClose;
+import static org.apache.paimon.catalog.CatalogUtils.validateCreateTable;
import static org.apache.paimon.catalog.Identifier.DEFAULT_MAIN_BRANCH;
import static org.apache.paimon.options.CatalogOptions.LOCK_ENABLED;
import static org.apache.paimon.options.CatalogOptions.LOCK_TYPE;
@@ -358,7 +358,7 @@ public abstract class AbstractCatalog implements Catalog {
throws TableAlreadyExistException, DatabaseNotExistException {
checkNotBranch(identifier, "createTable");
checkNotSystemTable(identifier, "createTable");
- validateAutoCreateClose(schema.options());
+ validateCreateTable(schema);
validateCustomTablePath(schema.options());
// check db exists
diff --git
a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
index 37346aac94..39e41457c0 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
@@ -25,6 +25,7 @@ import org.apache.paimon.fs.Path;
import org.apache.paimon.manifest.PartitionEntry;
import org.apache.paimon.options.Options;
import org.apache.paimon.partition.Partition;
+import org.apache.paimon.schema.Schema;
import org.apache.paimon.schema.SchemaManager;
import org.apache.paimon.schema.TableSchema;
import org.apache.paimon.table.CatalogEnvironment;
@@ -48,9 +49,11 @@ import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
+import static org.apache.paimon.CoreOptions.AUTO_CREATE;
import static org.apache.paimon.CoreOptions.PARTITION_DEFAULT_NAME;
import static org.apache.paimon.CoreOptions.PARTITION_GENERATE_LEGCY_NAME;
import static org.apache.paimon.CoreOptions.PATH;
+import static org.apache.paimon.CoreOptions.PRIMARY_KEY;
import static org.apache.paimon.catalog.Catalog.SYSTEM_DATABASE_NAME;
import static org.apache.paimon.catalog.Catalog.TABLE_DEFAULT_OPTION_PREFIX;
import static
org.apache.paimon.options.OptionsUtils.convertToPropertiesPrefixKey;
@@ -127,15 +130,21 @@ public class CatalogUtils {
}
}
- public static void validateAutoCreateClose(Map<String, String> options) {
+ public static void validateCreateTable(Schema schema) {
+ Options options = Options.fromMap(schema.options());
checkArgument(
- !Boolean.parseBoolean(
- options.getOrDefault(
- CoreOptions.AUTO_CREATE.key(),
-
CoreOptions.AUTO_CREATE.defaultValue().toString())),
- String.format(
- "The value of %s property should be %s.",
- CoreOptions.AUTO_CREATE.key(), Boolean.FALSE));
+ !options.get(AUTO_CREATE),
+ "The value of %s property should be %s.",
+ AUTO_CREATE.key(),
+ Boolean.FALSE);
+
+ TableType tableType = options.get(CoreOptions.TYPE);
+ if (tableType.equals(TableType.FORMAT_TABLE)) {
+ checkArgument(
+ options.get(PRIMARY_KEY) == null,
+ "Cannot define %s for format table.",
+ PRIMARY_KEY.key());
+ }
}
public static void validateNamePattern(Catalog catalog, String
namePattern) {
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
index e17114ab4e..82197f4337 100644
--- a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
@@ -80,7 +80,7 @@ import static
org.apache.paimon.catalog.CatalogUtils.checkNotSystemDatabase;
import static org.apache.paimon.catalog.CatalogUtils.checkNotSystemTable;
import static org.apache.paimon.catalog.CatalogUtils.isSystemDatabase;
import static
org.apache.paimon.catalog.CatalogUtils.listPartitionsFromFileSystem;
-import static org.apache.paimon.catalog.CatalogUtils.validateAutoCreateClose;
+import static org.apache.paimon.catalog.CatalogUtils.validateCreateTable;
import static org.apache.paimon.options.CatalogOptions.CASE_SENSITIVE;
/** A catalog implementation for REST. */
@@ -426,7 +426,7 @@ public class RESTCatalog implements Catalog {
try {
checkNotBranch(identifier, "createTable");
checkNotSystemTable(identifier, "createTable");
- validateAutoCreateClose(schema.options());
+ validateCreateTable(schema);
api.createTable(identifier, schema);
} catch (AlreadyExistsException e) {
if (!ignoreIfExists) {
diff --git
a/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
b/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
index a877408e41..46eaac25c0 100644
--- a/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
+++ b/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
@@ -20,6 +20,7 @@ package org.apache.paimon.catalog;
import org.apache.paimon.CoreOptions;
import org.apache.paimon.PagedList;
+import org.apache.paimon.TableType;
import org.apache.paimon.data.BinaryString;
import org.apache.paimon.data.GenericRow;
import org.apache.paimon.fs.FileIO;
@@ -438,6 +439,17 @@ public abstract class CatalogTestBase {
.withMessage("The value of auto-create property should be
false.");
schema.options().remove(CoreOptions.AUTO_CREATE.key());
+ // Create table throws Exception when type = format-table.
+ if (supportsFormatTable()) {
+ schema.options().put(CoreOptions.TYPE.key(),
TableType.FORMAT_TABLE.toString());
+ schema.options().put(CoreOptions.PRIMARY_KEY.key(), "a");
+ assertThatExceptionOfType(IllegalArgumentException.class)
+ .isThrownBy(() -> catalog.createTable(identifier, schema,
false))
+ .withMessage("Cannot define primary-key for format
table.");
+ schema.options().remove(CoreOptions.TYPE.key());
+ schema.options().remove(CoreOptions.PRIMARY_KEY.key());
+ }
+
// Create table and check the schema
schema.options().put("k1", "v1");
catalog.createTable(identifier, schema, false);