From ee3728f3f4b8b27941fe79d92bdd909809b8566e Mon Sep 17 00:00:00 2001 From: Sundar Annamalai Date: Tue, 22 Jun 2021 19:34:40 -0400 Subject: [PATCH] Star Tree Create Cube - Filter property predicate must evaluate boolean type. --- .../sql/analyzer/StatementAnalyzer.java | 6 +++- .../StarTreeAggregationRule.java | 6 ++-- .../tests/AbstractTestStarTreeQueries.java | 34 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/presto-main/src/main/java/io/prestosql/sql/analyzer/StatementAnalyzer.java b/presto-main/src/main/java/io/prestosql/sql/analyzer/StatementAnalyzer.java index e890d844c..57870edc0 100644 --- a/presto-main/src/main/java/io/prestosql/sql/analyzer/StatementAnalyzer.java +++ b/presto-main/src/main/java/io/prestosql/sql/analyzer/StatementAnalyzer.java @@ -820,7 +820,11 @@ class StatementAnalyzer throw new SemanticException(NOT_SUPPORTED, node, "Column '%s' not allowed in source filter predicate. Source filter predicate cannot contain any of the columns defined in Group property", identifier); }); //analyze expression to identify if coercions required - analyzeExpression(predicate, queryScope); + ExpressionAnalysis filterAnalysis = analyzeExpression(predicate, queryScope); + Type predicateType = filterAnalysis.getType(predicate); + if (!predicateType.equals(BOOLEAN) && !predicateType.equals(UNKNOWN)) { + throw new SemanticException(TYPE_MISMATCH, predicate, "Filter property must evaluate to a boolean: actual type '%s'", predicateType); + } }); return createAndAssignScope(node, scope, outputFields.build()); } diff --git a/presto-main/src/main/java/io/prestosql/sql/planner/optimizations/StarTreeAggregationRule.java b/presto-main/src/main/java/io/prestosql/sql/planner/optimizations/StarTreeAggregationRule.java index 7a16fb7e6..6a3f8e5e5 100644 --- a/presto-main/src/main/java/io/prestosql/sql/planner/optimizations/StarTreeAggregationRule.java +++ b/presto-main/src/main/java/io/prestosql/sql/planner/optimizations/StarTreeAggregationRule.java @@ -366,8 +366,10 @@ public class StarTreeAggregationRule //Cube has no additional predicates to compare with return true; } - if (splitPredicate.getRight() == null) { - //No remaining predicate in Query. Can't compare with Cube predicate + if (splitPredicate.getRight() == null || !doesCubeContainQueryPredicateColumns(splitPredicate.getRight(), cubeMetadata)) { + // Cube has more predicate to match but query does not + // OR + // Cube does not contain all columns in the remaining predicate return false; } Expression cubePredicate = ExpressionUtils.rewriteIdentifiersToSymbolReferences(sqlParser.createExpression(cubeFilter.getCubePredicate(), new ParsingOptions())); diff --git a/presto-tests/src/main/java/io/prestosql/tests/AbstractTestStarTreeQueries.java b/presto-tests/src/main/java/io/prestosql/tests/AbstractTestStarTreeQueries.java index 3f7c98796..29fa8b4ae 100644 --- a/presto-tests/src/main/java/io/prestosql/tests/AbstractTestStarTreeQueries.java +++ b/presto-tests/src/main/java/io/prestosql/tests/AbstractTestStarTreeQueries.java @@ -653,6 +653,40 @@ public abstract class AbstractTestStarTreeQueries assertUpdate("DROP TABLE orders_table_predicate_unsupported_predicate"); } + @Test + public void testCreateCubeWithIncorrectFilterPredicate() + { + assertQueryFails(sessionStarTree, + "CREATE CUBE orders_cube_unsuported_filter_predicate ON orders WITH (AGGREGATIONS=(sum(totalprice)), GROUP=(custkey), FILTER = (orderdate))", + ".*Filter property must evaluate to a boolean: actual type 'date'.*"); + assertQueryFails(sessionStarTree, + "CREATE CUBE orders_cube_unsuported_filter_predicate ON orders WITH (AGGREGATIONS=(sum(totalprice)), GROUP=(orderdate), FILTER = (custkey))", + ".*Filter property must evaluate to a boolean: actual type 'bigint'.*"); + } + + @Test + public void testCubeInsertWithMultipleCube() + { + computeActual("CREATE TABLE orders_table_multiple_cube_insert AS SELECT * FROM orders"); + computeActual("CREATE CUBE orders_cube_mutiple_cube_insert_1 ON orders_table_multiple_cube_insert WITH (AGGREGATIONS = (max(totalprice)), GROUP = (orderdate,custkey))"); + assertQuerySucceeds("INSERT INTO CUBE orders_cube_mutiple_cube_insert_1 WHERE custkey >= 100"); + assertQuery(sessionStarTree, + "SELECT custkey, max(totalprice) FROM orders_table_multiple_cube_insert WHERE custkey >= 101 GROUP BY custkey", + "SELECT custkey, max(totalprice) FROM orders WHERE custkey >= 101 GROUP BY custkey", + assertTableScan("orders_cube_mutiple_cube_insert_1")); + computeActual("CREATE CUBE orders_cube_mutiple_cube_insert_2 ON orders_table_multiple_cube_insert WITH (AGGREGATIONS = (max(totalprice)), GROUP = (orderdate,custkey), FILTER = (orderkey > 1))"); + assertQuerySucceeds(sessionStarTree, "INSERT INTO CUBE orders_cube_mutiple_cube_insert_2 WHERE custkey >= 100"); + assertQuery(sessionStarTree, + "SELECT custkey, max(totalprice) FROM orders_table_multiple_cube_insert WHERE custkey >= 101 GROUP BY custkey", + "SELECT custkey, max(totalprice) FROM orders WHERE custkey >= 101 GROUP BY custkey", + assertTableScan("orders_cube_mutiple_cube_insert_1")); + assertQuery(sessionStarTree, + "SELECT custkey, max(totalprice) FROM orders_table_multiple_cube_insert WHERE orderkey > 1 AND custkey >= 101 GROUP BY custkey", + "SELECT custkey, max(totalprice) FROM orders WHERE orderkey > 1 AND custkey >= 101 GROUP BY custkey", + assertTableScan("orders_cube_mutiple_cube_insert_2")); + assertUpdate("DROP TABLE orders_table_multiple_cube_insert"); + } + private Consumer assertInTableScans(String tableName) { return plan ->