You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@paimon.apache.org by ni...@apache.org on 2023/03/24 13:29:00 UTC

[incubator-paimon] branch master updated: [core] Public API and add partitionKeys,primaryKeys,options to table (#711)

This is an automated email from the ASF dual-hosted git repository.

nicholasjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 6afecb90f [core] Public API and add partitionKeys,primaryKeys,options to table (#711)
6afecb90f is described below

commit 6afecb90fa77eaf5c37139487432a1e02cab579d
Author: Jingsong Lee <ji...@gmail.com>
AuthorDate: Fri Mar 24 21:28:54 2023 +0800

    [core] Public API and add partitionKeys,primaryKeys,options to table (#711)
---
 .../java/org/apache/paimon/annotation/Public.java  | 19 ++++++++-------
 .../org/apache/paimon/catalog/CatalogContext.java  |  4 ++--
 .../java/org/apache/paimon/data/BinaryArray.java   |  4 ++--
 .../java/org/apache/paimon/data/BinaryMap.java     |  4 ++--
 .../java/org/apache/paimon/data/BinaryRow.java     |  4 ++--
 .../java/org/apache/paimon/data/BinaryString.java  |  4 ++--
 .../java/org/apache/paimon/data/DataGetters.java   |  4 ++--
 .../main/java/org/apache/paimon/data/Decimal.java  |  4 ++--
 .../java/org/apache/paimon/data/GenericArray.java  |  4 ++--
 .../java/org/apache/paimon/data/GenericMap.java    |  4 ++--
 .../java/org/apache/paimon/data/GenericRow.java    |  4 ++--
 .../java/org/apache/paimon/data/InternalArray.java |  4 ++--
 .../java/org/apache/paimon/data/InternalMap.java   |  4 ++--
 .../java/org/apache/paimon/data/InternalRow.java   |  4 ++--
 .../java/org/apache/paimon/data/JoinedRow.java     |  4 ++--
 .../java/org/apache/paimon/data/Timestamp.java     |  4 ++--
 .../src/main/java/org/apache/paimon/fs/FileIO.java |  4 ++--
 .../java/org/apache/paimon/fs/FileIOLoader.java    |  4 ++--
 .../main/java/org/apache/paimon/fs/FileStatus.java |  4 ++--
 .../src/main/java/org/apache/paimon/fs/Path.java   |  4 ++--
 .../org/apache/paimon/fs/PositionOutputStream.java |  4 ++--
 .../org/apache/paimon/fs/SeekableInputStream.java  |  4 ++--
 .../paimon/fs/UnsupportedSchemeException.java      |  4 ++--
 .../org/apache/paimon/memory/MemorySegment.java    |  4 ++--
 .../apache/paimon/memory/MemorySegmentSource.java  |  4 ++--
 .../org/apache/paimon/options/ConfigOption.java    |  4 ++--
 .../org/apache/paimon/options/ConfigOptions.java   |  4 ++--
 .../java/org/apache/paimon/options/MemorySize.java |  4 ++--
 .../java/org/apache/paimon/options/Options.java    |  4 ++--
 .../paimon/options/description/Description.java    |  4 ++--
 .../org/apache/paimon/predicate/Predicate.java     |  4 ++--
 .../apache/paimon/predicate/PredicateBuilder.java  |  4 ++--
 .../org/apache/paimon/reader/RecordReader.java     |  4 ++--
 .../java/org/apache/paimon/types/ArrayType.java    |  4 ++--
 .../java/org/apache/paimon/types/BigIntType.java   |  4 ++--
 .../java/org/apache/paimon/types/BinaryType.java   |  4 ++--
 .../java/org/apache/paimon/types/BooleanType.java  |  4 ++--
 .../java/org/apache/paimon/types/CharType.java     |  4 ++--
 .../java/org/apache/paimon/types/DataField.java    |  4 ++--
 .../java/org/apache/paimon/types/DataType.java     |  4 ++--
 .../paimon/types/DataTypeDefaultVisitor.java       |  4 ++--
 .../org/apache/paimon/types/DataTypeFamily.java    |  4 ++--
 .../java/org/apache/paimon/types/DataTypeRoot.java |  4 ++--
 .../org/apache/paimon/types/DataTypeVisitor.java   |  4 ++--
 .../java/org/apache/paimon/types/DataTypes.java    |  4 ++--
 .../java/org/apache/paimon/types/DateType.java     |  4 ++--
 .../java/org/apache/paimon/types/DecimalType.java  |  4 ++--
 .../java/org/apache/paimon/types/DoubleType.java   |  4 ++--
 .../java/org/apache/paimon/types/FloatType.java    |  4 ++--
 .../main/java/org/apache/paimon/types/IntType.java |  4 ++--
 .../paimon/types/LocalZonedTimestampType.java      |  4 ++--
 .../main/java/org/apache/paimon/types/MapType.java |  4 ++--
 .../java/org/apache/paimon/types/MultisetType.java |  4 ++--
 .../main/java/org/apache/paimon/types/RowKind.java |  4 ++--
 .../main/java/org/apache/paimon/types/RowType.java |  4 ++--
 .../java/org/apache/paimon/types/SmallIntType.java |  4 ++--
 .../java/org/apache/paimon/types/TimeType.java     |  4 ++--
 .../org/apache/paimon/types/TimestampType.java     |  4 ++--
 .../java/org/apache/paimon/types/TinyIntType.java  |  4 ++--
 .../org/apache/paimon/types/VarBinaryType.java     |  4 ++--
 .../java/org/apache/paimon/types/VarCharType.java  |  4 ++--
 .../org/apache/paimon/utils/CloseableIterator.java |  4 ++--
 .../java/org/apache/paimon/catalog/Catalog.java    |  4 ++--
 .../org/apache/paimon/catalog/CatalogFactory.java  |  4 ++--
 .../org/apache/paimon/catalog/CatalogLock.java     |  4 ++--
 .../java/org/apache/paimon/catalog/Identifier.java |  4 ++--
 .../org/apache/paimon/disk/BufferFileReader.java   |  4 ++--
 .../org/apache/paimon/disk/BufferFileWriter.java   |  4 ++--
 .../java/org/apache/paimon/disk/FileIOChannel.java |  4 ++--
 .../java/org/apache/paimon/disk/IOManager.java     |  4 ++--
 .../main/java/org/apache/paimon/memory/Buffer.java |  4 ++--
 .../apache/paimon/memory/MemorySegmentPool.java    |  4 ++--
 .../java/org/apache/paimon/operation/Lock.java     |  4 ++--
 .../main/java/org/apache/paimon/schema/Schema.java |  4 ++--
 .../org/apache/paimon/schema/SchemaChange.java     |  4 ++--
 .../paimon/table/AbstractFileStoreTable.java       | 13 ++++++-----
 .../java/org/apache/paimon/table/DataTable.java    |  2 +-
 .../org/apache/paimon/table/FileStoreTable.java    | 18 ++++++++++++++-
 .../org/apache/paimon/table/ReadonlyTable.java     | 20 ++++++++++++++++
 .../org/apache/paimon/table/SupportsPartition.java | 27 ----------------------
 .../main/java/org/apache/paimon/table/Table.java   | 18 +++++++++++++--
 .../apache/paimon/table/sink/BatchTableCommit.java |  4 ++--
 .../apache/paimon/table/sink/BatchTableWrite.java  |  4 ++--
 .../paimon/table/sink/BatchWriteBuilder.java       |  4 ++--
 .../apache/paimon/table/sink/CommitMessage.java    |  4 ++--
 .../paimon/table/sink/StreamTableCommit.java       |  4 ++--
 .../apache/paimon/table/sink/StreamTableWrite.java |  4 ++--
 .../paimon/table/sink/StreamWriteBuilder.java      |  4 ++--
 .../org/apache/paimon/table/sink/TableCommit.java  |  4 ++--
 .../org/apache/paimon/table/sink/TableWrite.java   |  4 ++--
 .../org/apache/paimon/table/sink/WriteBuilder.java |  4 ++--
 .../paimon/table/source/EndOfScanException.java    |  4 ++--
 .../apache/paimon/table/source/ReadBuilder.java    |  4 ++--
 .../java/org/apache/paimon/table/source/Split.java |  4 ++--
 .../paimon/table/source/StreamTableScan.java       |  4 ++--
 .../org/apache/paimon/table/source/TableRead.java  |  4 ++--
 .../org/apache/paimon/table/source/TableScan.java  |  6 ++---
 .../apache/paimon/table/system/AuditLogTable.java  | 20 ++++++++++++++--
 .../apache/paimon/table/system/BucketsTable.java   | 14 +++++++++--
 .../org/apache/paimon/table/system/FilesTable.java |  5 ++++
 .../apache/paimon/table/system/OptionsTable.java   |  6 +++++
 .../apache/paimon/table/system/SchemasTable.java   |  6 +++++
 .../apache/paimon/table/system/SnapshotsTable.java |  6 +++++
 .../java/org/apache/paimon/utils/Restorable.java   |  4 ++++
 .../table/ChangelogWithKeyFileStoreTableTest.java  |  2 +-
 .../paimon/table/FileStoreTableTestBase.java       |  4 ++--
 .../CompactionChangelogFollowUpScannerTest.java    |  2 +-
 .../org/apache/paimon/flink/sink/FlinkSink.java    |  6 ++---
 .../apache/paimon/flink/sink/FlinkSinkBuilder.java |  2 +-
 .../paimon/flink/sink/StoreCompactOperator.java    |  2 +-
 .../paimon/flink/sink/cdc/FlinkCdcSinkBuilder.java |  2 +-
 .../sink/cdc/SchemaAwareStoreWriteOperator.java    |  2 +-
 .../flink/source/ContinuousFileStoreSource.java    |  6 ++---
 .../paimon/flink/source/DataTableSource.java       |  2 +-
 .../paimon/flink/source/StaticFileStoreSource.java |  2 +-
 .../flink/sink/FileStoreShuffleBucketTest.java     |  2 +-
 .../java/org/apache/paimon/spark/SparkTable.java   | 15 ++++--------
 117 files changed, 332 insertions(+), 257 deletions(-)

diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java b/paimon-common/src/main/java/org/apache/paimon/annotation/Public.java
similarity index 65%
copy from paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java
copy to paimon-common/src/main/java/org/apache/paimon/annotation/Public.java
index 6b8ad64cc..d6a1be30e 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java
+++ b/paimon-common/src/main/java/org/apache/paimon/annotation/Public.java
@@ -7,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,15 +16,18 @@
  * limitations under the License.
  */
 
-package org.apache.paimon.table.source;
+package org.apache.paimon.annotation;
 
-import org.apache.paimon.annotation.Experimental;
-import org.apache.paimon.utils.Restorable;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
 
 /**
- * {@link TableScan} for streaming, supports {@link #checkpoint} and {@link #restore}.
+ * Annotation for marking classes as public, stable interfaces.
  *
- * @since 0.4.0
+ * <p>API classes or methods need to be marked with modified versions.
  */
-@Experimental
-public interface StreamTableScan extends TableScan, Restorable<Long> {}
+@Documented
+@Target(ElementType.TYPE)
+@Public
+public @interface Public {}
diff --git a/paimon-common/src/main/java/org/apache/paimon/catalog/CatalogContext.java b/paimon-common/src/main/java/org/apache/paimon/catalog/CatalogContext.java
index 1b22fc184..a876f32c9 100644
--- a/paimon-common/src/main/java/org/apache/paimon/catalog/CatalogContext.java
+++ b/paimon-common/src/main/java/org/apache/paimon/catalog/CatalogContext.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.catalog;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.fs.FileIOLoader;
 import org.apache.paimon.fs.Path;
 import org.apache.paimon.fs.hadoop.HadoopFileIOLoader;
@@ -37,7 +37,7 @@ import static org.apache.paimon.options.CatalogOptions.WAREHOUSE;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class CatalogContext {
 
     private final Options options;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/BinaryArray.java b/paimon-common/src/main/java/org/apache/paimon/data/BinaryArray.java
index d92516857..981c8ecd6 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/BinaryArray.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/BinaryArray.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.MemorySegment;
 import org.apache.paimon.memory.MemorySegmentUtils;
 import org.apache.paimon.types.DataType;
@@ -41,7 +41,7 @@ import static org.apache.paimon.memory.MemorySegment.UNSAFE;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class BinaryArray extends BinarySection implements InternalArray, DataSetters {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/BinaryMap.java b/paimon-common/src/main/java/org/apache/paimon/data/BinaryMap.java
index 7752cb471..c3c7745d2 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/BinaryMap.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/BinaryMap.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.MemorySegment;
 import org.apache.paimon.memory.MemorySegmentUtils;
 import org.apache.paimon.types.DataType;
@@ -35,7 +35,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class BinaryMap extends BinarySection implements InternalMap {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/BinaryRow.java b/paimon-common/src/main/java/org/apache/paimon/data/BinaryRow.java
index 78c1063d1..e5f3e1b7d 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/BinaryRow.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/BinaryRow.java
@@ -17,7 +17,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.MemorySegment;
 import org.apache.paimon.memory.MemorySegmentUtils;
 import org.apache.paimon.types.DataType;
@@ -53,7 +53,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class BinaryRow extends BinarySection implements InternalRow, DataSetters {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/BinaryString.java b/paimon-common/src/main/java/org/apache/paimon/data/BinaryString.java
index 8a533d597..6ccecc925 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/BinaryString.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/BinaryString.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.MemorySegment;
 import org.apache.paimon.memory.MemorySegmentUtils;
 
@@ -38,7 +38,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class BinaryString extends BinarySection implements Comparable<BinaryString> {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/DataGetters.java b/paimon-common/src/main/java/org/apache/paimon/data/DataGetters.java
index 8e838fc7b..1dc107c5c 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/DataGetters.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/DataGetters.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Getters to get data.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface DataGetters {
 
     /** Returns true if the element is null at the given position. */
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/Decimal.java b/paimon-common/src/main/java/org/apache/paimon/data/Decimal.java
index 9c8e15021..71a484665 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/Decimal.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/Decimal.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.DecimalType;
 
 import javax.annotation.Nonnull;
@@ -39,7 +39,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class Decimal implements Comparable<Decimal>, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/GenericArray.java b/paimon-common/src/main/java/org/apache/paimon/data/GenericArray.java
index 54616b8aa..c95ad6525 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/GenericArray.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/GenericArray.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.ArrayType;
 import org.apache.paimon.utils.ArrayUtils;
 
@@ -37,7 +37,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class GenericArray implements InternalArray, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/GenericMap.java b/paimon-common/src/main/java/org/apache/paimon/data/GenericMap.java
index 8f89b3b2e..0b196c075 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/GenericMap.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/GenericMap.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.MapType;
 import org.apache.paimon.types.MultisetType;
 
@@ -40,7 +40,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class GenericMap implements InternalMap, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/GenericRow.java b/paimon-common/src/main/java/org/apache/paimon/data/GenericRow.java
index 354a96232..929d51b05 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/GenericRow.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/GenericRow.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.RowKind;
 import org.apache.paimon.types.RowType;
 
@@ -44,7 +44,7 @@ import static org.apache.paimon.utils.Preconditions.checkNotNull;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class GenericRow implements InternalRow, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/InternalArray.java b/paimon-common/src/main/java/org/apache/paimon/data/InternalArray.java
index f23574e26..f8b3257a4 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/InternalArray.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/InternalArray.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.ArrayType;
 import org.apache.paimon.types.DataType;
 
@@ -39,7 +39,7 @@ import static org.apache.paimon.types.DataTypeChecks.getScale;
  * @see GenericArray
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface InternalArray extends DataGetters {
 
     /** Returns the number of elements in this array. */
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/InternalMap.java b/paimon-common/src/main/java/org/apache/paimon/data/InternalMap.java
index 068e72141..d8b62381f 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/InternalMap.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/InternalMap.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.MapType;
 import org.apache.paimon.types.MultisetType;
 
@@ -33,7 +33,7 @@ import org.apache.paimon.types.MultisetType;
  * @see GenericMap
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface InternalMap {
 
     /** Returns the number of key-value mappings in this map. */
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/InternalRow.java b/paimon-common/src/main/java/org/apache/paimon/data/InternalRow.java
index 8f384d6ea..d64bbb7de 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/InternalRow.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/InternalRow.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.DataTypeChecks;
 import org.apache.paimon.types.RowKind;
@@ -83,7 +83,7 @@ import static org.apache.paimon.types.DataTypeChecks.getScale;
  * @see JoinedRow
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface InternalRow extends DataGetters {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/JoinedRow.java b/paimon-common/src/main/java/org/apache/paimon/data/JoinedRow.java
index 26933fee1..736745131 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/JoinedRow.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/JoinedRow.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.RowKind;
 
 import javax.annotation.Nullable;
@@ -32,7 +32,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class JoinedRow implements InternalRow {
 
     private RowKind rowKind = RowKind.INSERT;
diff --git a/paimon-common/src/main/java/org/apache/paimon/data/Timestamp.java b/paimon-common/src/main/java/org/apache/paimon/data/Timestamp.java
index 7302033ec..1fe066077 100644
--- a/paimon-common/src/main/java/org/apache/paimon/data/Timestamp.java
+++ b/paimon-common/src/main/java/org/apache/paimon/data/Timestamp.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.data;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.LocalZonedTimestampType;
 import org.apache.paimon.types.TimestampType;
 import org.apache.paimon.utils.Preconditions;
@@ -39,7 +39,7 @@ import java.time.LocalTime;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class Timestamp implements Comparable<Timestamp>, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/FileIO.java b/paimon-common/src/main/java/org/apache/paimon/fs/FileIO.java
index 30a5e089e..08b62d65b 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/FileIO.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/FileIO.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.catalog.CatalogContext;
 import org.apache.paimon.fs.local.LocalFileIO;
 
@@ -44,7 +44,7 @@ import java.util.UUID;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface FileIO extends Serializable {
 
     Logger LOG = LoggerFactory.getLogger(FileIO.class);
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/FileIOLoader.java b/paimon-common/src/main/java/org/apache/paimon/fs/FileIOLoader.java
index 74321e606..44d66ae89 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/FileIOLoader.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/FileIOLoader.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Loader to load {@link FileIO}.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface FileIOLoader {
 
     String getScheme();
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/FileStatus.java b/paimon-common/src/main/java/org/apache/paimon/fs/FileStatus.java
index 63f48358f..53eb6023f 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/FileStatus.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/FileStatus.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Interface that represents the client side information for a file independent of the file system.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface FileStatus {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/Path.java b/paimon-common/src/main/java/org/apache/paimon/fs/Path.java
index c135c311b..7f5acb18f 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/Path.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/Path.java
@@ -22,7 +22,7 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.StringUtils;
 
 import java.io.Serializable;
@@ -35,7 +35,7 @@ import java.util.regex.Pattern;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class Path implements Comparable<Path>, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/PositionOutputStream.java b/paimon-common/src/main/java/org/apache/paimon/fs/PositionOutputStream.java
index cc7296711..4811913fd 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/PositionOutputStream.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/PositionOutputStream.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -28,7 +28,7 @@ import java.io.OutputStream;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public abstract class PositionOutputStream extends OutputStream {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/SeekableInputStream.java b/paimon-common/src/main/java/org/apache/paimon/fs/SeekableInputStream.java
index e3cffac13..8249ea57c 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/SeekableInputStream.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/SeekableInputStream.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,7 +28,7 @@ import java.io.InputStream;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public abstract class SeekableInputStream extends InputStream {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/fs/UnsupportedSchemeException.java b/paimon-common/src/main/java/org/apache/paimon/fs/UnsupportedSchemeException.java
index d0a181266..2be3738e0 100644
--- a/paimon-common/src/main/java/org/apache/paimon/fs/UnsupportedSchemeException.java
+++ b/paimon-common/src/main/java/org/apache/paimon/fs/UnsupportedSchemeException.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.fs;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.io.IOException;
 
@@ -27,7 +27,7 @@ import java.io.IOException;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class UnsupportedSchemeException extends IOException {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegment.java b/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegment.java
index 1f7281a91..81672426b 100644
--- a/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegment.java
+++ b/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegment.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.memory;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import javax.annotation.Nullable;
 
@@ -39,7 +39,7 @@ import static org.apache.paimon.memory.MemoryUtils.getByteBufferAddress;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class MemorySegment {
 
     public static final sun.misc.Unsafe UNSAFE = MemoryUtils.UNSAFE;
diff --git a/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegmentSource.java b/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegmentSource.java
index cc4ceebd7..0f9701150 100644
--- a/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegmentSource.java
+++ b/paimon-common/src/main/java/org/apache/paimon/memory/MemorySegmentSource.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.memory;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Interface describing entities that can provide memory segments.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface MemorySegmentSource {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/options/ConfigOption.java b/paimon-common/src/main/java/org/apache/paimon/options/ConfigOption.java
index 5d212c020..6299056fc 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/ConfigOption.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/ConfigOption.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.options;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.options.description.Description;
 
 import java.util.Arrays;
@@ -39,7 +39,7 @@ import static org.apache.paimon.utils.Preconditions.checkNotNull;
  * @param <T> The type of value associated with the configuration option.
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class ConfigOption<T> {
 
     private static final FallbackKey[] EMPTY = new FallbackKey[0];
diff --git a/paimon-common/src/main/java/org/apache/paimon/options/ConfigOptions.java b/paimon-common/src/main/java/org/apache/paimon/options/ConfigOptions.java
index 8c568d384..72f561335 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/ConfigOptions.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/ConfigOptions.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.options;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.options.description.Description;
 
 import java.time.Duration;
@@ -68,7 +68,7 @@ import static org.apache.paimon.utils.Preconditions.checkNotNull;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class ConfigOptions {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/options/MemorySize.java b/paimon-common/src/main/java/org/apache/paimon/options/MemorySize.java
index f85d68ce0..9296a7054 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/MemorySize.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/MemorySize.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.options;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -47,7 +47,7 @@ import static org.apache.paimon.utils.Preconditions.checkNotNull;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class MemorySize implements java.io.Serializable, Comparable<MemorySize> {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/options/Options.java b/paimon-common/src/main/java/org/apache/paimon/options/Options.java
index 80c8e3579..a6b82fd37 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/Options.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/Options.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.options;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import javax.annotation.concurrent.ThreadSafe;
 
@@ -41,7 +41,7 @@ import static org.apache.paimon.options.OptionsUtils.removePrefixMap;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 @ThreadSafe
 public class Options implements Serializable {
 
diff --git a/paimon-common/src/main/java/org/apache/paimon/options/description/Description.java b/paimon-common/src/main/java/org/apache/paimon/options/description/Description.java
index 1b56f357c..4a57d89ec 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/description/Description.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/description/Description.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.options.description;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -29,7 +29,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class Description {
 
     private final List<BlockElement> blocks;
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/Predicate.java b/paimon-common/src/main/java/org/apache/paimon/predicate/Predicate.java
index 91dc058d9..699efd7b8 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/Predicate.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/Predicate.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.predicate;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.format.FieldStats;
 
 import java.io.Serializable;
@@ -30,7 +30,7 @@ import java.util.Optional;
  * @see PredicateBuilder
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface Predicate extends Serializable {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java b/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
index 8d5b7ffa5..03391496d 100644
--- a/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
+++ b/paimon-common/src/main/java/org/apache/paimon/predicate/PredicateBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.predicate;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.Decimal;
 import org.apache.paimon.data.Timestamp;
@@ -53,7 +53,7 @@ import static java.util.Collections.singletonList;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class PredicateBuilder {
 
     private final RowType rowType;
diff --git a/paimon-common/src/main/java/org/apache/paimon/reader/RecordReader.java b/paimon-common/src/main/java/org/apache/paimon/reader/RecordReader.java
index 8ef2aeb72..b02075b91 100644
--- a/paimon-common/src/main/java/org/apache/paimon/reader/RecordReader.java
+++ b/paimon-common/src/main/java/org/apache/paimon/reader/RecordReader.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.reader;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.CloseableIterator;
 
 import javax.annotation.Nullable;
@@ -34,7 +34,7 @@ import java.util.function.Function;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface RecordReader<T> extends Closeable {
 
     /**
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/ArrayType.java b/paimon-common/src/main/java/org/apache/paimon/types/ArrayType.java
index 4c46dbac2..54e1311b0 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/ArrayType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/ArrayType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Preconditions;
 
 import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonGenerator;
@@ -34,7 +34,7 @@ import java.util.Set;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class ArrayType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/BigIntType.java b/paimon-common/src/main/java/org/apache/paimon/types/BigIntType.java
index 897eff7cc..564133551 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/BigIntType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/BigIntType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of an 8-byte signed integer with values from -9,223,372,036,854,775,808 to
@@ -26,7 +26,7 @@ import org.apache.paimon.annotation.Experimental;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class BigIntType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/BinaryType.java b/paimon-common/src/main/java/org/apache/paimon/types/BinaryType.java
index 7e2d1b8d0..c50d463c8 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/BinaryType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/BinaryType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -27,7 +27,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class BinaryType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/BooleanType.java b/paimon-common/src/main/java/org/apache/paimon/types/BooleanType.java
index aa55dd56a..fe97717b9 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/BooleanType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/BooleanType.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a boolean with a (possibly) three-valued logic of {@code TRUE, FALSE, UNKNOWN}.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class BooleanType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/CharType.java b/paimon-common/src/main/java/org/apache/paimon/types/CharType.java
index f762d1474..efba0cd44 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/CharType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/CharType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -29,7 +29,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class CharType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataField.java b/paimon-common/src/main/java/org/apache/paimon/types/DataField.java
index 2370b0603..8b4e32865 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataField.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataField.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonGenerator;
 
@@ -36,7 +36,7 @@ import static org.apache.paimon.utils.EncodingUtils.escapeSingleQuotes;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class DataField implements Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataType.java b/paimon-common/src/main/java/org/apache/paimon/types/DataType.java
index 70d16c1d7..165d48245 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Preconditions;
 
 import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonGenerator;
@@ -37,7 +37,7 @@ import java.util.Set;
  * @see DataTypes
  * @since 0.4.0
  */
-@Experimental
+@Public
 public abstract class DataType implements Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeDefaultVisitor.java b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeDefaultVisitor.java
index f3a67f45b..ca39d43cf 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeDefaultVisitor.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeDefaultVisitor.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Implementation of {@link DataTypeVisitor} that redirects all calls to {@link
@@ -26,7 +26,7 @@ import org.apache.paimon.annotation.Experimental;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public abstract class DataTypeDefaultVisitor<R> implements DataTypeVisitor<R> {
 
     @Override
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeFamily.java b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeFamily.java
index edefcd19f..7f966e32f 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeFamily.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeFamily.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * An enumeration of Data type families for clustering {@link DataTypeRoot}s into categories.
@@ -29,7 +29,7 @@ import org.apache.paimon.annotation.Experimental;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public enum DataTypeFamily {
     PREDEFINED,
 
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeRoot.java b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeRoot.java
index ef1000af8..d014a10cc 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeRoot.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeRoot.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Collections;
 import java.util.EnumSet;
@@ -45,7 +45,7 @@ import java.util.Set;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public enum DataTypeRoot {
     CHAR(DataTypeFamily.PREDEFINED, DataTypeFamily.CHARACTER_STRING),
 
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeVisitor.java b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeVisitor.java
index 41e714af4..c83fcdbac 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataTypeVisitor.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataTypeVisitor.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * The visitor definition of {@link DataType}. The visitor transforms a data type into instances of
@@ -27,7 +27,7 @@ import org.apache.paimon.annotation.Experimental;
  * @param <R> result type
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface DataTypeVisitor<R> {
 
     R visit(CharType charType);
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DataTypes.java b/paimon-common/src/main/java/org/apache/paimon/types/DataTypes.java
index de5a35467..2ae97cccd 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DataTypes.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DataTypes.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Arrays;
 
@@ -27,7 +27,7 @@ import java.util.Arrays;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class DataTypes {
 
     public static IntType INT() {
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DateType.java b/paimon-common/src/main/java/org/apache/paimon/types/DateType.java
index 9f4578132..e82c3de2e 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DateType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DateType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a date consisting of {@code year-month-day} with values ranging from {@code
@@ -29,7 +29,7 @@ import org.apache.paimon.annotation.Experimental;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class DateType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DecimalType.java b/paimon-common/src/main/java/org/apache/paimon/types/DecimalType.java
index 06e3c92cd..7c2e46499 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DecimalType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DecimalType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -27,7 +27,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class DecimalType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/DoubleType.java b/paimon-common/src/main/java/org/apache/paimon/types/DoubleType.java
index 81442e76b..8a18ba2c4 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/DoubleType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/DoubleType.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of an 8-byte double precision floating point number.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class DoubleType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/FloatType.java b/paimon-common/src/main/java/org/apache/paimon/types/FloatType.java
index 854f4fd56..0575cb52e 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/FloatType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/FloatType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a 4-byte single precision floating point number. Compared to the SQL standard, the
@@ -26,7 +26,7 @@ import org.apache.paimon.annotation.Experimental;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class FloatType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/IntType.java b/paimon-common/src/main/java/org/apache/paimon/types/IntType.java
index 1bb71d205..9f99267d8 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/IntType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/IntType.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a 4-byte signed integer with values from -2,147,483,648 to 2,147,483,647.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class IntType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/LocalZonedTimestampType.java b/paimon-common/src/main/java/org/apache/paimon/types/LocalZonedTimestampType.java
index a64e31221..d5d1eb11d 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/LocalZonedTimestampType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/LocalZonedTimestampType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -37,7 +37,7 @@ import java.util.Objects;
  * @see TimestampType
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class LocalZonedTimestampType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/MapType.java b/paimon-common/src/main/java/org/apache/paimon/types/MapType.java
index 47f53b9a4..202ae8151 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/MapType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/MapType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Preconditions;
 
 import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonGenerator;
@@ -35,7 +35,7 @@ import java.util.Set;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class MapType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/MultisetType.java b/paimon-common/src/main/java/org/apache/paimon/types/MultisetType.java
index 653bfacba..4caa601d9 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/MultisetType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/MultisetType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Preconditions;
 
 import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonGenerator;
@@ -38,7 +38,7 @@ import java.util.Set;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class MultisetType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/RowKind.java b/paimon-common/src/main/java/org/apache/paimon/types/RowKind.java
index c70704a8e..3089ba5b0 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/RowKind.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/RowKind.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Lists all kinds of changes that a row can describe in a changelog.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public enum RowKind {
 
     // Note: Enums have no stable hash code across different JVMs, use toByteValue() for
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/RowType.java b/paimon-common/src/main/java/org/apache/paimon/types/RowType.java
index c7f6fe7a8..beeb70f3b 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/RowType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/RowType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Preconditions;
 import org.apache.paimon.utils.StringUtils;
 
@@ -43,7 +43,7 @@ import java.util.stream.Collectors;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class RowType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/SmallIntType.java b/paimon-common/src/main/java/org/apache/paimon/types/SmallIntType.java
index 1f637f623..b63800deb 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/SmallIntType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/SmallIntType.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a 2-byte signed integer with values from -32,768 to 32,767.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class SmallIntType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/TimeType.java b/paimon-common/src/main/java/org/apache/paimon/types/TimeType.java
index 59235c729..781194b42 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/TimeType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/TimeType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -34,7 +34,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class TimeType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/TimestampType.java b/paimon-common/src/main/java/org/apache/paimon/types/TimestampType.java
index 3c0b2651b..07e0fcdb6 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/TimestampType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/TimestampType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -32,7 +32,7 @@ import java.util.Objects;
  * @see LocalZonedTimestampType
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class TimestampType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/TinyIntType.java b/paimon-common/src/main/java/org/apache/paimon/types/TinyIntType.java
index b42d2a25a..a7be5ae62 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/TinyIntType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/TinyIntType.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Data type of a 1-byte signed integer with values from -128 to 127.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class TinyIntType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/VarBinaryType.java b/paimon-common/src/main/java/org/apache/paimon/types/VarBinaryType.java
index 6612b24af..7331172f7 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/VarBinaryType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/VarBinaryType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -27,7 +27,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class VarBinaryType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/types/VarCharType.java b/paimon-common/src/main/java/org/apache/paimon/types/VarCharType.java
index b17f7bb87..9585ecd8f 100644
--- a/paimon-common/src/main/java/org/apache/paimon/types/VarCharType.java
+++ b/paimon-common/src/main/java/org/apache/paimon/types/VarCharType.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.types;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.Objects;
 
@@ -29,7 +29,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public final class VarCharType extends DataType {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-common/src/main/java/org/apache/paimon/utils/CloseableIterator.java b/paimon-common/src/main/java/org/apache/paimon/utils/CloseableIterator.java
index 36db657ef..0e24aea7b 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/CloseableIterator.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/CloseableIterator.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.utils;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import javax.annotation.Nonnull;
 
@@ -41,7 +41,7 @@ import static java.util.Arrays.asList;
  * @param <T> the type of iterated elements.
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface CloseableIterator<T> extends Iterator<T>, AutoCloseable {
 
     CloseableIterator<?> EMPTY_INSTANCE =
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
index 8e2814e0a..16545250a 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.catalog;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.schema.Schema;
 import org.apache.paimon.schema.SchemaChange;
 import org.apache.paimon.table.Table;
@@ -33,7 +33,7 @@ import java.util.Optional;
  * @see CatalogFactory
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface Catalog extends AutoCloseable {
 
     String DEFAULT_DATABASE = "default";
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogFactory.java b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogFactory.java
index 25717c6cb..5ea94c0ec 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogFactory.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogFactory.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.catalog;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.fs.FileIO;
 import org.apache.paimon.fs.Path;
 import org.apache.paimon.utils.Preconditions;
@@ -39,7 +39,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface CatalogFactory {
 
     String identifier();
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogLock.java b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogLock.java
index 89555bf9a..278b3ad63 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogLock.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogLock.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.catalog;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.io.Closeable;
 import java.io.Serializable;
@@ -29,7 +29,7 @@ import java.util.concurrent.Callable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface CatalogLock extends Closeable {
 
     /** Run with catalog lock. The caller should tell catalog the database and table name. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/Identifier.java b/paimon-core/src/main/java/org/apache/paimon/catalog/Identifier.java
index a1240fb2d..126849c4b 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/Identifier.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/Identifier.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.catalog;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.fs.Path;
 import org.apache.paimon.utils.StringUtils;
 
@@ -33,7 +33,7 @@ import static org.apache.paimon.utils.Preconditions.checkArgument;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class Identifier implements Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileReader.java b/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileReader.java
index b44c40fe6..13cccfd14 100644
--- a/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileReader.java
+++ b/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileReader.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.disk;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.Buffer;
 
 import java.io.IOException;
@@ -28,7 +28,7 @@ import java.io.IOException;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface BufferFileReader extends FileIOChannel {
 
     void readInto(Buffer buffer) throws IOException;
diff --git a/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileWriter.java b/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileWriter.java
index 0f32189cb..c03b64f97 100644
--- a/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileWriter.java
+++ b/paimon-core/src/main/java/org/apache/paimon/disk/BufferFileWriter.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.disk;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.memory.Buffer;
 import org.apache.paimon.memory.MemorySegment;
 
@@ -29,7 +29,7 @@ import java.io.IOException;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface BufferFileWriter extends FileIOChannel {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/disk/FileIOChannel.java b/paimon-core/src/main/java/org/apache/paimon/disk/FileIOChannel.java
index c9fe2fdf7..5c9a262df 100644
--- a/paimon-core/src/main/java/org/apache/paimon/disk/FileIOChannel.java
+++ b/paimon-core/src/main/java/org/apache/paimon/disk/FileIOChannel.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.disk;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.StringUtils;
 
 import java.io.File;
@@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface FileIOChannel {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/disk/IOManager.java b/paimon-core/src/main/java/org/apache/paimon/disk/IOManager.java
index 8e71c3706..5b618f99b 100644
--- a/paimon-core/src/main/java/org/apache/paimon/disk/IOManager.java
+++ b/paimon-core/src/main/java/org/apache/paimon/disk/IOManager.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.disk;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.disk.FileIOChannel.Enumerator;
 import org.apache.paimon.disk.FileIOChannel.ID;
 
@@ -29,7 +29,7 @@ import java.io.IOException;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface IOManager extends AutoCloseable {
 
     ID createChannel();
diff --git a/paimon-core/src/main/java/org/apache/paimon/memory/Buffer.java b/paimon-core/src/main/java/org/apache/paimon/memory/Buffer.java
index 0bd395dbd..cf0cef648 100644
--- a/paimon-core/src/main/java/org/apache/paimon/memory/Buffer.java
+++ b/paimon-core/src/main/java/org/apache/paimon/memory/Buffer.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.memory;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.nio.ByteBuffer;
 
@@ -27,7 +27,7 @@ import java.nio.ByteBuffer;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class Buffer {
 
     private final MemorySegment segment;
diff --git a/paimon-core/src/main/java/org/apache/paimon/memory/MemorySegmentPool.java b/paimon-core/src/main/java/org/apache/paimon/memory/MemorySegmentPool.java
index 5f731a266..9ea5fa3f6 100644
--- a/paimon-core/src/main/java/org/apache/paimon/memory/MemorySegmentPool.java
+++ b/paimon-core/src/main/java/org/apache/paimon/memory/MemorySegmentPool.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.memory;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.options.MemorySize;
 
 import java.util.List;
@@ -28,7 +28,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface MemorySegmentPool extends MemorySegmentSource {
 
     int DEFAULT_PAGE_SIZE = 32 * 1024;
diff --git a/paimon-core/src/main/java/org/apache/paimon/operation/Lock.java b/paimon-core/src/main/java/org/apache/paimon/operation/Lock.java
index 606ebf249..499a7ca6a 100644
--- a/paimon-core/src/main/java/org/apache/paimon/operation/Lock.java
+++ b/paimon-core/src/main/java/org/apache/paimon/operation/Lock.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.operation;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.catalog.CatalogLock;
 import org.apache.paimon.catalog.Identifier;
 
@@ -32,7 +32,7 @@ import java.util.concurrent.Callable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface Lock extends AutoCloseable {
 
     /** Run with lock. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/schema/Schema.java b/paimon-core/src/main/java/org/apache/paimon/schema/Schema.java
index 9d0c1feae..cd90a5d51 100644
--- a/paimon-core/src/main/java/org/apache/paimon/schema/Schema.java
+++ b/paimon-core/src/main/java/org/apache/paimon/schema/Schema.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.schema;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.DataField;
 import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.RowType;
@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class Schema {
 
     private final List<DataField> fields;
diff --git a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaChange.java b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaChange.java
index 93061b2d3..ff30d48ef 100644
--- a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaChange.java
+++ b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaChange.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.schema;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.types.DataType;
 
 import javax.annotation.Nullable;
@@ -32,7 +32,7 @@ import java.util.Objects;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface SchemaChange extends Serializable {
 
     static SchemaChange setOption(String key, String value) {
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/AbstractFileStoreTable.java b/paimon-core/src/main/java/org/apache/paimon/table/AbstractFileStoreTable.java
index 40fbd0178..4e83ed8e6 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/AbstractFileStoreTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/AbstractFileStoreTable.java
@@ -71,7 +71,7 @@ public abstract class AbstractFileStoreTable implements FileStoreTable {
         return new SnapshotSplitReaderImpl(
                 store().newScan(),
                 tableSchema,
-                options(),
+                coreOptions(),
                 snapshotManager(),
                 splitGenerator(),
                 nonPartitionFilterConsumer());
@@ -79,13 +79,14 @@ public abstract class AbstractFileStoreTable implements FileStoreTable {
 
     @Override
     public BatchDataTableScan newScan() {
-        return new BatchDataTableScanImpl(options(), newSnapshotSplitReader(), snapshotManager());
+        return new BatchDataTableScanImpl(
+                coreOptions(), newSnapshotSplitReader(), snapshotManager());
     }
 
     @Override
     public StreamDataTableScan newStreamScan() {
         return new StreamDataTableScanImpl(
-                options(),
+                coreOptions(),
                 newSnapshotSplitReader(),
                 snapshotManager(),
                 supportStreamingReadOverwrite());
@@ -153,7 +154,7 @@ public abstract class AbstractFileStoreTable implements FileStoreTable {
     }
 
     @Override
-    public CoreOptions options() {
+    public CoreOptions coreOptions() {
         return store().options();
     }
 
@@ -181,8 +182,8 @@ public abstract class AbstractFileStoreTable implements FileStoreTable {
     public TableCommitImpl newCommit(String commitUser) {
         return new TableCommitImpl(
                 store().newCommit(commitUser),
-                options().writeOnly() ? null : store().newExpire(),
-                options().writeOnly() ? null : store().newPartitionExpire(commitUser));
+                coreOptions().writeOnly() ? null : store().newExpire(),
+                coreOptions().writeOnly() ? null : store().newPartitionExpire(commitUser));
     }
 
     private Optional<TableSchema> tryTimeTravel(Options options) {
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/DataTable.java b/paimon-core/src/main/java/org/apache/paimon/table/DataTable.java
index 3e24ca03b..f3b7f92af 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/DataTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/DataTable.java
@@ -37,7 +37,7 @@ public interface DataTable extends InnerTable {
     @Override
     StreamDataTableScan newStreamScan();
 
-    CoreOptions options();
+    CoreOptions coreOptions();
 
     SnapshotManager snapshotManager();
 
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/FileStoreTable.java b/paimon-core/src/main/java/org/apache/paimon/table/FileStoreTable.java
index f217ef016..a864f3e4d 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/FileStoreTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/FileStoreTable.java
@@ -29,12 +29,13 @@ import org.apache.paimon.types.RowType;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * An abstraction layer above {@link FileStore} to provide reading and writing of {@link
  * InternalRow}.
  */
-public interface FileStoreTable extends DataTable, SupportsPartition {
+public interface FileStoreTable extends DataTable {
 
     @Override
     default String name() {
@@ -51,6 +52,21 @@ public interface FileStoreTable extends DataTable, SupportsPartition {
         return schema().partitionKeys();
     }
 
+    @Override
+    default List<String> primaryKeys() {
+        return schema().primaryKeys();
+    }
+
+    @Override
+    default Map<String, String> options() {
+        return schema().options();
+    }
+
+    @Override
+    default Optional<String> comment() {
+        return Optional.ofNullable(schema().comment());
+    }
+
     TableSchema schema();
 
     @Override
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/ReadonlyTable.java b/paimon-core/src/main/java/org/apache/paimon/table/ReadonlyTable.java
index 479d930f6..77b32a273 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/ReadonlyTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/ReadonlyTable.java
@@ -24,9 +24,29 @@ import org.apache.paimon.table.sink.InnerTableWrite;
 import org.apache.paimon.table.sink.StreamWriteBuilder;
 import org.apache.paimon.table.source.InnerStreamTableScan;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
 /** Readonly table which only provide implementation for scan and read. */
 public interface ReadonlyTable extends InnerTable {
 
+    @Override
+    default List<String> partitionKeys() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    default Map<String, String> options() {
+        return Collections.emptyMap();
+    }
+
+    @Override
+    default Optional<String> comment() {
+        return Optional.empty();
+    }
+
     @Override
     default BatchWriteBuilder newBatchWriteBuilder() {
         throw new UnsupportedOperationException(
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/SupportsPartition.java b/paimon-core/src/main/java/org/apache/paimon/table/SupportsPartition.java
deleted file mode 100644
index 9a13d8d13..000000000
--- a/paimon-core/src/main/java/org/apache/paimon/table/SupportsPartition.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.paimon.table;
-
-import java.util.List;
-
-/** An interface for {@link Table} partition support. */
-public interface SupportsPartition {
-
-    List<String> partitionKeys();
-}
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/Table.java b/paimon-core/src/main/java/org/apache/paimon/table/Table.java
index a798f6394..cf58f48f0 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/Table.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/Table.java
@@ -18,21 +18,23 @@
 
 package org.apache.paimon.table;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.table.sink.BatchWriteBuilder;
 import org.apache.paimon.table.sink.StreamWriteBuilder;
 import org.apache.paimon.table.source.ReadBuilder;
 import org.apache.paimon.types.RowType;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * A table provides basic abstraction for table type and table scan and table read.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface Table extends Serializable {
 
     /** A name to identify this table. */
@@ -41,6 +43,18 @@ public interface Table extends Serializable {
     /** Returns the row type of this table. */
     RowType rowType();
 
+    /** Partition keys of this table. */
+    List<String> partitionKeys();
+
+    /** Primary keys of this table. */
+    List<String> primaryKeys();
+
+    /** Options of this table. */
+    Map<String, String> options();
+
+    /** Optional comment of this table. */
+    Optional<String> comment();
+
     /** Copy this table with adding dynamic options. */
     Table copy(Map<String, String> dynamicOptions);
 
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableCommit.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableCommit.java
index 242263f64..894aec3e5 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableCommit.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableCommit.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.List;
 
@@ -27,7 +27,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface BatchTableCommit extends TableCommit {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableWrite.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableWrite.java
index 30c05ee99..9e545e9b0 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableWrite.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchTableWrite.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.List;
 
@@ -27,7 +27,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface BatchTableWrite extends TableWrite {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchWriteBuilder.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchWriteBuilder.java
index c2e725adc..abcab70c9 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchWriteBuilder.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/BatchWriteBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.InternalRow;
 
 import javax.annotation.Nullable;
@@ -51,7 +51,7 @@ import java.util.Map;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface BatchWriteBuilder extends WriteBuilder {
 
     long COMMIT_IDENTIFIER = Long.MAX_VALUE;
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/CommitMessage.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/CommitMessage.java
index b969bb18d..32a8d66aa 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/CommitMessage.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/CommitMessage.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.BinaryRow;
 
 import java.io.Serializable;
@@ -28,7 +28,7 @@ import java.io.Serializable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface CommitMessage extends Serializable {
 
     /** Partition of this commit message. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableCommit.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableCommit.java
index 068f6430c..6a4dc4a25 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableCommit.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableCommit.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.List;
 import java.util.Set;
@@ -29,7 +29,7 @@ import java.util.Set;
  * @since 0.4.0
  * @see StreamWriteBuilder
  */
-@Experimental
+@Public
 public interface StreamTableCommit extends TableCommit {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableWrite.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableWrite.java
index b5545eb18..bc1741e5a 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableWrite.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamTableWrite.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.util.List;
 
@@ -28,7 +28,7 @@ import java.util.List;
  * @since 0.4.0
  * @see StreamWriteBuilder
  */
-@Experimental
+@Public
 public interface StreamTableWrite extends TableWrite {
 
     /**
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamWriteBuilder.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamWriteBuilder.java
index f147a17c3..c5465de2d 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamWriteBuilder.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/StreamWriteBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.InternalRow;
 
 /**
@@ -39,7 +39,7 @@ import org.apache.paimon.data.InternalRow;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface StreamWriteBuilder extends WriteBuilder {
 
     /** Get commit user, set by {@link #withCommitUser}. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/TableCommit.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/TableCommit.java
index 7cf82242f..2694d66b0 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/TableCommit.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/TableCommit.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.table.Table;
 
 /**
@@ -30,5 +30,5 @@ import org.apache.paimon.table.Table;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface TableCommit extends AutoCloseable {}
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/TableWrite.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/TableWrite.java
index 7fcc20c78..3e1506fd3 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/TableWrite.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/TableWrite.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.disk.IOManager;
@@ -29,7 +29,7 @@ import org.apache.paimon.table.Table;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface TableWrite extends AutoCloseable {
 
     /** With {@link IOManager}, this is needed if 'write-buffer-spillable' is set to true. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/sink/WriteBuilder.java b/paimon-core/src/main/java/org/apache/paimon/table/sink/WriteBuilder.java
index 944600cce..c80929d65 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/sink/WriteBuilder.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/sink/WriteBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.sink;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.types.RowType;
 
@@ -29,7 +29,7 @@ import java.io.Serializable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface WriteBuilder extends Serializable {
 
     /** A name to identify this table. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/EndOfScanException.java b/paimon-core/src/main/java/org/apache/paimon/table/source/EndOfScanException.java
index 167de5907..edb5e49c4 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/EndOfScanException.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/EndOfScanException.java
@@ -18,14 +18,14 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 /**
  * Signals that an end of scanning has been reached unexpectedly during input.
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public class EndOfScanException extends RuntimeException {
 
     private static final long serialVersionUID = 1L;
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/ReadBuilder.java b/paimon-core/src/main/java/org/apache/paimon/table/source/ReadBuilder.java
index ba3b720f1..4991275fb 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/ReadBuilder.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/ReadBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.predicate.Predicate;
 import org.apache.paimon.predicate.PredicateBuilder;
@@ -67,7 +67,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface ReadBuilder extends Serializable {
 
     /** A name to identify the table. */
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/Split.java b/paimon-core/src/main/java/org/apache/paimon/table/source/Split.java
index 8bc4ff034..b4cbbbd4e 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/Split.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/Split.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 
 import java.io.Serializable;
 
@@ -27,7 +27,7 @@ import java.io.Serializable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface Split extends Serializable {
 
     long rowCount();
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java b/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java
index 6b8ad64cc..82d4d7d38 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/StreamTableScan.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.utils.Restorable;
 
 /**
@@ -26,5 +26,5 @@ import org.apache.paimon.utils.Restorable;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface StreamTableScan extends TableScan, Restorable<Long> {}
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/TableRead.java b/paimon-core/src/main/java/org/apache/paimon/table/source/TableRead.java
index 2fa89c737..f496e574a 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/TableRead.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/TableRead.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.mergetree.compact.ConcatRecordReader;
 import org.apache.paimon.operation.FileStoreRead;
@@ -33,7 +33,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface TableRead {
 
     RecordReader<InternalRow> createReader(Split split) throws IOException;
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/source/TableScan.java b/paimon-core/src/main/java/org/apache/paimon/table/source/TableScan.java
index 5a39ce586..193d6e8be 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/source/TableScan.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/source/TableScan.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.table.source;
 
-import org.apache.paimon.annotation.Experimental;
+import org.apache.paimon.annotation.Public;
 import org.apache.paimon.table.Table;
 
 import java.util.List;
@@ -28,7 +28,7 @@ import java.util.List;
  *
  * @since 0.4.0
  */
-@Experimental
+@Public
 public interface TableScan {
 
     /** Plan splits, throws {@link EndOfScanException} if the scan is ended. */
@@ -39,7 +39,7 @@ public interface TableScan {
      *
      * @since 0.4.0
      */
-    @Experimental
+    @Public
     interface Plan {
         List<Split> splits();
     }
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/AuditLogTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/AuditLogTable.java
index 2d03a1885..9f1202d40 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/AuditLogTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/AuditLogTable.java
@@ -58,6 +58,7 @@ import javax.annotation.Nullable;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -105,6 +106,21 @@ public class AuditLogTable implements DataTable, ReadonlyTable {
         return new RowType(fields);
     }
 
+    @Override
+    public List<String> partitionKeys() {
+        return dataTable.partitionKeys();
+    }
+
+    @Override
+    public Map<String, String> options() {
+        return dataTable.options();
+    }
+
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.emptyList();
+    }
+
     @Override
     public SnapshotSplitReader newSnapshotSplitReader() {
         return new AuditLogDataSplitReader(dataTable.newSnapshotSplitReader());
@@ -121,8 +137,8 @@ public class AuditLogTable implements DataTable, ReadonlyTable {
     }
 
     @Override
-    public CoreOptions options() {
-        return dataTable.options();
+    public CoreOptions coreOptions() {
+        return dataTable.coreOptions();
     }
 
     @Override
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/BucketsTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/BucketsTable.java
index abf5c2c42..819454e78 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/BucketsTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/BucketsTable.java
@@ -104,6 +104,16 @@ public class BucketsTable implements DataTable, ReadonlyTable {
         return new RowType(fields);
     }
 
+    @Override
+    public Map<String, String> options() {
+        return wrapped.options();
+    }
+
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.emptyList();
+    }
+
     @Override
     public SnapshotSplitReader newSnapshotSplitReader() {
         return wrapped.newSnapshotSplitReader();
@@ -120,8 +130,8 @@ public class BucketsTable implements DataTable, ReadonlyTable {
     }
 
     @Override
-    public CoreOptions options() {
-        return wrapped.options();
+    public CoreOptions coreOptions() {
+        return wrapped.coreOptions();
     }
 
     @Override
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/FilesTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/FilesTable.java
index 8ddd2c341..2d2eaad7e 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/FilesTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/FilesTable.java
@@ -116,6 +116,11 @@ public class FilesTable implements ReadonlyTable {
         return TABLE_TYPE;
     }
 
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.singletonList("file_path");
+    }
+
     @Override
     public InnerTableScan newScan() {
         return new FilesScan(storeTable);
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/OptionsTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/OptionsTable.java
index 1063b24a7..975fb8cfc 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/OptionsTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/OptionsTable.java
@@ -43,6 +43,7 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -80,6 +81,11 @@ public class OptionsTable implements ReadonlyTable {
         return TABLE_TYPE;
     }
 
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.singletonList("key");
+    }
+
     @Override
     public InnerTableScan newScan() {
         return new OptionsScan();
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/SchemasTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/SchemasTable.java
index b7f04e984..c855f4f4e 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/SchemasTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/SchemasTable.java
@@ -48,6 +48,7 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -90,6 +91,11 @@ public class SchemasTable implements ReadonlyTable {
         return TABLE_TYPE;
     }
 
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.singletonList("schema_id");
+    }
+
     @Override
     public InnerTableScan newScan() {
         return new SchemasScan();
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/system/SnapshotsTable.java b/paimon-core/src/main/java/org/apache/paimon/table/system/SnapshotsTable.java
index 5b947532e..216ca052d 100644
--- a/paimon-core/src/main/java/org/apache/paimon/table/system/SnapshotsTable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/table/system/SnapshotsTable.java
@@ -51,6 +51,7 @@ import java.time.ZoneId;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -97,6 +98,11 @@ public class SnapshotsTable implements ReadonlyTable {
         return TABLE_TYPE;
     }
 
+    @Override
+    public List<String> primaryKeys() {
+        return Collections.singletonList("snapshot_id");
+    }
+
     @Override
     public InnerTableScan newScan() {
         return new SnapshotsScan();
diff --git a/paimon-core/src/main/java/org/apache/paimon/utils/Restorable.java b/paimon-core/src/main/java/org/apache/paimon/utils/Restorable.java
index 4ca8b7637..7e820e326 100644
--- a/paimon-core/src/main/java/org/apache/paimon/utils/Restorable.java
+++ b/paimon-core/src/main/java/org/apache/paimon/utils/Restorable.java
@@ -18,12 +18,16 @@
 
 package org.apache.paimon.utils;
 
+import org.apache.paimon.annotation.Public;
+
 /**
  * Operations implementing this interface can checkpoint and restore their states between different
  * instances.
  *
  * @param <S> type of state
+ * @since 0.4.0
  */
+@Public
 public interface Restorable<S> {
 
     /** Extract state of the current operation instance. */
diff --git a/paimon-core/src/test/java/org/apache/paimon/table/ChangelogWithKeyFileStoreTableTest.java b/paimon-core/src/test/java/org/apache/paimon/table/ChangelogWithKeyFileStoreTableTest.java
index d1d8e72a9..fac1be471 100644
--- a/paimon-core/src/test/java/org/apache/paimon/table/ChangelogWithKeyFileStoreTableTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/table/ChangelogWithKeyFileStoreTableTest.java
@@ -504,7 +504,7 @@ public class ChangelogWithKeyFileStoreTableTest extends FileStoreTableTestBase {
     @Test
     public void testReadFilter() throws Exception {
         FileStoreTable table = createFileStoreTable();
-        if (table.options().fileFormat().getFormatIdentifier().equals("parquet")) {
+        if (table.coreOptions().fileFormat().getFormatIdentifier().equals("parquet")) {
             // TODO support parquet reader filter push down
             return;
         }
diff --git a/paimon-core/src/test/java/org/apache/paimon/table/FileStoreTableTestBase.java b/paimon-core/src/test/java/org/apache/paimon/table/FileStoreTableTestBase.java
index ddd94224c..39da2b48d 100644
--- a/paimon-core/src/test/java/org/apache/paimon/table/FileStoreTableTestBase.java
+++ b/paimon-core/src/test/java/org/apache/paimon/table/FileStoreTableTestBase.java
@@ -253,7 +253,7 @@ public abstract class FileStoreTableTestBase {
     @Test
     public void testReadFilter() throws Exception {
         FileStoreTable table = createFileStoreTable();
-        if (table.options().fileFormat().getFormatIdentifier().equals("parquet")) {
+        if (table.coreOptions().fileFormat().getFormatIdentifier().equals("parquet")) {
             // TODO support parquet reader filter push down
             return;
         }
@@ -387,7 +387,7 @@ public abstract class FileStoreTableTestBase {
         SchemaManager schemaManager = new SchemaManager(table.fileIO(), table.location());
         schemaManager.commitChanges(SchemaChange.addColumn("added", DataTypes.INT()));
         table = table.copyWithLatestSchema();
-        assertThat(table.options().snapshotNumRetainMax()).isEqualTo(100);
+        assertThat(table.coreOptions().snapshotNumRetainMax()).isEqualTo(100);
         write = table.newWrite(commitUser);
 
         write.write(new JoinedRow(rowData(1, 30, 300L), GenericRow.of(3000)));
diff --git a/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/CompactionChangelogFollowUpScannerTest.java b/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/CompactionChangelogFollowUpScannerTest.java
index 55014f2e2..43568f72e 100644
--- a/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/CompactionChangelogFollowUpScannerTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/table/source/snapshot/CompactionChangelogFollowUpScannerTest.java
@@ -64,7 +64,7 @@ public class CompactionChangelogFollowUpScannerTest extends ScannerTestBase {
 
         assertThat(snapshotManager.latestSnapshotId()).isEqualTo(5);
 
-        snapshotSplitReader.withLevelFilter(level -> level == table.options().numLevels() - 1);
+        snapshotSplitReader.withLevelFilter(level -> level == table.coreOptions().numLevels() - 1);
         TableRead read = table.newRead();
         CompactionChangelogFollowUpScanner scanner = new CompactionChangelogFollowUpScanner();
 
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSink.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSink.java
index 0e12cbef5..d9565f9af 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSink.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSink.java
@@ -60,9 +60,9 @@ public abstract class FlinkSink<T> implements Serializable {
     }
 
     protected StoreSinkWrite.Provider createWriteProvider(String initialCommitUser) {
-        if (!table.options().writeOnly()) {
-            Options options = table.options().toConfiguration();
-            switch (table.options().changelogProducer()) {
+        if (!table.coreOptions().writeOnly()) {
+            Options options = table.coreOptions().toConfiguration();
+            switch (table.coreOptions().changelogProducer()) {
                 case FULL_COMPACTION:
                     long fullCompactionThresholdMs =
                             options.get(CHANGELOG_PRODUCER_FULL_COMPACTION_TRIGGER_INTERVAL)
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
index 4e7a8deb0..6a645d082 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
@@ -87,7 +87,7 @@ public class FlinkSinkBuilder {
         BucketStreamPartitioner partitioner =
                 new BucketStreamPartitioner(
                         table.schema(),
-                        table.options()
+                        table.coreOptions()
                                 .toConfiguration()
                                 .get(FlinkConnectorOptions.SINK_SHUFFLE_BY_PARTITION));
         PartitionTransformation<RowData> partitioned =
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/StoreCompactOperator.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/StoreCompactOperator.java
index 13fc24edc..89ab1e721 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/StoreCompactOperator.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/StoreCompactOperator.java
@@ -58,7 +58,7 @@ public class StoreCompactOperator extends PrepareCommitOperator<RowData> {
             StoreSinkWrite.Provider storeSinkWriteProvider,
             boolean isStreaming) {
         Preconditions.checkArgument(
-                !table.options().writeOnly(),
+                !table.coreOptions().writeOnly(),
                 CoreOptions.WRITE_ONLY.key() + " should not be true for StoreCompactOperator.");
         this.table = table;
         this.storeSinkWriteProvider = storeSinkWriteProvider;
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSinkBuilder.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSinkBuilder.java
index 190deb464..43e940b3b 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSinkBuilder.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSinkBuilder.java
@@ -100,7 +100,7 @@ public class FlinkCdcSinkBuilder<T> {
         CdcBucketStreamPartitioner partitioner =
                 new CdcBucketStreamPartitioner(
                         table.schema(),
-                        table.options()
+                        table.coreOptions()
                                 .toConfiguration()
                                 .get(FlinkConnectorOptions.SINK_SHUFFLE_BY_PARTITION));
         PartitionTransformation<CdcRecord> partitioned =
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/SchemaAwareStoreWriteOperator.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/SchemaAwareStoreWriteOperator.java
index d529c7089..261a0f9dc 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/SchemaAwareStoreWriteOperator.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/cdc/SchemaAwareStoreWriteOperator.java
@@ -58,7 +58,7 @@ public class SchemaAwareStoreWriteOperator extends AbstractStoreWriteOperator<Cd
             @Nullable LogSinkFunction logSinkFunction,
             StoreSinkWrite.Provider storeSinkWriteProvider) {
         super(table, logSinkFunction, storeSinkWriteProvider);
-        retrySleepMillis = table.options().toConfiguration().get(RETRY_SLEEP_TIME).toMillis();
+        retrySleepMillis = table.coreOptions().toConfiguration().get(RETRY_SLEEP_TIME).toMillis();
     }
 
     @Override
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/ContinuousFileStoreSource.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/ContinuousFileStoreSource.java
index 45de25ee5..719477542 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/ContinuousFileStoreSource.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/ContinuousFileStoreSource.java
@@ -84,19 +84,19 @@ public class ContinuousFileStoreSource extends FlinkSource {
                 context,
                 splits,
                 nextSnapshotId,
-                table.options().continuousDiscoveryInterval().toMillis(),
+                table.coreOptions().continuousDiscoveryInterval().toMillis(),
                 scanFactory.create(table, nextSnapshotId).withFilter(predicate)::plan);
     }
 
     @Override
     public FileStoreSourceReader<?> createSourceReader(
             SourceReaderContext context, TableRead read, @Nullable Long limit) {
-        return table.options().toConfiguration().get(STREAMING_READ_ATOMIC)
+        return table.coreOptions().toConfiguration().get(STREAMING_READ_ATOMIC)
                 ? new FileStoreSourceReader<>(RecordsFunction.forSingle(), context, read, limit)
                 : new FileStoreSourceReader<>(RecordsFunction.forIterate(), context, read, limit);
     }
 
     private boolean isBounded() {
-        return table.options().scanBoundedWatermark() != null;
+        return table.coreOptions().scanBoundedWatermark() != null;
     }
 }
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
index 65030d91e..121156dec 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
@@ -164,7 +164,7 @@ public class DataTableSource extends FlinkTableSource
         }
 
         WatermarkStrategy<RowData> watermarkStrategy = this.watermarkStrategy;
-        Options options = table.options().toConfiguration();
+        Options options = table.coreOptions().toConfiguration();
         if (watermarkStrategy != null) {
             WatermarkEmitStrategy emitStrategy = options.get(SCAN_WATERMARK_EMIT_STRATEGY);
             if (emitStrategy == WatermarkEmitStrategy.ON_EVENT) {
diff --git a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/StaticFileStoreSource.java b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/StaticFileStoreSource.java
index bef56959f..ae601717a 100644
--- a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/StaticFileStoreSource.java
+++ b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/StaticFileStoreSource.java
@@ -99,7 +99,7 @@ public class StaticFileStoreSource extends FlinkSource {
                 context,
                 snapshot,
                 splits,
-                table.options()
+                table.coreOptions()
                         .toConfiguration()
                         .get(FlinkConnectorOptions.SCAN_SPLIT_ENUMERATOR_BATCH_SIZE));
     }
diff --git a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/FileStoreShuffleBucketTest.java b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/FileStoreShuffleBucketTest.java
index e1d671964..a5e240c12 100644
--- a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/FileStoreShuffleBucketTest.java
+++ b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/FileStoreShuffleBucketTest.java
@@ -82,7 +82,7 @@ public class FileStoreShuffleBucketTest extends CatalogITCaseBase {
     public void testShuffleByBucketPartition() throws Exception {
         FileStoreTable originalTable =
                 FileStoreTableFactory.create(LocalFileIO.create(), getTableDirectory("T"));
-        Map<String, String> dynamicOptions = originalTable.options().toMap();
+        Map<String, String> dynamicOptions = originalTable.coreOptions().toMap();
         dynamicOptions.put(FlinkConnectorOptions.SINK_SHUFFLE_BY_PARTITION.key(), "true");
         FileStoreTable table = originalTable.copy(dynamicOptions);
 
diff --git a/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/SparkTable.java b/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/SparkTable.java
index c462eb56d..eef1b5c0d 100644
--- a/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/SparkTable.java
+++ b/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/SparkTable.java
@@ -21,7 +21,6 @@ package org.apache.paimon.spark;
 import org.apache.paimon.operation.Lock;
 import org.apache.paimon.predicate.Predicate;
 import org.apache.paimon.table.DataTable;
-import org.apache.paimon.table.SupportsPartition;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.table.TableUtils;
 
@@ -87,14 +86,10 @@ public class SparkTable
 
     @Override
     public Transform[] partitioning() {
-        if (table instanceof SupportsPartition) {
-            return ((SupportsPartition) table)
-                    .partitionKeys().stream()
-                            .map(FieldReference::apply)
-                            .map(IdentityTransform::apply)
-                            .toArray(Transform[]::new);
-        }
-        return new Transform[0];
+        return table.partitionKeys().stream()
+                .map(FieldReference::apply)
+                .map(IdentityTransform::apply)
+                .toArray(Transform[]::new);
     }
 
     @Override
@@ -120,7 +115,7 @@ public class SparkTable
     @Override
     public Map<String, String> properties() {
         if (table instanceof DataTable) {
-            return ((DataTable) table).options().toMap();
+            return ((DataTable) table).coreOptions().toMap();
         } else {
             return Collections.emptyMap();
         }