Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ statement
(WHEN STALE (INLINE | FAIL))?
(COMMENT string)?
(WITH properties)? AS rootQuery #createMaterializedView
| CREATE (OR REPLACE)? VIEW qualifiedName
| CREATE (OR REPLACE)? VIEW
(IF NOT EXISTS)? qualifiedName
(COMMENT string)?
(SECURITY (DEFINER | INVOKER))?
(WITH properties)? AS rootQuery #createView
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import io.trino.metadata.ViewDefinition;
import io.trino.metadata.ViewPropertyManager;
import io.trino.security.AccessControl;
import io.trino.spi.connector.SaveMode;
import io.trino.spi.security.Identity;
import io.trino.sql.PlannerContext;
import io.trino.sql.analyzer.Analysis;
Expand Down Expand Up @@ -99,9 +100,12 @@ public ListenableFuture<Void> execute(
throw semanticException(TABLE_ALREADY_EXISTS, statement, "Materialized view already exists: '%s'", name);
}
if (metadata.isView(session, name)) {
if (!statement.isReplace()) {
if (!statement.isReplace() && !statement.isNotExists()) {
throw semanticException(TABLE_ALREADY_EXISTS, statement, "View already exists: '%s'", name);
}
if (statement.isNotExists()) {
return immediateVoidFuture();
}
}
else if (metadata.getTableHandle(session, name).isPresent()) {
throw semanticException(TABLE_ALREADY_EXISTS, statement, "Table already exists: '%s'", name);
Expand Down Expand Up @@ -148,11 +152,20 @@ else if (metadata.getTableHandle(session, name).isPresent()) {
.filter(element -> !element.getCatalogName().equals(GlobalSystemConnector.NAME))
.collect(toImmutableList()));

metadata.createView(session, name, definition, properties, statement.isReplace());
metadata.createView(session, name, definition, properties, toConnectorSaveMode(statement.getSaveMode()));

stateMachine.setOutput(analysis.getTarget());
stateMachine.setReferencedTables(analysis.getReferencedTables());

return immediateVoidFuture();
}

private static SaveMode toConnectorSaveMode(io.trino.sql.tree.SaveMode saveMode)
{
return switch (saveMode) {
case FAIL -> SaveMode.FAIL;
case IGNORE -> SaveMode.IGNORE;
case REPLACE -> SaveMode.REPLACE;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,7 @@ Optional<ConnectorOutputMetadata> finishRefreshMaterializedView(
/**
* Creates the specified view with the specified view definition.
*/
void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, boolean replace);
void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, SaveMode saveMode);

/**
* Rename the specified view.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1670,13 +1670,13 @@ private Optional<ConnectorViewDefinition> getViewInternal(Session session, Quali
}

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

metadata.createView(session.toConnectorSession(catalogHandle), viewName.asSchemaTableName(), definition.toConnectorViewDefinition(), viewProperties, replace);
metadata.createView(session.toConnectorSession(catalogHandle), viewName.asSchemaTableName(), definition.toConnectorViewDefinition(), viewProperties, saveMode);
if (catalogMetadata.getSecurityManagement() == SYSTEM) {
systemSecurityMetadata.tableCreated(session, viewName.asCatalogSchemaTableName());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,9 @@ protected Scope visitCreateView(CreateView node, Optional<Scope> scope)
{
QualifiedObjectName viewName = createQualifiedObjectName(session, node, node.getName());

if (node.isReplace() && node.isNotExists()) {
throw semanticException(NOT_SUPPORTED, node, "'CREATE OR REPLACE' and 'IF NOT EXISTS' clauses can not be used together");
}
node.getQuery().getFunctions().stream().findFirst().ifPresent(function -> {
throw semanticException(NOT_SUPPORTED, function, "Views cannot contain inline functions");
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
import io.trino.sql.tree.QuerySpecification;
import io.trino.sql.tree.Relation;
import io.trino.sql.tree.Row;
import io.trino.sql.tree.SaveMode;
import io.trino.sql.tree.SelectItem;
import io.trino.sql.tree.ShowBranches;
import io.trino.sql.tree.ShowCatalogs;
Expand Down Expand Up @@ -614,7 +615,7 @@ private Query showCreateView(ShowCreate node)
node.getLocation().orElseThrow(),
QualifiedName.of(ImmutableList.of(catalogName, schemaName, tableName)),
query,
false,
SaveMode.FAIL,
viewDefinition.get().getComment(),
Optional.of(security),
propertyNodes))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,17 @@ public void dropTable(ConnectorSession session, ConnectorTableHandle tableHandle
}

@Override
@Deprecated
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
{
createView(session, viewName, definition, viewProperties, replace ? SaveMode.REPLACE : SaveMode.FAIL);
}

@Override
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
{
checkArgument(viewProperties.isEmpty(), "This connector does not support creating views with properties");
if (replace) {
if (saveMode == REPLACE) {
views.put(viewName, definition);
}
else if (views.putIfAbsent(viewName, definition) != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,7 @@ public void finishMerge(ConnectorSession session, ConnectorMergeTableHandle tabl
}

@Override
@Deprecated
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
{
Span span = startSpan("createView", viewName);
Expand All @@ -810,6 +811,15 @@ public void createView(ConnectorSession session, SchemaTableName viewName, Conne
}
}

@Override
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
{
Span span = startSpan("createView", viewName);
try (var _ = scopedSpan(span)) {
delegate.createView(session, viewName, definition, viewProperties, saveMode);
}
}

@Override
public void renameView(ConnectorSession session, SchemaTableName source, SchemaTableName target)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -992,11 +992,11 @@ public Optional<TrinoPrincipal> getSchemaOwner(Session session, CatalogSchemaNam
}

@Override
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, boolean replace)
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> properties, SaveMode saveMode)
{
Span span = startSpan("createView", viewName);
try (var _ = scopedSpan(span)) {
delegate.createView(session, viewName, definition, properties, replace);
delegate.createView(session, viewName, definition, properties, saveMode);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -711,8 +711,12 @@ public void renameField(ConnectorSession session, ConnectorTableHandle tableHand
public void dropColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle column) {}

@Override
@Deprecated
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, boolean replace) {}

@Override
public void createView(ConnectorSession session, SchemaTableName viewName, ConnectorViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode) {}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -622,9 +622,9 @@ public boolean isView(Session session, QualifiedObjectName viewName)
}

@Override
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> viewProperties, boolean replace)
public void createView(Session session, QualifiedObjectName viewName, ViewDefinition definition, Map<String, Object> viewProperties, SaveMode saveMode)
{
checkArgument(replace || !views.containsKey(viewName.asSchemaTableName()));
checkArgument(saveMode == REPLACE || !views.containsKey(viewName.asSchemaTableName()));
views.put(viewName.asSchemaTableName(), definition);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ public void testAddColumnAlreadyExist()
public void testAddColumnOnView()
{
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), FAIL);

assertTrinoExceptionThrownBy(() -> getFutureValue(executeAddColumn(asQualifiedName(viewName), QualifiedName.of("test"), INTEGER, Optional.empty(), new ColumnPosition.Last(), false, false)))
.hasErrorCode(TABLE_NOT_FOUND)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public void testCommentTable()
public void testCommentTableOnView()
{
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), FAIL);

assertTrinoExceptionThrownBy(() -> getFutureValue(setComment(TABLE, asQualifiedName(viewName), Optional.of("new comment"))))
.hasErrorCode(TABLE_NOT_FOUND)
Expand All @@ -84,7 +84,7 @@ public void testCommentTableOnMaterializedView()
public void testCommentView()
{
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), FAIL);
assertThat(metadata.isView(testSession, viewName)).isTrue();

getFutureValue(setComment(VIEW, asQualifiedName(viewName), Optional.of("new comment")));
Expand Down Expand Up @@ -133,7 +133,7 @@ public void testCommentViewColumn()
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
QualifiedName columnName = qualifiedColumnName("existing_view", "test");
QualifiedName missingColumnName = qualifiedColumnName("existing_view", "missing");
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), FAIL);
assertThat(metadata.isView(testSession, viewName)).isTrue();

getFutureValue(setComment(COLUMN, columnName, Optional.of("new test column comment")));
Expand All @@ -149,7 +149,7 @@ public void testCommentViewColumn()
public void testCommentOnMixedCaseViewColumn()
{
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
metadata.createView(testSession, viewName, viewDefinition("SELECT 1", ImmutableList.of(new ViewColumn("Mixed", BIGINT.getTypeId(), Optional.empty()))), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, viewDefinition("SELECT 1", ImmutableList.of(new ViewColumn("Mixed", BIGINT.getTypeId(), Optional.empty()))), ImmutableMap.of(), FAIL);
assertThat(metadata.isView(testSession, viewName)).isTrue();

QualifiedName columnNameLowerCase = qualifiedColumnName("existing_view", "mixed");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ void testCreateBranchOnNotExistingTable()
void testCreateBranchOnView()
{
QualifiedObjectName viewName = qualifiedObjectName("existing_view");
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), false);
metadata.createView(testSession, viewName, someView(), ImmutableMap.of(), FAIL);

assertTrinoExceptionThrownBy(() -> getFutureValue(executeCreateBranch(asQualifiedName(viewName), SaveMode.FAIL, "main", Optional.empty(), List.of())))
.hasErrorCode(NOT_SUPPORTED)
Expand Down
Loading