This is an automated email from the ASF dual-hosted git repository.
JingsongLi 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 1ba6d371e9 [hive] Fix Hive timestamp mapped to Paimon millisecond
precision (#8643)
1ba6d371e9 is described below
commit 1ba6d371e9157821ca039f13e11a6e9317f62458
Author: Eunbin Son <[email protected]>
AuthorDate: Thu Jul 23 22:08:54 2026 +0900
[hive] Fix Hive timestamp mapped to Paimon millisecond precision (#8643)
---
.../java/org/apache/paimon/hive/HiveTypeUtils.java | 2 +-
.../org/apache/paimon/hive/HiveTypeUtilsTest.java | 22 ++++++++++++++++++++++
.../hive/HiveCatalogFormatTableITCaseBase.java | 2 +-
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git
a/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java
b/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java
index 23c01d1144..2e63570e3c 100644
---
a/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java
+++
b/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java
@@ -310,7 +310,7 @@ public class HiveTypeUtils {
} else if (TypeInfoFactory.dateTypeInfo.equals(atomic)) {
return DataTypes.DATE();
} else if (TypeInfoFactory.timestampTypeInfo.equals(atomic)) {
- return DataTypes.TIMESTAMP_MILLIS();
+ return DataTypes.TIMESTAMP();
}
throw new UnsupportedOperationException(
diff --git
a/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java
b/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java
index cef807d341..27fab307df 100644
---
a/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java
+++
b/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java
@@ -20,8 +20,11 @@ package org.apache.paimon.hive;
import org.apache.paimon.types.CharType;
import org.apache.paimon.types.DataField;
+import org.apache.paimon.types.DataType;
import org.apache.paimon.types.DataTypes;
import org.apache.paimon.types.IntType;
+import org.apache.paimon.types.LocalZonedTimestampType;
+import org.apache.paimon.types.TimestampType;
import org.apache.paimon.types.VarCharType;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
@@ -104,4 +107,23 @@ public class HiveTypeUtilsTest {
HiveTypeUtils.toTypeInfo(DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE());
assertThat(timestampWithLocalZoneTypeInfo.getTypeName()).isEqualTo("timestamp");
}
+
+ @Test
+ public void testToPaimonTypeTimestampPrecision() {
+ // Hive `timestamp` maps to Paimon TIMESTAMP with the default
precision, not the
+ // millisecond precision (3) which silently truncates sub-millisecond
values when a
+ // Hive schema is inferred into Paimon (migrate/clone/CREATE via Hive).
+ DataType timestamp = HiveTypeUtils.toPaimonType("timestamp");
+ assertThat(timestamp).isEqualTo(DataTypes.TIMESTAMP());
+ assertThat(((TimestampType) timestamp).getPrecision())
+ .isEqualTo(TimestampType.DEFAULT_PRECISION);
+
+ // Parity: the sibling local-zoned timestamp reverse path returns
+ // DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(), which carries the same
default
+ // precision (SparkTypeUtils maps timestamp to precision 6 as well).
+ assertThat(((TimestampType) timestamp).getPrecision())
+ .isEqualTo(LocalZonedTimestampType.DEFAULT_PRECISION);
+ assertThat(((TimestampType) timestamp).getPrecision())
+
.isEqualTo(DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE().getPrecision());
+ }
}
diff --git
a/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/HiveCatalogFormatTableITCaseBase.java
b/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/HiveCatalogFormatTableITCaseBase.java
index 2af00a7154..82a4389ef0 100644
---
a/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/HiveCatalogFormatTableITCaseBase.java
+++
b/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/HiveCatalogFormatTableITCaseBase.java
@@ -213,7 +213,7 @@ public abstract class HiveCatalogFormatTableITCaseBase {
assertThat(descResult)
.containsExactly(
"+I[a, INT, true, null, null, null, comment a]",
- "+I[b, TIMESTAMP(3), true, null, null, null, comment
b]");
+ "+I[b, TIMESTAMP(6), true, null, null, null, comment
b]");
hiveShell.execute(
String.format(
"INSERT INTO %s VALUES (1, '2025-03-17 10:15:30'), (2,
'2025-03-18 10:15:30')",