From 28d699a05ea934e30d67d029a8e199bfb6908ad6 Mon Sep 17 00:00:00 2001 From: zaza Date: Sun, 11 Dec 2022 16:40:42 +0100 Subject: [PATCH] Fix #1686: add support for creating views with "IF NOT EXISTS" clause --- .../statement/create/view/CreateView.java | 12 ++++++++++++ .../util/deparser/CreateViewDeParser.java | 3 +++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 1 + .../statement/create/CreateViewTest.java | 17 +++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java index 913f14dc1..9926cd008 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java @@ -30,6 +30,7 @@ public class CreateView implements Statement { private ForceOption force = ForceOption.NONE; private TemporaryOption temp = TemporaryOption.NONE; private boolean withReadOnly = false; + private boolean ifNotExists = false; @Override public void accept(StatementVisitor statementVisitor) { @@ -103,6 +104,14 @@ public void setWithReadOnly(boolean withReadOnly) { this.withReadOnly = withReadOnly; } + public boolean isIfNotExists() { + return ifNotExists; + } + + public void setIfNotExists(boolean ifNotExists) { + this.ifNotExists = ifNotExists; + } + @Override public String toString() { StringBuilder sql = new StringBuilder("CREATE "); @@ -129,6 +138,9 @@ public String toString() { } sql.append("VIEW "); sql.append(view); + if (ifNotExists) { + sql.append(" IF NOT EXISTS"); + } if (columnNames != null) { sql.append(PlainSelect.getStringList(columnNames, true, true)); } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java index fd9dd958c..c731ba9f8 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java @@ -60,6 +60,9 @@ public void deParse(CreateView createView) { buffer.append("MATERIALIZED "); } buffer.append("VIEW ").append(createView.getView().getFullyQualifiedName()); + if (createView.isIfNotExists()) { + buffer.append(" IF NOT EXISTS"); + } if (createView.getColumnNames() != null) { buffer.append(PlainSelect.getStringList(createView.getColumnNames(), true, true)); } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index aeb0ae341..ae651a2db 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -5420,6 +5420,7 @@ CreateView CreateView(): ] [ { createView.setMaterialized(true);} ] view=Table() { createView.setView(view); } + [ LOOKAHEAD(3) {createView.setIfNotExists(true);} ] [ columnNames = ColumnsNamesList() { createView.setColumnNames(columnNames); } ] select=SelectWithWithItems( ) { createView.setSelect(select); } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java index ea3a7a767..f6552ff4e 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java @@ -18,6 +18,8 @@ import static net.sf.jsqlparser.test.TestUtils.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.Test; public class CreateViewTest { @@ -121,4 +123,19 @@ public void testCreateTemporaryViewIssue665() throws JSQLParserException { public void testCreateWithReadOnlyViewIssue838() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE VIEW v14(c1, c2) AS SELECT c1, C2 FROM t1 WITH READ ONLY"); } + + @Test + public void testCreateViewIfNotExists() throws JSQLParserException { + String stmt = "CREATE VIEW myview IF NOT EXISTS AS SELECT * FROM mytab"; + CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); + assertTrue(createView.isIfNotExists()); + } + + @Test + public void testCreateMaterializedViewIfNotExists() throws JSQLParserException { + String stmt = "CREATE MATERIALIZED VIEW myview IF NOT EXISTS AS SELECT * FROM mytab"; + CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); + assertTrue(createView.isMaterialized()); + assertTrue(createView.isIfNotExists()); + } }