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

yuqi4733 pushed a commit to branch branch-trino-smv
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-trino-smv by this push:
     new 41fbf422db [#9719] feat (trino-connector): Add the version segment 
module to support Trino-435 to Trino–439 (#9861)
41fbf422db is described below

commit 41fbf422dbcd55b2d17bd232200980f0d7449342
Author: Yuhui <[email protected]>
AuthorDate: Thu Feb 5 14:25:03 2026 +0800

    [#9719] feat (trino-connector): Add the version segment module to support 
Trino-435 to Trino–439 (#9861)
    
    ### What changes were proposed in this pull request?
    
    Add the version segment module for 435–439 to support Trino 345 through
    Trino 439
    
    ### Why are the changes needed?
    
    Fix: #9719
    
    ### Does this PR introduce _any_ user-facing change?
    
    NO
    
    ### How was this patch tested?
    
    UT and IT
---
 .github/workflows/frontend-integration-test.yml    |   9 +-
 .github/workflows/trino-integration-test.yml       |  14 +-
 build.gradle.kts                                   |  57 ++------
 gradle.properties                                  |   5 +
 .../docker-script/docker-compose.yaml              |   4 +-
 .../docker-script/init/trino/init.sh               |   2 +-
 integration-test-common/docker-script/shutdown.sh  |   1 +
 .../test/container/TrinoITContainers.java          |   8 ++
 settings.gradle.kts                                |   6 +-
 .../connector/integration/test/TrinoQueryIT.java   |  10 --
 .../integration/test/TrinoQueryITBase.java         |   2 +-
 .../{run_test.sh => run_trino_test_with_env.sh}    |   0
 .../{trino_test.sh => trino_integration_test.sh}   |   0
 .../trino-connector-435-439/build.gradle.kts       | 159 +++++++++++++++++++++
 .../trino/connector/GravitinoConnector435.java     |  55 +++++++
 .../connector/GravitinoConnectorFactory435.java    |  52 +++++++
 .../trino/connector/GravitinoMetadata435.java      |  83 +++++++++++
 .../GravitinoNodePartitioningProvider435.java      |  30 ++++
 .../trino/connector/GravitinoPlugin435.java        |  38 +++++
 .../trino/connector/GravitinoSplitManager435.java  |  66 +++++++++
 .../connector/GravitinoSystemConnector435.java     |  87 +++++++++++
 .../META-INF/services/io.trino.spi.Plugin          |  12 +-
 .../src/test/java/TestGravitinoConnector435.java   |  59 ++++++++
 trino-connector/trino-connector/build.gradle.kts   |   6 +-
 .../trino/connector/GravitinoMockServer.java       |   7 +
 25 files changed, 690 insertions(+), 82 deletions(-)

diff --git a/.github/workflows/frontend-integration-test.yml 
b/.github/workflows/frontend-integration-test.yml
index 71f788371c..e636df7c89 100644
--- a/.github/workflows/frontend-integration-test.yml
+++ b/.github/workflows/frontend-integration-test.yml
@@ -1,8 +1,11 @@
 name: Frontend Integration Test
 
 # Controls when the workflow will run
-# Disable it temporarily.
-on: {}
+on:
+  push:
+    branches: [ "main", "branch-*" ]
+  pull_request:
+    branches: [ "main", "branch-*" ]
 
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
@@ -72,7 +75,7 @@ jobs:
 
       - name: Package Gravitino
         run: |
-          ./gradlew compileDistribution -x test 
+          ./gradlew compileDistribution compileTrinoConnector -x test
 
       - name: Free up disk space
         run: |
diff --git a/.github/workflows/trino-integration-test.yml 
b/.github/workflows/trino-integration-test.yml
index a8097e0337..ae9c0d5ec4 100644
--- a/.github/workflows/trino-integration-test.yml
+++ b/.github/workflows/trino-integration-test.yml
@@ -1,8 +1,11 @@
 name: Trino Integration Test
 
 # Controls when the workflow will run
-# Disable it temporarily.
-on: {}
+on:
+  push:
+    branches: [ "main", "branch-*" ]
+  pull_request:
+    branches: [ "main", "branch-*" ]
 
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
@@ -71,9 +74,9 @@ jobs:
         run: |
           dev/ci/check_commands.sh
 
-      - name: Package Gravitino
+      - name: Build Gravitino
         run: |
-          ./gradlew compileDistribution compileTrinoConnector -x test
+          ./gradlew build -x test
 
       - name: Free up disk space
         run: |
@@ -82,8 +85,7 @@ jobs:
       - name: Trino Integration Test
         id: integrationTest
         run: |
-          ./gradlew -PskipTests -PtestMode=embedded -PskipDockerTests=false 
:trino-connector:integration-test:test
-          ./gradlew -PskipTests -PtestMode=deploy -PskipDockerTests=false 
:trino-connector:integration-test:test
+          
trino-connector/integration-test/trino-test-tools/trino_integration_test.sh
           # Disable the Trino cascading query integration test, because the 
connector jars are private now.
           #trino-connector/integration-test/trino-test-tools/run_test.sh
 
diff --git a/build.gradle.kts b/build.gradle.kts
index ee123d68c7..15c9a1987f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -860,25 +860,17 @@ tasks {
   }
 
   val compileTrinoConnector by registering {
-    dependsOn("trino-connector:trino-connector:copyLibs")
+    dependsOn("trino-connector:trino-connector-435-439:copyLibs")
     group = "gravitino distribution"
-    
outputs.dir(projectDir.dir("distribution/${rootProject.name}-trino-connector"))
-    doLast {
-      copy {
-        from(projectDir.dir("licenses")) { 
into("${rootProject.name}-trino-connector/licenses") }
-        from(projectDir.file("LICENSE.trino")) { 
into("${rootProject.name}-trino-connector") }
-        from(projectDir.file("NOTICE.trino")) { 
into("${rootProject.name}-trino-connector") }
-        from(projectDir.file("README.md")) { 
into("${rootProject.name}-trino-connector") }
-        into(outputDir)
-        rename { fileName ->
-          fileName.replace(".trino", "")
-        }
-      }
-    }
+    
outputs.dir(projectDir.dir("distribution/${rootProject.name}-trino-connector-435-439"))
   }
 
   val assembleDistribution by registering(Tar::class) {
-    dependsOn("assembleTrinoConnector", "assembleIcebergRESTServer", 
"assembleLanceRESTServer")
+    dependsOn(
+      ":trino-connector:trino-connector-435-439:assembleTrinoConnector",
+      "assembleIcebergRESTServer",
+      "assembleLanceRESTServer"
+    )
     group = "gravitino distribution"
     finalizedBy("checksumDistribution")
     into("${rootProject.name}-$version-bin")
@@ -888,17 +880,6 @@ tasks {
     destinationDirectory.set(projectDir.dir("distribution"))
   }
 
-  val assembleTrinoConnector by registering(Tar::class) {
-    dependsOn("compileTrinoConnector")
-    group = "gravitino distribution"
-    finalizedBy("checksumTrinoConnector")
-    into("${rootProject.name}-trino-connector-$version")
-    from(compileTrinoConnector.map { it.outputs.files.single() })
-    compression = Compression.GZIP
-    archiveFileName.set("${rootProject.name}-trino-connector-$version.tar.gz")
-    destinationDirectory.set(projectDir.dir("distribution"))
-  }
-
   val assembleLanceRESTServer by registering(Tar::class) {
     dependsOn("compileLanceRESTServer")
     group = "gravitino distribution"
@@ -955,7 +936,11 @@ tasks {
 
   register("checksumDistribution") {
     group = "gravitino distribution"
-    dependsOn(assembleDistribution, "checksumTrinoConnector", 
"checksumIcebergRESTServerDistribution", "checksumLanceRESTServerDistribution")
+    dependsOn(
+      assembleDistribution,
+      "checksumIcebergRESTServerDistribution",
+      "checksumLanceRESTServerDistribution"
+    )
     val archiveFile = assembleDistribution.flatMap { it.archiveFile }
     val checksumFile = archiveFile.map { archive ->
       archive.asFile.let { it.resolveSibling("${it.name}.sha256") }
@@ -969,22 +954,6 @@ tasks {
     }
   }
 
-  register("checksumTrinoConnector") {
-    group = "gravitino distribution"
-    dependsOn(assembleTrinoConnector)
-    val archiveFile = assembleTrinoConnector.flatMap { it.archiveFile }
-    val checksumFile = archiveFile.map { archive ->
-      archive.asFile.let { it.resolveSibling("${it.name}.sha256") }
-    }
-    inputs.file(archiveFile)
-    outputs.file(checksumFile)
-    doLast {
-      checksumFile.get().writeText(
-        
serviceOf<ChecksumService>().sha256(archiveFile.get().asFile).toString()
-      )
-    }
-  }
-
   val cleanDistribution by registering(Delete::class) {
     group = "gravitino distribution"
     delete(outputDir)
@@ -1003,9 +972,9 @@ tasks {
         !it.name.startsWith("optimizer") &&
         !it.name.startsWith("spark") &&
         !it.name.startsWith("hive-metastore") &&
+        !it.name.startsWith("trino-connector") &&
         it.name != "hadoop-common" &&
         it.name != "integration-test" &&
-        it.name != "trino-connector" &&
         it.parent?.name != "bundles" &&
         it.parent?.name != "maintenance" &&
         it.name != "mcp-server"
diff --git a/gradle.properties b/gradle.properties
index 13d97cb2bc..9c844d4047 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -21,6 +21,8 @@ org.gradle.parallel=true
 # Build cache can be disabled with --no-build-cache option
 org.gradle.caching=true
 org.gradle.jvmargs=-Xmx4g
+org.gradle.java.installations.auto-download=true
+org.gradle.java.installations.auto-detect=true
 
 # version that is going to be updated automatically by releases
 version = 1.2.0-SNAPSHOT
@@ -40,3 +42,6 @@ skipDockerTests = true
 
 # enableFuse is used to enable the fuse module in the build.
 enableFuse = false
+
+# The minimum supported Trino version.
+minSupportedTrinoVersion= 435
diff --git a/integration-test-common/docker-script/docker-compose.yaml 
b/integration-test-common/docker-script/docker-compose.yaml
index 7b3d46b89e..2641e53992 100644
--- a/integration-test-common/docker-script/docker-compose.yaml
+++ b/integration-test-common/docker-script/docker-compose.yaml
@@ -94,7 +94,7 @@ services:
     entrypoint:  /bin/bash /tmp/trino/init.sh
     volumes:
       - ./init/trino:/tmp/trino
-      - 
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector/build/libs}:/usr/lib/trino/plugin/gravitino
+      - 
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-435-439/build/libs}:/usr/lib/trino/plugin/gravitino
     extra_hosts:
       - "host.docker.internal:host-gateway"
     healthcheck:
@@ -128,7 +128,7 @@ services:
     entrypoint:  /bin/bash /tmp/trino/init.sh
     volumes:
       - ./init/trino:/tmp/trino
-      - 
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector/build/libs}:/usr/lib/trino/plugin/gravitino
+      - 
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-435-439/build/libs}:/usr/lib/trino/plugin/gravitino
     extra_hosts:
       - "host.docker.internal:host-gateway"
     depends_on:
diff --git a/integration-test-common/docker-script/init/trino/init.sh 
b/integration-test-common/docker-script/init/trino/init.sh
index 385c06e8f5..051d56ee6c 100644
--- a/integration-test-common/docker-script/init/trino/init.sh
+++ b/integration-test-common/docker-script/init/trino/init.sh
@@ -60,7 +60,7 @@ fi
 
 # Container start up
 if [[ "${TRINO_ROLE}" == "coordinator" ]]; then
-  nohup /usr/lib/trino/bin/run-trino &
+  nohup /usr/lib/trino/bin/run-trino > /tmp/trino.out 2>&1 &
 
   counter=0
   while [ $counter -le 300 ]; do
diff --git a/integration-test-common/docker-script/shutdown.sh 
b/integration-test-common/docker-script/shutdown.sh
index f2a60d3d9d..90288834ff 100755
--- a/integration-test-common/docker-script/shutdown.sh
+++ b/integration-test-common/docker-script/shutdown.sh
@@ -26,4 +26,5 @@ if [ -d $LOG_DIR ]; then
   docker cp trino-ci-hive:/tmp/root $LOG_DIR/hive
 fi
 
+export GRAVITINO_TRINO_CONNECTOR_DIR=/dev/null
 docker compose down
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/TrinoITContainers.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/TrinoITContainers.java
index b26984c6d2..d5b2636d6c 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/TrinoITContainers.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/container/TrinoITContainers.java
@@ -19,6 +19,9 @@
 package org.apache.gravitino.integration.test.container;
 
 import com.google.common.collect.ImmutableSet;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.gravitino.integration.test.util.CommandExecutor;
@@ -70,6 +73,10 @@ public class TrinoITContainers implements AutoCloseable {
       env.put("TRINO_VERSION", String.valueOf(trinoVersion));
     }
     if (trinoConnectorDir != null) {
+      Path path = Paths.get(trinoConnectorDir);
+      if (!Files.exists(path)) {
+        throw new Exception("Provided GRAVITINO_TRINO_CONNECTOR_DIR '" + path 
+ "' does not exist");
+      }
       env.put("GRAVITINO_TRINO_CONNECTOR_DIR", trinoConnectorDir);
     }
     env.put("GRAVITINO_SERVER_PORT", String.valueOf(gravitinoServerPort));
@@ -79,6 +86,7 @@ public class TrinoITContainers implements AutoCloseable {
       env.put("GRAVITINO_LOG_PATH", System.getProperty("gravitino.log.path"));
     }
 
+    LOG.info("Launching containers with env: {}", env);
     String command = ITUtils.joinPath(dockerComposeDir, "launch.sh");
     Object output =
         CommandExecutor.executeCommandLocalHost(
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 75dab2bc0c..7095a8b79e 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -63,7 +63,11 @@ include("iceberg:iceberg-rest-server")
 include("lance:lance-common")
 include("lance:lance-rest-server")
 include("authorizations:authorization-ranger", 
"authorizations:authorization-common", "authorizations:authorization-chain")
-include("trino-connector:trino-connector", "trino-connector:integration-test")
+include(
+  "trino-connector:trino-connector",
+  "trino-connector:trino-connector-435-439",
+  "trino-connector:integration-test"
+)
 include("spark-connector:spark-common")
 if (scalaVersion == "2.12") {
   // flink only support scala 2.12
diff --git 
a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryIT.java
 
b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryIT.java
index 811e8229f7..ef06725de9 100644
--- 
a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryIT.java
+++ 
b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryIT.java
@@ -42,16 +42,9 @@ import java.util.regex.Pattern;
 import org.apache.gravitino.integration.test.util.ITUtils;
 import org.apache.logging.log4j.util.Strings;
 import org.awaitility.Awaitility;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Tag("gravitino-docker-test")
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public class TrinoQueryIT extends TrinoQueryITBase {
   private static final Logger LOG = 
LoggerFactory.getLogger(TrinoQueryIT.class);
 
@@ -82,7 +75,6 @@ public class TrinoQueryIT extends TrinoQueryITBase {
     testsetsDir = ITUtils.joinPath(testsetsDir, "testsets");
   }
 
-  @BeforeAll
   public void setup() throws Exception {
     trinoQueryITBase = new TrinoQueryITBase(trinoWorkerNum, trinoVersion, 
trinoConnectorDir);
     trinoQueryITBase.setup();
@@ -123,7 +115,6 @@ public class TrinoQueryIT extends TrinoQueryITBase {
     }
   }
 
-  @AfterAll
   public static void cleanup() {
     TrinoQueryITBase.cleanup();
   }
@@ -341,7 +332,6 @@ public class TrinoQueryIT extends TrinoQueryITBase {
     return match;
   }
 
-  @Test
   public void testSql() throws Exception {
     ExecutorService executor = Executors.newFixedThreadPool(testParallelism);
     CompletionService<Integer> completionService = new 
ExecutorCompletionService<>(executor);
diff --git 
a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryITBase.java
 
b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryITBase.java
index f2197c0e57..456e24d4c4 100644
--- 
a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryITBase.java
+++ 
b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryITBase.java
@@ -150,7 +150,7 @@ public class TrinoQueryITBase {
     try {
       if (autoStart) {
         if (trinoITContainers != null) trinoITContainers.shutdown();
-        baseIT.stopIntegrationTest();
+        if (baseIT != null) baseIT.stopIntegrationTest();
       }
     } catch (Exception e) {
       LOG.error("Error in cleanup", e);
diff --git a/trino-connector/integration-test/trino-test-tools/run_test.sh 
b/trino-connector/integration-test/trino-test-tools/run_trino_test_with_env.sh
similarity index 100%
rename from trino-connector/integration-test/trino-test-tools/run_test.sh
rename to 
trino-connector/integration-test/trino-test-tools/run_trino_test_with_env.sh
diff --git a/trino-connector/integration-test/trino-test-tools/trino_test.sh 
b/trino-connector/integration-test/trino-test-tools/trino_integration_test.sh
similarity index 100%
rename from trino-connector/integration-test/trino-test-tools/trino_test.sh
rename to 
trino-connector/integration-test/trino-test-tools/trino_integration_test.sh
diff --git a/trino-connector/trino-connector-435-439/build.gradle.kts 
b/trino-connector/trino-connector-435-439/build.gradle.kts
new file mode 100644
index 0000000000..a9602647f8
--- /dev/null
+++ b/trino-connector/trino-connector-435-439/build.gradle.kts
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.diffplug.gradle.spotless.SpotlessExtension
+import net.ltgt.gradle.errorprone.errorprone
+import org.gradle.internal.hash.ChecksumService
+import org.gradle.kotlin.dsl.support.serviceOf
+
+plugins {
+  `java-library`
+  `maven-publish`
+}
+
+val supportedTrinoVersion = 435
+val minSupportedTrinoVersionProperty = 
providers.gradleProperty("minSupportedTrinoVersion").map { it.trim().toInt() }
+val trinoVersionProvider =
+  providers.gradleProperty("trinoVersion").map { it.trim().toInt() 
}.orElse(minSupportedTrinoVersionProperty)
+
+val resolvedTrinoVersion = trinoVersionProvider.get()
+check(resolvedTrinoVersion >= supportedTrinoVersion) {
+  "Failed to build the module ${project.path} of 
trinoVersion=$resolvedTrinoVersion. " +
+    "This module requires trinoVersion >= $supportedTrinoVersion. " +
+    "Please set '-PtrinoVersion' in the command or set config the 
'minSupportedTrinoVersion' of gradle.properties."
+}
+val trinoVersion = resolvedTrinoVersion
+
+java {
+  toolchain.languageVersion.set(JavaLanguageVersion.of(24))
+}
+
+dependencies {
+  implementation(project(":catalogs:catalog-common"))
+  implementation(project(":clients:client-java-runtime", configuration = 
"shadow"))
+  implementation(libs.airlift.json)
+  implementation(libs.bundles.log4j)
+  implementation(libs.commons.collections4)
+  implementation(libs.commons.lang3)
+  implementation("io.trino:trino-jdbc:$trinoVersion")
+  compileOnly(libs.airlift.resolver)
+  compileOnly("io.trino:trino-spi:$trinoVersion") {
+    exclude("org.apache.logging.log4j")
+  }
+  testImplementation(libs.awaitility)
+  testImplementation(libs.mockito.core)
+  testImplementation(libs.mysql.driver)
+  testImplementation("io.trino:trino-memory:$trinoVersion") {
+    exclude("org.antlr")
+    exclude("org.apache.logging.log4j")
+  }
+  testImplementation("io.trino:trino-testing:$trinoVersion") {
+    exclude("org.apache.logging.log4j")
+  }
+  testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+sourceSets {
+  main {
+    java.srcDirs("../trino-connector/src/main/java")
+  }
+  test {
+    java.srcDirs("../trino-connector/src/test/java")
+    resources.srcDirs("../trino-connector/src/test/resources")
+  }
+}
+
+plugins.withId("com.diffplug.spotless") {
+  configure<SpotlessExtension> {
+    java {
+      // Keep Spotless within this module to avoid cross-project target errors.
+      target(project.fileTree("src") { include("**/*.java") })
+    }
+  }
+}
+
+tasks.withType<JavaCompile>().configureEach {
+  // Error Prone is incompatible with the JDK 24 toolchain required by this 
Trino range.
+  options.errorprone.isEnabled.set(false)
+  options.release.set(17)
+}
+
+tasks.withType<Test>().configureEach {
+  extensions
+    
.findByType(org.gradle.testing.jacoco.plugins.JacocoTaskExtension::class.java)
+    ?.isEnabled = false
+}
+
+tasks {
+  val copyRuntimeLibs by registering(Copy::class) {
+    dependsOn("jar")
+    from({ configurations.runtimeClasspath.get().filter(File::isFile) })
+    into(layout.buildDirectory.dir("libs"))
+  }
+
+  val distributionDir = 
rootProject.layout.projectDirectory.dir("distribution/${rootProject.name}-${project.name}")
+
+  val copyLibs by registering(Copy::class) {
+    dependsOn(copyRuntimeLibs, "build")
+    from(layout.buildDirectory.dir("libs"))
+    from(rootProject.layout.projectDirectory.dir("licenses")) {
+      into("licenses")
+    }
+    from(rootProject.file("LICENSE.trino"))
+    from(rootProject.file("NOTICE.trino"))
+    from(rootProject.file("README.md"))
+    into(distributionDir)
+    rename { fileName ->
+      fileName.replace(".trino", "")
+    }
+    outputs.dir(distributionDir)
+  }
+
+  val assembleTrinoConnector by registering(Tar::class) {
+    dependsOn(copyLibs)
+    group = "gravitino distribution"
+    finalizedBy("checksumTrinoConnector")
+    val archiveBase = "${rootProject.name}-${project.name}-$version"
+    into(archiveBase)
+    from(distributionDir)
+    compression = Compression.GZIP
+    archiveFileName.set("$archiveBase.tar.gz")
+    
destinationDirectory.set(rootProject.layout.projectDirectory.dir("distribution"))
+  }
+
+  val checksumTrinoConnector by registering {
+    group = "gravitino distribution"
+    dependsOn(assembleTrinoConnector)
+    val archiveFile = assembleTrinoConnector.flatMap { it.archiveFile }
+    val checksumFile = archiveFile.map { archive ->
+      archive.asFile.let { it.resolveSibling("${it.name}.sha256") }
+    }
+    inputs.file(archiveFile)
+    outputs.file(checksumFile)
+    doLast {
+      checksumFile.get().writeText(
+        
serviceOf<ChecksumService>().sha256(archiveFile.get().asFile).toString()
+      )
+    }
+  }
+
+  named("build") {
+    finalizedBy(copyRuntimeLibs)
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector435.java
new file mode 100644
index 0000000000..9d6dc932d4
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector435.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import io.trino.spi.connector.ConnectorMetadata;
+import io.trino.spi.connector.ConnectorNodePartitioningProvider;
+import io.trino.spi.connector.ConnectorSplitManager;
+import org.apache.gravitino.trino.connector.catalog.CatalogConnectorContext;
+import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadata;
+import 
org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter;
+
+public class GravitinoConnector435 extends GravitinoConnector {
+
+  public GravitinoConnector435(CatalogConnectorContext connectorContext) {
+    super(connectorContext);
+  }
+
+  @Override
+  protected GravitinoMetadata createGravitinoMetadata(
+      CatalogConnectorMetadata catalogConnectorMetadata,
+      CatalogConnectorMetadataAdapter metadataAdapter,
+      ConnectorMetadata internalMetadata) {
+    return new GravitinoMetadata435(catalogConnectorMetadata, metadataAdapter, 
internalMetadata);
+  }
+
+  @Override
+  public ConnectorSplitManager getSplitManager() {
+    ConnectorSplitManager splitManager =
+        catalogConnectorContext.getInternalConnector().getSplitManager();
+    return new GravitinoSplitManager435(splitManager);
+  }
+
+  @Override
+  public ConnectorNodePartitioningProvider getNodePartitioningProvider() {
+    ConnectorNodePartitioningProvider nodePartitioningProvider =
+        
catalogConnectorContext.getInternalConnector().getNodePartitioningProvider();
+    return new GravitinoNodePartitioningProvider435(nodePartitioningProvider);
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory435.java
new file mode 100644
index 0000000000..2ac78816ce
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory435.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import org.apache.gravitino.client.GravitinoAdminClient;
+import org.apache.gravitino.trino.connector.catalog.CatalogConnectorContext;
+import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector;
+import 
org.apache.gravitino.trino.connector.system.storedprocedure.GravitinoStoredProcedureFactory;
+
+public class GravitinoConnectorFactory435 extends GravitinoConnectorFactory {
+
+  public GravitinoConnectorFactory435(GravitinoAdminClient client) {
+    super(client);
+  }
+
+  @Override
+  protected int getMinSupportTrinoSpiVersion() {
+    return 435;
+  }
+
+  @Override
+  protected int getMaxSupportTrinoSpiVersion() {
+    return 439;
+  }
+
+  @Override
+  protected GravitinoConnector createConnector(CatalogConnectorContext 
connectorContext) {
+    return new GravitinoConnector435(connectorContext);
+  }
+
+  @Override
+  protected GravitinoSystemConnector createSystemConnector(
+      GravitinoStoredProcedureFactory storedProcedureFactory) {
+    return new GravitinoSystemConnector435(storedProcedureFactory);
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata435.java
new file mode 100644
index 0000000000..919d53f4a6
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata435.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import io.airlift.slice.Slice;
+import io.trino.spi.connector.ColumnMetadata;
+import io.trino.spi.connector.ConnectorInsertTableHandle;
+import io.trino.spi.connector.ConnectorMergeTableHandle;
+import io.trino.spi.connector.ConnectorOutputMetadata;
+import io.trino.spi.connector.ConnectorSession;
+import io.trino.spi.connector.ConnectorTableHandle;
+import io.trino.spi.connector.RetryMode;
+import io.trino.spi.connector.SchemaTableName;
+import io.trino.spi.statistics.ComputedStatistics;
+import java.util.Collection;
+import java.util.Optional;
+import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadata;
+import 
org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter;
+import org.apache.gravitino.trino.connector.metadata.GravitinoColumn;
+
+public class GravitinoMetadata435 extends GravitinoMetadata {
+
+  public GravitinoMetadata435(
+      CatalogConnectorMetadata catalogConnectorMetadata,
+      CatalogConnectorMetadataAdapter metadataAdapter,
+      io.trino.spi.connector.ConnectorMetadata internalMetadata) {
+    super(catalogConnectorMetadata, metadataAdapter, internalMetadata);
+  }
+
+  @Override
+  public void addColumn(
+      ConnectorSession session, ConnectorTableHandle tableHandle, 
ColumnMetadata column) {
+    GravitinoColumn gravitinoColumn = metadataAdapter.createColumn(column);
+    catalogConnectorMetadata.addColumn(getTableName(tableHandle), 
gravitinoColumn);
+  }
+
+  @Override
+  public Optional<ConnectorOutputMetadata> finishInsert(
+      ConnectorSession session,
+      ConnectorInsertTableHandle insertHandle,
+      Collection<Slice> fragments,
+      Collection<ComputedStatistics> computedStatistics) {
+    return internalMetadata.finishInsert(
+        session, GravitinoHandle.unWrap(insertHandle), fragments, 
computedStatistics);
+  }
+
+  @Override
+  public ConnectorMergeTableHandle beginMerge(
+      ConnectorSession session, ConnectorTableHandle tableHandle, RetryMode 
retryMode) {
+    ConnectorMergeTableHandle connectorMergeTableHandle =
+        internalMetadata.beginMerge(session, 
GravitinoHandle.unWrap(tableHandle), retryMode);
+    SchemaTableName tableName = getTableName(tableHandle);
+
+    return new GravitinoMergeTableHandle(
+        tableName.getSchemaName(), tableName.getTableName(), 
connectorMergeTableHandle);
+  }
+
+  @Override
+  public void finishMerge(
+      ConnectorSession session,
+      ConnectorMergeTableHandle mergeTableHandle,
+      Collection<Slice> fragments,
+      Collection<ComputedStatistics> computedStatistics) {
+    internalMetadata.finishMerge(
+        session, GravitinoHandle.unWrap(mergeTableHandle), fragments, 
computedStatistics);
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider435.java
new file mode 100644
index 0000000000..e45753da54
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider435.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import io.trino.spi.connector.ConnectorNodePartitioningProvider;
+
+/** Trino NodePartitioningProvider implementation with the new split bucket 
function signature. */
+public class GravitinoNodePartitioningProvider435 extends 
GravitinoNodePartitioningProvider {
+
+  public GravitinoNodePartitioningProvider435(
+      ConnectorNodePartitioningProvider nodePartitioningProvider) {
+    super(nodePartitioningProvider);
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin435.java
new file mode 100644
index 0000000000..9a0e8f328a
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin435.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import org.apache.gravitino.client.GravitinoAdminClient;
+
+/** Trino plugin endpoint, using java spi mechanism */
+public class GravitinoPlugin435 extends GravitinoPlugin {
+
+  public GravitinoPlugin435() {
+    super();
+  }
+
+  public GravitinoPlugin435(GravitinoAdminClient client) {
+    super(client);
+  }
+
+  @Override
+  protected GravitinoConnectorFactory 
createConnectorFactory(GravitinoAdminClient client) {
+    return new GravitinoConnectorFactory435(client);
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager435.java
new file mode 100644
index 0000000000..306feea732
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager435.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.trino.spi.connector.ConnectorSplit;
+import io.trino.spi.connector.ConnectorSplitManager;
+import io.trino.spi.connector.ConnectorSplitSource;
+
+public class GravitinoSplitManager435 extends GravitinoSplitManager {
+
+  public GravitinoSplitManager435(ConnectorSplitManager internalSplitManager) {
+    super(internalSplitManager);
+  }
+
+  @Override
+  protected ConnectorSplitSource createSplitSource(ConnectorSplitSource 
splits) {
+    return new GravitinoSplitSource435(splits);
+  }
+
+  static class GravitinoSplitSource435 extends GravitinoSplitSource {
+
+    GravitinoSplitSource435(ConnectorSplitSource connectorSplitSource) {
+      super(connectorSplitSource);
+    }
+
+    @Override
+    protected ConnectorSplit createSplit(ConnectorSplit split) {
+      return new GravitinoSplit435(split);
+    }
+  }
+
+  public static class GravitinoSplit435 extends GravitinoSplit {
+
+    @JsonCreator
+    public GravitinoSplit435(@JsonProperty(HANDLE_STRING) String handleString) 
{
+      super(handleString);
+    }
+
+    public GravitinoSplit435(ConnectorSplit split) {
+      super(split);
+    }
+
+    @Override
+    public Object getInfo() {
+      return getInternalHandle().getInfo();
+    }
+  }
+}
diff --git 
a/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector435.java
 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector435.java
new file mode 100644
index 0000000000..e3c3074367
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector435.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.trino.connector;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.trino.spi.Page;
+import io.trino.spi.connector.ConnectorPageSource;
+import io.trino.spi.connector.ConnectorPageSourceProvider;
+import io.trino.spi.connector.ConnectorSplit;
+import io.trino.spi.connector.ConnectorSplitManager;
+import io.trino.spi.connector.SchemaTableName;
+import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector;
+import 
org.apache.gravitino.trino.connector.system.storedprocedure.GravitinoStoredProcedureFactory;
+
+public class GravitinoSystemConnector435 extends GravitinoSystemConnector {
+
+  public GravitinoSystemConnector435(
+      GravitinoStoredProcedureFactory gravitinoStoredProcedureFactory) {
+    super(gravitinoStoredProcedureFactory);
+  }
+
+  @Override
+  protected ConnectorSplitManager createSplitManager() {
+    return new GravitinoSplitManager435();
+  }
+
+  @Override
+  protected ConnectorPageSourceProvider createPageSourceProvider() {
+    return new DatasourceProvider435();
+  }
+
+  static class DatasourceProvider435 extends DatasourceProvider {
+
+    @Override
+    protected ConnectorPageSource createPageSource(Page page) {
+      return new SystemTablePageSource435(page);
+    }
+  }
+
+  static class GravitinoSplitManager435 extends SplitManager {
+
+    protected ConnectorSplit createSplit(SchemaTableName tableName) {
+      return new Split435(tableName);
+    }
+  }
+
+  static class SystemTablePageSource435 extends SystemTablePageSource {
+
+    public SystemTablePageSource435(Page page) {
+      super(page);
+    }
+
+    public Page getNextPage() {
+      return nextPage();
+    }
+  }
+
+  public static class Split435 extends Split {
+
+    @JsonCreator
+    public Split435(@JsonProperty("tableName") SchemaTableName tableName) {
+      super(tableName);
+    }
+
+    @Override
+    public Object getInfo() {
+      return this;
+    }
+  }
+}
diff --git a/integration-test-common/docker-script/shutdown.sh 
b/trino-connector/trino-connector-435-439/src/main/resources/META-INF/services/io.trino.spi.Plugin
old mode 100755
new mode 100644
similarity index 76%
copy from integration-test-common/docker-script/shutdown.sh
copy to 
trino-connector/trino-connector-435-439/src/main/resources/META-INF/services/io.trino.spi.Plugin
index f2a60d3d9d..aafac3a96c
--- a/integration-test-common/docker-script/shutdown.sh
+++ 
b/trino-connector/trino-connector-435-439/src/main/resources/META-INF/services/io.trino.spi.Plugin
@@ -1,4 +1,3 @@
-#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -16,14 +15,5 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
 #
-cd "$(dirname "$0")"
-
-LOG_DIR=../build/trino-ci-container-log
-if [ -d $LOG_DIR ]; then
-  docker cp trino-ci-hive:/usr/local/hadoop/logs $LOG_DIR/hdfs
-  docker cp trino-ci-hive:/tmp/root $LOG_DIR/hive
-fi
-
-docker compose down
+org.apache.gravitino.trino.connector.GravitinoPlugin435
\ No newline at end of file
diff --git 
a/trino-connector/trino-connector-435-439/src/test/java/TestGravitinoConnector435.java
 
b/trino-connector/trino-connector-435-439/src/test/java/TestGravitinoConnector435.java
new file mode 100644
index 0000000000..eb767c7dda
--- /dev/null
+++ 
b/trino-connector/trino-connector-435-439/src/test/java/TestGravitinoConnector435.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static io.trino.testing.TestingSession.testSessionBuilder;
+
+import io.trino.Session;
+import io.trino.testing.DistributedQueryRunner;
+import org.apache.gravitino.client.GravitinoAdminClient;
+import org.apache.gravitino.trino.connector.GravitinoPlugin;
+import org.apache.gravitino.trino.connector.GravitinoPlugin435;
+import org.apache.gravitino.trino.connector.TestGravitinoConnector;
+import 
org.apache.gravitino.trino.connector.TestGravitinoConnectorWithMetalakeCatalogName;
+import org.junit.jupiter.api.Nested;
+
+public class TestGravitinoConnector435 {
+  @Nested
+  class SingleMetalake extends TestGravitinoConnector {
+    @Override
+    protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient 
client) {
+      return new GravitinoPlugin435(client);
+    }
+
+    @Override
+    protected DistributedQueryRunner createTrinoQueryRunner() throws Exception 
{
+      Session session = testSessionBuilder().setCatalog("gravitino").build();
+      return DistributedQueryRunner.builder(session).setNodeCount(1).build();
+    }
+  }
+
+  @Nested
+  class MultiMetalake extends TestGravitinoConnectorWithMetalakeCatalogName {
+    @Override
+    protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient 
client) {
+      return new GravitinoPlugin435(client);
+    }
+
+    @Override
+    protected DistributedQueryRunner createTrinoQueryRunner() throws Exception 
{
+      Session session = testSessionBuilder().setCatalog("gravitino").build();
+      return DistributedQueryRunner.builder(session).setNodeCount(1).build();
+    }
+  }
+}
diff --git a/trino-connector/trino-connector/build.gradle.kts 
b/trino-connector/trino-connector/build.gradle.kts
index 39c7a078c0..9e734d46c5 100644
--- a/trino-connector/trino-connector/build.gradle.kts
+++ b/trino-connector/trino-connector/build.gradle.kts
@@ -26,9 +26,9 @@ repositories {
   mavenCentral()
 }
 
-val trinoVersionProvider =
-  providers.gradleProperty("trinoVersion").map { it.toInt() }.orElse(435)
-val trinoVersion = trinoVersionProvider.get()
+val minSupportedTrinoVersionProperty = 
providers.gradleProperty("minSupportedTrinoVersion")
+val trinoVersionProperty = 
providers.gradleProperty("trinoVersion").orElse(minSupportedTrinoVersionProperty)
+val trinoVersion = trinoVersionProperty.map { it.trim().toInt() }.get()
 
 dependencies {
   implementation(project(":catalogs:catalog-common"))
diff --git 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java
 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java
index 2f8097f88b..d8f5e0d35b 100644
--- 
a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java
+++ 
b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import io.trino.plugin.memory.MemoryConnector;
+import io.trino.spi.TrinoException;
 import io.trino.spi.connector.ColumnHandle;
 import io.trino.spi.connector.ColumnMetadata;
 import io.trino.spi.connector.ConnectorMetadata;
@@ -632,6 +633,9 @@ public class GravitinoMockServer implements AutoCloseable {
                 ColumnMetadata.class)
             .invoke(metadata, null, tableHandle, columnMetadata);
       } catch (ReflectiveOperationException e) {
+        if (e.getCause() instanceof TrinoException) {
+          throw new RuntimeException(e.getCause().getMessage(), e);
+        }
         throw new RuntimeException("Failed to invoke legacy addColumn by 
reflection", e);
       }
     } else {
@@ -650,6 +654,9 @@ public class GravitinoMockServer implements AutoCloseable {
                 columnPositionClass)
             .invoke(metadata, null, tableHandle, columnMetadata, position);
       } catch (Exception e) {
+        if (e.getCause() instanceof TrinoException) {
+          throw new RuntimeException(e.getCause().getMessage(), e);
+        }
         throw new RuntimeException("Failed to invoke addColumn with 
ColumnPosition", e);
       }
     }

Reply via email to