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

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


The following commit(s) were added to refs/heads/master by this push:
     new a9f2d2c6d [core] Fix partition column generate wrong partition spec 
(#4349)
a9f2d2c6d is described below

commit a9f2d2c6d70121e6fe7c9157f9627b5a0135b5e9
Author: Xiduo You <[email protected]>
AuthorDate: Wed Oct 23 21:58:32 2024 +0800

    [core] Fix partition column generate wrong partition spec (#4349)
---
 .../shortcodes/generated/core_configuration.html   |  6 +++
 .../main/java/org/apache/paimon/CoreOptions.java   | 12 +++++
 .../apache/paimon/casting/AbstractCastRule.java    |  0
 .../paimon/casting/BinaryToBinaryCastRule.java     |  0
 .../paimon/casting/BinaryToStringCastRule.java     |  0
 .../paimon/casting/BooleanToNumericCastRule.java   |  0
 .../paimon/casting/BooleanToStringCastRule.java    |  0
 .../org/apache/paimon/casting/CastExecutor.java    |  0
 .../org/apache/paimon/casting/CastExecutors.java   |  0
 .../org/apache/paimon/casting/CastFieldGetter.java |  0
 .../java/org/apache/paimon/casting/CastRule.java   |  0
 .../apache/paimon/casting/CastRulePredicate.java   |  0
 .../java/org/apache/paimon/casting/CastedRow.java  |  0
 .../paimon/casting/DateToStringCastRule.java       |  0
 .../paimon/casting/DateToTimestampCastRule.java    |  0
 .../paimon/casting/DecimalToDecimalCastRule.java   |  0
 .../casting/DecimalToNumericPrimitiveCastRule.java |  0
 .../org/apache/paimon/casting/DefaultValueRow.java |  0
 .../paimon/casting/NumericPrimitiveCastRule.java   |  0
 .../casting/NumericPrimitiveToDecimalCastRule.java |  0
 .../casting/NumericPrimitiveToTimestamp.java       |  0
 .../paimon/casting/NumericToBooleanCastRule.java   |  0
 .../paimon/casting/NumericToStringCastRule.java    |  0
 .../paimon/casting/StringToBinaryCastRule.java     |  0
 .../paimon/casting/StringToBooleanCastRule.java    |  0
 .../paimon/casting/StringToDateCastRule.java       |  0
 .../paimon/casting/StringToDecimalCastRule.java    |  0
 .../casting/StringToNumericPrimitiveCastRule.java  |  0
 .../paimon/casting/StringToStringCastRule.java     |  0
 .../paimon/casting/StringToTimeCastRule.java       |  0
 .../paimon/casting/StringToTimestampCastRule.java  |  0
 .../paimon/casting/TimeToStringCastRule.java       |  0
 .../paimon/casting/TimeToTimestampCastRule.java    |  0
 .../paimon/casting/TimestampToDateCastRule.java    |  0
 .../TimestampToNumericPrimitiveCastRule.java       |  0
 .../paimon/casting/TimestampToStringCastRule.java  |  0
 .../paimon/casting/TimestampToTimeCastRule.java    |  0
 .../casting/TimestampToTimestampCastRule.java      |  0
 .../paimon/utils/InternalRowPartitionComputer.java | 13 +++++-
 .../java/org/apache/paimon/utils/TypeUtils.java    | 20 ++++++++
 .../apache/paimon/casting/CastExecutorTest.java    |  0
 .../java/org/apache/paimon/AbstractFileStore.java  |  3 +-
 .../java/org/apache/paimon/KeyValueFileStore.java  |  3 +-
 .../paimon/operation/AbstractFileStoreWrite.java   |  8 +++-
 .../paimon/operation/MemoryFileStoreWrite.java     |  3 +-
 .../apache/paimon/utils/FileStorePathFactory.java  | 11 +++--
 .../paimon/io/KeyValueFileReadWriteTest.java       |  6 ++-
 .../paimon/manifest/ManifestFileMetaTestBase.java  |  3 +-
 .../apache/paimon/manifest/ManifestFileTest.java   |  3 +-
 .../apache/paimon/manifest/ManifestListTest.java   |  3 +-
 .../paimon/utils/FileStorePathFactoryTest.java     |  6 ++-
 .../java/org/apache/paimon/flink/FlinkCatalog.java |  5 +-
 .../flink/sink/partition/PartitionMarkDone.java    |  3 +-
 .../flink/source/TestChangelogDataReadWrite.java   |  3 +-
 .../apache/paimon/hive/HiveMetastoreClient.java    |  6 ++-
 .../paimon/spark/PaimonPartitionManagement.scala   |  5 +-
 .../commands/DeleteFromPaimonTableCommand.scala    |  3 +-
 .../apache/paimon/spark/sources/StreamHelper.scala |  9 ++--
 .../apache/paimon/spark/SparkFileIndexITCase.java  |  3 +-
 .../org/apache/paimon/spark/sql/DDLTestBase.scala  | 53 +++++++++++++++++++++-
 60 files changed, 159 insertions(+), 31 deletions(-)

diff --git a/docs/layouts/shortcodes/generated/core_configuration.html 
b/docs/layouts/shortcodes/generated/core_configuration.html
index fd788301e..9bbed03bd 100644
--- a/docs/layouts/shortcodes/generated/core_configuration.html
+++ b/docs/layouts/shortcodes/generated/core_configuration.html
@@ -575,6 +575,12 @@ This config option does not affect the default filesystem 
metastore.</td>
             <td>Duration</td>
             <td>The expiration interval of a partition. A partition will be 
expired if it‘s lifetime is over this value. Partition time is extracted from 
the partition value.</td>
         </tr>
+        <tr>
+            <td><h5>partition.legacy-name</h5></td>
+            <td style="word-wrap: break-word;">true</td>
+            <td>Boolean</td>
+            <td>The legacy partition name is using `toString` fpr all types. 
If false, using cast to string for all types.</td>
+        </tr>
         <tr>
             <td><h5>partition.mark-done-action</h5></td>
             <td style="word-wrap: break-word;">"success-file"</td>
diff --git a/paimon-common/src/main/java/org/apache/paimon/CoreOptions.java 
b/paimon-common/src/main/java/org/apache/paimon/CoreOptions.java
index d965fd142..18dae0d38 100644
--- a/paimon-common/src/main/java/org/apache/paimon/CoreOptions.java
+++ b/paimon-common/src/main/java/org/apache/paimon/CoreOptions.java
@@ -250,6 +250,14 @@ public class CoreOptions implements Serializable {
                             "The default partition name in case the dynamic 
partition"
                                     + " column value is null/empty string.");
 
+    public static final ConfigOption<Boolean> PARTITION_GENERATE_LEGCY_NAME =
+            key("partition.legacy-name")
+                    .booleanType()
+                    .defaultValue(true)
+                    .withDescription(
+                            "The legacy partition name is using `toString` fpr 
all types. If false, using "
+                                    + "cast to string for all types.");
+
     public static final ConfigOption<Integer> SNAPSHOT_NUM_RETAINED_MIN =
             key("snapshot.num-retained.min")
                     .intType()
@@ -1539,6 +1547,10 @@ public class CoreOptions implements Serializable {
         return options.get(PARTITION_DEFAULT_NAME);
     }
 
+    public boolean legacyPartitionName() {
+        return options.get(PARTITION_GENERATE_LEGCY_NAME);
+    }
+
     public boolean sortBySize() {
         return options.get(SORT_RANG_STRATEGY) == RangeStrategy.SIZE;
     }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/AbstractCastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/AbstractCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/AbstractCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/AbstractCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/BinaryToBinaryCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/BinaryToBinaryCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/BinaryToBinaryCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/BinaryToBinaryCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/BinaryToStringCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/BinaryToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/BinaryToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/BinaryToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/BooleanToNumericCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/BooleanToNumericCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/BooleanToNumericCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/BooleanToNumericCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/BooleanToStringCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/BooleanToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/BooleanToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/BooleanToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/CastExecutor.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastExecutor.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/CastExecutor.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/CastExecutor.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/CastExecutors.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastExecutors.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/CastExecutors.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/CastExecutors.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/CastFieldGetter.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastFieldGetter.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/CastFieldGetter.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/CastFieldGetter.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/casting/CastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastRule.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/casting/CastRule.java
rename to paimon-common/src/main/java/org/apache/paimon/casting/CastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/CastRulePredicate.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastRulePredicate.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/CastRulePredicate.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/CastRulePredicate.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/casting/CastedRow.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/CastedRow.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/casting/CastedRow.java
rename to paimon-common/src/main/java/org/apache/paimon/casting/CastedRow.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/DateToStringCastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/DateToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/DateToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/DateToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/DateToTimestampCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/DateToTimestampCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/DateToTimestampCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/DateToTimestampCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/DecimalToDecimalCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/DecimalToDecimalCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/DecimalToDecimalCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/DecimalToDecimalCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/DecimalToNumericPrimitiveCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/DecimalToNumericPrimitiveCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/DecimalToNumericPrimitiveCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/DecimalToNumericPrimitiveCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/DefaultValueRow.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/DefaultValueRow.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/DefaultValueRow.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/DefaultValueRow.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveToDecimalCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveToDecimalCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveToDecimalCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveToDecimalCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveToTimestamp.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveToTimestamp.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/NumericPrimitiveToTimestamp.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/NumericPrimitiveToTimestamp.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/NumericToBooleanCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/NumericToBooleanCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/NumericToBooleanCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/NumericToBooleanCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/NumericToStringCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/NumericToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/NumericToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/NumericToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToBinaryCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToBinaryCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToBinaryCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToBinaryCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToBooleanCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToBooleanCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToBooleanCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToBooleanCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToDateCastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToDateCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToDateCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToDateCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToDecimalCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToDecimalCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToDecimalCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToDecimalCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToNumericPrimitiveCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToNumericPrimitiveCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToNumericPrimitiveCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToNumericPrimitiveCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToStringCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToTimeCastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToTimeCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToTimeCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToTimeCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/StringToTimestampCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToTimestampCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/StringToTimestampCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/StringToTimestampCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimeToStringCastRule.java 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimeToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimeToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimeToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimeToTimestampCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimeToTimestampCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimeToTimestampCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimeToTimestampCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimestampToDateCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimestampToDateCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimestampToDateCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimestampToDateCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimestampToNumericPrimitiveCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimestampToNumericPrimitiveCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimestampToNumericPrimitiveCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimestampToNumericPrimitiveCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimestampToStringCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimestampToStringCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimestampToStringCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimestampToStringCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimestampToTimeCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimestampToTimeCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimestampToTimeCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimestampToTimeCastRule.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/casting/TimestampToTimestampCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/TimestampToTimestampCastRule.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/casting/TimestampToTimestampCastRule.java
rename to 
paimon-common/src/main/java/org/apache/paimon/casting/TimestampToTimestampCastRule.java
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
 
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
index 881f0f4d1..1bc8eecc8 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
@@ -20,6 +20,7 @@ package org.apache.paimon.utils;
 
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.InternalRow;
+import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.RowType;
 
 import java.util.Arrays;
@@ -35,11 +36,18 @@ public class InternalRowPartitionComputer {
     protected final String defaultPartValue;
     protected final String[] partitionColumns;
     protected final InternalRow.FieldGetter[] partitionFieldGetters;
+    protected final List<DataType> types;
+    protected final boolean legacyPartitionName;
 
     public InternalRowPartitionComputer(
-            String defaultPartValue, RowType rowType, String[] 
partitionColumns) {
+            String defaultPartValue,
+            RowType rowType,
+            String[] partitionColumns,
+            boolean legacyPartitionName) {
         this.defaultPartValue = defaultPartValue;
         this.partitionColumns = partitionColumns;
+        this.types = rowType.getFieldTypes();
+        this.legacyPartitionName = legacyPartitionName;
         List<String> columnList = rowType.getFieldNames();
         this.partitionFieldGetters =
                 Arrays.stream(partitionColumns)
@@ -56,7 +64,8 @@ public class InternalRowPartitionComputer {
 
         for (int i = 0; i < partitionFieldGetters.length; i++) {
             Object field = partitionFieldGetters[i].getFieldOrNull(in);
-            String partitionValue = field != null ? field.toString() : null;
+            String partitionValue =
+                    TypeUtils.castPartitionValueToString(field, types.get(i), 
legacyPartitionName);
             if (StringUtils.isNullOrWhitespaceOnly(partitionValue)) {
                 partitionValue = defaultPartValue;
             }
diff --git a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java 
b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
index 8d8d84953..046e3d4b3 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
@@ -18,6 +18,8 @@
 
 package org.apache.paimon.utils;
 
+import org.apache.paimon.casting.CastExecutor;
+import org.apache.paimon.casting.CastExecutors;
 import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.Decimal;
 import org.apache.paimon.data.GenericArray;
@@ -88,6 +90,24 @@ public class TypeUtils {
                         .collect(Collectors.toList()));
     }
 
+    public static String castPartitionValueToString(
+            Object value, DataType type, boolean legacyPartitionName) {
+        if (value == null) {
+            return null;
+        }
+        if (legacyPartitionName) {
+            return value.toString();
+        }
+
+        CastExecutor<Object, Object> castExecutor =
+                (CastExecutor<Object, Object>) CastExecutors.resolve(type, 
VarCharType.STRING_TYPE);
+        if (castExecutor == null) {
+            throw new UnsupportedOperationException(type + " is not 
supported");
+        }
+        Object result = castExecutor.cast(value);
+        return result == null ? null : result.toString();
+    }
+
     public static Object castFromString(String s, DataType type) {
         return castFromStringInternal(s, type, false);
     }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/casting/CastExecutorTest.java 
b/paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
similarity index 100%
rename from 
paimon-core/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
rename to 
paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/AbstractFileStore.java 
b/paimon-core/src/main/java/org/apache/paimon/AbstractFileStore.java
index 53bd1291f..811848453 100644
--- a/paimon-core/src/main/java/org/apache/paimon/AbstractFileStore.java
+++ b/paimon-core/src/main/java/org/apache/paimon/AbstractFileStore.java
@@ -105,7 +105,8 @@ abstract class AbstractFileStore<T> implements FileStore<T> 
{
                 options.partitionDefaultName(),
                 options.fileFormat().getFormatIdentifier(),
                 options.dataFilePrefix(),
-                options.changelogFilePrefix());
+                options.changelogFilePrefix(),
+                options.legacyPartitionName());
     }
 
     @Override
diff --git a/paimon-core/src/main/java/org/apache/paimon/KeyValueFileStore.java 
b/paimon-core/src/main/java/org/apache/paimon/KeyValueFileStore.java
index cc4579898..2e3aa965f 100644
--- a/paimon-core/src/main/java/org/apache/paimon/KeyValueFileStore.java
+++ b/paimon-core/src/main/java/org/apache/paimon/KeyValueFileStore.java
@@ -206,7 +206,8 @@ public class KeyValueFileStore extends 
AbstractFileStore<KeyValue> {
                                         options.partitionDefaultName(),
                                         format,
                                         options.dataFilePrefix(),
-                                        options.changelogFilePrefix())));
+                                        options.changelogFilePrefix(),
+                                        options.legacyPartitionName())));
         return pathFactoryMap;
     }
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreWrite.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreWrite.java
index dab20d642..d63887030 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreWrite.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreWrite.java
@@ -88,6 +88,7 @@ public abstract class AbstractFileStoreWrite<T> implements 
FileStoreWrite<T> {
     protected CompactionMetrics compactionMetrics = null;
     protected final String tableName;
     private boolean isInsertOnly;
+    private boolean legacyPartitionName;
 
     protected AbstractFileStoreWrite(
             SnapshotManager snapshotManager,
@@ -97,7 +98,8 @@ public abstract class AbstractFileStoreWrite<T> implements 
FileStoreWrite<T> {
             String tableName,
             int totalBuckets,
             RowType partitionType,
-            int writerNumberMax) {
+            int writerNumberMax,
+            boolean legacyPartitionName) {
         this.snapshotManager = snapshotManager;
         this.scan = scan;
         this.indexFactory = indexFactory;
@@ -107,6 +109,7 @@ public abstract class AbstractFileStoreWrite<T> implements 
FileStoreWrite<T> {
         this.writers = new HashMap<>();
         this.tableName = tableName;
         this.writerNumberMax = writerNumberMax;
+        this.legacyPartitionName = legacyPartitionName;
     }
 
     @Override
@@ -469,7 +472,8 @@ public abstract class AbstractFileStoreWrite<T> implements 
FileStoreWrite<T> {
                                 ? "partition "
                                         + getPartitionComputer(
                                                         partitionType,
-                                                        
PARTITION_DEFAULT_NAME.defaultValue())
+                                                        
PARTITION_DEFAULT_NAME.defaultValue(),
+                                                        legacyPartitionName)
                                                 .generatePartValues(partition)
                                 : "table";
                 throw new RuntimeException(
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/MemoryFileStoreWrite.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/MemoryFileStoreWrite.java
index b7feeead4..bbde3fd48 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/MemoryFileStoreWrite.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/MemoryFileStoreWrite.java
@@ -75,7 +75,8 @@ public abstract class MemoryFileStoreWrite<T> extends 
AbstractFileStoreWrite<T>
                 tableName,
                 options.bucket(),
                 partitionType,
-                options.writeMaxWritersToSpill());
+                options.writeMaxWritersToSpill(),
+                options.legacyPartitionName());
         this.options = options;
         this.cacheManager = new CacheManager(options.lookupCacheMaxMemory());
     }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/FileStorePathFactory.java 
b/paimon-core/src/main/java/org/apache/paimon/utils/FileStorePathFactory.java
index df442383a..612565c72 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/utils/FileStorePathFactory.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/utils/FileStorePathFactory.java
@@ -56,11 +56,13 @@ public class FileStorePathFactory {
             String defaultPartValue,
             String formatIdentifier,
             String dataFilePrefix,
-            String changelogFilePrefix) {
+            String changelogFilePrefix,
+            boolean legacyPartitionName) {
         this.root = root;
         this.uuid = UUID.randomUUID().toString();
 
-        this.partitionComputer = getPartitionComputer(partitionType, 
defaultPartValue);
+        this.partitionComputer =
+                getPartitionComputer(partitionType, defaultPartValue, 
legacyPartitionName);
         this.formatIdentifier = formatIdentifier;
         this.dataFilePrefix = dataFilePrefix;
         this.changelogFilePrefix = changelogFilePrefix;
@@ -78,9 +80,10 @@ public class FileStorePathFactory {
 
     @VisibleForTesting
     public static InternalRowPartitionComputer getPartitionComputer(
-            RowType partitionType, String defaultPartValue) {
+            RowType partitionType, String defaultPartValue, boolean 
legacyPartitionName) {
         String[] partitionColumns = partitionType.getFieldNames().toArray(new 
String[0]);
-        return new InternalRowPartitionComputer(defaultPartValue, 
partitionType, partitionColumns);
+        return new InternalRowPartitionComputer(
+                defaultPartValue, partitionType, partitionColumns, 
legacyPartitionName);
     }
 
     public Path newManifestFile() {
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/io/KeyValueFileReadWriteTest.java 
b/paimon-core/src/test/java/org/apache/paimon/io/KeyValueFileReadWriteTest.java
index 3c8955231..de593e80b 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/io/KeyValueFileReadWriteTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/io/KeyValueFileReadWriteTest.java
@@ -228,7 +228,8 @@ public class KeyValueFileReadWriteTest {
                         CoreOptions.PARTITION_DEFAULT_NAME.defaultValue(),
                         format,
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
         int suggestedFileSize = ThreadLocalRandom.current().nextInt(8192) + 
1024;
         FileIO fileIO = FileIOFinder.find(path);
         Options options = new Options();
@@ -244,7 +245,8 @@ public class KeyValueFileReadWriteTest {
                         CoreOptions.PARTITION_DEFAULT_NAME.defaultValue(),
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue()));
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue()));
 
         return KeyValueFileWriterFactory.builder(
                         fileIO,
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileMetaTestBase.java
 
b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileMetaTestBase.java
index 31be9346c..87a6f2e45 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileMetaTestBase.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileMetaTestBase.java
@@ -146,7 +146,8 @@ public abstract class ManifestFileMetaTestBase {
                                 "default",
                                 CoreOptions.FILE_FORMAT.defaultValue(),
                                 CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                                
CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue()),
+                                
CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                                
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue()),
                         Long.MAX_VALUE,
                         null)
                 .create();
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileTest.java 
b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileTest.java
index a11f3e485..30e8e7b20 100644
--- a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestFileTest.java
@@ -102,7 +102,8 @@ public class ManifestFileTest {
                         "default",
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
         int suggestedFileSize = ThreadLocalRandom.current().nextInt(8192) + 
1024;
         FileIO fileIO = FileIOFinder.find(path);
         return new ManifestFile.Factory(
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestListTest.java 
b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestListTest.java
index faf1004e1..f4703c1ff 100644
--- a/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestListTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/manifest/ManifestListTest.java
@@ -106,7 +106,8 @@ public class ManifestListTest {
                         "default",
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
         return new ManifestList.Factory(FileIOFinder.find(path), avro, "zstd", 
pathFactory, null)
                 .create();
     }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/utils/FileStorePathFactoryTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/utils/FileStorePathFactoryTest.java
index 994367d0c..26bbd28e4 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/utils/FileStorePathFactoryTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/utils/FileStorePathFactoryTest.java
@@ -87,7 +87,8 @@ public class FileStorePathFactoryTest {
                         "default",
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
 
         assertPartition("20211224", 16, pathFactory, "/dt=20211224/hr=16");
         assertPartition("20211224", null, pathFactory, 
"/dt=20211224/hr=default");
@@ -124,6 +125,7 @@ public class FileStorePathFactoryTest {
                 PARTITION_DEFAULT_NAME.defaultValue(),
                 CoreOptions.FILE_FORMAT.defaultValue().toString(),
                 CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
     }
 }
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
index 633fa9c4b..c1e7db6b2 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
@@ -1075,9 +1075,12 @@ public class FlinkCatalog extends AbstractCatalog {
                 getPartitionEntries(table, tablePath, partitionSpec);
         org.apache.paimon.types.RowType partitionRowType = 
table.schema().logicalPartitionType();
 
+        CoreOptions options = new CoreOptions(table.options());
         InternalRowPartitionComputer partitionComputer =
                 FileStorePathFactory.getPartitionComputer(
-                        partitionRowType, new 
CoreOptions(table.options()).partitionDefaultName());
+                        partitionRowType,
+                        options.partitionDefaultName(),
+                        options.legacyPartitionName());
 
         return partitionEntries.stream()
                 .map(
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDone.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDone.java
index 2c5d55f20..d0825bcdb 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDone.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/partition/PartitionMarkDone.java
@@ -71,7 +71,8 @@ public class PartitionMarkDone implements Closeable {
                 new InternalRowPartitionComputer(
                         coreOptions.partitionDefaultName(),
                         table.schema().logicalPartitionType(),
-                        table.partitionKeys().toArray(new String[0]));
+                        table.partitionKeys().toArray(new String[0]),
+                        coreOptions.legacyPartitionName());
 
         PartitionMarkDoneTrigger trigger =
                 PartitionMarkDoneTrigger.create(coreOptions, isRestored, 
stateStore);
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/TestChangelogDataReadWrite.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/TestChangelogDataReadWrite.java
index aab8666fe..762a14ea1 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/TestChangelogDataReadWrite.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/TestChangelogDataReadWrite.java
@@ -107,7 +107,8 @@ public class TestChangelogDataReadWrite {
                         "default",
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
         this.snapshotManager = new SnapshotManager(LocalFileIO.create(), new 
Path(root));
         this.commitUser = UUID.randomUUID().toString();
     }
diff --git 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveMetastoreClient.java
 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveMetastoreClient.java
index b006f09c9..6ec3b086d 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveMetastoreClient.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveMetastoreClient.java
@@ -56,11 +56,13 @@ public class HiveMetastoreClient implements MetastoreClient 
{
             ClientPool<IMetaStoreClient, TException> clients)
             throws TException, InterruptedException {
         this.identifier = identifier;
+        CoreOptions options = new CoreOptions(schema.options());
         this.partitionComputer =
                 new InternalRowPartitionComputer(
-                        new 
CoreOptions(schema.options()).partitionDefaultName(),
+                        options.partitionDefaultName(),
                         schema.logicalPartitionType(),
-                        schema.partitionKeys().toArray(new String[0]));
+                        schema.partitionKeys().toArray(new String[0]),
+                        options.legacyPartitionName());
 
         this.clients = clients;
         this.sd =
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
index cbdbd67a6..54970bfe3 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
@@ -18,6 +18,7 @@
 
 package org.apache.paimon.spark
 
+import org.apache.paimon.CoreOptions
 import org.apache.paimon.metastore.MetastoreClient
 import org.apache.paimon.operation.FileStoreCommit
 import org.apache.paimon.table.FileStoreTable
@@ -31,7 +32,6 @@ import org.apache.spark.sql.catalyst.util.CharVarcharUtils
 import org.apache.spark.sql.connector.catalog.SupportsAtomicPartitionManagement
 import org.apache.spark.sql.types.StructType
 
-import java.util
 import java.util.{Map => JMap, Objects, UUID}
 
 import scala.collection.JavaConverters._
@@ -52,7 +52,8 @@ trait PaimonPartitionManagement extends 
SupportsAtomicPartitionManagement {
         val rowDataPartitionComputer = new InternalRowPartitionComputer(
           fileStoreTable.coreOptions().partitionDefaultName(),
           partitionRowType,
-          table.partitionKeys().asScala.toArray)
+          table.partitionKeys().asScala.toArray,
+          CoreOptions.fromMap(table.options()).legacyPartitionName)
 
         rows.map {
           r =>
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/DeleteFromPaimonTableCommand.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/DeleteFromPaimonTableCommand.scala
index 0087ffb74..bff69aa6f 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/DeleteFromPaimonTableCommand.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/DeleteFromPaimonTableCommand.scala
@@ -83,7 +83,8 @@ case class DeleteFromPaimonTableCommand(
         val rowDataPartitionComputer = new InternalRowPartitionComputer(
           table.coreOptions().partitionDefaultName(),
           table.schema().logicalPartitionType(),
-          table.partitionKeys.asScala.toArray
+          table.partitionKeys.asScala.toArray,
+          table.coreOptions().legacyPartitionName()
         )
         val dropPartitions = matchedPartitions.map {
           partition => 
rowDataPartitionComputer.generatePartValues(partition).asScala.asJava
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/sources/StreamHelper.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/sources/StreamHelper.scala
index 91df04e6d..b44a66fce 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/sources/StreamHelper.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/sources/StreamHelper.scala
@@ -49,12 +49,15 @@ private[spark] trait StreamHelper {
   private lazy val partitionSchema: StructType =
     SparkTypeUtils.fromPaimonRowType(TypeUtils.project(table.rowType(), 
table.partitionKeys()))
 
-  private lazy val partitionComputer: InternalRowPartitionComputer =
+  private lazy val partitionComputer: InternalRowPartitionComputer = {
+    val options = new CoreOptions(table.options)
     new InternalRowPartitionComputer(
-      new CoreOptions(table.options).partitionDefaultName,
+      options.partitionDefaultName,
       TypeUtils.project(table.rowType(), table.partitionKeys()),
-      table.partitionKeys().asScala.toArray
+      table.partitionKeys().asScala.toArray,
+      options.legacyPartitionName()
     )
+  }
 
   // Used to get the initial offset.
   lazy val streamScanStartingContext: StartingContext = 
streamScan.startingContext()
diff --git 
a/paimon-spark/paimon-spark-common/src/test/java/org/apache/paimon/spark/SparkFileIndexITCase.java
 
b/paimon-spark/paimon-spark-common/src/test/java/org/apache/paimon/spark/SparkFileIndexITCase.java
index 7af83186e..d82f92af5 100644
--- 
a/paimon-spark/paimon-spark-common/src/test/java/org/apache/paimon/spark/SparkFileIndexITCase.java
+++ 
b/paimon-spark/paimon-spark-common/src/test/java/org/apache/paimon/spark/SparkFileIndexITCase.java
@@ -130,7 +130,8 @@ public class SparkFileIndexITCase extends SparkWriteITCase {
                         new CoreOptions(new Options()).partitionDefaultName(),
                         CoreOptions.FILE_FORMAT.defaultValue().toString(),
                         CoreOptions.DATA_FILE_PREFIX.defaultValue(),
-                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue());
+                        CoreOptions.CHANGELOG_FILE_PREFIX.defaultValue(),
+                        
CoreOptions.PARTITION_GENERATE_LEGCY_NAME.defaultValue());
 
         Table table = fileSystemCatalog.getTable(Identifier.create("db", "T"));
         ReadBuilder readBuilder = table.newReadBuilder();
diff --git 
a/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala
 
b/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala
index f1215ede4..0006e45ec 100644
--- 
a/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala
+++ 
b/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala
@@ -27,7 +27,7 @@ import org.apache.spark.SparkException
 import org.apache.spark.sql.Row
 import org.junit.jupiter.api.Assertions
 
-import java.sql.Timestamp
+import java.sql.{Date, Timestamp}
 import java.time.LocalDateTime
 
 abstract class DDLTestBase extends PaimonSparkTestBase {
@@ -495,4 +495,55 @@ abstract class DDLTestBase extends PaimonSparkTestBase {
     }.getMessage
     assert(error.contains("Unsupported partition transform"))
   }
+
+  test("Fix partition column generate wrong partition spec") {
+    Seq(true, false).foreach {
+      legacyPartName =>
+        withTable("p_t") {
+          spark.sql(s"""
+                       |CREATE TABLE p_t (
+                       |    id BIGINT,
+                       |    c1 STRING
+                       |) using paimon
+                       |PARTITIONED BY (day binary)
+                       
|tblproperties('partition.legacy-name'='$legacyPartName');
+                       |""".stripMargin)
+
+          if (legacyPartName) {
+            spark.sql("insert into table p_t values(1, 'a', cast('2021' as 
binary))")
+            intercept[Exception] {
+              spark.sql("SELECT * FROM p_t").collect()
+            }
+          } else {
+            spark.sql("insert into table p_t values(1, 'a', cast('2021' as 
binary))")
+            checkAnswer(spark.sql("SELECT * FROM p_t"), Row(1, "a", 
"2021".getBytes))
+            val path = spark.sql("SELECT __paimon_file_path FROM 
p_t").collect()
+            assert(path.length == 1)
+            assert(path.head.getString(0).contains("/day=2021/"))
+          }
+        }
+
+        withTable("p_t") {
+          spark.sql(s"""
+                       |CREATE TABLE p_t (
+                       |    id BIGINT,
+                       |    c1 STRING
+                       |) using paimon
+                       |PARTITIONED BY (day date)
+                       
|tblproperties('partition.legacy-name'='$legacyPartName');
+                       |""".stripMargin)
+
+          spark.sql("insert into table p_t values(1, 'a', cast('2021-01-01' as 
date))")
+          checkAnswer(spark.sql("SELECT * FROM p_t"), Row(1, "a", 
Date.valueOf("2021-01-01")))
+
+          val path = spark.sql("SELECT __paimon_file_path FROM p_t").collect()
+          assert(path.length == 1)
+          if (legacyPartName) {
+            assert(path.head.getString(0).contains("/day=18628/"))
+          } else {
+            assert(path.head.getString(0).contains("/day=2021-01-01/"))
+          }
+        }
+    }
+  }
 }

Reply via email to