Skip to content

Commit 068a85b

Browse files
committed
Merge origin/master
2 parents f7c27ad + c98d3d0 commit 068a85b

File tree

4 files changed

+74
-20
lines changed

4 files changed

+74
-20
lines changed

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

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

24+
import net.sf.jsqlparser.expression.JdbcParameter;
25+
2426
/**
2527
* A limit clause in the form [LIMIT {[offset,] row_count) | (row_count | ALL)
2628
* OFFSET offset}]
@@ -29,8 +31,8 @@ public class Limit {
2931

3032
private long offset;
3133
private long rowCount;
32-
private boolean rowCountJdbcParameter = false;
33-
private boolean offsetJdbcParameter = false;
34+
private JdbcParameter rowCountJdbcParameter;
35+
private JdbcParameter offsetJdbcParameter;
3436
private boolean limitAll;
3537
private boolean limitNull = false;
3638

@@ -50,20 +52,28 @@ public void setRowCount(long l) {
5052
rowCount = l;
5153
}
5254

53-
public boolean isOffsetJdbcParameter() {
55+
public JdbcParameter getRowCountJdbcParameter() {
56+
return rowCountJdbcParameter;
57+
}
58+
59+
public void setRowCountJdbcParameter(JdbcParameter rowCountJdbcParameter) {
60+
this.rowCountJdbcParameter = rowCountJdbcParameter;
61+
}
62+
63+
public JdbcParameter getOffsetJdbcParameter() {
5464
return offsetJdbcParameter;
5565
}
5666

57-
public boolean isRowCountJdbcParameter() {
58-
return rowCountJdbcParameter;
67+
public void setOffsetJdbcParameter(JdbcParameter offsetJdbcParameter) {
68+
this.offsetJdbcParameter = offsetJdbcParameter;
5969
}
6070

61-
public void setOffsetJdbcParameter(boolean b) {
62-
offsetJdbcParameter = b;
71+
public boolean isRowCountJdbcParameter(){
72+
return null != this.rowCountJdbcParameter;
6373
}
6474

65-
public void setRowCountJdbcParameter(boolean b) {
66-
rowCountJdbcParameter = b;
75+
public boolean isOffsetJdbcParameter(){
76+
return null != this.offsetJdbcParameter;
6777
}
6878

6979
/**
@@ -90,11 +100,11 @@ public String toString() {
90100
if (limitNull) {
91101
retVal += "NULL";
92102
} else {
93-
if (offset > 0 || offsetJdbcParameter) {
94-
retVal += (offsetJdbcParameter ? "?" : Long.toString(offset)) + ", ";
103+
if (offset > 0 || null != offsetJdbcParameter) {
104+
retVal += (null != offsetJdbcParameter ? offsetJdbcParameter : Long.toString(offset)) + ", ";
95105
}
96-
if ( rowCount >= 0 || rowCountJdbcParameter) {
97-
retVal += (rowCountJdbcParameter ? "?" : Long.toString(rowCount));
106+
if ( rowCount >= 0 || null != rowCountJdbcParameter) {
107+
retVal += (null !=rowCountJdbcParameter ? rowCountJdbcParameter : Long.toString(rowCount));
98108
}
99109
}
100110

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ public void deParse(Limit limit) {
3636
if (limit.isLimitNull()) {
3737
buffer.append("NULL");
3838
} else {
39-
if (limit.isOffsetJdbcParameter()) {
40-
buffer.append("?, ");
39+
if (null != limit.getOffsetJdbcParameter()) {
40+
buffer.append(limit.getOffsetJdbcParameter()).append(", ");
4141
} else if (limit.getOffset() != 0) {
4242
buffer.append(limit.getOffset()).append(", ");
4343
}
4444

45-
if (limit.isRowCountJdbcParameter()) {
46-
buffer.append("?");
45+
if (null != limit.getRowCountJdbcParameter()) {
46+
buffer.append(limit.getRowCountJdbcParameter());
4747
} else if (limit.getRowCount() >= 0) {
4848
buffer.append(limit.getRowCount());
4949
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,13 +1457,15 @@ Limit LimitWithOffset():
14571457
(
14581458
token=<S_LONG> { limit.setOffset(Long.parseLong(token.image)); }
14591459
|
1460-
"?" { limit.setOffsetJdbcParameter(true);}
1460+
"?" { limit.setOffsetJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getOffsetJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
14611461

14621462
)
14631463
","
14641464

14651465
(
1466-
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); } | "?" { limit.setRowCountJdbcParameter(true);}
1466+
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
1467+
|
1468+
"?" { limit.setRowCountJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getRowCountJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
14671469
)
14681470
|
14691471
limit = PlainLimit()
@@ -1485,7 +1487,7 @@ Limit PlainLimit():
14851487
(
14861488
token=<S_LONG> { limit.setRowCount(Long.parseLong(token.image)); }
14871489
|
1488-
"?" { limit.setRowCountJdbcParameter(true);}
1490+
"?" { limit.setRowCountJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { limit.getRowCountJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
14891491
|
14901492
<K_ALL> { limit.setLimitAll(true);}
14911493
|

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,44 @@ public void testLimit2() throws JSQLParserException {
317317
assertSqlCanBeParsedAndDeparsed(statement);
318318
}
319319

320+
public void testLimit3() throws JSQLParserException {
321+
String statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1, 2";
322+
323+
Select select = (Select) parserManager.parse(new StringReader(statement));
324+
325+
assertEquals(2, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
326+
assertEquals(1, (int)((PlainSelect) select.getSelectBody()).getLimit().getOffsetJdbcParameter().getIndex());
327+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
328+
329+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 1, ?2";
330+
select = (Select) parserManager.parse(new StringReader(statement));
331+
assertEquals(1, ((PlainSelect) select.getSelectBody()).getLimit().getOffset());
332+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().getOffsetJdbcParameter() != null);
333+
assertEquals(2, (int)((PlainSelect) select.getSelectBody()).getLimit().getRowCountJdbcParameter().getIndex());
334+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
335+
336+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1, ?2";
337+
select = (Select) parserManager.parse(new StringReader(statement));
338+
assertEquals(0, ((PlainSelect) select.getSelectBody()).getLimit().getOffset());
339+
assertEquals(1, (int)((PlainSelect) select.getSelectBody()).getLimit().getOffsetJdbcParameter().getIndex());
340+
assertEquals(2, (int)((PlainSelect) select.getSelectBody()).getLimit().getRowCountJdbcParameter().getIndex());
341+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
342+
343+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 1, ?";
344+
select = (Select) parserManager.parse(new StringReader(statement));
345+
assertEquals(1, ((PlainSelect) select.getSelectBody()).getLimit().getOffset());
346+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().getOffsetJdbcParameter() != null);
347+
assertNull(((PlainSelect) select.getSelectBody()).getLimit().getRowCountJdbcParameter().getIndex());
348+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
349+
350+
statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?, ?";
351+
select = (Select) parserManager.parse(new StringReader(statement));
352+
assertEquals(0, ((PlainSelect) select.getSelectBody()).getLimit().getOffset());
353+
assertNull(((PlainSelect) select.getSelectBody()).getLimit().getOffsetJdbcParameter().getIndex());
354+
assertNull(((PlainSelect) select.getSelectBody()).getLimit().getRowCountJdbcParameter().getIndex());
355+
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
356+
}
357+
320358
public void testLimitSqlServer1() throws JSQLParserException {
321359
String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROWS FETCH NEXT 5 ROWS ONLY";
322360

@@ -2286,6 +2324,10 @@ public void testProblemKeywordCommitIssue341() throws JSQLParserException {
22862324
assertSqlCanBeParsedAndDeparsed("SELECT id, commit FROM table1");
22872325
}
22882326

2327+
public void testProblemSqlIssue352() throws JSQLParserException {
2328+
assertSqlCanBeParsedAndDeparsed( "SELECT @rowNO from (SELECT @rowNO from dual) r", true);
2329+
}
2330+
22892331
public void testProblemIsIssue331() throws JSQLParserException {
22902332
assertSqlCanBeParsedAndDeparsed("SELECT C_DocType.C_DocType_ID,NULL,COALESCE(C_DocType_Trl.Name,C_DocType.Name) AS Name,C_DocType.IsActive FROM C_DocType LEFT JOIN C_DocType_TRL ON (C_DocType.C_DocType_ID=C_DocType_Trl.C_DocType_ID AND C_DocType_Trl.AD_Language='es_AR') WHERE C_DocType.AD_Client_ID=1010016 AND C_DocType.AD_Client_ID IN (0,1010016) AND C_DocType.c_doctype_id in ( select c_doctype2.c_doctype_id from c_doctype as c_doctype2 where substring( c_doctype2.printname,6, length(c_doctype2.printname) ) = ( select letra from c_letra_comprobante as clc where clc.c_letra_comprobante_id = 1010039) ) AND ( (1010094!=0 AND C_DocType.ad_org_id = 1010094) OR 1010094=0 ) ORDER BY 3 LIMIT 2000", true);
22912333
}

0 commit comments

Comments
 (0)