This is an automated email from the ASF dual-hosted git repository.
yuqi4733 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 acb38a18ad [#10091] feat (trino-connector): Add the version segment
module to support Trino 473-478 (#10188)
acb38a18ad is described below
commit acb38a18ad3747d621eb0ddb273f68d710c9b7de
Author: Yuhui <[email protected]>
AuthorDate: Wed Mar 4 21:05:33 2026 +0800
[#10091] feat (trino-connector): Add the version segment module to support
Trino 473-478 (#10188)
### What changes were proposed in this pull request?
Add the version segment module to support Trino 473-478
### Why are the changes needed?
Fix: #10091
### Does this PR introduce _any_ user-facing change?
No
### How was this patch tested?
UT and IT
Co-authored-by: qbhan <[email protected]>
---
.claude/skills/trino-test/trino-test-guide.md | 7 +
build.gradle.kts | 3 +-
dev/docker/trino/trino-dependency.sh | 4 +-
docs/trino-connector/configuration.md | 2 +-
docs/trino-connector/development.md | 7 +-
docs/trino-connector/installation.md | 1 +
docs/trino-connector/requirements.md | 2 +-
.../docker-script/docker-compose.yaml | 8 +-
.../docker-script/init/trino/config/jvm.config | 19 +-
settings.gradle.kts | 1 +
trino-connector/integration-test/build.gradle.kts | 1 +
.../testsets/hive/00008_decimal.sql | 2 +-
.../jdbc-postgresql/00004_query_pushdown.txt | 8 +-
.../trino-ci-testset/testsets/tpcds/00002.sql | 14 +-
.../trino-ci-testset/testsets/tpcds/00020.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00036.sql | 4 +-
.../trino-ci-testset/testsets/tpcds/00049.sql | 12 +-
.../trino-ci-testset/testsets/tpcds/00059.sql | 14 +-
.../trino-ci-testset/testsets/tpcds/00061.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00066.sql | 24 +-
.../trino-ci-testset/testsets/tpcds/00066.txt | 2 +-
.../trino-ci-testset/testsets/tpcds/00075.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00078.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00089.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00090.sql | 2 +-
.../trino-ci-testset/testsets/tpcds/00098.sql | 2 +-
.../trino-ci-testset/testsets/tpch/00008.sql | 4 +-
.../trino-ci-testset/testsets/trino-469-478.patch | 384 +++++++++++++++++++++
.../trino-connector-473-478/build.gradle.kts | 168 +++++++++
.../trino/connector/GravitinoConnector478.java | 67 ++++
.../connector/GravitinoConnectorFactory478.java | 62 ++++
.../trino/connector/GravitinoMetadata478.java | 127 +++++++
.../GravitinoNodePartitioningProvider478.java | 48 +++
.../trino/connector/GravitinoPlugin478.java | 38 ++
.../trino/connector/GravitinoSplitManager478.java | 61 ++++
.../connector/GravitinoSystemConnector478.java | 83 +++++
.../META-INF/services/io.trino.spi.Plugin | 20 +-
.../trino/connector/TestGravitinoConnector478.java | 58 ++++
38 files changed, 1177 insertions(+), 92 deletions(-)
diff --git a/.claude/skills/trino-test/trino-test-guide.md
b/.claude/skills/trino-test/trino-test-guide.md
index fcbcde0fb7..fa4a08cc38 100644
--- a/.claude/skills/trino-test/trino-test-guide.md
+++ b/.claude/skills/trino-test/trino-test-guide.md
@@ -500,6 +500,13 @@ testsets/
└── tpcds/ # TPC-DS benchmark tests
```
+All test sets are located in the testsets directory. Each test set contains
one or more catalogs to test.
+Each catalog in a test set requires two files for initialization and cleanup:
+- `catalog_xxx_prepare.txt`: Initialization script
+- `catalog_xxx_clean.txt`: Cleanup script
+
+Each test file will be executed against every catalog in the test set.
+
#### Test File Naming Convention
Use 5-digit number prefix for easy sorting and reference:
diff --git a/build.gradle.kts b/build.gradle.kts
index 47aa93942b..e1cbefaa82 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -903,7 +903,7 @@ tasks {
}
val compileTrinoConnector by registering {
- dependsOn("trino-connector:trino-connector-469-472:copyLibs")
+ dependsOn("trino-connector:trino-connector-473-478:copyLibs")
group = "gravitino distribution"
}
@@ -914,6 +914,7 @@ tasks {
":trino-connector:trino-connector-446-451:assembleTrinoConnector",
":trino-connector:trino-connector-452-468:assembleTrinoConnector",
":trino-connector:trino-connector-469-472:assembleTrinoConnector",
+ ":trino-connector:trino-connector-473-478:assembleTrinoConnector",
"assembleIcebergRESTServer",
"assembleLanceRESTServer"
)
diff --git a/dev/docker/trino/trino-dependency.sh
b/dev/docker/trino/trino-dependency.sh
index 09b89e89e8..49689a01eb 100755
--- a/dev/docker/trino/trino-dependency.sh
+++ b/dev/docker/trino/trino-dependency.sh
@@ -28,8 +28,8 @@ rm -rf "${trino_dir}/packages"
mkdir -p "${trino_dir}/packages"
cd ${gravitino_home}
-${gravitino_home}/gradlew
:trino-connector:trino-connector-469-472:assembleTrinoConnector -x test
-cp -r "${gravitino_home}/distribution/gravitino-trino-connector-469-472"
"${trino_dir}/packages/gravitino-trino-connector"
+${gravitino_home}/gradlew
:trino-connector:trino-connector-473-478:assembleTrinoConnector -x test
+cp -r "${gravitino_home}/distribution/gravitino-trino-connector-473-478"
"${trino_dir}/packages/gravitino-trino-connector"
MYSQL_VERSION="8.0.27"
PG_VERSION="42.7.0"
diff --git a/docs/trino-connector/configuration.md
b/docs/trino-connector/configuration.md
index 2e300eee85..4adeb28360 100644
--- a/docs/trino-connector/configuration.md
+++ b/docs/trino-connector/configuration.md
@@ -13,7 +13,7 @@ license: "This software is licensed under the Apache License
version 2."
| trino.jdbc.user | string | admin
| The jdbc user name of current Trino.
| NO
| 0.5.1 |
| trino.jdbc.password | string | (none)
| The jdbc password of current Trino.
| NO
| 0.5.1 |
| gravitino.metadata.refresh-interval-seconds | integer | 10
| The `gravitino.metadata.refresh-interval-seconds` defines the interval in
seconds to refresh metadata from Gravitino server, the default value is 10
seconds.
| No | 0.9.0 |
-| gravitino.trino.skip-version-validation | boolean | false
| The `gravitino.trino.skip-version-validation` defines whether to skip Trino
version validation. Gravitino supports Trino versions between 435 and 462. If
this option is `true`, unsupported Trino versions can still be used, but
compatibility is not guaranteed.
| No | 1.0.0 |
+| gravitino.trino.skip-version-validation | boolean | false
| The `gravitino.trino.skip-version-validation` defines whether to skip Trino
version validation. Gravitino supports Trino versions between 435 and 478. If
this option is `true`, unsupported Trino versions can still be used, but
compatibility is not guaranteed.
| No | 1.0.0 |
| gravitino.client. | string | (none)
| The configuration key prefix for the Gravitino client config.
| No
| 1.0.0 |
| gravitino.trino.skip-catalog-patterns | string | (none)
| The `gravitino.trino.skip-catalog-patterns` defines a comma-separated list
of catalog name regex patterns that should be excluded from loading. For
example, `test_.*, .*_tmp` excludes all catalogs starting with `test_` or
ending with `_tmp`.
| No | 1.2.0 |
diff --git a/docs/trino-connector/development.md
b/docs/trino-connector/development.md
index b507999747..f9464f8bbb 100644
--- a/docs/trino-connector/development.md
+++ b/docs/trino-connector/development.md
@@ -25,6 +25,8 @@ trino-connector/
│ └── src/main/java/
├── trino-connector-469-472/ # Version-specific adapters for Trino 469-472
│ └── src/main/java/
+├── trino-connector-473-478/ # Version-specific adapters for Trino 473-478
+│ └── src/main/java/
└── integration-test/ # Integration tests
```
@@ -65,13 +67,14 @@ Change `localhost`, `port`, and the names of metalake and
catalogs to match your
4. Identify which version-segment module matches your Trino version:
- | Trino Version | Version-Segment Module |
- |---------------|------------------------|
+ | Trino Version | Version-Segment Module |
+ |---------------|---------------------------|
| 435-439 | `trino-connector-435-439` |
| 440-445 | `trino-connector-440-445` |
| 446-451 | `trino-connector-446-451` |
| 452-468 | `trino-connector-452-468` |
| 469-472 | `trino-connector-469-472` |
+ | 473-478 | `trino-connector-473-478` |
5. Add `<module>plugin/trino-gravitino</module>` to `trino/pom.xml` and create
the `pom.xml` for the `trino-gravitino` module. The example below uses Trino
`469`. Ensure the `trino-root` version matches the Trino version you are
developing against.
diff --git a/docs/trino-connector/installation.md
b/docs/trino-connector/installation.md
index cfd7077663..25c22bcf6d 100644
--- a/docs/trino-connector/installation.md
+++ b/docs/trino-connector/installation.md
@@ -22,6 +22,7 @@ You need to choose the package by your Trino server version
first.
| 446-451 | `trino-connector-446-451` |
| 452-468 | `trino-connector-452-468` |
| 469-472 | `trino-connector-469-472` |
+| 473-478 | `trino-connector-473-478` |
For Trino `469`, choose the `trino-connector-469-472` package.
diff --git a/docs/trino-connector/requirements.md
b/docs/trino-connector/requirements.md
index 21a3d12997..67bd57550a 100644
--- a/docs/trino-connector/requirements.md
+++ b/docs/trino-connector/requirements.md
@@ -7,7 +7,7 @@ license: "This software is licensed under the Apache License
version 2."
To install and deploy the Apache Gravitino Trino connector, The following
environmental setup is necessary:
-- Trino server version should be between Trino-server-435 and Trino-server-472.
+- Trino server version should be between Trino-server-435 and Trino-server-478.
The examples in this document use Trino `469` by default.
- If you use an unsupported Trino version, you can set
`gravitino.trino.skip-version-validation` to `true`.
Unsupported versions have not undergone thorough testing.
diff --git a/integration-test-common/docker-script/docker-compose.yaml
b/integration-test-common/docker-script/docker-compose.yaml
index ddbf976a2e..3ed57d07ca 100644
--- a/integration-test-common/docker-script/docker-compose.yaml
+++ b/integration-test-common/docker-script/docker-compose.yaml
@@ -79,7 +79,7 @@ services:
retries: 5
trino:
- image: trinodb/trino:${TRINO_VERSION:-469}
+ image: trinodb/trino:${TRINO_VERSION:-478}
networks:
- trino-net
container_name: trino-ci-trino
@@ -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-469-472/build/libs}:/usr/lib/trino/plugin/gravitino
+ -
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-473-478/build/libs}:/usr/lib/trino/plugin/gravitino
extra_hosts:
- "host.docker.internal:host-gateway"
healthcheck:
@@ -113,7 +113,7 @@ services:
condition: service_healthy
trino-worker:
- image: trinodb/trino:${TRINO_VERSION:-469}
+ image: trinodb/trino:${TRINO_VERSION:-478}
networks:
- trino-net
deploy:
@@ -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-469-472/build/libs}:/usr/lib/trino/plugin/gravitino
+ -
${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-473-478/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/config/jvm.config
b/integration-test-common/docker-script/init/trino/config/jvm.config
index 93f196e0af..77a930a367 100644
--- a/integration-test-common/docker-script/init/trino/config/jvm.config
+++ b/integration-test-common/docker-script/init/trino/config/jvm.config
@@ -16,22 +16,15 @@
# specific language governing permissions and limitations
# under the License.
#
+-server
-XX:InitialRAMPercentage=30
-XX:MaxRAMPercentage=60
+-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
+-XX:MaxGCPauseMillis=500
+
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
--XX:+ExitOnOutOfMemoryError
--XX:-OmitStackTraceInFastThrow
--XX:ReservedCodeCacheSize=256M
--XX:PerMethodRecompilationCutoff=10000
--XX:PerBytecodeRecompilationCutoff=10000
--Djdk.attach.allowAttachSelf=true
--Djdk.nio.maxCachedBufferSize=2000000
-# Reduce starvation of threads by GClocker, recommend to set about the number
of cpu cores (JDK-8192647)
--XX:+UnlockDiagnosticVMOptions
--XX:GCLockerRetryAllocationCount=32
-# Required for Trino 452+ due to JDK-8329528
--XX:G1NumCollectionsKeepPinned=10000000
+
-DHADOOP_USER_NAME=hive
--Dlog4j.configurationFile=/etc/trino/log4j2.properties
\ No newline at end of file
+-Dlog4j.configurationFile=/etc/trino/log4j2.properties
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 5b737ca14f..1529343c61 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -75,6 +75,7 @@ include(
"trino-connector:trino-connector-446-451",
"trino-connector:trino-connector-452-468",
"trino-connector:trino-connector-469-472",
+ "trino-connector:trino-connector-473-478",
"trino-connector:integration-test"
)
include("spark-connector:spark-common")
diff --git a/trino-connector/integration-test/build.gradle.kts
b/trino-connector/integration-test/build.gradle.kts
index 7ec53676fd..bb15ef356e 100644
--- a/trino-connector/integration-test/build.gradle.kts
+++ b/trino-connector/integration-test/build.gradle.kts
@@ -76,6 +76,7 @@ tasks.register("setupDependencies") {
dependsOn(":trino-connector:trino-connector-446-451:copyLibs")
dependsOn(":trino-connector:trino-connector-452-468:copyLibs")
dependsOn(":trino-connector:trino-connector-469-472:copyLibs")
+ dependsOn(":trino-connector:trino-connector-473-478:copyLibs")
dependsOn(":catalogs:catalog-lakehouse-iceberg:jar",
":catalogs:catalog-lakehouse-iceberg:runtimeJars")
dependsOn(":catalogs:catalog-jdbc-mysql:jar",
":catalogs:catalog-jdbc-mysql:runtimeJars")
dependsOn(":catalogs:catalog-jdbc-postgresql:jar",
":catalogs:catalog-jdbc-postgresql:runtimeJars")
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
index 4d3fcb5d24..46cf682b15 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
@@ -26,7 +26,7 @@ SELECT val1 + val2 FROM tb03;
SELECT val1 * val2 FROM tb03;
-SELECT val1 / val2 FROM tb03;
+SELECT CAST(val1 / val2 AS DECIMAL(38, 2)) FROM tb03;
CREATE TABLE tb04 (max_min_val DECIMAL(18, 4));
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
index c4f271adde..156b5136f0 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
@@ -12,26 +12,26 @@ INSERT: 15000 rows
"Trino version: %
%
- %TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db1.customer limit=10 columns=[custkey:bigint:int8]]
+ └─ TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
%gt_db1.customer limit=10 columns=[custkey:bigint:int8]]
Layout: [custkey:bigint]
%
"
"Trino version: %
%
- %TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db1.customer%constraints=%phone%LIKE%]
+ └─ TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
%gt_db1.customer%constraints=%phone%LIKE%]
%
"
"Trino version: %
%
- %TableScan[table = gt_postgresql:gt_db1.orders->Query[SELECT
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM
""gt_db1"".""orders""]%columns=[_pfgnrtd_0:decimal(38,2):decimal]]
+ └─ TableScan[table = gt_postgresql:gt_db1.orders->Query[SELECT
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM
%""gt_db1"".""orders""]%columns=[_pfgnrtd_0:decimal(38,2):decimal]]
%
"
"Trino version: %
%
- %TableScan[table = gt_postgresql:gt_db1.%->Query[SELECT ""orderdate"",
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM ""gt_db1"".""orders"" GROUP BY
""orderdate""]%sortOrder=[orderdate:date:date ASC NULLS
LAST]%limit=10%columns=[orderdate:date:date, _pfgnrtd_0:decimal(38,2):decimal]]
+ └─ TableScan[table = gt_postgresql:gt_db1.%->Query[SELECT ""orderdate"",
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM %""gt_db1"".""orders"" GROUP BY
""orderdate""]%sortOrder=[orderdate:date:date ASC NULLS
LAST]%limit=10%columns=[orderdate:date:date, _pfgnrtd_0:decimal(38,2):decimal]]
%
"
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
index 0e797b6395..7ed8fbf184 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
@@ -36,13 +36,13 @@ UNION ALL (
)
SELECT
"d_week_seq1"
-, "round"(("sun_sales1" / "sun_sales2"), 2)
-, "round"(("mon_sales1" / "mon_sales2"), 2)
-, "round"(("tue_sales1" / "tue_sales2"), 2)
-, "round"(("wed_sales1" / "wed_sales2"), 2)
-, "round"(("thu_sales1" / "thu_sales2"), 2)
-, "round"(("fri_sales1" / "fri_sales2"), 2)
-, "round"(("sat_sales1" / "sat_sales2"), 2)
+, CAST(("sun_sales1" / "sun_sales2") as DECIMAL(38,2))
+, CAST(("mon_sales1" / "mon_sales2") as DECIMAL(38,2))
+, CAST(("tue_sales1" / "tue_sales2") as DECIMAL(38,2))
+, CAST(("wed_sales1" / "wed_sales2") as DECIMAL(38,2))
+, CAST(("thu_sales1" / "thu_sales2") as DECIMAL(38,2))
+, CAST(("fri_sales1" / "fri_sales2") as DECIMAL(38,2))
+, CAST(("sat_sales1" / "sat_sales2") as DECIMAL(38,2))
FROM
(
SELECT
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
index 7f28d3700a..e64089005f 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
@@ -5,7 +5,7 @@ SELECT
, "i_class"
, "i_current_price"
, "sum"("cs_ext_sales_price") "itemrevenue"
-, (("sum"("cs_ext_sales_price") * 100) / "sum"("sum"("cs_ext_sales_price"))
OVER (PARTITION BY "i_class")) "revenueratio"
+, CAST((("sum"("cs_ext_sales_price") * 100) /
"sum"("sum"("cs_ext_sales_price")) OVER (PARTITION BY "i_class")) AS
DECIMAL(38,2)) "revenueratio"
FROM
catalog_sales
, item
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
index bb2b27e58c..77611c6372 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
@@ -1,9 +1,9 @@
SELECT
- ("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) "gross_margin"
+ CAST("sum"("ss_net_profit") / "sum"("ss_ext_sales_price") AS DECIMAL(38,2))
"gross_margin"
, "i_category"
, "i_class"
, (GROUPING ("i_category") + GROUPING ("i_class")) "lochierarchy"
-, "rank"() OVER (PARTITION BY (GROUPING ("i_category") + GROUPING
("i_class")), (CASE WHEN (GROUPING ("i_class") = 0) THEN "i_category" END)
ORDER BY ("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) ASC)
"rank_within_parent"
+, "rank"() OVER (PARTITION BY (GROUPING ("i_category") + GROUPING
("i_class")), (CASE WHEN (GROUPING ("i_class") = 0) THEN "i_category" END)
ORDER BY CAST(("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) AS
DECIMAL(38, 2)) ASC) "rank_within_parent"
FROM
store_sales
, date_dim d1
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
index c65d1a14a5..a50bd4083d 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
@@ -16,8 +16,8 @@ FROM
(
SELECT
"ws"."ws_item_sk" "item"
- , (CAST("sum"(COALESCE("wr"."wr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("ws"."ws_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
- , (CAST("sum"(COALESCE("wr"."wr_return_amt", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("ws"."ws_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ , (CAST(CAST("sum"(COALESCE("wr"."wr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("ws"."ws_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+ , (CAST(CAST("sum"(COALESCE("wr"."wr_return_amt", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("ws"."ws_net_paid", 0)) AS DECIMAL(15,4)) AS
DECIMAL(15,4))) "currency_ratio"
FROM
(web_sales ws
LEFT JOIN web_returns wr ON ("ws"."ws_order_number" =
"wr"."wr_order_number")
@@ -53,8 +53,8 @@ FROM
(
SELECT
"cs"."cs_item_sk" "item"
- , (CAST("sum"(COALESCE("cr"."cr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("cs"."cs_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
- , (CAST("sum"(COALESCE("cr"."cr_return_amount", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("cs"."cs_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ , (CAST(CAST("sum"(COALESCE("cr"."cr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("cs"."cs_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+ , (CAST(CAST("sum"(COALESCE("cr"."cr_return_amount", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("cs"."cs_net_paid", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "currency_ratio"
FROM
(catalog_sales cs
LEFT JOIN catalog_returns cr ON ("cs"."cs_order_number" =
"cr"."cr_order_number")
@@ -90,8 +90,8 @@ FROM
(
SELECT
"sts"."ss_item_sk" "item"
- , (CAST("sum"(COALESCE("sr"."sr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("sts"."ss_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
- , (CAST("sum"(COALESCE("sr"."sr_return_amt", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("sts"."ss_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ , (CAST(CAST("sum"(COALESCE("sr"."sr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("sts"."ss_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+ , (CAST(CAST("sum"(COALESCE("sr"."sr_return_amt", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("sts"."ss_net_paid", 0)) AS DECIMAL(15,4)) AS
DECIMAL(15,4))) "currency_ratio"
FROM
(store_sales sts
LEFT JOIN store_returns sr ON ("sts"."ss_ticket_number" =
"sr"."sr_ticket_number")
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
index 9114f353d6..ac2baa60c0 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
@@ -20,13 +20,13 @@ SELECT
"s_store_name1"
, "s_store_id1"
, "d_week_seq1"
-, ("sun_sales1" / "sun_sales2")
-, ("mon_sales1" / "mon_sales2")
-, ("tue_sales1" / "tue_sales2")
-, ("wed_sales1" / "wed_sales2")
-, ("thu_sales1" / "thu_sales2")
-, ("fri_sales1" / "fri_sales2")
-, ("sat_sales1" / "sat_sales2")
+, CAST(("sun_sales1" / "sun_sales2") AS DECIMAL(38,2))
+, CAST(("mon_sales1" / "mon_sales2") AS DECIMAL(38,2))
+, CAST(("tue_sales1" / "tue_sales2") AS DECIMAL(38,2))
+, CAST(("wed_sales1" / "wed_sales2") AS DECIMAL(38,2))
+, CAST(("thu_sales1" / "thu_sales2") AS DECIMAL(38,2))
+, CAST(("fri_sales1" / "fri_sales2") AS DECIMAL(38,2))
+, CAST(("sat_sales1" / "sat_sales2") AS DECIMAL(38,2))
FROM
(
SELECT
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
index 17cd193386..e23b0574fd 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
@@ -1,7 +1,7 @@
SELECT
"promotions"
, "total"
-, ((CAST("promotions" AS DECIMAL(15,4)) / CAST("total" AS DECIMAL(15,4))) *
100)
+, (CAST((CAST("promotions" AS DECIMAL(15,4)) / CAST("total" AS DECIMAL(15,4)))
AS DECIMAL(15,4)) * 100)
FROM
(
SELECT "sum"("ss_ext_sales_price") "promotions"
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
index 50a1633296..02befa7408 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
@@ -19,18 +19,18 @@ SELECT
, "sum"("oct_sales") "oct_sales"
, "sum"("nov_sales") "nov_sales"
, "sum"("dec_sales") "dec_sales"
-, "sum"(("jan_sales" / "w_warehouse_sq_ft")) "jan_sales_per_sq_foot"
-, "sum"(("feb_sales" / "w_warehouse_sq_ft")) "feb_sales_per_sq_foot"
-, "sum"(("mar_sales" / "w_warehouse_sq_ft")) "mar_sales_per_sq_foot"
-, "sum"(("apr_sales" / "w_warehouse_sq_ft")) "apr_sales_per_sq_foot"
-, "sum"(("may_sales" / "w_warehouse_sq_ft")) "may_sales_per_sq_foot"
-, "sum"(("jun_sales" / "w_warehouse_sq_ft")) "jun_sales_per_sq_foot"
-, "sum"(("jul_sales" / "w_warehouse_sq_ft")) "jul_sales_per_sq_foot"
-, "sum"(("aug_sales" / "w_warehouse_sq_ft")) "aug_sales_per_sq_foot"
-, "sum"(("sep_sales" / "w_warehouse_sq_ft")) "sep_sales_per_sq_foot"
-, "sum"(("oct_sales" / "w_warehouse_sq_ft")) "oct_sales_per_sq_foot"
-, "sum"(("nov_sales" / "w_warehouse_sq_ft")) "nov_sales_per_sq_foot"
-, "sum"(("dec_sales" / "w_warehouse_sq_ft")) "dec_sales_per_sq_foot"
+, CAST("sum"(("jan_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jan_sales_per_sq_foot"
+, CAST("sum"(("feb_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"feb_sales_per_sq_foot"
+, CAST("sum"(("mar_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"mar_sales_per_sq_foot"
+, CAST("sum"(("apr_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"apr_sales_per_sq_foot"
+, CAST("sum"(("may_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"may_sales_per_sq_foot"
+, CAST("sum"(("jun_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jun_sales_per_sq_foot"
+, CAST("sum"(("jul_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jul_sales_per_sq_foot"
+, CAST("sum"(("aug_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"aug_sales_per_sq_foot"
+, CAST("sum"(("sep_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"sep_sales_per_sq_foot"
+, CAST("sum"(("oct_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"oct_sales_per_sq_foot"
+, CAST("sum"(("nov_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"nov_sales_per_sq_foot"
+, CAST("sum"(("dec_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"dec_sales_per_sq_foot"
, "sum"("jan_net") "jan_net"
, "sum"("feb_net") "feb_net"
, "sum"("mar_net") "mar_net"
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
index 813eb8a073..fd045292ef 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
@@ -1 +1 @@
-"Conventional childr","977787","Midway","Williamson County","TN","United
States","DHL,BARIAN","2001","661407.18","766942.78","307720.05","333390.59","1904937.34","2308974.68","1310866.26","2298210.15","1497771.61","2900278.47","5213564.64","2706805.34","0.68","0.78","0.32","0.35","1.94","2.36","1.34","2.35","1.53","2.97","5.33","2.77","7554063.29","8213766.03","7574329.97","4142886.32","3575413.31","4126236.48","5015953.55","9665997.01","10823343.90","13418884.62","23331407.18","19502364.49"
\ No newline at end of file
+"Conventional childr","977787","Midway","Williamson County","TN","United
States","DHL,BARIAN","2001","661407.18","766942.78","307720.05","333390.59","1904937.34","2308974.68","1310866.26","2298210.15","1497771.61","2900278.47","5213564.64","2706805.34","0.68","0.78","0.31","0.34","1.95","2.36","1.34","2.35","1.53","2.97","5.33","2.77","7554063.29","8213766.03","7574329.97","4142886.32","3575413.31","4126236.48","5015953.55","9665997.01","10823343.90","13418884.62","23331407.18","19502364.49"
\ No newline at end of file
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
index 33017f9fd9..abc085c9ee 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
@@ -78,7 +78,7 @@ WHERE ("curr_yr"."i_brand_id" = "prev_yr"."i_brand_id")
AND ("curr_yr"."i_manufact_id" = "prev_yr"."i_manufact_id")
AND ("curr_yr"."d_year" = 2002)
AND ("prev_yr"."d_year" = (2002 - 1))
- AND ((CAST("curr_yr"."sales_cnt" AS DECIMAL(17,2)) /
CAST("prev_yr"."sales_cnt" AS DECIMAL(17,2))) < DECIMAL '0.9')
+ AND ((CAST((CAST("curr_yr"."sales_cnt" AS DECIMAL(17,2)) /
CAST("prev_yr"."sales_cnt" AS DECIMAL(17,2))) AS DECIMAL(17,2))) < DECIMAL
'0.9')
ORDER BY "sales_cnt_diff" ASC, "sales_amt_diff" ASC
LIMIT 100
;
\ No newline at end of file
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
index c3fdb2a265..0c455627be 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
@@ -51,7 +51,7 @@ SELECT
"ss_sold_year"
, "ss_item_sk"
, "ss_customer_sk"
-, "round"((CAST("ss_qty" AS DECIMAL(10,2)) / COALESCE(("ws_qty" + "cs_qty"),
1)), 2) "ratio"
+, CAST((CAST("ss_qty" AS DECIMAL(10,2)) / COALESCE(("ws_qty" + "cs_qty"), 1))
AS DECIMAL(38, 2)) "ratio"
, "ss_qty" "store_qty"
, "ss_wc" "store_wholesale_cost"
, "ss_sp" "store_sales_price"
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
index 934b8cdf03..bbc16a21bf 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
@@ -25,7 +25,7 @@ FROM
AND ("i_class" IN ('shirts' , 'birdal' ,
'dresses'))))
GROUP BY "i_category", "i_class", "i_brand", "s_store_name",
"s_company_name", "d_moy"
) tmp1
-WHERE ((CASE WHEN ("avg_monthly_sales" <> 0) THEN ("abs"(("sum_sales" -
"avg_monthly_sales")) / "avg_monthly_sales") ELSE null END) > DECIMAL '0.1')
+WHERE ((CASE WHEN ("avg_monthly_sales" <> 0) THEN CAST(("abs"(("sum_sales" -
"avg_monthly_sales")) / "avg_monthly_sales") AS DECIMAL(38,2)) ELSE null END) >
DECIMAL '0.1')
ORDER BY ("sum_sales" - "avg_monthly_sales") ASC, "s_store_name" ASC
LIMIT 100
;
\ No newline at end of file
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
index 106349bf33..edcb1d548f 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
@@ -1,4 +1,4 @@
-SELECT (CAST("amc" AS DECIMAL(15,4)) / CAST("pmc" + 0.001 AS DECIMAL(15,4)))
"am_pm_ratio"
+SELECT CAST((CAST("amc" AS DECIMAL(15,4)) / CAST("pmc" + 0.001 AS
DECIMAL(15,4))) AS DECIMAL(15,4)) "am_pm_ratio"
FROM
(
SELECT "count"(*) "amc"
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
index 72ddd155e9..10e47d07ec 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
@@ -5,7 +5,7 @@ SELECT
, "i_class"
, "i_current_price"
, "sum"("ss_ext_sales_price") "itemrevenue"
-, (("sum"("ss_ext_sales_price") * 100) / "sum"("sum"("ss_ext_sales_price"))
OVER (PARTITION BY "i_class")) "revenueratio"
+, CAST((("sum"("ss_ext_sales_price") * 100) /
"sum"("sum"("ss_ext_sales_price")) OVER (PARTITION BY "i_class")) AS
DECIMAL(38, 2)) "revenueratio"
FROM
store_sales
, item
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
index ea3b1fa724..02f52dc5fb 100644
---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
@@ -1,10 +1,10 @@
SELECT
o_year,
- sum(CASE
+ CAST(sum(CASE
WHEN nation = 'BRAZIL'
THEN volume
ELSE 0
- END) / sum(volume) AS mkt_share
+ END) / sum(volume) AS DECIMAL(38, 4)) AS mkt_share
FROM (
SELECT
extract(YEAR FROM o.orderdate) AS o_year,
diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-469-478.patch
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-469-478.patch
new file mode 100644
index 0000000000..9a55b49b87
--- /dev/null
+++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-469-478.patch
@@ -0,0 +1,384 @@
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/catalog_hive_prepare.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/catalog_hive_prepare.sql
+index 67ea924ba..b392ae230 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/catalog_hive_prepare.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/catalog_hive_prepare.sql
+@@ -2,7 +2,7 @@ call gravitino.system.create_catalog(
+ 'gt_hive',
+ 'hive',
+ map(
+- array['metastore.uris', 'trino.bypass.fs.hadoop.enabled'],
+- array['${hive_uri}', 'true']
++ array['metastore.uris'],
++ array['${hive_uri}']
+ )
+ );
+\ No newline at end of file
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
+index edd8257ad..c4f271add 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-postgresql/00004_query_pushdown.txt
+@@ -12,26 +12,26 @@ INSERT: 15000 rows
+
+ "Trino version: %
+ %
+- └─ TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db.gt_db1.customer limit=10 columns=[custkey:bigint:int8]]
++ %TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db1.customer limit=10 columns=[custkey:bigint:int8]]
+ Layout: [custkey:bigint]
+ %
+ "
+
+ "Trino version: %
+ %
+- └─ TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db.gt_db1.customer%constraints=%phone%LIKE%]
++ %TableScan[table = gt_postgresql:gt_db1.customer->gt_db1.customer
gt_db1.customer%constraints=%phone%LIKE%]
+ %
+ "
+
+ "Trino version: %
+ %
+- └─ TableScan[table = gt_postgresql:gt_db1.orders->Query[SELECT
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM
""gt_db"".""gt_db1"".""orders""]%columns=[_pfgnrtd_0:decimal(38,2):decimal]]
++ %TableScan[table = gt_postgresql:gt_db1.orders->Query[SELECT
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM
""gt_db1"".""orders""]%columns=[_pfgnrtd_0:decimal(38,2):decimal]]
+ %
+ "
+
+ "Trino version: %
+ %
+- └─ TableScan[table = gt_postgresql:gt_db1.%->Query[SELECT ""orderdate"",
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM ""gt_db"".""gt_db1"".""orders""
GROUP BY ""orderdate""]%sortOrder=[orderdate:date:date ASC NULLS
LAST]%limit=10%columns=[orderdate:date:date, _pfgnrtd_0:decimal(38,2):decimal]]
++ %TableScan[table = gt_postgresql:gt_db1.%->Query[SELECT ""orderdate"",
sum(""totalprice"") AS ""_pfgnrtd_0"" FROM ""gt_db1"".""orders"" GROUP BY
""orderdate""]%sortOrder=[orderdate:date:date ASC NULLS
LAST]%limit=10%columns=[orderdate:date:date, _pfgnrtd_0:decimal(38,2):decimal]]
+ %
+ "
+
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/lakehouse-iceberg/catalog_iceberg_prepare.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/lakehouse-iceberg/catalog_iceberg_prepare.sql
+index e310c051d..46ad6a38c 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/lakehouse-iceberg/catalog_iceberg_prepare.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/lakehouse-iceberg/catalog_iceberg_prepare.sql
+@@ -2,8 +2,8 @@ call gravitino.system.create_catalog(
+ 'gt_iceberg',
+ 'lakehouse-iceberg',
+ map(
+- array['uri', 'catalog-backend', 'warehouse',
'trino.bypass.fs.hadoop.enabled'],
+- array['${hive_uri}', 'hive',
'${hdfs_uri}/user/iceberg/warehouse/TrinoQueryIT', 'true']
++ array['uri', 'catalog-backend', 'warehouse'],
++ array['${hive_uri}', 'hive',
'${hdfs_uri}/user/iceberg/warehouse/TrinoQueryIT']
+ )
+ );
+
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
+index 7ed8fbf18..0e797b639 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00002.sql
+@@ -36,13 +36,13 @@ UNION ALL (
+ )
+ SELECT
+ "d_week_seq1"
+-, CAST(("sun_sales1" / "sun_sales2") as DECIMAL(38,2))
+-, CAST(("mon_sales1" / "mon_sales2") as DECIMAL(38,2))
+-, CAST(("tue_sales1" / "tue_sales2") as DECIMAL(38,2))
+-, CAST(("wed_sales1" / "wed_sales2") as DECIMAL(38,2))
+-, CAST(("thu_sales1" / "thu_sales2") as DECIMAL(38,2))
+-, CAST(("fri_sales1" / "fri_sales2") as DECIMAL(38,2))
+-, CAST(("sat_sales1" / "sat_sales2") as DECIMAL(38,2))
++, "round"(("sun_sales1" / "sun_sales2"), 2)
++, "round"(("mon_sales1" / "mon_sales2"), 2)
++, "round"(("tue_sales1" / "tue_sales2"), 2)
++, "round"(("wed_sales1" / "wed_sales2"), 2)
++, "round"(("thu_sales1" / "thu_sales2"), 2)
++, "round"(("fri_sales1" / "fri_sales2"), 2)
++, "round"(("sat_sales1" / "sat_sales2"), 2)
+ FROM
+ (
+ SELECT
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
+index e64089005..7f28d3700 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00020.sql
+@@ -5,7 +5,7 @@ SELECT
+ , "i_class"
+ , "i_current_price"
+ , "sum"("cs_ext_sales_price") "itemrevenue"
+-, CAST((("sum"("cs_ext_sales_price") * 100) /
"sum"("sum"("cs_ext_sales_price")) OVER (PARTITION BY "i_class")) AS
DECIMAL(38,2)) "revenueratio"
++, (("sum"("cs_ext_sales_price") * 100) / "sum"("sum"("cs_ext_sales_price"))
OVER (PARTITION BY "i_class")) "revenueratio"
+ FROM
+ catalog_sales
+ , item
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
+index 77611c637..bb2b27e58 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00036.sql
+@@ -1,9 +1,9 @@
+ SELECT
+- CAST("sum"("ss_net_profit") / "sum"("ss_ext_sales_price") AS DECIMAL(38,2))
"gross_margin"
++ ("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) "gross_margin"
+ , "i_category"
+ , "i_class"
+ , (GROUPING ("i_category") + GROUPING ("i_class")) "lochierarchy"
+-, "rank"() OVER (PARTITION BY (GROUPING ("i_category") + GROUPING
("i_class")), (CASE WHEN (GROUPING ("i_class") = 0) THEN "i_category" END)
ORDER BY CAST(("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) AS
DECIMAL(38, 2)) ASC) "rank_within_parent"
++, "rank"() OVER (PARTITION BY (GROUPING ("i_category") + GROUPING
("i_class")), (CASE WHEN (GROUPING ("i_class") = 0) THEN "i_category" END)
ORDER BY ("sum"("ss_net_profit") / "sum"("ss_ext_sales_price")) ASC)
"rank_within_parent"
+ FROM
+ store_sales
+ , date_dim d1
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
+index a50bd4083..c65d1a14a 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00049.sql
+@@ -16,8 +16,8 @@ FROM
+ (
+ SELECT
+ "ws"."ws_item_sk" "item"
+- , (CAST(CAST("sum"(COALESCE("wr"."wr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("ws"."ws_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+- , (CAST(CAST("sum"(COALESCE("wr"."wr_return_amt", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("ws"."ws_net_paid", 0)) AS DECIMAL(15,4)) AS
DECIMAL(15,4))) "currency_ratio"
++ , (CAST("sum"(COALESCE("wr"."wr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("ws"."ws_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
++ , (CAST("sum"(COALESCE("wr"."wr_return_amt", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("ws"."ws_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ FROM
+ (web_sales ws
+ LEFT JOIN web_returns wr ON ("ws"."ws_order_number" =
"wr"."wr_order_number")
+@@ -53,8 +53,8 @@ FROM
+ (
+ SELECT
+ "cs"."cs_item_sk" "item"
+- , (CAST(CAST("sum"(COALESCE("cr"."cr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("cs"."cs_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+- , (CAST(CAST("sum"(COALESCE("cr"."cr_return_amount", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("cs"."cs_net_paid", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "currency_ratio"
++ , (CAST("sum"(COALESCE("cr"."cr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("cs"."cs_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
++ , (CAST("sum"(COALESCE("cr"."cr_return_amount", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("cs"."cs_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ FROM
+ (catalog_sales cs
+ LEFT JOIN catalog_returns cr ON ("cs"."cs_order_number" =
"cr"."cr_order_number")
+@@ -90,8 +90,8 @@ FROM
+ (
+ SELECT
+ "sts"."ss_item_sk" "item"
+- , (CAST(CAST("sum"(COALESCE("sr"."sr_return_quantity", 0)) AS
DECIMAL(15,4)) / CAST("sum"(COALESCE("sts"."ss_quantity", 0)) AS DECIMAL(15,4))
AS DECIMAL(15,4))) "return_ratio"
+- , (CAST(CAST("sum"(COALESCE("sr"."sr_return_amt", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("sts"."ss_net_paid", 0)) AS DECIMAL(15,4)) AS
DECIMAL(15,4))) "currency_ratio"
++ , (CAST("sum"(COALESCE("sr"."sr_return_quantity", 0)) AS DECIMAL(15,4))
/ CAST("sum"(COALESCE("sts"."ss_quantity", 0)) AS DECIMAL(15,4))) "return_ratio"
++ , (CAST("sum"(COALESCE("sr"."sr_return_amt", 0)) AS DECIMAL(15,4)) /
CAST("sum"(COALESCE("sts"."ss_net_paid", 0)) AS DECIMAL(15,4))) "currency_ratio"
+ FROM
+ (store_sales sts
+ LEFT JOIN store_returns sr ON ("sts"."ss_ticket_number" =
"sr"."sr_ticket_number")
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
+index ac2baa60c..9114f353d 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00059.sql
+@@ -20,13 +20,13 @@ SELECT
+ "s_store_name1"
+ , "s_store_id1"
+ , "d_week_seq1"
+-, CAST(("sun_sales1" / "sun_sales2") AS DECIMAL(38,2))
+-, CAST(("mon_sales1" / "mon_sales2") AS DECIMAL(38,2))
+-, CAST(("tue_sales1" / "tue_sales2") AS DECIMAL(38,2))
+-, CAST(("wed_sales1" / "wed_sales2") AS DECIMAL(38,2))
+-, CAST(("thu_sales1" / "thu_sales2") AS DECIMAL(38,2))
+-, CAST(("fri_sales1" / "fri_sales2") AS DECIMAL(38,2))
+-, CAST(("sat_sales1" / "sat_sales2") AS DECIMAL(38,2))
++, ("sun_sales1" / "sun_sales2")
++, ("mon_sales1" / "mon_sales2")
++, ("tue_sales1" / "tue_sales2")
++, ("wed_sales1" / "wed_sales2")
++, ("thu_sales1" / "thu_sales2")
++, ("fri_sales1" / "fri_sales2")
++, ("sat_sales1" / "sat_sales2")
+ FROM
+ (
+ SELECT
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
+index e23b0574f..17cd19338 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00061.sql
+@@ -1,7 +1,7 @@
+ SELECT
+ "promotions"
+ , "total"
+-, (CAST((CAST("promotions" AS DECIMAL(15,4)) / CAST("total" AS
DECIMAL(15,4))) AS DECIMAL(15,4)) * 100)
++, ((CAST("promotions" AS DECIMAL(15,4)) / CAST("total" AS DECIMAL(15,4))) *
100)
+ FROM
+ (
+ SELECT "sum"("ss_ext_sales_price") "promotions"
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
+index 02befa740..50a163329 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.sql
+@@ -19,18 +19,18 @@ SELECT
+ , "sum"("oct_sales") "oct_sales"
+ , "sum"("nov_sales") "nov_sales"
+ , "sum"("dec_sales") "dec_sales"
+-, CAST("sum"(("jan_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jan_sales_per_sq_foot"
+-, CAST("sum"(("feb_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"feb_sales_per_sq_foot"
+-, CAST("sum"(("mar_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"mar_sales_per_sq_foot"
+-, CAST("sum"(("apr_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"apr_sales_per_sq_foot"
+-, CAST("sum"(("may_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"may_sales_per_sq_foot"
+-, CAST("sum"(("jun_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jun_sales_per_sq_foot"
+-, CAST("sum"(("jul_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"jul_sales_per_sq_foot"
+-, CAST("sum"(("aug_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"aug_sales_per_sq_foot"
+-, CAST("sum"(("sep_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"sep_sales_per_sq_foot"
+-, CAST("sum"(("oct_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"oct_sales_per_sq_foot"
+-, CAST("sum"(("nov_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"nov_sales_per_sq_foot"
+-, CAST("sum"(("dec_sales" / "w_warehouse_sq_ft")) AS DECIMAL(38,2))
"dec_sales_per_sq_foot"
++, "sum"(("jan_sales" / "w_warehouse_sq_ft")) "jan_sales_per_sq_foot"
++, "sum"(("feb_sales" / "w_warehouse_sq_ft")) "feb_sales_per_sq_foot"
++, "sum"(("mar_sales" / "w_warehouse_sq_ft")) "mar_sales_per_sq_foot"
++, "sum"(("apr_sales" / "w_warehouse_sq_ft")) "apr_sales_per_sq_foot"
++, "sum"(("may_sales" / "w_warehouse_sq_ft")) "may_sales_per_sq_foot"
++, "sum"(("jun_sales" / "w_warehouse_sq_ft")) "jun_sales_per_sq_foot"
++, "sum"(("jul_sales" / "w_warehouse_sq_ft")) "jul_sales_per_sq_foot"
++, "sum"(("aug_sales" / "w_warehouse_sq_ft")) "aug_sales_per_sq_foot"
++, "sum"(("sep_sales" / "w_warehouse_sq_ft")) "sep_sales_per_sq_foot"
++, "sum"(("oct_sales" / "w_warehouse_sq_ft")) "oct_sales_per_sq_foot"
++, "sum"(("nov_sales" / "w_warehouse_sq_ft")) "nov_sales_per_sq_foot"
++, "sum"(("dec_sales" / "w_warehouse_sq_ft")) "dec_sales_per_sq_foot"
+ , "sum"("jan_net") "jan_net"
+ , "sum"("feb_net") "feb_net"
+ , "sum"("mar_net") "mar_net"
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
+index fd045292e..813eb8a07 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00066.txt
+@@ -1 +1 @@
+-"Conventional childr","977787","Midway","Williamson County","TN","United
States","DHL,BARIAN","2001","661407.18","766942.78","307720.05","333390.59","1904937.34","2308974.68","1310866.26","2298210.15","1497771.61","2900278.47","5213564.64","2706805.34","0.68","0.78","0.31","0.34","1.95","2.36","1.34","2.35","1.53","2.97","5.33","2.77","7554063.29","8213766.03","7574329.97","4142886.32","3575413.31","4126236.48","5015953.55","9665997.01","10823343.90","13418884.62","23331407.18","19502364.49"
+\ No newline at end of file
++"Conventional childr","977787","Midway","Williamson County","TN","United
States","DHL,BARIAN","2001","661407.18","766942.78","307720.05","333390.59","1904937.34","2308974.68","1310866.26","2298210.15","1497771.61","2900278.47","5213564.64","2706805.34","0.68","0.78","0.32","0.35","1.94","2.36","1.34","2.35","1.53","2.97","5.33","2.77","7554063.29","8213766.03","7574329.97","4142886.32","3575413.31","4126236.48","5015953.55","9665997.01","10823343.90","13418884.62","23331407.18","19502364.49"
+\ No newline at end of file
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
+index abc085c9e..33017f9fd 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00075.sql
+@@ -78,7 +78,7 @@ WHERE ("curr_yr"."i_brand_id" = "prev_yr"."i_brand_id")
+ AND ("curr_yr"."i_manufact_id" = "prev_yr"."i_manufact_id")
+ AND ("curr_yr"."d_year" = 2002)
+ AND ("prev_yr"."d_year" = (2002 - 1))
+- AND ((CAST((CAST("curr_yr"."sales_cnt" AS DECIMAL(17,2)) /
CAST("prev_yr"."sales_cnt" AS DECIMAL(17,2))) AS DECIMAL(17,2))) < DECIMAL
'0.9')
++ AND ((CAST("curr_yr"."sales_cnt" AS DECIMAL(17,2)) /
CAST("prev_yr"."sales_cnt" AS DECIMAL(17,2))) < DECIMAL '0.9')
+ ORDER BY "sales_cnt_diff" ASC, "sales_amt_diff" ASC
+ LIMIT 100
+ ;
+\ No newline at end of file
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
+index 0c455627b..c3fdb2a26 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00078.sql
+@@ -51,7 +51,7 @@ SELECT
+ "ss_sold_year"
+ , "ss_item_sk"
+ , "ss_customer_sk"
+-, CAST((CAST("ss_qty" AS DECIMAL(10,2)) / COALESCE(("ws_qty" + "cs_qty"), 1))
AS DECIMAL(38, 2)) "ratio"
++, "round"((CAST("ss_qty" AS DECIMAL(10,2)) / COALESCE(("ws_qty" + "cs_qty"),
1)), 2) "ratio"
+ , "ss_qty" "store_qty"
+ , "ss_wc" "store_wholesale_cost"
+ , "ss_sp" "store_sales_price"
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
+index bbc16a21b..934b8cdf0 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00089.sql
+@@ -25,7 +25,7 @@ FROM
+ AND ("i_class" IN ('shirts' , 'birdal' ,
'dresses'))))
+ GROUP BY "i_category", "i_class", "i_brand", "s_store_name",
"s_company_name", "d_moy"
+ ) tmp1
+-WHERE ((CASE WHEN ("avg_monthly_sales" <> 0) THEN CAST(("abs"(("sum_sales" -
"avg_monthly_sales")) / "avg_monthly_sales") AS DECIMAL(38,2)) ELSE null END) >
DECIMAL '0.1')
++WHERE ((CASE WHEN ("avg_monthly_sales" <> 0) THEN ("abs"(("sum_sales" -
"avg_monthly_sales")) / "avg_monthly_sales") ELSE null END) > DECIMAL '0.1')
+ ORDER BY ("sum_sales" - "avg_monthly_sales") ASC, "s_store_name" ASC
+ LIMIT 100
+ ;
+\ No newline at end of file
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
+index edcb1d548..106349bf3 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00090.sql
+@@ -1,4 +1,4 @@
+-SELECT CAST((CAST("amc" AS DECIMAL(15,4)) / CAST("pmc" + 0.001 AS
DECIMAL(15,4))) AS DECIMAL(15,4)) "am_pm_ratio"
++SELECT (CAST("amc" AS DECIMAL(15,4)) / CAST("pmc" + 0.001 AS DECIMAL(15,4)))
"am_pm_ratio"
+ FROM
+ (
+ SELECT "count"(*) "amc"
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
+index 10e47d07e..72ddd155e 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpcds/00098.sql
+@@ -5,7 +5,7 @@ SELECT
+ , "i_class"
+ , "i_current_price"
+ , "sum"("ss_ext_sales_price") "itemrevenue"
+-, CAST((("sum"("ss_ext_sales_price") * 100) /
"sum"("sum"("ss_ext_sales_price")) OVER (PARTITION BY "i_class")) AS
DECIMAL(38, 2)) "revenueratio"
++, (("sum"("ss_ext_sales_price") * 100) / "sum"("sum"("ss_ext_sales_price"))
OVER (PARTITION BY "i_class")) "revenueratio"
+ FROM
+ store_sales
+ , item
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
+index 11b768749..ea3b1fa72 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.sql
+@@ -1,10 +1,10 @@
+ SELECT
+ o_year,
+- CAST((sum(CASE
++ sum(CASE
+ WHEN nation = 'BRAZIL'
+ THEN volume
+ ELSE 0
+- END) / sum(volume)) AS DECIMAL(38, 2)) AS mkt_share
++ END) / sum(volume) AS mkt_share
+ FROM (
+ SELECT
+ extract(YEAR FROM o.orderdate) AS o_year,
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.txt
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.txt
+index cdea0396b..8be6da155 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.txt
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00008.txt
+@@ -1,2 +1,2 @@
+-"1995","0.00"
+-"1996","0.00"
+\ No newline at end of file
++"1995","0.0000"
++"1996","0.0000"
+\ No newline at end of file
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00017.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00017.sql
+index d712f45bb..7150e90ec 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00017.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/00017.sql
+@@ -1,5 +1,5 @@
+ SELECT
+- CAST(sum(l.extendedprice)/7.0 AS DECIMAL(38, 2)) as avg_yearly
++ sum(l.extendedprice)/7.0 as avg_yearly
+ FROM
+ lineitem l,
+ part p
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_hive_prepare.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_hive_prepare.sql
+index 2a35d4340..2fb4294af 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_hive_prepare.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_hive_prepare.sql
+@@ -2,8 +2,8 @@ call gravitino.system.create_catalog(
+ 'gt_hive2',
+ 'hive',
+ map(
+- array['metastore.uris', 'trino.bypass.fs.hadoop.enabled'],
+- array['${hive_uri}', 'true']
++ array['metastore.uris'],
++ array['${hive_uri}']
+ )
+ );
+
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_iceberg_prepare.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_iceberg_prepare.sql
+index 22826aa98..a5a0669f8 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_iceberg_prepare.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/tpch/catalog_iceberg_prepare.sql
+@@ -2,8 +2,8 @@ call gravitino.system.create_catalog(
+ 'gt_iceberg2',
+ 'lakehouse-iceberg',
+ map(
+- array['uri', 'catalog-backend', 'warehouse',
'trino.bypass.fs.hadoop.enabled'],
+- array['${hive_uri}', 'hive',
'${hdfs_uri}/user/iceberg/warehouse/TrinoQueryIT', 'true']
++ array['uri', 'catalog-backend', 'warehouse'],
++ array['${hive_uri}', 'hive',
'${hdfs_uri}/user/iceberg/warehouse/TrinoQueryIT']
+ )
+ );
+
+diff --git
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
+index 46cf682b1..4d3fcb5d2 100644
+---
a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
++++
b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/hive/00008_decimal.sql
+@@ -26,7 +26,7 @@ SELECT val1 + val2 FROM tb03;
+
+ SELECT val1 * val2 FROM tb03;
+
+-SELECT CAST(val1 / val2 AS DECIMAL(38, 2)) FROM tb03;
++SELECT val1 / val2 FROM tb03;
+
+ CREATE TABLE tb04 (max_min_val DECIMAL(18, 4));
+
diff --git a/trino-connector/trino-connector-473-478/build.gradle.kts
b/trino-connector/trino-connector-473-478/build.gradle.kts
new file mode 100644
index 0000000000..d74624bb6d
--- /dev/null
+++ b/trino-connector/trino-connector-473-478/build.gradle.kts
@@ -0,0 +1,168 @@
+/*
+ * 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`
+}
+
+// This module supports Trino versions 473-478
+val minTrinoVersion = 473
+val maxTrinoVersion = 478
+val otelSemconvVersion = "1.32.0"
+
+val trinoVersion = providers.gradleProperty("trinoVersion")
+ .map { it.trim().toInt() }
+ .orElse(maxTrinoVersion)
+ .get()
+
+// Validate version range
+check(trinoVersion in minTrinoVersion..maxTrinoVersion) {
+ "Module ${project.path} supports Trino versions
$minTrinoVersion-$maxTrinoVersion, " +
+ "but trinoVersion=$trinoVersion was specified. " +
+ "Please set '-PtrinoVersion=$minTrinoVersion' (or any version in the
supported range)."
+}
+
+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")
+
runtimeOnly("io.opentelemetry.semconv:opentelemetry-semconv:$otelSemconvVersion")
+ 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")
+ exclude("org.junit.jupiter")
+ exclude("org.junit.platform")
+ }
+ testImplementation(enforcedPlatform("org.junit:junit-bom:5.11.4"))
+ testImplementation("org.junit.jupiter:junit-jupiter-api")
+ testRuntimeOnly("org.junit.jupiter: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-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector478.java
new file mode 100644
index 0000000000..2c069e1241
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector478.java
@@ -0,0 +1,67 @@
+/*
+ * 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.Connector;
+import io.trino.spi.connector.ConnectorMetadata;
+import io.trino.spi.connector.ConnectorNodePartitioningProvider;
+import io.trino.spi.connector.ConnectorPageSourceProviderFactory;
+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 GravitinoConnector478 extends GravitinoConnector {
+
+ public GravitinoConnector478(CatalogConnectorContext connectorContext) {
+ super(connectorContext);
+ }
+
+ @Override
+ protected GravitinoMetadata createGravitinoMetadata(
+ CatalogConnectorMetadata catalogConnectorMetadata,
+ CatalogConnectorMetadataAdapter metadataAdapter,
+ ConnectorMetadata internalMetadata) {
+ return new GravitinoMetadata478(catalogConnectorMetadata, metadataAdapter,
internalMetadata);
+ }
+
+ @Override
+ public ConnectorSplitManager getSplitManager() {
+ ConnectorSplitManager splitManager =
+ catalogConnectorContext.getInternalConnector().getSplitManager();
+ return new GravitinoSplitManager478(splitManager);
+ }
+
+ @Override
+ public ConnectorNodePartitioningProvider getNodePartitioningProvider() {
+ ConnectorNodePartitioningProvider nodePartitioningProvider =
+
catalogConnectorContext.getInternalConnector().getNodePartitioningProvider();
+ return new GravitinoNodePartitioningProvider478(nodePartitioningProvider);
+ }
+
+ @Override
+ public ConnectorPageSourceProviderFactory getPageSourceProviderFactory() {
+ Connector internalConnector =
catalogConnectorContext.getInternalConnector();
+ ConnectorPageSourceProviderFactory
internalConnectorPageSourceProviderFactory =
+ internalConnector.getPageSourceProviderFactory();
+ return () ->
+ new GravitinoDataSourceProvider(
+
internalConnectorPageSourceProviderFactory.createPageSourceProvider());
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory478.java
new file mode 100644
index 0000000000..60680e1866
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory478.java
@@ -0,0 +1,62 @@
+/*
+ * 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 GravitinoConnectorFactory478 extends GravitinoConnectorFactory {
+
+ public GravitinoConnectorFactory478(GravitinoAdminClient client) {
+ super(client);
+ }
+
+ @Override
+ protected int getMinSupportTrinoSpiVersion() {
+ return 473;
+ }
+
+ @Override
+ protected int getMaxSupportTrinoSpiVersion() {
+ return 478;
+ }
+
+ @Override
+ protected String getTrinoCatalogName(String metalake, String catalog) {
+ return "\"" + metalake + "." + catalog + "\"";
+ }
+
+ @Override
+ protected boolean supportCatalogNameWithMetalake() {
+ return false;
+ }
+
+ @Override
+ protected GravitinoConnector createConnector(CatalogConnectorContext
connectorContext) {
+ return new GravitinoConnector478(connectorContext);
+ }
+
+ @Override
+ protected GravitinoSystemConnector createSystemConnector(
+ GravitinoStoredProcedureFactory storedProcedureFactory) {
+ return new GravitinoSystemConnector478(storedProcedureFactory);
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata478.java
new file mode 100644
index 0000000000..40173cdb42
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata478.java
@@ -0,0 +1,127 @@
+/*
+ * 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.ColumnHandle;
+import io.trino.spi.connector.ColumnMetadata;
+import io.trino.spi.connector.ColumnPosition;
+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.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.apache.gravitino.rel.TableChange;
+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 GravitinoMetadata478 extends GravitinoMetadata {
+
+ public GravitinoMetadata478(
+ CatalogConnectorMetadata catalogConnectorMetadata,
+ CatalogConnectorMetadataAdapter metadataAdapter,
+ io.trino.spi.connector.ConnectorMetadata internalMetadata) {
+ super(catalogConnectorMetadata, metadataAdapter, internalMetadata);
+ }
+
+ @Override
+ public void addColumn(
+ ConnectorSession session,
+ ConnectorTableHandle tableHandle,
+ ColumnMetadata column,
+ ColumnPosition position) {
+ TableChange.ColumnPosition columnPosition =
TableChange.ColumnPosition.defaultPos();
+ if (position instanceof ColumnPosition.First) {
+ columnPosition = TableChange.ColumnPosition.first();
+ }
+ if (position instanceof ColumnPosition.After after) {
+ columnPosition = TableChange.ColumnPosition.after(after.columnName());
+ }
+ GravitinoColumn gravitinoColumn = metadataAdapter.createColumn(column);
+ catalogConnectorMetadata.addColumn(getTableName(tableHandle),
gravitinoColumn, columnPosition);
+ }
+
+ @Override
+ public Optional<ConnectorOutputMetadata> finishInsert(
+ ConnectorSession session,
+ ConnectorInsertTableHandle insertHandle,
+ List<ConnectorTableHandle> sourceTableHandles,
+ Collection<Slice> fragments,
+ Collection<ComputedStatistics> computedStatistics) {
+ return internalMetadata.finishInsert(
+ session,
+ GravitinoHandle.unWrap(insertHandle),
+ sourceTableHandles.stream()
+ .map(GravitinoHandle::unWrap)
+ .collect(Collectors.toUnmodifiableList()),
+ fragments,
+ computedStatistics);
+ }
+
+ @Override
+ public ConnectorMergeTableHandle beginMerge(
+ ConnectorSession session,
+ ConnectorTableHandle tableHandle,
+ Map<Integer, Collection<ColumnHandle>> updateCaseColumns,
+ RetryMode retryMode) {
+ Map<Integer, Collection<ColumnHandle>> unWrapUpdateCaseColumns =
+ updateCaseColumns.entrySet().stream()
+ .collect(
+ Collectors.toMap(
+ Map.Entry::getKey,
+ entry ->
+ entry.getValue().stream()
+ .map(GravitinoHandle::unWrap)
+ .collect(Collectors.toUnmodifiableList())));
+
+ ConnectorMergeTableHandle connectorMergeTableHandle =
+ internalMetadata.beginMerge(
+ session, GravitinoHandle.unWrap(tableHandle),
unWrapUpdateCaseColumns, retryMode);
+ SchemaTableName tableName = getTableName(tableHandle);
+
+ return new GravitinoMergeTableHandle(
+ tableName.getSchemaName(), tableName.getTableName(),
connectorMergeTableHandle);
+ }
+
+ @Override
+ public void finishMerge(
+ ConnectorSession session,
+ ConnectorMergeTableHandle mergeTableHandle,
+ List<ConnectorTableHandle> sourceTableHandles,
+ Collection<Slice> fragments,
+ Collection<ComputedStatistics> computedStatistics) {
+ internalMetadata.finishMerge(
+ session,
+ GravitinoHandle.unWrap(mergeTableHandle),
+ sourceTableHandles.stream()
+ .map(GravitinoHandle::unWrap)
+ .collect(Collectors.toUnmodifiableList()),
+ fragments,
+ computedStatistics);
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider478.java
new file mode 100644
index 0000000000..de134e30f6
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider478.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+import io.trino.spi.connector.ConnectorPartitioningHandle;
+import io.trino.spi.connector.ConnectorSession;
+import io.trino.spi.connector.ConnectorSplit;
+import io.trino.spi.connector.ConnectorTransactionHandle;
+import java.util.function.ToIntFunction;
+
+/** Trino NodePartitioningProvider implementation with the new split bucket
function signature. */
+public class GravitinoNodePartitioningProvider478 extends
GravitinoNodePartitioningProvider {
+
+ public GravitinoNodePartitioningProvider478(
+ ConnectorNodePartitioningProvider nodePartitioningProvider) {
+ super(nodePartitioningProvider);
+ }
+
+ @Override
+ public ToIntFunction<ConnectorSplit> getSplitBucketFunction(
+ ConnectorTransactionHandle transactionHandle,
+ ConnectorSession session,
+ ConnectorPartitioningHandle partitioningHandle,
+ int bucketCount) {
+ return nodePartitioningProvider.getSplitBucketFunction(
+ GravitinoHandle.unWrap(transactionHandle),
+ session,
+ GravitinoHandle.unWrap(partitioningHandle),
+ bucketCount);
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin478.java
new file mode 100644
index 0000000000..eae2fb0a90
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin478.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 GravitinoPlugin478 extends GravitinoPlugin {
+
+ public GravitinoPlugin478() {
+ super();
+ }
+
+ public GravitinoPlugin478(GravitinoAdminClient client) {
+ super(client);
+ }
+
+ @Override
+ protected GravitinoConnectorFactory
createConnectorFactory(GravitinoAdminClient client) {
+ return new GravitinoConnectorFactory478(client);
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager478.java
new file mode 100644
index 0000000000..9cec26c6e0
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager478.java
@@ -0,0 +1,61 @@
+/*
+ * 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 GravitinoSplitManager478 extends GravitinoSplitManager {
+
+ public GravitinoSplitManager478(ConnectorSplitManager internalSplitManager) {
+ super(internalSplitManager);
+ }
+
+ @Override
+ protected ConnectorSplitSource createSplitSource(ConnectorSplitSource
splits) {
+ return new GravitinoSplitSource478(splits);
+ }
+
+ static class GravitinoSplitSource478 extends GravitinoSplitSource {
+
+ GravitinoSplitSource478(ConnectorSplitSource connectorSplitSource) {
+ super(connectorSplitSource);
+ }
+
+ @Override
+ protected ConnectorSplit createSplit(ConnectorSplit split) {
+ return new GravitinoSplit478(split);
+ }
+ }
+
+ public static class GravitinoSplit478 extends GravitinoSplit {
+
+ @JsonCreator
+ public GravitinoSplit478(@JsonProperty(HANDLE_STRING) String handleString)
{
+ super(handleString);
+ }
+
+ public GravitinoSplit478(ConnectorSplit split) {
+ super(split);
+ }
+ }
+}
diff --git
a/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector478.java
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector478.java
new file mode 100644
index 0000000000..208671e051
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector478.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 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 io.trino.spi.connector.SourcePage;
+import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector;
+import
org.apache.gravitino.trino.connector.system.storedprocedure.GravitinoStoredProcedureFactory;
+
+public class GravitinoSystemConnector478 extends GravitinoSystemConnector {
+
+ public GravitinoSystemConnector478(
+ GravitinoStoredProcedureFactory gravitinoStoredProcedureFactory) {
+ super(gravitinoStoredProcedureFactory);
+ }
+
+ @Override
+ protected ConnectorSplitManager createSplitManager() {
+ return new GravitinoSplitManager478();
+ }
+
+ @Override
+ protected ConnectorPageSourceProvider createPageSourceProvider() {
+ return new DatasourceProvider478();
+ }
+
+ static class DatasourceProvider478 extends DatasourceProvider {
+
+ @Override
+ protected ConnectorPageSource createPageSource(Page page) {
+ return new SystemTablePageSource478(page);
+ }
+ }
+
+ static class GravitinoSplitManager478 extends SplitManager {
+
+ protected ConnectorSplit createSplit(SchemaTableName tableName) {
+ return new Split478(tableName);
+ }
+ }
+
+ static class SystemTablePageSource478 extends SystemTablePageSource {
+
+ public SystemTablePageSource478(Page page) {
+ super(page);
+ }
+
+ public SourcePage getNextSourcePage() {
+ return SourcePage.create(nextPage());
+ }
+ }
+
+ public static class Split478 extends Split {
+
+ @JsonCreator
+ public Split478(@JsonProperty("tableName") SchemaTableName tableName) {
+ super(tableName);
+ }
+ }
+}
diff --git a/integration-test-common/docker-script/init/trino/config/jvm.config
b/trino-connector/trino-connector-473-478/src/main/resources/META-INF/services/io.trino.spi.Plugin
similarity index 52%
copy from integration-test-common/docker-script/init/trino/config/jvm.config
copy to
trino-connector/trino-connector-473-478/src/main/resources/META-INF/services/io.trino.spi.Plugin
index 93f196e0af..3cb26a67b5 100644
--- a/integration-test-common/docker-script/init/trino/config/jvm.config
+++
b/trino-connector/trino-connector-473-478/src/main/resources/META-INF/services/io.trino.spi.Plugin
@@ -16,22 +16,4 @@
# specific language governing permissions and limitations
# under the License.
#
--XX:InitialRAMPercentage=30
--XX:MaxRAMPercentage=60
--XX:G1HeapRegionSize=32M
--XX:+ExplicitGCInvokesConcurrent
--XX:+HeapDumpOnOutOfMemoryError
--XX:+ExitOnOutOfMemoryError
--XX:-OmitStackTraceInFastThrow
--XX:ReservedCodeCacheSize=256M
--XX:PerMethodRecompilationCutoff=10000
--XX:PerBytecodeRecompilationCutoff=10000
--Djdk.attach.allowAttachSelf=true
--Djdk.nio.maxCachedBufferSize=2000000
-# Reduce starvation of threads by GClocker, recommend to set about the number
of cpu cores (JDK-8192647)
--XX:+UnlockDiagnosticVMOptions
--XX:GCLockerRetryAllocationCount=32
-# Required for Trino 452+ due to JDK-8329528
--XX:G1NumCollectionsKeepPinned=10000000
--DHADOOP_USER_NAME=hive
--Dlog4j.configurationFile=/etc/trino/log4j2.properties
\ No newline at end of file
+org.apache.gravitino.trino.connector.GravitinoPlugin478
diff --git
a/trino-connector/trino-connector-473-478/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector478.java
b/trino-connector/trino-connector-473-478/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector478.java
new file mode 100644
index 0000000000..afe2022c8e
--- /dev/null
+++
b/trino-connector/trino-connector-473-478/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector478.java
@@ -0,0 +1,58 @@
+/*
+ * 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 static io.trino.testing.TestingSession.testSessionBuilder;
+
+import io.trino.Session;
+import io.trino.testing.DistributedQueryRunner;
+import org.apache.gravitino.client.GravitinoAdminClient;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
+
+public class TestGravitinoConnector478 {
+ @Nested
+ class SingleMetalake extends TestGravitinoConnector {
+ @Override
+ protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient
client) {
+ return new GravitinoPlugin478(client);
+ }
+
+ @Override
+ protected DistributedQueryRunner createTrinoQueryRunner() throws Exception
{
+ Session session = testSessionBuilder().setCatalog("gravitino").build();
+ return DistributedQueryRunner.builder(session).setWorkerCount(0).build();
+ }
+ }
+
+ @Nested
+ @Disabled
+ class MultiMetalake extends TestGravitinoConnectorWithMetalakeCatalogName {
+ @Override
+ protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient
client) {
+ return new GravitinoPlugin478(client);
+ }
+
+ @Override
+ protected DistributedQueryRunner createTrinoQueryRunner() throws Exception
{
+ Session session = testSessionBuilder().setCatalog("gravitino").build();
+ return DistributedQueryRunner.builder(session).setWorkerCount(0).build();
+ }
+ }
+}