Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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