Skip to content

Commit fed7c0e

Browse files
authored
Merge pull request #382 from ibeam-cn/master
support to add jdbc name parameter after LIMIT and TOP keywords
2 parents 1abd224 + e25e247 commit fed7c0e

File tree

4 files changed

+143
-84
lines changed

4 files changed

+143
-84
lines changed

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

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,61 +21,35 @@
2121
*/
2222
package net.sf.jsqlparser.statement.select;
2323

24-
import net.sf.jsqlparser.expression.JdbcParameter;
24+
import net.sf.jsqlparser.expression.Expression;
2525

2626
/**
2727
* A limit clause in the form [LIMIT {[offset,] row_count) | (row_count | ALL)
2828
* OFFSET offset}]
2929
*/
3030
public class Limit {
3131

32-
private long offset;
33-
private long rowCount;
34-
private JdbcParameter rowCountJdbcParameter;
35-
private JdbcParameter offsetJdbcParameter;
32+
private Expression rowCount;
33+
private Expression offset;
3634
private boolean limitAll;
3735
private boolean limitNull = false;
3836

39-
public long getOffset() {
37+
public Expression getOffset() {
4038
return offset;
4139
}
4240

43-
public long getRowCount() {
41+
public Expression getRowCount() {
4442
return rowCount;
4543
}
4644

47-
public void setOffset(long l) {
45+
public void setOffset(Expression l) {
4846
offset = l;
4947
}
5048

51-
public void setRowCount(long l) {
49+
public void setRowCount(Expression l) {
5250
rowCount = l;
5351
}
5452

55-
public JdbcParameter getRowCountJdbcParameter() {
56-
return rowCountJdbcParameter;
57-
}
58-
59-
public void setRowCountJdbcParameter(JdbcParameter rowCountJdbcParameter) {
60-
this.rowCountJdbcParameter = rowCountJdbcParameter;
61-
}
62-
63-
public JdbcParameter getOffsetJdbcParameter() {
64-
return offsetJdbcParameter;
65-
}
66-
67-
public void setOffsetJdbcParameter(JdbcParameter offsetJdbcParameter) {
68-
this.offsetJdbcParameter = offsetJdbcParameter;
69-
}
70-
71-
public boolean isRowCountJdbcParameter(){
72-
return null != this.rowCountJdbcParameter;
73-
}
74-
75-
public boolean isOffsetJdbcParameter(){
76-
return null != this.offsetJdbcParameter;
77-
}
78-
7953
/**
8054
* @return true if the limit is "LIMIT ALL [OFFSET ...])
8155
*/
@@ -100,11 +74,11 @@ public String toString() {
10074
if (limitNull) {
10175
retVal += "NULL";
10276
} else {
103-
if (offset > 0 || null != offsetJdbcParameter) {
104-
retVal += (null != offsetJdbcParameter ? offsetJdbcParameter : Long.toString(offset)) + ", ";
77+
if (null != offset) {
78+
retVal += offset + ", ";
10579
}
106-
if ( rowCount >= 0 || null != rowCountJdbcParameter) {
107-
retVal += (null !=rowCountJdbcParameter ? rowCountJdbcParameter : Long.toString(rowCount));
80+
if (null != rowCount) {
81+
retVal += rowCount;
10882
}
10983
}
11084

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,11 @@ public void deParse(Limit limit) {
3636
if (limit.isLimitNull()) {
3737
buffer.append("NULL");
3838
} else {
39-
if (null != limit.getOffsetJdbcParameter()) {
40-
buffer.append(limit.getOffsetJdbcParameter()).append(", ");
41-
} else if (limit.getOffset() != 0) {
39+
if (null != limit.getOffset()) {
4240
buffer.append(limit.getOffset()).append(", ");
4341
}
4442

45-
if (null != limit.getRowCountJdbcParameter()) {
46-
buffer.append(limit.getRowCountJdbcParameter());
47-
} else if (limit.getRowCount() >= 0) {
43+
if (null != limit.getRowCount()) {
4844
buffer.append(limit.getRowCount());
4945
}
5046
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,7 +1447,6 @@ OrderByElement OrderByElement():
14471447
Limit LimitWithOffset():
14481448
{
14491449
Limit limit = new Limit();
1450-
limit.setRowCount(-1l);
14511450
Token token = null;
14521451
}
14531452
{
@@ -1456,17 +1455,21 @@ Limit LimitWithOffset():
14561455
// mysql-> LIMIT offset,row_count
14571456
<K_LIMIT>
14581457
(
1459-
token=<S_LONG> { limit.setOffset(Long.parseLong(token.image)); }
1458+
token=<S_LONG> { limit.setOffset(new LongValue(token.image)); }
14601459
|
1461-
"?" { limit.setOffsetJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getOffsetJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1460+
"?" { limit.setOffset(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getOffset()).setIndex(Integer.valueOf(token.image)); } ]
1461+
|
1462+
":" { limit.setOffset(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getOffset()).setName(token.image); } ]
14621463

14631464
)
14641465
","
14651466

14661467
(
1467-
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
1468+
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
14681469
|
1469-
"?" { limit.setRowCountJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getRowCountJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1470+
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1471+
|
1472+
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14701473
)
14711474
|
14721475
limit = PlainLimit()
@@ -1479,16 +1482,17 @@ Limit LimitWithOffset():
14791482
Limit PlainLimit():
14801483
{
14811484
Limit limit = new Limit();
1482-
limit.setRowCount(-1l);
14831485
Token token = null;
14841486
}
14851487
{
14861488
// mysql-postgresql-> LIMIT (row_count | ALL | NULL)
14871489
<K_LIMIT>
14881490
(
1489-
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
1491+
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
1492+
|
1493+
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
14901494
|
1491-
"?" { limit.setRowCountJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getRowCountJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1495+
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14921496
|
14931497
<K_ALL> { limit.setLimitAll(true);}
14941498
|
@@ -1552,7 +1556,9 @@ Top Top():
15521556
(
15531557
token=<S_LONG> { top.setExpression(new LongValue(token.image)); }
15541558
|
1555-
"?" { top.setExpression(new JdbcParameter()); }
1559+
"?" { top.setExpression(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
1560+
|
1561+
":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ]
15561562
|
15571563
"("
15581564
expr=AdditiveExpression() { top.setExpression(expr); }

0 commit comments

Comments
 (0)