diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java index 28ac4313b19e..ad560f86cee0 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java @@ -425,13 +425,16 @@ public HiveTableHandle getTableHandle(ConnectorSession session, SchemaTableName if (isHiveSystemSchema(tableName.getSchemaName())) { return null; } - Optional table = metastore.getTable(new HiveIdentity(session), tableName.getSchemaName(), tableName.getTableName()); - if (table.isEmpty()) { + Table table = metastore + .getTable(new HiveIdentity(session), tableName.getSchemaName(), tableName.getTableName()) + .orElse(null); + + if (table == null) { return null; } - if (isDeltaLakeTable(table.get())) { - throw new TrinoException(HIVE_UNSUPPORTED_FORMAT, "Cannot query Delta Lake table"); + if (isDeltaLakeTable(table)) { + throw new TrinoException(HIVE_UNSUPPORTED_FORMAT, format("Cannot query Delta Lake table '%s'", tableName)); } // we must not allow system tables due to how permissions are checked in SystemTableAwareAccessControl @@ -439,15 +442,15 @@ public HiveTableHandle getTableHandle(ConnectorSession session, SchemaTableName throw new TrinoException(HIVE_INVALID_METADATA, "Unexpected table present in Hive metastore: " + tableName); } - verifyOnline(tableName, Optional.empty(), getProtectMode(table.get()), table.get().getParameters()); + verifyOnline(tableName, Optional.empty(), getProtectMode(table), table.getParameters()); return new HiveTableHandle( tableName.getSchemaName(), tableName.getTableName(), - table.get().getParameters(), - getPartitionKeyColumnHandles(table.get(), typeManager), - getRegularColumnHandles(table.get(), typeManager, getTimestampPrecision(session)), - getHiveBucketHandle(session, table.get(), typeManager)); + table.getParameters(), + getPartitionKeyColumnHandles(table, typeManager), + getRegularColumnHandles(table, typeManager, getTimestampPrecision(session)), + getHiveBucketHandle(session, table, typeManager)); } @Override diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/PropertiesSystemTableProvider.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/PropertiesSystemTableProvider.java index c0a2f17618e7..76da893961b2 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/PropertiesSystemTableProvider.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/PropertiesSystemTableProvider.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableSortedMap; import io.trino.plugin.hive.authentication.HiveIdentity; import io.trino.plugin.hive.metastore.Table; +import io.trino.spi.TrinoException; import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableMetadata; @@ -32,8 +33,11 @@ import java.util.Optional; import static com.google.common.collect.ImmutableList.toImmutableList; +import static io.trino.plugin.hive.HiveErrorCode.HIVE_UNSUPPORTED_FORMAT; import static io.trino.plugin.hive.SystemTableHandler.PROPERTIES; +import static io.trino.plugin.hive.util.HiveUtil.isDeltaLakeTable; import static io.trino.plugin.hive.util.SystemTables.createSystemTable; +import static java.lang.String.format; public class PropertiesSystemTableProvider implements SystemTableProvider @@ -56,11 +60,14 @@ public Optional getSystemTable(HiveMetadata metadata, ConnectorSess } SchemaTableName sourceTableName = PROPERTIES.getSourceTableName(tableName); - Optional
table = metadata.getMetastore().getTable(new HiveIdentity(session), sourceTableName.getSchemaName(), sourceTableName.getTableName()); - if (table.isEmpty()) { - throw new TableNotFoundException(tableName); + Table table = metadata.getMetastore() + .getTable(new HiveIdentity(session), sourceTableName.getSchemaName(), sourceTableName.getTableName()) + .orElseThrow(() -> new TableNotFoundException(tableName)); + + if (isDeltaLakeTable(table)) { + throw new TrinoException(HIVE_UNSUPPORTED_FORMAT, format("Cannot query Delta Lake table '%s'", sourceTableName)); } - Map sortedTableParameters = ImmutableSortedMap.copyOf(table.get().getParameters()); + Map sortedTableParameters = ImmutableSortedMap.copyOf(table.getParameters()); List columns = sortedTableParameters.keySet().stream() .map(key -> new ColumnMetadata(key, VarcharType.VARCHAR)) .collect(toImmutableList()); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java index 3d62bf35e122..91e77e010477 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java @@ -2876,6 +2876,7 @@ public void testHideDeltaLakeTables() .setTableName(tableName.getTableName()) .setOwner(Optional.of(session.getUser())) .setTableType(MANAGED_TABLE.name()) + .setPartitionColumns(List.of(new Column("a_partition_column", HIVE_INT, Optional.empty()))) .setDataColumns(List.of(new Column("a_column", HIVE_STRING, Optional.empty()))) .setParameter(SPARK_TABLE_PROVIDER_KEY, DELTA_LAKE_PROVIDER); table.getStorageBuilder() @@ -2894,7 +2895,25 @@ public void testHideDeltaLakeTables() ConnectorMetadata metadata = transaction.getMetadata(); metadata.beginQuery(session); assertThatThrownBy(() -> getTableHandle(metadata, tableName)) - .hasMessage("Cannot query Delta Lake table"); + .hasMessage(format("Cannot query Delta Lake table '%s'", tableName)); + } + + // Verify the hidden `$properties` Delta Lake table handle can't be obtained within the hive connector + SchemaTableName propertiesTableName = new SchemaTableName(tableName.getSchemaName(), format("%s$properties", tableName.getTableName())); + try (Transaction transaction = newTransaction()) { + ConnectorMetadata metadata = transaction.getMetadata(); + metadata.beginQuery(session); + assertThatThrownBy(() -> metadata.getSystemTable(newSession(), propertiesTableName)) + .hasMessage(format("Cannot query Delta Lake table '%s'", tableName)); + } + + // Verify the hidden `$partitions` Delta Lake table handle can't be obtained within the hive connector + SchemaTableName partitionsTableName = new SchemaTableName(tableName.getSchemaName(), format("%s$partitions", tableName.getTableName())); + try (Transaction transaction = newTransaction()) { + ConnectorMetadata metadata = transaction.getMetadata(); + metadata.beginQuery(session); + assertThatThrownBy(() -> metadata.getSystemTable(newSession(), partitionsTableName)) + .hasMessage(format("Cannot query Delta Lake table '%s'", tableName)); } // Assert that table is hidden diff --git a/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveDeltaLakeTable.java b/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveDeltaLakeTable.java index 135254c131fc..f7e011497f41 100644 --- a/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveDeltaLakeTable.java +++ b/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveDeltaLakeTable.java @@ -31,7 +31,8 @@ public void testReadDeltaLakeTable() "CREATE TABLE test_delta_lake_table (ignored int) " + "TBLPROPERTIES ('spark.sql.sources.provider'='DELTA')"); - assertQueryFailure(() -> onTrino().executeQuery("SELECT * FROM test_delta_lake_table")).hasMessageContaining("Cannot query Delta Lake table"); + assertQueryFailure(() -> onTrino().executeQuery("SELECT * FROM test_delta_lake_table")) + .hasMessageContaining("Cannot query Delta Lake table 'default.test_delta_lake_table'"); onHive().executeQuery("DROP TABLE test_delta_lake_table"); }