diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/Db2SqlLimiter.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/AnsiSqlRowsLimiter.java
similarity index 64%
rename from platforms/db2/src/main/java/io/ebean/platform/db2/Db2SqlLimiter.java
rename to ebean-api/src/main/java/io/ebean/config/dbplatform/AnsiSqlRowsLimiter.java
index 1c6302b56..ba9dbbe4a 100644
--- a/platforms/db2/src/main/java/io/ebean/platform/db2/Db2SqlLimiter.java
+++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/AnsiSqlRowsLimiter.java
@@ -1,19 +1,16 @@
-package io.ebean.platform.db2;
+package io.ebean.config.dbplatform;
-import io.ebean.config.dbplatform.SqlLimitRequest;
-import io.ebean.config.dbplatform.SqlLimitResponse;
-import io.ebean.config.dbplatform.SqlLimiter;
-
-public final class Db2SqlLimiter implements SqlLimiter {
+public final class AnsiSqlRowsLimiter implements SqlLimiter {
@Override
public SqlLimitResponse limit(SqlLimitRequest request) {
- StringBuilder sb = new StringBuilder(512);
+ String dbSql = request.getDbSql();
+ StringBuilder sb = new StringBuilder(50 + dbSql.length());
sb.append("select ");
if (request.isDistinct()) {
sb.append("distinct ");
}
- sb.append(request.getDbSql());
+ sb.append(dbSql);
int firstRow = request.getFirstRow();
if (firstRow > 0) {
sb.append(" offset ").append(firstRow).append(" rows");
diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlLimiter.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlLimiter.java
index 7ba61428a..8a427cecf 100644
--- a/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlLimiter.java
+++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/SqlLimiter.java
@@ -5,14 +5,6 @@ package io.ebean.config.dbplatform;
*/
public interface SqlLimiter {
- /**
- * the new line character used.
- *
- * Note that this is removed for logging sql to the transaction log.
- *
- */
- char NEW_LINE = '\n';
-
/**
* Add the SQL limiting statements around the query.
*/
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 cb45cac51..cd3dd0c54 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestQueryForUpdate.java
@@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.*;
public class TestQueryForUpdate extends BaseTestCase {
@Test
- @ForPlatform({Platform.H2, Platform.ORACLE, Platform.POSTGRES, Platform.SQLSERVER, Platform.MYSQL, Platform.MARIADB})
public void testForUpdate() {
ResetBasicData.reset();
@@ -40,6 +39,28 @@ public class TestQueryForUpdate extends BaseTestCase {
}
}
+ // @IgnorePlatform(Platform.ORACLE)
+ @Test
+ public void testForUpdate_withLimit() {
+ ResetBasicData.reset();
+
+ Query query;
+ try (final Transaction transaction = DB.beginTransaction()) {
+ query = DB.find(Customer.class)
+ .forUpdate()
+ .setMaxRows(3)
+ .order().desc("id");
+
+ query.findList();
+ }
+
+ if (isSqlServer()) {
+ assertThat(sqlOf(query)).contains("with (updlock)");
+ } else {
+ assertThat(sqlOf(query)).contains("for update");
+ }
+ }
+
@Test
@ForPlatform({ Platform.H2, Platform.ORACLE, Platform.POSTGRES, Platform.SQLSERVER, Platform.MYSQL, Platform.MARIADB})
public void testForUpdate_when_alreadyInPCAsReference() {
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 629776577..57f4c15ff 100644
--- a/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java
+++ b/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java
@@ -267,6 +267,7 @@ public class TestQueryFindPagedList extends BaseTestCase {
assertThat(trimSql(loggedSql.get(1), 3)).contains(" b.id, b.status, b.order_date");
}
+ // @IgnorePlatform(Platform.ORACLE)
@Test
void test_forUpdate() {
ResetBasicData.reset();
diff --git a/platforms/db2/src/main/java/io/ebean/platform/db2/BaseDB2Platform.java b/platforms/db2/src/main/java/io/ebean/platform/db2/BaseDB2Platform.java
index cb2b4d141..57e59cfd2 100644
--- a/platforms/db2/src/main/java/io/ebean/platform/db2/BaseDB2Platform.java
+++ b/platforms/db2/src/main/java/io/ebean/platform/db2/BaseDB2Platform.java
@@ -2,11 +2,7 @@ package io.ebean.platform.db2;
import io.ebean.BackgroundExecutor;
import io.ebean.annotation.Platform;
-import io.ebean.config.dbplatform.DatabasePlatform;
-import io.ebean.config.dbplatform.DbPlatformType;
-import io.ebean.config.dbplatform.DbType;
-import io.ebean.config.dbplatform.PlatformIdGenerator;
-import io.ebean.config.dbplatform.SqlErrorCodes;
+import io.ebean.config.dbplatform.*;
import javax.sql.DataSource;
import java.sql.Types;
@@ -22,7 +18,7 @@ public abstract class BaseDB2Platform extends DatabasePlatform {
this.supportsNativeJavaTime = false;
this.truncateTable = "truncate table %s reuse storage ignore delete triggers immediate";
this.likeClauseRaw = "like ?";
- this.sqlLimiter = new Db2SqlLimiter();
+ this.sqlLimiter = new AnsiSqlRowsLimiter();
this.dbIdentity.setSupportsGetGeneratedKeys(true);
this.dbIdentity.setSupportsSequence(true);
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
index 241a0143f..d849690b2 100644
--- a/platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java
+++ b/platforms/oracle/src/main/java/io/ebean/platform/oracle/OracleAnsiSqlRowsLimiter.java
@@ -26,6 +26,7 @@ final class OracleAnsiSqlRowsLimiter implements SqlLimiter {
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());
}