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);

Reply via email to