Skip to content

Commit c39edda

Browse files
committed
Merge origin/master
2 parents 5396b2e + e2dc368 commit c39edda

File tree

5 files changed

+49
-15
lines changed

5 files changed

+49
-15
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Also I would like to know about needed examples or documentation stuff.
4444

4545
## Extensions in the latest SNAPSHOT version 0.9.7
4646

47+
* support getting jdbc parameter index
4748
* Removed limitation of LongValue to accept only java.util.Long parsable values.
4849
* introduced NOT without parenthesis for column only conditions
4950
* introduced more complex expressions within CASE - statements

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

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

@@ -1469,7 +1470,7 @@ Limit LimitWithOffset():
14691470
(
14701471
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
14711472
|
1472-
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1473+
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
14731474
|
14741475
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14751476
)
@@ -1492,7 +1493,7 @@ Limit PlainLimit():
14921493
(
14931494
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
14941495
|
1495-
"?" { limit.setRowCount(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1496+
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
14961497
|
14971498
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
14981499
|
@@ -1558,7 +1559,7 @@ Top Top():
15581559
(
15591560
token=<S_LONG> { top.setExpression(new LongValue(token.image)); }
15601561
|
1561-
"?" { top.setExpression(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
1562+
"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
15621563
|
15631564
":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ]
15641565
|
@@ -1583,7 +1584,7 @@ Skip Skip():
15831584
(
15841585
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
15851586
| token=<S_IDENTIFIER> { skip.setVariable(token.image); }
1586-
| "?" { skip.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1587+
| "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
15871588
)
15881589
{
15891590
return skip;
@@ -1619,7 +1620,7 @@ First First():
16191620
(
16201621
token=<S_LONG> { first.setRowCount(Long.parseLong(token.image)); }
16211622
| token=<S_IDENTIFIER> { first.setVariable(token.image); }
1622-
| "?" { first.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1623+
| "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
16231624
)
16241625
{
16251626
return first;
@@ -2132,7 +2133,7 @@ Expression PrimaryExpression():
21322133

21332134
| retval=CaseWhenExpression()
21342135

2135-
| LOOKAHEAD(3) [sign="+" | sign="-"] "?" { retval = new JdbcParameter(); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)retval).setIndex(Integer.valueOf(token.image)); } ]
2136+
| 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)); } ]
21362137

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

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

Lines changed: 21 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();
@@ -2451,4 +2458,12 @@ public void testKeyWorkInsertIssue393() throws JSQLParserException {
24512458
public void testKeyWorkReplaceIssue393() throws JSQLParserException {
24522459
assertSqlCanBeParsedAndDeparsed("SELECT replace(\"aaaabbb\", 4, 4, \"****\")");
24532460
}
2461+
2462+
// public void testSubSelectFailsIssue394() throws JSQLParserException {
2463+
// assertSqlCanBeParsedAndDeparsed("select aa.* , t.* from accenter.all aa, (select a.* from pacioli.emc_plan a) t");
2464+
// }
2465+
//
2466+
// public void testSubSelectFailsIssue394_2() throws JSQLParserException {
2467+
// assertSqlCanBeParsedAndDeparsed("select * from all");
2468+
// }
24542469
}

0 commit comments

Comments
 (0)