From 07ed9f2d65aa18cb83b772fec510b8190a0691a3 Mon Sep 17 00:00:00 2001 From: Marius Grama Date: Thu, 9 Feb 2023 17:35:50 +0100 Subject: [PATCH 1/2] Ignore Hive system schema when listing views/materialized views --- .../iceberg/catalog/glue/TrinoGlueCatalog.java | 18 +++++++++++++++--- .../trino/testing/BaseConnectorSmokeTest.java | 13 +++++++++++++ .../io/trino/testing/BaseConnectorTest.java | 8 ++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java index 734ec767ab57..d7b9904c8d18 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java @@ -195,6 +195,18 @@ public List listNamespaces(ConnectorSession session) } } + private List listNamespaces(ConnectorSession session, Optional namespace) + { + if (namespace.isPresent()) { + if (isHiveSystemSchema(namespace.get())) { + // TODO https://github.com/trinodb/trino/issues/1559 information_schema should be handled by the engine fully + return ImmutableList.of(); + } + return ImmutableList.of(namespace.get()); + } + return listNamespaces(session); + } + @Override public void dropNamespace(ConnectorSession session, String namespace) { @@ -289,7 +301,7 @@ public List listTables(ConnectorSession session, Optional tables = ImmutableList.builder(); try { - List namespaces = namespace.map(List::of).orElseGet(() -> listNamespaces(session)); + List namespaces = listNamespaces(session, namespace); for (String glueNamespace : namespaces) { try { // Add all tables from a namespace together, in case it is removed while fetching paginated results @@ -663,7 +675,7 @@ public List listViews(ConnectorSession session, Optional views = ImmutableList.builder(); try { - List namespaces = namespace.map(List::of).orElseGet(() -> listNamespaces(session)); + List namespaces = listNamespaces(session, namespace); for (String glueNamespace : namespaces) { try { views.addAll(getPaginatedResults( @@ -775,7 +787,7 @@ public List listMaterializedViews(ConnectorSession session, Opt { ImmutableList.Builder materializedViews = ImmutableList.builder(); try { - List namespaces = namespace.map(List::of).orElseGet(() -> listNamespaces(session)); + List namespaces = listNamespaces(session, namespace); for (String glueNamespace : namespaces) { try { materializedViews.addAll(getPaginatedResults( diff --git a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorSmokeTest.java b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorSmokeTest.java index 7a8278d6c002..a30ef33c5e8b 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorSmokeTest.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorSmokeTest.java @@ -437,6 +437,19 @@ public void testRenameTableAcrossSchemas() assertUpdate("DROP SCHEMA " + schemaName); } + /** + * This seemingly duplicate test of {@link BaseConnectorTest#testShowInformationSchemaTables()} + * is used in the context of this class in order to be able to test + * against a wider range of connector configurations. + */ + @Test + public void testShowInformationSchemaTables() + { + assertThat(query("SHOW TABLES FROM information_schema")) + .skippingTypesCheck() + .containsAll("VALUES 'applicable_roles', 'columns', 'enabled_roles', 'roles', 'schemata', 'table_privileges', 'tables', 'views'"); + } + @Test public void testSelectInformationSchemaTables() { diff --git a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java index 15bf008cd24c..26e215fc9686 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java @@ -775,6 +775,14 @@ public void testDescribeTable() assertEquals(actualColumns, expectedColumns); } + @Test + public void testShowInformationSchemaTables() + { + assertThat(query("SHOW TABLES FROM information_schema")) + .skippingTypesCheck() + .containsAll("VALUES 'applicable_roles', 'columns', 'enabled_roles', 'roles', 'schemata', 'table_privileges', 'tables', 'views'"); + } + @Test public void testView() { From 3af71387dd3c0699ed56490e6a4529a1b495e4dc Mon Sep 17 00:00:00 2001 From: Marius Grama Date: Thu, 9 Feb 2023 18:00:59 +0100 Subject: [PATCH 2/2] Add TODO for handling information_schema queries in the engine --- .../io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java index ca1cb44fea47..d1faf40cba0f 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java @@ -602,6 +602,7 @@ private List listNamespaces(ConnectorSession session, Optional n { if (namespace.isPresent()) { if (isHiveSystemSchema(namespace.get())) { + // TODO https://github.com/trinodb/trino/issues/1559 information_schema should be handled by the engine fully return ImmutableList.of(); } return ImmutableList.of(namespace.get());