Skip to content

Commit a52db54

Browse files
LIMIT OFFSET with Expressions (#1378)
Fixes #933
1 parent 9ad18d2 commit a52db54

File tree

14 files changed

+234
-276
lines changed

14 files changed

+234
-276
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
public class AllValue extends ASTNodeAccessImpl implements Expression {
15+
16+
@Override
17+
public void accept(ExpressionVisitor expressionVisitor) {
18+
expressionVisitor.visit(this);
19+
}
20+
21+
@Override
22+
public String toString() {
23+
return "ALL";
24+
}
25+
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,6 @@ public interface ExpressionVisitor {
182182
void visit(AllColumns allColumns);
183183

184184
void visit(AllTableColumns allTableColumns);
185+
186+
void visit(AllValue allValue);
185187
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,10 @@ public void visit(AllTableColumns allTableColumns) {
497497
allTableColumns.accept((ExpressionVisitor) this);
498498
}
499499

500+
@Override
501+
public void visit(AllValue allValue) {
502+
}
503+
500504
@Override
501505
public void visit(SelectExpressionItem selectExpressionItem) {
502506
selectExpressionItem.getExpression().accept(this);

src/main/java/net/sf/jsqlparser/expression/LongValue.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
package net.sf.jsqlparser.expression;
1111

1212
import java.math.BigInteger;
13+
import java.util.Objects;
14+
1315
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1416

1517
/**
@@ -74,4 +76,21 @@ public LongValue withStringValue(String stringValue) {
7476
this.setStringValue(stringValue);
7577
return this;
7678
}
79+
80+
@Override
81+
public boolean equals(Object o) {
82+
if (this == o) {
83+
return true;
84+
}
85+
if (o == null || getClass() != o.getClass()) {
86+
return false;
87+
}
88+
LongValue longValue = (LongValue) o;
89+
return stringValue.equals(longValue.stringValue);
90+
}
91+
92+
@Override
93+
public int hashCode() {
94+
return Objects.hash(stringValue);
95+
}
7796
}

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import net.sf.jsqlparser.expression.AllValue;
1213
import net.sf.jsqlparser.expression.Expression;
14+
import net.sf.jsqlparser.expression.NullValue;
1315
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1416

1517
public class Limit extends ASTNodeAccessImpl {
1618

1719
private Expression rowCount;
1820
private Expression offset;
19-
private boolean limitAll;
20-
private boolean limitNull = false;
2121

2222
public Expression getOffset() {
2323
return offset;
@@ -35,37 +35,43 @@ public void setRowCount(Expression l) {
3535
rowCount = l;
3636
}
3737

38+
@Deprecated
3839
public boolean isLimitAll() {
39-
return limitAll;
40+
return rowCount instanceof AllValue;
4041
}
4142

43+
@Deprecated
4244
public void setLimitAll(boolean b) {
43-
limitAll = b;
45+
if (b) {
46+
rowCount = new AllValue();
47+
}
4448
}
4549

50+
@Deprecated
4651
public boolean isLimitNull() {
47-
return limitNull;
52+
return rowCount instanceof NullValue;
4853
}
4954

55+
@Deprecated
5056
public void setLimitNull(boolean b) {
51-
limitNull = b;
57+
if (b) {
58+
rowCount = new NullValue();
59+
}
5260
}
5361

5462
@Override
5563
public String toString() {
5664
String retVal = " LIMIT ";
57-
if (limitNull) {
58-
retVal += "NULL";
65+
66+
if (rowCount instanceof AllValue || rowCount instanceof NullValue) {
67+
// no offset allowed
68+
retVal += rowCount;
5969
} else {
60-
if (limitAll) {
61-
retVal += "ALL";
62-
} else {
63-
if (null != offset) {
64-
retVal += offset + ", ";
65-
}
66-
if (null != rowCount) {
67-
retVal += rowCount;
68-
}
70+
if (null != offset) {
71+
retVal += offset + ", ";
72+
}
73+
if (null != rowCount) {
74+
retVal += rowCount;
6975
}
7076
}
7177

@@ -82,11 +88,13 @@ public Limit withOffset(Expression offset) {
8288
return this;
8389
}
8490

91+
@Deprecated
8592
public Limit withLimitAll(boolean limitAll) {
8693
this.setLimitAll(limitAll);
8794
return this;
8895
}
8996

97+
@Deprecated
9098
public Limit withLimitNull(boolean limitNull) {
9199
this.setLimitNull(limitNull);
92100
return this;

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

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,35 @@
1010
package net.sf.jsqlparser.statement.select;
1111

1212
import net.sf.jsqlparser.expression.Expression;
13-
import net.sf.jsqlparser.expression.JdbcNamedParameter;
14-
import net.sf.jsqlparser.expression.JdbcParameter;
1513

1614
public class Offset {
17-
18-
private long offset;
19-
private Expression offsetJdbcParameter = null;
15+
private Expression offsetExpression = null;
2016
private String offsetParam = null;
2117

22-
public long getOffset() {
23-
return offset;
18+
public Expression getOffset() {
19+
return offsetExpression;
2420
}
2521

2622
public String getOffsetParam() {
2723
return offsetParam;
2824
}
2925

30-
public void setOffset(long l) {
31-
offset = l;
26+
public void setOffset(Expression offsetExpression) {
27+
this.offsetExpression = offsetExpression;
3228
}
3329

3430
public void setOffsetParam(String s) {
3531
offsetParam = s;
3632
}
3733

38-
public Expression getOffsetJdbcParameter() {
39-
return offsetJdbcParameter;
40-
}
41-
42-
public void setOffsetJdbcParameter(JdbcParameter jdbc) {
43-
offsetJdbcParameter = jdbc;
44-
}
45-
46-
public void setOffsetJdbcParameter(JdbcNamedParameter jdbc) {
47-
offsetJdbcParameter = jdbc;
48-
}
4934

5035
@Override
5136
public String toString() {
52-
return " OFFSET " + (offsetJdbcParameter!=null ? offsetJdbcParameter.toString() : offset) + (offsetParam != null ? " " + offsetParam : "");
37+
return " OFFSET " + offsetExpression + (offsetParam != null ? " " + offsetParam : "");
5338
}
5439

55-
public Offset withOffset(long offset) {
56-
this.setOffset(offset);
40+
public Offset withOffset(Expression offsetExpression) {
41+
this.setOffset(offsetExpression);
5742
return this;
5843
}
5944

@@ -62,7 +47,7 @@ public Offset withOffsetParam(String offsetParam) {
6247
return this;
6348
}
6449

65-
public <E extends Expression> E getOffsetJdbcParameter(Class<E> type) {
66-
return type.cast(getOffsetJdbcParameter());
50+
public <E extends Expression> E getOffset(Class<E> type) {
51+
return type.cast(getOffset());
6752
}
6853
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,16 @@ public String toString() {
433433
if (where != null) {
434434
sql.append(" WHERE ").append(where);
435435
}
436+
437+
if (limit != null) {
438+
sql.append(limit);
439+
}
440+
if (offset != null) {
441+
sql.append(offset);
442+
}
443+
if (fetch != null) {
444+
sql.append(fetch);
445+
}
436446
}
437447
if (forXmlPath != null) {
438448
sql.append(" FOR XML PATH(").append(forXmlPath).append(")");

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 6 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,54 +13,7 @@
1313
import java.util.List;
1414
import java.util.Map;
1515

16-
import net.sf.jsqlparser.expression.AnalyticExpression;
17-
import net.sf.jsqlparser.expression.AnyComparisonExpression;
18-
import net.sf.jsqlparser.expression.ArrayExpression;
19-
import net.sf.jsqlparser.expression.ArrayConstructor;
20-
import net.sf.jsqlparser.expression.BinaryExpression;
21-
import net.sf.jsqlparser.expression.CaseExpression;
22-
import net.sf.jsqlparser.expression.CastExpression;
23-
import net.sf.jsqlparser.expression.CollateExpression;
24-
import net.sf.jsqlparser.expression.ConnectByRootOperator;
25-
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
26-
import net.sf.jsqlparser.expression.DateValue;
27-
import net.sf.jsqlparser.expression.DoubleValue;
28-
import net.sf.jsqlparser.expression.Expression;
29-
import net.sf.jsqlparser.expression.ExpressionVisitor;
30-
import net.sf.jsqlparser.expression.ExtractExpression;
31-
import net.sf.jsqlparser.expression.Function;
32-
import net.sf.jsqlparser.expression.HexValue;
33-
import net.sf.jsqlparser.expression.IntervalExpression;
34-
import net.sf.jsqlparser.expression.JdbcNamedParameter;
35-
import net.sf.jsqlparser.expression.JdbcParameter;
36-
import net.sf.jsqlparser.expression.JsonAggregateFunction;
37-
import net.sf.jsqlparser.expression.JsonExpression;
38-
import net.sf.jsqlparser.expression.JsonFunction;
39-
import net.sf.jsqlparser.expression.JsonFunctionExpression;
40-
import net.sf.jsqlparser.expression.KeepExpression;
41-
import net.sf.jsqlparser.expression.LongValue;
42-
import net.sf.jsqlparser.expression.MySQLGroupConcat;
43-
import net.sf.jsqlparser.expression.NextValExpression;
44-
import net.sf.jsqlparser.expression.NotExpression;
45-
import net.sf.jsqlparser.expression.NullValue;
46-
import net.sf.jsqlparser.expression.NumericBind;
47-
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
48-
import net.sf.jsqlparser.expression.OracleHint;
49-
import net.sf.jsqlparser.expression.OracleNamedFunctionParameter;
50-
import net.sf.jsqlparser.expression.Parenthesis;
51-
import net.sf.jsqlparser.expression.RowConstructor;
52-
import net.sf.jsqlparser.expression.RowGetExpression;
53-
import net.sf.jsqlparser.expression.SignedExpression;
54-
import net.sf.jsqlparser.expression.StringValue;
55-
import net.sf.jsqlparser.expression.TimeKeyExpression;
56-
import net.sf.jsqlparser.expression.TimeValue;
57-
import net.sf.jsqlparser.expression.TimestampValue;
58-
import net.sf.jsqlparser.expression.TimezoneExpression;
59-
import net.sf.jsqlparser.expression.UserVariable;
60-
import net.sf.jsqlparser.expression.ValueListExpression;
61-
import net.sf.jsqlparser.expression.VariableAssignment;
62-
import net.sf.jsqlparser.expression.WhenClause;
63-
import net.sf.jsqlparser.expression.XMLSerializeExpr;
16+
import net.sf.jsqlparser.expression.*;
6417
import net.sf.jsqlparser.expression.operators.arithmetic.*;
6518
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
6619
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
@@ -615,6 +568,11 @@ public void visit(AllTableColumns allTableColumns) {
615568

616569
}
617570

571+
@Override
572+
public void visit(AllValue allValue) {
573+
574+
}
575+
618576
@Override
619577
public void visit(SelectExpressionItem item) {
620578
item.getExpression().accept(this);

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

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,55 +13,7 @@
1313
import java.util.List;
1414
import static java.util.stream.Collectors.joining;
1515

16-
import net.sf.jsqlparser.expression.AnalyticExpression;
17-
import net.sf.jsqlparser.expression.AnalyticType;
18-
import net.sf.jsqlparser.expression.AnyComparisonExpression;
19-
import net.sf.jsqlparser.expression.ArrayExpression;
20-
import net.sf.jsqlparser.expression.ArrayConstructor;
21-
import net.sf.jsqlparser.expression.BinaryExpression;
22-
import net.sf.jsqlparser.expression.CaseExpression;
23-
import net.sf.jsqlparser.expression.CastExpression;
24-
import net.sf.jsqlparser.expression.CollateExpression;
25-
import net.sf.jsqlparser.expression.ConnectByRootOperator;
26-
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
27-
import net.sf.jsqlparser.expression.DateValue;
28-
import net.sf.jsqlparser.expression.DoubleValue;
29-
import net.sf.jsqlparser.expression.Expression;
30-
import net.sf.jsqlparser.expression.ExpressionVisitor;
31-
import net.sf.jsqlparser.expression.ExtractExpression;
32-
import net.sf.jsqlparser.expression.Function;
33-
import net.sf.jsqlparser.expression.HexValue;
34-
import net.sf.jsqlparser.expression.IntervalExpression;
35-
import net.sf.jsqlparser.expression.JdbcNamedParameter;
36-
import net.sf.jsqlparser.expression.JdbcParameter;
37-
import net.sf.jsqlparser.expression.JsonAggregateFunction;
38-
import net.sf.jsqlparser.expression.JsonExpression;
39-
import net.sf.jsqlparser.expression.JsonFunction;
40-
import net.sf.jsqlparser.expression.KeepExpression;
41-
import net.sf.jsqlparser.expression.LongValue;
42-
import net.sf.jsqlparser.expression.MySQLGroupConcat;
43-
import net.sf.jsqlparser.expression.NextValExpression;
44-
import net.sf.jsqlparser.expression.NotExpression;
45-
import net.sf.jsqlparser.expression.NullValue;
46-
import net.sf.jsqlparser.expression.NumericBind;
47-
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
48-
import net.sf.jsqlparser.expression.OracleHint;
49-
import net.sf.jsqlparser.expression.OracleNamedFunctionParameter;
50-
import net.sf.jsqlparser.expression.Parenthesis;
51-
import net.sf.jsqlparser.expression.RowConstructor;
52-
import net.sf.jsqlparser.expression.RowGetExpression;
53-
import net.sf.jsqlparser.expression.SignedExpression;
54-
import net.sf.jsqlparser.expression.StringValue;
55-
import net.sf.jsqlparser.expression.TimeKeyExpression;
56-
import net.sf.jsqlparser.expression.TimeValue;
57-
import net.sf.jsqlparser.expression.TimestampValue;
58-
import net.sf.jsqlparser.expression.TimezoneExpression;
59-
import net.sf.jsqlparser.expression.UserVariable;
60-
import net.sf.jsqlparser.expression.ValueListExpression;
61-
import net.sf.jsqlparser.expression.VariableAssignment;
62-
import net.sf.jsqlparser.expression.WhenClause;
63-
import net.sf.jsqlparser.expression.WindowElement;
64-
import net.sf.jsqlparser.expression.XMLSerializeExpr;
16+
import net.sf.jsqlparser.expression.*;
6517
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
6618
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd;
6719
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift;
@@ -1038,4 +990,9 @@ public void visit(AllColumns allColumns) {
1038990
public void visit(AllTableColumns allTableColumns) {
1039991
buffer.append(allTableColumns.toString());
1040992
}
993+
994+
@Override
995+
public void visit(AllValue allValue) {
996+
buffer.append(allValue);
997+
}
1041998
}

0 commit comments

Comments
 (0)