Skip to content

Commit 76a7d61

Browse files
committed
Merge origin/master
2 parents 4fe4ce2 + c2e21a6 commit 76a7d61

File tree

4 files changed

+40
-15
lines changed

4 files changed

+40
-15
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@
2727
public class JdbcParameter implements Expression {
2828

2929
private Integer index;
30+
private boolean useFixedIndex = false;
31+
32+
public JdbcParameter() {
33+
}
34+
35+
public JdbcParameter(Integer index, boolean useFixedIndex) {
36+
this.index = index;
37+
this.useFixedIndex = useFixedIndex;
38+
}
3039

3140
public Integer getIndex() {
3241
return index;
@@ -36,13 +45,21 @@ public void setIndex(Integer index) {
3645
this.index = index;
3746
}
3847

48+
public boolean isUseFixedIndex() {
49+
return useFixedIndex;
50+
}
51+
52+
public void setUseFixedIndex(boolean useFixedIndex) {
53+
this.useFixedIndex = useFixedIndex;
54+
}
55+
3956
@Override
4057
public void accept(ExpressionVisitor expressionVisitor) {
4158
expressionVisitor.visit(this);
4259
}
4360

4461
@Override
4562
public String toString() {
46-
return "?" + (index == null ? "" : index);
63+
return useFixedIndex ? "?" + index : "?";
4764
}
4865
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public void visit(IsNullExpression isNullExpression) {
187187
@Override
188188
public void visit(JdbcParameter jdbcParameter) {
189189
buffer.append("?");
190-
if (jdbcParameter.getIndex() != null) {
190+
if (jdbcParameter.isUseFixedIndex()) {
191191
buffer.append(jdbcParameter.getIndex());
192192
}
193193

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ import java.util.*;
8080
* The parser generated by JavaCC
8181
*/
8282
public class CCJSqlParser {
83+
int jdbcParameterIndex = 0;
8384
boolean errorRecovery = false;
8485
List<ParseException> parseErrors = new ArrayList<ParseException>();
8586

@@ -1458,7 +1459,7 @@ Limit LimitWithOffset():
14581459
(
14591460
token=<S_LONG> { limit.setOffset(new LongValue(token.image)); }
14601461
|
1461-
"?" { limit.setOffset(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getOffset()).setIndex(Integer.valueOf(token.image)); } ]
1462+
"?" { limit.setOffset(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getOffset()).setUseFixedIndex(true); ((JdbcParameter)limit.getOffset()).setIndex(Integer.valueOf(token.image)); } ]
14621463
|
14631464
":" { limit.setOffset(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getOffset()).setName(token.image); } ]
14641465

@@ -1468,7 +1469,7 @@ Limit LimitWithOffset():
14681469
(
14691470
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
14701471
|
1471-
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1472+
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
14721473
|
14731474
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14741475
)
@@ -1491,7 +1492,7 @@ Limit PlainLimit():
14911492
(
14921493
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
14931494
|
1494-
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1495+
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
14951496
|
14961497
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14971498
|
@@ -1557,7 +1558,7 @@ Top Top():
15571558
(
15581559
token=<S_LONG> { top.setExpression(new LongValue(token.image)); }
15591560
|
1560-
"?" { top.setExpression(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
1561+
"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
15611562
|
15621563
":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ]
15631564
|
@@ -1582,7 +1583,7 @@ Skip Skip():
15821583
(
15831584
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
15841585
| token=<S_IDENTIFIER> { skip.setVariable(token.image); }
1585-
| "?" { skip.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1586+
| "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
15861587
)
15871588
{
15881589
return skip;
@@ -1618,7 +1619,7 @@ First First():
16181619
(
16191620
token=<S_LONG> { first.setRowCount(Long.parseLong(token.image)); }
16201621
| token=<S_IDENTIFIER> { first.setVariable(token.image); }
1621-
| "?" { first.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1622+
| "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
16221623
)
16231624
{
16241625
return first;
@@ -2131,7 +2132,7 @@ Expression PrimaryExpression():
21312132

21322133
| retval=CaseWhenExpression()
21332134

2134-
| LOOKAHEAD(3) [sign="+" | sign="-"] "?" { retval = new JdbcParameter(); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)retval).setIndex(Integer.valueOf(token.image)); } ]
2135+
| LOOKAHEAD(3) [sign="+" | sign="-"] "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)retval).setUseFixedIndex(true); ((JdbcParameter)retval).setIndex(Integer.valueOf(token.image)); } ]
21352136

21362137
| LOOKAHEAD(3) [sign="+" | sign="-"] retval=JdbcNamedParameter()
21372138

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ public void testLimit2() throws JSQLParserException {
271271
Expression rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount();
272272

273273
assertEquals(3, ((LongValue)offset).getValue());
274-
assertNull(((JdbcParameter)rowCount).getIndex());
274+
assertNotNull(((JdbcParameter)rowCount).getIndex());
275+
assertFalse(((JdbcParameter)rowCount).isUseFixedIndex());
275276
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
276277
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull());
277278

@@ -362,15 +363,18 @@ public void testLimit3() throws JSQLParserException {
362363
offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset();
363364
rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount();
364365
assertEquals(1, ((LongValue)offset).getValue());
365-
assertNull(((JdbcParameter)rowCount).getIndex());
366+
assertNotNull(((JdbcParameter)rowCount).getIndex());
367+
assertFalse(((JdbcParameter)rowCount).isUseFixedIndex());
366368
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
367369

368370
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?, ?";
369371
select = (Select) parserManager.parse(new StringReader(statement));
370372
offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset();
371373
rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount();
372-
assertNull(((JdbcParameter)offset).getIndex());
373-
assertNull(((JdbcParameter)rowCount).getIndex());
374+
assertNotNull(((JdbcParameter)offset).getIndex());
375+
assertFalse(((JdbcParameter)offset).isUseFixedIndex());
376+
assertNotNull(((JdbcParameter)rowCount).getIndex());
377+
assertFalse(((JdbcParameter)rowCount).isUseFixedIndex());
374378
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
375379
}
376380

@@ -542,7 +546,8 @@ public void testTopWithJdbcParameter() throws JSQLParserException {
542546

543547
statement = "select top ? foo from bar";
544548
select = (Select) parserManager.parse(new StringReader(statement));
545-
assertNull(((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()).getIndex());
549+
assertNotNull(((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()).getIndex());
550+
assertFalse(((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()).isUseFixedIndex());
546551
}
547552

548553
public void testSkip() throws JSQLParserException {
@@ -632,7 +637,8 @@ public void testFirstWithKeywordLimit() throws JSQLParserException {
632637
final First limit = selectBody.getFirst();
633638
assertNull(limit.getRowCount());
634639
assertNotNull(limit.getJdbcParameter());
635-
assertNull(limit.getJdbcParameter().getIndex());
640+
assertNotNull(limit.getJdbcParameter().getIndex());
641+
assertFalse(limit.getJdbcParameter().isUseFixedIndex());
636642
assertEquals(First.Keyword.LIMIT, limit.getKeyword());
637643

638644
final List<SelectItem> selectItems = selectBody.getSelectItems();
@@ -652,6 +658,7 @@ public void testSkipFirst() throws JSQLParserException {
652658
final Skip skip = selectBody.getSkip();
653659
assertNotNull(skip.getJdbcParameter());
654660
assertNotNull(skip.getJdbcParameter().getIndex());
661+
assertTrue(skip.getJdbcParameter().isUseFixedIndex());
655662
assertEquals((int) 1, (int) skip.getJdbcParameter().getIndex());
656663
assertNull(skip.getVariable());
657664
final First first = selectBody.getFirst();

0 commit comments

Comments
 (0)