Skip to content

Commit

Permalink
Merge commit 'a5204f63ccb1ea8d30de002b4fc40be39935c275' into AllowCom…
Browse files Browse the repository at this point in the history
…plexParsingClean

Conflicts:
	src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
	src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java
	src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
  • Loading branch information
manticore-projects committed May 26, 2021
2 parents 42abed4 + a5204f6 commit 3f0e47c
Show file tree
Hide file tree
Showing 23 changed files with 371 additions and 86 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
13 changes: 11 additions & 2 deletions pmd-rules.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,17 @@ under the License.
<rule ref="category/java/codestyle.xml/UselessParentheses" />
<rule ref="category/java/codestyle.xml/UselessQualifiedThis" />

<!-- for Codazy -->
<rule ref="category/java/codestyle.xml/MethodNamingConventions" />
<!-- for Codazy -->
<rule ref="category/java/codestyle.xml/MethodNamingConventions">
<properties>
<property name="methodPattern" value="[a-z][a-zA-Z0-9]*" />
<property name="staticPattern" value="[a-z][a-zA-Z0-9]*" />
<property name="nativePattern" value="[a-z][a-zA-Z0-9]*" />
<property name="junit3TestPattern" value="test[A-Z0-9][a-zA-Z0-9]*" />
<property name="junit4TestPattern" value="[a-z][a-zA-Z0-9]*" />
<property name="junit5TestPattern" value="[a-z][a-zA-Z0-9]*" />
</properties>
</rule>
<rule ref="category/java/codestyle.xml/ClassNamingConventions" />

