From 28a1cfe9f19aaac2eb4519181307f104f0c5a316 Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Wed, 21 Jul 2021 23:04:56 +0200 Subject: [PATCH] Exercise Iceberg applyFilter with non-pushdownable constraint --- .../iceberg/BaseIcebergConnectorTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergConnectorTest.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergConnectorTest.java index 113d818ace2d..59d4ded4c7fe 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergConnectorTest.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergConnectorTest.java @@ -750,6 +750,11 @@ public void testHourTransform() assertQuery("SELECT d_hour, row_count, d.min, d.max, b.min, b.max FROM \"test_hour_transform$partitions\"", expected); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_hour_transform WHERE day_of_week(d) = 3 AND b % 7 = 3", + "VALUES (TIMESTAMP '1969-12-31 23:44:55.567890', 10)"); + assertThat(query("SHOW STATS FOR test_hour_transform")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -793,6 +798,11 @@ public void testDayTransformDate() "(DATE '2015-05-15', 2, DATE '2015-05-15', DATE '2015-05-15', 6, 7), " + "(DATE '2020-02-21', 2, DATE '2020-02-21', DATE '2020-02-21', 8, 9)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_day_transform_date WHERE day_of_week(d) = 3 AND b % 7 = 3", + "VALUES (DATE '1969-01-01', 10)"); + assertThat(query("SHOW STATS FOR test_day_transform_date")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -847,6 +857,11 @@ public void testDayTransformTimestamp() assertQuery("SELECT d_day, row_count, d.min, d.max, b.min, b.max FROM \"test_day_transform_timestamp$partitions\"", expected); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_day_transform_timestamp WHERE day_of_week(d) = 3 AND b % 7 = 3", + "VALUES (TIMESTAMP '1969-12-31 00:00:00.000000', 10)"); + assertThat(query("SHOW STATS FOR test_day_transform_timestamp")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -894,6 +909,11 @@ public void testMonthTransformDate() "(606, 2, DATE '2020-07-18', DATE '2020-07-28', 12, 13), " + "(611, 1, DATE '2020-12-31', DATE '2020-12-31', 14, 14)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_month_transform_date WHERE day_of_week(d) = 7 AND b % 7 = 3", + "VALUES (DATE '2020-06-28', 10)"); + assertThat(query("SHOW STATS FOR test_month_transform_date")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -945,6 +965,11 @@ public void testMonthTransformTimestamp() assertQuery("SELECT d_month, row_count, d.min, d.max, b.min, b.max FROM \"test_month_transform_timestamp$partitions\"", expected); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_month_transform_timestamp WHERE day_of_week(d) = 1 AND b % 7 = 3", + "VALUES (TIMESTAMP '1969-12-01 00:00:00.000000', 10)"); + assertThat(query("SHOW STATS FOR test_month_transform_timestamp")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -987,6 +1012,11 @@ public void testYearTransformDate() "(46, 2, DATE '2016-05-15', DATE '2016-06-06', 9, 10), " + "(50, 2, DATE '2020-02-21', DATE '2020-11-10', 11, 12)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_year_transform_date WHERE day_of_week(d) = 1 AND b % 7 = 3", + "VALUES (DATE '2016-06-06', 10)"); + assertThat(query("SHOW STATS FOR test_year_transform_date")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -1036,6 +1066,11 @@ public void testYearTransformTimestamp() assertQuery("SELECT d_year, row_count, d.min, d.max, b.min, b.max FROM \"test_year_transform_timestamp$partitions\"", expected); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_year_transform_timestamp WHERE day_of_week(d) = 2 AND b % 7 = 3", + "VALUES (TIMESTAMP '2015-09-15 14:21:02.345678', 10)"); + assertThat(query("SHOW STATS FOR test_year_transform_timestamp")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -1073,6 +1108,11 @@ public void testTruncateTextTransform() assertQuery("SELECT b FROM test_truncate_text_transform WHERE substring(d, 1, 2) = 'Gr'", "VALUES 6, 7"); assertQuery(select + " WHERE d_trunc = 'Gr'", "VALUES ('Gr', 2, 'Greece', 'Grozny', 6, 7)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_truncate_text_transform WHERE length(d) = 4 AND b % 7 = 2", + "VALUES ('abxy', 2)"); + assertThat(query("SHOW STATS FOR test_truncate_text_transform")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -1128,6 +1168,11 @@ public void testTruncateIntegerTransform(String dataType) assertQuery("SELECT b FROM " + table + " WHERE d IN (-123, -130)", "VALUES 14, 15"); assertQuery(select + " WHERE d_trunc = -130", "VALUES (-130, 2, -130, -123, 14, 15)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM " + table + " WHERE d % 10 = -1 AND b % 7 = 3", + "VALUES (-1, 10)"); + assertThat(query("SHOW STATS FOR " + table)) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -1175,6 +1220,11 @@ public void testTruncateDecimalTransform() assertQuery("SELECT b FROM test_truncate_decimal_transform WHERE d = -0.05", "VALUES 5"); assertQuery(select + " WHERE d_trunc = -0.10", "VALUES (-0.10, 1, -0.05, -0.05, 5, 5)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_truncate_decimal_transform WHERE d * 100 % 10 = 9 AND b % 7 = 3", + "VALUES (12.29, 3)"); + assertThat(query("SHOW STATS FOR test_truncate_decimal_transform")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck() @@ -1209,6 +1259,11 @@ public void testBucketTransform() assertQuery(select + " WHERE d_bucket = 1", "VALUES(1, 4, 'Greece', 'moscow', 2, 6)"); + // Exercise IcebergMetadata.applyFilter with non-empty Constraint.predicate, via non-pushdownable predicates + assertQuery( + "SELECT * FROM test_bucket_transform WHERE length(d) = 4 AND b % 7 = 2", + "VALUES ('abxy', 2)"); + assertThat(query("SHOW STATS FOR test_bucket_transform")) .projected(0, 2, 3, 4, 5, 6) // ignore data size which is available for Parquet, but not for ORC .skippingTypesCheck()