Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
wumpz committed May 25, 2021
1 parent 2320b1b commit 686958c
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 66 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ Also I would like to know about needed examples or documentation stuff.

## Extensions in the latest SNAPSHOT version 4.1

* API change in ValuesStatement: the expression list is now hold as a ItemList and not as a List<Expression>
* support for parser modification within **parseExpression** and **parseCondExpression**
' support for table schema for foreign keys
* support for Oracle hints on **insert, update and merge**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
public class ExpressionList implements ItemsList {

private List<Expression> expressions;
private boolean withBrackets = true;

public ExpressionList() {
}
Expand Down Expand Up @@ -54,6 +55,11 @@ public ExpressionList withExpressions(List<Expression> expressions) {
public void setExpressions(List<Expression> expressions) {
this.expressions = expressions;
}

public ExpressionList withBrackets(boolean brackets) {
this.withBrackets = brackets;
return this;
}

@Override
public void accept(ItemsListVisitor itemsListVisitor) {
Expand All @@ -62,7 +68,7 @@ public void accept(ItemsListVisitor itemsListVisitor) {

@Override
public String toString() {
return PlainSelect.getStringList(expressions, true, true);
return PlainSelect.getStringList(expressions, true, withBrackets);
}

public ExpressionList addExpressions(Collection<? extends Expression> expressions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,68 +11,62 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectVisitor;

public class ValuesStatement implements Statement, SelectBody {
private List<Expression> expressions;

private ItemsList expressions;

public ValuesStatement() {
// empty constructor
}

public ValuesStatement(List<Expression> expressions) {
public ValuesStatement(ItemsList expressions) {
this.expressions = expressions;
}

@Override
public void accept(StatementVisitor statementVisitor) {
statementVisitor.visit(this);
}
public List<Expression> getExpressions() {

public ItemsList getExpressions() {
return expressions;
}
public void setExpressions(List<Expression> expressions) {

public void setExpressions(ItemsList expressions) {
this.expressions = expressions;
}

@Override
public String toString() {
StringBuilder sql = new StringBuilder();
sql.append("VALUES ");
sql.append(PlainSelect.getStringList(expressions, true, true));
sql.append(expressions.toString());
return sql.toString();
}

@Override
public void accept(SelectVisitor selectVisitor) {
selectVisitor.visit(this);
}

public ValuesStatement withExpressions(List<Expression> expressions) {
public ValuesStatement withExpressions(ItemsList expressions) {
this.setExpressions(expressions);
return this;
}

public ValuesStatement addExpressions(Expression... expressions) {
List<Expression> collection = Optional.ofNullable(getExpressions()).orElseGet(ArrayList::new);
Collections.addAll(collection, expressions);
return this.withExpressions(collection);
return this.withExpressions(new ExpressionList(expressions));
}

public ValuesStatement addExpressions(Collection<? extends Expression> expressions) {
List<Expression> collection = Optional.ofNullable(getExpressions()).orElseGet(ArrayList::new);
collection.addAll(expressions);
return this.withExpressions(collection);
return this.withExpressions(new ExpressionList(new ArrayList<>(expressions)));
}
}
4 changes: 1 addition & 3 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -829,9 +829,7 @@ public void visit(Comment comment) {

@Override
public void visit(ValuesStatement values) {
for (Expression expr : values.getExpressions()) {
expr.accept(this);
}
values.getExpressions().accept(this);
}

@Override
Expand Down
23 changes: 21 additions & 2 deletions src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
import net.sf.jsqlparser.expression.MySQLIndexHint;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.SQLServerHints;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.AllColumns;
Expand Down Expand Up @@ -52,7 +56,7 @@

@SuppressWarnings({"PMD.CyclomaticComplexity"})
public class SelectDeParser extends AbstractDeParser<PlainSelect>
implements SelectVisitor, SelectItemVisitor, FromItemVisitor, PivotVisitor {
implements SelectVisitor, SelectItemVisitor, FromItemVisitor, PivotVisitor, ItemsListVisitor {

private ExpressionVisitor expressionVisitor;

Expand Down Expand Up @@ -517,7 +521,7 @@ public void visit(ParenthesisFromItem parenthesis) {

@Override
public void visit(ValuesStatement values) {
new ValuesStatementDeParser(expressionVisitor, buffer).deParse(values);
new ValuesStatementDeParser(this, buffer).deParse(values);
}

private void deparseOptimizeFor(OptimizeFor optimizeFor) {
Expand All @@ -530,4 +534,19 @@ private void deparseOptimizeFor(OptimizeFor optimizeFor) {
void deParse(PlainSelect statement) {
statement.accept(this);
}

@Override
public void visit(ExpressionList expressionList) {
buffer.append(expressionList.toString());
}

@Override
public void visit(NamedExpressionList namedExpressionList) {
buffer.append(namedExpressionList.toString());
}

@Override
public void visit(MultiExpressionList multiExprList) {
buffer.append(multiExprList.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,21 @@
*/
package net.sf.jsqlparser.util.deparser;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
import net.sf.jsqlparser.statement.values.ValuesStatement;

public class ValuesStatementDeParser extends AbstractDeParser<ValuesStatement> {

private final ExpressionVisitor expressionVisitor;
private final ItemsListVisitor expressionVisitor;

public ValuesStatementDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
public ValuesStatementDeParser(ItemsListVisitor expressionVisitor, StringBuilder buffer) {
super(buffer);
this.expressionVisitor = expressionVisitor;
}

@Override
public void deParse(ValuesStatement values) {
boolean first = true;
buffer.append("VALUES (");
for (Expression expr : values.getExpressions()) {
if (first) {
first = false;
} else {
buffer.append(", ");
}
expr.accept(expressionVisitor);
}
buffer.append(")");
buffer.append("VALUES ");
values.getExpressions().accept(expressionVisitor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ public class ValuesStatementValidator extends AbstractValidator<ValuesStatement>
@Override
public void validate(ValuesStatement values) {
validateFeature(Feature.values);
validateOptionalExpressions(values.getExpressions());
validateOptionalItemsList(values.getExpressions());
}
}
42 changes: 20 additions & 22 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -847,16 +847,14 @@ ShowStatement Show(): {
}

ValuesStatement Values(): {
List<Expression> expList = new ArrayList<Expression>();
Expression exp;
ItemsList itemsList;
} {
<K_VALUES>
"("
exp=PrimaryExpression() { expList.add(exp); }
("," exp=PrimaryExpression() { expList.add(exp); } )*
")"

itemsList = SimpleExpressionList(false)

{
return new ValuesStatement(expList);
return new ValuesStatement(itemsList);
}
}

Expand Down Expand Up @@ -1891,7 +1889,7 @@ ExpressionListItem ExpressionListItem():
}
{
"("
expressionList=SimpleExpressionList() { expressionListItem = new ExpressionListItem(); expressionListItem.setExpressionList(expressionList); }
expressionList=SimpleExpressionList(true) { expressionListItem = new ExpressionListItem(); expressionListItem.setExpressionList(expressionList); }
")"
[alias=Alias() { expressionListItem.setAlias(alias); }]
{ return expressionListItem; }
Expand Down Expand Up @@ -2330,11 +2328,11 @@ GroupByElement GroupByColumnReferences():
|
<K_GROUPING> <K_SETS> "("
( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
| LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); }
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } )

( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
| LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); }
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )*
")"
)
Expand Down Expand Up @@ -2798,7 +2796,7 @@ Expression InExpression() #InExpression :
}
{
( LOOKAHEAD(3) "(" (
LOOKAHEAD(SimpleExpressionList()) leftItemsList = SimpleExpressionList() { result.setLeftItemsList(leftItemsList); }
LOOKAHEAD(SimpleExpressionList(true)) leftItemsList = SimpleExpressionList(true) { result.setLeftItemsList(leftItemsList); }
|
leftExpression=SimpleExpression()
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
Expand All @@ -2814,7 +2812,7 @@ Expression InExpression() #InExpression :
LOOKAHEAD(3) multiExpressionList = MultiInExpressions()
| LOOKAHEAD(3) rightExpression = Function()
| LOOKAHEAD(2) token=<S_CHAR_LITERAL> { rightExpression = new StringValue(token.image); }
| LOOKAHEAD(3) "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() )")"
| LOOKAHEAD(3) "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList(true) )")"
| rightExpression = SimpleExpression()
)
{
Expand All @@ -2833,15 +2831,15 @@ MultiExpressionList MultiInExpressions():
}
{
"(" "("
expressionList=SimpleExpressionList() {
expressionList=SimpleExpressionList(true) {
if(multiExpressionList == null) {
multiExpressionList = new MultiExpressionList();
}
multiExpressionList.addExpressionList(expressionList);
}
// potentially additional expression lists
( LOOKAHEAD(3)
")" "," "(" expressionList=SimpleExpressionList()
")" "," "(" expressionList=SimpleExpressionList(true)
{
if(multiExpressionList == null) {
multiExpressionList = new MultiExpressionList();
Expand Down Expand Up @@ -2962,9 +2960,9 @@ ExpressionList SQLExpressionList():
}
}

ExpressionList SimpleExpressionList() #ExpressionList:
ExpressionList SimpleExpressionList(boolean outerBrackets) #ExpressionList:
{
ExpressionList retval = new ExpressionList();
ExpressionList retval = new ExpressionList().withBrackets(outerBrackets);
List<Expression> expressions = new ArrayList<Expression>();
Expression expr = null;
}
Expand Down Expand Up @@ -3370,7 +3368,7 @@ Expression PrimaryExpression() #PrimaryExpression:

| LOOKAHEAD("(" retval=SubSelect() ")") "(" retval=SubSelect() ")"

| "(" list = SimpleExpressionList() ")"
| "(" list = SimpleExpressionList(true) ")"
{
if (list.getExpressions().size() == 1) {
retval = new Parenthesis(list.getExpressions().get(0));
Expand Down Expand Up @@ -3737,7 +3735,7 @@ RowConstructor RowConstructor(): {
} {
[ <K_ROW> { rowConstructor.setName("ROW");} ]
"("
list = SimpleExpressionList()
list = SimpleExpressionList(true)
")"

{
Expand Down Expand Up @@ -3781,9 +3779,9 @@ Execute Execute(): {
( "," expr = VariableExpression() { namedExprList.add(expr); })*
{ expressionList = new ExpressionList(namedExprList); } )
|
LOOKAHEAD(3) expressionList=SimpleExpressionList()
LOOKAHEAD(3) expressionList=SimpleExpressionList(true)
|
("(" expressionList=SimpleExpressionList() ")" { execute.setParenthesis(true); })
("(" expressionList=SimpleExpressionList(true) ")" { execute.setParenthesis(true); })
)?

{
Expand Down Expand Up @@ -3882,7 +3880,7 @@ Function InternalFunction(Function retval) :
|
LOOKAHEAD(NamedExpressionListExprFirst()) namedExpressionList = NamedExpressionListExprFirst()
|
LOOKAHEAD(3) (expressionList=SimpleExpressionList() [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
LOOKAHEAD(3) (expressionList=SimpleExpressionList(true) [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
|
expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); }

Expand Down Expand Up @@ -3940,7 +3938,7 @@ MySQLGroupConcat MySQLGroupConcat():{
{
<K_GROUP_CONCAT> "("
[<K_DISTINCT> { retval.setDistinct(true); } ]
expressionList = SimpleExpressionList()
expressionList = SimpleExpressionList(true)
[ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ]
[ <K_SEPARATOR> t=<S_CHAR_LITERAL> { retval.setSeparator(t.image); } ]
")"
Expand Down
10 changes: 10 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4520,4 +4520,14 @@ public void testProblematicDeparsingIssue1183_2() throws JSQLParserException {
public void testKeywordCostsIssue1185() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("WITH costs AS (SELECT * FROM MY_TABLE1 AS ALIAS_TABLE1) SELECT * FROM TESTSTMT");
}

@Test
public void testKeywordCostsIssue1135() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("with sample_data(day, value) as (values ((0, 13), (1, 12), (2, 15), (3, 4), (4, 8), (5, 16))) select day, value from sample_data", true);
}

@Test
public void testKeywordCostsIssue1135_2() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("with sample_data(day, value) as (values (0, 13), (1, 12), (2, 15), (3, 4), (4, 8), (5, 16)) select day, value from sample_data", true);
}
}

0 comments on commit 686958c

Please sign in to comment.