<rule ref="category/java/design.xml/CollapsibleIfStatements" />
Expand Down
27 changes: 25 additions & 2 deletions src/main/java/net/sf/jsqlparser/expression/CaseExpression.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
*/
public class CaseExpression extends ASTNodeAccessImpl implements Expression {

private boolean usingBrackets = false;
private Expression switchExpression;
private List<WhenClause> whenClauses;
private Expression elseExpression;
Expand Down Expand Up @@ -90,9 +91,9 @@ public void setWhenClauses(List<WhenClause> whenClauses) {

@Override
public String toString() {
return "CASE " + ((switchExpression != null) ? switchExpression + " " : "")
return (usingBrackets ? "(" : "") + "CASE " + ((switchExpression != null) ? switchExpression + " " : "")
+ PlainSelect.getStringList(whenClauses, false, false) + " "
+ ((elseExpression != null) ? "ELSE " + elseExpression + " " : "") + "END";
+ ((elseExpression != null) ? "ELSE " + elseExpression + " " : "") + "END" + (usingBrackets ? ")" : "");
}

public CaseExpression withSwitchExpression(Expression switchExpression) {
Expand Down Expand Up @@ -129,4 +130,26 @@ public <E extends Expression> E getSwitchExpression(Class<E> type) {
public <E extends Expression> E getElseExpression(Class<E> type) {
return type.cast(getElseExpression());
}

/**
* @return the usingBrackets
*/
public boolean isUsingBrackets() {
return usingBrackets;
}

/**
* @param usingBrackets the usingBrackets to set
*/
public void setUsingBrackets(boolean usingBrackets) {
this.usingBrackets = usingBrackets;
}

/**
* @param usingBrackets the usingBrackets to set
*/
public CaseExpression withUsingBrackets(boolean usingBrackets) {
this.usingBrackets=usingBrackets;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,6 @@ public interface ExpressionVisitor {
void visit(VariableAssignment aThis);

void visit(XMLSerializeExpr aThis);

void visit(TimezoneExpression aThis);
}
Original file line number Diff line number Diff line change
Expand Up @@ -576,4 +576,9 @@ public void visit(XMLSerializeExpr expr) {
elm.getExpression().accept(this);
}
}

@Override
public void visit(TimezoneExpression expr) {
expr.getLeftExpression().accept(this);
}
}
52 changes: 52 additions & 0 deletions src/main/java/net/sf/jsqlparser/expression/TimezoneExpression.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2019 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;

import java.util.ArrayList;
import java.util.List;

public class TimezoneExpression extends ASTNodeAccessImpl implements Expression {

private Expression leftExpression;
private ArrayList<String> timezoneExpressions = new ArrayList<>();

public Expression getLeftExpression() {
return leftExpression;
}

public void setLeftExpression(Expression expression) {
leftExpression = expression;
}

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

public List<String> getTimezoneExpressions() {
return timezoneExpressions;
}

public void addTimezoneExpression(String timezoneExpr) {
this.timezoneExpressions.add(timezoneExpr);
}

@Override
public String toString() {
String returnValue = getLeftExpression().toString();
for (String expr : timezoneExpressions) {
returnValue += " AT TIME ZONE " + expr;
}

return returnValue;
}
}
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 All @@ -33,7 +34,7 @@ public ExpressionList(List<Expression> expressions) {
}

public ExpressionList(Expression... expressions) {
this.expressions = Arrays.asList(expressions);
this.expressions = new ArrayList<>(Arrays.asList(expressions));
}

public List<Expression> getExpressions() {
Expand All @@ -55,14 +56,19 @@ 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) {
itemsListVisitor.visit(this);
}

@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,72 @@

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);
public ValuesStatement addExpressions(Expression... addExpressions) {
if (expressions != null && expressions instanceof ExpressionList) {
((ExpressionList) expressions).addExpressions(addExpressions);
return this;
} else {
return this.withExpressions(new ExpressionList(addExpressions));
}
}

public ValuesStatement addExpressions(Collection<? extends Expression> expressions) {
List<Expression> collection = Optional.ofNullable(getExpressions()).orElseGet(ArrayList::new);
collection.addAll(expressions);
return this.withExpressions(collection);
public ValuesStatement addExpressions(Collection<? extends Expression> addExpressions) {
if (expressions != null && expressions instanceof ExpressionList) {
((ExpressionList) expressions).addExpressions(addExpressions);
return this;
} else {
return this.withExpressions(new ExpressionList(new ArrayList<>(addExpressions)));
}
}
}
11 changes: 8 additions & 3 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import java.util.ArrayList;
import java.util.List;

import net.sf.jsqlparser.expression.AllComparisonExpression;
import net.sf.jsqlparser.expression.AnalyticExpression;
import net.sf.jsqlparser.expression.AnyComparisonExpression;
Expand Down Expand Up @@ -48,6 +49,7 @@
import net.sf.jsqlparser.expression.TimeKeyExpression;
import net.sf.jsqlparser.expression.TimeValue;
import net.sf.jsqlparser.expression.TimestampValue;
import net.sf.jsqlparser.expression.TimezoneExpression;
import net.sf.jsqlparser.expression.UserVariable;
import net.sf.jsqlparser.expression.ValueListExpression;
import net.sf.jsqlparser.expression.VariableAssignment;
Expand Down Expand Up @@ -829,9 +831,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 Expand Up @@ -930,4 +930,9 @@ public void visit(CreateSynonym createSynonym) {
private static <T> void throwUnsupported(T type){
throw new UnsupportedOperationException(String.format("Finding tables from %s is not supported", type.getClass().getSimpleName()));
}

@Override
public void visit(TimezoneExpression aThis) {
aThis.getLeftExpression().accept(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import net.sf.jsqlparser.expression.TimeKeyExpression;
import net.sf.jsqlparser.expression.TimeValue;
import net.sf.jsqlparser.expression.TimestampValue;
import net.sf.jsqlparser.expression.TimezoneExpression;
import net.sf.jsqlparser.expression.UserVariable;
import net.sf.jsqlparser.expression.ValueListExpression;
import net.sf.jsqlparser.expression.VariableAssignment;
Expand Down Expand Up @@ -604,7 +605,7 @@ public void visit(TimeValue timeValue) {

@Override
public void visit(CaseExpression caseExpression) {
buffer.append("CASE ");
buffer.append(caseExpression.isUsingBrackets() ? "(" : "").append("CASE ");
Expression switchExp = caseExpression.getSwitchExpression();
if (switchExp != null) {
switchExp.accept(this);
Expand All @@ -622,7 +623,7 @@ public void visit(CaseExpression caseExpression) {
buffer.append(" ");
}

buffer.append("END");
buffer.append("END").append(caseExpression.isUsingBrackets() ? ")" : "");
}

@Override
Expand Down Expand Up @@ -989,4 +990,13 @@ public void visit(XMLSerializeExpr expr) {
}
buffer.append(") AS ").append(expr.getDataType()).append(")");
}

@Override
public void visit(TimezoneExpression var) {
var.getLeftExpression().accept(this);

for (String expr : var.getTimezoneExpressions()) {
buffer.append(" AT TIME ZONE " + expr);
}
}
}

0 comments on commit 3f0e47c

Please sign in to comment.