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");
}