Skip to content

Commit bc005f8

Browse files
committed
fixes #462
1 parent 5871c57 commit bc005f8

File tree

5 files changed

+66
-34
lines changed

5 files changed

+66
-34
lines changed

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@
2121
*/
2222
package net.sf.jsqlparser.statement.select;
2323

24+
import net.sf.jsqlparser.expression.JdbcParameter;
25+
2426
/**
2527
* A fetch clause in the form FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY
2628
*/
2729
public class Fetch {
2830

2931
private long rowCount;
30-
private boolean fetchJdbcParameter = false;
32+
private JdbcParameter fetchJdbcParameter = null;
3133
private boolean isFetchParamFirst = false;
3234
private String fetchParam = "ROW";
3335

@@ -39,7 +41,7 @@ public void setRowCount(long l) {
3941
rowCount = l;
4042
}
4143

42-
public boolean isFetchJdbcParameter() {
44+
public JdbcParameter getFetchJdbcParameter() {
4345
return fetchJdbcParameter;
4446
}
4547

@@ -51,8 +53,8 @@ public boolean isFetchParamFirst() {
5153
return isFetchParamFirst;
5254
}
5355

54-
public void setFetchJdbcParameter(boolean b) {
55-
fetchJdbcParameter = b;
56+
public void setFetchJdbcParameter(JdbcParameter jdbc) {
57+
fetchJdbcParameter = jdbc;
5658
}
5759

5860
public void setFetchParam(String s) {
@@ -65,7 +67,8 @@ public void setFetchParamFirst(boolean b) {
6567

6668
@Override
6769
public String toString() {
68-
return " FETCH " + (isFetchParamFirst ? "FIRST" : "NEXT") + " " + (fetchJdbcParameter ? "?" : Long.
69-
toString(rowCount)) + " " + fetchParam + " ONLY";
70+
return " FETCH " + (isFetchParamFirst ? "FIRST" : "NEXT") + " "
71+
+ (fetchJdbcParameter!=null ? fetchJdbcParameter.toString() :
72+
Long.toString(rowCount)) + " " + fetchParam + " ONLY";
7073
}
7174
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@
2121
*/
2222
package net.sf.jsqlparser.statement.select;
2323

24+
import net.sf.jsqlparser.expression.JdbcParameter;
25+
2426
/**
2527
* An offset clause in the form OFFSET offset or in the form OFFSET offset (ROW | ROWS)
2628
*/
2729
public class Offset {
2830

2931
private long offset;
30-
private boolean offsetJdbcParameter = false;
32+
private JdbcParameter offsetJdbcParameter = null;
3133
private String offsetParam = null;
3234

3335
public long getOffset() {
@@ -46,16 +48,16 @@ public void setOffsetParam(String s) {
4648
offsetParam = s;
4749
}
4850

49-
public boolean isOffsetJdbcParameter() {
51+
public JdbcParameter getOffsetJdbcParameter() {
5052
return offsetJdbcParameter;
5153
}
5254

53-
public void setOffsetJdbcParameter(boolean b) {
54-
offsetJdbcParameter = b;
55+
public void setOffsetJdbcParameter(JdbcParameter jdbc) {
56+
offsetJdbcParameter = jdbc;
5557
}
5658

5759
@Override
5860
public String toString() {
59-
return " OFFSET " + (offsetJdbcParameter ? "?" : offset) + (offsetParam != null ? " " + offsetParam : "");
61+
return " OFFSET " + (offsetJdbcParameter!=null ? offsetJdbcParameter.toString() : offset) + (offsetParam != null ? " " + offsetParam : "");
6062
}
6163
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,8 @@ public void visit(PivotXml pivot) {
280280
public void deparseOffset(Offset offset) {
281281
// OFFSET offset
282282
// or OFFSET offset (ROW | ROWS)
283-
if (offset.isOffsetJdbcParameter()) {
284-
buffer.append(" OFFSET ?");
283+
if (offset.getOffsetJdbcParameter()!=null) {
284+
buffer.append(" OFFSET ").append(offset.getOffsetJdbcParameter());
285285
} else if (offset.getOffset() != 0) {
286286
buffer.append(" OFFSET ");
287287
buffer.append(offset.getOffset());
@@ -300,8 +300,8 @@ public void deparseFetch(Fetch fetch) {
300300
} else {
301301
buffer.append("NEXT ");
302302
}
303-
if (fetch.isFetchJdbcParameter()) {
304-
buffer.append("?");
303+
if (fetch.getFetchJdbcParameter()!=null) {
304+
buffer.append(fetch.getFetchJdbcParameter().toString());
305305
} else {
306306
buffer.append(fetch.getRowCount());
307307
}

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

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ options{
3333
JDK_VERSION = "1.7";
3434
TOKEN_EXTENDS ="BaseToken";
3535
COMMON_TOKEN_ACTION=true;
36-
LEGACY_EXCEPTION_HANDLING = false;
3736
}
3837

3938
PARSER_BEGIN(CCJSqlParser)
@@ -1708,10 +1707,22 @@ OrderByElement OrderByElement():
17081707
}
17091708
}
17101709

1710+
JdbcParameter SimpleJdbcParameter() : {
1711+
JdbcParameter retval;
1712+
}
1713+
{
1714+
"?" { retval = new JdbcParameter(++jdbcParameterIndex, false); }
1715+
[ LOOKAHEAD(2) token = <S_LONG> { retval.setUseFixedIndex(true); retval.setIndex(Integer.valueOf(token.image)); } ]
1716+
{
1717+
return retval;
1718+
}
1719+
}
1720+
17111721
Limit LimitWithOffset() #LimitWithOffset:
17121722
{
17131723
Limit limit = new Limit();
17141724
Token token = null;
1725+
JdbcParameter jdbc = null;
17151726
}
17161727
{
17171728
(
@@ -1721,7 +1732,7 @@ Limit LimitWithOffset() #LimitWithOffset:
17211732
(
17221733
token=<S_LONG> { limit.setOffset(new LongValue(token.image)); }
17231734
|
1724-
"?" { limit.setOffset(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getOffset()).setUseFixedIndex(true); ((JdbcParameter)limit.getOffset()).setIndex(Integer.valueOf(token.image)); } ]
1735+
jdbc = SimpleJdbcParameter() { limit.setOffset(jdbc); }
17251736
|
17261737
":" { limit.setOffset(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getOffset()).setName(token.image); } ]
17271738

@@ -1731,7 +1742,7 @@ Limit LimitWithOffset() #LimitWithOffset:
17311742
(
17321743
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
17331744
|
1734-
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1745+
jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); }
17351746
|
17361747
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
17371748
)
@@ -1748,14 +1759,15 @@ Limit PlainLimit() #PlainLimit:
17481759
{
17491760
Limit limit = new Limit();
17501761
Token token = null;
1762+
JdbcParameter jdbc;
17511763
}
17521764
{
17531765
// mysql-postgresql-> LIMIT (row_count | ALL | NULL)
17541766
<K_LIMIT>
17551767
(
17561768
token=<S_LONG> { limit.setRowCount(new LongValue(token.image)); }
17571769
|
1758-
"?" { limit.setRowCount(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)limit.getRowCount()).setUseFixedIndex(true); ((JdbcParameter)limit.getRowCount()).setIndex(Integer.valueOf(token.image)); } ]
1770+
jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); }
17591771
|
17601772
":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)limit.getRowCount()).setName(token.image); } ]
17611773
|
@@ -1773,14 +1785,15 @@ Offset Offset():
17731785
{
17741786
Offset offset = new Offset();
17751787
Token token = null;
1788+
JdbcParameter jdbc;
17761789
}
17771790
{
17781791
(
17791792
// postgresql-> OFFSET offset
17801793
// sqlserver-oracle-> OFFSET offset (ROW | ROWS)
17811794
<K_OFFSET>
17821795
(token=<S_LONG> { offset.setOffset(Long.parseLong(token.image)); }
1783-
| "?" { offset.setOffsetJdbcParameter(true); } )
1796+
| jdbc = SimpleJdbcParameter() { offset.setOffsetJdbcParameter(jdbc); } )
17841797
[(<K_ROWS> { offset.setOffsetParam("ROWS"); } | <K_ROW> { offset.setOffsetParam("ROW"); })]
17851798

17861799
)
@@ -1793,14 +1806,15 @@ Fetch Fetch():
17931806
{
17941807
Fetch fetch = new Fetch();
17951808
Token token = null;
1809+
JdbcParameter jdbc;
17961810
}
17971811
{
17981812
(
17991813
// sqlserver-oracle-> FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY
18001814
<K_FETCH>
18011815
(<K_FIRST> { fetch.setFetchParamFirst(true); } | <K_NEXT>)
18021816
(token=<S_LONG> { fetch.setRowCount(Long.parseLong(token.image)); }
1803-
| "?" { fetch.setFetchJdbcParameter(true); } )
1817+
| jdbc = SimpleJdbcParameter() { fetch.setFetchJdbcParameter(jdbc); } ) /* "?" { fetch.setFetchJdbcParameter(true); } ) */
18041818
(<K_ROWS> { fetch.setFetchParam("ROWS"); } | <K_ROW>)
18051819
<K_ONLY>
18061820

@@ -1816,13 +1830,15 @@ Top Top():
18161830
Top top = new Top();
18171831
Token token = null;
18181832
Expression expr = null;
1833+
JdbcParameter jdbc = null;
18191834
}
18201835
{
18211836
<K_TOP>
18221837
(
18231838
token=<S_LONG> { top.setExpression(new LongValue(token.image)); }
18241839
|
1825-
"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]
1840+
jdbc = SimpleJdbcParameter() { top.setExpression(jdbc); }
1841+
/*"?" { top.setExpression(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { ((JdbcParameter)(top.getExpression())).setUseFixedIndex(true); ((JdbcParameter)(top.getExpression())).setIndex(Integer.valueOf(token.image)); } ]*/
18261842
|
18271843
":" { top.setExpression(new JdbcNamedParameter()); } [ LOOKAHEAD(2) token = <S_IDENTIFIER> { ((JdbcNamedParameter)top.getExpression()).setName(token.image); } ]
18281844
|
@@ -1841,13 +1857,15 @@ Skip Skip():
18411857
{
18421858
Skip skip = new Skip();
18431859
Token token = null;
1860+
JdbcParameter jdbc;
18441861
}
18451862
{
18461863
<K_SKIP>
18471864
(
18481865
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
18491866
| token=<S_IDENTIFIER> { skip.setVariable(token.image); }
1850-
| "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1867+
| jdbc = SimpleJdbcParameter() { skip.setJdbcParameter(jdbc); }
1868+
/* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */
18511869
)
18521870
{
18531871
return skip;
@@ -1875,6 +1893,7 @@ First First():
18751893
{
18761894
First first = new First();
18771895
Token token = null;
1896+
JdbcParameter jdbc;
18781897
}
18791898
{
18801899
( <K_FIRST> { first.setKeyword(First.Keyword.FIRST); }
@@ -1883,7 +1902,8 @@ First First():
18831902
(
18841903
token=<S_LONG> { first.setRowCount(Long.parseLong(token.image)); }
18851904
| token=<S_IDENTIFIER> { first.setVariable(token.image); }
1886-
| "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
1905+
| jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); }
1906+
/* "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */
18871907
)
18881908
{
18891909
return first;
@@ -2406,8 +2426,7 @@ Expression PrimaryExpression() #PrimaryExpression:
24062426

24072427
| retval=CaseWhenExpression()
24082428

2409-
| "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); }
2410-
[ token = <S_LONG> { ((JdbcParameter)retval).setUseFixedIndex(true); ((JdbcParameter)retval).setIndex(Integer.valueOf(token.image)); } ]
2429+
| retval = SimpleJdbcParameter()
24112430

24122431
| LOOKAHEAD(2) retval=JdbcNamedParameter()
24132432

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ public void testLimit() throws JSQLParserException {
238238

239239
assertNull(((PlainSelect) select.getSelectBody()).getLimit());
240240
assertNotNull(((PlainSelect) select.getSelectBody()).getOffset());
241-
assertTrue(((PlainSelect) select.getSelectBody()).getOffset().isOffsetJdbcParameter());
241+
assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetJdbcParameter().toString());
242242
assertStatementCanBeDeparsedAs(select, statement);
243243

244244
statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
@@ -310,7 +310,7 @@ public void testLimit2() throws JSQLParserException {
310310

311311
assertNull(((PlainSelect) select.getSelectBody()).getLimit());
312312
assertNotNull(((PlainSelect) select.getSelectBody()).getOffset());
313-
assertTrue(((PlainSelect) select.getSelectBody()).getOffset().isOffsetJdbcParameter());
313+
assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetJdbcParameter().toString());
314314
assertStatementCanBeDeparsedAs(select, statement);
315315

316316
statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
@@ -452,8 +452,8 @@ public void testLimitSqlServer1() throws JSQLParserException {
452452
assertNotNull(((PlainSelect) select.getSelectBody()).getFetch());
453453
assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam());
454454
assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst());
455-
assertFalse(((PlainSelect) select.getSelectBody()).getOffset().isOffsetJdbcParameter());
456-
assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchJdbcParameter());
455+
assertNull(((PlainSelect) select.getSelectBody()).getOffset().getOffsetJdbcParameter());
456+
assertNull(((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter());
457457
assertEquals(3, ((PlainSelect) select.getSelectBody()).getOffset().getOffset());
458458
assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount());
459459
assertStatementCanBeDeparsedAs(select, statement);
@@ -512,15 +512,23 @@ public void testLimitSqlServerJdbcParameters() throws JSQLParserException {
512512
assertNotNull(((PlainSelect) select.getSelectBody()).getFetch());
513513
assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam());
514514
assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst());
515-
assertTrue(((PlainSelect) select.getSelectBody()).getOffset().isOffsetJdbcParameter());
516-
assertTrue(((PlainSelect) select.getSelectBody()).getFetch().isFetchJdbcParameter());
515+
assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetJdbcParameter().toString());
516+
assertEquals("?", ((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter().toString());
517517
assertStatementCanBeDeparsedAs(select, statement);
518518
}
519519

520520
public void testLimitPR404() throws JSQLParserException {
521521
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1");
522522
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :param_name");
523523
}
524+
525+
public void testLimitOffsetIssue462() throws JSQLParserException {
526+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable LIMIT ?1");
527+
}
528+
529+
public void testLimitOffsetIssue462_2() throws JSQLParserException {
530+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable LIMIT ?1 OFFSET ?2");
531+
}
524532

525533
public void testTop() throws JSQLParserException {
526534
String statement = "SELECT TOP 3 * FROM mytable WHERE mytable.col = 9";
@@ -1991,7 +1999,7 @@ public void testRegexpBinaryMySQL() throws JSQLParserException {
19911999
String stmt = "SELECT * FROM mytable WHERE first_name REGEXP BINARY '^Ste(v|ph)en$'";
19922000
assertSqlCanBeParsedAndDeparsed(stmt);
19932001
}
1994-
2002+
19952003
public void testRlike() throws JSQLParserException {
19962004
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE first_name RLIKE '^Ste(v|ph)en$'");
19972005
}
@@ -2708,7 +2716,7 @@ public void testIssue522_3() throws JSQLParserException {
27082716
public void testIssue522_4() throws JSQLParserException {
27092717
assertSqlCanBeParsedAndDeparsed("SELECT CASE a + b WHEN -1 * 5 THEN 1 ELSE CASE b + c WHEN -1 * 6 THEN 2 ELSE 3 END END");
27102718
}
2711-
2719+
27122720
public void testIssue554() throws JSQLParserException {
27132721
assertSqlCanBeParsedAndDeparsed("SELECT T.INDEX AS INDEX133_ FROM myTable T");
27142722
}

0 commit comments

Comments
 (0)