JSqlParser parses an SQL statement and translate it into a hierarchy of Java classes.
diff --git a/settings.gradle b/settings.gradle
index 523623eb1..78feb00f5 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,4 +2,4 @@
* This file was generated by the Gradle 'init' task.
*/
-rootProject.name = 'jsqlparser'
+rootProject.name = 'JSQLFormatter'
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
new file mode 100644
index 000000000..66fe1cb80
--- /dev/null
+++ b/src/main/java/module-info.java
@@ -0,0 +1,55 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2024 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+module net.sf.jsqlparser {
+ requires java.sql;
+ requires java.logging;
+
+ exports net.sf.jsqlparser;
+ exports net.sf.jsqlparser.expression;
+ exports net.sf.jsqlparser.expression.operators.arithmetic;
+ exports net.sf.jsqlparser.expression.operators.conditional;
+ exports net.sf.jsqlparser.expression.operators.relational;
+ exports net.sf.jsqlparser.parser;
+ exports net.sf.jsqlparser.parser.feature;
+ exports net.sf.jsqlparser.schema;
+ exports net.sf.jsqlparser.statement;
+ exports net.sf.jsqlparser.statement.alter;
+ exports net.sf.jsqlparser.statement.alter.sequence;
+ exports net.sf.jsqlparser.statement.analyze;
+ exports net.sf.jsqlparser.statement.comment;
+ exports net.sf.jsqlparser.statement.create.function;
+ exports net.sf.jsqlparser.statement.create.index;
+ exports net.sf.jsqlparser.statement.create.procedure;
+ exports net.sf.jsqlparser.statement.create.schema;
+ exports net.sf.jsqlparser.statement.create.sequence;
+ exports net.sf.jsqlparser.statement.create.synonym;
+ exports net.sf.jsqlparser.statement.create.table;
+ exports net.sf.jsqlparser.statement.create.view;
+ exports net.sf.jsqlparser.statement.delete;
+ exports net.sf.jsqlparser.statement.drop;
+ exports net.sf.jsqlparser.statement.execute;
+ exports net.sf.jsqlparser.statement.grant;
+ exports net.sf.jsqlparser.statement.insert;
+ exports net.sf.jsqlparser.statement.merge;
+ exports net.sf.jsqlparser.statement.refresh;
+ exports net.sf.jsqlparser.statement.select;
+ exports net.sf.jsqlparser.statement.show;
+ exports net.sf.jsqlparser.statement.truncate;
+ exports net.sf.jsqlparser.statement.update;
+ exports net.sf.jsqlparser.statement.upsert;
+ exports net.sf.jsqlparser.util;
+ exports net.sf.jsqlparser.util.cnfexpression;
+ exports net.sf.jsqlparser.util.deparser;
+ exports net.sf.jsqlparser.util.validation;
+ exports net.sf.jsqlparser.util.validation.allowedtypes;
+ exports net.sf.jsqlparser.util.validation.feature;
+ exports net.sf.jsqlparser.util.validation.metadata;
+ exports net.sf.jsqlparser.util.validation.validator;
+}
diff --git a/src/main/java/net/sf/jsqlparser/Model.java b/src/main/java/net/sf/jsqlparser/Model.java
index d96535bad..4ad52f429 100644
--- a/src/main/java/net/sf/jsqlparser/Model.java
+++ b/src/main/java/net/sf/jsqlparser/Model.java
@@ -12,8 +12,12 @@
import java.io.Serializable;
/**
- * A marker interface for jsqlparser-model-classes.
- * The datastructure where the sql syntax is represented by a tree consists of {@link Model}'s
+ *
+ * A marker interface for jsqlparser-model-classes.
+ *
+ *
+ * The datastructure where the sql syntax is represented by a tree consists of {@link Model}'s
+ *
*/
public interface Model extends Serializable {
diff --git a/src/main/java/net/sf/jsqlparser/expression/Alias.java b/src/main/java/net/sf/jsqlparser/expression/Alias.java
index 539d97eb2..cd50e12cc 100644
--- a/src/main/java/net/sf/jsqlparser/expression/Alias.java
+++ b/src/main/java/net/sf/jsqlparser/expression/Alias.java
@@ -16,6 +16,7 @@
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+
import net.sf.jsqlparser.statement.create.table.ColDataType;
public class Alias implements Serializable {
@@ -62,14 +63,14 @@ public String toString() {
String alias = (useAs ? " AS " : " ") + name;
if (aliasColumns != null && !aliasColumns.isEmpty()) {
- String ac = "";
+ StringBuilder ac = new StringBuilder();
for (AliasColumn col : aliasColumns) {
if (ac.length() > 0) {
- ac += ", ";
+ ac.append(", ");
}
- ac += col.name;
+ ac.append(col.name);
if (col.colDataType != null) {
- ac += " " + col.colDataType.toString();
+ ac.append(" ").append(col.colDataType.toString());
}
}
alias += "(" + ac + ")";
@@ -94,13 +95,15 @@ public Alias withAliasColumns(List aliasColumns) {
}
public Alias addAliasColumns(AliasColumn... aliasColumns) {
- List collection = Optional.ofNullable(getAliasColumns()).orElseGet(ArrayList::new);
+ List collection =
+ Optional.ofNullable(getAliasColumns()).orElseGet(ArrayList::new);
Collections.addAll(collection, aliasColumns);
return this.withAliasColumns(collection);
}
public Alias addAliasColumns(Collection extends AliasColumn> aliasColumns) {
- List collection = Optional.ofNullable(getAliasColumns()).orElseGet(ArrayList::new);
+ List collection =
+ Optional.ofNullable(getAliasColumns()).orElseGet(ArrayList::new);
collection.addAll(aliasColumns);
return this.withAliasColumns(collection);
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/AllValue.java b/src/main/java/net/sf/jsqlparser/expression/AllValue.java
index 39c64fb75..14f924ab8 100644
--- a/src/main/java/net/sf/jsqlparser/expression/AllValue.java
+++ b/src/main/java/net/sf/jsqlparser/expression/AllValue.java
@@ -14,8 +14,8 @@
public class AllValue extends ASTNodeAccessImpl implements Expression {
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
@Override
diff --git a/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java b/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
index fc7d7d466..4cbb4e1d0 100644
--- a/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java
@@ -11,6 +11,7 @@
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+import net.sf.jsqlparser.statement.select.Limit;
import net.sf.jsqlparser.statement.select.OrderByElement;
import java.util.List;
@@ -19,14 +20,14 @@
/**
* Analytic function. The name of the function is variable but the parameters following the special
- * analytic function path. e.g. row_number() over (order by test). Additional there can be an
- * expression for an analytical aggregate like sum(col) or the "all collumns" wildcard like
- * count(*).
+ * analytic function path. e.g. row_number() over (order by test). Additionally, there can be an
+ * expression for an analytical aggregate like sum(col) or the "all columns" wildcard like count(*).
*
* @author tw
*/
public class AnalyticExpression extends ASTNodeAccessImpl implements Expression {
+
private String name;
private Expression expression;
private Expression offset;
@@ -36,45 +37,55 @@ public class AnalyticExpression extends ASTNodeAccessImpl implements Expression
private AnalyticType type = AnalyticType.OVER;
private boolean distinct = false;
private boolean unique = false;
- private boolean ignoreNulls = false; // IGNORE NULLS inside function parameters
private boolean ignoreNullsOutside = false; // IGNORE NULLS outside function parameters
private Expression filterExpression = null;
private List funcOrderBy = null;
private String windowName = null; // refers to an external window definition (paritionBy,
- // orderBy, windowElement)
+ // orderBy, windowElement)
private WindowDefinition windowDef = new WindowDefinition();
+ private Function.HavingClause havingClause;
+
+ private Function.NullHandling nullHandling = null;
+
+ private Limit limit = null;
+
public AnalyticExpression() {}
public AnalyticExpression(Function function) {
- name = function.getName();
- allColumns = function.isAllColumns();
- distinct = function.isDistinct();
- unique = function.isUnique();
- funcOrderBy = function.getOrderByElements();
+ this.name = String.join(" ", function.getMultipartName());
+ this.allColumns = function.isAllColumns();
+ this.distinct = function.isDistinct();
+ this.unique = function.isUnique();
+
ExpressionList extends Expression> list = function.getParameters();
if (list != null) {
- if (list.getExpressions().size() > 3) {
+ if (list.size() > 3) {
throw new IllegalArgumentException(
"function object not valid to initialize analytic expression");
}
expression = list.get(0);
- if (list.getExpressions().size() > 1) {
+ if (list.size() > 1) {
offset = list.get(1);
}
- if (list.getExpressions().size() > 2) {
+ if (list.size() > 2) {
defaultValue = list.get(2);
}
}
- ignoreNulls = function.isIgnoreNulls();
- keep = function.getKeep();
+ this.havingClause = function.getHavingClause();
+ this.ignoreNullsOutside = function.isIgnoreNullsOutside();
+ this.nullHandling = function.getNullHandling();
+ this.funcOrderBy = function.getOrderByElements();
+ this.limit = function.getLimit();
+ this.keep = function.getKeep();
}
+
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public List getOrderByElements() {
@@ -93,15 +104,15 @@ public void setKeep(KeepExpression keep) {
this.keep = keep;
}
- public ExpressionList getPartitionExpressionList() {
+ public ExpressionList> getPartitionExpressionList() {
return windowDef.partitionBy.getPartitionExpressionList();
}
- public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
+ public void setPartitionExpressionList(ExpressionList> partitionExpressionList) {
setPartitionExpressionList(partitionExpressionList, false);
}
- public void setPartitionExpressionList(ExpressionList partitionExpressionList,
+ public void setPartitionExpressionList(ExpressionList> partitionExpressionList,
boolean brackets) {
windowDef.partitionBy.setPartitionExpressionList(partitionExpressionList, brackets);
}
@@ -175,11 +186,11 @@ public void setUnique(boolean unique) {
}
public boolean isIgnoreNulls() {
- return ignoreNulls;
+ return this.nullHandling == Function.NullHandling.IGNORE_NULLS;
}
public void setIgnoreNulls(boolean ignoreNulls) {
- this.ignoreNulls = ignoreNulls;
+ this.nullHandling = ignoreNulls ? Function.NullHandling.IGNORE_NULLS : null;
}
public boolean isIgnoreNullsOutside() {
@@ -206,6 +217,41 @@ public void setWindowDefinition(WindowDefinition windowDef) {
this.windowDef = windowDef;
}
+
+ public Function.HavingClause getHavingClause() {
+ return havingClause;
+ }
+
+ public AnalyticExpression setHavingClause(Function.HavingClause havingClause) {
+ this.havingClause = havingClause;
+ return this;
+ }
+
+ public AnalyticExpression setHavingClause(String havingType, Expression expression) {
+ this.havingClause = new Function.HavingClause(
+ Function.HavingClause.HavingType.valueOf(havingType.trim().toUpperCase()),
+ expression);
+ return this;
+ }
+
+ public Function.NullHandling getNullHandling() {
+ return nullHandling;
+ }
+
+ public AnalyticExpression setNullHandling(Function.NullHandling nullHandling) {
+ this.nullHandling = nullHandling;
+ return this;
+ }
+
+ public Limit getLimit() {
+ return limit;
+ }
+
+ public AnalyticExpression setLimit(Limit limit) {
+ this.limit = limit;
+ return this;
+ }
+
@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity",
"PMD.MissingBreakInSwitch"})
@@ -217,40 +263,64 @@ public String toString() {
b.append("DISTINCT ");
}
if (expression != null) {
- b.append(expression.toString());
+ b.append(expression);
if (offset != null) {
- b.append(", ").append(offset.toString());
+ b.append(", ").append(offset);
if (defaultValue != null) {
- b.append(", ").append(defaultValue.toString());
+ b.append(", ").append(defaultValue);
}
}
} else if (isAllColumns()) {
b.append("*");
}
- if (isIgnoreNulls()) {
- b.append(" IGNORE NULLS");
+
+ if (havingClause != null) {
+ havingClause.appendTo(b);
+ }
+
+ if (nullHandling != null && !ignoreNullsOutside) {
+ switch (nullHandling) {
+ case IGNORE_NULLS:
+ b.append(" IGNORE NULLS");
+ break;
+ case RESPECT_NULLS:
+ b.append(" RESPECT NULLS");
+ break;
+ }
}
+
if (funcOrderBy != null) {
b.append(" ORDER BY ");
b.append(funcOrderBy.stream().map(OrderByElement::toString).collect(joining(", ")));
}
+ if (limit != null) {
+ b.append(limit);
+ }
+
b.append(") ");
if (keep != null) {
- b.append(keep.toString()).append(" ");
+ b.append(keep).append(" ");
}
if (filterExpression != null) {
b.append("FILTER (WHERE ");
- b.append(filterExpression.toString());
+ b.append(filterExpression);
b.append(")");
if (type != AnalyticType.FILTER_ONLY) {
b.append(" ");
}
}
- if (isIgnoreNullsOutside()) {
- b.append("IGNORE NULLS ");
+ if (nullHandling != null && ignoreNullsOutside) {
+ switch (nullHandling) {
+ case IGNORE_NULLS:
+ b.append(" IGNORE NULLS ");
+ break;
+ case RESPECT_NULLS:
+ b.append(" RESPECT NULLS ");
+ break;
+ }
}
switch (type) {
diff --git a/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java b/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java
index f7a9368c0..cf3ba46d5 100644
--- a/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java
@@ -32,8 +32,8 @@ public Select getSelect() {
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public AnyType getAnyType() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java b/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
index 267708dc4..c7fe031ab 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ArrayConstructor.java
@@ -16,6 +16,15 @@ public class ArrayConstructor extends ASTNodeAccessImpl implements Expression {
private ExpressionList> expressions;
private boolean arrayKeyword;
+ public ArrayConstructor(ExpressionList> expressions, boolean arrayKeyword) {
+ this.expressions = expressions;
+ this.arrayKeyword = arrayKeyword;
+ }
+
+ public ArrayConstructor(Expression... expressions) {
+ this(new ExpressionList(expressions), false);
+ }
+
public ExpressionList> getExpressions() {
return expressions;
}
@@ -32,14 +41,9 @@ public void setArrayKeyword(boolean arrayKeyword) {
this.arrayKeyword = arrayKeyword;
}
- public ArrayConstructor(ExpressionList> expressions, boolean arrayKeyword) {
- this.expressions = expressions;
- this.arrayKeyword = arrayKeyword;
- }
-
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
@Override
diff --git a/src/main/java/net/sf/jsqlparser/expression/ArrayExpression.java b/src/main/java/net/sf/jsqlparser/expression/ArrayExpression.java
index aef63b8f6..e86f34cad 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ArrayExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ArrayExpression.java
@@ -23,13 +23,23 @@ public ArrayExpression() {
// empty constructor
}
- public ArrayExpression(Expression objExpression, Expression indexExpression, Expression startIndexExpression, Expression stopIndexExpression) {
+ public ArrayExpression(Expression objExpression, Expression indexExpression,
+ Expression startIndexExpression, Expression stopIndexExpression) {
this.objExpression = objExpression;
this.indexExpression = indexExpression;
this.startIndexExpression = startIndexExpression;
this.stopIndexExpression = stopIndexExpression;
}
+ public ArrayExpression(Expression objExpression, Expression indexExpression) {
+ this(objExpression, indexExpression, null, null);
+ }
+
+ public ArrayExpression(Expression objExpression, Expression startIndexExpression,
+ Expression stopIndexExpression) {
+ this(objExpression, null, startIndexExpression, stopIndexExpression);
+ }
+
public Expression getObjExpression() {
return objExpression;
}
@@ -63,8 +73,8 @@ public void setStopIndexExpression(Expression stopIndexExpression) {
}
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
@Override
@@ -90,7 +100,8 @@ public ArrayExpression withIndexExpression(Expression indexExpression) {
return this;
}
- public ArrayExpression withRangeExpression(Expression startIndexExpression, Expression stopIndexExpression) {
+ public ArrayExpression withRangeExpression(Expression startIndexExpression,
+ Expression stopIndexExpression) {
this.setStartIndexExpression(startIndexExpression);
this.setStopIndexExpression(stopIndexExpression);
return this;
diff --git a/src/main/java/net/sf/jsqlparser/expression/BinaryExpression.java b/src/main/java/net/sf/jsqlparser/expression/BinaryExpression.java
index 848783206..ffd9c2d84 100644
--- a/src/main/java/net/sf/jsqlparser/expression/BinaryExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/BinaryExpression.java
@@ -9,8 +9,27 @@
*/
package net.sf.jsqlparser.expression;
+import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
+import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd;
+import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift;
+import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr;
+import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift;
+import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor;
+import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
+import net.sf.jsqlparser.expression.operators.arithmetic.Division;
+import net.sf.jsqlparser.expression.operators.arithmetic.IntegerDivision;
+import net.sf.jsqlparser.expression.operators.arithmetic.Modulo;
+import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication;
+import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
+import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.Iterator;
+
/**
* A basic class for binary expressions, that is expressions having a left member and a right member
* which are in turn expressions.
@@ -20,39 +39,219 @@ public abstract class BinaryExpression extends ASTNodeAccessImpl implements Expr
private Expression leftExpression;
private Expression rightExpression;
- public BinaryExpression() {
+ public BinaryExpression() {}
+
+ public BinaryExpression(Expression leftExpression, Expression rightExpression) {
+ this.leftExpression = leftExpression;
+ this.rightExpression = rightExpression;
+ }
+
+ public static Expression build(Class extends BinaryExpression> clz, Expression... expressions)
+ throws NoSuchMethodException, InvocationTargetException, InstantiationException,
+ IllegalAccessException {
+ switch (expressions.length) {
+ case 0:
+ return new NullValue();
+ case 1:
+ return expressions[0];
+ default:
+ Iterator it = Arrays.stream(expressions).iterator();
+
+ Expression leftExpression = it.next();
+ Expression rightExpression = it.next();
+ BinaryExpression binaryExpression =
+ clz.getConstructor(Expression.class, Expression.class)
+ .newInstance(leftExpression, rightExpression);
+
+ while (it.hasNext()) {
+ rightExpression = it.next();
+ binaryExpression = clz.getConstructor(Expression.class, Expression.class)
+ .newInstance(binaryExpression, rightExpression);
+ }
+ return binaryExpression;
+ }
+ }
+
+ public static Expression add(Expression... expressions) {
+ try {
+ return build(Addition.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression bitAnd(Expression... expressions) {
+ try {
+ return build(BitwiseAnd.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression bitShiftLeft(Expression... expressions) {
+ try {
+ return build(BitwiseLeftShift.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression multiply(Expression... expressions) {
+ try {
+ return build(Multiplication.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression bitOr(Expression... expressions) {
+ try {
+ return build(BitwiseOr.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression bitShiftRight(Expression... expressions) {
+ try {
+ return build(BitwiseRightShift.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression bitXor(Expression... expressions) {
+ try {
+ return build(BitwiseXor.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression concat(Expression... expressions) {
+ try {
+ return build(Concat.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression divide(Expression... expressions) {
+ try {
+ return build(Division.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression divideInt(Expression... expressions) {
+ try {
+ return build(IntegerDivision.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression modulo(Expression... expressions) {
+ try {
+ return build(Modulo.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression subtract(Expression... expressions) {
+ try {
+ return build(Subtraction.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression or(Expression... expressions) {
+ try {
+ return build(OrExpression.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression xor(Expression... expressions) {
+ try {
+ return build(XorExpression.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Expression and(Expression... expressions) {
+ try {
+ return build(AndExpression.class, expressions);
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException
+ | IllegalAccessException e) {
+ // this should never happen, at least I don't see how
+ throw new RuntimeException(e);
+ }
}
public Expression getLeftExpression() {
return leftExpression;
}
+ public void setLeftExpression(Expression expression) {
+ leftExpression = expression;
+ }
+
public Expression getRightExpression() {
return rightExpression;
}
+ public void setRightExpression(Expression expression) {
+ rightExpression = expression;
+ }
+
public BinaryExpression withLeftExpression(Expression expression) {
setLeftExpression(expression);
return this;
}
- public void setLeftExpression(Expression expression) {
- leftExpression = expression;
- }
-
public BinaryExpression withRightExpression(Expression expression) {
setRightExpression(expression);
return this;
}
- public void setRightExpression(Expression expression) {
- rightExpression = expression;
- }
-
@Override
public String toString() {
return // (not ? "NOT " : "") +
- getLeftExpression() + " " + getStringExpression() + " " + getRightExpression();
+ getLeftExpression() + " " + getStringExpression() + " " + getRightExpression();
}
public abstract String getStringExpression();
diff --git a/src/main/java/net/sf/jsqlparser/expression/CaseExpression.java b/src/main/java/net/sf/jsqlparser/expression/CaseExpression.java
index 371c40bf0..10fd7d56d 100644
--- a/src/main/java/net/sf/jsqlparser/expression/CaseExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/CaseExpression.java
@@ -10,36 +10,43 @@
package net.sf.jsqlparser.expression;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
import net.sf.jsqlparser.statement.select.PlainSelect;
/**
* CASE/WHEN expression.
+ *
+ * Syntax:
*
- * Syntax:
+ *
+ *
* CASE
* WHEN condition THEN expression
* [WHEN condition THEN expression]...
* [ELSE expression]
* END
- *
+ *
+ *
*
*
* or
*
*
- *
+ *
+ *
* CASE expression
* WHEN condition THEN expression
* [WHEN condition THEN expression]...
* [ELSE expression]
* END
- *
- *
+ *
+ *
*/
public class CaseExpression extends ASTNodeAccessImpl implements Expression {
@@ -48,9 +55,21 @@ public class CaseExpression extends ASTNodeAccessImpl implements Expression {
private List whenClauses;
private Expression elseExpression;
+ public CaseExpression() {}
+
+ public CaseExpression(WhenClause... whenClauses) {
+ this.whenClauses = Arrays.asList(whenClauses);
+ }
+
+ public CaseExpression(Expression elseExpression, WhenClause... whenClauses) {
+ this.elseExpression = elseExpression;
+ this.whenClauses = Arrays.asList(whenClauses);
+ }
+
+
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public Expression getSwitchExpression() {
@@ -91,9 +110,11 @@ public void setWhenClauses(List whenClauses) {
@Override
public String toString() {
- return (usingBrackets ? "(" : "") + "CASE " + ((switchExpression != null) ? switchExpression + " " : "")
+ return (usingBrackets ? "(" : "") + "CASE "
+ + ((switchExpression != null) ? switchExpression + " " : "")
+ PlainSelect.getStringList(whenClauses, false, false) + " "
- + ((elseExpression != null) ? "ELSE " + elseExpression + " " : "") + "END" + (usingBrackets ? ")" : "");
+ + ((elseExpression != null) ? "ELSE " + elseExpression + " " : "") + "END"
+ + (usingBrackets ? ")" : "");
}
public CaseExpression withSwitchExpression(Expression switchExpression) {
@@ -101,6 +122,10 @@ public CaseExpression withSwitchExpression(Expression switchExpression) {
return this;
}
+ public CaseExpression withWhenClauses(WhenClause... whenClauses) {
+ return this.withWhenClauses(Arrays.asList(whenClauses));
+ }
+
public CaseExpression withWhenClauses(List whenClauses) {
this.setWhenClauses(whenClauses);
return this;
@@ -112,13 +137,15 @@ public CaseExpression withElseExpression(Expression elseExpression) {
}
public CaseExpression addWhenClauses(WhenClause... whenClauses) {
- List collection = Optional.ofNullable(getWhenClauses()).orElseGet(ArrayList::new);
+ List collection =
+ Optional.ofNullable(getWhenClauses()).orElseGet(ArrayList::new);
Collections.addAll(collection, whenClauses);
return this.withWhenClauses(collection);
}
public CaseExpression addWhenClauses(Collection extends WhenClause> whenClauses) {
- List collection = Optional.ofNullable(getWhenClauses()).orElseGet(ArrayList::new);
+ List collection =
+ Optional.ofNullable(getWhenClauses()).orElseGet(ArrayList::new);
collection.addAll(whenClauses);
return this.withWhenClauses(collection);
}
@@ -131,25 +158,25 @@ public E getElseExpression(Class 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;
+ /**
+ * @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;
}
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/CastExpression.java b/src/main/java/net/sf/jsqlparser/expression/CastExpression.java
index d928a26b2..8325e493a 100644
--- a/src/main/java/net/sf/jsqlparser/expression/CastExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/CastExpression.java
@@ -15,14 +15,68 @@
import net.sf.jsqlparser.statement.select.Select;
import java.util.ArrayList;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class CastExpression extends ASTNodeAccessImpl implements Expression {
+ private final static Pattern PATTERN =
+ Pattern.compile("(^[a-z0-9_]*){1}", Pattern.CASE_INSENSITIVE);
public String keyword;
private Expression leftExpression;
private ColDataType colDataType = null;
private ArrayList columnDefinitions = new ArrayList<>();
- private boolean useCastKeyword = true;
+
+ private boolean isImplicitCast = false;
+
+ // BigQuery specific FORMAT clause:
+ // https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_functions#cast_as_date
+ private String format = null;
+
+ public CastExpression(String keyword, Expression leftExpression, String dataType) {
+ this.keyword = keyword;
+ this.leftExpression = leftExpression;
+ this.colDataType = new ColDataType(dataType);
+ }
+
+ // Implicit Cast
+ public CastExpression(String dataType, String value) {
+ this.keyword = null;
+ this.isImplicitCast = true;
+ this.colDataType = new ColDataType(dataType);
+ this.leftExpression = new StringValue(value);
+ }
+
+ public CastExpression(ColDataType colDataType, String value) {
+ this.keyword = null;
+ this.isImplicitCast = true;
+ this.colDataType = colDataType;
+ this.leftExpression = new StringValue(value);
+ }
+
+ public CastExpression(ColDataType colDataType, Long value) {
+ this.keyword = null;
+ this.isImplicitCast = true;
+ this.colDataType = colDataType;
+ this.leftExpression = new LongValue(value);
+ }
+
+ public CastExpression(ColDataType colDataType, Double value) {
+ this.keyword = null;
+ this.isImplicitCast = true;
+ this.colDataType = colDataType;
+ this.leftExpression = new DoubleValue(value);
+ }
+
+ public CastExpression(Expression leftExpression, String dataType) {
+ this.keyword = null;
+ this.leftExpression = leftExpression;
+ this.colDataType = new ColDataType(dataType);
+ }
+
public CastExpression(String keyword) {
this.keyword = keyword;
@@ -32,18 +86,64 @@ public CastExpression() {
this("CAST");
}
- public ColDataType getColDataType() {
- return colDataType;
+ public static boolean isOf(ColDataType colDataType, DataType... types) {
+ return Set.of(types).contains(DataType.from(colDataType.getDataType()));
}
- public ArrayList getColumnDefinitions() {
- return columnDefinitions;
+ public static boolean isTime(ColDataType colDataType) {
+ return isOf(colDataType, DataType.TIME, DataType.TIME_WITH_TIME_ZONE,
+ DataType.TIME_WITHOUT_TIME_ZONE);
+ }
+
+ public static boolean isTimeStamp(ColDataType colDataType) {
+ return isOf(colDataType, DataType.TIMESTAMP_NS, DataType.TIMESTAMP,
+ DataType.TIMESTAMP_WITHOUT_TIME_ZONE,
+ DataType.DATETIME, DataType.TIMESTAMP_MS, DataType.TIMESTAMP_S,
+ DataType.TIMESTAMPTZ, DataType.TIMESTAMP_WITH_TIME_ZONE);
+ }
+
+ public static boolean isDate(ColDataType colDataType) {
+ return isOf(colDataType, DataType.DATE);
+ }
+
+ public static boolean isBLOB(ColDataType colDataType) {
+ return isOf(colDataType, DataType.BLOB, DataType.BYTEA, DataType.BINARY, DataType.VARBINARY,
+ DataType.BYTES, DataType.VARBYTE);
+ }
+
+ public static boolean isFloat(ColDataType colDataType) {
+ return isOf(colDataType, DataType.REAL, DataType.FLOAT4, DataType.FLOAT, DataType.DOUBLE,
+ DataType.DOUBLE_PRECISION, DataType.FLOAT8);
+ }
+
+ public static boolean isInteger(ColDataType colDataType) {
+ return isOf(colDataType, DataType.TINYINT, DataType.INT1, DataType.SMALLINT, DataType.INT2,
+ DataType.SHORT, DataType.INTEGER, DataType.INT4, DataType.INT, DataType.SIGNED,
+ DataType.BIGINT, DataType.INT8, DataType.LONG, DataType.HUGEINT, DataType.UTINYINT,
+ DataType.USMALLINT, DataType.UINTEGER, DataType.UBIGINT, DataType.UHUGEINT);
+ }
+
+ public static boolean isDecimal(ColDataType colDataType) {
+ return isOf(colDataType, DataType.DECIMAL, DataType.NUMBER, DataType.NUMERIC);
+ }
+
+ public static boolean isText(ColDataType colDataType) {
+ return isOf(colDataType, DataType.VARCHAR, DataType.NVARCHAR, DataType.CHAR, DataType.NCHAR,
+ DataType.BPCHAR, DataType.STRING, DataType.TEXT, DataType.CLOB);
+ }
+
+ public ColDataType getColDataType() {
+ return colDataType;
}
public void setColDataType(ColDataType colDataType) {
this.colDataType = colDataType;
}
+ public ArrayList getColumnDefinitions() {
+ return columnDefinitions;
+ }
+
public void addColumnDefinition(ColumnDefinition columnDefinition) {
this.columnDefinitions.add(columnDefinition);
}
@@ -56,26 +156,58 @@ public void setLeftExpression(Expression expression) {
leftExpression = expression;
}
+ public boolean isImplicitCast() {
+ return isImplicitCast;
+ }
+
+ public CastExpression setImplicitCast(boolean implicitCast) {
+ isImplicitCast = implicitCast;
+ return this;
+ }
+
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
+ @Deprecated
public boolean isUseCastKeyword() {
- return useCastKeyword;
+ return keyword != null && !keyword.isEmpty();
}
+ @Deprecated
public void setUseCastKeyword(boolean useCastKeyword) {
- this.useCastKeyword = useCastKeyword;
+ if (useCastKeyword) {
+ if (keyword == null || keyword.isEmpty()) {
+ keyword = "CAST";
+ }
+ } else {
+ keyword = null;
+ }
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public CastExpression setFormat(String format) {
+ this.format = format;
+ return this;
}
@Override
public String toString() {
- if (useCastKeyword) {
+ String formatStr = format != null && !format.isEmpty()
+ ? " FORMAT " + format
+ : "";
+ if (isImplicitCast) {
+ return colDataType + " " + leftExpression;
+ } else if (keyword != null && !keyword.isEmpty()) {
return columnDefinitions.size() > 1
? keyword + "(" + leftExpression + " AS ROW("
- + Select.getStringList(columnDefinitions) + "))"
- : keyword + "(" + leftExpression + " AS " + colDataType.toString() + ")";
+ + Select.getStringList(columnDefinitions) + ")" + formatStr + ")"
+ : keyword + "(" + leftExpression + " AS " + colDataType.toString() + formatStr
+ + ")";
} else {
return leftExpression + "::" + colDataType.toString();
}
@@ -99,4 +231,65 @@ public CastExpression withLeftExpression(Expression leftExpression) {
public E getLeftExpression(Class type) {
return type.cast(getLeftExpression());
}
+
+ public boolean isOf(CastExpression anotherCast) {
+ return this.colDataType.equals(anotherCast.colDataType);
+ }
+
+ public boolean isOf(DataType... types) {
+ return Set.of(types).contains(DataType.from(colDataType.getDataType()));
+ }
+
+ public boolean isTime() {
+ return isTime(this.colDataType);
+ }
+
+ public boolean isTimeStamp() {
+ return isTimeStamp(this.colDataType);
+ }
+
+ public boolean isDate() {
+ return isDate(this.colDataType);
+ }
+
+ public boolean isBLOB() {
+ return isBLOB(this.colDataType);
+ }
+
+ public boolean isFloat() {
+ return isFloat(this.colDataType);
+ }
+
+ public boolean isInteger() {
+ return isInteger(this.colDataType);
+ }
+
+ public boolean isDecimal() {
+ return isDecimal(this.colDataType);
+ }
+
+ public boolean isText() {
+ return isText(this.colDataType);
+ }
+
+ public enum DataType {
+ ARRAY, BIT, BITSTRING, BLOB, BYTEA, BINARY, VARBINARY, BYTES, BOOLEAN, BOOL, ENUM, INTERVAL, LIST, MAP, STRUCT, TINYINT, INT1, SMALLINT, INT2, SHORT, INTEGER, INT4, INT, SIGNED, BIGINT, INT8, LONG, HUGEINT, UTINYINT, USMALLINT, UINTEGER, UBIGINT, UHUGEINT, DECIMAL, NUMBER, NUMERIC, REAL, FLOAT4, FLOAT, DOUBLE, DOUBLE_PRECISION, FLOAT8, FLOAT64, UUID, VARCHAR, NVARCHAR, CHAR, NCHAR, BPCHAR, STRING, TEXT, CLOB, DATE, TIME, TIME_WITHOUT_TIME_ZONE, TIMETZ, TIME_WITH_TIME_ZONE, TIMESTAMP_NS, TIMESTAMP, TIMESTAMP_WITHOUT_TIME_ZONE, DATETIME, TIMESTAMP_MS, TIMESTAMP_S, TIMESTAMPTZ, TIMESTAMP_WITH_TIME_ZONE, UNKNOWN, VARBYTE;
+
+ public static DataType from(String typeStr) {
+ Matcher matcher = PATTERN.matcher(typeStr.trim().replaceAll("\\s+", "_").toUpperCase());
+ if (matcher.find()) {
+ try {
+ return Enum.valueOf(DataType.class, matcher.group(0));
+ } catch (Exception ex) {
+ Logger.getLogger(CastExpression.class.getName()).log(Level.FINE,
+ "Type " + typeStr + " unknown", ex);
+ return DataType.UNKNOWN;
+ }
+ } else {
+ Logger.getLogger(CastExpression.class.getName()).log(Level.FINE,
+ "Type " + typeStr + " unknown");
+ return DataType.UNKNOWN;
+ }
+ }
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/CollateExpression.java b/src/main/java/net/sf/jsqlparser/expression/CollateExpression.java
index 07c2b8616..8a419b241 100644
--- a/src/main/java/net/sf/jsqlparser/expression/CollateExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/CollateExpression.java
@@ -26,8 +26,8 @@ public CollateExpression(Expression leftExpression, String collate) {
}
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public Expression getLeftExpression() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/ConnectByRootOperator.java b/src/main/java/net/sf/jsqlparser/expression/ConnectByRootOperator.java
index 817023422..6942f0787 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ConnectByRootOperator.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ConnectByRootOperator.java
@@ -26,18 +26,19 @@
package net.sf.jsqlparser.expression;
import java.util.Objects;
+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
import net.sf.jsqlparser.schema.Column;
/**
- *
* @author are
*/
public class ConnectByRootOperator extends ASTNodeAccessImpl implements Expression {
private final Column column;
public ConnectByRootOperator(Column column) {
- this.column = Objects.requireNonNull(column, "The COLUMN of the ConnectByRoot Operator must not be null");
+ this.column = Objects.requireNonNull(column,
+ "The COLUMN of the ConnectByRoot Operator must not be null");
}
public Column getColumn() {
@@ -45,15 +46,15 @@ public Column getColumn() {
}
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
-
+
public StringBuilder appendTo(StringBuilder builder) {
builder.append("CONNECT_BY_ROOT ").append(column);
return builder;
}
-
+
@Override
public String toString() {
return appendTo(new StringBuilder()).toString();
diff --git a/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java b/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
index 9290e882b..3510fe6d3 100644
--- a/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java
@@ -33,8 +33,8 @@ public void setType(DateTime type) {
}
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
@Override
@@ -53,7 +53,7 @@ public DateTimeLiteralExpression withType(DateTime type) {
}
public enum DateTime {
- DATE, TIME, TIMESTAMP, TIMESTAMPTZ;
+ DATE, DATETIME, TIME, TIMESTAMP, TIMESTAMPTZ;
public static DateTime from(String dateTimeStr) {
return Enum.valueOf(DateTime.class, dateTimeStr.toUpperCase());
diff --git a/src/main/java/net/sf/jsqlparser/expression/DateValue.java b/src/main/java/net/sf/jsqlparser/expression/DateValue.java
index 8c28a5fdd..d03a73c66 100644
--- a/src/main/java/net/sf/jsqlparser/expression/DateValue.java
+++ b/src/main/java/net/sf/jsqlparser/expression/DateValue.java
@@ -38,8 +38,8 @@ public DateValue(String value) {
}
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public Date getValue() {
diff --git a/src/main/java/net/sf/jsqlparser/expression/DoubleValue.java b/src/main/java/net/sf/jsqlparser/expression/DoubleValue.java
index 910ad722e..8d25aa61a 100644
--- a/src/main/java/net/sf/jsqlparser/expression/DoubleValue.java
+++ b/src/main/java/net/sf/jsqlparser/expression/DoubleValue.java
@@ -16,7 +16,7 @@
*/
public class DoubleValue extends ASTNodeAccessImpl implements Expression {
- private double value;
+ private Double value;
private String stringValue;
public DoubleValue() {
@@ -35,17 +35,23 @@ public DoubleValue(final String value) {
this.stringValue = val;
}
+ public DoubleValue(final double value) {
+ this.value = value;
+ this.stringValue = String.valueOf(value);
+ }
+
@Override
- public void accept(ExpressionVisitor expressionVisitor) {
- expressionVisitor.visit(this);
+ public T accept(ExpressionVisitor expressionVisitor, S context) {
+ return expressionVisitor.visit(this, context);
}
public double getValue() {
return value;
}
- public void setValue(double d) {
+ public void setValue(Double d) {
value = d;
+ stringValue = String.valueOf(value);
}
@Override
@@ -53,7 +59,7 @@ public String toString() {
return stringValue;
}
- public DoubleValue withValue(double value) {
+ public DoubleValue withValue(Double value) {
this.setValue(value);
return this;
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/Expression.java b/src/main/java/net/sf/jsqlparser/expression/Expression.java
index daeb2da83..a4807583a 100644
--- a/src/main/java/net/sf/jsqlparser/expression/Expression.java
+++ b/src/main/java/net/sf/jsqlparser/expression/Expression.java
@@ -14,6 +14,13 @@
public interface Expression extends ASTNodeAccess, Model {
- void accept(ExpressionVisitor expressionVisitor);
+ T accept(ExpressionVisitor expressionVisitor, S context);
+
+ default void accept(ExpressionVisitor expressionVisitor) {
+ this.accept(expressionVisitor, null);
+ }
+
+ ;
+
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
index d0fe61a91..985547fc6 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java
@@ -29,6 +29,7 @@
import net.sf.jsqlparser.expression.operators.relational.Contains;
import net.sf.jsqlparser.expression.operators.relational.DoubleAnd;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
+import net.sf.jsqlparser.expression.operators.relational.ExcludesExpression;
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.FullTextSearch;
@@ -36,6 +37,7 @@
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.IncludesExpression;
import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
@@ -56,194 +58,587 @@
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
import net.sf.jsqlparser.statement.select.Select;
-public interface ExpressionVisitor {
+public interface ExpressionVisitor {
- void visit(BitwiseRightShift aThis);
+ T visit(BitwiseRightShift bitwiseRightShift, S context);
- void visit(BitwiseLeftShift aThis);
+ default void visit(BitwiseRightShift bitwiseRightShift) {
+ this.visit(bitwiseRightShift, null);
+ }
- void visit(NullValue nullValue);
+ T visit(BitwiseLeftShift bitwiseLeftShift, S context);
- void visit(Function function);
+ default void visit(BitwiseLeftShift bitwiseLeftShift) {
+ this.visit(bitwiseLeftShift, null);
+ }
- void visit(SignedExpression signedExpression);
+ T visit(NullValue nullValue, S context);
- void visit(JdbcParameter jdbcParameter);
+ default void visit(NullValue nullValue) {
+ this.visit(nullValue, null);
+ }
- void visit(JdbcNamedParameter jdbcNamedParameter);
+ T visit(Function function, S context);
- void visit(DoubleValue doubleValue);
+ default void visit(Function function) {
+ this.visit(function, null);
+ }
- void visit(LongValue longValue);
+ T visit(SignedExpression signedExpression, S context);
- void visit(HexValue hexValue);
+ default void visit(SignedExpression signedExpression) {
+ this.visit(signedExpression, null);
+ }
- void visit(DateValue dateValue);
+ T visit(JdbcParameter jdbcParameter, S context);
- void visit(TimeValue timeValue);
+ default void visit(JdbcParameter jdbcParameter) {
+ this.visit(jdbcParameter, null);
+ }
- void visit(TimestampValue timestampValue);
+ T visit(JdbcNamedParameter jdbcNamedParameter, S context);
- void visit(Parenthesis parenthesis);
+ default void visit(JdbcNamedParameter jdbcNamedParameter) {
+ this.visit(jdbcNamedParameter, null);
+ }
- void visit(StringValue stringValue);
+ T visit(DoubleValue doubleValue, S context);
- void visit(Addition addition);
+ default void visit(DoubleValue doubleValue) {
+ this.visit(doubleValue, null);
+ }
- void visit(Division division);
+ T visit(LongValue longValue, S context);
- void visit(IntegerDivision division);
+ default void visit(LongValue longValue) {
+ this.visit(longValue, null);
+ }
- void visit(Multiplication multiplication);
+ T visit(HexValue hexValue, S context);
- void visit(Subtraction subtraction);
+ default void visit(HexValue hexValue) {
+ this.visit(hexValue, null);
+ }
- void visit(AndExpression andExpression);
+ T visit(DateValue dateValue, S context);
- void visit(OrExpression orExpression);
+ default void visit(DateValue dateValue) {
+ this.visit(dateValue, null);
+ }
- void visit(XorExpression orExpression);
+ T visit(TimeValue timeValue, S context);
- void visit(Between between);
+ default void visit(TimeValue timeValue) {
+ this.visit(timeValue, null);
+ }
- void visit(OverlapsCondition overlapsCondition);
+ T visit(TimestampValue timestampValue, S context);
- void visit(EqualsTo equalsTo);
+ default void visit(TimestampValue timestampValue) {
+ this.visit(timestampValue, null);
+ }
- void visit(GreaterThan greaterThan);
+ T visit(StringValue stringValue, S context);
- void visit(GreaterThanEquals greaterThanEquals);
+ default void visit(StringValue stringValue) {
+ this.visit(stringValue, null);
+ }
- void visit(InExpression inExpression);
+ T visit(Addition addition, S context);
- void visit(FullTextSearch fullTextSearch);
+ default void visit(Addition addition) {
+ this.visit(addition, null);
+ }
- void visit(IsNullExpression isNullExpression);
+ T visit(Division division, S context);
- void visit(IsBooleanExpression isBooleanExpression);
+ default void visit(Division division) {
+ this.visit(division, null);
+ }
- void visit(LikeExpression likeExpression);
+ T visit(IntegerDivision integerDivision, S context);
- void visit(MinorThan minorThan);
+ default void visit(IntegerDivision integerDivision) {
+ this.visit(integerDivision, null);
+ }
- void visit(MinorThanEquals minorThanEquals);
+ T visit(Multiplication multiplication, S context);
- void visit(NotEqualsTo notEqualsTo);
+ default void visit(Multiplication multiplication) {
+ this.visit(multiplication, null);
+ }
- void visit(DoubleAnd doubleAnd);
+ T visit(Subtraction subtraction, S context);
- void visit(Contains contains);
+ default void visit(Subtraction subtraction) {
+ this.visit(subtraction, null);
+ }
- void visit(ContainedBy containedBy);
+ T visit(AndExpression andExpression, S context);
- void visit(ParenthesedSelect selectBody);
+ default void visit(AndExpression andExpression) {
+ this.visit(andExpression, null);
+ }
- void visit(Column tableColumn);
+ T visit(OrExpression orExpression, S context);
- void visit(CaseExpression caseExpression);
+ default void visit(OrExpression orExpression) {
+ this.visit(orExpression, null);
+ }
- void visit(WhenClause whenClause);
+ T visit(XorExpression xorExpression, S context);
- void visit(ExistsExpression existsExpression);
+ default void visit(XorExpression xorExpression) {
+ this.visit(xorExpression, null);
+ }
- void visit(MemberOfExpression memberOfExpression);
+ T visit(Between between, S context);
- void visit(AnyComparisonExpression anyComparisonExpression);
+ default void visit(Between between) {
+ this.visit(between, null);
+ }
- void visit(Concat concat);
+ T visit(OverlapsCondition overlapsCondition, S context);
- void visit(Matches matches);
+ default void visit(OverlapsCondition overlapsCondition) {
+ this.visit(overlapsCondition, null);
+ }
- void visit(BitwiseAnd bitwiseAnd);
+ T visit(EqualsTo equalsTo, S context);
- void visit(BitwiseOr bitwiseOr);
+ default void visit(EqualsTo equalsTo) {
+ this.visit(equalsTo, null);
+ }
- void visit(BitwiseXor bitwiseXor);
+ T visit(GreaterThan greaterThan, S context);
- void visit(CastExpression cast);
+ default void visit(GreaterThan greaterThan) {
+ this.visit(greaterThan, null);
+ }
- void visit(Modulo modulo);
+ T visit(GreaterThanEquals greaterThanEquals, S context);
- void visit(AnalyticExpression aexpr);
+ default void visit(GreaterThanEquals greaterThanEquals) {
+ this.visit(greaterThanEquals, null);
+ }
- void visit(ExtractExpression eexpr);
+ T visit(InExpression inExpression, S context);
- void visit(IntervalExpression iexpr);
+ default void visit(InExpression inExpression) {
+ this.visit(inExpression, null);
+ }
- void visit(OracleHierarchicalExpression oexpr);
+ T visit(IncludesExpression includesExpression, S context);
- void visit(RegExpMatchOperator rexpr);
+ default void visit(IncludesExpression includesExpression) {
+ this.visit(includesExpression, null);
+ }
- void visit(JsonExpression jsonExpr);
+ T visit(ExcludesExpression excludesExpression, S context);
- void visit(JsonOperator jsonExpr);
+ default void visit(ExcludesExpression excludesExpression) {
+ this.visit(excludesExpression, null);
+ }
- void visit(UserVariable var);
+ T visit(FullTextSearch fullTextSearch, S context);
- void visit(NumericBind bind);
+ default void visit(FullTextSearch fullTextSearch) {
+ this.visit(fullTextSearch, null);
+ }
- void visit(KeepExpression aexpr);
+ T visit(IsNullExpression isNullExpression, S context);
- void visit(MySQLGroupConcat groupConcat);
+ default void visit(IsNullExpression isNullExpression) {
+ this.visit(isNullExpression, null);
+ }
- void visit(ExpressionList> expressionList);
+ T visit(IsBooleanExpression isBooleanExpression, S context);
- void visit(RowConstructor> rowConstructor);
+ default void visit(IsBooleanExpression isBooleanExpression) {
+ this.visit(isBooleanExpression, null);
+ }
- void visit(RowGetExpression rowGetExpression);
+ T visit(LikeExpression likeExpression, S context);
- void visit(OracleHint hint);
+ default void visit(LikeExpression likeExpression) {
+ this.visit(likeExpression, null);
+ }
- void visit(TimeKeyExpression timeKeyExpression);
+ T visit(MinorThan minorThan, S context);
- void visit(DateTimeLiteralExpression literal);
+ default void visit(MinorThan minorThan) {
+ this.visit(minorThan, null);
+ }
- void visit(NotExpression aThis);
+ T visit(MinorThanEquals minorThanEquals, S context);
- void visit(NextValExpression aThis);
+ default void visit(MinorThanEquals minorThanEquals) {
+ this.visit(minorThanEquals, null);
+ }
- void visit(CollateExpression aThis);
+ T visit(NotEqualsTo notEqualsTo, S context);
- void visit(SimilarToExpression aThis);
+ default void visit(NotEqualsTo notEqualsTo) {
+ this.visit(notEqualsTo, null);
+ }
- void visit(ArrayExpression aThis);
+ T visit(DoubleAnd doubleAnd, S context);
- void visit(ArrayConstructor aThis);
+ default void visit(DoubleAnd doubleAnd) {
+ this.visit(doubleAnd, null);
+ }
- void visit(VariableAssignment aThis);
+ T visit(Contains contains, S context);
- void visit(XMLSerializeExpr aThis);
+ default void visit(Contains contains) {
+ this.visit(contains, null);
+ }
- void visit(TimezoneExpression aThis);
+ T visit(ContainedBy containedBy, S context);
- void visit(JsonAggregateFunction aThis);
+ default void visit(ContainedBy containedBy) {
+ this.visit(containedBy, null);
+ }
- void visit(JsonFunction aThis);
+ T visit(ParenthesedSelect select, S context);
- void visit(ConnectByRootOperator aThis);
+ default void visit(ParenthesedSelect select) {
+ this.visit(select, null);
+ }
- void visit(OracleNamedFunctionParameter aThis);
+ T visit(Column column, S context);
- void visit(AllColumns allColumns);
+ default void visit(Column column) {
+ this.visit(column, null);
+ }
- void visit(AllTableColumns allTableColumns);
+ T visit(CaseExpression caseExpression, S context);
- void visit(AllValue allValue);
+ default void visit(CaseExpression caseExpression) {
+ this.visit(caseExpression, null);
+ }
- void visit(IsDistinctExpression isDistinctExpression);
+ T visit(WhenClause whenClause, S context);
- void visit(GeometryDistance geometryDistance);
+ default void visit(WhenClause whenClause) {
+ this.visit(whenClause, null);
+ }
- void visit(Select selectBody);
+ T visit(ExistsExpression existsExpression, S context);
- void visit(TranscodingFunction transcodingFunction);
+ default void visit(ExistsExpression existsExpression) {
+ this.visit(existsExpression, null);
+ }
- void visit(TrimFunction trimFunction);
+ T visit(MemberOfExpression memberOfExpression, S context);
- void visit(RangeExpression rangeExpression);
+ default void visit(MemberOfExpression memberOfExpression) {
+ this.visit(memberOfExpression, null);
+ }
- void visit(TSQLLeftJoin tsqlLeftJoin);
+ T visit(AnyComparisonExpression anyComparisonExpression, S context);
- void visit(TSQLRightJoin tsqlRightJoin);
+ default void visit(AnyComparisonExpression anyComparisonExpression) {
+ this.visit(anyComparisonExpression, null);
+ }
+ T visit(Concat concat, S context);
+
+ default void visit(Concat concat) {
+ this.visit(concat, null);
+ }
+
+ T visit(Matches matches, S context);
+
+ default void visit(Matches matches) {
+ this.visit(matches, null);
+ }
+
+ T visit(BitwiseAnd bitwiseAnd, S context);
+
+ default void visit(BitwiseAnd bitwiseAnd) {
+ this.visit(bitwiseAnd, null);
+ }
+
+ T visit(BitwiseOr bitwiseOr, S context);
+
+ default void visit(BitwiseOr bitwiseOr) {
+ this.visit(bitwiseOr, null);
+ }
+
+ T visit(BitwiseXor bitwiseXor, S context);
+
+ default void visit(BitwiseXor bitwiseXor) {
+ this.visit(bitwiseXor, null);
+ }
+
+ T visit(CastExpression castExpression, S context);
+
+ default void visit(CastExpression castExpression) {
+ this.visit(castExpression, null);
+ }
+
+ T visit(Modulo modulo, S context);
+
+ default void visit(Modulo modulo) {
+ this.visit(modulo, null);
+ }
+
+ T visit(AnalyticExpression analyticExpression, S context);
+
+ default void visit(AnalyticExpression analyticExpression) {
+ this.visit(analyticExpression, null);
+ }
+
+ T visit(ExtractExpression extractExpression, S context);
+
+ default void visit(ExtractExpression extractExpression) {
+ this.visit(extractExpression, null);
+ }
+
+ T visit(IntervalExpression intervalExpression, S context);
+
+ default void visit(IntervalExpression intervalExpression) {
+ this.visit(intervalExpression, null);
+ }
+
+ T visit(OracleHierarchicalExpression hierarchicalExpression, S context);
+
+ default void visit(OracleHierarchicalExpression hierarchicalExpression) {
+ this.visit(hierarchicalExpression, null);
+ }
+
+ T visit(RegExpMatchOperator regExpMatchOperator, S context);
+
+ default void visit(RegExpMatchOperator regExpMatchOperator) {
+ this.visit(regExpMatchOperator, null);
+ }
+
+ T visit(JsonExpression jsonExpression, S context);
+
+ default void visit(JsonExpression jsonExpression) {
+ this.visit(jsonExpression, null);
+ }
+
+ T visit(JsonOperator jsonOperator, S context);
+
+ default void visit(JsonOperator jsonOperator) {
+ this.visit(jsonOperator, null);
+ }
+
+ T visit(UserVariable userVariable, S context);
+
+ default void visit(UserVariable userVariable) {
+ this.visit(userVariable, null);
+ }
+
+ T visit(NumericBind numericBind, S context);
+
+ default void visit(NumericBind numericBind) {
+ this.visit(numericBind, null);
+ }
+
+ T visit(KeepExpression keepExpression, S context);
+
+ default void visit(KeepExpression keepExpression) {
+ this.visit(keepExpression, null);
+ }
+
+ T visit(MySQLGroupConcat groupConcat, S context);
+
+ default void visit(MySQLGroupConcat groupConcat) {
+ this.visit(groupConcat, null);
+ }
+
+ T visit(ExpressionList extends Expression> expressionList, S context);
+
+ default void visit(ExpressionList extends Expression> expressionList) {
+ this.visit(expressionList, null);
+ }
+
+ T visit(RowConstructor extends Expression> rowConstructor, S context);
+
+ default void visit(RowConstructor extends Expression> rowConstructor) {
+ this.visit(rowConstructor, null);
+ }
+
+ T visit(RowGetExpression rowGetExpression, S context);
+
+ default void visit(RowGetExpression rowGetExpression) {
+ this.visit(rowGetExpression, null);
+ }
+
+ T visit(OracleHint hint, S context);
+
+ default void visit(OracleHint hint) {
+ this.visit(hint, null);
+ }
+
+ T visit(TimeKeyExpression timeKeyExpression, S context);
+
+ default void visit(TimeKeyExpression timeKeyExpression) {
+ this.visit(timeKeyExpression, null);
+ }
+
+ T visit(DateTimeLiteralExpression dateTimeLiteralExpression, S context);
+
+ default void visit(DateTimeLiteralExpression dateTimeLiteralExpression) {
+ this.visit(dateTimeLiteralExpression, null);
+ }
+
+ T visit(NotExpression notExpression, S context);
+
+ default void visit(NotExpression notExpression) {
+ this.visit(notExpression, null);
+ }
+
+ T visit(NextValExpression nextValExpression, S context);
+
+ default void visit(NextValExpression nextValExpression) {
+ this.visit(nextValExpression, null);
+ }
+
+ T visit(CollateExpression collateExpression, S context);
+
+ default void visit(CollateExpression collateExpression) {
+ this.visit(collateExpression, null);
+ }
+
+ T visit(SimilarToExpression similarToExpression, S context);
+
+ default void visit(SimilarToExpression similarToExpression) {
+ this.visit(similarToExpression, null);
+ }
+
+ T visit(ArrayExpression arrayExpression, S context);
+
+ default void visit(ArrayExpression arrayExpression) {
+ this.visit(arrayExpression, null);
+ }
+
+ T visit(ArrayConstructor arrayConstructor, S context);
+
+ default void visit(ArrayConstructor arrayConstructor) {
+ this.visit(arrayConstructor, null);
+ }
+
+ T visit(VariableAssignment variableAssignment, S context);
+
+ default void visit(VariableAssignment variableAssignment) {
+ this.visit(variableAssignment, null);
+ }
+
+ T visit(XMLSerializeExpr xmlSerializeExpr, S context);
+
+ default void visit(XMLSerializeExpr xmlSerializeExpr) {
+ this.visit(xmlSerializeExpr, null);
+ }
+
+ T visit(TimezoneExpression timezoneExpression, S context);
+
+ default void visit(TimezoneExpression timezoneExpression) {
+ this.visit(timezoneExpression, null);
+ }
+
+ T visit(JsonAggregateFunction jsonAggregateFunction, S context);
+
+ default void visit(JsonAggregateFunction jsonAggregateFunction) {
+ this.visit(jsonAggregateFunction, null);
+ }
+
+ T visit(JsonFunction jsonFunction, S context);
+
+ default void visit(JsonFunction jsonFunction) {
+ this.visit(jsonFunction, null);
+ }
+
+ T visit(ConnectByRootOperator connectByRootOperator, S context);
+
+ default void visit(ConnectByRootOperator connectByRootOperator) {
+ this.visit(connectByRootOperator, null);
+ }
+
+ T visit(OracleNamedFunctionParameter oracleNamedFunctionParameter, S context);
+
+ default void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
+ this.visit(oracleNamedFunctionParameter, null);
+ }
+
+ T visit(AllColumns allColumns, S context);
+
+ default void visit(AllColumns allColumns) {
+ this.visit(allColumns, null);
+ }
+
+ T visit(AllTableColumns allTableColumns, S context);
+
+ default void visit(AllTableColumns allTableColumns) {
+ this.visit(allTableColumns, null);
+ }
+
+ T visit(AllValue allValue, S context);
+
+ default void visit(AllValue allValue) {
+ this.visit(allValue, null);
+ }
+
+ T visit(IsDistinctExpression isDistinctExpression, S context);
+
+ default void visit(IsDistinctExpression isDistinctExpression) {
+ this.visit(isDistinctExpression, null);
+ }
+
+ T visit(GeometryDistance geometryDistance, S context);
+
+ default void visit(GeometryDistance geometryDistance) {
+ this.visit(geometryDistance, null);
+ }
+
+ T visit(Select select, S context);
+
+ default void visit(Select select) {
+ this.visit(select, null);
+ }
+
+ T visit(TranscodingFunction transcodingFunction, S context);
+
+ default void visit(TranscodingFunction transcodingFunction) {
+ this.visit(transcodingFunction, null);
+ }
+
+ T visit(TrimFunction trimFunction, S context);
+
+ default void visit(TrimFunction trimFunction) {
+ this.visit(trimFunction, null);
+ }
+
+ T visit(RangeExpression rangeExpression, S context);
+
+ default void visit(RangeExpression rangeExpression) {
+ this.visit(rangeExpression, null);
+ }
+
+ T visit(TSQLLeftJoin tsqlLeftJoin, S context);
+
+ default void visit(TSQLLeftJoin tsqlLeftJoin) {
+ this.visit(tsqlLeftJoin, null);
+ }
+
+ T visit(TSQLRightJoin tsqlRightJoin, S context);
+
+ default void visit(TSQLRightJoin tsqlRightJoin) {
+ this.visit(tsqlRightJoin, null);
+ }
+
+ T visit(StructType structType, S context);
+
+ default void visit(StructType structType) {
+ this.visit(structType, null);
+ }
+
+ T visit(LambdaExpression lambdaExpression, S context);
+
+ default void visit(LambdaExpression lambdaExpression) {
+ this.visit(lambdaExpression, null);
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
index 7c8a25c3b..f2223f890 100644
--- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java
@@ -67,629 +67,761 @@
import java.util.Optional;
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.UncommentedEmptyMethodBody"})
-public class ExpressionVisitorAdapter
- implements ExpressionVisitor, PivotVisitor, SelectItemVisitor {
+public class ExpressionVisitorAdapter
+ implements ExpressionVisitor, PivotVisitor, SelectItemVisitor {
- private SelectVisitor selectVisitor;
+ private SelectVisitor selectVisitor;
- public SelectVisitor getSelectVisitor() {
+ public SelectVisitor getSelectVisitor() {
return selectVisitor;
}
- public void setSelectVisitor(SelectVisitor selectVisitor) {
+ public void setSelectVisitor(SelectVisitor selectVisitor) {
this.selectVisitor = selectVisitor;
}
@Override
- public void visit(NullValue value) {
+ public T visit(NullValue nullValue, S context) {
+ return null;
}
@Override
- public void visit(Function function) {
+ public T visit(Function function, S context) {
if (function.getParameters() != null) {
- function.getParameters().accept(this);
+ function.getParameters().accept(this, context);
}
if (function.getKeep() != null) {
- function.getKeep().accept(this);
+ function.getKeep().accept(this, context);
}
if (function.getOrderByElements() != null) {
for (OrderByElement orderByElement : function.getOrderByElements()) {
- orderByElement.getExpression().accept(this);
+ orderByElement.getExpression().accept(this, context);
}
}
+ return null;
}
@Override
- public void visit(SignedExpression expr) {
- expr.getExpression().accept(this);
+ public T visit(SignedExpression signedExpression, S context) {
+ signedExpression.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(JdbcParameter parameter) {
+ public T visit(JdbcParameter jdbcParameter, S context) {
+ return null;
}
@Override
- public void visit(JdbcNamedParameter parameter) {
+ public T visit(JdbcNamedParameter jdbcNamedParameter, S context) {
+ return null;
}
@Override
- public void visit(DoubleValue value) {
+ public T visit(DoubleValue doubleValue, S context) {
+ return null;
}
@Override
- public void visit(LongValue value) {
+ public T visit(LongValue longValue, S context) {
+ return null;
}
@Override
- public void visit(DateValue value) {
+ public T visit(DateValue dateValue, S context) {
+ return null;
}
@Override
- public void visit(TimeValue value) {
+ public T visit(TimeValue timeValue, S context) {
+ return null;
}
@Override
- public void visit(TimestampValue value) {
+ public T visit(TimestampValue timestampValue, S context) {
+ return null;
}
@Override
- public void visit(Parenthesis parenthesis) {
- parenthesis.getExpression().accept(this);
+ public T visit(StringValue stringValue, S context) {
+ return null;
}
@Override
- public void visit(StringValue value) {
-
+ public T visit(Addition addition, S context) {
+ visitBinaryExpression(addition, context);
+ return null;
}
@Override
- public void visit(Addition expr) {
- visitBinaryExpression(expr);
+ public T visit(Division division, S context) {
+ visitBinaryExpression(division, context);
+ return null;
}
@Override
- public void visit(Division expr) {
- visitBinaryExpression(expr);
+ public T visit(IntegerDivision integerDivision, S context) {
+ visitBinaryExpression(integerDivision, context);
+ return null;
}
@Override
- public void visit(IntegerDivision expr) {
- visitBinaryExpression(expr);
+ public T visit(Multiplication multiplication, S context) {
+ visitBinaryExpression(multiplication, context);
+ return null;
}
@Override
- public void visit(Multiplication expr) {
- visitBinaryExpression(expr);
+ public T visit(Subtraction subtraction, S context) {
+ visitBinaryExpression(subtraction, context);
+ return null;
}
@Override
- public void visit(Subtraction expr) {
- visitBinaryExpression(expr);
+ public T visit(AndExpression andExpression, S context) {
+ visitBinaryExpression(andExpression, context);
+ return null;
}
@Override
- public void visit(AndExpression expr) {
- visitBinaryExpression(expr);
+ public T visit(OrExpression orExpression, S context) {
+ visitBinaryExpression(orExpression, context);
+ return null;
}
@Override
- public void visit(OrExpression expr) {
- visitBinaryExpression(expr);
+ public T visit(XorExpression xorExpression, S context) {
+ visitBinaryExpression(xorExpression, context);
+ return null;
}
@Override
- public void visit(XorExpression expr) {
- visitBinaryExpression(expr);
+ public T visit(Between between, S context) {
+ between.getLeftExpression().accept(this, context);
+ between.getBetweenExpressionStart().accept(this, context);
+ between.getBetweenExpressionEnd().accept(this, context);
+ return null;
}
- @Override
- public void visit(Between expr) {
- expr.getLeftExpression().accept(this);
- expr.getBetweenExpressionStart().accept(this);
- expr.getBetweenExpressionEnd().accept(this);
+ public T visit(OverlapsCondition overlapsCondition, S context) {
+ overlapsCondition.getLeft().accept(this, context);
+ overlapsCondition.getRight().accept(this, context);
+ return null;
}
- public void visit(OverlapsCondition overlapsCondition) {
- overlapsCondition.getLeft().accept(this);
- overlapsCondition.getRight().accept(this);
+
+ @Override
+ public T visit(EqualsTo equalsTo, S context) {
+ visitBinaryExpression(equalsTo, context);
+ return null;
}
+ @Override
+ public T visit(GreaterThan greaterThan, S context) {
+ visitBinaryExpression(greaterThan, context);
+ return null;
+ }
@Override
- public void visit(EqualsTo expr) {
- visitBinaryExpression(expr);
+ public T visit(GreaterThanEquals greaterThanEquals, S context) {
+ visitBinaryExpression(greaterThanEquals, context);
+ return null;
}
@Override
- public void visit(GreaterThan expr) {
- visitBinaryExpression(expr);
+ public T visit(InExpression inExpression, S context) {
+ inExpression.getLeftExpression().accept(this, context);
+ inExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(GreaterThanEquals expr) {
- visitBinaryExpression(expr);
+ public T visit(IncludesExpression includesExpression, S context) {
+ includesExpression.getLeftExpression().accept(this, context);
+ includesExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(InExpression expr) {
- expr.getLeftExpression().accept(this);
- expr.getRightExpression().accept(this);
+ public T visit(ExcludesExpression excludesExpression, S context) {
+ excludesExpression.getLeftExpression().accept(this, context);
+ excludesExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(IsNullExpression expr) {
- expr.getLeftExpression().accept(this);
+ public T visit(IsNullExpression isNullExpression, S context) {
+ isNullExpression.getLeftExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(FullTextSearch expr) {
- for (Column col : expr.getMatchColumns()) {
- col.accept(this);
+ public T visit(FullTextSearch fullTextSearch, S context) {
+ for (Column col : fullTextSearch.getMatchColumns()) {
+ col.accept(this, context);
}
+ return null;
}
@Override
- public void visit(IsBooleanExpression expr) {
- expr.getLeftExpression().accept(this);
+ public T visit(IsBooleanExpression isBooleanExpression, S context) {
+ isBooleanExpression.getLeftExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(LikeExpression expr) {
- visitBinaryExpression(expr);
+ public T visit(LikeExpression likeExpression, S context) {
+ visitBinaryExpression(likeExpression, context);
+ return null;
}
@Override
- public void visit(MinorThan expr) {
- visitBinaryExpression(expr);
+ public T visit(MinorThan minorThan, S context) {
+ visitBinaryExpression(minorThan, context);
+ return null;
}
@Override
- public void visit(MinorThanEquals expr) {
- visitBinaryExpression(expr);
+ public T visit(MinorThanEquals minorThanEquals, S context) {
+ visitBinaryExpression(minorThanEquals, context);
+ return null;
}
@Override
- public void visit(NotEqualsTo expr) {
- visitBinaryExpression(expr);
+ public T visit(NotEqualsTo notEqualsTo, S context) {
+ visitBinaryExpression(notEqualsTo, context);
+ return null;
}
@Override
- public void visit(DoubleAnd expr) {
- visitBinaryExpression(expr);
+ public T visit(DoubleAnd doubleAnd, S context) {
+ visitBinaryExpression(doubleAnd, context);
+ return null;
}
@Override
- public void visit(Contains expr) {
- visitBinaryExpression(expr);
+ public T visit(Contains contains, S context) {
+ visitBinaryExpression(contains, context);
+ return null;
}
@Override
- public void visit(ContainedBy expr) {
- visitBinaryExpression(expr);
+ public T visit(ContainedBy containedBy, S context) {
+ visitBinaryExpression(containedBy, context);
+ return null;
}
@Override
- public void visit(Column column) {
+ public T visit(Column column, S context) {
+ return null;
}
@Override
- public void visit(ParenthesedSelect selectBody) {
- visit((Select) selectBody);
- if (selectBody.getPivot() != null) {
- selectBody.getPivot().accept(this);
+ public T visit(ParenthesedSelect select, S context) {
+ visit((Select) select, context);
+ if (select.getPivot() != null) {
+ select.getPivot().accept(this, context);
}
+ return null;
}
@Override
- public void visit(CaseExpression expr) {
- if (expr.getSwitchExpression() != null) {
- expr.getSwitchExpression().accept(this);
+ public T visit(CaseExpression caseExpression, S context) {
+ if (caseExpression.getSwitchExpression() != null) {
+ caseExpression.getSwitchExpression().accept(this, context);
}
- for (Expression x : expr.getWhenClauses()) {
- x.accept(this);
+ for (Expression x : caseExpression.getWhenClauses()) {
+ x.accept(this, context);
}
- if (expr.getElseExpression() != null) {
- expr.getElseExpression().accept(this);
+ if (caseExpression.getElseExpression() != null) {
+ caseExpression.getElseExpression().accept(this, context);
}
+ return null;
}
@Override
- public void visit(WhenClause expr) {
- expr.getWhenExpression().accept(this);
- expr.getThenExpression().accept(this);
+ public T visit(WhenClause whenClause, S context) {
+ whenClause.getWhenExpression().accept(this, context);
+ whenClause.getThenExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(ExistsExpression expr) {
- expr.getRightExpression().accept(this);
+ public T visit(ExistsExpression existsExpression, S context) {
+ existsExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(MemberOfExpression memberOfExpression) {
- memberOfExpression.getRightExpression().accept(this);
+ public T visit(MemberOfExpression memberOfExpression, S context) {
+ memberOfExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(AnyComparisonExpression expr) {
+ public T visit(AnyComparisonExpression anyComparisonExpression, S context) {
+ return null;
}
@Override
- public void visit(Concat expr) {
- visitBinaryExpression(expr);
+ public T visit(Concat concat, S context) {
+ visitBinaryExpression(concat, context);
+ return null;
}
@Override
- public void visit(Matches expr) {
- visitBinaryExpression(expr);
+ public T visit(Matches matches, S context) {
+ visitBinaryExpression(matches, context);
+ return null;
}
@Override
- public void visit(BitwiseAnd expr) {
- visitBinaryExpression(expr);
+ public T visit(BitwiseAnd bitwiseAnd, S context) {
+ visitBinaryExpression(bitwiseAnd, context);
+ return null;
}
@Override
- public void visit(BitwiseOr expr) {
- visitBinaryExpression(expr);
+ public T visit(BitwiseOr bitwiseOr, S context) {
+ visitBinaryExpression(bitwiseOr, context);
+ return null;
}
@Override
- public void visit(BitwiseXor expr) {
- visitBinaryExpression(expr);
+ public T visit(BitwiseXor bitwiseXor, S context) {
+ visitBinaryExpression(bitwiseXor, context);
+ return null;
}
@Override
- public void visit(CastExpression expr) {
- expr.getLeftExpression().accept(this);
+ public T visit(CastExpression castExpression, S context) {
+ castExpression.getLeftExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(Modulo expr) {
- visitBinaryExpression(expr);
+ public T visit(Modulo modulo, S context) {
+ visitBinaryExpression(modulo, context);
+ return null;
}
@Override
- public void visit(AnalyticExpression expr) {
- if (expr.getExpression() != null) {
- expr.getExpression().accept(this);
+ public T visit(AnalyticExpression analyticExpression, S context) {
+ if (analyticExpression.getExpression() != null) {
+ analyticExpression.getExpression().accept(this, context);
}
- if (expr.getDefaultValue() != null) {
- expr.getDefaultValue().accept(this);
+ if (analyticExpression.getDefaultValue() != null) {
+ analyticExpression.getDefaultValue().accept(this, context);
}
- if (expr.getOffset() != null) {
- expr.getOffset().accept(this);
+ if (analyticExpression.getOffset() != null) {
+ analyticExpression.getOffset().accept(this, context);
}
- if (expr.getKeep() != null) {
- expr.getKeep().accept(this);
+ if (analyticExpression.getKeep() != null) {
+ analyticExpression.getKeep().accept(this, context);
}
- if (expr.getFuncOrderBy() != null) {
- for (OrderByElement element : expr.getOrderByElements()) {
- element.getExpression().accept(this);
+ if (analyticExpression.getFuncOrderBy() != null) {
+ for (OrderByElement element : analyticExpression.getOrderByElements()) {
+ element.getExpression().accept(this, context);
}
}
- if (expr.getWindowElement() != null) {
+ if (analyticExpression.getWindowElement() != null) {
/*
* Visit expressions from the range and offset of the window element. Do this using
* optional chains, because several things down the tree can be null e.g. the
* expression. So, null-safe versions of e.g.:
- * expr.getWindowElement().getOffset().getExpression().accept(this);
+ * analyticExpression.getWindowElement().getOffset().getExpression().accept(this,
+ * parameters);
*/
- Optional.ofNullable(expr.getWindowElement().getRange()).map(WindowRange::getStart)
- .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this));
- Optional.ofNullable(expr.getWindowElement().getRange()).map(WindowRange::getEnd)
- .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this));
- Optional.ofNullable(expr.getWindowElement().getOffset())
- .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this));
+ Optional.ofNullable(analyticExpression.getWindowElement().getRange())
+ .map(WindowRange::getStart)
+ .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this, context));
+ Optional.ofNullable(analyticExpression.getWindowElement().getRange())
+ .map(WindowRange::getEnd)
+ .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this, context));
+ Optional.ofNullable(analyticExpression.getWindowElement().getOffset())
+ .map(WindowOffset::getExpression).ifPresent(e -> e.accept(this, context));
}
+ return null;
}
@Override
- public void visit(ExtractExpression expr) {
- expr.getExpression().accept(this);
+ public T visit(ExtractExpression extractExpression, S context) {
+ extractExpression.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(IntervalExpression expr) {}
+ public T visit(IntervalExpression intervalExpression, S context) {
+ return null;
+ }
@Override
- public void visit(OracleHierarchicalExpression expr) {
- expr.getConnectExpression().accept(this);
- expr.getStartExpression().accept(this);
+ public T visit(OracleHierarchicalExpression hierarchicalExpression, S context) {
+ hierarchicalExpression.getConnectExpression().accept(this, context);
+ hierarchicalExpression.getStartExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(RegExpMatchOperator expr) {
- visitBinaryExpression(expr);
+ public T visit(RegExpMatchOperator regExpMatchOperator, S context) {
+ visitBinaryExpression(regExpMatchOperator, context);
+ return null;
}
@Override
- public void visit(ExpressionList> expressionList) {
+ public T visit(ExpressionList extends Expression> expressionList, S context) {
for (Expression expr : expressionList) {
- expr.accept(this);
+ expr.accept(this, context);
}
+ return null;
}
@Override
- public void visit(RowConstructor> rowConstructor) {
+ public T visit(RowConstructor extends Expression> rowConstructor, S context) {
for (Expression expr : rowConstructor) {
- expr.accept(this);
+ expr.accept(this, context);
}
+ return null;
}
@Override
- public void visit(NotExpression notExpr) {
- notExpr.getExpression().accept(this);
+ public T visit(NotExpression notExpr, S context) {
+ notExpr.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(BitwiseRightShift expr) {
- visitBinaryExpression(expr);
+ public T visit(BitwiseRightShift bitwiseRightShift, S context) {
+ visitBinaryExpression(bitwiseRightShift, context);
+ return null;
}
@Override
- public void visit(BitwiseLeftShift expr) {
- visitBinaryExpression(expr);
+ public T visit(BitwiseLeftShift bitwiseLeftShift, S context) {
+ visitBinaryExpression(bitwiseLeftShift, context);
+ return null;
}
- protected void visitBinaryExpression(BinaryExpression expr) {
- expr.getLeftExpression().accept(this);
- expr.getRightExpression().accept(this);
+ protected T visitBinaryExpression(BinaryExpression binaryExpression, S context) {
+ binaryExpression.getLeftExpression().accept(this, context);
+ binaryExpression.getRightExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(JsonExpression jsonExpr) {
- jsonExpr.getExpression().accept(this);
+ public T visit(JsonExpression jsonExpr, S context) {
+ jsonExpr.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(JsonOperator expr) {
- visitBinaryExpression(expr);
+ public T visit(JsonOperator jsonOperator, S context) {
+ visitBinaryExpression(jsonOperator, context);
+ return null;
}
@Override
- public void visit(UserVariable var) {
+ public T visit(UserVariable userVariable, S context) {
+ return null;
}
@Override
- public void visit(NumericBind bind) {
+ public T visit(NumericBind numericBind, S context) {
+ return null;
}
@Override
- public void visit(KeepExpression expr) {
- for (OrderByElement element : expr.getOrderByElements()) {
- element.getExpression().accept(this);
+ public T visit(KeepExpression keepExpression, S context) {
+ for (OrderByElement element : keepExpression.getOrderByElements()) {
+ element.getExpression().accept(this, context);
}
+ return null;
}
@Override
- public void visit(MySQLGroupConcat groupConcat) {
- for (Expression expr : groupConcat.getExpressionList().getExpressions()) {
- expr.accept(this);
+ public T visit(MySQLGroupConcat groupConcat, S context) {
+ for (Expression expr : groupConcat.getExpressionList()) {
+ expr.accept(this, context);
}
if (groupConcat.getOrderByElements() != null) {
for (OrderByElement element : groupConcat.getOrderByElements()) {
- element.getExpression().accept(this);
+ element.getExpression().accept(this, context);
}
}
+ return null;
}
@Override
- public void visit(Pivot pivot) {
+ public T visit(Pivot pivot, S context) {
for (SelectItem> item : pivot.getFunctionItems()) {
- item.getExpression().accept(this);
+ item.getExpression().accept(this, context);
}
for (Column col : pivot.getForColumns()) {
- col.accept(this);
+ col.accept(this, context);
}
if (pivot.getSingleInItems() != null) {
- for (SelectItem item : pivot.getSingleInItems()) {
- item.getExpression().accept(this);
+ for (SelectItem> item : pivot.getSingleInItems()) {
+ item.getExpression().accept(this, context);
}
}
if (pivot.getMultiInItems() != null) {
- for (SelectItem item : pivot.getMultiInItems()) {
- item.getExpression().accept(this);
+ for (SelectItem> item : pivot.getMultiInItems()) {
+ item.getExpression().accept(this, context);
}
}
+ return null;
}
@Override
- public void visit(PivotXml pivot) {
- for (SelectItem> item : pivot.getFunctionItems()) {
- item.getExpression().accept(this);
+ public T visit(PivotXml pivotXml, S context) {
+ for (SelectItem> item : pivotXml.getFunctionItems()) {
+ item.getExpression().accept(this, context);
}
- for (Column col : pivot.getForColumns()) {
- col.accept(this);
+ for (Column col : pivotXml.getForColumns()) {
+ col.accept(this, context);
}
- if (pivot.getInSelect() != null && selectVisitor != null) {
- pivot.getInSelect().accept(selectVisitor);
+ if (pivotXml.getInSelect() != null && selectVisitor != null) {
+ pivotXml.getInSelect().accept(selectVisitor, context);
}
+ return null;
}
@Override
- public void visit(UnPivot unpivot) {
- unpivot.accept(this);
+ public T visit(UnPivot unpivot, S context) {
+ unpivot.accept(this, context);
+ return null;
}
@Override
- public void visit(AllColumns allColumns) {}
+ public T visit(AllColumns allColumns, S context) {
+ return null;
+ }
@Override
- public void visit(AllTableColumns allTableColumns) {}
+ public T visit(AllTableColumns allTableColumns, S context) {
+ return null;
+ }
@Override
- public void visit(AllValue allValue) {}
+ public T visit(AllValue allValue, S context) {
+ return null;
+ }
@Override
- public void visit(IsDistinctExpression isDistinctExpression) {
- visitBinaryExpression(isDistinctExpression);
+ public T visit(IsDistinctExpression isDistinctExpression, S context) {
+ visitBinaryExpression(isDistinctExpression, context);
+ return null;
}
@Override
- public void visit(SelectItem selectExpressionItem) {
- selectExpressionItem.getExpression().accept(this);
+ public T visit(SelectItem extends Expression> selectItem, S context) {
+ selectItem.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(RowGetExpression rowGetExpression) {
- rowGetExpression.getExpression().accept(this);
+ public T visit(RowGetExpression rowGetExpression, S context) {
+ rowGetExpression.getExpression().accept(this, context);
+ return null;
}
@Override
- public void visit(HexValue hexValue) {
+ public T visit(HexValue hexValue, S context) {
+ return null;
}
@Override
- public void visit(OracleHint hint) {
+ public T visit(OracleHint hint, S context) {
+ return null;
}
@Override
- public void visit(TimeKeyExpression timeKeyExpression) {
+ public T visit(TimeKeyExpression timeKeyExpression, S context) {
+ return null;
}
@Override
- public void visit(DateTimeLiteralExpression literal) {}
+ public