Skip to content

Commit 284ec72

Browse files
committed
added ability to parse named parameters
1 parent 6ab7559 commit 284ec72

File tree

6 files changed

+142
-1
lines changed

6 files changed

+142
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public interface ExpressionVisitor {
5656
void visit(InverseExpression inverseExpression);
5757

5858
void visit(JdbcParameter jdbcParameter);
59+
60+
void visit(JdbcNamedParameter jdbcNamedParameter);
5961

6062
void visit(DoubleValue doubleValue);
6163

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2013 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
/*
23+
* Copyright (C) 2013 JSQLParser.
24+
*
25+
* This library is free software; you can redistribute it and/or
26+
* modify it under the terms of the GNU Lesser General Public
27+
* License as published by the Free Software Foundation; either
28+
* version 2.1 of the License, or (at your option) any later version.
29+
*
30+
* This library is distributed in the hope that it will be useful,
31+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
32+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33+
* Lesser General Public License for more details.
34+
*
35+
* You should have received a copy of the GNU Lesser General Public
36+
* License along with this library; if not, write to the Free Software
37+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
38+
* MA 02110-1301 USA
39+
*/
40+
package net.sf.jsqlparser.expression;
41+
42+
/**
43+
*
44+
* @author aud
45+
*/
46+
public class JdbcNamedParameter implements Expression {
47+
48+
private String name;
49+
50+
/**
51+
* The name of the function, i.e. "MAX"
52+
*
53+
* @return the name of the parameter
54+
*/
55+
public String getName() {
56+
return name;
57+
}
58+
59+
public void setName(String name) {
60+
this.name = name;
61+
}
62+
63+
@Override
64+
public void accept(ExpressionVisitor expressionVisitor) {
65+
expressionVisitor.visit(this);
66+
}
67+
68+
@Override
69+
public String toString() {
70+
return ":"+name;
71+
}
72+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import net.sf.jsqlparser.expression.Function;
3838
import net.sf.jsqlparser.expression.IntervalExpression;
3939
import net.sf.jsqlparser.expression.InverseExpression;
40+
import net.sf.jsqlparser.expression.JdbcNamedParameter;
4041
import net.sf.jsqlparser.expression.JdbcParameter;
4142
import net.sf.jsqlparser.expression.LongValue;
4243
import net.sf.jsqlparser.expression.NullValue;
@@ -496,4 +497,8 @@ private void init() {
496497
@Override
497498
public void visit(IntervalExpression iexpr) {
498499
}
500+
501+
@Override
502+
public void visit(JdbcNamedParameter jdbcNamedParameter) {
503+
}
499504
}

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

100755100644
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,4 +477,9 @@ public void visit(MultiExpressionList multiExprList) {
477477
public void visit(IntervalExpression iexpr) {
478478
buffer.append(iexpr.toString());
479479
}
480+
481+
@Override
482+
public void visit(JdbcNamedParameter jdbcNamedParameter) {
483+
buffer.append(jdbcNamedParameter.toString());
484+
}
480485
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ import net.sf.jsqlparser.expression.Function;
6666
import net.sf.jsqlparser.expression.InverseExpression;
6767
import net.sf.jsqlparser.expression.IntervalExpression;
6868
import net.sf.jsqlparser.expression.JdbcParameter;
69+
import net.sf.jsqlparser.expression.JdbcNamedParameter;
6970
import net.sf.jsqlparser.expression.LongValue;
7071
import net.sf.jsqlparser.expression.DateValue;
7172
import net.sf.jsqlparser.expression.TimeValue;
@@ -1143,6 +1144,7 @@ Limit Limit():
11431144
token=<S_INTEGER> { limit.setOffset(Long.parseLong(token.image)); }
11441145
|
11451146
"?" { limit.setOffsetJdbcParameter(true);}
1147+
11461148
)
11471149
","
11481150

@@ -1677,6 +1679,8 @@ Expression PrimaryExpression():
16771679

16781680
| "?" { retval = new JdbcParameter(); }
16791681

1682+
| LOOKAHEAD(JdbcNamedParameter()) retval=JdbcNamedParameter()
1683+
16801684
| LOOKAHEAD(AnalyticExpression()) retval=AnalyticExpression()
16811685

16821686
| LOOKAHEAD(ExtractExpression()) retval=ExtractExpression()
@@ -1722,6 +1726,17 @@ Expression PrimaryExpression():
17221726
}
17231727
}
17241728

