diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java index cfdc3eb9a7..d531b56e1d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java @@ -28,11 +28,11 @@ import org.apache.calcite.rel.RelShuttle; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.type.RelDataType; -import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; +import org.apache.calcite.rex.RexOver; import org.apache.calcite.sql.validate.SqlValidatorUtil; import org.apache.calcite.util.Util; import org.apache.calcite.util.mapping.Mapping; @@ -201,4 +201,8 @@ public boolean isSynthetic() { return shuttle.visit(this); } + public boolean containsOver() { + return RexOver.containsOver(this.getChildExps(), null); + } + } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinProjectTransposeRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinProjectTransposeRule.java index b163052c3b..2c7a4b3700 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinProjectTransposeRule.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveJoinProjectTransposeRule.java @@ -17,7 +17,7 @@ */ package org.apache.hadoop.hive.ql.optimizer.calcite.rules; -import org.apache.calcite.plan.RelOptRuleOperand; +import org.apache.calcite.plan.*; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.rules.JoinProjectTransposeRule; import org.apache.calcite.tools.RelBuilderFactory; @@ -98,4 +98,21 @@ private HiveJoinProjectTransposeRule( super(operand, description, includeOuter, relBuilderFactory); } + public void onMatch(RelOptRuleCall call) { + HiveProject proj = null; + if (hasLeftChild(call) ) { + proj = (HiveProject)call.rel(1); + if(proj.containsOver()) { + return; + } + } + if (hasRightChild(call) ) { + proj = (HiveProject) getRightChild(call); + if (proj.containsOver()) { + return; + } + } + super.onMatch(call); + } + }