From a17e62b4918897e3cbf94bb25f0d9e559b3ddaa0 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 1 Dec 2022 22:51:37 +1300 Subject: [PATCH] Revert "#2908 - [Oracle] Change OraclePlatform to use AnsiSqlLimiter (noting Oracle does not support FOR UPDATE with FETCH/OFFSET" This reverts commit 62ed5a9f --- .../org/tests/basic/TestQueryForUpdate.java | 6 ++-- .../tests/query/TestQueryFindPagedList.java | 4 +-- .../oracle/OracleAnsiSqlRowsLimiter.java | 33 +++++++++++++++++++ .../ebean/platform/oracle/OraclePlatform.java | 10 ++++-- 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java diff --git a/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java b/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java index 41f760f4f..5f6b57054 100644 --- a/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java +++ b/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java @@ -1,10 +1,10 @@ package org.tests.basic; import io.ebean.*; -import io.ebean.annotation.Platform; -import io.ebean.test.LoggedSql; import io.ebean.xtest.BaseTestCase; import io.ebean.xtest.ForPlatform; +import io.ebean.annotation.Platform; +import io.ebean.test.LoggedSql; import io.ebean.xtest.IgnorePlatform; import org.junit.jupiter.api.Test; import org.tests.model.basic.Customer; @@ -41,7 +41,7 @@ public class TestQueryForUpdate extends BaseTestCase { } } - @IgnorePlatform({Platform.ORACLE, Platform.DB2}) + @IgnorePlatform({Platform.DB2}) @Test public void testForUpdate_withLimit() { ResetBasicData.reset(); diff --git a/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java b/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java index d37569f0c..57f4c15ff 100644 --- a/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java +++ b/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java @@ -3,10 +3,8 @@ package org.tests.query; import io.ebean.DB; import io.ebean.PagedList; import io.ebean.Transaction; -import io.ebean.annotation.Platform; import io.ebean.test.LoggedSql; import io.ebean.xtest.BaseTestCase; -import io.ebean.xtest.IgnorePlatform; import org.junit.jupiter.api.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; @@ -269,7 +267,7 @@ public class TestQueryFindPagedList extends BaseTestCase { assertThat(trimSql(loggedSql.get(1), 3)).contains(" b.id, b.status, b.order_date"); } - @IgnorePlatform(Platform.ORACLE) + // @IgnorePlatform(Platform.ORACLE) @Test void test_forUpdate() { ResetBasicData.reset(); diff --git a/platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java b/platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java new file mode 100644 index 000000000..d849690b2 --- /dev/null +++ b/platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java @@ -0,0 +1,33 @@ +package io.ebean.platform.oracle; + +import io.ebean.config.dbplatform.SqlLimitRequest; +import io.ebean.config.dbplatform.SqlLimitResponse; +import io.ebean.config.dbplatform.SqlLimiter; + +/** + * Use ANSI offset rows syntax. + */ +final class OracleAnsiSqlRowsLimiter implements SqlLimiter { + + @Override + public SqlLimitResponse limit(SqlLimitRequest request) { + String dbSql = request.getDbSql(); + StringBuilder sb = new StringBuilder(50 + dbSql.length()); + sb.append("select "); + if (request.isDistinct()) { + sb.append("distinct "); + } + sb.append(dbSql); + int firstRow = request.getFirstRow(); + if (firstRow > 0) { + sb.append(" offset ").append(firstRow).append(" rows"); + } + int maxRows = request.getMaxRows(); + if (maxRows > 0) { + sb.append(" fetch next ").append(maxRows).append(" rows only"); + } + // Oracle does not support FOR UPDATE clause with limit offset + return new SqlLimitResponse(sb.toString()); + } + +} diff --git a/platforms/oracle/src/main/java/io/ebean/platform/oracle/OraclePlatform.java b/platforms/oracle/src/main/java/io/ebean/platform/oracle/OraclePlatform.java index 406e20537..b067907f7 100644 --- a/platforms/oracle/src/main/java/io/ebean/platform/oracle/OraclePlatform.java +++ b/platforms/oracle/src/main/java/io/ebean/platform/oracle/OraclePlatform.java @@ -3,7 +3,13 @@ package io.ebean.platform.oracle; import io.ebean.BackgroundExecutor; import io.ebean.Query; import io.ebean.annotation.Platform; -import io.ebean.config.dbplatform.*; +import io.ebean.config.dbplatform.BasicSqlAnsiLimiter; +import io.ebean.config.dbplatform.DatabasePlatform; +import io.ebean.config.dbplatform.DbPlatformType; +import io.ebean.config.dbplatform.DbType; +import io.ebean.config.dbplatform.IdType; +import io.ebean.config.dbplatform.PlatformIdGenerator; +import io.ebean.config.dbplatform.SqlErrorCodes; import javax.sql.DataSource; import java.sql.Types; @@ -21,7 +27,7 @@ public class OraclePlatform extends DatabasePlatform { this.maxTableNameLength = 30; this.maxConstraintNameLength = 30; this.dbEncrypt = new OracleDbEncrypt(); - this.sqlLimiter = new AnsiSqlRowsLimiter(); + this.sqlLimiter = new OracleAnsiSqlRowsLimiter(); this.basicSqlLimiter = new BasicSqlAnsiLimiter(); this.historySupport = new OracleDbHistorySupport(); this.truncateTable = "truncate table %s cascade";