1729+
JdbcNamedParameter JdbcNamedParameter() : {
1730+
JdbcNamedParameter parameter = new JdbcNamedParameter();
1731+
Token token;
1732+
}
1733+
{
1734+
":" token=<S_IDENTIFIER> { parameter.setName(token.image); }
1735+
{
1736+
return parameter;
1737+
}
1738+
}
1739+
17251740
IntervalExpression IntervalExpression() : {
17261741
IntervalExpression interval = new IntervalExpression();
17271742
Token token;

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

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1057,9 +1057,51 @@ public void testRegexpLike2() throws JSQLParserException {
10571057
assertSqlCanBeParsedAndDeparsed(stmt);
10581058
}
10591059

1060-
public void testBooleanFunction1() throws JSQLParserException {
1060+
public void testBooleanFunction1() throws JSQLParserException {
10611061
String stmt = "SELECT * FROM mytable WHERE test_func(col1)";
10621062
assertSqlCanBeParsedAndDeparsed(stmt);
10631063
}
1064+
1065+
public void testNamedParameter() throws JSQLParserException {
1066+
String stmt = "SELECT * FROM mytable WHERE b = :param";
1067+
assertSqlCanBeParsedAndDeparsed(stmt);
10641068

1069+
Statement st = CCJSqlParserUtil.parse(stmt);
1070+
Select select = (Select) st;
1071+
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
1072+
Expression exp = ((BinaryExpression) plainSelect.getWhere()).getRightExpression();
1073+
assertTrue(exp instanceof JdbcNamedParameter);
1074+
JdbcNamedParameter namedParameter = (JdbcNamedParameter) exp;
1075+
assertEquals("param", namedParameter.getName());
1076+
1077+
}
1078+
public void testNamedParameter2() throws JSQLParserException {
1079+
String stmt = "SELECT * FROM mytable WHERE a = :param OR a = :param2 AND b = :param3";
1080+
assertSqlCanBeParsedAndDeparsed(stmt);
1081+
1082+
Statement st = CCJSqlParserUtil.parse(stmt);
1083+
Select select = (Select) st;
1084+
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
1085+
1086+
Expression exp_l = ((BinaryExpression) plainSelect.getWhere()).getLeftExpression();
1087+
Expression exp_r = ((BinaryExpression) plainSelect.getWhere()).getRightExpression();
1088+
Expression exp_rl = ((BinaryExpression) exp_r).getLeftExpression();
1089+
Expression exp_rr = ((BinaryExpression) exp_r).getRightExpression();
1090+
1091+
Expression exp_param1 = ((BinaryExpression) exp_l).getRightExpression();
1092+
Expression exp_param2 = ((BinaryExpression) exp_rl).getRightExpression();
1093+
Expression exp_param3 = ((BinaryExpression) exp_rr).getRightExpression();
1094+
1095+
assertTrue(exp_param1 instanceof JdbcNamedParameter);
1096+
assertTrue(exp_param2 instanceof JdbcNamedParameter);
1097+
assertTrue(exp_param3 instanceof JdbcNamedParameter);
1098+
1099+
JdbcNamedParameter namedParameter1 = (JdbcNamedParameter) exp_param1;
1100+
JdbcNamedParameter namedParameter2 = (JdbcNamedParameter) exp_param2;
1101+
JdbcNamedParameter namedParameter3 = (JdbcNamedParameter) exp_param3;
1102+
1103+
assertEquals("param", namedParameter1.getName());
1104+
assertEquals("param2", namedParameter2.getName());
1105+
assertEquals("param3", namedParameter3.getName());
1106+
}
10651107
}

0 commit comments

Comments
 (0)