From 396a39bf3ab49efc764447bd5b34b8cacd777b6b Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Thu, 7 Dec 2023 17:52:01 +0800 Subject: [PATCH 01/12] Support REFRESH MATERIALIZED VIEW --- .../sf/jsqlparser/parser/feature/Feature.java | 9 ++ .../statement/StatementVisitor.java | 3 + .../statement/StatementVisitorAdapter.java | 6 + .../RefreshMaterializedViewStatement.java | 105 ++++++++++++++++++ .../statement/refreshView/RefreshType.java | 19 ++++ .../jsqlparser/statement/select/JoinHint.java | 9 ++ .../sf/jsqlparser/util/TablesNamesFinder.java | 6 + ...reshMaterializedViewStatementDeParser.java | 51 +++++++++ .../util/deparser/StatementDeParser.java | 6 + .../validation/feature/PostgresqlVersion.java | 6 + ...eshMaterializedViewStatementValidator.java | 39 +++++++ .../validator/StatementValidator.java | 6 + .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 17 +++ .../RefreshMaterializedViewStatementTest.java | 28 +++++ .../builder/ReflectionModelTest.java | 2 + .../create/table/ColDataTypeTest.java | 9 ++ .../statement/select/JoinHintTest.java | 9 ++ ...aterializedViewStatementValidatorTest.java | 64 +++++++++++ 18 files changed, 394 insertions(+) create mode 100644 src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java create mode 100644 src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java create mode 100644 src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java create mode 100644 src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java 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..62394bee5 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.refreshView.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, refreshMaterializedConcurrentlyView, 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..e7123aa06 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.refreshView.RefreshMaterializedViewStatement; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.show.ShowIndexStatement; import net.sf.jsqlparser.statement.show.ShowTablesStatement; @@ -67,6 +68,8 @@ public interface StatementVisitor { void visit(CreateView createView); void visit(AlterView alterView); + + void visit(RefreshMaterializedViewStatement materializedView); void visit(Alter alter); diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index 251fcc15b..d7c4fa2e6 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.refreshView.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/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java new file mode 100644 index 000000000..cd20d6bc4 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java @@ -0,0 +1,105 @@ + /*- + * #%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.refreshView; + +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 jxni-liguobin +*/ + +public class RefreshMaterializedViewStatement implements Statement { + + private String tableName; + private RefreshType refreshType = RefreshType.DEFAULT; + private boolean concurrently; + + public RefreshMaterializedViewStatement() { + } + + public RefreshMaterializedViewStatement(RefreshType refreshType) { + this.refreshType = refreshType; + } + + public RefreshMaterializedViewStatement(String tableName) { + this.tableName = tableName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public RefreshType getRefreshType() { + return refreshType; + } + + public void setRefreshType(RefreshType refreshType) { + this.refreshType = refreshType; + } + + 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 "); + switch (this.refreshType) { + case WITH_DATA: + if (concurrently) { + builder.append("CONCURRENTLY "); + } + builder.append(tableName); + builder.append(" WITH DATA"); + break; + case WITH_NO_DATA: + if (concurrently) { + throw new IllegalArgumentException( + "CONCURRENTLY and WITH NO DATA may not be specified together."); + } + builder.append(tableName); + builder.append(" WITH NO DATA"); + break; + case DEFAULT: + builder.append(tableName); + break; + } + return builder.toString(); + } + + @Override + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } + + public RefreshMaterializedViewStatement withTableName(String tableName) { + this.setTableName(tableName); + return this; + } + public RefreshMaterializedViewStatement withConcurrently(boolean concurrently) { + this.setConcurrently(concurrently); + return this; + } +} \ No newline at end of file diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java new file mode 100644 index 000000000..7bc89d218 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.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.refreshView; + +public enum RefreshType { + + DEFAULT, WITH_DATA, WITH_NO_DATA; + + public static RefreshType from(String type) { + return Enum.valueOf(RefreshType.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..a3073b35c 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -146,6 +146,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.refreshView.RefreshMaterializedViewStatement; import net.sf.jsqlparser.statement.select.AllColumns; import net.sf.jsqlparser.statement.select.AllTableColumns; import net.sf.jsqlparser.statement.select.FromItemVisitor; @@ -986,6 +987,11 @@ public void visit(AlterView alterView) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } + @Override + public void visit(RefreshMaterializedViewStatement materializedView) { + throw new UnsupportedOperationException(NOT_SUPPORTED_YET); + } + @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..3ac9f2763 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -0,0 +1,51 @@ +/*- + * #%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.refreshView.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 "); + switch (view.getRefreshType()){ + case WITH_DATA: + if (view.isConcurrently()) { + buffer.append("CONCURRENTLY "); + } + buffer.append(view.getTableName()); + buffer.append(" WITH DATA"); + break; + case WITH_NO_DATA: + if (view.isConcurrently()) { + throw new IllegalArgumentException( + "CONCURRENTLY and WITH NO DATA may not be specified together."); + } + buffer.append(view.getTableName()); + buffer.append(" WITH NO DATA"); + break; + case DEFAULT: + buffer.append(view.getTableName()); + break; + } + } + +} \ No newline at end of file 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..f7562a5b1 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -50,6 +50,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.refreshView.RefreshMaterializedViewStatement; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.WithItem; import net.sf.jsqlparser.statement.show.ShowIndexStatement; @@ -104,6 +105,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..747a333e6 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 @@ -107,6 +107,12 @@ 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.refreshMaterializedConcurrentlyView, + Feature.refreshMaterializedWithNoDataView, + Feature.refreshMaterializedWithDataView, + // https://www.postgresql.org/docs/current/sql-insert.html Feature.insert, Feature.insertValues, 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..98deb0c87 --- /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.statement.refreshView.RefreshType; +import net.sf.jsqlparser.util.validation.ValidationCapability; +import net.sf.jsqlparser.parser.feature.Feature; +import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; +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.getTableName()); + for (ValidationCapability c : getCapabilities()) { + // default + validateFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.DEFAULT) == 0, Feature.refreshMaterializedView); + // specify WITH DATA + validateFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0, Feature.refreshMaterializedWithDataView); + // specify WITH DATA and CONCURRENTLY + validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); + validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedConcurrentlyView); + // specify WITH NO DATA + validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_NO_DATA) == 0 && !viewStatement.isConcurrently(), Feature.refreshMaterializedWithNoDataView); + } + } +} \ No newline at end of file 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..0bd1c909a 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.refreshView.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..11d0ce126 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.refreshView.*; 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,18 @@ ShowIndexStatement ShowIndex(): { } } +RefreshMaterializedViewStatement RefreshMaterializedView(): { + String tableName; +} +{ + + [] + tableName = RelObjectNameExt() + [ [ ] ] + { + return new RefreshMaterializedViewStatement(tableName); + } +} // https://dev.mysql.com/doc/refman/8.0/en/show-tables.html ShowTablesStatement ShowTables(): { ShowTablesStatement showTablesStatement; 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..6716e4d8c --- /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 net.sf.jsqlparser.JSQLParserException; +import org.junit.jupiter.api.Test; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + +/** +* +* @author jxnu-liguobin +*/ + +public class RefreshMaterializedViewStatementTest { + + @Test + public void testSimpleUse() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("REFRESH MATERIALIZED VIEW my_view"); + } +} \ No newline at end of file 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..97c14d191 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -14,6 +14,7 @@ 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.refreshView.RefreshType; import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.statement.update.UpdateSet; import net.sf.jsqlparser.util.ReflectionTestUtils; @@ -131,6 +132,7 @@ 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.refreshView.RefreshMaterializedViewStatement(), 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..7080e6aaa 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.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; import net.sf.jsqlparser.JSQLParserException; 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..e042bbce3 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java @@ -0,0 +1,64 @@ +/*- + * #%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 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; + +import java.util.Arrays; + +/** +* +* @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.DML, + Feature.refreshMaterializedView, + Feature.refreshMaterializedConcurrentlyView, + Feature.refreshMaterializedWithNoDataView, + Feature.refreshMaterializedWithDataView + ); + } + } +} \ No newline at end of file From de6340d3b9be1d4f00dddabe4bafea07799cad69 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Thu, 7 Dec 2023 17:56:57 +0800 Subject: [PATCH 02/12] Fix --- .../refreshView/RefreshMaterializedViewStatement.java | 8 +++----- .../RefreshMaterializedViewStatementDeParser.java | 6 ++---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java index cd20d6bc4..d34454ac9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java @@ -75,12 +75,10 @@ public String toString() { builder.append(" WITH DATA"); break; case WITH_NO_DATA: - if (concurrently) { - throw new IllegalArgumentException( - "CONCURRENTLY and WITH NO DATA may not be specified together."); - } builder.append(tableName); - builder.append(" WITH NO DATA"); + if (!concurrently) { + builder.append(" WITH NO DATA"); + } break; case DEFAULT: builder.append(tableName); diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 3ac9f2763..728dbe26e 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -35,12 +35,10 @@ public void deParse(RefreshMaterializedViewStatement view) { buffer.append(" WITH DATA"); break; case WITH_NO_DATA: + buffer.append(view.getTableName()); if (view.isConcurrently()) { - throw new IllegalArgumentException( - "CONCURRENTLY and WITH NO DATA may not be specified together."); + buffer.append(" WITH NO DATA"); } - buffer.append(view.getTableName()); - buffer.append(" WITH NO DATA"); break; case DEFAULT: buffer.append(view.getTableName()); From 24d01e1ae47abeb53b32cbd69065ef3bea5d4200 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Thu, 7 Dec 2023 18:22:16 +0800 Subject: [PATCH 03/12] Rename --- .../RefreshMaterializedViewStatement.java | 16 ++++++++-------- .../{RefreshType.java => RefreshMode.java} | 6 +++--- ...RefreshMaterializedViewStatementDeParser.java | 2 +- ...efreshMaterializedViewStatementValidator.java | 12 ++++++------ .../statement/builder/ReflectionModelTest.java | 1 - 5 files changed, 18 insertions(+), 19 deletions(-) rename src/main/java/net/sf/jsqlparser/statement/refreshView/{RefreshType.java => RefreshMode.java} (65%) diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java index d34454ac9..17aa1ad99 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java @@ -23,14 +23,14 @@ public class RefreshMaterializedViewStatement implements Statement { private String tableName; - private RefreshType refreshType = RefreshType.DEFAULT; + private RefreshMode refreshMode = RefreshMode.DEFAULT; private boolean concurrently; public RefreshMaterializedViewStatement() { } - public RefreshMaterializedViewStatement(RefreshType refreshType) { - this.refreshType = refreshType; + public RefreshMaterializedViewStatement(RefreshMode refreshMode) { + this.refreshMode = refreshMode; } public RefreshMaterializedViewStatement(String tableName) { @@ -45,12 +45,12 @@ public void setTableName(String tableName) { this.tableName = tableName; } - public RefreshType getRefreshType() { - return refreshType; + public RefreshMode getRefreshMode() { + return refreshMode; } - public void setRefreshType(RefreshType refreshType) { - this.refreshType = refreshType; + public void setRefreshMode(RefreshMode refreshMode) { + this.refreshMode = refreshMode; } public boolean isConcurrently() { @@ -66,7 +66,7 @@ public void setConcurrently(boolean concurrently) { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("REFRESH MATERIALIZED VIEW "); - switch (this.refreshType) { + switch (this.refreshMode) { case WITH_DATA: if (concurrently) { builder.append("CONCURRENTLY "); diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java similarity index 65% rename from src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java rename to src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java index 7bc89d218..c5625112e 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshType.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java @@ -9,11 +9,11 @@ */ package net.sf.jsqlparser.statement.refreshView; -public enum RefreshType { +public enum RefreshMode { DEFAULT, WITH_DATA, WITH_NO_DATA; - public static RefreshType from(String type) { - return Enum.valueOf(RefreshType.class, type.toUpperCase()); + public static RefreshMode from(String type) { + return Enum.valueOf(RefreshMode.class, type.toUpperCase()); } } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 728dbe26e..9651d3243 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -26,7 +26,7 @@ public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) { @Override public void deParse(RefreshMaterializedViewStatement view) { buffer.append("REFRESH MATERIALIZED VIEW "); - switch (view.getRefreshType()){ + switch (view.getRefreshMode()){ case WITH_DATA: if (view.isConcurrently()) { buffer.append("CONCURRENTLY "); 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 index 98deb0c87..4c1075491 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.util.validation.validator; -import net.sf.jsqlparser.statement.refreshView.RefreshType; +import net.sf.jsqlparser.statement.refreshView.RefreshMode; import net.sf.jsqlparser.util.validation.ValidationCapability; import net.sf.jsqlparser.parser.feature.Feature; import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; @@ -26,14 +26,14 @@ public void validate(RefreshMaterializedViewStatement viewStatement) { validateFeatureAndName(Feature.refreshMaterializedView, NamedObject.table, viewStatement.getTableName()); for (ValidationCapability c : getCapabilities()) { // default - validateFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.DEFAULT) == 0, Feature.refreshMaterializedView); + validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.DEFAULT) == 0, Feature.refreshMaterializedView); // specify WITH DATA - validateFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0, Feature.refreshMaterializedWithDataView); + validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0, Feature.refreshMaterializedWithDataView); // specify WITH DATA and CONCURRENTLY - validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); - validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedConcurrentlyView); + validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); + validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedConcurrentlyView); // specify WITH NO DATA - validateOptionalFeature(c, viewStatement.getRefreshType().compareTo(RefreshType.WITH_NO_DATA) == 0 && !viewStatement.isConcurrently(), Feature.refreshMaterializedWithNoDataView); + validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_NO_DATA) == 0 && !viewStatement.isConcurrently(), Feature.refreshMaterializedWithNoDataView); } } } \ No newline at end of file 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 97c14d191..cf55d6bf9 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -14,7 +14,6 @@ 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.refreshView.RefreshType; import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.statement.update.UpdateSet; import net.sf.jsqlparser.util.ReflectionTestUtils; From e1c91196a71d091f3cb495c8c8beb7716f0e6fa1 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Thu, 7 Dec 2023 18:25:20 +0800 Subject: [PATCH 04/12] Rename --- .../refreshView/RefreshMaterializedViewStatement.java | 3 +++ .../deparser/RefreshMaterializedViewStatementDeParser.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java index 17aa1ad99..121191596 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java @@ -81,6 +81,9 @@ public String toString() { } break; case DEFAULT: + if (concurrently) { + builder.append("CONCURRENTLY "); + } builder.append(tableName); break; } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 9651d3243..0e4a56c74 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -41,6 +41,9 @@ public void deParse(RefreshMaterializedViewStatement view) { } break; case DEFAULT: + if (view.isConcurrently()) { + buffer.append("CONCURRENTLY "); + } buffer.append(view.getTableName()); break; } From 2f8f4e9bee55972e80d14058605604c0f694bf0a Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Thu, 7 Dec 2023 20:19:51 +0800 Subject: [PATCH 05/12] fmt --- .../sf/jsqlparser/parser/feature/Feature.java | 4 +- .../statement/StatementVisitor.java | 2 +- .../statement/StatementVisitorAdapter.java | 2 +- .../RefreshMaterializedViewStatement.java | 63 ++++++++++--------- .../statement/refreshView/RefreshMode.java | 2 +- .../sf/jsqlparser/util/TablesNamesFinder.java | 12 ++-- ...reshMaterializedViewStatementDeParser.java | 23 +++---- .../util/deparser/StatementDeParser.java | 7 +-- .../validation/feature/PostgresqlVersion.java | 16 +++-- ...eshMaterializedViewStatementValidator.java | 33 +++++++--- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 6 +- .../RefreshMaterializedViewStatementTest.java | 12 ++-- .../builder/ReflectionModelTest.java | 9 ++- .../statement/select/JoinHintTest.java | 3 +- ...aterializedViewStatementValidatorTest.java | 27 ++++---- 15 files changed, 115 insertions(+), 106 deletions(-) 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 62394bee5..e46a48965 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -398,8 +398,8 @@ public enum Feature { * * @see RefreshMaterializedViewStatement */ - refreshMaterializedView, refreshMaterializedConcurrentlyView, refreshMaterializedWithDataView, refreshMaterializedWithNoDataView, - + refreshMaterializedView, refreshMaterializedConcurrentlyView, 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 e7123aa06..67bd9a8dc 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -68,7 +68,7 @@ public interface StatementVisitor { void visit(CreateView createView); void visit(AlterView alterView); - + void visit(RefreshMaterializedViewStatement materializedView); void visit(Alter alter); diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index d7c4fa2e6..69eac4352 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -226,6 +226,6 @@ public void visit(UnsupportedStatement unsupportedStatement) { @Override public void visit(RefreshMaterializedViewStatement materializedView) { - + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java index 121191596..8d9784c3a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java @@ -1,48 +1,48 @@ - /*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ +/*- + * #%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.refreshView; +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 jxni-liguobin -*/ + * REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ] + * + * https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html + * + * @author jxni-liguobin + */ public class RefreshMaterializedViewStatement implements Statement { - private String tableName; + private Table view; private RefreshMode refreshMode = RefreshMode.DEFAULT; private boolean concurrently; - public RefreshMaterializedViewStatement() { - } - + public RefreshMaterializedViewStatement() {} + public RefreshMaterializedViewStatement(RefreshMode refreshMode) { this.refreshMode = refreshMode; } - public RefreshMaterializedViewStatement(String tableName) { - this.tableName = tableName; + public RefreshMaterializedViewStatement(Table view) { + this.view = view; } - public String getTableName() { - return tableName; + public Table getView() { + return view; } - public void setTableName(String tableName) { - this.tableName = tableName; + public void setView(Table view) { + this.view = view; } public RefreshMode getRefreshMode() { @@ -71,11 +71,11 @@ public String toString() { if (concurrently) { builder.append("CONCURRENTLY "); } - builder.append(tableName); + builder.append(view); builder.append(" WITH DATA"); break; case WITH_NO_DATA: - builder.append(tableName); + builder.append(view); if (!concurrently) { builder.append(" WITH NO DATA"); } @@ -84,7 +84,7 @@ public String toString() { if (concurrently) { builder.append("CONCURRENTLY "); } - builder.append(tableName); + builder.append(view); break; } return builder.toString(); @@ -95,12 +95,13 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - public RefreshMaterializedViewStatement withTableName(String tableName) { - this.setTableName(tableName); + public RefreshMaterializedViewStatement withTableName(Table view) { + this.setView(view); return this; } + public RefreshMaterializedViewStatement withConcurrently(boolean concurrently) { this.setConcurrently(concurrently); return this; } -} \ No newline at end of file +} diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java index c5625112e..842622bfb 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java +++ b/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java @@ -10,7 +10,7 @@ package net.sf.jsqlparser.statement.refreshView; public enum RefreshMode { - + DEFAULT, WITH_DATA, WITH_NO_DATA; public static RefreshMode from(String type) { diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index a3073b35c..483422900 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; @@ -170,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. * @@ -989,6 +988,7 @@ public void visit(AlterView alterView) { @Override public void visit(RefreshMaterializedViewStatement materializedView) { + visit(materializedView.getView()); throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 0e4a56c74..4cf80fcf2 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -12,12 +12,13 @@ import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; /** -* -* @author jxnu-liguobin -*/ + * + * @author jxnu-liguobin + */ + +public class RefreshMaterializedViewStatementDeParser + extends AbstractDeParser { -public class RefreshMaterializedViewStatementDeParser extends AbstractDeParser { - public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) { super(buffer); } @@ -26,16 +27,16 @@ public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) { @Override public void deParse(RefreshMaterializedViewStatement view) { buffer.append("REFRESH MATERIALIZED VIEW "); - switch (view.getRefreshMode()){ + switch (view.getRefreshMode()) { case WITH_DATA: if (view.isConcurrently()) { buffer.append("CONCURRENTLY "); } - buffer.append(view.getTableName()); + buffer.append(view.getView()); buffer.append(" WITH DATA"); break; case WITH_NO_DATA: - buffer.append(view.getTableName()); + buffer.append(view.getView()); if (view.isConcurrently()) { buffer.append(" WITH NO DATA"); } @@ -44,9 +45,9 @@ public void deParse(RefreshMaterializedViewStatement view) { if (view.isConcurrently()) { buffer.append("CONCURRENTLY "); } - buffer.append(view.getTableName()); + buffer.append(view.getView()); break; } } - -} \ No newline at end of file + +} 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 f7562a5b1..115bf5d39 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; @@ -59,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; 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 747a333e6..1af51d4f6 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, @@ -157,12 +157,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; @@ -182,7 +179,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 index 4c1075491..08c836fac 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java @@ -9,31 +9,44 @@ */ package net.sf.jsqlparser.util.validation.validator; -import net.sf.jsqlparser.statement.refreshView.RefreshMode; -import net.sf.jsqlparser.util.validation.ValidationCapability; import net.sf.jsqlparser.parser.feature.Feature; import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; +import net.sf.jsqlparser.statement.refreshView.RefreshMode; +import net.sf.jsqlparser.util.validation.ValidationCapability; import net.sf.jsqlparser.util.validation.metadata.NamedObject; /** * @author jxnu-liguobin */ -public class RefreshMaterializedViewStatementValidator extends AbstractValidator { +public class RefreshMaterializedViewStatementValidator + extends AbstractValidator { @Override public void validate(RefreshMaterializedViewStatement viewStatement) { - validateFeatureAndName(Feature.refreshMaterializedView, NamedObject.table, viewStatement.getTableName()); + validateFeatureAndName(Feature.refreshMaterializedView, NamedObject.table, + viewStatement.getView().getName()); for (ValidationCapability c : getCapabilities()) { // default - validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.DEFAULT) == 0, Feature.refreshMaterializedView); + validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.DEFAULT) == 0, + Feature.refreshMaterializedView); // specify WITH DATA - validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0, Feature.refreshMaterializedWithDataView); + validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0, + Feature.refreshMaterializedWithDataView); // specify WITH DATA and CONCURRENTLY - validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); - validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 && viewStatement.isConcurrently(), Feature.refreshMaterializedConcurrentlyView); + validateOptionalFeature(c, + viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 + && viewStatement.isConcurrently(), + Feature.refreshMaterializedWithDataView); + validateOptionalFeature(c, + viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 + && viewStatement.isConcurrently(), + Feature.refreshMaterializedConcurrentlyView); // specify WITH NO DATA - validateOptionalFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_NO_DATA) == 0 && !viewStatement.isConcurrently(), Feature.refreshMaterializedWithNoDataView); + validateOptionalFeature(c, + viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_NO_DATA) == 0 + && !viewStatement.isConcurrently(), + Feature.refreshMaterializedWithNoDataView); } } -} \ No newline at end of file +} diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 11d0ce126..54bbac8c9 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1225,15 +1225,15 @@ ShowIndexStatement ShowIndex(): { } RefreshMaterializedViewStatement RefreshMaterializedView(): { - String tableName; + Table view = null; } { [] - tableName = RelObjectNameExt() + view = Table() [ [ ] ] { - return new RefreshMaterializedViewStatement(tableName); + return new RefreshMaterializedViewStatement(view); } } // https://dev.mysql.com/doc/refman/8.0/en/show-tables.html diff --git a/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java index 6716e4d8c..4ebba56c7 100644 --- a/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/RefreshMaterializedViewStatementTest.java @@ -9,15 +9,15 @@ */ package net.sf.jsqlparser.statement; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + import net.sf.jsqlparser.JSQLParserException; import org.junit.jupiter.api.Test; -import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; - /** -* -* @author jxnu-liguobin -*/ + * + * @author jxnu-liguobin + */ public class RefreshMaterializedViewStatementTest { @@ -25,4 +25,4 @@ public class RefreshMaterializedViewStatementTest { public void testSimpleUse() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("REFRESH MATERIALIZED VIEW my_view"); } -} \ No newline at end of file +} 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 cf55d6bf9..453332ad3 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -9,6 +9,10 @@ */ 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; @@ -19,11 +23,6 @@ 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 *
    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 7080e6aaa..9f7a63132 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/JoinHintTest.java @@ -9,13 +9,12 @@ */ 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/validation/validator/RefreshMaterializedViewStatementValidatorTest.java b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java index e042bbce3..a132810b8 100644 --- a/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java @@ -9,18 +9,17 @@ */ 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; -import java.util.Arrays; - /** -* -* @author jxnu-liguobin -*/ + * + * @author jxnu-liguobin + */ public class RefreshMaterializedViewStatementValidatorTest extends ValidationTestAsserts { @@ -33,7 +32,8 @@ public void testValidationRefresh() throws Exception { @Test public void testValidationRefreshWithData() throws Exception { - for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA")) { + for (String sql : Arrays + .asList("REFRESH MATERIALIZED VIEW CONCURRENTLY my_view WITH DATA")) { validateNoErrors(sql, 1, DatabaseType.POSTGRESQL); } @@ -41,24 +41,23 @@ public void testValidationRefreshWithData() throws Exception { 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.DML, - Feature.refreshMaterializedView, - Feature.refreshMaterializedConcurrentlyView, + Feature.refreshMaterializedView, + Feature.refreshMaterializedConcurrentlyView, Feature.refreshMaterializedWithNoDataView, - Feature.refreshMaterializedWithDataView - ); + Feature.refreshMaterializedWithDataView); } } -} \ No newline at end of file +} From 54b5dec1a6070b2197f84b127ba3161c14903cf5 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 08:50:40 +0800 Subject: [PATCH 06/12] fmt --- src/main/java/net/sf/jsqlparser/parser/feature/Feature.java | 2 +- .../java/net/sf/jsqlparser/statement/StatementVisitor.java | 2 +- .../net/sf/jsqlparser/statement/StatementVisitorAdapter.java | 2 +- .../RefreshMaterializedViewStatement.java | 2 +- .../statement/{refreshView => refresh}/RefreshMode.java | 2 +- src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java | 2 +- .../deparser/RefreshMaterializedViewStatementDeParser.java | 2 +- .../net/sf/jsqlparser/util/deparser/StatementDeParser.java | 2 +- .../validator/RefreshMaterializedViewStatementValidator.java | 4 ++-- .../util/validation/validator/StatementValidator.java | 2 +- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 +- .../sf/jsqlparser/statement/builder/ReflectionModelTest.java | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/net/sf/jsqlparser/statement/{refreshView => refresh}/RefreshMaterializedViewStatement.java (98%) rename src/main/java/net/sf/jsqlparser/statement/{refreshView => refresh}/RefreshMode.java (87%) 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 e46a48965..99eb82abb 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -44,7 +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.refreshView.RefreshMaterializedViewStatement; +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; diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index 67bd9a8dc..46d4e0d96 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -29,7 +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.refreshView.RefreshMaterializedViewStatement; +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; diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index 69eac4352..72d2a540a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -29,7 +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.refreshView.RefreshMaterializedViewStatement; +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; diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java similarity index 98% rename from src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java rename to src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java index 8d9784c3a..427c987af 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java @@ -7,7 +7,7 @@ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ -package net.sf.jsqlparser.statement.refreshView; +package net.sf.jsqlparser.statement.refresh; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; diff --git a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java similarity index 87% rename from src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java rename to src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java index 842622bfb..fb78fac5d 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refreshView/RefreshMode.java +++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMode.java @@ -7,7 +7,7 @@ * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 * #L% */ -package net.sf.jsqlparser.statement.refreshView; +package net.sf.jsqlparser.statement.refresh; public enum RefreshMode { diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 483422900..123fd1997 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -151,7 +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.refreshView.RefreshMaterializedViewStatement; +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; diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 4cf80fcf2..59f0c6a36 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.util.deparser; -import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; +import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement; /** * 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 115bf5d39..b6006255d 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -53,7 +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.refreshView.RefreshMaterializedViewStatement; +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; 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 index 08c836fac..520aa035e 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java @@ -10,8 +10,8 @@ package net.sf.jsqlparser.util.validation.validator; import net.sf.jsqlparser.parser.feature.Feature; -import net.sf.jsqlparser.statement.refreshView.RefreshMaterializedViewStatement; -import net.sf.jsqlparser.statement.refreshView.RefreshMode; +import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement; +import net.sf.jsqlparser.statement.refresh.RefreshMode; import net.sf.jsqlparser.util.validation.ValidationCapability; import net.sf.jsqlparser.util.validation.metadata.NamedObject; 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 0bd1c909a..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,7 +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.refreshView.RefreshMaterializedViewStatement; +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; diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 54bbac8c9..e022921c8 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -59,7 +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.refreshView.*; +import net.sf.jsqlparser.statement.refresh.*; import net.sf.jsqlparser.statement.show.*; import net.sf.jsqlparser.statement.truncate.*; import net.sf.jsqlparser.statement.update.*; 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 453332ad3..877b453c1 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -130,7 +130,7 @@ 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.refreshView.RefreshMaterializedViewStatement(), + new net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement(), new net.sf.jsqlparser.statement.ShowStatement(), new net.sf.jsqlparser.statement.Statements(), new net.sf.jsqlparser.statement.UseStatement(), From 5cdc502aea326a5db771efacceb524c2ea3db57c Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 08:55:38 +0800 Subject: [PATCH 07/12] Add test --- .../sf/jsqlparser/util/TablesNamesFinder.java | 1 - .../util/TablesNamesFinderTest.java | 45 ++++++++++++++----- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 123fd1997..44f0859a5 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -989,7 +989,6 @@ public void visit(AlterView alterView) { @Override public void visit(RefreshMaterializedViewStatement materializedView) { visit(materializedView.getView()); - throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } @Override diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index 1cf2b90be..a79039520 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,26 @@ 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"); + } } From df2136e613e6601322f6e24bb7b0db9072c2617e Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 09:58:32 +0800 Subject: [PATCH 08/12] Fix jjt --- .../sf/jsqlparser/parser/feature/Feature.java | 2 +- .../RefreshMaterializedViewStatement.java | 9 ++++---- .../validation/feature/PostgresqlVersion.java | 1 - ...eshMaterializedViewStatementValidator.java | 22 ++++++++++++------- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 16 ++++++++++---- .../builder/ReflectionModelTest.java | 4 +++- ...aterializedViewStatementValidatorTest.java | 1 - 7 files changed, 34 insertions(+), 21 deletions(-) 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 99eb82abb..3d5825f5d 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -398,7 +398,7 @@ public enum Feature { * * @see RefreshMaterializedViewStatement */ - refreshMaterializedView, refreshMaterializedConcurrentlyView, refreshMaterializedWithDataView, refreshMaterializedWithNoDataView, + refreshMaterializedView, refreshMaterializedWithDataView, refreshMaterializedWithNoDataView, /** * SQL "REPLACE VIEW" statement is allowed diff --git a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java index 427c987af..d7c4ba45e 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java @@ -25,15 +25,14 @@ public class RefreshMaterializedViewStatement implements Statement { private Table view; private RefreshMode refreshMode = RefreshMode.DEFAULT; - private boolean concurrently; + private boolean concurrently = false; public RefreshMaterializedViewStatement() {} - public RefreshMaterializedViewStatement(RefreshMode refreshMode) { + public RefreshMaterializedViewStatement(Table view, boolean concurrently, + RefreshMode refreshMode) { this.refreshMode = refreshMode; - } - - public RefreshMaterializedViewStatement(Table view) { + this.concurrently = concurrently; this.view = view; } 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 1af51d4f6..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 @@ -109,7 +109,6 @@ public enum PostgresqlVersion implements Version { // https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html Feature.refreshMaterializedView, - Feature.refreshMaterializedConcurrentlyView, Feature.refreshMaterializedWithNoDataView, Feature.refreshMaterializedWithDataView, 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 index 520aa035e..74ae6b922 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java @@ -28,23 +28,29 @@ public void validate(RefreshMaterializedViewStatement viewStatement) { viewStatement.getView().getName()); for (ValidationCapability c : getCapabilities()) { // default - validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.DEFAULT) == 0, + validateFeature(c, + viewStatement.getRefreshMode() == RefreshMode.DEFAULT + && !viewStatement.isConcurrently(), + Feature.refreshMaterializedView); + validateFeature(c, + viewStatement.getRefreshMode() == RefreshMode.DEFAULT + && viewStatement.isConcurrently(), Feature.refreshMaterializedView); + // specify WITH DATA - validateFeature(c, viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0, + validateFeature(c, viewStatement.getRefreshMode() == RefreshMode.WITH_DATA && + !viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); + // specify WITH DATA and CONCURRENTLY validateOptionalFeature(c, - viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 + viewStatement.getRefreshMode() == RefreshMode.WITH_DATA && viewStatement.isConcurrently(), Feature.refreshMaterializedWithDataView); - validateOptionalFeature(c, - viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_DATA) == 0 - && viewStatement.isConcurrently(), - Feature.refreshMaterializedConcurrentlyView); + // specify WITH NO DATA validateOptionalFeature(c, - viewStatement.getRefreshMode().compareTo(RefreshMode.WITH_NO_DATA) == 0 + viewStatement.getRefreshMode() == RefreshMode.WITH_NO_DATA && !viewStatement.isConcurrently(), Feature.refreshMaterializedWithNoDataView); } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index e022921c8..558e0ade9 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1226,14 +1226,22 @@ ShowIndexStatement ShowIndex(): { RefreshMaterializedViewStatement RefreshMaterializedView(): { Table view = null; + boolean concurrently = false; + RefreshMode refreshMode = RefreshMode.DEFAULT; } { - [] + [ LOOKAHEAD(2) { concurrently = true; } ] view = Table() - [ [ ] ] - { - return new RefreshMaterializedViewStatement(view); + [ + { refreshMode = RefreshMode.WITH_DATA; } + [ + { refreshMode = RefreshMode.WITH_NO_DATA; } + ] + + ] + { + return new RefreshMaterializedViewStatement(view, concurrently, refreshMode); } } // https://dev.mysql.com/doc/refman/8.0/en/show-tables.html 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 877b453c1..75ec41db1 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -18,6 +18,7 @@ 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; @@ -130,7 +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.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/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java index a132810b8..f9cfb4e72 100644 --- a/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java @@ -55,7 +55,6 @@ public void testValidationRefreshNotAllowed() throws Exception { for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW my_view")) { validateNotAllowed(sql, 1, 1, FeaturesAllowed.DML, Feature.refreshMaterializedView, - Feature.refreshMaterializedConcurrentlyView, Feature.refreshMaterializedWithNoDataView, Feature.refreshMaterializedWithDataView); } From 17dda878d77c78bad7d2d4eab03f4906775da111 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 10:27:23 +0800 Subject: [PATCH 09/12] Fix jjt --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 14 ++++++++++---- .../statement/UnsupportedStatementTest.java | 13 ++++++++++--- .../sf/jsqlparser/util/TablesNamesFinderTest.java | 4 ++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 558e0ade9..8bd93714b 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1224,13 +1224,14 @@ ShowIndexStatement ShowIndex(): { } } -RefreshMaterializedViewStatement RefreshMaterializedView(): { +Statement RefreshMaterializedView(): { Table view = null; boolean concurrently = false; RefreshMode refreshMode = RefreshMode.DEFAULT; + List captureRest; } { - + [ LOOKAHEAD(2) { concurrently = true; } ] view = Table() [ @@ -1239,9 +1240,14 @@ RefreshMaterializedViewStatement RefreshMaterializedView(): { { refreshMode = RefreshMode.WITH_NO_DATA; } ] - ] + ] + captureRest = captureRest() { - return new RefreshMaterializedViewStatement(view, concurrently, refreshMode); + 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 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/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index a79039520..a155aca47 100644 --- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java +++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java @@ -516,5 +516,9 @@ void testRefreshMaterializedView() throws JSQLParserException { 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(); } } From f78139b23918652282ea9b98d40fd002b7999e98 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 11:00:30 +0800 Subject: [PATCH 10/12] Fix jjt --- .../RefreshMaterializedViewStatement.java | 19 +++++++------- ...reshMaterializedViewStatementDeParser.java | 14 +++++------ ...eshMaterializedViewStatementValidator.java | 25 +++---------------- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 +- ...aterializedViewStatementValidatorTest.java | 14 +++++++---- 5 files changed, 30 insertions(+), 44 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java index d7c4ba45e..c95bd0d39 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java @@ -15,16 +15,16 @@ /** * REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ] - * + *

    * https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html - * + * * @author jxni-liguobin */ public class RefreshMaterializedViewStatement implements Statement { private Table view; - private RefreshMode refreshMode = RefreshMode.DEFAULT; + private RefreshMode refreshMode; private boolean concurrently = false; public RefreshMaterializedViewStatement() {} @@ -65,6 +65,13 @@ public void setConcurrently(boolean concurrently) { 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) { @@ -79,12 +86,6 @@ public String toString() { builder.append(" WITH NO DATA"); } break; - case DEFAULT: - if (concurrently) { - builder.append("CONCURRENTLY "); - } - builder.append(view); - break; } return builder.toString(); } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java index 59f0c6a36..0646a65fe 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/RefreshMaterializedViewStatementDeParser.java @@ -12,7 +12,6 @@ import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement; /** - * * @author jxnu-liguobin */ @@ -27,6 +26,13 @@ public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) { @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()) { @@ -41,12 +47,6 @@ public void deParse(RefreshMaterializedViewStatement view) { buffer.append(" WITH NO DATA"); } break; - case DEFAULT: - if (view.isConcurrently()) { - buffer.append("CONCURRENTLY "); - } - buffer.append(view.getView()); - break; } } 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 index 74ae6b922..cca8785c2 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidator.java @@ -11,7 +11,6 @@ import net.sf.jsqlparser.parser.feature.Feature; import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement; -import net.sf.jsqlparser.statement.refresh.RefreshMode; import net.sf.jsqlparser.util.validation.ValidationCapability; import net.sf.jsqlparser.util.validation.metadata.NamedObject; @@ -28,30 +27,12 @@ public void validate(RefreshMaterializedViewStatement viewStatement) { viewStatement.getView().getName()); for (ValidationCapability c : getCapabilities()) { // default - validateFeature(c, - viewStatement.getRefreshMode() == RefreshMode.DEFAULT - && !viewStatement.isConcurrently(), + validateFeature(c, viewStatement.getRefreshMode() == null, Feature.refreshMaterializedView); - validateFeature(c, - viewStatement.getRefreshMode() == RefreshMode.DEFAULT - && viewStatement.isConcurrently(), - Feature.refreshMaterializedView); - // specify WITH DATA - validateFeature(c, viewStatement.getRefreshMode() == RefreshMode.WITH_DATA && - !viewStatement.isConcurrently(), + validateOptionalFeature(c, viewStatement.getRefreshMode(), Feature.refreshMaterializedWithDataView); - - // specify WITH DATA and CONCURRENTLY - validateOptionalFeature(c, - viewStatement.getRefreshMode() == RefreshMode.WITH_DATA - && viewStatement.isConcurrently(), - Feature.refreshMaterializedWithDataView); - - // specify WITH NO DATA - validateOptionalFeature(c, - viewStatement.getRefreshMode() == RefreshMode.WITH_NO_DATA - && !viewStatement.isConcurrently(), + validateOptionalFeature(c, viewStatement.getRefreshMode(), Feature.refreshMaterializedWithNoDataView); } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 8bd93714b..d2ab41d98 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1227,7 +1227,7 @@ ShowIndexStatement ShowIndex(): { Statement RefreshMaterializedView(): { Table view = null; boolean concurrently = false; - RefreshMode refreshMode = RefreshMode.DEFAULT; + RefreshMode refreshMode = null; List captureRest; } { 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 index f9cfb4e72..1444c2961 100644 --- a/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/RefreshMaterializedViewStatementValidatorTest.java @@ -17,7 +17,6 @@ import org.junit.jupiter.api.Test; /** - * * @author jxnu-liguobin */ @@ -53,10 +52,15 @@ public void testValidationRefreshWithConcurrently() throws Exception { @Test public void testValidationRefreshNotAllowed() throws Exception { for (String sql : Arrays.asList("REFRESH MATERIALIZED VIEW my_view")) { - validateNotAllowed(sql, 1, 1, FeaturesAllowed.DML, - Feature.refreshMaterializedView, - Feature.refreshMaterializedWithNoDataView, - Feature.refreshMaterializedWithDataView); + 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); } } } From 7fca4b3419b2199b1587ab5ea15a57e932c64aa6 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Fri, 8 Dec 2023 11:02:01 +0800 Subject: [PATCH 11/12] typo --- .../statement/refresh/RefreshMaterializedViewStatement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java index c95bd0d39..86b530ed3 100644 --- a/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/refresh/RefreshMaterializedViewStatement.java @@ -18,7 +18,7 @@ *

    * https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html * - * @author jxni-liguobin + * @author jxnu-liguobin */ public class RefreshMaterializedViewStatement implements Statement { From c5ba0f1cf13aeaf4203b955d1863f490718fe817 Mon Sep 17 00:00:00 2001 From: jxnu-liguobin Date: Mon, 11 Dec 2023 09:12:31 +0800 Subject: [PATCH 12/12] rebase master --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 +- src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index d2ab41d98..2045dfdda 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1797,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/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index a155aca47..2f9566088 100644 --- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java +++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java @@ -495,6 +495,7 @@ 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";