Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ public interface ExpressionVisitor {

void visit(RowConstructor rowConstructor);

void visit(RowGetExpression rowGetExpression);

void visit(OracleHint hint);

void visit(TimeKeyExpression timeKeyExpression);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,6 @@ public void visit(GreaterThanEquals expr) {
public void visit(InExpression expr) {
if (expr.getLeftExpression() != null) {
expr.getLeftExpression().accept(this);
} else if (expr.getLeftItemsList() != null) {
expr.getLeftItemsList().accept(this);
}
if (expr.getRightExpression() != null) {
expr.getRightExpression().accept(this);
Expand Down Expand Up @@ -515,6 +513,11 @@ public void visit(RowConstructor rowConstructor) {
}
}

@Override
public void visit(RowGetExpression rowGetExpression) {
rowGetExpression.getExpression().accept(this);
}

@Override
public void visit(HexValue hexValue) {

Expand Down
48 changes: 48 additions & 0 deletions src/main/java/net/sf/jsqlparser/expression/RowGetExpression.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2021 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.expression;

import net.sf.jsqlparser.parser.ASTNodeAccessImpl;

public final class RowGetExpression extends ASTNodeAccessImpl implements Expression {
private Expression expression;
private String columnName;

public RowGetExpression(Expression expression, String columnName) {
this.expression = expression;
this.columnName = columnName;
}

@Override
public void accept(ExpressionVisitor expressionVisitor) {
expressionVisitor.visit(this);
}

@Override
public String toString() {
return expression + "." + columnName;
}

public Expression getExpression() {
return expression;
}

public void setExpression(Expression expression) {
this.expression = expression;
}

public String getColumnName() {
return columnName;
}

public void setColumnName(String columnName) {
this.columnName = columnName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
public class InExpression extends ASTNodeAccessImpl implements Expression, SupportsOldOracleJoinSyntax {

private Expression leftExpression;
private ItemsList leftItemsList;
private ItemsList rightItemsList;
private boolean not = false;
private Expression rightExpression;
Expand Down Expand Up @@ -80,14 +79,6 @@ public void setNot(boolean b) {
not = b;
}

public ItemsList getLeftItemsList() {
return leftItemsList;
}

public void setLeftItemsList(ItemsList leftItemsList) {
this.leftItemsList = leftItemsList;
}

public Expression getRightExpression() {
return rightExpression;
}
Expand All @@ -108,11 +99,7 @@ private String getLeftExpressionString() {
@Override
public String toString() {
StringBuilder statementBuilder = new StringBuilder();
if (leftExpression == null) {
statementBuilder.append(leftItemsList);
} else {
statementBuilder.append(getLeftExpressionString());
}
statementBuilder.append(getLeftExpressionString());

statementBuilder.append(" ");
if (not) {
Expand Down Expand Up @@ -156,11 +143,6 @@ public void setMultiExpressionList(MultiExpressionList multiExpressionList) {
this.multiExpressionList = multiExpressionList;
}

public InExpression withLeftItemsList(ItemsList leftItemsList) {
this.setLeftItemsList(leftItemsList);
return this;
}

public InExpression withRightExpression(Expression rightExpression) {
this.setRightExpression(rightExpression);
return this;
Expand Down Expand Up @@ -196,10 +178,6 @@ public <E extends Expression> E getLeftExpression(Class<E> type) {
return type.cast(getLeftExpression());
}

public <E extends ItemsList> E getLeftItemsList(Class<E> type) {
return type.cast(getLeftItemsList());
}

public <E extends Expression> E getRightExpression(Class<E> type) {
return type.cast(getRightExpression());
}
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.RowGetExpression;
import net.sf.jsqlparser.expression.SignedExpression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.TimeKeyExpression;
Expand Down Expand Up @@ -275,8 +276,6 @@ public void visit(GreaterThanEquals greaterThanEquals) {
public void visit(InExpression inExpression) {
if (inExpression.getLeftExpression() != null) {
inExpression.getLeftExpression().accept(this);
} else if (inExpression.getLeftItemsList() != null) {
inExpression.getLeftItemsList().accept(this);
}
if (inExpression.getRightExpression() != null) {
inExpression.getRightExpression().accept(this);
Expand Down Expand Up @@ -777,6 +776,11 @@ public void visit(RowConstructor rowConstructor) {
}
}

@Override
public void visit(RowGetExpression rowGetExpression) {
rowGetExpression.getExpression().accept(this);
}

@Override
public void visit(HexValue hexValue) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.RowGetExpression;
import net.sf.jsqlparser.expression.SignedExpression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.TimeKeyExpression;
Expand Down Expand Up @@ -225,13 +226,9 @@ public void visit(GreaterThanEquals greaterThanEquals) {

@Override
public void visit(InExpression inExpression) {
if (inExpression.getLeftExpression() == null) {
inExpression.getLeftItemsList().accept(this);
} else {
inExpression.getLeftExpression().accept(this);
if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) {
buffer.append("(+)");
}
inExpression.getLeftExpression().accept(this);
if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) {
buffer.append("(+)");
}
if (inExpression.isNot()) {
buffer.append(" NOT");
Expand Down Expand Up @@ -900,6 +897,12 @@ public void visit(RowConstructor rowConstructor) {
buffer.append(")");
}

@Override
public void visit(RowGetExpression rowGetExpression) {
rowGetExpression.getExpression().accept(this);
buffer.append(".").append(rowGetExpression.getColumnName());
}

@Override
public void visit(OracleHint hint) {
buffer.append(hint.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.RowGetExpression;
import net.sf.jsqlparser.expression.SignedExpression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.TimeKeyExpression;
Expand Down Expand Up @@ -507,6 +508,11 @@ public void visit(RowConstructor rowConstructor) {
validateOptionalExpressionList(rowConstructor.getExprList());
}

@Override
public void visit(RowGetExpression rowGetExpression) {
rowGetExpression.getExpression().accept(this);
}

@Override
public void visit(OracleHint hint) {
// nothing to validate
Expand Down
51 changes: 25 additions & 26 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -2782,7 +2782,7 @@ Expression RegularCondition() #RegularCondition:
( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }
| rightExpression=ComparisonItem() )

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

{
BinaryExpression regCond = (BinaryExpression) result;
Expand Down Expand Up @@ -2834,17 +2834,9 @@ Expression InExpression() #InExpression :
ExpressionList expressionList = null;
}
{
( LOOKAHEAD(3) "(" (
LOOKAHEAD(SimpleExpressionList(true)) leftItemsList = SimpleExpressionList(true) { result.setLeftItemsList(leftItemsList); }
|
leftExpression=SimpleExpression()
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
)
")"
|
leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); }
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
)

[<K_NOT> { result.setNot(true); } ] <K_IN>
(
// syntactic lookahead for a multi expression list, ie: ((a,b),(c,d))
Expand Down Expand Up @@ -3407,23 +3399,30 @@ Expression PrimaryExpression() #PrimaryExpression:
| "{ts" token=<S_CHAR_LITERAL> "}" { retval = new TimestampValue(token.image); }

| LOOKAHEAD("(" retval=SubSelect() ")") "(" retval=SubSelect() ")"
| (
(
(LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing)}) "(" list = ComplexExpressionList() ")"
{
if (list.getExpressions().size() == 1) {
retval = new Parenthesis(list.getExpressions().get(0));
} else {
retval = new RowConstructor().withExprList(list);
}
}
)

| LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing)}) "(" list = ComplexExpressionList() ")"
{
if (list.getExpressions().size() == 1) {
retval = new Parenthesis(list.getExpressions().get(0));
} else {
retval = new RowConstructor().withExprList(list);
}
}
| "(" list = SimpleExpressionList(true) ")"
{
if (list.getExpressions().size() == 1) {
retval = new Parenthesis(list.getExpressions().get(0));
} else {
retval = new RowConstructor().withExprList(list);
}
}
| ("(" list = SimpleExpressionList(true) ")"
{
if (list.getExpressions().size() == 1) {
retval = new Parenthesis(list.getExpressions().get(0));
} else {
retval = new RowConstructor().withExprList(list);
}
}
)
)
["." tmp=RelObjectNameExt() { retval = new RowGetExpression(retval, tmp); }]
)
)

[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import net.sf.jsqlparser.JSQLParserException;
Expand Down Expand Up @@ -68,14 +67,12 @@ public void testInExpressionProblem() throws JSQLParserException {
public void visit(InExpression expr) {
super.visit(expr);
exprList.add(expr.getLeftExpression());
exprList.add(expr.getLeftItemsList());
exprList.add(expr.getRightItemsList());
}
});

assertTrue(exprList.get(0) instanceof Expression);
assertNull(exprList.get(1));
assertTrue(exprList.get(2) instanceof ItemsList);
assertTrue(exprList.get(1) instanceof ItemsList);
}

@Test
Expand All @@ -91,14 +88,12 @@ public void testInExpression() throws JSQLParserException {
public void visit(InExpression expr) {
super.visit(expr);
exprList.add(expr.getLeftExpression());
exprList.add(expr.getLeftItemsList());
exprList.add(expr.getRightItemsList());
}
});

assertNull(exprList.get(0));
assertTrue(exprList.get(0) instanceof RowConstructor);
assertTrue(exprList.get(1) instanceof ItemsList);
assertTrue(exprList.get(2) instanceof ItemsList);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4610,4 +4610,10 @@ public void testGroupedByWithExtraBracketsIssue1168() throws JSQLParserException
"select sum(a) as amount, b, c from TEST_TABLE group by rollup ((a,b),c)",
true);
}

@Test
public void testSelectRowElement() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT (t.tup).id, (tup).name FROM t WHERE (t.tup).id IN (1, 2, 3)");
}

}