diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d4b7b1a8a13..4458100d874d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -520,7 +520,7 @@ jobs: timeout-minutes: 10 with: cache: restore - cleanup-node: ${{ format('{0}', matrix.modules == 'plugin/trino-singlestore' || matrix.modules == 'plugin/trino-exasol') }} + cleanup-node: ${{ format('{0}', matrix.modules == 'plugin/trino-singlestore' || matrix.modules == 'plugin/trino-exasol' || matrix.modules == 'plugin/trino-oracle') }} java-version: ${{ matrix.jdk != '' && matrix.jdk || '25' }} - name: Maven Install run: | diff --git a/client/trino-jdbc/pom.xml b/client/trino-jdbc/pom.xml index dec7bd25e66a..110db6624cc7 100644 --- a/client/trino-jdbc/pom.xml +++ b/client/trino-jdbc/pom.xml @@ -345,7 +345,7 @@ org.testcontainers - oracle-xe + oracle-free test diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcVendorCompatibility.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcVendorCompatibility.java index 395cc792d00d..6f20fd67f45a 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcVendorCompatibility.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcVendorCompatibility.java @@ -24,8 +24,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.parallel.Execution; -import org.testcontainers.containers.OracleContainer; import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.oracle.OracleContainer; import java.io.Closeable; import java.sql.Connection; @@ -539,7 +539,7 @@ private static class OracleReferenceDriver OracleReferenceDriver() { - oracleServer = new OracleContainer("gvenzl/oracle-xe:11.2.0.2-full") + oracleServer = new OracleContainer("gvenzl/oracle-free:23.9-slim") .usingSid(); oracleServer.start(); } diff --git a/docs/src/main/sphinx/connector/oracle.md b/docs/src/main/sphinx/connector/oracle.md index 034defa9ff1d..88ae659d2ff4 100644 --- a/docs/src/main/sphinx/connector/oracle.md +++ b/docs/src/main/sphinx/connector/oracle.md @@ -18,7 +18,7 @@ like Oracle and Hive, or different Oracle database instances. To connect to Oracle, you need: -- Oracle 19 or higher. +- Oracle 23 or higher. - Network access from the Trino coordinator and workers to Oracle. Port 1521 is the default port. diff --git a/plugin/trino-oracle/pom.xml b/plugin/trino-oracle/pom.xml index d186099a3d31..392b938d79f6 100644 --- a/plugin/trino-oracle/pom.xml +++ b/plugin/trino-oracle/pom.xml @@ -251,7 +251,13 @@ org.testcontainers - oracle-xe + jdbc + test + + + + org.testcontainers + oracle-free test diff --git a/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/BaseOracleConnectorTest.java b/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/BaseOracleConnectorTest.java index 435a0fc2f07f..7a8f7d595466 100644 --- a/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/BaseOracleConnectorTest.java +++ b/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/BaseOracleConnectorTest.java @@ -137,7 +137,7 @@ public void testInformationSchemaFiltering() @Override protected boolean isColumnNameRejected(Exception exception, String columnName, boolean delimited) { - if (columnName.equals("a\"quote") && exception.getMessage().contains("ORA-03001: unimplemented feature")) { + if (columnName.equals("a\"quote") && exception.getMessage().contains("ORA-25716: The identifier contains a double quotation mark (\") character")) { return true; } @@ -375,6 +375,14 @@ public void testTooLargeDomainCompactionThreshold() "SELECT * from nation", "Domain compaction threshold \\(10000\\) cannot exceed 1000"); } + @Test + @Override // Override because Oracle allows SELECT query in execute procedure + public void testExecuteProcedureWithInvalidQuery() + { + assertUpdate("CALL system.execute('SELECT 1')"); + assertQueryFails("CALL system.execute('invalid')", "(?s)Failed to execute query.*"); + } + @Test @Override public void testNativeQuerySimple() @@ -444,37 +452,37 @@ protected void verifyConcurrentAddColumnFailurePermissible(Exception e) @Override protected OptionalInt maxSchemaNameLength() { - return OptionalInt.of(30); + return OptionalInt.of(128); } @Override protected void verifySchemaNameLengthFailurePermissible(Throwable e) { - assertThat(e).hasMessageContaining("ORA-00972: identifier is too long"); + assertThat(e).hasMessageContaining("ORA-00972"); } @Override protected OptionalInt maxTableNameLength() { - return OptionalInt.of(30); + return OptionalInt.of(128); } @Override protected void verifyTableNameLengthFailurePermissible(Throwable e) { - assertThat(e).hasMessageContaining("ORA-00972: identifier is too long"); + assertThat(e).hasMessageContaining("ORA-00972"); } @Override protected OptionalInt maxColumnNameLength() { - return OptionalInt.of(30); + return OptionalInt.of(128); } @Override protected void verifyColumnNameLengthFailurePermissible(Throwable e) { - assertThat(e).hasMessageContaining("ORA-00972: identifier is too long"); + assertThat(e).hasMessageContaining("ORA-00972"); } @Override diff --git a/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/TestingOracleServer.java b/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/TestingOracleServer.java index 8b089c5ce314..2f0f8d762d5d 100644 --- a/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/TestingOracleServer.java +++ b/plugin/trino-oracle/src/test/java/io/trino/plugin/oracle/TestingOracleServer.java @@ -24,7 +24,8 @@ import io.trino.plugin.jdbc.credential.StaticCredentialProvider; import io.trino.plugin.jdbc.jmx.StatisticsAwareConnectionFactory; import oracle.jdbc.OracleDriver; -import org.testcontainers.containers.OracleContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.oracle.OracleContainer; import org.testcontainers.utility.MountableFile; import java.io.Closeable; @@ -36,6 +37,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; +import java.time.Duration; import java.time.temporal.ChronoUnit; import static io.trino.testing.TestingConnectorSession.SESSION; @@ -73,11 +75,12 @@ public TestingOracleServer() private void createContainer() { - OracleContainer container = new OracleContainer("gvenzl/oracle-xe:11.2.0.2-full") + OracleContainer container = new OracleContainer("gvenzl/oracle-free:23.9-slim") .withCopyFileToContainer(MountableFile.forClasspathResource("init.sql"), "/container-entrypoint-initdb.d/01-init.sql") .withCopyFileToContainer(MountableFile.forClasspathResource("restart.sh"), "/container-entrypoint-initdb.d/02-restart.sh") .withCopyFileToContainer(MountableFile.forHostPath(createConfigureScript()), "/container-entrypoint-initdb.d/03-create-users.sql") - .usingSid(); + .waitingFor(Wait.forLogMessage(".*DATABASE IS READY TO USE!.*\\s", 1).withStartupTimeout(Duration.ofMinutes(2))) + .withStartupTimeoutSeconds(180); try { this.cleanup = startOrReuse(container); this.container = container; @@ -95,6 +98,7 @@ private Path createConfigureScript() File tempFile = File.createTempFile("init-", ".sql"); Files.write(Joiner.on("\n").join( + format("ALTER SESSION SET CONTAINER=FREEPDB1;"), format("CREATE TABLESPACE %s DATAFILE 'test_db.dat' SIZE 100M ONLINE;", TEST_TABLESPACE), format("CREATE USER %s IDENTIFIED BY %s DEFAULT TABLESPACE %s;", TEST_USER, TEST_PASS, TEST_TABLESPACE), format("GRANT UNLIMITED TABLESPACE TO %s;", TEST_USER), diff --git a/plugin/trino-resource-group-managers/pom.xml b/plugin/trino-resource-group-managers/pom.xml index 6b61905f53de..473a7fee54a9 100644 --- a/plugin/trino-resource-group-managers/pom.xml +++ b/plugin/trino-resource-group-managers/pom.xml @@ -256,7 +256,7 @@ org.testcontainers - oracle-xe + oracle-free test diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupsOracleFlywayMigration.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupsOracleFlywayMigration.java index de706e7cde9d..e0ae3dd874f3 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupsOracleFlywayMigration.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupsOracleFlywayMigration.java @@ -15,7 +15,7 @@ import org.jdbi.v3.core.Handle; import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.containers.OracleContainer; +import org.testcontainers.oracle.OracleContainer; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -28,7 +28,7 @@ public class TestDbResourceGroupsOracleFlywayMigration @Override protected final JdbcDatabaseContainer startContainer() { - JdbcDatabaseContainer container = new OracleContainer("gvenzl/oracle-xe:18.4.0-slim") + JdbcDatabaseContainer container = new OracleContainer("gvenzl/oracle-free:23.9-slim") .withPassword("trino") .withEnv("ORACLE_PASSWORD", "trino"); container.start();