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 66c2b9caea [arrow] Fix TIMESTAMP_LTZ Arrow timezone to use UTC instead
of system default (#7364)
66c2b9caea is described below
commit 66c2b9caeabdb5c5b9c54bbcd5a4d75984d17981
Author: Jiajia Li <[email protected]>
AuthorDate: Thu Jun 4 16:51:01 2026 +0800
[arrow] Fix TIMESTAMP_LTZ Arrow timezone to use UTC instead of system
default (#7364)
LocalZonedTimestampType stores UTC timestamps by definition. However,
ArrowFieldTypeConversion used ZoneId.systemDefault() as the
ArrowTimestamp timezone.
---
.../paimon/arrow/ArrowFieldTypeConversion.java | 6 +-----
.../paimon/arrow/vector/ArrowFormatWriterTest.java | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowFieldTypeConversion.java
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowFieldTypeConversion.java
index 0a72e89304..80d9208053 100644
---
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowFieldTypeConversion.java
+++
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowFieldTypeConversion.java
@@ -49,8 +49,6 @@ import org.apache.arrow.vector.types.Types;
import org.apache.arrow.vector.types.pojo.ArrowType;
import org.apache.arrow.vector.types.pojo.FieldType;
-import java.time.ZoneId;
-
/** Utils for conversion between Paimon {@link DataType} and Arrow {@link
FieldType}. */
public class ArrowFieldTypeConversion {
@@ -148,9 +146,7 @@ public class ArrowFieldTypeConversion {
public FieldType visit(LocalZonedTimestampType
localZonedTimestampType) {
int precision = localZonedTimestampType.getPrecision();
TimeUnit timeUnit = getTimeUnit(precision);
- ArrowType arrowType =
- new ArrowType.Timestamp(
- timeUnit,
ZoneId.systemDefault().normalized().toString());
+ ArrowType arrowType = new ArrowType.Timestamp(timeUnit, "UTC");
return new FieldType(localZonedTimestampType.isNullable(),
arrowType, null);
}
diff --git
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
index 9b0333f376..5e7dc95395 100644
---
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
+++
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
@@ -51,6 +51,8 @@ import org.apache.arrow.vector.VectorSchemaRoot;
import org.apache.arrow.vector.complex.ListVector;
import org.apache.arrow.vector.complex.MapVector;
import org.apache.arrow.vector.complex.StructVector;
+import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.FieldType;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@@ -693,4 +695,23 @@ public class ArrowFormatWriterTest {
}
return bytes;
}
+
+ @Test
+ public void testTimestampArrowFieldTypeTimezone() {
+ for (int precision : new int[] {0, 3, 6, 9}) {
+ // TIMESTAMP_LTZ should use UTC
+ FieldType ltzFieldType =
+ DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(precision)
+
.accept(ArrowFieldTypeConversion.ARROW_FIELD_TYPE_VISITOR);
+ ArrowType.Timestamp ltzType = (ArrowType.Timestamp)
ltzFieldType.getType();
+ assertThat(ltzType.getTimezone()).isEqualTo("UTC");
+
+ // TIMESTAMP should have no timezone
+ FieldType tsFieldType =
+ DataTypes.TIMESTAMP(precision)
+
.accept(ArrowFieldTypeConversion.ARROW_FIELD_TYPE_VISITOR);
+ ArrowType.Timestamp tsType = (ArrowType.Timestamp)
tsFieldType.getType();
+ assertThat(tsType.getTimezone()).isNull();
+ }
+ }
}