type) {
return type.cast(getWhereCondition());
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java
new file mode 100644
index 000000000..86b530ed3
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java
@@ -0,0 +1,107 @@
+/*-
+ * #%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.statement.refresh;
+
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.StatementVisitor;
+
+/**
+ * REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ]
+ *
+ * https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html
+ *
+ * @author jxnu-liguobin
+ */
+
+public class RefreshMaterializedViewStatement implements Statement {
+
+ private Table view;
+ private RefreshMode refreshMode;
+ private boolean concurrently = false;
+
+ public RefreshMaterializedViewStatement() {}
+
+ public RefreshMaterializedViewStatement(Table view, boolean concurrently,
+ RefreshMode refreshMode) {
+ this.refreshMode = refreshMode;
+ this.concurrently = concurrently;
+ this.view = view;
+ }
+
+ public Table getView() {
+ return view;
+ }
+
+ public void setView(Table view) {
+ this.view = view;
+ }
+
+ public RefreshMode getRefreshMode() {
+ return refreshMode;
+ }
+
+ public void setRefreshMode(RefreshMode refreshMode) {
+ this.refreshMode = refreshMode;
+ }
+
+ public boolean isConcurrently() {
+ return concurrently;
+ }
+
+ public void setConcurrently(boolean concurrently) {
+ this.concurrently = concurrently;
+ }
+
+ @SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("REFRESH MATERIALIZED VIEW ");
+ if (this.refreshMode == null) {
+ if (concurrently) {
+ builder.append("CONCURRENTLY ");
+ }
+ builder.append(view);
+ return builder.toString();
+ }
+ switch (this.refreshMode) {
+ case WITH_DATA:
+ if (concurrently) {
+ builder.append("CONCURRENTLY ");
+ }
+ builder.append(view);
+ builder.append(" WITH DATA");
+ break;
+ case WITH_NO_DATA:
+ builder.append(view);
+ if (!concurrently) {
+ builder.append(" WITH NO DATA");
+ }
+ break;
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public void accept(StatementVisitor statementVisitor) {
+ statementVisitor.visit(this);
+ }
+
+ public RefreshMaterializedViewStatement withTableName(Table view) {
+ this.setView(view);
+ return this;
+ }
+
+ public RefreshMaterializedViewStatement withConcurrently(boolean concurrently) {
+ this.setConcurrently(concurrently);
+ return this;
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java
new file mode 100644
index 000000000..fb78fac5d
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java
@@ -0,0 +1,19 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2022 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.refresh;
+
+public enum RefreshMode {
+
+ DEFAULT, WITH_DATA, WITH_NO_DATA;
+
+ public static RefreshMode from(String type) {
+ return Enum.valueOf(RefreshMode.class, type.toUpperCase());
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java b/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java
index 1bf4c1eba..f4590d7df 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java
@@ -9,14 +9,19 @@
*/
package net.sf.jsqlparser.statement.select;
-import net.sf.jsqlparser.expression.*;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.JdbcParameter;
+import net.sf.jsqlparser.expression.LongValue;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
public class Fetch implements Serializable {
private Expression expression = null;
private boolean isFetchParamFirst = false;
- private String fetchParam = "ROW";
+ private final List fetchParameters = new ArrayList<>();
@Deprecated
public long getRowCount() {
@@ -46,8 +51,22 @@ public JdbcParameter getFetchJdbcParameter() {
return expression instanceof JdbcParameter ? (JdbcParameter) expression : null;
}
+ public Fetch addFetchParameter(String parameter) {
+ fetchParameters.add(parameter);
+ return this;
+ }
+
+ public List getFetchParameters() {
+ return this.fetchParameters;
+ }
+
+ @Deprecated
public String getFetchParam() {
- return fetchParam;
+ String parameterStr = "";
+ for (String p : fetchParameters) {
+ parameterStr += " " + p;
+ }
+ return parameterStr.trim();
}
public boolean isFetchParamFirst() {
@@ -59,30 +78,54 @@ public void setFetchJdbcParameter(JdbcParameter jdbc) {
this.setExpression(jdbc);
}
+ @Deprecated
public void setFetchParam(String s) {
- this.fetchParam = s;
+ fetchParameters.clear();
+ if (s != null) {
+ fetchParameters.addAll(Arrays.asList(s.trim().split("\\s+")));
+ }
}
public void setFetchParamFirst(boolean b) {
this.isFetchParamFirst = b;
}
+ public StringBuilder appendTo(StringBuilder builder) {
+ builder.append(" FETCH");
+ if (isFetchParamFirst) {
+ builder.append(" FIRST");
+ } else {
+ builder.append(" NEXT");
+ }
+
+ if (expression != null) {
+ builder.append(" ").append(expression);
+ }
+
+ for (String s : fetchParameters) {
+ builder.append(" ").append(s);
+ }
+ return builder;
+ }
+
@Override
public String toString() {
- return " FETCH " + (isFetchParamFirst ? "FIRST" : "NEXT") + " " + expression.toString()
- + " " + fetchParam + " ONLY";
+ return appendTo(new StringBuilder()).toString();
}
+ @Deprecated
public Fetch withRowCount(long rowCount) {
this.setRowCount(rowCount);
return this;
}
+ @Deprecated
public Fetch withFetchJdbcParameter(JdbcParameter fetchJdbcParameter) {
this.setFetchJdbcParameter(fetchJdbcParameter);
return this;
}
+ @Deprecated
public Fetch withFetchParam(String fetchParam) {
this.setFetchParam(fetchParam);
return this;
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java
new file mode 100644
index 000000000..a58233ed1
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java
@@ -0,0 +1,34 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2023 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.select;
+
+/**
+ * @author jxnu-liguobin
+ */
+public enum ForMode {
+
+ UPDATE("UPDATE"),
+
+ SHARE("SHARE"),
+
+ NO_KEY_UPDATE("NO KEY UPDATE"),
+
+ KEY_SHARE("KEY SHARE");
+
+ private final String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ ForMode(String s) {
+ this.value = s;
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java b/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
index 4aa45bbf0..d052ad465 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java
@@ -9,10 +9,6 @@
*/
package net.sf.jsqlparser.statement.select;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -20,10 +16,15 @@
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.ParenthesedExpressionList;
public class GroupByElement implements Serializable {
private ExpressionList groupByExpressions = new ExpressionList();
private List groupingSets = new ArrayList<>();
+ // postgres rollup is an ExpressionList
+ private boolean mysqlWithRollup = false;
public boolean isUsingBrackets() {
return groupByExpressions.isUsingBrackets();
@@ -90,6 +91,10 @@ public String toString() {
b.append(")");
}
+ if (isMysqlWithRollup()) {
+ b.append(" WITH ROLLUP");
+ }
+
return b.toString();
}
@@ -126,4 +131,13 @@ public GroupByElement addGroupingSets(Collection extends Object> groupingSets)
collection.addAll(groupingSets);
return this.withGroupingSets(collection);
}
+
+ public boolean isMysqlWithRollup() {
+ return mysqlWithRollup;
+ }
+
+ public GroupByElement setMysqlWithRollup(boolean mysqlWithRollup) {
+ this.mysqlWithRollup = mysqlWithRollup;
+ return this;
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Join.java b/src/main/java/net/sf/jsqlparser/statement/select/Join.java
index efaa3e6c7..d057a5381 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/Join.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/Join.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Optional;
+@SuppressWarnings({"PMD.CyclomaticComplexity"})
public class Join extends ASTNodeAccessImpl {
private boolean outer = false;
@@ -39,6 +40,8 @@ public class Join extends ASTNodeAccessImpl {
private final LinkedList usingColumns = new LinkedList<>();
private KSQLJoinWindow joinWindow;
+ private JoinHint joinHint = null;
+
public boolean isSimple() {
return simple;
}
@@ -377,6 +380,15 @@ public void setJoinWindow(KSQLJoinWindow joinWindow) {
this.joinWindow = joinWindow;
}
+ public JoinHint getJoinHint() {
+ return joinHint;
+ }
+
+ public Join setJoinHint(JoinHint joinHint) {
+ this.joinHint = joinHint;
+ return this;
+ }
+
@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public String toString() {
@@ -418,6 +430,9 @@ public String toString() {
} else if (isApply()) {
builder.append("APPLY ");
} else {
+ if (joinHint != null) {
+ builder.append(joinHint).append(" ");
+ }
builder.append("JOIN ");
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java b/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java
new file mode 100644
index 000000000..099f73042
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java
@@ -0,0 +1,31 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2023 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.statement.select;
+
+/**
+ * Hints (Transact-SQL) - Join
+ *
+ * @link Hints
+ * (Transact-SQL) - Join
+ */
+
+public class JoinHint {
+ private final String keyword;
+
+ public JoinHint(String keyword) {
+ this.keyword = keyword;
+ }
+
+ @Override
+ public String toString() {
+ return keyword;
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/OrderByElement.java b/src/main/java/net/sf/jsqlparser/statement/select/OrderByElement.java
index acba858fd..36597fde4 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/OrderByElement.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/OrderByElement.java
@@ -9,9 +9,8 @@
*/
package net.sf.jsqlparser.statement.select;
-import net.sf.jsqlparser.expression.Expression;
-
import java.io.Serializable;
+import net.sf.jsqlparser.expression.Expression;
public class OrderByElement implements Serializable {
@@ -24,6 +23,8 @@ public static NullOrdering from(String ordering) {
}
private Expression expression;
+ // postgres rollup is an ExpressionList
+ private boolean mysqlWithRollup = false;
private boolean asc = true;
private boolean ascDescPresent = false;
private NullOrdering nullOrdering;
@@ -79,6 +80,9 @@ public String toString() {
b.append(' ');
b.append(nullOrdering == NullOrdering.NULLS_FIRST ? "NULLS FIRST" : "NULLS LAST");
}
+ if (isMysqlWithRollup()) {
+ b.append(" WITH ROLLUP");
+ }
return b.toString();
}
@@ -106,4 +110,13 @@ public E getExpression(Class type) {
return type.cast(getExpression());
}
+ public boolean isMysqlWithRollup() {
+ return mysqlWithRollup;
+ }
+
+ public OrderByElement setMysqlWithRollup(boolean mysqlWithRollup) {
+ this.mysqlWithRollup = mysqlWithRollup;
+ return this;
+ }
+
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
index 5e322c52f..72a4e530c 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
@@ -9,12 +9,7 @@
*/
package net.sf.jsqlparser.statement.select;
-import net.sf.jsqlparser.expression.Alias;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
-import net.sf.jsqlparser.expression.OracleHint;
-import net.sf.jsqlparser.expression.WindowDefinition;
-import net.sf.jsqlparser.schema.Table;
+import static java.util.stream.Collectors.joining;
import java.util.ArrayList;
import java.util.Arrays;
@@ -23,8 +18,12 @@
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
-
-import static java.util.stream.Collectors.joining;
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
+import net.sf.jsqlparser.expression.OracleHint;
+import net.sf.jsqlparser.expression.WindowDefinition;
+import net.sf.jsqlparser.schema.Table;
@SuppressWarnings({"PMD.CyclomaticComplexity"})
public class PlainSelect extends Select {
@@ -46,7 +45,7 @@ public class PlainSelect extends Select {
private Top top;
private OracleHierarchicalExpression oracleHierarchical = null;
private OracleHint oracleHint = null;
- private boolean forUpdate = false;
+ private ForMode forMode = null;
private Table forUpdateTable = null;
private boolean skipLocked;
private Wait wait;
@@ -312,12 +311,12 @@ public void setOracleHierarchical(OracleHierarchicalExpression oracleHierarchica
this.oracleHierarchical = oracleHierarchical;
}
- public boolean isForUpdate() {
- return forUpdate;
+ public ForMode getForMode() {
+ return forMode;
}
- public void setForUpdate(boolean forUpdate) {
- this.forUpdate = forUpdate;
+ public void setForMode(ForMode forMode) {
+ this.forMode = forMode;
}
public Table getForUpdateTable() {
@@ -486,8 +485,9 @@ public StringBuilder appendSelectBodyTo(StringBuilder builder) {
if (emitChanges) {
builder.append(" EMIT CHANGES");
}
- if (isForUpdate()) {
- builder.append(" FOR UPDATE");
+ if (getForMode() != null) {
+ builder.append(" FOR ");
+ builder.append(getForMode().getValue());
if (forUpdateTable != null) {
builder.append(" OF ").append(forUpdateTable);
@@ -620,8 +620,8 @@ public PlainSelect withOracleSiblings(boolean oracleSiblings) {
return this;
}
- public PlainSelect withForUpdate(boolean forUpdate) {
- this.setForUpdate(forUpdate);
+ public PlainSelect withForMode(ForMode forMode) {
+ this.setForMode(forMode);
return this;
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
index 1d3643f50..04a6b9d9e 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java
@@ -22,4 +22,6 @@ public interface SelectVisitor {
void visit(Values aThis);
void visit(LateralSubSelect lateralSubSelect);
+
+ void visit(TableStatement tableStatement);
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
index 91c6f32c2..a349a9005 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java
@@ -41,4 +41,9 @@ public void visit(Values aThis) {
public void visit(LateralSubSelect lateralSubSelect) {
}
+
+ @Override
+ public void visit(TableStatement tableStatement) {
+
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java b/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java
new file mode 100644
index 000000000..b665b16a6
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java
@@ -0,0 +1,59 @@
+/*-
+ * #%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.statement.select;
+
+import net.sf.jsqlparser.schema.Table;
+
+/**
+ * @see `TABLE table_name [ORDER
+ * BY column_name] [LIMIT number [OFFSET number]]` Union not currently supported
+ *
+ * @author jxnu-liguobin
+ */
+public class TableStatement extends Select {
+
+ private Table table;
+
+ public Table getTable() {
+ return table;
+ }
+
+ public void setTable(Table table) {
+ this.table = table;
+ }
+
+ @Override
+ public StringBuilder appendSelectBodyTo(StringBuilder builder) {
+ builder.append("TABLE ").append(table.getName());
+ return builder;
+ }
+
+ @SuppressWarnings({"PMD.CyclomaticComplexity"})
+ @Override
+ public StringBuilder appendTo(StringBuilder builder) {
+
+ appendSelectBodyTo(builder);
+
+ builder.append(orderByToString(false, orderByElements));
+
+ if (limit != null) {
+ builder.append(limit);
+ }
+ if (offset != null) {
+ builder.append(offset);
+ }
+ return builder;
+ }
+
+ @Override
+ public void accept(SelectVisitor selectVisitor) {
+ selectVisitor.visit(this);
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/statement/update/Update.java b/src/main/java/net/sf/jsqlparser/statement/update/Update.java
index c4975f503..0a6224d76 100644
--- a/src/main/java/net/sf/jsqlparser/statement/update/Update.java
+++ b/src/main/java/net/sf/jsqlparser/statement/update/Update.java
@@ -292,6 +292,9 @@ public String toString() {
}
}
b.append("UPDATE ");
+ if (oracleHint != null) {
+ b.append(oracleHint).append(" ");
+ }
if (modifierPriority != null) {
b.append(modifierPriority.name()).append(" ");
}
diff --git a/src/main/java/net/sf/jsqlparser/statement/update/UpdateSet.java b/src/main/java/net/sf/jsqlparser/statement/update/UpdateSet.java
index 7c6fca540..84299c0fb 100644
--- a/src/main/java/net/sf/jsqlparser/statement/update/UpdateSet.java
+++ b/src/main/java/net/sf/jsqlparser/statement/update/UpdateSet.java
@@ -72,7 +72,7 @@ public void add(Column column, Expression value) {
* @param column
*/
public void add(Column column) {
- if (columns.size() < 2 && !(columns instanceof ParenthesedExpressionList)) {
+ if (!columns.isEmpty() && !(columns instanceof ParenthesedExpressionList)) {
columns = new ParenthesedExpressionList<>(columns);
}
columns.add(column);
@@ -85,7 +85,7 @@ public void add(Column column) {
* @param expression
*/
public void add(Expression expression) {
- if (values.size() < 2 && !(values instanceof ParenthesedExpressionList)) {
+ if (!values.isEmpty() && !(values instanceof ParenthesedExpressionList)) {
values = new ParenthesedExpressionList<>(values);
}
values.add(expression);
diff --git a/src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java b/src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java
index 3303c091f..58ca4326f 100644
--- a/src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java
@@ -9,6 +9,8 @@
*/
package net.sf.jsqlparser.util;
+import java.util.LinkedList;
+import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.statement.select.LateralSubSelect;
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
@@ -18,12 +20,10 @@
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
+import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;
-import java.util.LinkedList;
-import java.util.List;
-
/**
* Add aliases to every column and expression selected by a select - statement. Existing aliases are
* recognized and preserved. This class standard uses a prefix of A and a counter to generate new
@@ -112,4 +112,9 @@ public void visit(Values aThis) {
public void visit(LateralSubSelect lateralSubSelect) {
lateralSubSelect.getSelect().accept(this);
}
+
+ @Override
+ public void visit(TableStatement tableStatement) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/util/ConnectExpressionsVisitor.java b/src/main/java/net/sf/jsqlparser/util/ConnectExpressionsVisitor.java
index 479bc3c3e..46b746f0a 100644
--- a/src/main/java/net/sf/jsqlparser/util/ConnectExpressionsVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/util/ConnectExpressionsVisitor.java
@@ -9,6 +9,8 @@
*/
package net.sf.jsqlparser.util;
+import java.util.LinkedList;
+import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.statement.select.LateralSubSelect;
@@ -19,12 +21,10 @@
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
+import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;
-import java.util.LinkedList;
-import java.util.List;
-
/**
* Connect all selected expressions with a binary expression. Out of select a,b from table one gets
* select a || b as expr from table. The type of binary expression is set by overwriting this class
@@ -103,4 +103,8 @@ public void visit(Values aThis) {
throw new UnsupportedOperationException("Not supported yet.");
}
+ @Override
+ public void visit(TableStatement tableStatement) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
index d8fc4cf7b..7a94ceff7 100644
--- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
+++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
@@ -9,6 +9,11 @@
*/
package net.sf.jsqlparser.util;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.AllValue;
import net.sf.jsqlparser.expression.AnalyticExpression;
@@ -78,6 +83,9 @@
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
import net.sf.jsqlparser.expression.operators.relational.Between;
+import net.sf.jsqlparser.expression.operators.relational.ContainedBy;
+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.ExistsExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
@@ -98,6 +106,8 @@
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
+import net.sf.jsqlparser.expression.operators.relational.TSQLLeftJoin;
+import net.sf.jsqlparser.expression.operators.relational.TSQLRightJoin;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
@@ -141,6 +151,7 @@
import net.sf.jsqlparser.statement.grant.Grant;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.merge.Merge;
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.AllColumns;
import net.sf.jsqlparser.statement.select.AllTableColumns;
import net.sf.jsqlparser.statement.select.FromItemVisitor;
@@ -156,6 +167,7 @@
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableFunction;
+import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
@@ -164,12 +176,6 @@
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.upsert.Upsert;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
/**
* Find all used tables within an select statement.
*
@@ -470,6 +476,21 @@ public void visit(NotEqualsTo notEqualsTo) {
visitBinaryExpression(notEqualsTo);
}
+ @Override
+ public void visit(DoubleAnd doubleAnd) {
+ visitBinaryExpression(doubleAnd);
+ }
+
+ @Override
+ public void visit(Contains contains) {
+ visitBinaryExpression(contains);
+ }
+
+ @Override
+ public void visit(ContainedBy containedBy) {
+ visitBinaryExpression(containedBy);
+ }
+
@Override
public void visit(NullValue nullValue) {
@@ -671,6 +692,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
lateralSubSelect.getSelect().accept((SelectVisitor) this);
}
+ @Override
+ public void visit(TableStatement tableStatement) {
+ tableStatement.getTable().accept(this);
+ }
+
/**
* Initializes table names collector. Important is the usage of Column instances to find table
* names. This is only allowed for expression parsing, where a better place for tablenames could
@@ -966,6 +992,11 @@ public void visit(AlterView alterView) {
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
}
+ @Override
+ public void visit(RefreshMaterializedViewStatement materializedView) {
+ visit(materializedView.getView());
+ }
+
@Override
public void visit(TimeKeyExpression timeKeyExpression) {
@@ -1036,7 +1067,9 @@ public void visit(DescribeStatement describe) {
@Override
public void visit(ExplainStatement explain) {
- explain.getStatement().accept((StatementVisitor) this);
+ if (explain.getStatement() != null) {
+ explain.getStatement().accept((StatementVisitor) this);
+ }
}
@Override
@@ -1115,6 +1148,16 @@ public void visit(ShowTablesStatement showTables) {
"Finding tables from ShowTablesStatement is not supported");
}
+ @Override
+ public void visit(TSQLLeftJoin tsqlLeftJoin) {
+ visitBinaryExpression(tsqlLeftJoin);
+ }
+
+ @Override
+ public void visit(TSQLRightJoin tsqlRightJoin) {
+ visitBinaryExpression(tsqlRightJoin);
+ }
+
@Override
public void visit(VariableAssignment var) {
var.getVariable().accept(this);
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateIndexDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateIndexDeParser.java
index 0f2aae236..a82f478d7 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateIndexDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateIndexDeParser.java
@@ -32,12 +32,21 @@ public void deParse(CreateIndex createIndex) {
}
buffer.append("INDEX ");
+ if (createIndex.isUsingIfNotExists()) {
+ buffer.append("IF NOT EXISTS ");
+ }
buffer.append(index.getName());
+
+ String using = index.getUsing();
+ if (using != null && createIndex.isIndexTypeBeforeOn()) {
+ buffer.append(" USING ");
+ buffer.append(using);
+ }
+
buffer.append(" ON ");
buffer.append(createIndex.getTable().getFullyQualifiedName());
- String using = index.getUsing();
- if (using != null) {
+ if (using != null && !createIndex.isIndexTypeBeforeOn()) {
buffer.append(" USING ");
buffer.append(using);
}
@@ -45,7 +54,9 @@ public void deParse(CreateIndex createIndex) {
if (index.getColumnsNames() != null) {
buffer.append(" (");
buffer.append(index.getColumnWithParams().stream()
- .map(cp -> cp.columnName + (cp.getParams() != null ? " " + String.join(" ", cp.getParams()) : ""))
+ .map(cp -> cp.columnName
+ + (cp.getParams() != null ? " " + String.join(" ", cp.getParams())
+ : ""))
.collect(joining(", ")));
buffer.append(")");
}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java
index 13973b06e..1f5662e68 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java
@@ -67,7 +67,13 @@ public void deParse(CreateView createView) {
buffer.append(" AUTO REFRESH ").append(createView.getAutoRefresh().name());
}
if (createView.getColumnNames() != null) {
- buffer.append(PlainSelect.getStringList(createView.getColumnNames(), true, true));
+ buffer.append("(");
+ buffer.append(createView.getColumnNames());
+ buffer.append(")");
+ }
+ if (createView.getViewCommentOptions() != null) {
+ buffer.append(
+ PlainSelect.getStringList(createView.getViewCommentOptions(), false, false));
}
buffer.append(" AS ");
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java
index b97794af4..ef4d0922d 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java
@@ -48,6 +48,9 @@ public void deParse(Delete delete) {
}
}
buffer.append("DELETE");
+ if (delete.getOracleHint() != null) {
+ buffer.append(delete.getOracleHint()).append(" ");
+ }
if (delete.getModifierPriority() != null) {
buffer.append(" ").append(delete.getModifierPriority());
}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
index 383c8802a..494444348 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
@@ -78,6 +78,9 @@
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
import net.sf.jsqlparser.expression.operators.relational.Between;
+import net.sf.jsqlparser.expression.operators.relational.ContainedBy;
+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.ExistsExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
@@ -100,6 +103,8 @@
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
+import net.sf.jsqlparser.expression.operators.relational.TSQLLeftJoin;
+import net.sf.jsqlparser.expression.operators.relational.TSQLRightJoin;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.AllColumns;
@@ -247,6 +252,9 @@ public void visit(InExpression inExpression) {
.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) {
buffer.append("(+)");
}
+ if (inExpression.isGlobal()) {
+ buffer.append(" GLOBAL");
+ }
if (inExpression.isNot()) {
buffer.append(" NOT");
}
@@ -399,6 +407,25 @@ public void visit(NotEqualsTo notEqualsTo) {
}
+ @Override
+ public void visit(DoubleAnd doubleAnd) {
+ visitOldOracleJoinBinaryExpression(doubleAnd, " " + doubleAnd.getStringExpression() + " ");
+
+ }
+
+ @Override
+ public void visit(Contains contains) {
+ visitOldOracleJoinBinaryExpression(contains, " " + contains.getStringExpression() + " ");
+
+ }
+
+ @Override
+ public void visit(ContainedBy containedBy) {
+ visitOldOracleJoinBinaryExpression(containedBy,
+ " " + containedBy.getStringExpression() + " ");
+
+ }
+
@Override
public void visit(NullValue nullValue) {
buffer.append(nullValue.toString());
@@ -1068,4 +1095,15 @@ public void visit(GeometryDistance geometryDistance) {
visitOldOracleJoinBinaryExpression(geometryDistance,
" " + geometryDistance.getStringExpression() + " ");
}
+
+ @Override
+ public void visit(TSQLLeftJoin tsqlLeftJoin) {
+ visitBinaryExpression(tsqlLeftJoin, " *= ");
+ }
+
+ @Override
+ public void visit(TSQLRightJoin tsqlRightJoin) {
+ visitBinaryExpression(tsqlRightJoin, " =* ");
+ }
+
}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/GroupByDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/GroupByDeParser.java
index 3c5cedf10..694a97d38 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/GroupByDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/GroupByDeParser.java
@@ -45,5 +45,9 @@ public void deParse(GroupByElement groupBy) {
}
buffer.append(")");
}
+
+ if (groupBy.isMysqlWithRollup()) {
+ buffer.append(" WITH ROLLUP");
+ }
}
}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
index 84d473f76..dec9f6c0a 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/InsertDeParser.java
@@ -54,6 +54,9 @@ public void deParse(Insert insert) {
if (insert.getModifierPriority() != null) {
buffer.append(insert.getModifierPriority()).append(" ");
}
+ if (insert.getOracleHint() != null) {
+ buffer.append(insert.getOracleHint()).append(" ");
+ }
if (insert.isModifierIgnore()) {
buffer.append("IGNORE ");
}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/OrderByDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/OrderByDeParser.java
index 1586bc6ed..8eb137051 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/OrderByDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/OrderByDeParser.java
@@ -11,7 +11,6 @@
import java.util.Iterator;
import java.util.List;
-
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.statement.select.OrderByElement;
@@ -58,9 +57,13 @@ public void deParseElement(OrderByElement orderBy) {
}
if (orderBy.getNullOrdering() != null) {
buffer.append(' ');
- buffer.append(orderBy.getNullOrdering() == OrderByElement.NullOrdering.NULLS_FIRST ? "NULLS FIRST"
+ buffer.append(orderBy.getNullOrdering() == OrderByElement.NullOrdering.NULLS_FIRST
+ ? "NULLS FIRST"
: "NULLS LAST");
}
+ if (orderBy.isMysqlWithRollup()) {
+ buffer.append(" WITH ROLLUP");
+ }
}
void setExpressionVisitor(ExpressionVisitor expressionVisitor) {
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java
new file mode 100644
index 000000000..0646a65fe
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java
@@ -0,0 +1,53 @@
+/*-
+ * #%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.util.deparser;
+
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
+
+/**
+ * @author jxnu-liguobin
+ */
+
+public class RefreshMaterializedViewStatementDeParser
+ extends AbstractDeParser {
+
+ public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) {
+ super(buffer);
+ }
+
+ @SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
+ @Override
+ public void deParse(RefreshMaterializedViewStatement view) {
+ buffer.append("REFRESH MATERIALIZED VIEW ");
+ if (view.getRefreshMode() == null) {
+ if (view.isConcurrently()) {
+ buffer.append("CONCURRENTLY ");
+ }
+ buffer.append(view.getView());
+ return;
+ }
+ switch (view.getRefreshMode()) {
+ case WITH_DATA:
+ if (view.isConcurrently()) {
+ buffer.append("CONCURRENTLY ");
+ }
+ buffer.append(view.getView());
+ buffer.append(" WITH DATA");
+ break;
+ case WITH_NO_DATA:
+ buffer.append(view.getView());
+ if (view.isConcurrently()) {
+ buffer.append(" WITH NO DATA");
+ }
+ break;
+ }
+ }
+
+}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
index 0ba071794..a6b718baf 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
@@ -9,6 +9,10 @@
*/
package net.sf.jsqlparser.util.deparser;
+import static java.util.stream.Collectors.joining;
+
+import java.util.Iterator;
+import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -40,16 +44,12 @@
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.Skip;
import net.sf.jsqlparser.statement.select.TableFunction;
+import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Top;
import net.sf.jsqlparser.statement.select.UnPivot;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;
-import java.util.Iterator;
-import java.util.List;
-
-import static java.util.stream.Collectors.joining;
-
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public class SelectDeParser extends AbstractDeParser implements SelectVisitor,
SelectItemVisitor, FromItemVisitor, PivotVisitor {
@@ -268,8 +268,10 @@ public void visit(PlainSelect plainSelect) {
buffer.append(plainSelect.getWindowDefinitions().stream()
.map(WindowDefinition::toString).collect(joining(", ")));
}
- if (plainSelect.isForUpdate()) {
- buffer.append(" FOR UPDATE");
+ if (plainSelect.getForMode() != null) {
+ buffer.append(" FOR ");
+ buffer.append(plainSelect.getForMode().getValue());
+
if (plainSelect.getForUpdateTable() != null) {
buffer.append(" OF ").append(plainSelect.getForUpdateTable());
}
@@ -419,16 +421,19 @@ public void visit(Offset offset) {
}
public void visit(Fetch fetch) {
- // FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY
buffer.append(" FETCH ");
if (fetch.isFetchParamFirst()) {
buffer.append("FIRST ");
} else {
buffer.append("NEXT ");
}
- fetch.getExpression().accept(expressionVisitor);
- buffer.append(" ").append(fetch.getFetchParam()).append(" ONLY");
+ if (fetch.getExpression() != null) {
+ fetch.getExpression().accept(expressionVisitor);
+ }
+ for (String p : fetch.getFetchParameters()) {
+ buffer.append(" ").append(p);
+ }
}
public ExpressionVisitor getExpressionVisitor() {
@@ -478,6 +483,9 @@ public void deparseJoin(Join join) {
} else if (join.isApply()) {
buffer.append(" APPLY ");
} else {
+ if (join.getJoinHint() != null) {
+ buffer.append(" ").append(join.getJoinHint());
+ }
buffer.append(" JOIN ");
}
@@ -583,6 +591,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
visit((ParenthesedSelect) lateralSubSelect);
}
+ @Override
+ public void visit(TableStatement tableStatement) {
+ new TableStatementDeParser(expressionVisitor, buffer).deParse(tableStatement);
+ }
+
@Override
public void visit(TableFunction tableFunction) {
buffer.append(tableFunction.toString());
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
index e5833c433..f5326ae41 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
@@ -9,6 +9,9 @@
*/
package net.sf.jsqlparser.util.deparser;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
import net.sf.jsqlparser.statement.Block;
import net.sf.jsqlparser.statement.Commit;
import net.sf.jsqlparser.statement.CreateFunctionalStatement;
@@ -50,6 +53,7 @@
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.merge.MergeInsert;
import net.sf.jsqlparser.statement.merge.MergeUpdate;
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.WithItem;
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
@@ -58,10 +62,6 @@
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.upsert.Upsert;
-import java.util.Iterator;
-import java.util.List;
-import java.util.stream.Collectors;
-
public class StatementDeParser extends AbstractDeParser implements StatementVisitor {
private final ExpressionDeParser expressionDeParser;
@@ -104,6 +104,11 @@ public void visit(CreateView createView) {
createViewDeParser.deParse(createView);
}
+ @Override
+ public void visit(RefreshMaterializedViewStatement materializedViewStatement) {
+ new RefreshMaterializedViewStatementDeParser(buffer).deParse(materializedViewStatement);
+ }
+
@Override
public void visit(AlterView alterView) {
AlterViewDeParser alterViewDeParser = new AlterViewDeParser(buffer);
@@ -210,15 +215,18 @@ public void visit(Merge merge) {
}
}
- buffer.append("MERGE INTO ");
+ buffer.append("MERGE ");
+ if (merge.getOracleHint() != null) {
+ buffer.append(merge.getOracleHint()).append(" ");
+ }
+ buffer.append("INTO ");
merge.getTable().accept(selectDeParser);
buffer.append(" USING ");
merge.getFromItem().accept(selectDeParser);
- buffer.append(" ON (");
+ buffer.append(" ON ");
merge.getOnCondition().accept(expressionDeParser);
- buffer.append(")");
MergeInsert mergeInsert = merge.getMergeInsert();
MergeUpdate mergeUpdate = merge.getMergeUpdate();
@@ -227,7 +235,12 @@ public void visit(Merge merge) {
}
if (mergeUpdate != null) {
- buffer.append(" WHEN MATCHED THEN UPDATE SET ");
+ buffer.append(" WHEN MATCHED");
+ if (mergeUpdate.getAndPredicate() != null) {
+ buffer.append(" AND ");
+ mergeUpdate.getAndPredicate().accept(expressionDeParser);
+ }
+ buffer.append(" THEN UPDATE SET ");
deparseUpdateSets(mergeUpdate.getUpdateSets(), buffer, expressionDeParser);
if (mergeUpdate.getWhereCondition() != null) {
@@ -244,10 +257,19 @@ public void visit(Merge merge) {
if (!merge.isInsertFirst() && mergeInsert != null) {
deparseMergeInsert(mergeInsert);
}
+
+ if (merge.getOutputClause() != null) {
+ merge.getOutputClause().appendTo(buffer);
+ }
}
private void deparseMergeInsert(MergeInsert mergeInsert) {
- buffer.append(" WHEN NOT MATCHED THEN INSERT ");
+ buffer.append(" WHEN NOT MATCHED");
+ if (mergeInsert.getAndPredicate() != null) {
+ buffer.append(" AND ");
+ mergeInsert.getAndPredicate().accept(expressionDeParser);
+ }
+ buffer.append(" THEN INSERT ");
if (mergeInsert.getColumns() != null) {
mergeInsert.getColumns().accept(expressionDeParser);
}
@@ -324,19 +346,25 @@ public void visit(Comment comment) {
@Override
public void visit(DescribeStatement describe) {
- buffer.append("DESCRIBE ");
+ buffer.append(describe.getDescribeType());
+ buffer.append(" ");
buffer.append(describe.getTable());
}
@Override
public void visit(ExplainStatement explain) {
buffer.append("EXPLAIN ");
- if (explain.getOptions() != null) {
+ if (explain.getTable() != null) {
+ buffer.append(explain.getTable());
+ } else if (explain.getOptions() != null) {
buffer.append(explain.getOptions().values().stream()
.map(ExplainStatement.Option::formatOption).collect(Collectors.joining(" ")));
buffer.append(" ");
}
- explain.getStatement().accept(this);
+ if (explain.getStatement() != null) {
+ explain.getStatement().accept(this);
+
+ }
}
@Override
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java
new file mode 100644
index 000000000..962849c6e
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java
@@ -0,0 +1,98 @@
+/*-
+ * #%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.util.deparser;
+
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.statement.select.LateralSubSelect;
+import net.sf.jsqlparser.statement.select.Offset;
+import net.sf.jsqlparser.statement.select.ParenthesedSelect;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.SetOperationList;
+import net.sf.jsqlparser.statement.select.TableStatement;
+import net.sf.jsqlparser.statement.select.Values;
+import net.sf.jsqlparser.statement.select.WithItem;
+
+/**
+ * @author jxnu-liguobin
+ */
+public class TableStatementDeParser extends AbstractDeParser
+ implements SelectVisitor {
+
+ private final ExpressionVisitor expressionVisitor;
+
+ public TableStatementDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
+ super(buffer);
+ this.expressionVisitor = expressionVisitor;
+ }
+
+ @Override
+ public void deParse(TableStatement tableStatement) {
+ tableStatement.accept(this);
+ }
+
+ public void visit(Offset offset) {
+ buffer.append(" OFFSET ");
+ offset.getOffset().accept(expressionVisitor);
+ if (offset.getOffsetParam() != null) {
+ buffer.append(" ").append(offset.getOffsetParam());
+ }
+
+ }
+
+ @Override
+ public void visit(ParenthesedSelect parenthesedSelect) {
+
+ }
+
+ @Override
+ public void visit(PlainSelect plainSelect) {
+
+ }
+
+ @Override
+ public void visit(SetOperationList setOpList) {
+
+ }
+
+ @Override
+ public void visit(WithItem withItem) {
+
+ }
+
+ @Override
+ public void visit(Values aThis) {
+
+ }
+
+ @Override
+ public void visit(LateralSubSelect lateralSubSelect) {
+
+ }
+
+ @Override
+ public void visit(TableStatement tableStatement) {
+ buffer.append("TABLE ");
+ buffer.append(tableStatement.getTable());
+ if (tableStatement.getOrderByElements() != null) {
+ new OrderByDeParser(expressionVisitor, buffer)
+ .deParse(tableStatement.getOrderByElements());
+ }
+
+ if (tableStatement.getLimit() != null) {
+ new LimitDeparser(expressionVisitor, buffer).deParse(tableStatement.getLimit());
+ }
+ if (tableStatement.getOffset() != null) {
+ visit(tableStatement.getOffset());
+ }
+
+ // TODO UNION
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java
index 4f8affbeb..0ba4003c4 100644
--- a/src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java
+++ b/src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java
@@ -48,6 +48,9 @@ public void deParse(Update update) {
}
}
buffer.append("UPDATE ");
+ if (update.getOracleHint() != null) {
+ buffer.append(update.getOracleHint()).append(" ");
+ }
if (update.getModifierPriority() != null) {
buffer.append(update.getModifierPriority()).append(" ");
}
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/feature/FeaturesAllowed.java b/src/main/java/net/sf/jsqlparser/util/validation/feature/FeaturesAllowed.java
index 04c9a1277..3ada0ec28 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/feature/FeaturesAllowed.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/feature/FeaturesAllowed.java
@@ -38,13 +38,14 @@ public class FeaturesAllowed implements FeatureSetValidation, ModifyableFeatureS
Feature.jdbcParameter,
Feature.jdbcNamedParameter).unmodifyable();
- public static final FeaturesAllowed EXPRESSIONS = new FeaturesAllowed("EXPRESSIONS", Feature.exprLike,
- Feature.exprSimilarTo);
+ public static final FeaturesAllowed EXPRESSIONS =
+ new FeaturesAllowed("EXPRESSIONS", Feature.exprLike,
+ Feature.exprSimilarTo);
/**
* all {@link Feature}' within SQL SELECT without modification features like
- * {@link Feature#selectInto}, but jdbc-features like
- * {@link Feature#jdbcParameter} and {@link Feature#jdbcNamedParameter}
+ * {@link Feature#selectInto}, but jdbc-features like {@link Feature#jdbcParameter} and
+ * {@link Feature#jdbcNamedParameter}
*/
public static final FeaturesAllowed SELECT = new FeaturesAllowed("SELECT",
// select features
@@ -86,22 +87,25 @@ public class FeaturesAllowed implements FeatureSetValidation, ModifyableFeatureS
Feature.distinctOn,
Feature.orderBy,
Feature.orderByNullOrdering,
+ Feature.tableStatement,
Feature.function).unmodifyable();
/**
- * all {@link Feature}' for SQL INSERT including {@link #SELECT} and
- * {@link Feature#selectInto}
+ * all {@link Feature}' for SQL INSERT including {@link #SELECT} and {@link Feature#selectInto}
*/
- public static final FeaturesAllowed INSERT = new FeaturesAllowed("INSERT", Feature.insert, Feature.insertFromSelect,
- Feature.insertModifierIgnore, Feature.insertModifierPriority, Feature.insertReturningAll,
- Feature.insertReturningExpressionList, Feature.insertUseSet,
- Feature.insertValues, Feature.selectInto).add(SELECT).unmodifyable();
+ public static final FeaturesAllowed INSERT =
+ new FeaturesAllowed("INSERT", Feature.insert, Feature.insertFromSelect,
+ Feature.insertModifierIgnore, Feature.insertModifierPriority,
+ Feature.insertReturningAll,
+ Feature.insertReturningExpressionList, Feature.insertUseSet,
+ Feature.insertValues, Feature.selectInto).add(SELECT).unmodifyable();
/**
* all {@link Feature}' for SQL UPDATE including {@link #SELECT}
*/
- public static final FeaturesAllowed UPDATE = new FeaturesAllowed("UPDATE", Feature.update, Feature.updateJoins,
+ public static final FeaturesAllowed UPDATE = new FeaturesAllowed("UPDATE", Feature.update,
+ Feature.updateJoins,
Feature.updateFrom, Feature.updateLimit, Feature.updateOrderBy, Feature.updateReturning,
Feature.updateUseSelect)
.add(SELECT).unmodifyable();
@@ -109,55 +113,66 @@ public class FeaturesAllowed implements FeatureSetValidation, ModifyableFeatureS
/**
* all {@link Feature}' for SQL UPDATE including {@link #SELECT}
*/
- public static final FeaturesAllowed DELETE = new FeaturesAllowed("DELETE", Feature.delete, Feature.deleteJoin,
- Feature.deleteLimit, Feature.deleteOrderBy, Feature.deleteTables, Feature.deleteReturningExpressionList,
- Feature.truncate)
- .add(SELECT).unmodifyable();
+ public static final FeaturesAllowed DELETE =
+ new FeaturesAllowed("DELETE", Feature.delete, Feature.deleteJoin,
+ Feature.deleteLimit, Feature.deleteOrderBy, Feature.deleteTables,
+ Feature.deleteReturningExpressionList,
+ Feature.truncate)
+ .add(SELECT).unmodifyable();
/**
* all {@link Feature}' for SQL MERGE other similar commands
*/
- public static final FeaturesAllowed MERGE = new FeaturesAllowed("MERGE", Feature.merge, Feature.upsert,
- Feature.insertUseDuplicateKeyUpdate).unmodifyable();
+ public static final FeaturesAllowed MERGE =
+ new FeaturesAllowed("MERGE", Feature.merge, Feature.upsert,
+ Feature.insertUseDuplicateKeyUpdate).unmodifyable();
/**
* all DML {@link Feature}'s
*/
- public static final FeaturesAllowed DML = new FeaturesAllowed("DML").add(SELECT, INSERT, UPDATE, DELETE, MERGE)
- .unmodifyable();
+ public static final FeaturesAllowed DML =
+ new FeaturesAllowed("DML").add(SELECT, INSERT, UPDATE, DELETE, MERGE)
+ .unmodifyable();
- public static final FeaturesAllowed EXECUTE = new FeaturesAllowed("EXECUTE", Feature.execute).unmodifyable();
+ public static final FeaturesAllowed EXECUTE =
+ new FeaturesAllowed("EXECUTE", Feature.execute).unmodifyable();
/**
* all "CREATE" {@link Feature}'s
*/
public static final FeaturesAllowed CREATE = new FeaturesAllowed("CREATE", Feature.createIndex,
- Feature.createSchema, Feature.createSequence, Feature.createTable, Feature.createTableUnlogged,
+ Feature.createSchema, Feature.createSequence, Feature.createTable,
+ Feature.createTableUnlogged,
Feature.createTableCreateOptionStrings, Feature.createTableTableOptionStrings,
- Feature.createTableIfNotExists, Feature.createTableRowMovement, Feature.createTableFromSelect,
+ Feature.createTableIfNotExists, Feature.createTableRowMovement,
+ Feature.createTableFromSelect,
Feature.createTrigger,
Feature.createView).unmodifyable();
/**
* all "ALTER" {@link Feature}'s
*/
- public static final FeaturesAllowed ALTER = new FeaturesAllowed("ALTER", Feature.alterTable, Feature.alterSequence,
- Feature.alterView, Feature.alterIndex)
- .unmodifyable();
+ public static final FeaturesAllowed ALTER =
+ new FeaturesAllowed("ALTER", Feature.alterTable, Feature.alterSequence,
+ Feature.alterView, Feature.alterIndex)
+ .unmodifyable();
/**
* all "DROP" {@link Feature}'s
*/
- public static final FeaturesAllowed DROP = new FeaturesAllowed("DROP", Feature.drop, Feature.dropTable,
- Feature.dropIndex, Feature.dropView, Feature.dropSchema, Feature.dropSequence, Feature.dropTableIfExists,
- Feature.dropIndexIfExists, Feature.dropViewIfExists, Feature.dropSchemaIfExists,
- Feature.dropSequenceIfExists)
- .unmodifyable();
+ public static final FeaturesAllowed DROP =
+ new FeaturesAllowed("DROP", Feature.drop, Feature.dropTable,
+ Feature.dropIndex, Feature.dropView, Feature.dropSchema, Feature.dropSequence,
+ Feature.dropTableIfExists,
+ Feature.dropIndexIfExists, Feature.dropViewIfExists, Feature.dropSchemaIfExists,
+ Feature.dropSequenceIfExists)
+ .unmodifyable();
/**
* all DDL {@link Feature}'s
*/
- public static final FeaturesAllowed DDL = new FeaturesAllowed("DDL").add(CREATE, ALTER, DROP).unmodifyable();
+ public static final FeaturesAllowed DDL =
+ new FeaturesAllowed("DDL").add(CREATE, ALTER, DROP).unmodifyable();
private Set names = new LinkedHashSet<>();
private Set features = new HashSet<>();
@@ -278,7 +293,8 @@ public ValidationException getMessage(Feature feature) {
@Override
public String getName() {
- return names.isEmpty() ? FeatureSetValidation.super.getName() : names.stream().collect(Collectors.joining(SEPERATOR));
+ return names.isEmpty() ? FeatureSetValidation.super.getName()
+ : names.stream().collect(Collectors.joining(SEPERATOR));
}
@@ -289,7 +305,8 @@ public Set getFeatures() {
private List collectNames(FeatureSetValidation fs) {
String name = fs.getName();
- return Stream.of(name.split(SEPERATOR_REGEX)).map(String::trim).collect(Collectors.toList());
+ return Stream.of(name.split(SEPERATOR_REGEX)).map(String::trim)
+ .collect(Collectors.toList());
}
}
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/feature/MariaDbVersion.java b/src/main/java/net/sf/jsqlparser/util/validation/feature/MariaDbVersion.java
index 185da5664..983adb4fd 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/feature/MariaDbVersion.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/feature/MariaDbVersion.java
@@ -9,11 +9,10 @@
*/
package net.sf.jsqlparser.util.validation.feature;
-import net.sf.jsqlparser.parser.feature.Feature;
-
import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
+import net.sf.jsqlparser.parser.feature.Feature;
/**
* Please add Features supported and place a link to public documentation
@@ -41,7 +40,8 @@ public enum MariaDbVersion implements Version {
Feature.selectForUpdateSkipLocked,
// https://mariadb.com/kb/en/join-syntax/
- Feature.join, Feature.joinSimple, Feature.joinRight, Feature.joinNatural, Feature.joinLeft,
+ Feature.join, Feature.joinSimple, Feature.joinRight, Feature.joinNatural,
+ Feature.joinLeft,
Feature.joinCross, Feature.joinOuter, Feature.joinInner, Feature.joinStraight,
Feature.joinUsingColumns,
@@ -64,8 +64,10 @@ public enum MariaDbVersion implements Version {
// https://mariadb.com/kb/en/insert/
Feature.insert, Feature.insertValues, Feature.values,
- Feature.insertFromSelect, Feature.insertModifierPriority, Feature.insertModifierIgnore,
- Feature.insertUseSet, Feature.insertUseDuplicateKeyUpdate, Feature.insertReturningExpressionList,
+ Feature.insertFromSelect, Feature.insertModifierPriority,
+ Feature.insertModifierIgnore,
+ Feature.insertUseSet, Feature.insertUseDuplicateKeyUpdate,
+ Feature.insertReturningExpressionList,
// https://mariadb.com/kb/en/update/
Feature.update,
@@ -96,7 +98,8 @@ public enum MariaDbVersion implements Version {
Feature.dropView,
// https://mariadb.com/kb/en/drop-sequence/
Feature.dropSequence, Feature.dropTableIfExists, Feature.dropIndexIfExists,
- Feature.dropViewIfExists, Feature.dropSchemaIfExists, Feature.dropSequenceIfExists,
+ Feature.dropViewIfExists, Feature.dropSchemaIfExists,
+ Feature.dropSequenceIfExists,
// https://mariadb.com/kb/en/replace/
Feature.upsert,
@@ -110,9 +113,11 @@ public enum MariaDbVersion implements Version {
// https://mariadb.com/kb/en/create-view/
Feature.createView,
Feature.createOrReplaceView,
+ Feature.createViewWithComment,
// https://mariadb.com/kb/en/create-table/
- Feature.createTable, Feature.createTableCreateOptionStrings, Feature.createTableTableOptionStrings,
+ Feature.createTable, Feature.createTableCreateOptionStrings,
+ Feature.createTableTableOptionStrings,
Feature.createTableFromSelect, Feature.createTableIfNotExists,
// https://mariadb.com/kb/en/create-index/
Feature.createIndex,
@@ -143,7 +148,7 @@ public enum MariaDbVersion implements Version {
Feature.commit,
// https://mariadb.com/kb/en/optimizer-hints/
Feature.mySqlHintStraightJoin,
- Feature.mysqlCalcFoundRows,
+ Feature.mysqlCalcFoundRows,
Feature.mysqlSqlCacheFlag)),
ORACLE_MODE("oracle_mode", V10_5_4.copy().add(Feature.selectUnique).getFeatures());
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/feature/MySqlVersion.java b/src/main/java/net/sf/jsqlparser/util/validation/feature/MySqlVersion.java
index 01bbce4c1..a7aeeaae0 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/feature/MySqlVersion.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/feature/MySqlVersion.java
@@ -9,11 +9,10 @@
*/
package net.sf.jsqlparser.util.validation.feature;
-import net.sf.jsqlparser.parser.feature.Feature;
-
import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
+import net.sf.jsqlparser.parser.feature.Feature;
/**
* Please add Features supported and place a link to public documentation
@@ -33,11 +32,13 @@ public enum MySqlVersion implements Version {
// https://dev.mysql.com/doc/refman/8.0/en/select.html
Feature.select,
Feature.selectGroupBy, Feature.selectHaving,
- Feature.limit, Feature.limitOffset, Feature.offset, Feature.offsetParam, Feature.orderBy,
+ Feature.limit, Feature.limitOffset, Feature.offset, Feature.offsetParam,
+ Feature.orderBy,
Feature.selectForUpdate,
Feature.selectForUpdateOfTable,
Feature.selectForUpdateNoWait,
Feature.selectForUpdateSkipLocked,
+ Feature.selectForShare,
Feature.distinct,
Feature.setOperation,
@@ -51,7 +52,8 @@ public enum MySqlVersion implements Version {
Feature.function,
// https://dev.mysql.com/doc/refman/8.0/en/join.html
- Feature.join, Feature.joinSimple, Feature.joinLeft, Feature.joinRight, Feature.joinOuter,
+ Feature.join, Feature.joinSimple, Feature.joinLeft, Feature.joinRight,
+ Feature.joinOuter,
Feature.joinNatural, Feature.joinInner, Feature.joinCross, Feature.joinStraight,
Feature.joinUsingColumns,
@@ -59,6 +61,7 @@ public enum MySqlVersion implements Version {
Feature.insert,
Feature.insertValues,
Feature.values,
+ Feature.tableStatement,
Feature.insertFromSelect, Feature.insertUseSet, Feature.insertModifierPriority,
Feature.insertModifierIgnore, Feature.insertUseDuplicateKeyUpdate,
@@ -99,9 +102,11 @@ public enum MySqlVersion implements Version {
Feature.createSchema,
// https://dev.mysql.com/doc/refman/8.0/en/create-view.html
Feature.createView,
+ Feature.createViewWithComment,
Feature.createOrReplaceView,
// https://dev.mysql.com/doc/refman/8.0/en/create-table.html
- Feature.createTable, Feature.createTableCreateOptionStrings, Feature.createTableTableOptionStrings,
+ Feature.createTable, Feature.createTableCreateOptionStrings,
+ Feature.createTableTableOptionStrings,
Feature.createTableFromSelect, Feature.createTableIfNotExists,
// https://dev.mysql.com/doc/refman/8.0/en/create-index.html
Feature.createIndex,
@@ -110,6 +115,7 @@ public enum MySqlVersion implements Version {
// https://dev.mysql.com/doc/refman/8.0/en/describe.html
Feature.describe,
+ Feature.desc,
// https://dev.mysql.com/doc/refman/8.0/en/explain.html
Feature.explain,
// https://dev.mysql.com/doc/refman/8.0/en/show.html
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/feature/PostgresqlVersion.java b/src/main/java/net/sf/jsqlparser/util/validation/feature/PostgresqlVersion.java
index c5d3d898a..08bf3bf1a 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/feature/PostgresqlVersion.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/feature/PostgresqlVersion.java
@@ -12,7 +12,6 @@
import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
-
import net.sf.jsqlparser.parser.feature.Feature;
/**
@@ -33,7 +32,8 @@ public enum PostgresqlVersion implements Version {
Feature.exprSimilarTo,
// https://www.postgresql.org/docs/current/sql-select.html
Feature.select,
- Feature.selectGroupBy, Feature.function, Feature.tableFunction, Feature.lateralSubSelect,
+ Feature.selectGroupBy, Feature.function, Feature.tableFunction,
+ Feature.lateralSubSelect,
Feature.selectHaving,
// https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUPING-SETS
Feature.selectGroupByGroupingSets,
@@ -73,6 +73,9 @@ public enum PostgresqlVersion implements Version {
Feature.orderBy,
Feature.orderByNullOrdering,
+ Feature.selectForNoKeyUpdate,
+ Feature.selectForKeyShare,
+ Feature.selectForShare,
Feature.selectForUpdate,
Feature.selectForUpdateOfTable,
Feature.selectForUpdateNoWait,
@@ -107,6 +110,11 @@ public enum PostgresqlVersion implements Version {
// https://www.postgresql.org/docs/current/sql-alterview.html
// Feature.alterView,
+ // https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html
+ Feature.refreshMaterializedView,
+ Feature.refreshMaterializedWithNoDataView,
+ Feature.refreshMaterializedWithDataView,
+
// https://www.postgresql.org/docs/current/sql-insert.html
Feature.insert,
Feature.insertValues,
@@ -151,12 +159,9 @@ public enum PostgresqlVersion implements Version {
// https://www.postgresql.org/docs/current/sql-reset.html
Feature.reset,
// https://www.postgresql.org/docs/current/sql-commit.html
- Feature.commit
- )),
- V11("11", V10.copy().getFeatures()),
- V12("12", V11.copy().getFeatures()),
- V13("13", V12.copy().getFeatures()),
- V14("14", V13.copy().getFeatures());
+ Feature.commit)), V11("11", V10.copy().getFeatures()), V12("12",
+ V11.copy().getFeatures()), V13("13",
+ V12.copy().getFeatures()), V14("14", V13.copy().getFeatures());
private Set features;
private String versionString;
@@ -176,7 +181,8 @@ public enum PostgresqlVersion implements Version {
* @param unsupported
* @see #copy() to copy from previous version
*/
- PostgresqlVersion(String versionString, Set featuresSupported, Set unsupported) {
+ PostgresqlVersion(String versionString, Set featuresSupported,
+ Set unsupported) {
this.versionString = versionString;
this.features = featuresSupported;
this.features.removeAll(unsupported);
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/CreateViewValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/CreateViewValidator.java
index 2723cfc25..e2910ada3 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/CreateViewValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/CreateViewValidator.java
@@ -33,6 +33,8 @@ public void validate(CreateView createView) {
Feature.createViewTemporary);
validateFeature(c, createView.isMaterialized(), Feature.createViewMaterialized);
validateName(c, NamedObject.view, createView.getView().getFullyQualifiedName(), false);
+ validateFeature(c, createView.getViewCommentOptions() != null,
+ Feature.createViewWithComment);
}
SelectValidator v = getValidator(SelectValidator.class);
Select select = createView.getSelect();
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
index fcc554dd6..a0794b831 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java
@@ -79,6 +79,9 @@
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
import net.sf.jsqlparser.expression.operators.relational.Between;
+import net.sf.jsqlparser.expression.operators.relational.ContainedBy;
+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.ExistsExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
@@ -101,6 +104,8 @@
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
+import net.sf.jsqlparser.expression.operators.relational.TSQLLeftJoin;
+import net.sf.jsqlparser.expression.operators.relational.TSQLRightJoin;
import net.sf.jsqlparser.parser.feature.Feature;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.AllColumns;
@@ -290,6 +295,21 @@ public void visit(NotEqualsTo notEqualsTo) {
" " + notEqualsTo.getStringExpression() + " ");
}
+ @Override
+ public void visit(DoubleAnd doubleAnd) {
+
+ }
+
+ @Override
+ public void visit(Contains contains) {
+
+ }
+
+ @Override
+ public void visit(ContainedBy containedBy) {
+
+ }
+
@Override
public void visit(NullValue nullValue) {
// nothing to validate
@@ -676,4 +696,16 @@ public void visit(RangeExpression rangeExpression) {
rangeExpression.getStartExpression().accept(this);
rangeExpression.getEndExpression().accept(this);
}
+
+ @Override
+ public void visit(TSQLLeftJoin tsqlLeftJoin) {
+ tsqlLeftJoin.getLeftExpression().accept(this);
+ tsqlLeftJoin.getRightExpression().accept(this);
+ }
+
+ @Override
+ public void visit(TSQLRightJoin tsqlRightJoin) {
+ tsqlRightJoin.getLeftExpression().accept(this);
+ tsqlRightJoin.getRightExpression().accept(this);
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java
new file mode 100644
index 000000000..cca8785c2
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java
@@ -0,0 +1,39 @@
+/*-
+ * #%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.util.validation.validator;
+
+import net.sf.jsqlparser.parser.feature.Feature;
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
+import net.sf.jsqlparser.util.validation.ValidationCapability;
+import net.sf.jsqlparser.util.validation.metadata.NamedObject;
+
+/**
+ * @author jxnu-liguobin
+ */
+
+public class RefreshMaterializedViewStatementValidator
+ extends AbstractValidator {
+
+ @Override
+ public void validate(RefreshMaterializedViewStatement viewStatement) {
+ validateFeatureAndName(Feature.refreshMaterializedView, NamedObject.table,
+ viewStatement.getView().getName());
+ for (ValidationCapability c : getCapabilities()) {
+ // default
+ validateFeature(c, viewStatement.getRefreshMode() == null,
+ Feature.refreshMaterializedView);
+ // specify WITH DATA
+ validateOptionalFeature(c, viewStatement.getRefreshMode(),
+ Feature.refreshMaterializedWithDataView);
+ validateOptionalFeature(c, viewStatement.getRefreshMode(),
+ Feature.refreshMaterializedWithNoDataView);
+ }
+ }
+}
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
index 88166c1b5..97fcd08a3 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java
@@ -9,6 +9,7 @@
*/
package net.sf.jsqlparser.util.validation.validator;
+import java.util.List;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.MySQLIndexHint;
import net.sf.jsqlparser.expression.SQLServerHints;
@@ -16,6 +17,7 @@
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.ExceptOp;
import net.sf.jsqlparser.statement.select.Fetch;
+import net.sf.jsqlparser.statement.select.ForMode;
import net.sf.jsqlparser.statement.select.FromItemVisitor;
import net.sf.jsqlparser.statement.select.IntersectOp;
import net.sf.jsqlparser.statement.select.Join;
@@ -33,6 +35,7 @@
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableFunction;
+import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.UnPivot;
import net.sf.jsqlparser.statement.select.UnionOp;
import net.sf.jsqlparser.statement.select.Values;
@@ -41,8 +44,6 @@
import net.sf.jsqlparser.util.validation.ValidationUtil;
import net.sf.jsqlparser.util.validation.metadata.NamedObject;
-import java.util.List;
-
/**
* @author gitmotte
*/
@@ -85,8 +86,15 @@ public void visit(PlainSelect plainSelect) {
isNotEmpty(plainSelect.getOrderByElements()) && plainSelect.isOracleSiblings(),
Feature.oracleOrderBySiblings);
- if (plainSelect.isForUpdate()) {
+ if (plainSelect.getForMode() != null) {
validateFeature(c, Feature.selectForUpdate);
+ validateFeature(c, plainSelect.getForMode() == ForMode.KEY_SHARE,
+ Feature.selectForKeyShare);
+ validateFeature(c, plainSelect.getForMode() == ForMode.NO_KEY_UPDATE,
+ Feature.selectForNoKeyUpdate);
+ validateFeature(c, plainSelect.getForMode() == ForMode.SHARE,
+ Feature.selectForShare);
+
validateOptionalFeature(c, plainSelect.getForUpdateTable(),
Feature.selectForUpdateOfTable);
validateOptionalFeature(c, plainSelect.getWait(), Feature.selectForUpdateWait);
@@ -306,6 +314,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
validateOptional(lateralSubSelect.getSelect(), e -> e.accept(this));
}
+ @Override
+ public void visit(TableStatement tableStatement) {
+ getValidator(TableStatementValidator.class).validate(tableStatement);
+ }
+
@Override
public void visit(TableFunction tableFunction) {
validateFeature(Feature.tableFunction);
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
index 4bc3744b7..ec9650105 100644
--- a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
@@ -51,6 +51,7 @@
import net.sf.jsqlparser.statement.grant.Grant;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.merge.Merge;
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
@@ -85,6 +86,11 @@ public void visit(AlterView alterView) {
getValidator(AlterViewValidator.class).validate(alterView);
}
+ @Override
+ public void visit(RefreshMaterializedViewStatement materializedView) {
+ getValidator(RefreshMaterializedViewStatementValidator.class).validate(materializedView);
+ }
+
@Override
public void visit(Delete delete) {
getValidator(DeleteValidator.class).validate(delete);
@@ -203,13 +209,16 @@ public void visit(Comment comment) {
@Override
public void visit(DescribeStatement describe) {
validateFeature(Feature.describe);
+ validateFeature(Feature.desc);
validateOptionalFromItem(describe.getTable());
}
@Override
public void visit(ExplainStatement explain) {
validateFeature(Feature.explain);
- explain.getStatement().accept(this);
+ if (explain.getStatement() != null) {
+ explain.getStatement().accept(this);
+ }
}
diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/TableStatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/TableStatementValidator.java
new file mode 100644
index 000000000..4b954126e
--- /dev/null
+++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/TableStatementValidator.java
@@ -0,0 +1,27 @@
+/*-
+ * #%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.util.validation.validator;
+
+import net.sf.jsqlparser.parser.feature.Feature;
+import net.sf.jsqlparser.statement.select.TableStatement;
+import net.sf.jsqlparser.util.validation.ValidationCapability;
+
+/**
+ * @author jxnu-liguobin
+ */
+public class TableStatementValidator extends AbstractValidator {
+
+ @Override
+ public void validate(TableStatement statement) {
+ for (ValidationCapability c : getCapabilities()) {
+ validateFeature(c, Feature.tableStatement);
+ }
+ }
+}
diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
index f0dfae767..3144b3103 100644
--- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
+++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
@@ -59,6 +59,7 @@ import net.sf.jsqlparser.statement.drop.*;
import net.sf.jsqlparser.statement.insert.*;
import net.sf.jsqlparser.statement.execute.*;
import net.sf.jsqlparser.statement.select.*;
+import net.sf.jsqlparser.statement.refresh.*;
import net.sf.jsqlparser.statement.show.*;
import net.sf.jsqlparser.statement.truncate.*;
import net.sf.jsqlparser.statement.update.*;
@@ -138,7 +139,6 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
-|
|
|
|
@@ -182,8 +182,9 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
-|
+|
|
+|
|
|
|
@@ -191,6 +192,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -251,6 +253,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -271,6 +274,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -293,6 +297,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -364,6 +369,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -373,9 +379,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
+|
|
|
|
@@ -393,6 +401,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -413,8 +422,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|