From 9f2cd345789314aab70e580815c55ae17c23368c Mon Sep 17 00:00:00 2001 From: liul Date: Sat, 22 Jan 2022 14:34:16 +0800 Subject: [PATCH] add "STORAGE TABLE" and "MATERIALIZED VIEW" type in information_schema.tables "show tables" command filter out storage table --- .../InformationSchemaPageSource.java | 16 +++++++++++++++- .../java/io/trino/metadata/MetadataListing.java | 12 ++++++++++++ .../io/trino/sql/rewrite/ShowQueriesRewrite.java | 6 +++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaPageSource.java b/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaPageSource.java index 02c611526e1f..b0e44376b55d 100644 --- a/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaPageSource.java +++ b/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaPageSource.java @@ -54,7 +54,9 @@ import static io.trino.connector.informationschema.InformationSchemaMetadata.defaultPrefixes; import static io.trino.connector.informationschema.InformationSchemaMetadata.isTablesEnumeratingTable; import static io.trino.metadata.MetadataListing.getViews; +import static io.trino.metadata.MetadataListing.listMaterializedViews; import static io.trino.metadata.MetadataListing.listSchemas; +import static io.trino.metadata.MetadataListing.listStorageTab; import static io.trino.metadata.MetadataListing.listTableColumns; import static io.trino.metadata.MetadataListing.listTablePrivileges; import static io.trino.metadata.MetadataListing.listTables; @@ -280,11 +282,23 @@ private void addTablesRecords(QualifiedTablePrefix prefix) { Set tables = listTables(session, metadata, accessControl, prefix); Set views = listViews(session, metadata, accessControl, prefix); + Set mviews = listMaterializedViews(session, metadata, accessControl, prefix); + Set storageTables = listStorageTab(session, metadata, accessControl, prefix); // TODO (https://github.com/trinodb/trino/issues/8207) define a type for materialized views for (SchemaTableName name : union(tables, views)) { // if table and view names overlap, the view wins - String type = views.contains(name) ? "VIEW" : "BASE TABLE"; + String type = "BASE TABLE"; + if (views.contains(name)) { + type = "VIEW"; + } + else if (mviews.contains(name)) { + type = "MATERIALIZE VIEW"; + } + else if (storageTables.contains(name)) { + type = "STORAGE TABLE"; + } + addRecord( prefix.getCatalogName(), name.getSchemaName(), diff --git a/core/trino-main/src/main/java/io/trino/metadata/MetadataListing.java b/core/trino-main/src/main/java/io/trino/metadata/MetadataListing.java index 80fc78d6f0d5..14e5c8b382aa 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/MetadataListing.java +++ b/core/trino-main/src/main/java/io/trino/metadata/MetadataListing.java @@ -21,6 +21,7 @@ import io.trino.connector.CatalogName; import io.trino.security.AccessControl; import io.trino.spi.TrinoException; +import io.trino.spi.connector.CatalogSchemaTableName; import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.SchemaTableName; import io.trino.spi.connector.TableColumnsMetadata; @@ -160,6 +161,17 @@ public static Map getMaterializedViews(Session sessio .collect(toImmutableMap(Entry::getKey, Entry::getValue)); } + public static Set listStorageTab(Session session, Metadata metadata, AccessControl accessControl, QualifiedTablePrefix prefix) + { + Set storageTables = metadata.getMaterializedViews(session, prefix).values().stream() + .map(ViewInfo::getStorageTable) + .map(Optional::get) + .map(CatalogSchemaTableName::getSchemaTableName) + .collect(toImmutableSet()); + + return accessControl.filterTables(session.toSecurityContext(), prefix.getCatalogName(), storageTables); + } + public static Set listTablePrivileges(Session session, Metadata metadata, AccessControl accessControl, QualifiedTablePrefix prefix) { List grants = metadata.listTablePrivileges(session, prefix); diff --git a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java index a6cdfe2db3d4..c1f9d3f51307 100644 --- a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java +++ b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java @@ -54,6 +54,7 @@ import io.trino.sql.tree.AstVisitor; import io.trino.sql.tree.BooleanLiteral; import io.trino.sql.tree.ColumnDefinition; +import io.trino.sql.tree.ComparisonExpression; import io.trino.sql.tree.CreateMaterializedView; import io.trino.sql.tree.CreateSchema; import io.trino.sql.tree.CreateTable; @@ -143,6 +144,7 @@ import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; import static io.trino.sql.tree.BooleanLiteral.FALSE_LITERAL; import static io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL; +import static io.trino.sql.tree.ComparisonExpression.Operator.NOT_EQUAL; import static io.trino.sql.tree.CreateView.Security.DEFINER; import static io.trino.sql.tree.CreateView.Security.INVOKER; import static io.trino.sql.tree.LogicalExpression.and; @@ -275,7 +277,9 @@ protected Node visitShowTables(ShowTables showTables, Void context) } Expression predicate = equal(identifier("table_schema"), new StringLiteral(schema.getSchemaName())); - + Expression predicateNot = new ComparisonExpression(NOT_EQUAL, + identifier("table_type"), new StringLiteral("STORAGE TABLE")); + predicate = logicalAnd(predicate, predicateNot); Optional likePattern = showTables.getLikePattern(); if (likePattern.isPresent()) { Expression likePredicate = new LikePredicate(