From 37ba0b63e4c863d3d8b3f1e4d2a031e4d672f82b Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 1 Dec 2022 22:18:16 +1300 Subject: [PATCH] #2907 - Promote Db2SqlLimiter to be AnsiSqlRowsLimiter and move to ebean-api module --- .../config/dbplatform/AnsiSqlRowsLimiter.java | 13 ++++------- .../ebean/config/dbplatform/SqlLimiter.java | 8 ------- .../org/tests/basic/TestQueryForUpdate.java | 23 ++++++++++++++++++- .../tests/query/TestQueryFindPagedList.java | 1 + .../ebean/platform/db2/BaseDB2Platform.java | 8 ++----- .../oracle/OracleAnsiSqlRowsLimiter.java | 1 + 6 files changed, 31 insertions(+), 23 deletions(-) rename platforms/db2/src/main/java/io/ebean/platform/db2/Db2SqlLimiter.java => ebean-api/src/main/java/io/ebean/config/dbplatform/AnsiSqlRowsLimiter.java (64%) 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()); }