Skip to content

Commit 8d251eb

Browse files
codyzwiefkokosing
authored andcommitted
Add support for ALTER MATERIALIZED VIEW .. SET AUTHORIZATION
This commit adds support for `SET AUTHORIZATION` on a materialized view. Previously, this was only available on views.
1 parent 1b331fb commit 8d251eb

File tree

26 files changed

+237
-24
lines changed

26 files changed

+237
-24
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ grantObject
953953
;
954954

955955
ownedEntityKind
956-
: TABLE | SCHEMA | VIEW | identifier
956+
: TABLE | SCHEMA | VIEW | MATERIALIZED VIEW | identifier
957957
;
958958

959959
qualifiedName

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ private void setEntityAuthorization(Session session, SetAuthorizationStatement s
104104
throw semanticException(TABLE_NOT_FOUND, statement, "View '%s' does not exist", viewName);
105105
}
106106
}
107+
case "MATERIALIZED VIEW" -> {
108+
QualifiedObjectName viewName = new QualifiedObjectName(name.get(0), name.get(1), name.get(2));
109+
getRequiredCatalogHandle(metadata, session, statement, viewName.catalogName());
110+
if (!metadata.isMaterializedView(session, viewName)) {
111+
throw semanticException(TABLE_NOT_FOUND, statement, "Materialized view '%s' does not exist", viewName);
112+
}
113+
}
107114
}
108115

