diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 5914fdb..90f2fd6 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12312,6 +12312,11 @@ private RelNode genGBRelNode(List gbExprs, rexNodeToPosMap, gbChildProjLst.size())); } + if (gbChildProjLst.isEmpty()) { + // This will happen for count(*), in such cases we arbitarily pick + // first element from srcRel + gbChildProjLst.add(this.m_cluster.getRexBuilder().makeInputRef(srcRel, 0)); + } RelNode gbInputRel = HiveProjectRel.create(srcRel, gbChildProjLst, null); HiveRel aggregateRel = null; @@ -12539,7 +12544,7 @@ private RelNode genOBLogicalPlan(QB qb, RelNode srcRel) obASTExpr = (ASTNode) obASTExprLst.get(i); Map astToExprNDescMap = TypeCheckProcFactory .genExprNode(obASTExpr, new TypeCheckCtx(inputRR)); - ExprNodeDesc obExprNDesc = astToExprNDescMap.get((ASTNode) obASTExpr + ExprNodeDesc obExprNDesc = astToExprNDescMap.get(obASTExpr .getChild(0)); if (obExprNDesc == null) throw new SemanticException("Invalid order by expression: " @@ -12575,6 +12580,7 @@ private RelNode genOBLogicalPlan(QB qb, RelNode srcRel) if (!newVCLst.isEmpty()) { List originalInputRefs = Lists.transform(srcRel.getRowType() .getFieldList(), new Function() { + @Override public RexNode apply(RelDataTypeField input) { return new RexInputRef(input.getIndex(), input.getType()); } @@ -12603,6 +12609,7 @@ public RexNode apply(RelDataTypeField input) { List obParentRelProjs = Lists.transform(srcRel .getRowType().getFieldList(), new Function() { + @Override public RexNode apply(RelDataTypeField input) { return new RexInputRef(input.getIndex(), input.getType()); } @@ -13033,6 +13040,7 @@ private RelNode genSelectLogicalPlan(QB qb, RelNode srcRel) */ List oFieldNames = Lists.transform(columnNames, new Function() { + @Override public String apply(String hName) { return "_o_" + hName; } diff --git ql/src/test/queries/clientpositive/cbo_correctness.q ql/src/test/queries/clientpositive/cbo_correctness.q index 68aa392..23354ae 100644 --- ql/src/test/queries/clientpositive/cbo_correctness.q +++ ql/src/test/queries/clientpositive/cbo_correctness.q @@ -189,9 +189,12 @@ select max(c_int) from v1 group by (c_boolean); select count(v1.c_int) from v1 join t2 on v1.c_int = t2.c_int; select count(v1.c_int) from v1 join v2 on v1.c_int = v2.c_int; -create view v3 as select v1.value from v1 join t1 on v1.c_boolean = t1.c_boolean; -select * from v3 limit 3; +select count(*) from v1 a join v1 b on a.value = b.value; +create view v3 as select v1.value val from v1 join t1 on v1.c_boolean = t1.c_boolean; + +-- view chaining +select count(val) from v3 where val != '1'; with q1 as ( select key from t1 where key = '1') select * from q1 @@ -210,4 +213,7 @@ with q1 as ( select c_int from q2 where c_boolean = false), q2 as ( select c_int,c_boolean from v1 where value = '1') select * from (select c_int from q1) a; - +drop view v1; +drop view v2; +drop view v3; +drop view v4; diff --git ql/src/test/results/clientpositive/cbo_correctness.q.out ql/src/test/results/clientpositive/cbo_correctness.q.out index 9a87ddb..02251df 100644 --- ql/src/test/results/clientpositive/cbo_correctness.q.out +++ ql/src/test/results/clientpositive/cbo_correctness.q.out @@ -16013,30 +16013,41 @@ POSTHOOK: Input: default@v1 POSTHOOK: Input: default@v2 #### A masked pattern was here #### 234 -PREHOOK: query: create view v3 as select v1.value from v1 join t1 on v1.c_boolean = t1.c_boolean +PREHOOK: query: select count(*) from v1 a join v1 b on a.value = b.value +PREHOOK: type: QUERY +PREHOOK: Input: default@t1 +PREHOOK: Input: default@v1 +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from v1 a join v1 b on a.value = b.value +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t1 +POSTHOOK: Input: default@v1 +#### A masked pattern was here #### +160 +PREHOOK: query: create view v3 as select v1.value val from v1 join t1 on v1.c_boolean = t1.c_boolean PREHOOK: type: CREATEVIEW PREHOOK: Input: default@t1 PREHOOK: Input: default@v1 -POSTHOOK: query: create view v3 as select v1.value from v1 join t1 on v1.c_boolean = t1.c_boolean +POSTHOOK: query: create view v3 as select v1.value val from v1 join t1 on v1.c_boolean = t1.c_boolean POSTHOOK: type: CREATEVIEW POSTHOOK: Input: default@t1 POSTHOOK: Input: default@v1 POSTHOOK: Output: default@v3 -PREHOOK: query: select * from v3 limit 3 +PREHOOK: query: -- view chaining +select count(val) from v3 where val != '1' PREHOOK: type: QUERY PREHOOK: Input: default@t1 PREHOOK: Input: default@v1 PREHOOK: Input: default@v3 #### A masked pattern was here #### -POSTHOOK: query: select * from v3 limit 3 +POSTHOOK: query: -- view chaining +select count(val) from v3 where val != '1' POSTHOOK: type: QUERY POSTHOOK: Input: default@t1 POSTHOOK: Input: default@v1 POSTHOOK: Input: default@v3 #### A masked pattern was here #### -1 -1 -1 +96 PREHOOK: query: with q1 as ( select key from t1 where key = '1') select * from q1 @@ -16104,3 +16115,35 @@ POSTHOOK: Input: default@v1 #### A masked pattern was here #### 1 1 +PREHOOK: query: drop view v1 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@v1 +PREHOOK: Output: default@v1 +POSTHOOK: query: drop view v1 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@v1 +POSTHOOK: Output: default@v1 +PREHOOK: query: drop view v2 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@v2 +PREHOOK: Output: default@v2 +POSTHOOK: query: drop view v2 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@v2 +POSTHOOK: Output: default@v2 +PREHOOK: query: drop view v3 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@v3 +PREHOOK: Output: default@v3 +POSTHOOK: query: drop view v3 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@v3 +POSTHOOK: Output: default@v3 +PREHOOK: query: drop view v4 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@v4 +PREHOOK: Output: default@v4 +POSTHOOK: query: drop view v4 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@v4 +POSTHOOK: Output: default@v4