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 535a5c944f [lance] Support TIMESTAMP_LTZ type (#10558)
535a5c944f is described below

commit 535a5c944f854cb8b68196d44677e576cf22120b
Author: Eunbin Son <[email protected]>
AuthorDate: Fri Oct 16 09:51:57 2026 +0900

    [lance] Support TIMESTAMP_LTZ type (#10558)
---
 docs/docs/concepts/spec/fileformat.md                      |  3 ++-
 .../org/apache/paimon/format/lance/LanceFileFormat.java    | 11 ++++-------
 .../paimon/format/lance/LanceFileFormatReadWriteTest.java  |  4 ++++
 .../apache/paimon/format/lance/LanceFileFormatTest.java    | 14 ++++++++++++++
 4 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/docs/docs/concepts/spec/fileformat.md 
b/docs/docs/concepts/spec/fileformat.md
index 8af08a4a1b..18c1bb59d9 100644
--- a/docs/docs/concepts/spec/fileformat.md
+++ b/docs/docs/concepts/spec/fileformat.md
@@ -248,11 +248,12 @@ The following table lists the type mapping from Paimon 
type to Lance (Arrow) typ
 | DATE | DATE32 |
 | TIME | TIME32 / TIME64 |
 | TIMESTAMP(P) | TIMESTAMP (unit based on precision) |
+| TIMESTAMP_LOCAL_ZONE(P) | TIMESTAMP (unit based on precision, UTC time zone) 
|
 | ARRAY | LIST |
 | ROW | STRUCT |
 
 Limitations:
-1. Lance file format does not support `MAP`, `MULTISET`, 
`TIMESTAMP_LOCAL_ZONE` or `VARIANT` types.
+1. Lance file format does not support `MAP`, `MULTISET` or `VARIANT` types.
 2. Lance file format does not support `BLOB` fields stored inline in data 
files (`blob-descriptor-field` or `blob-view-field`). Regular `BLOB` fields are 
written to dedicated blob files and are not affected.
 
 ## Vortex
diff --git 
a/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java
 
b/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java
index 2eee2639b7..8a0619fe06 100644
--- 
a/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java
+++ 
b/paimon-lance/src/main/java/org/apache/paimon/format/lance/LanceFileFormat.java
@@ -169,13 +169,10 @@ public class LanceFileFormat extends FileFormat {
 
         @Override
         public Void visit(LocalZonedTimestampType localZonedTimestampType) {
-            // lance has a bug here, if the local in GMT-10:00, it failed by 
reson: called
-            // `Result::unwrap()` on an `Err` value: Schema { message: 
"Unsupported timestamp type:
-            // timestamp:us:GMT-10:00", location: Location { file:
-            // "rust/lance-core/src/datatypes.rs", line: 326, column: 39 } }
-            // Disable it for now.
-            throw new UnsupportedOperationException(
-                    "Lance file format does not support type 
LOCAL_ZONED_TIMESTAMP");
+            // Lance cannot parse timestamp time zone ids containing ':' (e.g. 
GMT-10:00), which
+            // aborts the JVM. This is safe because ArrowFieldTypeConversion 
always writes
+            // LOCAL_ZONED_TIMESTAMP with the "UTC" time zone.
+            return null;
         }
 
         @Override
diff --git 
a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatReadWriteTest.java
 
b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatReadWriteTest.java
index efd1636932..30df66db08 100644
--- 
a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatReadWriteTest.java
+++ 
b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatReadWriteTest.java
@@ -64,6 +64,8 @@ public class LanceFileFormatReadWriteTest extends 
FormatReadWriteTest {
                         .field("bytes", DataTypes.BYTES())
                         .field("timestamp", DataTypes.TIMESTAMP())
                         .field("timestamp_3", DataTypes.TIMESTAMP(3))
+                        .field("timestamp_ltz", 
DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE())
+                        .field("timestamp_ltz_3", 
DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(3))
                         .field("date", DataTypes.DATE())
                         .field("decimal", DataTypes.DECIMAL(2, 2))
                         .field("decimal2", DataTypes.DECIMAL(38, 2))
@@ -106,6 +108,8 @@ public class LanceFileFormatReadWriteTest extends 
FormatReadWriteTest {
                         new byte[] {1, 5, 2},
                         Timestamp.fromMicros(123123123),
                         Timestamp.fromEpochMillis(123123123),
+                        Timestamp.fromMicros(123123123),
+                        Timestamp.fromEpochMillis(123123123),
                         2456,
                         Decimal.fromBigDecimal(new BigDecimal("0.22"), 2, 2),
                         Decimal.fromBigDecimal(new BigDecimal("12312455.22"), 
38, 2),
diff --git 
a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java
 
b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java
index 9a7152e259..b2aaf47654 100644
--- 
a/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java
+++ 
b/paimon-lance/src/test/java/org/apache/paimon/format/lance/LanceFileFormatTest.java
@@ -102,6 +102,20 @@ public class LanceFileFormatTest {
         assertDoesNotThrow(() -> format.validateDataFields(rowType));
     }
 
+    @Test
+    public void testValidateDataFields_SupportedLocalZonedTimestampType() {
+        LanceFileFormat format =
+                new LanceFileFormat(new FileFormatFactory.FormatContext(new 
Options(), 1024, 1024));
+        RowType rowType =
+                RowType.of(
+                        DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(0),
+                        DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(3),
+                        DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(6),
+                        DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE(9),
+                        
DataTypes.ARRAY(DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE()));
+        assertDoesNotThrow(() -> format.validateDataFields(rowType));
+    }
+
     @Test
     public void testValidateDataFields_UnsupportedVariantType() {
         LanceFileFormat format =

Reply via email to