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
commit 5b72977a7f0d5c05910840aa59fbde83fa256e38 Author: Yuhui <[email protected]> AuthorDate: Thu Feb 26 21:27:06 2026 +0800 [#9961] feat (trino-connector): Add the version segment module to support Trino 452-468 (#9962) Add the version segment module for 452-468 to support Trino 452 through Trino 468 Fix: #9961 NO UT and IT --------- Co-authored-by: Copilot <[email protected]> --- .claude/skills/trino-test/SKILL.md | 19 +-- .claude/skills/trino-test/trino-test-guide.md | 26 +--- .../docker-script/docker-compose.yaml | 8 +- .../docker-script/init/trino/config/jvm.config | 2 + .../test/container/TrinoITContainers.java | 2 +- settings.gradle.kts | 1 + trino-connector/integration-test/build.gradle.kts | 1 + .../connector/integration/test/TrinoQueryIT.java | 6 +- .../integration/test/TrinoQueryITBase.java | 15 +- .../integration/test/TrinoQueryTestTool.java | 2 +- .../jdbc-mysql/00011_column_properties.txt | 74 +++++----- .../trino-ci-testset/testsets/trino-446-451.patch | 131 ++++++++++++++++ .../connector/GravitinoConnectorFactory446.java | 2 +- .../trino-connector-452-468/build.gradle.kts | 164 +++++++++++++++++++++ .../trino/connector/GravitinoConnector452.java | 67 +++++++++ .../connector/GravitinoConnectorFactory452.java} | 17 ++- .../trino/connector/GravitinoMetadata452.java | 96 ++++++++++++ .../GravitinoNodePartitioningProvider452.java | 30 ++++ .../trino/connector/GravitinoPlugin452.java | 38 +++++ .../trino/connector/GravitinoSplitManager452.java | 61 ++++++++ .../connector/GravitinoSystemConnector452.java | 82 +++++++++++ .../META-INF/services/io.trino.spi.Plugin | 18 +-- .../src/test/java/TestGravitinoConnector452.java | 61 ++++++++ .../trino/connector/TestGravitinoConnector.java | 2 +- 24 files changed, 822 insertions(+), 103 deletions(-) diff --git a/.claude/skills/trino-test/SKILL.md b/.claude/skills/trino-test/SKILL.md index b549ee0e17..0b9fec5fbb 100644 --- a/.claude/skills/trino-test/SKILL.md +++ b/.claude/skills/trino-test/SKILL.md @@ -83,21 +83,22 @@ cd /home/ubuntu/git/gravitino --auto=all --test_set=jdbc-mysql --tester_id=00004 ``` -### Test with Trino 446 +### Run specific test catalog with testset +./trino-connector/integration-test/trino-test-tools/trino_integration_test.sh \ + --auto=all --test_set=tpch --catalog=hive + + +### Test specific Trino version with specific trino connector ```bash ./trino-connector/integration-test/trino-test-tools/trino_integration_test.sh \ --auto=all \ - --trino_version=446 \ - --trino_connector_dir=/home/ubuntu/git/gravitino/trino-connector/trino-connector-446-451/build/libs + --trino_version=<VERSION> \ + --trino_connector_dir=<WORKSPACE>/trino-connector/trino-connector-<VERSION_RANGE>/build/libs ``` -### Multi-version test -```bash -./trino-connector/integration-test/trino-test-tools/run_test_with_versions.sh \ - --trino_versions_map="446:trino-connector-446-451" -``` +## Check test status ---- +grep -E "(Test progress|All testers|Total|PASS|FAIL|BUILD) from log ## Test Structure diff --git a/.claude/skills/trino-test/trino-test-guide.md b/.claude/skills/trino-test/trino-test-guide.md index f69d4cdb12..fcbcde0fb7 100644 --- a/.claude/skills/trino-test/trino-test-guide.md +++ b/.claude/skills/trino-test/trino-test-guide.md @@ -85,15 +85,10 @@ trino-connector/integration-test/ #### Specify Trino Version ```bash -# Test with Trino 446 +# Test with a specific Trino version ./trino-connector/integration-test/trino-test-tools/trino_integration_test.sh \ - --auto=all --trino_version=446 \ - --trino_connector_dir=/path/to/trino-connector-446-451/build/libs - -# Test with Trino 435 -./trino-connector/integration-test/trino-test-tools/trino_integration_test.sh \ - --auto=all --trino_version=435 \ - --trino_connector_dir=/path/to/trino-connector-435-439/build/libs + --auto=all --trino_version=<VERSION> \ + --trino_connector_dir=/path/to/trino-connector-<VERSION_RANGE>/build/libs ``` ### 1.2 Test Modes @@ -173,7 +168,7 @@ trino-connector/integration-test/ | `--catalog` | Specify catalog name | - | `--catalog=mysql` | | `--params` | Parameter substitution | - | `--params=key1,v1;key2,v2` | | `--trino_worker_num` | Number of Trino workers | 0 | `--trino_worker_num=3` | -| `--trino_version` | Trino version | 435 | `--trino_version=446` | +| `--trino_version` | Trino version | - | `--trino_version=<VERSION>` | | `--trino_connector_dir` | Connector JAR directory | trino-connector/build/libs | `--trino_connector_dir=/path/to/libs` | | `--help` | Show help message | - | `--help` | @@ -199,14 +194,7 @@ trino-connector/integration-test/ --auto=all --test_set=jdbc-mysql --tester_id=00004 ``` -#### Scenario 4: Verify Trino 446 compatibility - -```bash -./trino-connector/integration-test/trino-test-tools/run_test_with_versions.sh \ - --trino_versions_map="446:trino-connector-446-451" -``` - -#### Scenario 5: Connect to remote test environment +#### Scenario 4: Connect to remote test environment ```bash ./trino-connector/integration-test/trino-test-tools/trino_integration_test.sh \ @@ -343,7 +331,7 @@ Use `%` to match variable content: ``` "Trino version: % ``` -Matches: `Trino version: 446`, `Trino version: 435`, etc. +Matches any Trino version string, e.g. `Trino version: 452`, `Trino version: 435`, etc. **Example 2: Match query plan** ``` @@ -444,7 +432,7 @@ Expect: %ScanFilter[...] " Actual: -"Trino version: 446 +"Trino version: 435 Fragment 0 [SINGLE] ... " diff --git a/integration-test-common/docker-script/docker-compose.yaml b/integration-test-common/docker-script/docker-compose.yaml index 37d90fae33..37cc54cbb9 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:-446} + image: trinodb/trino:${TRINO_VERSION:-452} 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-446-451/build/libs}:/usr/lib/trino/plugin/gravitino + - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-452-468/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:-446} + image: trinodb/trino:${TRINO_VERSION:-452} 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-446-451/build/libs}:/usr/lib/trino/plugin/gravitino + - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-452-468/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 57b0e104dc..93f196e0af 100644 --- a/integration-test-common/docker-script/init/trino/config/jvm.config +++ b/integration-test-common/docker-script/init/trino/config/jvm.config @@ -31,5 +31,7 @@ # 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 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 16b6e67a5d..fb808c3f59 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 @@ -74,7 +74,7 @@ public class TrinoITContainers implements AutoCloseable { File dir = new File(trinoConnectorDir); if (!dir.exists() || dir.list().length == 0) { throw new Exception( - "Gravitino trino connector directory %s is not exist or empty" + "Gravitino trino connector directory %s does not exist or is empty" .formatted(trinoConnectorDir)); } env.put("GRAVITINO_TRINO_CONNECTOR_DIR", trinoConnectorDir); diff --git a/settings.gradle.kts b/settings.gradle.kts index 8dd679883d..71a7bc776e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -72,6 +72,7 @@ include( "trino-connector:trino-connector-435-439", "trino-connector:trino-connector-440-445", "trino-connector:trino-connector-446-451", + "trino-connector:trino-connector-452-468", "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 ef21ba21c4..fa0e8cd36b 100644 --- a/trino-connector/integration-test/build.gradle.kts +++ b/trino-connector/integration-test/build.gradle.kts @@ -74,6 +74,7 @@ tasks.register("setupDependencies") { dependsOn(":trino-connector:trino-connector-435-439:copyLibs") dependsOn(":trino-connector:trino-connector-440-445:copyLibs") dependsOn(":trino-connector:trino-connector-446-451:copyLibs") + dependsOn(":trino-connector:trino-connector-452-468: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/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 2637ef9c67..460fe4fe22 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 @@ -338,7 +338,7 @@ public class TrinoQueryIT extends TrinoQueryITBase { CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor); String[] testSetNames = - Arrays.stream(TrinoQueryITBase.listDirectory(testsetsDir)) + Arrays.stream(TrinoQueryITBase.listTestSetDirectory(testsetsDir)) .filter(s -> new File(ITUtils.joinPath(testsetsDir, s)).isDirectory()) .filter(s -> ciTestsets.isEmpty() || ciTestsets.contains(s)) .toArray(String[]::new); @@ -529,14 +529,14 @@ public class TrinoQueryIT extends TrinoQueryITBase { } static String[] getTesterNames(String testSetDirName, String testFilterPrefix) throws Exception { - return Arrays.stream(listDirectory(testSetDirName)) + return Arrays.stream(listTestSetDirectory(testSetDirName)) .filter(s -> !s.endsWith("prepare.sql") && !s.endsWith("cleanup.sql") && s.endsWith(".sql")) .filter(s -> testFilterPrefix.isEmpty() || s.startsWith(testFilterPrefix)) .toArray(String[]::new); } static String[] getTesterCatalogNames(String testSetDirName, String catalog) throws Exception { - return Arrays.stream(listDirectory(testSetDirName)) + return Arrays.stream(listTestSetDirectory(testSetDirName)) .filter(s -> s.matches("catalog_.*_prepare.sql")) .filter(s -> catalog.isEmpty() || s.equals("catalog_" + catalog + "_prepare.sql")) .map(s -> s.replace("catalog_", "").replace("_prepare.sql", "")) 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 456e24d4c4..5d955bca7e 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 @@ -277,11 +277,18 @@ public class TrinoQueryITBase { } } - public static String[] listDirectory(String dirname) throws Exception { + public static String[] listTestSetDirectory(String dirname) throws Exception { File dir = new File(dirname); - if (dir.exists()) { - return dir.list(); + if (!dir.exists()) { + throw new Exception("Test queries directory " + dirname + " does not exist"); } - throw new Exception("Test queries directory " + dirname + " does not exist"); + if (!dir.isDirectory()) { + throw new Exception("Path " + dirname + " is not a directory"); + } + String[] files = dir.list(); + if (files == null) { + throw new Exception("Failed to list directory " + dirname + " (I/O error)"); + } + return files; } } diff --git a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryTestTool.java b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryTestTool.java index 13a4bf8ed3..7078107220 100644 --- a/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryTestTool.java +++ b/trino-connector/integration-test/src/test/java/org/apache/gravitino/trino/connector/integration/test/TrinoQueryTestTool.java @@ -227,7 +227,7 @@ public class TrinoQueryTestTool { } } if (Strings.isNotEmpty(testerId)) { - if (Arrays.stream(TrinoQueryIT.listDirectory(testSetDir)) + if (Arrays.stream(TrinoQueryIT.listTestSetDirectory(testSetDir)) .noneMatch(f -> f.startsWith(testerId))) { System.out.println("The tester " + testerId + " does not found in testset"); System.exit(1); diff --git a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt index c3e55683f7..117d2f1d4f 100644 --- a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt +++ b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt @@ -1,20 +1,20 @@ "CREATE TABLE gt_mysql.gt_mysql_test_column_properties.demo_all_data_types_default_value ( col_bit boolean, - col_tinyint tinyint WITH ( default = '0' ), - col_smallint smallint WITH ( default = '-1' ), + col_tinyint tinyint WITH (default = '0'), + col_smallint smallint WITH (default = '-1'), col_mediumint integer, - col_int integer WITH ( default = '1' ), - col_bigint bigint WITH ( default = '9999999' ), - col_float real WITH ( default = '0.0' ), - col_double double WITH ( default = '1.23456' ), - col_decimal decimal(10, 2) WITH ( default = '100.50' ), - col_date date WITH ( default = '2000-01-01' ), - col_time time(0) WITH ( default = '12:30:01' ), - col_datetime timestamp(0) WITH ( default = '2025-01-01 00:00:01' ), - col_timestamp timestamp(0) with time zone WITH ( default = '2025-01-01 00:00:01' ), + col_int integer WITH (default = '1'), + col_bigint bigint WITH (default = '9999999'), + col_float real WITH (default = '0.0'), + col_double double WITH (default = '1.23456'), + col_decimal decimal(10, 2) WITH (default = '100.50'), + col_date date WITH (default = '2000-01-01'), + col_time time(0) WITH (default = '12:30:01'), + col_datetime timestamp(0) WITH (default = '2025-01-01 00:00:01'), + col_timestamp timestamp(0) with time zone WITH (default = '2025-01-01 00:00:01'), col_year date, - col_char char(10) WITH ( default = 'abc' ), - col_varchar varchar(100) WITH ( default = 'Hello' ), + col_char char(10) WITH (default = 'abc'), + col_varchar varchar(100) WITH (default = 'Hello'), col_tinytext varchar, col_text varchar, col_mediumtext varchar, @@ -40,13 +40,13 @@ WITH ( int_col_2 integer, varchar200_col_1 varchar(200), varchar200_col_2 varchar(200), - datetime_col_1 timestamp(0) WITH ( default = 'CURRENT_TIMESTAMP' ), - datetime_col_2 timestamp(0) WITH ( default = 'CURRENT_TIMESTAMP' ), + datetime_col_1 timestamp(0) WITH (default = 'CURRENT_TIMESTAMP'), + datetime_col_2 timestamp(0) WITH (default = 'CURRENT_TIMESTAMP'), date_col_1 date, date_col_2 date, date_col_3 date, - timestamp_col_1 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ), - timestamp_col_2 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ) + timestamp_col_1 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP'), + timestamp_col_2 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP') ) COMMENT '' WITH ( @@ -58,22 +58,22 @@ CREATE SCHEMA CREATE TABLE "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_default_value ( - key1 integer NOT NULL WITH ( auto_increment = true ), - f1 varchar(200) WITH ( default = 'VARCHAR' ), - f2 char(20) WITH ( default = 'CHAR' ), - f4 decimal(10, 3) WITH ( default = '0.300' ), - f5 real WITH ( default = '0.3' ), - f6 double WITH ( default = '0.3' ), - f8 tinyint WITH ( default = '1' ), - f9 smallint WITH ( default = '1' ), - f10 integer WITH ( default = '1' ), - f11 integer WITH ( default = '1' ), - f12 bigint WITH ( default = '1' ), - f13 date WITH ( default = '2024-04-01' ), - f14 time(0) WITH ( default = '08:00' ), - f15 timestamp(0) WITH ( default = '2012-12-31 11:30:45' ), - f16 timestamp(0) with time zone WITH ( default = '2012-12-31 11:30:45' ), - f17 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ) + key1 integer NOT NULL WITH (auto_increment = true), + f1 varchar(200) WITH (default = 'VARCHAR'), + f2 char(20) WITH (default = 'CHAR'), + f4 decimal(10, 3) WITH (default = '0.300'), + f5 real WITH (default = '0.3'), + f6 double WITH (default = '0.3'), + f8 tinyint WITH (default = '1'), + f9 smallint WITH (default = '1'), + f10 integer WITH (default = '1'), + f11 integer WITH (default = '1'), + f12 bigint WITH (default = '1'), + f13 date WITH (default = '2024-04-01'), + f14 time(0) WITH (default = '08:00'), + f15 timestamp(0) WITH (default = '2012-12-31 11:30:45'), + f16 timestamp(0) with time zone WITH (default = '2012-12-31 11:30:45'), + f17 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP') ) COMMENT '' WITH ( @@ -90,7 +90,7 @@ DROP TABLE CREATE TABLE "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_1 ( - key1 integer NOT NULL WITH ( auto_increment = true ), + key1 integer NOT NULL WITH (auto_increment = true), f1 timestamp(0), f2 date ) @@ -105,7 +105,7 @@ DROP TABLE CREATE TABLE "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_2 ( - key1 integer NOT NULL WITH ( auto_increment = true ), + key1 integer NOT NULL WITH (auto_increment = true), key2 integer NOT NULL, f1 timestamp(0), f2 date @@ -121,7 +121,7 @@ DROP TABLE CREATE TABLE "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_3 ( - key1 integer NOT NULL WITH ( auto_increment = true ), + key1 integer NOT NULL WITH (auto_increment = true), col1 integer ) COMMENT '' @@ -135,7 +135,7 @@ DROP TABLE CREATE TABLE "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_4 ( - key1 integer NOT NULL WITH ( auto_increment = true ), + key1 integer NOT NULL WITH (auto_increment = true), key2 integer, col1 integer ) diff --git a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-446-451.patch b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-446-451.patch new file mode 100644 index 0000000000..4e158cd7cd --- /dev/null +++ b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/trino-446-451.patch @@ -0,0 +1,131 @@ +diff --git a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt +index 117d2f1d4..c3e55683f 100644 +--- a/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt ++++ b/trino-connector/integration-test/src/test/resources/trino-ci-testset/testsets/jdbc-mysql/00011_column_properties.txt +@@ -1,20 +1,20 @@ + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties.demo_all_data_types_default_value ( + col_bit boolean, +- col_tinyint tinyint WITH (default = '0'), +- col_smallint smallint WITH (default = '-1'), ++ col_tinyint tinyint WITH ( default = '0' ), ++ col_smallint smallint WITH ( default = '-1' ), + col_mediumint integer, +- col_int integer WITH (default = '1'), +- col_bigint bigint WITH (default = '9999999'), +- col_float real WITH (default = '0.0'), +- col_double double WITH (default = '1.23456'), +- col_decimal decimal(10, 2) WITH (default = '100.50'), +- col_date date WITH (default = '2000-01-01'), +- col_time time(0) WITH (default = '12:30:01'), +- col_datetime timestamp(0) WITH (default = '2025-01-01 00:00:01'), +- col_timestamp timestamp(0) with time zone WITH (default = '2025-01-01 00:00:01'), ++ col_int integer WITH ( default = '1' ), ++ col_bigint bigint WITH ( default = '9999999' ), ++ col_float real WITH ( default = '0.0' ), ++ col_double double WITH ( default = '1.23456' ), ++ col_decimal decimal(10, 2) WITH ( default = '100.50' ), ++ col_date date WITH ( default = '2000-01-01' ), ++ col_time time(0) WITH ( default = '12:30:01' ), ++ col_datetime timestamp(0) WITH ( default = '2025-01-01 00:00:01' ), ++ col_timestamp timestamp(0) with time zone WITH ( default = '2025-01-01 00:00:01' ), + col_year date, +- col_char char(10) WITH (default = 'abc'), +- col_varchar varchar(100) WITH (default = 'Hello'), ++ col_char char(10) WITH ( default = 'abc' ), ++ col_varchar varchar(100) WITH ( default = 'Hello' ), + col_tinytext varchar, + col_text varchar, + col_mediumtext varchar, +@@ -40,13 +40,13 @@ WITH ( + int_col_2 integer, + varchar200_col_1 varchar(200), + varchar200_col_2 varchar(200), +- datetime_col_1 timestamp(0) WITH (default = 'CURRENT_TIMESTAMP'), +- datetime_col_2 timestamp(0) WITH (default = 'CURRENT_TIMESTAMP'), ++ datetime_col_1 timestamp(0) WITH ( default = 'CURRENT_TIMESTAMP' ), ++ datetime_col_2 timestamp(0) WITH ( default = 'CURRENT_TIMESTAMP' ), + date_col_1 date, + date_col_2 date, + date_col_3 date, +- timestamp_col_1 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP'), +- timestamp_col_2 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP') ++ timestamp_col_1 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ), ++ timestamp_col_2 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ) + ) + COMMENT '' + WITH ( +@@ -58,22 +58,22 @@ CREATE SCHEMA + CREATE TABLE + + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_default_value ( +- key1 integer NOT NULL WITH (auto_increment = true), +- f1 varchar(200) WITH (default = 'VARCHAR'), +- f2 char(20) WITH (default = 'CHAR'), +- f4 decimal(10, 3) WITH (default = '0.300'), +- f5 real WITH (default = '0.3'), +- f6 double WITH (default = '0.3'), +- f8 tinyint WITH (default = '1'), +- f9 smallint WITH (default = '1'), +- f10 integer WITH (default = '1'), +- f11 integer WITH (default = '1'), +- f12 bigint WITH (default = '1'), +- f13 date WITH (default = '2024-04-01'), +- f14 time(0) WITH (default = '08:00'), +- f15 timestamp(0) WITH (default = '2012-12-31 11:30:45'), +- f16 timestamp(0) with time zone WITH (default = '2012-12-31 11:30:45'), +- f17 timestamp(0) with time zone WITH (default = 'CURRENT_TIMESTAMP') ++ key1 integer NOT NULL WITH ( auto_increment = true ), ++ f1 varchar(200) WITH ( default = 'VARCHAR' ), ++ f2 char(20) WITH ( default = 'CHAR' ), ++ f4 decimal(10, 3) WITH ( default = '0.300' ), ++ f5 real WITH ( default = '0.3' ), ++ f6 double WITH ( default = '0.3' ), ++ f8 tinyint WITH ( default = '1' ), ++ f9 smallint WITH ( default = '1' ), ++ f10 integer WITH ( default = '1' ), ++ f11 integer WITH ( default = '1' ), ++ f12 bigint WITH ( default = '1' ), ++ f13 date WITH ( default = '2024-04-01' ), ++ f14 time(0) WITH ( default = '08:00' ), ++ f15 timestamp(0) WITH ( default = '2012-12-31 11:30:45' ), ++ f16 timestamp(0) with time zone WITH ( default = '2012-12-31 11:30:45' ), ++ f17 timestamp(0) with time zone WITH ( default = 'CURRENT_TIMESTAMP' ) + ) + COMMENT '' + WITH ( +@@ -90,7 +90,7 @@ DROP TABLE + CREATE TABLE + + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_1 ( +- key1 integer NOT NULL WITH (auto_increment = true), ++ key1 integer NOT NULL WITH ( auto_increment = true ), + f1 timestamp(0), + f2 date + ) +@@ -105,7 +105,7 @@ DROP TABLE + CREATE TABLE + + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_2 ( +- key1 integer NOT NULL WITH (auto_increment = true), ++ key1 integer NOT NULL WITH ( auto_increment = true ), + key2 integer NOT NULL, + f1 timestamp(0), + f2 date +@@ -121,7 +121,7 @@ DROP TABLE + CREATE TABLE + + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_3 ( +- key1 integer NOT NULL WITH (auto_increment = true), ++ key1 integer NOT NULL WITH ( auto_increment = true ), + col1 integer + ) + COMMENT '' +@@ -135,7 +135,7 @@ DROP TABLE + CREATE TABLE + + "CREATE TABLE gt_mysql.gt_mysql_test_column_properties_v2.test_create_with_auto_increment_4 ( +- key1 integer NOT NULL WITH (auto_increment = true), ++ key1 integer NOT NULL WITH ( auto_increment = true ), + key2 integer, + col1 integer + ) diff --git a/trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java b/trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java index 39e273e0a3..56bdbf9067 100644 --- a/trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java +++ b/trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java @@ -41,7 +41,7 @@ public class GravitinoConnectorFactory446 extends GravitinoConnectorFactory { @Override protected boolean supportCatalogNameWithMetalake() { - return false; + return true; } @Override diff --git a/trino-connector/trino-connector-452-468/build.gradle.kts b/trino-connector/trino-connector-452-468/build.gradle.kts new file mode 100644 index 0000000000..6bcdff5e41 --- /dev/null +++ b/trino-connector/trino-connector-452-468/build.gradle.kts @@ -0,0 +1,164 @@ +/* + * 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 452-468 +val minTrinoVersion = 452 +val maxTrinoVersion = 468 +val otelSemconvVersion = "1.32.0" + +val trinoVersion = providers.gradleProperty("trinoVersion") + .map { it.trim().toInt() } + .orElse(minTrinoVersion) + .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") + } + 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-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector452.java new file mode 100644 index 0000000000..e2cbd08873 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector452.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 GravitinoConnector452 extends GravitinoConnector { + + public GravitinoConnector452(CatalogConnectorContext connectorContext) { + super(connectorContext); + } + + @Override + protected GravitinoMetadata createGravitinoMetadata( + CatalogConnectorMetadata catalogConnectorMetadata, + CatalogConnectorMetadataAdapter metadataAdapter, + ConnectorMetadata internalMetadata) { + return new GravitinoMetadata452(catalogConnectorMetadata, metadataAdapter, internalMetadata); + } + + @Override + public ConnectorSplitManager getSplitManager() { + ConnectorSplitManager splitManager = + catalogConnectorContext.getInternalConnector().getSplitManager(); + return new GravitinoSplitManager452(splitManager); + } + + @Override + public ConnectorNodePartitioningProvider getNodePartitioningProvider() { + ConnectorNodePartitioningProvider nodePartitioningProvider = + catalogConnectorContext.getInternalConnector().getNodePartitioningProvider(); + return new GravitinoNodePartitioningProvider452(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-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory452.java similarity index 79% copy from trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java copy to trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory452.java index 39e273e0a3..f8c69d7c6e 100644 --- a/trino-connector/trino-connector-446-451/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory446.java +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory452.java @@ -23,20 +23,25 @@ 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 GravitinoConnectorFactory446 extends GravitinoConnectorFactory { +public class GravitinoConnectorFactory452 extends GravitinoConnectorFactory { - public GravitinoConnectorFactory446(GravitinoAdminClient client) { + public GravitinoConnectorFactory452(GravitinoAdminClient client) { super(client); } @Override protected int getMinSupportTrinoSpiVersion() { - return 446; + return 452; } @Override protected int getMaxSupportTrinoSpiVersion() { - return 451; + return 468; + } + + @Override + protected String getTrinoCatalogName(String metalake, String catalog) { + return "\"" + metalake + "." + catalog + "\""; } @Override @@ -46,12 +51,12 @@ public class GravitinoConnectorFactory446 extends GravitinoConnectorFactory { @Override protected GravitinoConnector createConnector(CatalogConnectorContext connectorContext) { - return new GravitinoConnector446(connectorContext); + return new GravitinoConnector452(connectorContext); } @Override protected GravitinoSystemConnector createSystemConnector( GravitinoStoredProcedureFactory storedProcedureFactory) { - return new GravitinoSystemConnector446(storedProcedureFactory); + return new GravitinoSystemConnector452(storedProcedureFactory); } } diff --git a/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata452.java new file mode 100644 index 0000000000..ff43beb290 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata452.java @@ -0,0 +1,96 @@ +/* + * 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.List; +import java.util.Optional; +import java.util.stream.Collectors; +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 GravitinoMetadata452 extends GravitinoMetadata { + + public GravitinoMetadata452( + 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, + List<ConnectorTableHandle> sourceTableHandles, + Collection<Slice> fragments, + Collection<ComputedStatistics> computedStatistics) { + return internalMetadata.finishInsert( + session, + GravitinoHandle.unWrap(insertHandle), + sourceTableHandles.stream().map(GravitinoHandle::unWrap).collect(Collectors.toList()), + fragments, + computedStatistics); + } + + @SuppressWarnings("deprecation") + @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, + List<ConnectorTableHandle> sourceTableHandles, + Collection<Slice> fragments, + Collection<ComputedStatistics> computedStatistics) { + internalMetadata.finishMerge( + session, + GravitinoHandle.unWrap(mergeTableHandle), + sourceTableHandles.stream().map(GravitinoHandle::unWrap).collect(Collectors.toList()), + fragments, + computedStatistics); + } +} diff --git a/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider452.java new file mode 100644 index 0000000000..ef8475d5c5 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider452.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 GravitinoNodePartitioningProvider452 extends GravitinoNodePartitioningProvider { + + public GravitinoNodePartitioningProvider452( + ConnectorNodePartitioningProvider nodePartitioningProvider) { + super(nodePartitioningProvider); + } +} diff --git a/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin452.java new file mode 100644 index 0000000000..907769d805 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin452.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 GravitinoPlugin452 extends GravitinoPlugin { + + public GravitinoPlugin452() { + super(); + } + + public GravitinoPlugin452(GravitinoAdminClient client) { + super(client); + } + + @Override + protected GravitinoConnectorFactory createConnectorFactory(GravitinoAdminClient client) { + return new GravitinoConnectorFactory452(client); + } +} diff --git a/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager452.java new file mode 100644 index 0000000000..6c84514e2e --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager452.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 GravitinoSplitManager452 extends GravitinoSplitManager { + + public GravitinoSplitManager452(ConnectorSplitManager internalSplitManager) { + super(internalSplitManager); + } + + @Override + protected ConnectorSplitSource createSplitSource(ConnectorSplitSource splits) { + return new GravitinoSplitSource452(splits); + } + + static class GravitinoSplitSource452 extends GravitinoSplitSource { + + GravitinoSplitSource452(ConnectorSplitSource connectorSplitSource) { + super(connectorSplitSource); + } + + @Override + protected ConnectorSplit createSplit(ConnectorSplit split) { + return new GravitinoSplit452(split); + } + } + + public static class GravitinoSplit452 extends GravitinoSplit { + + @JsonCreator + public GravitinoSplit452(@JsonProperty(HANDLE_STRING) String handleString) { + super(handleString); + } + + public GravitinoSplit452(ConnectorSplit split) { + super(split); + } + } +} diff --git a/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector452.java b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector452.java new file mode 100644 index 0000000000..3dd53e12d5 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector452.java @@ -0,0 +1,82 @@ +/* + * 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 GravitinoSystemConnector452 extends GravitinoSystemConnector { + + public GravitinoSystemConnector452( + GravitinoStoredProcedureFactory gravitinoStoredProcedureFactory) { + super(gravitinoStoredProcedureFactory); + } + + @Override + protected ConnectorSplitManager createSplitManager() { + return new GravitinoSplitManager452(); + } + + @Override + protected ConnectorPageSourceProvider createPageSourceProvider() { + return new DatasourceProvider452(); + } + + static class DatasourceProvider452 extends DatasourceProvider { + + @Override + protected ConnectorPageSource createPageSource(Page page) { + return new SystemTablePageSource452(page); + } + } + + static class GravitinoSplitManager452 extends SplitManager { + + protected ConnectorSplit createSplit(SchemaTableName tableName) { + return new Split452(tableName); + } + } + + static class SystemTablePageSource452 extends SystemTablePageSource { + + public SystemTablePageSource452(Page page) { + super(page); + } + + public Page getNextPage() { + return nextPage(); + } + } + + public static class Split452 extends Split { + + @JsonCreator + public Split452(@JsonProperty("tableName") SchemaTableName tableName) { + super(tableName); + } + } +} diff --git a/integration-test-common/docker-script/init/trino/config/jvm.config b/trino-connector/trino-connector-452-468/src/main/resources/META-INF/services/io.trino.spi.Plugin similarity index 55% copy from integration-test-common/docker-script/init/trino/config/jvm.config copy to trino-connector/trino-connector-452-468/src/main/resources/META-INF/services/io.trino.spi.Plugin index 57b0e104dc..3d61d7e651 100644 --- a/integration-test-common/docker-script/init/trino/config/jvm.config +++ b/trino-connector/trino-connector-452-468/src/main/resources/META-INF/services/io.trino.spi.Plugin @@ -16,20 +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 --DHADOOP_USER_NAME=hive --Dlog4j.configurationFile=/etc/trino/log4j2.properties \ No newline at end of file +org.apache.gravitino.trino.connector.GravitinoPlugin452 diff --git a/trino-connector/trino-connector-452-468/src/test/java/TestGravitinoConnector452.java b/trino-connector/trino-connector-452-468/src/test/java/TestGravitinoConnector452.java new file mode 100644 index 0000000000..d2c1fb41b7 --- /dev/null +++ b/trino-connector/trino-connector-452-468/src/test/java/TestGravitinoConnector452.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. + */ + +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.GravitinoPlugin452; +import org.apache.gravitino.trino.connector.TestGravitinoConnector; +import org.apache.gravitino.trino.connector.TestGravitinoConnectorWithMetalakeCatalogName; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Nested; + +public class TestGravitinoConnector452 { + @Nested + class SingleMetalake extends TestGravitinoConnector { + @Override + protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient client) { + return new GravitinoPlugin452(client); + } + + @Override + protected DistributedQueryRunner createTrinoQueryRunner() throws Exception { + Session session = testSessionBuilder().setCatalog("gravitino").build(); + return DistributedQueryRunner.builder(session).setWorkerCount(1).build(); + } + } + + @Nested + @Disabled + class MultiMetalake extends TestGravitinoConnectorWithMetalakeCatalogName { + @Override + protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient client) { + return new GravitinoPlugin452(client); + } + + @Override + protected DistributedQueryRunner createTrinoQueryRunner() throws Exception { + Session session = testSessionBuilder().setCatalog("gravitino").build(); + return DistributedQueryRunner.builder(session).setWorkerCount(1).build(); + } + } +} diff --git a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector.java b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector.java index 99a7f803ac..710bf2a0ff 100644 --- a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector.java +++ b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/TestGravitinoConnector.java @@ -37,7 +37,7 @@ public abstract class TestGravitinoConnector extends AbstractGravitinoConnectorT public static final int SPI_VERSION_TEST_SUPPORT_RENAME_COLUMN = 452; public static final int SPI_VERSION_SUPPORT_ADD_COLUMN_WITH_POSITION = 468; - public static final int SPI_VERSION_TEST_SUPPORT_ADD_COLUMN = 469; + public static final int SPI_VERSION_TEST_SUPPORT_ADD_COLUMN = 452; @Override protected void configureCatalogs(
