Skip to content

Commit

Permalink
Add support for LIMIT 0 and LIMIT NULL statements
Browse files Browse the repository at this point in the history
  • Loading branch information
Rodac committed Jul 29, 2014
1 parent e9939fd commit 6db0094
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 5 deletions.
12 changes: 11 additions & 1 deletion src/main/java/net/sf/jsqlparser/statement/select/Limit.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class Limit {
private boolean rowCountJdbcParameter = false;
private boolean offsetJdbcParameter = false;
private boolean limitAll;
private boolean limitNull = false;

public long getOffset() {
return offset;
Expand Down Expand Up @@ -76,10 +77,19 @@ public void setLimitAll(boolean b) {
limitAll = b;
}

/**
* @return true if the limit is "LIMIT NULL [OFFSET ...])
*/
public boolean isLimitNull() { return limitNull; }

public void setLimitNull(boolean b) { limitNull = b; }

@Override
public String toString() {
String retVal = "";
if (rowCount > 0 || rowCountJdbcParameter) {
if (limitNull) {
retVal += " LIMIT NULL";
} else if (rowCount >= 0 || rowCountJdbcParameter) {
retVal += " LIMIT " + (rowCountJdbcParameter ? "?" : rowCount + "");
}
if (offset > 0 || offsetJdbcParameter) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,11 @@ public void deparseLimit(Limit limit) {
if (limit.isRowCountJdbcParameter()) {
buffer.append(" LIMIT ");
buffer.append("?");
} else if (limit.getRowCount() != 0) {
} else if (limit.getRowCount() >= 0) {
buffer.append(" LIMIT ");
buffer.append(limit.getRowCount());
} else if (limit.isLimitNull()) {
buffer.append(" LIMIT NULL");
}

if (limit.isOffsetJdbcParameter()) {
Expand Down
5 changes: 4 additions & 1 deletion src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,7 @@ OrderByElement OrderByElement():
Limit Limit():
{
Limit limit = new Limit();
limit.setRowCount(-1l);
Token token = null;
}
{
Expand All @@ -1127,14 +1128,16 @@ Limit Limit():
<K_OFFSET>
(token=<S_LONG> { limit.setOffset(Long.parseLong(token.image)); } | "?" { limit.setOffsetJdbcParameter(true);} )
|
// mysql-postgresql-> LIMIT (row_count | ALL) [OFFSET offset]
// mysql-postgresql-> LIMIT (row_count | ALL | NULL) [OFFSET offset]
<K_LIMIT>
(
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
|
"?" { limit.setRowCountJdbcParameter(true);}
|
<K_ALL> { limit.setLimitAll(true);}
|
<K_NULL> { limit.setLimitNull(true); }
)

[LOOKAHEAD(2) <K_OFFSET>
Expand Down
23 changes: 21 additions & 2 deletions src/test/java/net/sf/jsqlparser/test/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,17 +220,37 @@ public void testLimit() throws JSQLParserException {
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());

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

statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?";
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT NULL OFFSET 3";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(-1, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
assertSqlCanBeParsedAndDeparsed(statement);

statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 0 OFFSET 3";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(0, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
assertSqlCanBeParsedAndDeparsed(statement);

statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?";
select = (Select) parserManager.parse(new StringReader(statement));

assertEquals(-1, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
assertStatementCanBeDeparsedAs(select, statement);

statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
Expand All @@ -249,7 +269,6 @@ public void testLimit() throws JSQLParserException {
+ "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) UNION ALL "
+ "(SELECT * FROM mytable3 WHERE mytable4.col = 9 OFFSET ?) LIMIT 4 OFFSET 3";
assertSqlCanBeParsedAndDeparsed(statement);

}

public void testTop() throws JSQLParserException {
Expand Down

0 comments on commit 6db0094

Please sign in to comment.