diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java index 5db95b0ca48f..0f334b335501 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java @@ -337,11 +337,12 @@ public void visit(RelNode node, int ordinal, RelNode parent) { } else { if (node instanceof Filter) { check((Filter) node); - } else if (node instanceof Project) { - RexNode condition = HiveRelOptUtil.pushPastProjectUnlessBloat( - filterCondition, (Project) node, bloat); - if (condition != null) { - filterCondition = condition; + } else if (node instanceof Project project) { + filterCondition = HiveRelOptUtil.pushPastProjectUnlessBloat( + filterCondition, project, bloat); + if (filterCondition == null) { + // the condition could not be pushed, so bail out + return; } } else { // we do not support other operators for now diff --git a/ql/src/test/queries/clientpositive/cbo_filter_pushdown_windowing_notnull.q b/ql/src/test/queries/clientpositive/cbo_filter_pushdown_windowing_notnull.q new file mode 100644 index 000000000000..501cd2a4bba2 --- /dev/null +++ b/ql/src/test/queries/clientpositive/cbo_filter_pushdown_windowing_notnull.q @@ -0,0 +1,16 @@ +-- HIVE-29729: an IS NOT NULL predicate above nested windowing (OVER) Projects must +-- not trip the RedundancyChecker in HiveFilterProjectTransposeRule. +set hive.cbo.fallback.strategy=NEVER; + +create table tab1 (id string); + +select rnk2 +from ( + select + row_number() over(order by rnk) as rnk2 + from ( + select count(*) over() as rnk + from (select count(*) from tab1) t + ) t2 +) t3 +where rnk2 is not null; diff --git a/ql/src/test/results/clientpositive/llap/cbo_filter_pushdown_windowing_notnull.q.out b/ql/src/test/results/clientpositive/llap/cbo_filter_pushdown_windowing_notnull.q.out new file mode 100644 index 000000000000..fd786ea672b8 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/cbo_filter_pushdown_windowing_notnull.q.out @@ -0,0 +1,35 @@ +PREHOOK: query: create table tab1 (id string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@tab1 +POSTHOOK: query: create table tab1 (id string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@tab1 +PREHOOK: query: select rnk2 +from ( + select + row_number() over(order by rnk) as rnk2 + from ( + select count(*) over() as rnk + from (select count(*) from tab1) t + ) t2 +) t3 +where rnk2 is not null +PREHOOK: type: QUERY +PREHOOK: Input: default@tab1 +#### A masked pattern was here #### +POSTHOOK: query: select rnk2 +from ( + select + row_number() over(order by rnk) as rnk2 + from ( + select count(*) over() as rnk + from (select count(*) from tab1) t + ) t2 +) t3 +where rnk2 is not null +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tab1 +#### A masked pattern was here #### +1