Skip to content

Commit 425c72e

Browse files
feat: Add support for REFRESH MATERIALIZED VIEW (#1911)
* Support REFRESH MATERIALIZED VIEW * Fix * Rename * Rename * fmt * fmt * Add test * Fix jjt * Fix jjt * Fix jjt * typo * rebase master
1 parent 085d750 commit 425c72e

20 files changed

+483
-42
lines changed

src/main/java/net/sf/jsqlparser/parser/feature/Feature.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import net.sf.jsqlparser.statement.execute.Execute;
4545
import net.sf.jsqlparser.statement.grant.Grant;
4646
import net.sf.jsqlparser.statement.merge.Merge;
47+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
4748
import net.sf.jsqlparser.statement.select.Fetch;
4849
import net.sf.jsqlparser.statement.select.First;
4950
import net.sf.jsqlparser.statement.select.KSQLWindow;
@@ -391,6 +392,14 @@ public enum Feature {
391392
* @see AlterView
392393
*/
393394
alterView,
395+
396+
/**
397+
* SQL "REFRESH MATERIALIZED VIEW" statement is allowed
398+
*
399+
* @see RefreshMaterializedViewStatement
400+
*/
401+
refreshMaterializedView, refreshMaterializedWithDataView, refreshMaterializedWithNoDataView,
402+
394403
/**
395404
* SQL "REPLACE VIEW" statement is allowed
396405
*

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.sf.jsqlparser.statement.grant.Grant;
3030
import net.sf.jsqlparser.statement.insert.Insert;
3131
import net.sf.jsqlparser.statement.merge.Merge;
32+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
3233
import net.sf.jsqlparser.statement.select.Select;
3334
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
3435
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
@@ -68,6 +69,8 @@ public interface StatementVisitor {
6869

6970
void visit(AlterView alterView);
7071

72+
void visit(RefreshMaterializedViewStatement materializedView);
73+
7174
void visit(Alter alter);
7275

7376
void visit(Statements stmts);

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.sf.jsqlparser.statement.grant.Grant;
3030
import net.sf.jsqlparser.statement.insert.Insert;
3131
import net.sf.jsqlparser.statement.merge.Merge;
32+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
3233
import net.sf.jsqlparser.statement.select.Select;
3334
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
3435
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
@@ -222,4 +223,9 @@ public void visit(AlterSystemStatement alterSystemStatement) {}
222223
public void visit(UnsupportedStatement unsupportedStatement) {
223224

224225
}
226+
227+
@Override
228+
public void visit(RefreshMaterializedViewStatement materializedView) {
229+
230+
}
225231
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.refresh;
11+
12+
import net.sf.jsqlparser.schema.Table;
13+
import net.sf.jsqlparser.statement.Statement;
14+
import net.sf.jsqlparser.statement.StatementVisitor;
15+
16+
/**
17+
* REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ]
18+
* <p>
19+
* https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html
20+
*
21+
* @author jxnu-liguobin
22+
*/
23+
24+
public class RefreshMaterializedViewStatement implements Statement {
25+
26+
private Table view;
27+
private RefreshMode refreshMode;
28+
private boolean concurrently = false;
29+
30+
public RefreshMaterializedViewStatement() {}
31+
32+
public RefreshMaterializedViewStatement(Table view, boolean concurrently,
33+
RefreshMode refreshMode) {
34+
this.refreshMode = refreshMode;
35+
this.concurrently = concurrently;
36+
this.view = view;
37+
}
38+
39+
public Table getView() {
40+
return view;
41+
}
42+
43+
public void setView(Table view) {
44+
this.view = view;
45+
}
46+
47+
public RefreshMode getRefreshMode() {
48+
return refreshMode;
49+
}
50+
51+
public void setRefreshMode(RefreshMode refreshMode) {
52+
this.refreshMode = refreshMode;
53+
}
54+
55+
public boolean isConcurrently() {
56+
return concurrently;
57+
}
58+
59+
public void setConcurrently(boolean concurrently) {
60+
this.concurrently = concurrently;
61+
}
62+
63+
@SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
64+
@Override
65+
public String toString() {
66+
StringBuilder builder = new StringBuilder();
67+
builder.append("REFRESH MATERIALIZED VIEW ");
68+
if (this.refreshMode == null) {
69+
if (concurrently) {
70+
builder.append("CONCURRENTLY ");
71+
}
72+
builder.append(view);
73+
return builder.toString();
74+
}
75+
switch (this.refreshMode) {
76+
case WITH_DATA:
77+
if (concurrently) {
78+
builder.append("CONCURRENTLY ");
79+
}
80+
builder.append(view);
81+
builder.append(" WITH DATA");
82+
break;
83+
case WITH_NO_DATA:
84+
builder.append(view);
85+
if (!concurrently) {
86+
builder.append(" WITH NO DATA");
87+
}
88+
break;
89+
}
90+
return builder.toString();
91+
}
92+
93+
@Override
94+
public void accept(StatementVisitor statementVisitor) {
95+
statementVisitor.visit(this);
96+
}
97+
98+
public RefreshMaterializedViewStatement withTableName(Table view) {
99+
this.setView(view);
100+
return this;
101+
}
102+
103+
public RefreshMaterializedViewStatement withConcurrently(boolean concurrently) {
104+
this.setConcurrently(concurrently);
105+
return this;
106+
}
107+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2022 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.refresh;
11+
12+
public enum RefreshMode {
13+
14+
DEFAULT, WITH_DATA, WITH_NO_DATA;
15+
16+
public static RefreshMode from(String type) {
17+
return Enum.valueOf(RefreshMode.class, type.toUpperCase());
18+
}
19+
}

src/main/java/net/sf/jsqlparser/statement/select/JoinHint.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2023 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
110
package net.sf.jsqlparser.statement.select;
211

312
/**

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
*/
1010
package net.sf.jsqlparser.util;
1111

12+
import java.util.ArrayList;
13+
import java.util.HashSet;
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Set;
1217
import net.sf.jsqlparser.JSQLParserException;
1318
import net.sf.jsqlparser.expression.AllValue;
1419
import net.sf.jsqlparser.expression.AnalyticExpression;
@@ -146,6 +151,7 @@
146151
import net.sf.jsqlparser.statement.grant.Grant;
147152
import net.sf.jsqlparser.statement.insert.Insert;
148153
import net.sf.jsqlparser.statement.merge.Merge;
154+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
149155
import net.sf.jsqlparser.statement.select.AllColumns;
150156
import net.sf.jsqlparser.statement.select.AllTableColumns;
151157
import net.sf.jsqlparser.statement.select.FromItemVisitor;
@@ -169,12 +175,6 @@
169175
import net.sf.jsqlparser.statement.update.Update;
170176
import net.sf.jsqlparser.statement.upsert.Upsert;
171177

172-
import java.util.ArrayList;
173-
import java.util.HashSet;
174-
import java.util.List;
175-
import java.util.Map;
176-
import java.util.Set;
177-
178178
/**
179179
* Find all used tables within an select statement.
180180
*
@@ -986,6 +986,11 @@ public void visit(AlterView alterView) {
986986
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
987987
}
988988

989+
@Override
990+
public void visit(RefreshMaterializedViewStatement materializedView) {
991+
visit(materializedView.getView());
992+
}
993+
989994
@Override
990995
public void visit(TimeKeyExpression timeKeyExpression) {
991996

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.deparser;
11+
12+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
13+
14+
/**
15+
* @author jxnu-liguobin
16+
*/
17+
18+
public class RefreshMaterializedViewStatementDeParser
19+
extends AbstractDeParser<RefreshMaterializedViewStatement> {
20+
21+
public RefreshMaterializedViewStatementDeParser(StringBuilder buffer) {
22+
super(buffer);
23+
}
24+
25+
@SuppressWarnings("PMD.SwitchStmtsShouldHaveDefault")
26+
@Override
27+
public void deParse(RefreshMaterializedViewStatement view) {
28+
buffer.append("REFRESH MATERIALIZED VIEW ");
29+
if (view.getRefreshMode() == null) {
30+
if (view.isConcurrently()) {
31+
buffer.append("CONCURRENTLY ");
32+
}
33+
buffer.append(view.getView());
34+
return;
35+
}
36+
switch (view.getRefreshMode()) {
37+
case WITH_DATA:
38+
if (view.isConcurrently()) {
39+
buffer.append("CONCURRENTLY ");
40+
}
41+
buffer.append(view.getView());
42+
buffer.append(" WITH DATA");
43+
break;
44+
case WITH_NO_DATA:
45+
buffer.append(view.getView());
46+
if (view.isConcurrently()) {
47+
buffer.append(" WITH NO DATA");
48+
}
49+
break;
50+
}
51+
}
52+
53+
}

src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
*/
1010
package net.sf.jsqlparser.util.deparser;
1111

12+
import java.util.Iterator;
13+
import java.util.List;
14+
import java.util.stream.Collectors;
1215
import net.sf.jsqlparser.statement.Block;
1316
import net.sf.jsqlparser.statement.Commit;
1417
import net.sf.jsqlparser.statement.CreateFunctionalStatement;
@@ -50,6 +53,7 @@
5053
import net.sf.jsqlparser.statement.merge.Merge;
5154
import net.sf.jsqlparser.statement.merge.MergeInsert;
5255
import net.sf.jsqlparser.statement.merge.MergeUpdate;
56+
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
5357
import net.sf.jsqlparser.statement.select.Select;
5458
import net.sf.jsqlparser.statement.select.WithItem;
5559
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
@@ -58,10 +62,6 @@
5862
import net.sf.jsqlparser.statement.update.Update;
5963
import net.sf.jsqlparser.statement.upsert.Upsert;
6064

61-
import java.util.Iterator;
62-
import java.util.List;
63-
import java.util.stream.Collectors;
64-
6565
public class StatementDeParser extends AbstractDeParser<Statement> implements StatementVisitor {
6666

6767
private final ExpressionDeParser expressionDeParser;
@@ -104,6 +104,11 @@ public void visit(CreateView createView) {
104104
createViewDeParser.deParse(createView);
105105
}
106106

107+
@Override
108+
public void visit(RefreshMaterializedViewStatement materializedViewStatement) {
109+
new RefreshMaterializedViewStatementDeParser(buffer).deParse(materializedViewStatement);
110+
}
111+
107112
@Override
108113
public void visit(AlterView alterView) {
109114
AlterViewDeParser alterViewDeParser = new AlterViewDeParser(buffer);

src/main/java/net/sf/jsqlparser/util/validation/feature/PostgresqlVersion.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.util.Collections;
1313
import java.util.EnumSet;
1414
import java.util.Set;
15-
1615
import net.sf.jsqlparser.parser.feature.Feature;
1716

1817
/**
@@ -33,7 +32,8 @@ public enum PostgresqlVersion implements Version {
3332
Feature.exprSimilarTo,
3433
// https://www.postgresql.org/docs/current/sql-select.html
3534
Feature.select,
36-
Feature.selectGroupBy, Feature.function, Feature.tableFunction, Feature.lateralSubSelect,
35+
Feature.selectGroupBy, Feature.function, Feature.tableFunction,
36+
Feature.lateralSubSelect,
3737
Feature.selectHaving,
3838
// https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUPING-SETS
3939
Feature.selectGroupByGroupingSets,
@@ -107,6 +107,11 @@ public enum PostgresqlVersion implements Version {
107107
// https://www.postgresql.org/docs/current/sql-alterview.html
108108
// Feature.alterView,
109109

110+
// https://www.postgresql.org/docs/16/sql-refreshmaterializedview.html
111+
Feature.refreshMaterializedView,
112+
Feature.refreshMaterializedWithNoDataView,
113+
Feature.refreshMaterializedWithDataView,
114+
110115
// https://www.postgresql.org/docs/current/sql-insert.html
111116
Feature.insert,
112117
Feature.insertValues,
@@ -151,12 +156,9 @@ public enum PostgresqlVersion implements Version {
151156
// https://www.postgresql.org/docs/current/sql-reset.html
152157
Feature.reset,
153158
// https://www.postgresql.org/docs/current/sql-commit.html
154-
Feature.commit
155-
)),
156-
V11("11", V10.copy().getFeatures()),
157-
V12("12", V11.copy().getFeatures()),
158-
V13("13", V12.copy().getFeatures()),
159-
V14("14", V13.copy().getFeatures());
159+
Feature.commit)), V11("11", V10.copy().getFeatures()), V12("12",
160+
V11.copy().getFeatures()), V13("13",
161+
V12.copy().getFeatures()), V14("14", V13.copy().getFeatures());
160162

161163
private Set<Feature> features;
162164
private String versionString;
@@ -176,7 +178,8 @@ public enum PostgresqlVersion implements Version {
176178
* @param unsupported
177179
* @see #copy() to copy from previous version
178180
*/
179-
PostgresqlVersion(String versionString, Set<Feature> featuresSupported, Set<Feature> unsupported) {
181+
PostgresqlVersion(String versionString, Set<Feature> featuresSupported,
182+
Set<Feature> unsupported) {
180183
this.versionString = versionString;
181184
this.features = featuresSupported;
182185
this.features.removeAll(unsupported);

0 commit comments

Comments
 (0)