Skip to content

Commit e056476

Browse files
committed
Add IF NOT EXISTS to CREATE VIEW
1 parent 1dd64c6 commit e056476

57 files changed

Lines changed: 259 additions & 146 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

core/trino-grammar/src/main/antlr4/io/trino/grammar/sql/SqlBase.g4

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ statement
109109
(WHEN STALE (INLINE | FAIL))?
110110
(COMMENT string)?
111111
(WITH properties)? AS rootQuery #createMaterializedView
112-
| CREATE (OR REPLACE)? VIEW qualifiedName
112+
| CREATE (OR REPLACE)? VIEW
113+
(IF NOT EXISTS)? qualifiedName
113114
(COMMENT string)?
114115
(SECURITY (DEFINER | INVOKER))?
115116
(WITH properties)? AS rootQuery #createView

core/trino-main/src/main/java/io/trino/execution/CreateViewTask.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.trino.metadata.ViewDefinition;
2626
import io.trino.metadata.ViewPropertyManager;
2727
import io.trino.security.AccessControl;
28+
import io.trino.spi.connector.SaveMode;
2829
import io.trino.spi.security.Identity;
2930
import io.trino.sql.PlannerContext;
3031
import io.trino.sql.analyzer.Analysis;
@@ -99,9 +100,12 @@ public ListenableFuture<Void> execute(
99100
throw semanticException(TABLE_ALREADY_EXISTS, statement, "Materialized view already exists: '%s'", name);
100101
}
101102
if (metadata.isView(session, name)) {
102-
if (!statement.isReplace()) {
103+
if (!statement.isReplace() && !statement.isNotExists()) {
103104
throw semanticException(TABLE_ALREADY_EXISTS, statement, "View already exists: '%s'", name);
104105
}
106+
if (statement.isNotExists()) {
107+
return immediateVoidFuture();
108+
}
105109
}
106110
else if (metadata.getTableHandle(session, name).isPresent()) {
107111
throw semanticException(TABLE_ALREADY_EXISTS, statement, "Table already exists: '%s'", name);
@@ -148,11 +152,20 @@ else if (metadata.getTableHandle(session, name).isPresent()) {
148152
.filter(element -> !element.getCatalogName().equals(GlobalSystemConnector.NAME))
149153
.collect(toImmutableList()));
150154

151-
metadata.createView(session, name, definition, properties, statement.isReplace());
155+
metadata.createView(session, name, definition, properties, toConnectorSaveMode(statement.getSaveMode()));
152156

153157
stateMachine.setOutput(analysis.getTarget());
154158
stateMachine.setReferencedTables(analysis.getReferencedTables());
155159

156160
return immediateVoidFuture();
157161
}
162+
163+
private static SaveMode toConnectorSaveMode(io.trino.sql.tree.SaveMode saveMode)
164+
{
165+
return switch (saveMode) {
166+
case FAIL -> SaveMode.FAIL;
167+
case IGNORE -> SaveMode.IGNORE;
168+
case REPLACE -> SaveMode.REPLACE;
169+
};
170+
}
158171
}

core/trino-main/src/main/java/io/trino/metadata/Metadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ Optional<ConnectorOutputMetadata> finishRefreshMaterializedView(
548548
/**
549549
* Creates the specified view with the specified view definition.
550550
*/
551-
void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, boolean replace);
551+
void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, SaveMode saveMode);
552552

