Skip to content

Commit 3e0e05a

Browse files
committed
redirect mv
1 parent c989681 commit 3e0e05a

25 files changed

+156
-55
lines changed

Diff for: core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java

+1
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ Analysis executeInternal(
157157
});
158158

159159
MaterializedViewDefinition definition = new MaterializedViewDefinition(
160+
name,
160161
sql,
161162
session.getCatalog(),
162163
session.getSchema(),

Diff for: core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java

+19-14
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ public List<TableColumnsMetadata> listTableColumns(Session session, QualifiedTab
664664

665665
try {
666666
return Optional.<RelationColumnsMetadata>empty()
667-
.or(() -> getMaterializedViewInternal(session, objectName)
667+
.or(() -> getMaterializedViewInternal(session, getRedirectedTableName(session, objectName, Optional.empty(), Optional.empty()))
668668
.map(materializedView -> RelationColumnsMetadata.forMaterializedView(schemaTableName, materializedView.getColumns())))
669669
.or(() -> getViewInternal(session, objectName)
670670
.map(view -> RelationColumnsMetadata.forView(schemaTableName, view.getColumns())))
@@ -1690,13 +1690,14 @@ public void createMaterializedView(
16901690
@Override
16911691
public void dropMaterializedView(Session session, QualifiedObjectName viewName)
16921692
{
1693-
CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, viewName.catalogName());
1693+
QualifiedObjectName targetViewName = getRedirectedTableName(session, viewName, Optional.empty(), Optional.empty());
1694+
CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, targetViewName.catalogName());
16941695
CatalogHandle catalogHandle = catalogMetadata.getCatalogHandle();
16951696
ConnectorMetadata metadata = catalogMetadata.getMetadata(session);
16961697

1697-
metadata.dropMaterializedView(session.toConnectorSession(catalogHandle), viewName.asSchemaTableName());
1698+
metadata.dropMaterializedView(session.toConnectorSession(catalogHandle), targetViewName.asSchemaTableName());
16981699
if (catalogMetadata.getSecurityManagement() == SYSTEM) {
1699-
systemSecurityMetadata.tableDropped(session, viewName.asCatalogSchemaTableName());
1700+
systemSecurityMetadata.tableDropped(session, targetViewName.asCatalogSchemaTableName());
17001701
}
17011702
}
17021703

@@ -1778,31 +1779,34 @@ public Map<QualifiedObjectName, ViewInfo> getMaterializedViews(Session session,
17781779
@Override
17791780
public boolean isMaterializedView(Session session, QualifiedObjectName viewName)
17801781
{
1781-
return getMaterializedViewInternal(session, viewName).isPresent();
1782+
QualifiedObjectName targetViewName = getRedirectedTableName(session, viewName, Optional.empty(), Optional.empty());
1783+
return getMaterializedViewInternal(session, targetViewName).isPresent();
17821784
}
17831785

17841786
@Override
17851787
public Optional<MaterializedViewDefinition> getMaterializedView(Session session, QualifiedObjectName viewName)
17861788
{
1787-
Optional<ConnectorMaterializedViewDefinition> connectorView = getMaterializedViewInternal(session, viewName);
1789+
QualifiedObjectName targetViewName = getRedirectedTableName(session, viewName, Optional.empty(), Optional.empty());
1790+
Optional<ConnectorMaterializedViewDefinition> connectorView = getMaterializedViewInternal(session, targetViewName);
17881791
if (connectorView.isEmpty()) {
17891792
return Optional.empty();
17901793
}
17911794

1792-
if (isCatalogManagedSecurity(session, viewName.catalogName())) {
1795+
if (isCatalogManagedSecurity(session, targetViewName.catalogName())) {
17931796
String runAsUser = connectorView.get().getOwner().orElseThrow(() -> new TrinoException(INVALID_VIEW, "Owner not set for a run-as invoker view: " + viewName));
1794-
return Optional.of(createMaterializedViewDefinition(connectorView.get(), Identity.ofUser(runAsUser)));
1797+
return Optional.of(createMaterializedViewDefinition(targetViewName, connectorView.get(), Identity.ofUser(runAsUser)));
17951798
}
17961799

1797-
Identity runAsIdentity = systemSecurityMetadata.getViewRunAsIdentity(session, viewName.asCatalogSchemaTableName())
1800+
Identity runAsIdentity = systemSecurityMetadata.getViewRunAsIdentity(session, targetViewName.asCatalogSchemaTableName())
17981801
.or(() -> connectorView.get().getOwner().map(Identity::ofUser))
17991802
.orElseThrow(() -> new TrinoException(NOT_SUPPORTED, "Materialized view does not have an owner: " + viewName));
1800-
return Optional.of(createMaterializedViewDefinition(connectorView.get(), runAsIdentity));
1803+
return Optional.of(createMaterializedViewDefinition(targetViewName, connectorView.get(), runAsIdentity));
18011804
}
18021805

1803-
private static MaterializedViewDefinition createMaterializedViewDefinition(ConnectorMaterializedViewDefinition view, Identity runAsIdentity)
1806+
private static MaterializedViewDefinition createMaterializedViewDefinition(QualifiedObjectName name, ConnectorMaterializedViewDefinition view, Identity runAsIdentity)
18041807
{
18051808
return new MaterializedViewDefinition(
1809+
name,
18061810
view.getOriginalSql(),
18071811
view.getCatalog(),
18081812
view.getSchema(),
@@ -1855,14 +1859,15 @@ public Map<String, Object> getMaterializedViewProperties(Session session, Qualif
18551859
@Override
18561860
public MaterializedViewFreshness getMaterializedViewFreshness(Session session, QualifiedObjectName viewName)
18571861
{
1858-
Optional<CatalogMetadata> catalog = getOptionalCatalogMetadata(session, viewName.catalogName());
1862+
QualifiedObjectName targetViewName = getRedirectedTableName(session, viewName, Optional.empty(), Optional.empty());
1863+
Optional<CatalogMetadata> catalog = getOptionalCatalogMetadata(session, targetViewName.catalogName());
18591864
if (catalog.isPresent()) {
18601865
CatalogMetadata catalogMetadata = catalog.get();
1861-
CatalogHandle catalogHandle = catalogMetadata.getCatalogHandle(session, viewName, Optional.empty(), Optional.empty());
1866+
CatalogHandle catalogHandle = catalogMetadata.getCatalogHandle(session, targetViewName, Optional.empty(), Optional.empty());
18621867
ConnectorMetadata metadata = catalogMetadata.getMetadataFor(session, catalogHandle);
18631868

18641869
ConnectorSession connectorSession = session.toConnectorSession(catalogHandle);
1865-
return metadata.getMaterializedViewFreshness(connectorSession, viewName.asSchemaTableName());
1870+
return metadata.getMaterializedViewFreshness(connectorSession, targetViewName.asSchemaTableName());
18661871
}
18671872
return new MaterializedViewFreshness(STALE, Optional.empty());
18681873
}

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -2581,9 +2581,13 @@ private Scope createScopeForView(
25812581
private List<Field> analyzeStorageTable(Table table, List<Field> viewFields, TableHandle storageTable)
25822582
{
25832583
TableSchema tableSchema = metadata.getTableSchema(session, storageTable);
2584+
CatalogSchemaTableName storageTableName = metadata.getTableName(session, storageTable);
25842585
Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, storageTable);
25852586
QualifiedObjectName tableName = createQualifiedObjectName(session, table, table.getName());
2586-
checkStorageTableNotRedirected(tableName);
2587+
checkStorageTableNotRedirected(new QualifiedObjectName(
2588+
storageTableName.getCatalogName(),
2589+
storageTableName.getSchemaTableName().getSchemaName(),
2590+
storageTableName.getSchemaTableName().getTableName()));
25872591
List<Field> tableFields = analyzeTableOutputFields(table, tableName, tableSchema, columnHandles)
25882592
.stream()
25892593
.filter(field -> !field.isHidden())

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

+19-5
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
import java.util.Set;
107107

108108
import static com.google.common.base.Strings.nullToEmpty;
109+
import static com.google.common.base.Verify.verify;
109110
import static com.google.common.collect.ImmutableList.toImmutableList;
110111
import static io.trino.connector.informationschema.InformationSchemaTable.COLUMNS;
111112
import static io.trino.connector.informationschema.InformationSchemaTable.SCHEMATA;
@@ -467,6 +468,14 @@ protected Node visitShowColumns(ShowColumns showColumns, Void context)
467468
targetTableName = redirection.redirectedTableName().orElse(tableName);
468469
}
469470
}
471+
else {
472+
Optional<MaterializedViewDefinition> viewDefinition = metadata.getMaterializedView(session, tableName);
473+
if (viewDefinition.isEmpty()) {
474+
throw semanticException(TABLE_NOT_FOUND, showColumns, "Table '%s' does not exist", tableName);
475+
}
476+
477+
targetTableName = viewDefinition.get().getViewName();
478+
}
470479

471480
if (!isMaterializedView && !isView) {
472481
// We are using information_schema which may ignore errors when getting the list
@@ -543,18 +552,23 @@ private Query showCreateMaterializedView(ShowCreate node)
543552
List<Identifier> parts = node.getName().getOriginalParts().reversed();
544553
Identifier tableName = parts.get(0);
545554
Identifier schemaName = (parts.size() > 1) ? parts.get(1) : new Identifier(objectName.schemaName());
546-
Identifier catalogName = (parts.size() > 2) ? parts.get(2) : new Identifier(objectName.catalogName());
547555

548-
accessControl.checkCanShowCreateTable(session.toSecurityContext(), new QualifiedObjectName(catalogName.getValue(), schemaName.getValue(), tableName.getValue()));
556+
QualifiedObjectName viewName = viewDefinition.get().getViewName();
557+
558+
verify(schemaName.getValue().equals(viewName.schemaName()));
559+
verify(tableName.getValue().equals(viewName.objectName()));
560+
561+
accessControl.checkCanShowCreateTable(session.toSecurityContext(), viewName);
562+
563+
Map<String, Object> properties = metadata.getMaterializedViewProperties(session, viewName, viewDefinition.get());
564+
CatalogHandle catalogHandle = getRequiredCatalogHandle(metadata, session, node, viewName.catalogName());
549565

550-
Map<String, Object> properties = metadata.getMaterializedViewProperties(session, objectName, viewDefinition.get());
551-
CatalogHandle catalogHandle = getRequiredCatalogHandle(metadata, session, node, catalogName.getValue());
552566
Collection<PropertyMetadata<?>> allMaterializedViewProperties = materializedViewPropertyManager.getAllProperties(catalogHandle);
553567
List<Property> propertyNodes = toSqlProperties("materialized view " + objectName, INVALID_MATERIALIZED_VIEW_PROPERTY, properties, allMaterializedViewProperties);
554568

555569
String sql = formatSql(new CreateMaterializedView(
556570
node.getLocation().orElseThrow(),
557-
QualifiedName.of(ImmutableList.of(catalogName, schemaName, tableName)),
571+
QualifiedName.of(ImmutableList.of(new Identifier(viewName.catalogName()), schemaName, tableName)),
558572
query,
559573
false,
560574
false,

Diff for: core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,15 @@ protected static QualifiedName asQualifiedName(QualifiedObjectName qualifiedObje
185185
return QualifiedName.of(qualifiedObjectName.catalogName(), qualifiedObjectName.schemaName(), qualifiedObjectName.objectName());
186186
}
187187

188-
protected MaterializedViewDefinition someMaterializedView()
188+
protected MaterializedViewDefinition someMaterializedView(QualifiedObjectName viewName)
189189
{
190-
return someMaterializedView("select * from some_table", ImmutableList.of(new ViewColumn("test", BIGINT.getTypeId(), Optional.empty())));
190+
return someMaterializedView(viewName, "select * from some_table", ImmutableList.of(new ViewColumn("test", BIGINT.getTypeId(), Optional.empty())));
191191
}
192192

193-
protected MaterializedViewDefinition someMaterializedView(String sql, List<ViewColumn> columns)
193+
protected MaterializedViewDefinition someMaterializedView(QualifiedObjectName viewName, String sql, List<ViewColumn> columns)
194194
{
195195
return new MaterializedViewDefinition(
196+
viewName,
196197
sql,
197198
Optional.empty(),
198199
Optional.empty(),
@@ -536,10 +537,10 @@ public synchronized void setMaterializedViewProperties(
536537
@Override
537538
public void setMaterializedViewColumnComment(Session session, QualifiedObjectName viewName, String columnName, Optional<String> comment)
538539
{
539-
MaterializedViewDefinition view = materializedViews.get(viewName.asSchemaTableName());
540-
materializedViews.put(
540+
materializedViews.compute(
541541
viewName.asSchemaTableName(),
542-
new MaterializedViewDefinition(
542+
(_, view) -> new MaterializedViewDefinition(
543+
viewName,
543544
view.getOriginalSql(),
544545
view.getCatalog(),
545546
view.getSchema(),

Diff for: core/trino-main/src/test/java/io/trino/execution/TestAddColumnTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public void testAddColumnOnView()
198198
public void testAddColumnOnMaterializedView()
199199
{
200200
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
201-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
201+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
202202

203203
assertTrinoExceptionThrownBy(() -> getFutureValue(executeAddColumn(asQualifiedName(materializedViewName), QualifiedName.of("test"), INTEGER, Optional.empty(), new ColumnPosition.Last(), false, false)))
204204
.hasErrorCode(TABLE_NOT_FOUND)

Diff for: core/trino-main/src/test/java/io/trino/execution/TestCommentTask.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void testCommentTableOnView()
7171
public void testCommentTableOnMaterializedView()
7272
{
7373
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
74-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
74+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
7575

7676
assertTrinoExceptionThrownBy(() -> getFutureValue(setComment(TABLE, asQualifiedName(materializedViewName), Optional.of("new comment"))))
7777
.hasErrorCode(TABLE_NOT_FOUND)
@@ -104,7 +104,7 @@ public void testCommentViewOnTable()
104104
public void testCommentViewOnMaterializedView()
105105
{
106106
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
107-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
107+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
108108

109109
assertTrinoExceptionThrownBy(() -> getFutureValue(setComment(VIEW, asQualifiedName(materializedViewName), Optional.of("new comment"))))
110110
.hasErrorCode(TABLE_NOT_FOUND)
@@ -147,7 +147,7 @@ public void testCommentViewColumn()
147147
public void testCommentMaterializedViewColumn()
148148
{
149149
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
150-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
150+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
151151
assertThat(metadata.isMaterializedView(testSession, materializedViewName)).isTrue();
152152

153153
QualifiedName columnName = qualifiedColumnName("existing_materialized_view", "test");

Diff for: core/trino-main/src/test/java/io/trino/execution/TestCreateViewTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public void testReplaceViewOnTableIfExists()
136136
public void testCreateViewOnMaterializedView()
137137
{
138138
QualifiedObjectName viewName = qualifiedObjectName("existing_materialized_view");
139-
metadata.createMaterializedView(testSession, viewName, someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
139+
metadata.createMaterializedView(testSession, viewName, someMaterializedView(viewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
140140

141141
assertTrinoExceptionThrownBy(() -> getFutureValue(executeCreateView(asQualifiedName(viewName), false)))
142142
.hasErrorCode(TABLE_ALREADY_EXISTS)

Diff for: core/trino-main/src/test/java/io/trino/execution/TestDropColumnTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public void testDropColumnOnView()
158158
public void testDropColumnOnMaterializedView()
159159
{
160160
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
161-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
161+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
162162

163163
assertTrinoExceptionThrownBy(() -> getFutureValue(executeDropColumn(asQualifiedName(materializedViewName), QualifiedName.of("test"), false, false)))
164164
.hasErrorCode(TABLE_NOT_FOUND)

Diff for: core/trino-main/src/test/java/io/trino/execution/TestDropMaterializedViewTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class TestDropMaterializedViewTask
3838
public void testDropExistingMaterializedView()
3939
{
4040
QualifiedObjectName viewName = qualifiedObjectName("existing_materialized_view");
41-
metadata.createMaterializedView(testSession, viewName, someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
41+
metadata.createMaterializedView(testSession, viewName, someMaterializedView(viewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
4242
assertThat(metadata.isMaterializedView(testSession, viewName)).isTrue();
4343

4444
getFutureValue(executeDropMaterializedView(asQualifiedName(viewName), false));

Diff for: core/trino-main/src/test/java/io/trino/execution/TestDropNotNullConstraintConstraintTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public void testDropNotNullConstraintOnView()
133133
public void testDropNotNullConstraintOnMaterializedView()
134134
{
135135
QualifiedObjectName materializedViewName = qualifiedObjectName("existing_materialized_view");
136-
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(), MATERIALIZED_VIEW_PROPERTIES, false, false);
136+
metadata.createMaterializedView(testSession, QualifiedObjectName.valueOf(materializedViewName.toString()), someMaterializedView(materializedViewName), MATERIALIZED_VIEW_PROPERTIES, false, false);
137137

138138
assertTrinoExceptionThrownBy(() -> getFutureValue(executeDropNotNullConstraint(asQualifiedName(materializedViewName), identifier("test"), false)))
139139
.hasErrorCode(TABLE_NOT_FOUND)

0 commit comments

Comments
 (0)