Skip to content

Commit 45132a7

Browse files
committed
fixes #129
1 parent 70f5fee commit 45132a7

File tree

4 files changed

+28
-12
lines changed

4 files changed

+28
-12
lines changed

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,27 @@
2222
package net.sf.jsqlparser.expression;
2323

2424
/**
25-
* A '?' in a statement
25+
* A '?' in a statement or a ?<number> e.g. ?4
2626
*/
2727
public class JdbcParameter implements Expression {
2828

29-
@Override
30-
public void accept(ExpressionVisitor expressionVisitor) {
31-
expressionVisitor.visit(this);
32-
}
29+
private Integer index;
3330

34-
@Override
35-
public String toString() {
36-
return "?";
37-
}
31+
public Integer getIndex() {
32+
return index;
33+
}
34+
35+
public void setIndex(Integer index) {
36+
this.index = index;
37+
}
38+
39+
@Override
40+
public void accept(ExpressionVisitor expressionVisitor) {
41+
expressionVisitor.visit(this);
42+
}
43+
44+
@Override
45+
public String toString() {
46+
return "?" + (index == null ? "" : index);
47+
}
3848
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,15 @@ public void visit(IsNullExpression isNullExpression) {
177177
@Override
178178
public void visit(JdbcParameter jdbcParameter) {
179179
buffer.append("?");
180+
if (jdbcParameter.getIndex() != null) {
181+
buffer.append(jdbcParameter.getIndex());
182+
}
180183

181184
}
182185

183186
@Override
184187
public void visit(LikeExpression likeExpression) {
185-
visitBinaryExpression(likeExpression, likeExpression.isCaseInsensitive()?" ILIKE ":" LIKE ");
188+
visitBinaryExpression(likeExpression, likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ");
186189
String escape = likeExpression.getEscape();
187190
if (escape != null) {
188191
buffer.append(" ESCAPE '").append(escape).append('\'');

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,7 @@ Top Top():
12771277
| "?" { top.setRowCountJdbcParameter(true);} )
12781278
{ top.setParenthesis(true);}
12791279
")"
1280-
) [ <K_PERCENT> { top.setPercentage(true); } ]
1280+
) [ LOOKAHEAD(2) <K_PERCENT> { top.setPercentage(true); } ]
12811281
{
12821282
return top;
12831283
}
@@ -1767,7 +1767,7 @@ Expression PrimaryExpression():
17671767

17681768
| retval=CaseWhenExpression()
17691769

1770-
| "?" { retval = new JdbcParameter(); }
1770+
| "?" { retval = new JdbcParameter(); } [ token = <S_LONG> { ((JdbcParameter)retval).setIndex(Integer.valueOf(token.image)); } ]
17711771

17721772
| LOOKAHEAD(2) retval=JdbcNamedParameter()
17731773

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,4 +1725,7 @@ public void testSelectKeywordPercent() throws JSQLParserException {
17251725
assertSqlCanBeParsedAndDeparsed("SELECT percent FROM MY_TABLE");
17261726
}
17271727

1728+
public void testSelectJPQLPositionalParameter() throws JSQLParserException {
1729+
assertSqlCanBeParsedAndDeparsed("SELECT email FROM users WHERE (type LIKE 'B') AND (username LIKE ?1)");
1730+
}
17281731
}

0 commit comments

Comments
 (0)