553553
/**
554554
* Rename the specified view.

core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,13 +1670,13 @@ private Optional<ConnectorViewDefinition> getViewInternal(Session session, Quali
16701670
}
16711671

16721672
@Override
1673-
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
1673+
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
16741674
{
16751675
CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, viewName.catalogName());
16761676
CatalogHandle catalogHandle = catalogMetadata.getCatalogHandle();
16771677
ConnectorMetadata metadata = catalogMetadata.getMetadata(session);
16781678

1679-
metadata.createView(session.toConnectorSession(catalogHandle), viewName.asSchemaTableName(), definition.toConnectorViewDefinition(), viewProperties, replace);
1679+
metadata.createView(session.toConnectorSession(catalogHandle), viewName.asSchemaTableName(), definition.toConnectorViewDefinition(), viewProperties, saveMode);
16801680
if (catalogMetadata.getSecurityManagement() == SYSTEM) {
16811681
systemSecurityMetadata.tableCreated(session, viewName.asCatalogSchemaTableName());
16821682
}

core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,9 @@ protected Scope visitCreateView(CreateView node, Optional<Scope> scope)
10641064
{
10651065
QualifiedObjectName viewName = createQualifiedObjectName(session, node, node.getName());
10661066

1067+
if (node.isReplace() && node.isNotExists()) {
1068+
throw semanticException(NOT_SUPPORTED, node, "'CREATE OR REPLACE' and 'IF NOT EXISTS' clauses can not be used together");
1069+
}
10671070
node.getQuery().getFunctions().stream().findFirst().ifPresent(function -> {
10681071
throw semanticException(NOT_SUPPORTED, function, "Views cannot contain inline functions");
10691072
});

core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import io.trino.sql.tree.QuerySpecification;
8484
import io.trino.sql.tree.Relation;
8585
import io.trino.sql.tree.Row;
86+
import io.trino.sql.tree.SaveMode;
8687
import io.trino.sql.tree.SelectItem;
8788
import io.trino.sql.tree.ShowBranches;
8889
import io.trino.sql.tree.ShowCatalogs;
@@ -614,7 +615,7 @@ private Query showCreateView(ShowCreate node)
614615
node.getLocation().orElseThrow(),
615616
QualifiedName.of(ImmutableList.of(catalogName, schemaName, tableName)),
616617
query,
617-
false,
618+
SaveMode.FAIL,
618619
viewDefinition.get().getComment(),
619620
Optional.of(security),
620621
propertyNodes))

core/trino-main/src/main/java/io/trino/testing/TestingMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,10 @@ public void dropTable(ConnectorSession session, ConnectorTableHandle tableHandle
205205
}
206206

207207
@Override
208-
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
208+
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
209209
{
210210
checkArgument(viewProperties.isEmpty(), "This connector does not support creating views with properties");
211-
if (replace) {
211+
if (saveMode == saveMode.REPLACE) {
212212
views.put(viewName, definition);
213213
}
214214
else if (views.putIfAbsent(viewName, definition) != null) {

core/trino-main/src/main/java/io/trino/tracing/TracingConnectorMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,11 +802,11 @@ public void finishMerge(ConnectorSession session, ConnectorMergeTableHandle tabl
802802
}
803803

804804
@Override
805-
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
805+
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
806806
{
807807
Span span = startSpan("createView", viewName);
808808
try (var _ = scopedSpan(span)) {
809-
delegate.createView(session, viewName, definition, viewProperties, replace);
809+
delegate.createView(session, viewName, definition, viewProperties, saveMode);
810810
}
811811
}
812812

core/trino-main/src/main/java/io/trino/tracing/TracingMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -992,11 +992,11 @@ public Optional<TrinoPrincipal> getSchemaOwner(Session session, CatalogSchemaNam
992992
}
993993

994994
@Override
995-
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, boolean replace)
995+
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, SaveMode saveMode)
996996
{
997997
Span span = startSpan("createView", viewName);
998998
try (var _ = scopedSpan(span)) {
999-
delegate.createView(session, viewName, definition, properties, replace);
999+
delegate.createView(session, viewName, definition, properties, saveMode);
10001000
}
10011001
}
10021002

core/trino-main/src/test/java/io/trino/connector/MockConnector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ public void renameField(ConnectorSession session, ConnectorTableHandle tableHand
711711
public void dropColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle column) {}
712712

713713
@Override
714-
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace) {}
714+
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode) {}
715715

716716
@Override
717717
public void renameView(ConnectorSession session, SchemaTableName source, SchemaTableName target) {}

0 commit comments

Comments
 (0)