From 71fbcb6913aa22e5dd103407c8aca0ee79195c18 Mon Sep 17 00:00:00 2001 From: Konrad Dziedzic Date: Wed, 20 Apr 2022 16:41:31 +0200 Subject: [PATCH] Fix Delta Lake queries with predicates not expressible by tuple domain It didn't work when table was partitioned by column that contained null values and predicate was applied to it --- .../plugin/deltalake/DeltaLakeSplitManager.java | 2 +- .../deltalake/BaseDeltaLakeMinioConnectorTest.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeSplitManager.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeSplitManager.java index 499336108a66..c2015b81de12 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeSplitManager.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeSplitManager.java @@ -184,7 +184,7 @@ private Stream getSplits( .filter(column -> partitionValues.containsKey(((DeltaLakeColumnHandle) column).getName())) .collect(toImmutableMap(identity(), column -> { DeltaLakeColumnHandle deltaLakeColumn = (DeltaLakeColumnHandle) column; - return NullableValue.of( + return new NullableValue( deltaLakeColumn.getType(), deserializePartitionValue(deltaLakeColumn, addAction.getCanonicalPartitionValues().get(deltaLakeColumn.getName()))); })); diff --git a/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/BaseDeltaLakeMinioConnectorTest.java b/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/BaseDeltaLakeMinioConnectorTest.java index e5c8cfd38610..33ff1cf385d2 100644 --- a/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/BaseDeltaLakeMinioConnectorTest.java +++ b/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/BaseDeltaLakeMinioConnectorTest.java @@ -205,6 +205,18 @@ public void testShowCreateTable() ")"); } + // not pushdownable means not convertible to a tuple domain + @Test + public void testQueryNullPartitionWithNotPushdownablePredicate() + { + String tableName = "test_null_partitions_" + randomTableSuffix(); + assertUpdate("" + + "CREATE TABLE " + tableName + " (a, b, c) WITH (location = '" + format("s3://%s/%s", bucketName, tableName) + "', partitioned_by = ARRAY['c']) " + + "AS VALUES (1, 1, 1), (2, 2, 2), (3, 3, 3), (null, null, null), (4, 4, 4)", + "VALUES 5"); + assertQuery("SELECT a FROM " + tableName + " WHERE c % 5 = 1", "VALUES (1)"); + } + @Override public void testShowCreateSchema() {