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();