Skip to content

Commit cde5069

Browse files
authored
subArray support arr[1:3] (#1109)
1 parent 7234de1 commit cde5069

File tree

7 files changed

+97
-8
lines changed

7 files changed

+97
-8
lines changed

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ public class ArrayExpression extends ASTNodeAccessImpl implements Expression {
1515

1616
private Expression objExpression;
1717
private Expression indexExpression;
18+
private Expression startIndexExpression;
19+
private Expression stopIndexExpression;
20+
1821

1922
public ArrayExpression() {
2023
// empty constructor
2124
}
2225

23-
public ArrayExpression(Expression objExpression, Expression indexExpression) {
26+
public ArrayExpression(Expression objExpression, Expression indexExpression, Expression startIndexExpression, Expression stopIndexExpression) {
2427
this.objExpression = objExpression;
2528
this.indexExpression = indexExpression;
29+
this.startIndexExpression = startIndexExpression;
30+
this.stopIndexExpression = stopIndexExpression;
2631
}
2732

2833
public Expression getObjExpression() {
@@ -41,14 +46,38 @@ public void setIndexExpression(Expression indexExpression) {
4146
this.indexExpression = indexExpression;
4247
}
4348

49+
public Expression getStartIndexExpression() {
50+
return startIndexExpression;
51+
}
52+
53+
public void setStartIndexExpression(Expression startIndexExpression) {
54+
this.startIndexExpression = startIndexExpression;
55+
}
56+
57+
public Expression getStopIndexExpression() {
58+
return stopIndexExpression;
59+
}
60+
61+
public void setStopIndexExpression(Expression stopIndexExpression) {
62+
this.stopIndexExpression = stopIndexExpression;
63+
}
64+
4465
@Override
4566
public void accept(ExpressionVisitor expressionVisitor) {
4667
expressionVisitor.visit(this);
4768
}
4869

4970
@Override
5071
public String toString() {
51-
return objExpression.toString() + "[" + indexExpression.toString() + "]";
72+
if (indexExpression != null) {
73+
return objExpression.toString() + "[" + indexExpression.toString() + "]";
74+
} else {
75+
return objExpression.toString() + "[" +
76+
(startIndexExpression == null ? "" : startIndexExpression.toString()) +
77+
":" +
78+
(stopIndexExpression == null ? "" : stopIndexExpression.toString()) +
79+
"]";
80+
}
5281
}
5382

5483
public ArrayExpression withObjExpression(Expression objExpression) {
@@ -61,6 +90,12 @@ public ArrayExpression withIndexExpression(Expression indexExpression) {
6190
return this;
6291
}
6392

93+
public ArrayExpression withRangeExpression(Expression startIndexExpression, Expression stopIndexExpression) {
94+
this.setStartIndexExpression(startIndexExpression);
95+
this.setStopIndexExpression(stopIndexExpression);
96+
return this;
97+
}
98+
6499
public <E extends Expression> E getObjExpression(Class<E> type) {
65100
return type.cast(getObjExpression());
66101
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,15 @@ public void visit(SimilarToExpression expr) {
539539
@Override
540540
public void visit(ArrayExpression array) {
541541
array.getObjExpression().accept(this);
542-
array.getIndexExpression().accept(this);
542+
if (array.getIndexExpression() != null) {
543+
array.getIndexExpression().accept(this);
544+
}
545+
if (array.getStartIndexExpression() != null) {
546+
array.getStartIndexExpression().accept(this);
547+
}
548+
if (array.getStopIndexExpression() != null) {
549+
array.getStopIndexExpression().accept(this);
550+
}
543551
}
544552

545553
@Override

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,15 @@ public void visit(Grant grant) {
873873
@Override
874874
public void visit(ArrayExpression array) {
875875
array.getObjExpression().accept(this);
876-
array.getIndexExpression().accept(this);
876+
if (array.getStartIndexExpression() != null){
877+
array.getIndexExpression().accept(this);
878+
}
879+
if (array.getStartIndexExpression() != null) {
880+
array.getStartIndexExpression().accept(this);
881+
}
882+
if (array.getStopIndexExpression() != null) {
883+
array.getStopIndexExpression().accept(this);
884+
}
877885
}
878886

879887
@Override

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,18 @@ public void visit(SimilarToExpression expr) {
894894
public void visit(ArrayExpression array) {
895895
array.getObjExpression().accept(this);
896896
buffer.append("[");
897-
array.getIndexExpression().accept(this);
897+
if (array.getIndexExpression() != null) {
898+
array.getIndexExpression().accept(this);
899+
} else {
900+
if (array.getStartIndexExpression() != null) {
901+
array.getStartIndexExpression().accept(this);
902+
}
903+
buffer.append(":");
904+
if (array.getStopIndexExpression() != null) {
905+
array.getStopIndexExpression().accept(this);
906+
}
907+
}
908+
898909
buffer.append("]");
899910
}
900911

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,15 @@ public void visit(SimilarToExpression expr) {
530530
@Override
531531
public void visit(ArrayExpression array) {
532532
array.getObjExpression().accept(this);
533-
array.getIndexExpression().accept(this);
533+
if (array.getIndexExpression() != null) {
534+
array.getIndexExpression().accept(this);
535+
}
536+
if (array.getStartIndexExpression() != null) {
537+
array.getStartIndexExpression().accept(this);
538+
}
539+
if (array.getStopIndexExpression() != null) {
540+
array.getStopIndexExpression().accept(this);
541+
}
534542
}
535543

536544
@Override

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3271,6 +3271,21 @@ Expression BitwiseXor():
32713271
{ return result; }
32723272
}
32733273

3274+
Expression ArrayExpression(Expression obj): {
3275+
Expression idxExpr = null;
3276+
Expression startExpr = null;
3277+
Expression stopExpr = null;
3278+
} {
3279+
"["
3280+
[LOOKAHEAD(3) idxExpr = SimpleExpression()]
3281+
[
3282+
(":" { startExpr=idxExpr; idxExpr=null; })
3283+
[stopExpr = SimpleExpression()]
3284+
]
3285+
"]"
3286+
{ return new ArrayExpression(obj, idxExpr, startExpr, stopExpr); }
3287+
}
3288+
32743289
Expression PrimaryExpression() #PrimaryExpression:
32753290
{
32763291
Expression retval = null;
@@ -3282,7 +3297,6 @@ Expression PrimaryExpression() #PrimaryExpression:
32823297
boolean not = false;
32833298
boolean exclamationMarkNot = false;
32843299
boolean dateExpressionAllowed = true;
3285-
Expression idxExpr;
32863300
ExpressionList list;
32873301
}
32883302
{
@@ -3364,7 +3378,7 @@ Expression PrimaryExpression() #PrimaryExpression:
33643378
LOOKAHEAD(2, { dateExpressionAllowed } ) retval = IntervalExpressionWithoutInterval(retval)
33653379
]
33663380

3367-
[ "[" idxExpr = SimpleExpression() "]" { retval = new ArrayExpression(retval, idxExpr); } ]
3381+
[ retval = ArrayExpression(retval) ]
33683382

33693383
( "::" type=ColDataType() {
33703384
castExpr = new CastExpression();

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4005,6 +4005,11 @@ public void testArrayIssue378() throws JSQLParserException {
40054005
assertSqlCanBeParsedAndDeparsed("select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.relname = 'business' and n.nspname = 'public' and tc.oid = i.indrelid and n.oid = tc.relnamespace and i.indisprimary = 't' and ia.attrelid = i.indexrelid and ta.attrelid = i.indrelid and ta.attnum = i.indkey[ia.attnum-1] and (not ta.attisdropped) and (not ia.attisdropped) and ic.oid = i.indexrelid order by ia.attnum", true);
40064006
}
40074007

4008+
@Test
4009+
public void testArrayRange() throws JSQLParserException {
4010+
assertSqlCanBeParsedAndDeparsed("SELECT (arr[1:3])[1] FROM MYTABLE");
4011+
}
4012+
40084013
@Test
40094014
public void testIssue842() throws JSQLParserException {
40104015
assertSqlCanBeParsedAndDeparsed("SELECT a.id lendId, "

0 commit comments

Comments
 (0)