Skip to content

Commit 27e6a9f

Browse files
authored
Row access support (#1181)
* Row acess support * Remove IN Left Expression List, replaced by RowConstructor Expression * Remove IN Left Expression List, replaced by RowConstructor Expression Formatting
1 parent aec76ea commit 27e6a9f

File tree

10 files changed

+111
-67
lines changed

10 files changed

+111
-67
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
@@ -145,6 +145,8 @@ public interface ExpressionVisitor {
145145

146146
void visit(RowConstructor rowConstructor);
147147

148+
void visit(RowGetExpression rowGetExpression);
149+
148150
void visit(OracleHint hint);
149151

150152
void visit(TimeKeyExpression timeKeyExpression);

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,6 @@ public void visit(GreaterThanEquals expr) {
179179
public void visit(InExpression expr) {
180180
if (expr.getLeftExpression() != null) {
181181
expr.getLeftExpression().accept(this);
182-
} else if (expr.getLeftItemsList() != null) {
183-
expr.getLeftItemsList().accept(this);
184182
}
185183
if (expr.getRightExpression() != null) {
186184
expr.getRightExpression().accept(this);
@@ -515,6 +513,11 @@ public void visit(RowConstructor rowConstructor) {
515513
}
516514
}
517515

516+
@Override
517+
public void visit(RowGetExpression rowGetExpression) {
518+
rowGetExpression.getExpression().accept(this);
519+
}
520+
518521
@Override
519522
public void visit(HexValue hexValue) {
520523

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2021 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
public final class RowGetExpression extends ASTNodeAccessImpl implements Expression {
15+
private Expression expression;
16+
private String columnName;
17+
18+
public RowGetExpression(Expression expression, String columnName) {
19+
this.expression = expression;
20+
this.columnName = columnName;
21+
}
22+
23+
@Override
24+
public void accept(ExpressionVisitor expressionVisitor) {
25+
expressionVisitor.visit(this);
26+
}
27+
28+
@Override
29+
public String toString() {
30+
return expression + "." + columnName;
31+
}
32+
33+
public Expression getExpression() {
34+
return expression;
35+
}
36+
37+
public void setExpression(Expression expression) {
38+
this.expression = expression;
39+
}
40+
41+
public String getColumnName() {
42+
return columnName;
43+
}
44+
45+
public void setColumnName(String columnName) {
46+
this.columnName = columnName;
47+
}
48+
}

src/main/java/net/sf/jsqlparser/expression/operators/relational/InExpression.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
public class InExpression extends ASTNodeAccessImpl implements Expression, SupportsOldOracleJoinSyntax {
1717

1818
private Expression leftExpression;
19-
private ItemsList leftItemsList;
2019
private ItemsList rightItemsList;
2120
private boolean not = false;
2221
private Expression rightExpression;
@@ -80,14 +79,6 @@ public void setNot(boolean b) {
8079
not = b;
8180
}
8281

83-
public ItemsList getLeftItemsList() {
84-
return leftItemsList;
85-
}
86-
87-
public void setLeftItemsList(ItemsList leftItemsList) {
88-
this.leftItemsList = leftItemsList;
89-
}
90-
9182
public Expression getRightExpression() {
9283
return rightExpression;
9384
}
@@ -108,11 +99,7 @@ private String getLeftExpressionString() {
10899
@Override
109100
public String toString() {
110101
StringBuilder statementBuilder = new StringBuilder();
111-
if (leftExpression == null) {
112-
statementBuilder.append(leftItemsList);
113-
} else {
114-
statementBuilder.append(getLeftExpressionString());
115-
}
102+
statementBuilder.append(getLeftExpressionString());
116103

117104
statementBuilder.append(" ");
118105
if (not) {
@@ -156,11 +143,6 @@ public void setMultiExpressionList(MultiExpressionList multiExpressionList) {
156143
this.multiExpressionList = multiExpressionList;
157144
}
158145

159-
public InExpression withLeftItemsList(ItemsList leftItemsList) {
160-
this.setLeftItemsList(leftItemsList);
161-
return this;
162-
}
163-
164146
public InExpression withRightExpression(Expression rightExpression) {
165147
this.setRightExpression(rightExpression);
166148
return this;
@@ -196,10 +178,6 @@ public <E extends Expression> E getLeftExpression(Class<E> type) {
196178
return type.cast(getLeftExpression());
197179
}
198180

199-
public <E extends ItemsList> E getLeftItemsList(Class<E> type) {
200-
return type.cast(getLeftItemsList());
201-
}
202-
203181
public <E extends Expression> E getRightExpression(Class<E> type) {
204182
return type.cast(getRightExpression());
205183
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import net.sf.jsqlparser.expression.OracleHint;
4545
import net.sf.jsqlparser.expression.Parenthesis;
4646
import net.sf.jsqlparser.expression.RowConstructor;
47+
import net.sf.jsqlparser.expression.RowGetExpression;
4748
import net.sf.jsqlparser.expression.SignedExpression;
4849
import net.sf.jsqlparser.expression.StringValue;
4950
import net.sf.jsqlparser.expression.TimeKeyExpression;
@@ -275,8 +276,6 @@ public void visit(GreaterThanEquals greaterThanEquals) {
275276
public void visit(InExpression inExpression) {
276277
if (inExpression.getLeftExpression() != null) {
277278
inExpression.getLeftExpression().accept(this);
278-
} else if (inExpression.getLeftItemsList() != null) {
279-
inExpression.getLeftItemsList().accept(this);
280279
}
281280
if (inExpression.getRightExpression() != null) {
282281
inExpression.getRightExpression().accept(this);
@@ -777,6 +776,11 @@ public void visit(RowConstructor rowConstructor) {
777776
}
778777
}
779778

779+
@Override
780+
public void visit(RowGetExpression rowGetExpression) {
781+
rowGetExpression.getExpression().accept(this);
782+
}
783+
780784
@Override
781785
public void visit(HexValue hexValue) {
782786

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import net.sf.jsqlparser.expression.OracleHint;
4747
import net.sf.jsqlparser.expression.Parenthesis;
4848
import net.sf.jsqlparser.expression.RowConstructor;
49+
import net.sf.jsqlparser.expression.RowGetExpression;
4950
import net.sf.jsqlparser.expression.SignedExpression;
5051
import net.sf.jsqlparser.expression.StringValue;
5152
import net.sf.jsqlparser.expression.TimeKeyExpression;
@@ -225,13 +226,9 @@ public void visit(GreaterThanEquals greaterThanEquals) {
225226

226227
@Override
227228
public void visit(InExpression inExpression) {
228-
if (inExpression.getLeftExpression() == null) {
229-
inExpression.getLeftItemsList().accept(this);
230-
} else {
231-
inExpression.getLeftExpression().accept(this);
232-
if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) {
233-
buffer.append("(+)");
234-
}
229+
inExpression.getLeftExpression().accept(this);
230+
if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) {
231+
buffer.append("(+)");
235232
}
236233
if (inExpression.isNot()) {
237234
buffer.append(" NOT");
@@ -900,6 +897,12 @@ public void visit(RowConstructor rowConstructor) {
900897
buffer.append(")");
901898
}
902899

900+
@Override
901+
public void visit(RowGetExpression rowGetExpression) {
902+
rowGetExpression.getExpression().accept(this);
903+
buffer.append(".").append(rowGetExpression.getColumnName());
904+
}
905+
903906
@Override
904907
public void visit(OracleHint hint) {
905908
buffer.append(hint.toString());

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import net.sf.jsqlparser.expression.OracleHint;
4242
import net.sf.jsqlparser.expression.Parenthesis;
4343
import net.sf.jsqlparser.expression.RowConstructor;
44+
import net.sf.jsqlparser.expression.RowGetExpression;
4445
import net.sf.jsqlparser.expression.SignedExpression;
4546
import net.sf.jsqlparser.expression.StringValue;
4647
import net.sf.jsqlparser.expression.TimeKeyExpression;
@@ -507,6 +508,11 @@ public void visit(RowConstructor rowConstructor) {
507508
validateOptionalExpressionList(rowConstructor.getExprList());
508509
}
509510

511+
@Override
512+
public void visit(RowGetExpression rowGetExpression) {
513+
rowGetExpression.getExpression().accept(this);
514+
}
515+
510516
@Override
511517
public void visit(OracleHint hint) {
512518
// nothing to validate

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

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2783,7 +2783,7 @@ Expression RegularCondition() #RegularCondition:
27832783
( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }
27842784
| rightExpression=ComparisonItem() )
27852785

2786-
[ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ]
2786+
[ LOOKAHEAD(2) "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ]
27872787

27882788
{
27892789
BinaryExpression regCond = (BinaryExpression) result;
@@ -2835,17 +2835,9 @@ Expression InExpression() #InExpression :
28352835
ExpressionList expressionList = null;
28362836
}
28372837
{
2838-
( LOOKAHEAD(3) "(" (
2839-
LOOKAHEAD(SimpleExpressionList(true)) leftItemsList = SimpleExpressionList(true) { result.setLeftItemsList(leftItemsList); }
2840-
|
2841-
leftExpression=SimpleExpression()
2842-
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
2843-
)
2844-
")"
2845-
|
28462838
leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); }
28472839
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
2848-
)
2840+
28492841
[<K_NOT> { result.setNot(true); } ] <K_IN>
28502842
(
28512843
// syntactic lookahead for a multi expression list, ie: ((a,b),(c,d))
@@ -3408,23 +3400,30 @@ Expression PrimaryExpression() #PrimaryExpression:
34083400
| "{ts" token=<S_CHAR_LITERAL> "}" { retval = new TimestampValue(token.image); }
34093401

34103402
| LOOKAHEAD("(" retval=SubSelect() ")") "(" retval=SubSelect() ")"
3403+
| (
3404+
(
3405+
(LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing)}) "(" list = ComplexExpressionList() ")"
3406+
{
3407+
if (list.getExpressions().size() == 1) {
3408+
retval = new Parenthesis(list.getExpressions().get(0));
3409+
} else {
3410+
retval = new RowConstructor().withExprList(list);
3411+
}
3412+
}
3413+
)
34113414

3412-
| LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing)}) "(" list = ComplexExpressionList() ")"
3413-
{
3414-
if (list.getExpressions().size() == 1) {
3415-
retval = new Parenthesis(list.getExpressions().get(0));
3416-
} else {
3417-
retval = new RowConstructor().withExprList(list);
3418-
}
3419-
}
3420-
| "(" list = SimpleExpressionList(true) ")"
3421-
{
3422-
if (list.getExpressions().size() == 1) {
3423-
retval = new Parenthesis(list.getExpressions().get(0));
3424-
} else {
3425-
retval = new RowConstructor().withExprList(list);
3426-
}
3427-
}
3415+
| ("(" list = SimpleExpressionList(true) ")"
3416+
{
3417+
if (list.getExpressions().size() == 1) {
3418+
retval = new Parenthesis(list.getExpressions().get(0));
3419+
} else {
3420+
retval = new RowConstructor().withExprList(list);
3421+
}
3422+
}
3423+
)
3424+
)
3425+
["." tmp=RelObjectNameExt() { retval = new RowGetExpression(retval, tmp); }]
3426+
)
34283427
)
34293428

34303429
[

src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.junit.Test;
2121
import static org.junit.Assert.assertEquals;
2222
import static org.junit.Assert.assertNotNull;
23-
import static org.junit.Assert.assertNull;
2423
import static org.junit.Assert.assertTrue;
2524
import static org.junit.Assert.fail;
2625
import net.sf.jsqlparser.JSQLParserException;
@@ -68,14 +67,12 @@ public void testInExpressionProblem() throws JSQLParserException {
6867
public void visit(InExpression expr) {
6968
super.visit(expr);
7069
exprList.add(expr.getLeftExpression());
71-
exprList.add(expr.getLeftItemsList());
7270
exprList.add(expr.getRightItemsList());
7371
}
7472
});
7573

7674
assertTrue(exprList.get(0) instanceof Expression);
77-
assertNull(exprList.get(1));
78-
assertTrue(exprList.get(2) instanceof ItemsList);
75+
assertTrue(exprList.get(1) instanceof ItemsList);
7976
}
8077

8178
@Test
@@ -91,14 +88,12 @@ public void testInExpression() throws JSQLParserException {
9188
public void visit(InExpression expr) {
9289
super.visit(expr);
9390
exprList.add(expr.getLeftExpression());
94-
exprList.add(expr.getLeftItemsList());
9591
exprList.add(expr.getRightItemsList());
9692
}
9793
});
9894

99-
assertNull(exprList.get(0));
95+
assertTrue(exprList.get(0) instanceof RowConstructor);
10096
assertTrue(exprList.get(1) instanceof ItemsList);
101-
assertTrue(exprList.get(2) instanceof ItemsList);
10297
}
10398

10499
@Test

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4610,4 +4610,10 @@ public void testGroupedByWithExtraBracketsIssue1168() throws JSQLParserException
46104610
"select sum(a) as amount, b, c from TEST_TABLE group by rollup ((a,b),c)",
46114611
true);
46124612
}
4613+
4614+
@Test
4615+
public void testSelectRowElement() throws JSQLParserException {
4616+
assertSqlCanBeParsedAndDeparsed("SELECT (t.tup).id, (tup).name FROM t WHERE (t.tup).id IN (1, 2, 3)");
4617+
}
4618+
46134619
}

0 commit comments

Comments
 (0)