From 1330fe8fb65ee15eea3181d7f12176315ec19ad4 Mon Sep 17 00:00:00 2001 From: Tobias Date: Mon, 7 Oct 2013 16:29:23 +0200 Subject: [PATCH] Generate valid SQL when firstRow is set but not maxRows --- .../dbplatform/LimitOffsetSqlLimiter.java | 13 ++- .../com/avaje/tests/basic/TestLimitQuery.java | 87 +++++++++++++++++-- 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/LimitOffsetSqlLimiter.java b/src/main/java/com/avaje/ebean/config/dbplatform/LimitOffsetSqlLimiter.java index 0af060b93..f9405a7c0 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/LimitOffsetSqlLimiter.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/LimitOffsetSqlLimiter.java @@ -31,13 +31,12 @@ public class LimitOffsetSqlLimiter implements SqlLimiter { maxRows = maxRows + 1; } - sb.append(" ").append(NEW_LINE).append(LIMIT).append(" "); - if (maxRows > 0) { - sb.append(maxRows); - } - if (firstRow > 0) { - sb.append(" ").append(OFFSET).append(" "); - sb.append(firstRow); + if (maxRows > 0 || firstRow > 0) { + sb.append(" ").append(NEW_LINE).append(LIMIT).append(" ").append(maxRows); + if (firstRow > 0) { + sb.append(" ").append(OFFSET).append(" "); + sb.append(firstRow); + } } String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery()); diff --git a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java index 0c9043ab8..ed3141076 100644 --- a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java +++ b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java @@ -16,17 +16,94 @@ import com.avaje.tests.model.basic.ResetBasicData; public class TestLimitQuery extends BaseTestCase { - @Test + @Test public void testNothing() { } - @Test + @Test public void testLimitWithMany() { rob(); rob(); } - + + @Test + public void testMaxRowsZeroWithFirstRow() { + ResetBasicData.reset(); + + SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null); + boolean h2Db = "h2".equals(server.getDatabasePlatform().getName()); + + Query query = Ebean.find(Order.class) + .setAutofetch(false) + .fetch("details") + .where().gt("details.id", 0) + .setMaxRows(0) + .setFirstRow(3); + + List list = query.findList(); + + String sql = query.getGeneratedSql(); + boolean hasLimit = sql.indexOf("limit 0") > -1; + boolean hasOffset = sql.indexOf("offset 3") > -1; + + if (h2Db) { + Assert.assertTrue(hasLimit); + Assert.assertTrue(hasOffset); + } + } + + @Test + public void testMaxRowsWithFirstRowZero() { + ResetBasicData.reset(); + + SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null); + boolean h2Db = "h2".equals(server.getDatabasePlatform().getName()); + + Query query = Ebean.find(Order.class) + .setAutofetch(false) + .fetch("details") + .where().gt("details.id", 0) + .setMaxRows(3) + .setFirstRow(0); + + List list = query.findList(); + + String sql = query.getGeneratedSql(); + boolean hasLimit = sql.indexOf("limit 4") > -1; + boolean hasOffset = sql.indexOf("offset") > -1; + + if (h2Db) { + Assert.assertTrue(hasLimit); + Assert.assertFalse(hasOffset); + } + } + + @Test + public void testDefaults() { + ResetBasicData.reset(); + + SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null); + boolean h2Db = "h2".equals(server.getDatabasePlatform().getName()); + + Query query = Ebean.find(Order.class) + .setAutofetch(false) + .fetch("details") + .where().gt("details.id", 0) + .query(); + + List list = query.findList(); + + String sql = query.getGeneratedSql(); + boolean hasLimit = sql.indexOf("limit") > -1; + boolean hasOffset = sql.indexOf("offset") > -1; + + if (h2Db) { + Assert.assertFalse(hasLimit); + Assert.assertFalse(hasOffset); + } + } + private void rob() { ResetBasicData.reset(); @@ -43,7 +120,7 @@ public class TestLimitQuery extends BaseTestCase { List list = query.findList(); Assert.assertTrue("sz > 0", list.size() > 0); - + String sql = query.getGeneratedSql(); boolean hasDetailsJoin = sql.indexOf("join o_order_detail") > -1; boolean hasLimit = sql.indexOf("limit 11") > -1; @@ -69,7 +146,7 @@ public class TestLimitQuery extends BaseTestCase { hasLimit = sql.indexOf("limit 11") > -1; hasSelectedDetails = sql.indexOf("od.id") > -1; hasDistinct = sql.indexOf("select distinct") > -1; - + Assert.assertFalse("no join with maxRows",hasDetailsJoin); Assert.assertFalse(hasSelectedDetails); Assert.assertFalse(hasDistinct);