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

roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 3ce2387bcd [#11231] fix(spark-connector): handle JDBC timestamp type 
(#11424)
3ce2387bcd is described below

commit 3ce2387bcd93c74eeaf69116c246fa725042e47d
Author: YangJie <[email protected]>
AuthorDate: Thu Jun 4 20:46:14 2026 +0800

    [#11231] fix(spark-connector): handle JDBC timestamp type (#11424)
    
    ### What changes were proposed in this pull request?
    
    This PR updates the Spark JDBC type converter to map Gravitino timestamp
    types to Spark `TimestampType` in Spark common.
    
    It also adds unit tests for JDBC timestamp type conversion.
    
    ### Why are the changes needed?
    
    Spark 3.3 does not expose `TimestampNTZType` as a normal production
    timestamp type for this JDBC path. When PostgreSQL tables contain
    `timestamp without time zone`, Gravitino maps it to
    `TimestampType{withTimeZone=false}`, but Spark JDBC catalog schema
    rendering can fail because the common JDBC converter did not handle
    Gravitino timestamp types.
    
    Fix: #11231
    
    ### Does this PR introduce _any_ user-facing change?
    
    No API or configuration changes.
    
    This fixes Spark JDBC catalog behavior for timestamp columns.
    
    ### How was this patch tested?
    
    ```bash
    ./gradlew :spark-connector:spark-common:test \
        --tests 
"org.apache.gravitino.spark.connector.jdbc.TestSparkJdbcTypeConverter" \
        -PskipITs \
        -PskipDockerTests=true
    ```
    
    ```bash
    ./gradlew :spark-connector:spark-common:test \
        --tests "org.apache.gravitino.spark.connector.TestSparkTypeConverter" \
        -PskipITs \
        -PskipDockerTests=true
    ```
    
    Also ran:
    
    ```bash
    git diff --check
    ```
---
 .../connector/jdbc/SparkJdbcTypeConverter.java     |  2 ++
 .../jdbc/TestSparkJdbcTypeConverter.java}          | 33 +++++++++++++---------
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
index 56e2734a7f..95a9c0c408 100644
--- 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
+++ 
b/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
@@ -33,6 +33,8 @@ public class SparkJdbcTypeConverter extends 
SparkTypeConverter {
     // type varchar.
     if (gravitinoType instanceof Types.VarCharType) {
       return DataTypes.StringType;
+    } else if (gravitinoType instanceof Types.TimestampType) {
+      return DataTypes.TimestampType;
     } else {
       return super.toSparkType(gravitinoType);
     }
diff --git 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/jdbc/TestSparkJdbcTypeConverter.java
similarity index 54%
copy from 
spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
copy to 
spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/jdbc/TestSparkJdbcTypeConverter.java
index 56e2734a7f..00fd1c7784 100644
--- 
a/spark-connector/spark-common/src/main/java/org/apache/gravitino/spark/connector/jdbc/SparkJdbcTypeConverter.java
+++ 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/jdbc/TestSparkJdbcTypeConverter.java
@@ -19,22 +19,29 @@
 
 package org.apache.gravitino.spark.connector.jdbc;
 
-import org.apache.gravitino.rel.types.Type;
 import org.apache.gravitino.rel.types.Types;
-import org.apache.gravitino.spark.connector.SparkTypeConverter;
-import org.apache.spark.sql.types.DataType;
 import org.apache.spark.sql.types.DataTypes;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 
-public class SparkJdbcTypeConverter extends SparkTypeConverter {
+/** Unit tests for {@link SparkJdbcTypeConverter}. */
+public class TestSparkJdbcTypeConverter {
 
-  @Override
-  public DataType toSparkType(Type gravitinoType) {
-    // if spark version lower than 3.4.4, using VarCharType will throw an 
exception: Unsupported
-    // type varchar.
-    if (gravitinoType instanceof Types.VarCharType) {
-      return DataTypes.StringType;
-    } else {
-      return super.toSparkType(gravitinoType);
-    }
+  private final SparkJdbcTypeConverter sparkJdbcTypeConverter = new 
SparkJdbcTypeConverter();
+
+  @Test
+  void testConvertTimestampTypesToSparkTimestamp() {
+    Assertions.assertEquals(
+        DataTypes.TimestampType,
+        
sparkJdbcTypeConverter.toSparkType(Types.TimestampType.withTimeZone()));
+    Assertions.assertEquals(
+        DataTypes.TimestampType,
+        
sparkJdbcTypeConverter.toSparkType(Types.TimestampType.withoutTimeZone()));
+  }
+
+  @Test
+  void testConvertVarCharTypeToSparkString() {
+    Assertions.assertEquals(
+        DataTypes.StringType, 
sparkJdbcTypeConverter.toSparkType(Types.VarCharType.of(10)));
   }
 }

Reply via email to