Skip to content

Commit 9e77b6b

Browse files
Add support for variable support to "SELECT SKIP <ROWCOUNT> FIRST <ROWCOUNT>..." construct
The grammar for the construct in informix [1] mentions the possibility, that <ROWCOUNT> can be either an integer or a host variable or local SPL variable storing the value of max. The case for plain integers and jdbc variables is covered by the first commit While this commit adds support for constructs using SPL variables. SPL variables must follow identifier rules [2][3]. [1] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0156.htm [2] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_1306.htm?lang=de [3] http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_1660.htm%23ids_sqs_1660?lang=de
1 parent a44acb7 commit 9e77b6b

File tree

4 files changed

+76
-7
lines changed

4 files changed

+76
-7
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public enum Keyword {
3939
private Keyword keyword;
4040
private Long rowCount;
4141
private JdbcParameter jdbcParameter;
42+
private String variable;
4243

4344
public Long getRowCount() {
4445
return rowCount;
@@ -64,11 +65,25 @@ public void setKeyword(Keyword keyword) {
6465
this.keyword = keyword;
6566
}
6667

68+
public String getVariable() {
69+
return variable;
70+
}
71+
72+
public void setVariable(String variable) {
73+
this.variable = variable;
74+
}
75+
6776
@Override
6877
public String toString() {
6978
String result = keyword.name() + " ";
7079

71-
result += jdbcParameter != null ? jdbcParameter.toString() : rowCount;
80+
if(rowCount != null) {
81+
result += rowCount;
82+
} else if (jdbcParameter != null) {
83+
result += jdbcParameter.toString();
84+
} else if (variable != null){
85+
result += variable;
86+
}
7287

7388
return result;
7489
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class Skip {
3333

3434
private Long rowCount;
3535
private JdbcParameter jdbcParameter;
36+
private String variable;
3637

3738
public Long getRowCount() {
3839
return rowCount;
@@ -50,11 +51,25 @@ public void setJdbcParameter(JdbcParameter jdbcParameter) {
5051
this.jdbcParameter = jdbcParameter;
5152
}
5253

54+
public String getVariable() {
55+
return variable;
56+
}
57+
58+
public void setVariable(String variable) {
59+
this.variable = variable;
60+
}
61+
5362
@Override
5463
public String toString() {
5564
String result = "SKIP ";
5665

57-
result += jdbcParameter != null ? jdbcParameter.toString() : rowCount;
66+
if(rowCount != null) {
67+
result += rowCount;
68+
} else if (jdbcParameter != null) {
69+
result += jdbcParameter.toString();
70+
} else if (variable != null){
71+
result += variable;
72+
}
5873

5974
return result;
6075
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,6 +1315,7 @@ Skip Skip():
13151315
<K_SKIP>
13161316
(
13171317
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
1318+
| token=<S_IDENTIFIER> { skip.setVariable(token.image); }
13181319
| "?" { skip.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
13191320
)
13201321
{
@@ -1333,6 +1334,7 @@ First First():
13331334
)
13341335
(
13351336
token=<S_LONG> { first.setRowCount(Long.parseLong(token.image)); }
1337+
| token=<S_IDENTIFIER> { first.setVariable(token.image); }
13361338
| "?" { first.setJdbcParameter(new JdbcParameter()); } [ LOOKAHEAD(2) token = <S_LONG> { first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ]
13371339
)
13381340
{

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

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -437,13 +437,31 @@ public void testSkip() throws JSQLParserException {
437437
final Skip skip = selectBody.getSkip();
438438
assertEquals((long) 5, (long) skip.getRowCount());
439439
assertNull(skip.getJdbcParameter());
440+
assertNull(skip.getVariable());
440441

441442
final List<SelectItem> selectItems = selectBody.getSelectItems();
442443
assertEquals(2, selectItems.size());
443444
assertEquals(firstColumnName, selectItems.get(0).toString());
444445
assertEquals(secondColumnName, selectItems.get(1).toString());
445446

446447
assertStatementCanBeDeparsedAs(select, statement);
448+
449+
final String statement2 = "SELECT SKIP skipVar c1, c2 FROM t";
450+
final Select select2 = (Select) parserManager.parse(new StringReader(statement2));
451+
452+
final PlainSelect selectBody2 = (PlainSelect) select2.getSelectBody();
453+
454+
final Skip skip2 = selectBody2.getSkip();
455+
assertNull(skip2.getRowCount());
456+
assertNull(skip2.getJdbcParameter());
457+
assertEquals("skipVar", skip2.getVariable());
458+
459+
final List<SelectItem> selectItems2 = selectBody2.getSelectItems();
460+
assertEquals(2, selectItems2.size());
461+
assertEquals("c1", selectItems2.get(0).toString());
462+
assertEquals("c2", selectItems2.get(1).toString());
463+
464+
assertStatementCanBeDeparsedAs(select2, statement2);
447465
}
448466

449467
public void testFirst() throws JSQLParserException {
@@ -465,6 +483,24 @@ public void testFirst() throws JSQLParserException {
465483
assertEquals(secondColumnName, selectItems.get(1).toString());
466484

467485
assertStatementCanBeDeparsedAs(select, statement);
486+
487+
488+
final String statement2 = "SELECT FIRST firstVar c1, c2 FROM t";
489+
final Select select2 = (Select) parserManager.parse(new StringReader(statement2));
490+
491+
final PlainSelect selectBody2 = (PlainSelect) select2.getSelectBody();
492+
493+
final First first2 = selectBody2.getFirst();
494+
assertNull(first2.getRowCount());
495+
assertNull(first2.getJdbcParameter());
496+
assertEquals("firstVar", first2.getVariable());
497+
498+
final List<SelectItem> selectItems2 = selectBody2.getSelectItems();
499+
assertEquals(2, selectItems2.size());
500+
assertEquals("c1", selectItems2.get(0).toString());
501+
assertEquals("c2", selectItems2.get(1).toString());
502+
503+
assertStatementCanBeDeparsedAs(select2, statement2);
468504
}
469505

470506
public void testFirstWithKeywordLimit() throws JSQLParserException {
@@ -490,7 +526,7 @@ public void testFirstWithKeywordLimit() throws JSQLParserException {
490526
}
491527

492528
public void testSkipFirst() throws JSQLParserException {
493-
final String statement = "SELECT SKIP ?1 FIRST ?2 c1, c2 FROM t1";
529+
final String statement = "SELECT SKIP ?1 FIRST f1 c1, c2 FROM t1";
494530
final Select select = (Select) parserManager.parse(new StringReader(statement));
495531

496532
final PlainSelect selectBody = (PlainSelect) select.getSelectBody();
@@ -499,11 +535,12 @@ public void testSkipFirst() throws JSQLParserException {
499535
assertNotNull(skip.getJdbcParameter());
500536
assertNotNull(skip.getJdbcParameter().getIndex());
501537
assertEquals((int) 1, (int) skip.getJdbcParameter().getIndex());
538+
assertNull(skip.getVariable());
502539
final First first = selectBody.getFirst();
503-
assertNotNull(first.getJdbcParameter());
504-
assertNotNull(first.getJdbcParameter().getIndex());
505-
assertEquals((int) 2, (int) first.getJdbcParameter().getIndex());
506-
540+
assertNull(first.getJdbcParameter());
541+
assertNull(first.getRowCount());
542+
assertEquals("f1", first.getVariable());
543+
507544
final List<SelectItem> selectItems = selectBody.getSelectItems();
508545
assertEquals(2, selectItems.size());
509546
assertEquals("c1", selectItems.get(0).toString());

0 commit comments

Comments
 (0)