109116
TrinoPrincipal principal = createPrincipal(statement.getPrincipal());

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@
180180
public final class MetadataManager
181181
implements Metadata
182182
{
183-
private static final Set<String> ENTITY_KINDS_WITH_CATALOG = ImmutableSet.of("SCHEMA", "TABLE", "VIEW");
183+
private static final Set<String> ENTITY_KINDS_WITH_CATALOG = ImmutableSet.of("SCHEMA", "TABLE", "VIEW", "MATERIALIZED VIEW");
184184
private static final Logger log = Logger.get(MetadataManager.class);
185185

186186
@VisibleForTesting
@@ -2861,6 +2861,7 @@ public void setEntityAuthorization(Session session, EntityKindAndName entityKind
28612861
switch (ownedKind) {
28622862
case "TABLE" -> metadata.setTableAuthorization(session.toConnectorSession(catalogHandle), new SchemaTableName(name.get(1), name.get(2)), principal);
28632863
case "VIEW" -> metadata.setViewAuthorization(session.toConnectorSession(catalogHandle), new SchemaTableName(name.get(1), name.get(2)), principal);
2864+
case "MATERIALIZED VIEW" -> metadata.setMaterializedViewAuthorization(session.toConnectorSession(catalogHandle), new SchemaTableName(name.get(1), name.get(2)), principal);
28642865
case "SCHEMA" -> metadata.setSchemaAuthorization(session.toConnectorSession(catalogHandle), name.get(1), principal);
28652866
default -> throw new IllegalArgumentException("Unsupported owned kind: " + ownedKind);
28662867
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public static List<String> fillInNameParts(Session session, Node node, String en
133133
throw new TrinoException(GENERIC_USER_ERROR, "Invalid entity %s for entity kind %s".formatted(joinName(name), entityKind));
134134
}
135135
break;
136-
case "TABLE", "VIEW":
136+
case "TABLE", "VIEW", "MATERIALIZED VIEW":
137137
switch (name.size()) {
138138
case 1:
139139
if (session.getCatalog().isPresent() && session.getSchema().isPresent()) {

core/trino-main/src/main/java/io/trino/security/AccessControlManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,6 +1416,9 @@ public void checkCanSetEntityAuthorization(SecurityContext securityContext, Enti
14161416
case "VIEW":
14171417
control.checkCanSetViewAuthorization(context, new SchemaTableName(name.get(1), name.get(2)), principal);
14181418
break;
1419+
case "MATERIALIZED VIEW":
1420+
control.checkCanSetMaterializedViewAuthorization(context, new SchemaTableName(name.get(1), name.get(2)), principal);
1421+
break;
14191422
default:
14201423
denySetEntityAuthorization(new EntityKindAndName(ownedKind, name), principal);
14211424
}

core/trino-main/src/main/java/io/trino/security/InjectedConnectorAccessControl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,13 @@ public void checkCanRenameMaterializedView(ConnectorSecurityContext context, Sch
321321
accessControl.checkCanRenameMaterializedView(securityContext, getQualifiedObjectName(viewName), getQualifiedObjectName(newViewName));
322322
}
323323

324+
@Override
325+
public void checkCanSetMaterializedViewAuthorization(ConnectorSecurityContext context, SchemaTableName viewName, TrinoPrincipal principal)
326+
{
327+
checkArgument(context == null, "context must be null");
328+
accessControl.checkCanSetEntityAuthorization(securityContext, new EntityKindAndName("MATERIALIZED VIEW", getQualifiedObjectNameParts(viewName)), principal);
329+
}
330+
324331
@Override
325332
public void checkCanSetMaterializedViewProperties(ConnectorSecurityContext context, SchemaTableName materializedViewName, Map<String, Optional<Object>> properties)
326333
{

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,15 @@ public void renameMaterializedView(ConnectorSession session, SchemaTableName sou
13321332
}
13331333
}
13341334

1335+
@Override
1336+
public void setMaterializedViewAuthorization(ConnectorSession session, SchemaTableName viewName, TrinoPrincipal principal)
1337+
{
1338+
Span span = startSpan("setMaterializedViewAuthorization", viewName);
1339+
try (var _ = scopedSpan(span)) {
1340+
delegate.setMaterializedViewAuthorization(session, viewName, principal);
1341+
}
1342+
}
1343+
13351344
@Override
13361345
public void setMaterializedViewProperties(ConnectorSession session, SchemaTableName viewName, Map<String, Optional<Object>> properties)
13371346
{

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,9 @@ public void renameView(ConnectorSession session, SchemaTableName source, SchemaT
689689
@Override
690690
public void setViewAuthorization(ConnectorSession session, SchemaTableName viewName, TrinoPrincipal principal) {}
691691

692+
@Override
693+
public void setMaterializedViewAuthorization(ConnectorSession session, SchemaTableName viewName, TrinoPrincipal principal) {}
694+
692695
@Override
693696
public void dropView(ConnectorSession session, SchemaTableName viewName) {}
694697

core/trino-parser/src/main/java/io/trino/sql/parser/AstBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.trino.grammar.sql.SqlBaseParser.CorrespondingContext;
2323
import io.trino.grammar.sql.SqlBaseParser.CreateCatalogContext;
2424
import io.trino.grammar.sql.SqlBaseParser.DropCatalogContext;
25+
import io.trino.grammar.sql.SqlBaseParser.OwnedEntityKindContext;
2526
import io.trino.sql.tree.AddColumn;
2627
import io.trino.sql.tree.AliasedRelation;
2728
import io.trino.sql.tree.AllColumns;
@@ -321,6 +322,7 @@
321322
import java.util.Optional;
322323
import java.util.Set;
323324
import java.util.function.Function;
325+
import java.util.stream.IntStream;
324326
import java.util.stream.Stream;
325327

326328
import static com.google.common.base.Preconditions.checkArgument;
@@ -511,9 +513,13 @@ public Node visitRenameSchema(SqlBaseParser.RenameSchemaContext context)
511513
@Override
512514
public Node visitSetAuthorization(SqlBaseParser.SetAuthorizationContext context)
513515
{
516+
OwnedEntityKindContext ownedEntityKindContext = context.ownedEntityKind();
517+
String ownedEntityKind = IntStream.range(0, ownedEntityKindContext.getChildCount())
518+
.mapToObj(i -> ownedEntityKindContext.getChild(i).getText())
519+
.reduce("", (a, b) -> String.format("%s %s", a, b).trim());
514520
return new SetAuthorizationStatement(
515521
getLocation(context),
516-
context.ownedEntityKind().getText().toUpperCase(ENGLISH),
522+
ownedEntityKind.toUpperCase(ENGLISH),
517523
getQualifiedName(context.qualifiedName()),
518524
getPrincipalSpecification(context.principal()));
519525
}

core/trino-parser/src/test/java/io/trino/sql/parser/TestSqlParser.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3556,6 +3556,29 @@ public void testAlterViewSetAuthorization()
35563556
new PrincipalSpecification(PrincipalSpecification.Type.ROLE, new Identifier(location(1, 47), "qux", false))));
35573557
}
35583558

3559+
@Test
3560+
public void testAlterMaterializedViewSetAuthorization()
3561+
{
3562+
assertThat(statement("ALTER MATERIALIZED VIEW foo.bar.baz SET AUTHORIZATION qux")).isEqualTo(
3563+
new SetAuthorizationStatement(
3564+
location(1, 1),
3565+
"MATERIALIZED VIEW",
3566+
QualifiedName.of(ImmutableList.of(new Identifier(location(1, 25), "foo", false), new Identifier(location(1, 29), "bar", false), new Identifier(location(1, 33), "baz", false))),
3567+
new PrincipalSpecification(PrincipalSpecification.Type.UNSPECIFIED, new Identifier(location(1, 55), "qux", false))));
3568+
assertThat(statement("ALTER MATERIALIZED VIEW foo.bar.baz SET AUTHORIZATION USER qux")).isEqualTo(
3569+
new SetAuthorizationStatement(
3570+
location(1, 1),
3571+
"MATERIALIZED VIEW",
3572+
QualifiedName.of(ImmutableList.of(new Identifier(location(1, 25), "foo", false), new Identifier(location(1, 29), "bar", false), new Identifier(location(1, 33), "baz", false))),
3573+
new PrincipalSpecification(PrincipalSpecification.Type.USER, new Identifier(location(1, 60), "qux", false))));
3574+
assertThat(statement("ALTER MATERIALIZED VIEW foo.bar.baz SET AUTHORIZATION ROLE qux")).isEqualTo(
3575+
new SetAuthorizationStatement(
3576+
location(1, 1),
3577+
"MATERIALIZED VIEW",
3578+
QualifiedName.of(ImmutableList.of(new Identifier(location(1, 25), "foo", false), new Identifier(location(1, 29), "bar", false), new Identifier(location(1, 33), "baz", false))),
3579+
new PrincipalSpecification(PrincipalSpecification.Type.ROLE, new Identifier(location(1, 60), "qux", false))));
3580+
}
3581+
35593582
@Test
35603583
public void testTableExecute()
35613584
{

0 commit comments

Comments
 (0)