Skip to content

Commit 6db0094

Browse files
committed
Add support for LIMIT 0 and LIMIT NULL statements
1 parent e9939fd commit 6db0094

File tree

4 files changed

+39
-5
lines changed

4 files changed

+39
-5
lines changed

src/main/java/net/sf/jsqlparser/statement/select/Limit.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class Limit {
3232
private boolean rowCountJdbcParameter = false;
3333
private boolean offsetJdbcParameter = false;
3434
private boolean limitAll;
35+
private boolean limitNull = false;
3536

3637
public long getOffset() {
3738
return offset;
@@ -76,10 +77,19 @@ public void setLimitAll(boolean b) {
7677
limitAll = b;
7778
}
7879

80+
/**
81+
* @return true if the limit is "LIMIT NULL [OFFSET ...])
82+
*/
83+
public boolean isLimitNull() { return limitNull; }
84+
85+
public void setLimitNull(boolean b) { limitNull = b; }
86+
7987
@Override
8088
public String toString() {
8189
String retVal = "";
82-
if (rowCount > 0 || rowCountJdbcParameter) {
90+
if (limitNull) {
91+
retVal += " LIMIT NULL";
92+
} else if (rowCount >= 0 || rowCountJdbcParameter) {
8393
retVal += " LIMIT " + (rowCountJdbcParameter ? "?" : rowCount + "");
8494
}
8595
if (offset > 0 || offsetJdbcParameter) {

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,11 @@ public void deparseLimit(Limit limit) {
241241
if (limit.isRowCountJdbcParameter()) {
242242
buffer.append(" LIMIT ");
243243
buffer.append("?");
244-
} else if (limit.getRowCount() != 0) {
244+
} else if (limit.getRowCount() >= 0) {
245245
buffer.append(" LIMIT ");
246246
buffer.append(limit.getRowCount());
247+
} else if (limit.isLimitNull()) {
248+
buffer.append(" LIMIT NULL");
247249
}
248250

249251
if (limit.isOffsetJdbcParameter()) {

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,7 @@ OrderByElement OrderByElement():
11041104
Limit Limit():
11051105
{
11061106
Limit limit = new Limit();
1107+
limit.setRowCount(-1l);
11071108
Token token = null;
11081109
}
11091110
{
@@ -1127,14 +1128,16 @@ Limit Limit():
11271128
<K_OFFSET>
11281129
(token=<S_LONG> { limit.setOffset(Long.parseLong(token.image)); } | "?" { limit.setOffsetJdbcParameter(true);} )
11291130
|
1130-
// mysql-postgresql-> LIMIT (row_count | ALL) [OFFSET offset]
1131+
// mysql-postgresql-> LIMIT (row_count | ALL | NULL) [OFFSET offset]
11311132
<K_LIMIT>
11321133
(
11331134
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
11341135
|
11351136
"?" { limit.setRowCountJdbcParameter(true);}
11361137
|
11371138
<K_ALL> { limit.setLimitAll(true);}
1139+
|
1140+
<K_NULL> { limit.setLimitNull(true); }
11381141
)
11391142

11401143
[LOOKAHEAD(2) <K_OFFSET>

src/test/java/net/sf/jsqlparser/test/select/SelectTest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,17 +220,37 @@ public void testLimit() throws JSQLParserException {
220220
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
221221
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
222222
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
223+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
223224

224225
// toString uses standard syntax
225226
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ? OFFSET 3";
226227
assertSqlCanBeParsedAndDeparsed(statement);
227228

228-
statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?";
229+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT NULL OFFSET 3";
229230
select = (Select) parserManager.parse(new StringReader(statement));
231+
assertEquals(-1, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
232+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
233+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
234+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
235+
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
236+
assertSqlCanBeParsedAndDeparsed(statement);
230237

238+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 0 OFFSET 3";
239+
select = (Select) parserManager.parse(new StringReader(statement));
231240
assertEquals(0, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
241+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
242+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
243+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
244+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
245+
assertSqlCanBeParsedAndDeparsed(statement);
246+
247+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?";
248+
select = (Select) parserManager.parse(new StringReader(statement));
249+
250+
assertEquals(-1, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
232251
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
233252
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
253+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
234254
assertStatementCanBeDeparsedAs(select, statement);
235255

236256
statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
@@ -249,7 +269,6 @@ public void testLimit() throws JSQLParserException {
249269
+ "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) UNION ALL "
250270
+ "(SELECT * FROM mytable3 WHERE mytable4.col = 9 OFFSET ?) LIMIT 4 OFFSET 3";
251271
assertSqlCanBeParsedAndDeparsed(statement);
252-
253272
}
254273

255274
public void testTop() throws JSQLParserException {

0 commit comments

Comments
 (0)