diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
index 7d7e94a72..3d5825f5d 100644
--- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
+++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
@@ -44,6 +44,7 @@
import net.sf.jsqlparser.statement.execute.Execute;
import net.sf.jsqlparser.statement.grant.Grant;
import net.sf.jsqlparser.statement.merge.Merge;
+import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Fetch;
import net.sf.jsqlparser.statement.select.First;
import net.sf.jsqlparser.statement.select.KSQLWindow;
@@ -391,6 +392,14 @@ public enum Feature {
* @see AlterView
*/
alterView,
+
+ /**
+ * SQL "REFRESH MATERIALIZED VIEW" statement is allowed
+ *
+ * @see RefreshMaterializedViewStatement
+ */
+ refreshMaterializedView, refreshMaterializedWithDataView, refreshMaterializedWithNoDataView,
+
/**
* SQL "REPLACE VIEW" statement is allowed
*
diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
index 86621f749..46d4e0d96 100644
--- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
+++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
@@ -29,6 +29,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;
@@ -68,6 +69,8 @@ public interface StatementVisitor {
void visit(AlterView alterView);
+ void visit(RefreshMaterializedViewStatement materializedView);
+
void visit(Alter alter);
void visit(Statements stmts);
diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
index 251fcc15b..72d2a540a 100644
--- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
+++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java
@@ -29,6 +29,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;
@@ -222,4 +223,9 @@ public void visit(AlterSystemStatement alterSystemStatement) {}
public void visit(UnsupportedStatement unsupportedStatement) {
}
+
+ @Override
+ public void visit(RefreshMaterializedViewStatement materializedView) {
+
+ }
}
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/JoinHint.java b/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java
index d98b1d568..099f73042 100644
--- a/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java
+++ b/src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java
@@ -1,3 +1,12 @@
+/*-
+ * #%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;
/**
diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
index a99ad6315..44f0859a5 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;
@@ -146,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;
@@ -169,12 +175,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.
*
@@ -986,6 +986,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) {
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/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
index 732ef3e39..b6006255d 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);
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..21cec80d2 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,
@@ -107,6 +107,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 +156,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 +178,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/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/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java
index 4bc3744b7..2f2932e78 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);
diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
index 3dbbef74f..2045dfdda 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.*;
@@ -191,6 +192,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -456,6 +458,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
|
|
|
+|
|
|
|
@@ -696,6 +699,8 @@ Statement SingleStatement() :
|
stm = Show()
|
+ stm = RefreshMaterializedView()
+ |
stm = Use()
|
stm = SavepointStatement()
@@ -1219,6 +1224,32 @@ ShowIndexStatement ShowIndex(): {
}
}
+Statement RefreshMaterializedView(): {
+ Table view = null;
+ boolean concurrently = false;
+ RefreshMode refreshMode = null;
+ List captureRest;
+}
+{
+
+ [ LOOKAHEAD(2) { concurrently = true; } ]
+ view = Table()
+ [
+ { refreshMode = RefreshMode.WITH_DATA; }
+ [
+ { refreshMode = RefreshMode.WITH_NO_DATA; }
+ ]
+
+ ]
+ captureRest = captureRest()
+ {
+ if (concurrently && refreshMode == RefreshMode.WITH_NO_DATA) {
+ return new UnsupportedStatement("REFRESH", captureRest);
+ } else {
+ return new RefreshMaterializedViewStatement(view, concurrently, refreshMode);
+ }
+ }
+}
// https://dev.mysql.com/doc/refman/8.0/en/show-tables.html
ShowTablesStatement ShowTables(): {
ShowTablesStatement showTablesStatement;
@@ -1766,7 +1797,7 @@ String RelObjectNameWithoutValue() :
{ Token tk = null; }
{
( tk= | tk= | tk= | tk= | tk= | tk= | tk=
- | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GUARD" | tk="HASH" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="LOOP" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MEMBER" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRIGGER" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
+ | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GUARD" | tk="HASH" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="LOOP" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MEMBER" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRIGGER" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
{ return tk.image; }
}
diff --git a/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java
new file mode 100644
index 000000000..4ebba56c7
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java
@@ -0,0 +1,28 @@
+/*-
+ * #%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;
+
+import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
+
+import net.sf.jsqlparser.JSQLParserException;
+import org.junit.jupiter.api.Test;
+
+/**
+ *
+ * @author jxnu-liguobin
+ */
+
+public class RefreshMaterializedViewStatementTest {
+
+ @Test
+ public void testSimpleUse() throws JSQLParserException {
+ assertSqlCanBeParsedAndDeparsed("REFRESH MATERIALIZED VIEW my_view");
+ }
+}
diff --git a/src/test/java/net/sf/jsqlparser/statement/UnsupportedStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/UnsupportedStatementTest.java
index 1a7238b6b..c07a0b996 100644
--- a/src/test/java/net/sf/jsqlparser/statement/UnsupportedStatementTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/UnsupportedStatementTest.java
@@ -9,6 +9,9 @@
*/
package net.sf.jsqlparser.statement;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.Select;
@@ -17,9 +20,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
public class UnsupportedStatementTest {
@Test
public void testSingleUnsupportedStatement() throws JSQLParserException {
@@ -88,6 +88,13 @@ void testAlter() throws JSQLParserException {
assertTrue(statement instanceof UnsupportedStatement);
}
+ @Test
+ void testRefresh() throws JSQLParserException {
+ String sqlStr = "REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH NO DATA";
+ Statements statement = CCJSqlParserUtil.parseStatements(sqlStr);
+ assertTrue(statement.get(0) instanceof UnsupportedStatement);
+ }
+
@Test
void testCreate() throws JSQLParserException {
String sqlStr =
diff --git a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
index 60a1a2d02..75ec41db1 100644
--- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java
@@ -9,21 +9,21 @@
*/
package net.sf.jsqlparser.statement.builder;
+import static net.sf.jsqlparser.test.TestUtils.asList;
+
+import java.util.ArrayList;
+import java.util.List;
import net.sf.jsqlparser.expression.AnyType;
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperatorType;
import net.sf.jsqlparser.schema.Sequence.ParameterType;
import net.sf.jsqlparser.statement.ExplainStatement.OptionType;
import net.sf.jsqlparser.statement.create.table.ColDataType;
+import net.sf.jsqlparser.statement.refresh.RefreshMode;
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
import net.sf.jsqlparser.statement.update.UpdateSet;
import net.sf.jsqlparser.util.ReflectionTestUtils;
import org.junit.jupiter.api.Test;
-import java.util.ArrayList;
-import java.util.List;
-
-import static net.sf.jsqlparser.test.TestUtils.asList;
-
/**
* Testing of setters, getters, with-/add-methods by calling them with random parameter-values
*
@@ -131,6 +131,8 @@ public class ReflectionModelTest {
new net.sf.jsqlparser.statement.SetStatement("name", null),
new net.sf.jsqlparser.statement.ShowColumnsStatement(),
new net.sf.jsqlparser.statement.show.ShowIndexStatement(),
+ new net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement(
+ new net.sf.jsqlparser.schema.Table("my_view"), true, RefreshMode.WITH_DATA),
new net.sf.jsqlparser.statement.ShowStatement(),
new net.sf.jsqlparser.statement.Statements(),
new net.sf.jsqlparser.statement.UseStatement(),
diff --git a/src/test/java/net/sf/jsqlparser/statement/create/table/ColDataTypeTest.java b/src/test/java/net/sf/jsqlparser/statement/create/table/ColDataTypeTest.java
index 43c5b1fc3..bc2cb5c4b 100644
--- a/src/test/java/net/sf/jsqlparser/statement/create/table/ColDataTypeTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/create/table/ColDataTypeTest.java
@@ -1,3 +1,12 @@
+/*-
+ * #%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.create.table;
import net.sf.jsqlparser.JSQLParserException;
diff --git a/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java b/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java
index 5336843f6..9f7a63132 100644
--- a/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java
+++ b/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java
@@ -1,12 +1,20 @@
+/*-
+ * #%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;
+import java.util.stream.Stream;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.test.TestUtils;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
-import java.util.stream.Stream;
-
class JoinHintTest {
public static Stream sqlStrings() {
return Stream.of(
diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
index 1cf2b90be..2f9566088 100644
--- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
+++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java
@@ -9,6 +9,17 @@
*/
package net.sf.jsqlparser.util;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.util.List;
+import java.util.Set;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
@@ -25,18 +36,6 @@
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.util.List;
-import java.util.Set;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
public class TablesNamesFinderTest {
private static final CCJSqlParserManager PARSER_MANAGER = new CCJSqlParserManager();
@@ -496,4 +495,31 @@ void testJoinSubSelect() throws JSQLParserException {
tableNames = TablesNamesFinder.findTablesInExpression(exprStr);
assertThat(tableNames).containsExactlyInAnyOrder("A", "B", "C");
}
+
+ @Test
+ void testRefreshMaterializedView() throws JSQLParserException {
+ String sqlStr1 = "REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA";
+ Set tableNames1 = TablesNamesFinder.findTables(sqlStr1);
+ assertThat(tableNames1).containsExactlyInAnyOrder("my_view");
+
+ String sqlStr2 = "REFRESH MATERIALIZED VIEW CONCURRENTLY my_view";
+ Set tableNames2 = TablesNamesFinder.findTables(sqlStr2);
+ assertThat(tableNames2).containsExactlyInAnyOrder("my_view");
+
+ String sqlStr3 = "REFRESH MATERIALIZED VIEW my_view";
+ Set tableNames3 = TablesNamesFinder.findTables(sqlStr3);
+ assertThat(tableNames3).containsExactlyInAnyOrder("my_view");
+
+ String sqlStr4 = "REFRESH MATERIALIZED VIEW my_view WITH DATA";
+ Set tableNames4 = TablesNamesFinder.findTables(sqlStr4);
+ assertThat(tableNames4).containsExactlyInAnyOrder("my_view");
+
+ String sqlStr5 = "REFRESH MATERIALIZED VIEW my_view WITH NO DATA";
+ Set tableNames5 = TablesNamesFinder.findTables(sqlStr5);
+ assertThat(tableNames5).containsExactlyInAnyOrder("my_view");
+
+ String sqlStr6 = "REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH NO DATA";
+ Set tableNames6 = TablesNamesFinder.findTables(sqlStr6);
+ assertThat(tableNames6).isEmpty();
+ }
}
diff --git a/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java
new file mode 100644
index 000000000..1444c2961
--- /dev/null
+++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java
@@ -0,0 +1,66 @@
+/*-
+ * #%L
+ * JSQLParser library
+ * %%
+ * Copyright (C) 2004 - 2020 JSQLParser
+ * %%
+ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
+ * #L%
+ */
+package net.sf.jsqlparser.util.validation.validator;
+
+import java.util.Arrays;
+import net.sf.jsqlparser.parser.feature.Feature;
+import net.sf.jsqlparser.util.validation.ValidationTestAsserts;
+import net.sf.jsqlparser.util.validation.feature.DatabaseType;
+import net.sf.jsqlparser.util.validation.feature.FeaturesAllowed;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author jxnu-liguobin
+ */
+
+public class RefreshMaterializedViewStatementValidatorTest extends ValidationTestAsserts {
+
+ @Test
+ public void testValidationRefresh() throws Exception {
+ for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW my_view")) {
+ validateNoErrors(sql, 1, DatabaseType.POSTGRESQL);
+ }
+ }
+
+ @Test
+ public void testValidationRefreshWithData() throws Exception {
+ for (String sql : Arrays
+ .asList("REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA")) {
+ validateNoErrors(sql, 1, DatabaseType.POSTGRESQL);
+ }
+
+ for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW my_view WITH DATA")) {
+ validateNoErrors(sql, 1, DatabaseType.POSTGRESQL);
+ }
+ }
+
+ @Test
+ public void testValidationRefreshWithConcurrently() throws Exception {
+ for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW CONCURRENTLY my_view")) {
+ validateNoErrors(sql, 1, DatabaseType.POSTGRESQL);
+ }
+ }
+
+
+ @Test
+ public void testValidationRefreshNotAllowed() throws Exception {
+ for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW my_view")) {
+ validateNotAllowed(sql, 1, 1, FeaturesAllowed.SELECT,
+ Feature.refreshMaterializedView);
+ }
+
+ for (String sql : Arrays
+ .asList("REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA")) {
+ validateNotAllowed(sql, 1, 1, FeaturesAllowed.SELECT,
+ Feature.refreshMaterializedView, Feature.refreshMaterializedWithDataView,
+ Feature.refreshMaterializedWithNoDataView);
+ }
+ }
+}