diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java index e13356c..99002d9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java @@ -2107,6 +2107,13 @@ private RelNode genGBLogicalPlan(QB qb, RelNode srcRel) throws SemanticException // 8. We create the group_by operator gbRel = genGBRelNode(gbExprNDescLst, aggregations, groupingSets, srcRel); + Map exprToColumnAlias = qb.getParseInfo().getAllExprToColumnAlias(); + for (ASTNode astNode : exprToColumnAlias.keySet()) { + if (groupByOutputRowResolver.getExpression(astNode) != null) { + groupByOutputRowResolver.put("", exprToColumnAlias.get(astNode), + groupByOutputRowResolver.getExpression(astNode)); + } + } relToHiveColNameCalcitePosMap.put(gbRel, buildHiveToCalciteColumnMap(groupByOutputRowResolver, gbRel)); this.relToHiveRR.put(gbRel, groupByOutputRowResolver); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 3262887..7e0cb23 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2609,17 +2609,7 @@ private void extractJoinCondsFromWhereClause(QBJoinTree joinTree, QB qb, String private Operator genHavingPlan(String dest, QB qb, Operator input, Map aliasToOpInfo) throws SemanticException { - ASTNode havingExpr = qb.getParseInfo().getHavingForClause(dest); - - OpParseContext inputCtx = opParseCtx.get(input); - RowResolver inputRR = inputCtx.getRowResolver(); - Map exprToColumnAlias = qb.getParseInfo().getAllExprToColumnAlias(); - for (ASTNode astNode : exprToColumnAlias.keySet()) { - if (inputRR.getExpression(astNode) != null) { - inputRR.put("", exprToColumnAlias.get(astNode), inputRR.getExpression(astNode)); - } - } ASTNode condn = (ASTNode) havingExpr.getChild(0); /* @@ -2627,9 +2617,7 @@ private Operator genHavingPlan(String dest, QB qb, Operator input, * so we invoke genFilterPlan to handle SubQuery algebraic transformation, * just as is done for SubQuery predicates appearing in the Where Clause. */ - Operator output = genFilterPlan(condn, qb, input, aliasToOpInfo, true, false); - output = putOpInsertMap(output, inputRR); - return output; + return genFilterPlan(condn, qb, input, aliasToOpInfo, true, false); } private Operator genPlanForSubQueryPredicate( @@ -8901,12 +8889,22 @@ private Operator genPostGroupByBodyPlan(Operator curr, String dest, QB qb, QBParseInfo qbp = qb.getParseInfo(); + OpParseContext inputCtx = opParseCtx.get(curr); + RowResolver inputRR = inputCtx.getRowResolver(); + Map exprToColumnAlias = qb.getParseInfo().getAllExprToColumnAlias(); + for (ASTNode astNode : exprToColumnAlias.keySet()) { + if (inputRR.getExpression(astNode) != null) { + inputRR.put("", exprToColumnAlias.get(astNode), inputRR.getExpression(astNode)); + } + } + // Insert HAVING plan here if (qbp.getHavingForClause(dest) != null) { if (getGroupByForClause(qbp, dest).size() == 0) { throw new SemanticException("HAVING specified without GROUP BY"); } curr = genHavingPlan(dest, qb, curr, aliasToOpInfo); + curr = putOpInsertMap(curr, inputRR); } diff --git a/ql/src/test/queries/clientnegative/alias_groupby_orderby.q b/ql/src/test/queries/clientnegative/alias_groupby_orderby.q new file mode 100644 index 0000000..002e48c --- /dev/null +++ b/ql/src/test/queries/clientnegative/alias_groupby_orderby.q @@ -0,0 +1,2 @@ +set hive.cbo.enable=false; +select key as c0, count(*) as c1 from src group by key order by key; diff --git a/ql/src/test/queries/clientpositive/lineage3.q b/ql/src/test/queries/clientpositive/lineage3.q index 70d4e57..a98625e 100644 --- a/ql/src/test/queries/clientpositive/lineage3.q +++ b/ql/src/test/queries/clientpositive/lineage3.q @@ -86,7 +86,7 @@ from ( from alltypesorc where cint is not null group by cint, ctinyint - order by cint, ctinyint + order by c1, c2 limit 5 ) x ) x2 @@ -140,7 +140,7 @@ from ( select cint c1, ctinyint c2, min(cfloat) c3 from alltypesorc group by cint, ctinyint - order by cint, ctinyint + order by c1, c2 limit 1 ) x ) x2 diff --git a/ql/src/test/results/clientnegative/alias_groupby_orderby.q.out b/ql/src/test/results/clientnegative/alias_groupby_orderby.q.out new file mode 100644 index 0000000..66bfefa --- /dev/null +++ b/ql/src/test/results/clientnegative/alias_groupby_orderby.q.out @@ -0,0 +1 @@ +FAILED: SemanticException [Error 10004]: Line 2:64 Invalid table alias or column reference 'key': (possible column names are: c0, c1) diff --git a/ql/src/test/results/clientpositive/lineage3.q.out b/ql/src/test/results/clientpositive/lineage3.q.out index ad965c8..a32f614 100644 --- a/ql/src/test/results/clientpositive/lineage3.q.out +++ b/ql/src/test/results/clientpositive/lineage3.q.out @@ -147,7 +147,7 @@ from ( from alltypesorc where cint is not null group by cint, ctinyint - order by cint, ctinyint + order by c1, c2 limit 5 ) x ) x2 @@ -158,7 +158,7 @@ order by x2, c1 desc PREHOOK: type: QUERY PREHOOK: Input: default@alltypesorc #### A masked pattern was here #### -{"version":"1.0","engine":"mr","hash":"bc64f8bec21631969a17930ec609cde9","queryText":"select c1, x2, x3\nfrom (\n select c1, min(c2) x2, sum(c3) x3\n from (\n select c1, c2, c3\n from (\n select cint c1, ctinyint c2, min(cbigint) c3\n from alltypesorc\n where cint is not null\n group by cint, ctinyint\n order by cint, ctinyint\n limit 5\n ) x\n ) x2\n group by c1\n) y\nwhere x2 > 0\norder by x2, c1 desc","edges":[{"sources":[3],"targets":[0],"edgeType":"PROJECTION"},{"sources":[4],"targets":[1],"expression":"min(default.alltypesorc.ctinyint)","edgeType":"PROJECTION"},{"sources":[5],"targets":[2],"expression":"sum(min(default.alltypesorc.cbigint))","edgeType":"PROJECTION"},{"sources":[3],"targets":[0,1,2],"expression":"alltypesorc.cint is not null","edgeType":"PREDICATE"},{"sources":[4],"targets":[0,1,2],"expression":"(min(default.alltypesorc.ctinyint) > 0)","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"c1"},{"id":1,"vertexType":"COLUMN","vertexId":"x2"},{"id":2,"vertexType":"COLUMN","vertexId":"x3"},{"id":3,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cint"},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"},{"id":5,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cbigint"}]} +{"version":"1.0","engine":"mr","hash":"4d4f1f731ce2fb3e0b466ed6108ffe04","queryText":"select c1, x2, x3\nfrom (\n select c1, min(c2) x2, sum(c3) x3\n from (\n select c1, c2, c3\n from (\n select cint c1, ctinyint c2, min(cbigint) c3\n from alltypesorc\n where cint is not null\n group by cint, ctinyint\n order by c1, c2\n limit 5\n ) x\n ) x2\n group by c1\n) y\nwhere x2 > 0\norder by x2, c1 desc","edges":[{"sources":[3],"targets":[0],"edgeType":"PROJECTION"},{"sources":[4],"targets":[1],"expression":"min(default.alltypesorc.ctinyint)","edgeType":"PROJECTION"},{"sources":[5],"targets":[2],"expression":"sum(min(default.alltypesorc.cbigint))","edgeType":"PROJECTION"},{"sources":[3],"targets":[0,1,2],"expression":"alltypesorc.cint is not null","edgeType":"PREDICATE"},{"sources":[4],"targets":[0,1,2],"expression":"(min(default.alltypesorc.ctinyint) > 0)","edgeType":"PREDICATE"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"c1"},{"id":1,"vertexType":"COLUMN","vertexId":"x2"},{"id":2,"vertexType":"COLUMN","vertexId":"x3"},{"id":3,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cint"},{"id":4,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"},{"id":5,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cbigint"}]} -1072910839 11 2048385991 -1073279343 11 -1595604468 PREHOOK: query: select key, value from src1 @@ -265,7 +265,7 @@ from ( select cint c1, ctinyint c2, min(cfloat) c3 from alltypesorc group by cint, ctinyint - order by cint, ctinyint + order by c1, c2 limit 1 ) x ) x2 @@ -276,7 +276,7 @@ PREHOOK: type: CREATEVIEW PREHOOK: Input: default@alltypesorc PREHOOK: Output: database:default PREHOOK: Output: default@dest_v2 -{"version":"1.0","engine":"mr","hash":"eda442b42b9c3a9cbdb7aff1984ad2dd","queryText":"create view dest_v2 (a, b) as select c1, x2\nfrom (\n select c1, min(c2) x2\n from (\n select c1, c2, c3\n from (\n select cint c1, ctinyint c2, min(cfloat) c3\n from alltypesorc\n group by cint, ctinyint\n order by cint, ctinyint\n limit 1\n ) x\n ) x2\n group by c1\n) y\norder by x2,c1 desc","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"expression":"min(default.alltypesorc.ctinyint)","edgeType":"PROJECTION"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"default.dest_v2.c1"},{"id":1,"vertexType":"COLUMN","vertexId":"default.dest_v2.x2"},{"id":2,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cint"},{"id":3,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]} +{"version":"1.0","engine":"mr","hash":"2d0ee57b4cfc20815364207cfe499bda","queryText":"create view dest_v2 (a, b) as select c1, x2\nfrom (\n select c1, min(c2) x2\n from (\n select c1, c2, c3\n from (\n select cint c1, ctinyint c2, min(cfloat) c3\n from alltypesorc\n group by cint, ctinyint\n order by c1, c2\n limit 1\n ) x\n ) x2\n group by c1\n) y\norder by x2,c1 desc","edges":[{"sources":[2],"targets":[0],"edgeType":"PROJECTION"},{"sources":[3],"targets":[1],"expression":"min(default.alltypesorc.ctinyint)","edgeType":"PROJECTION"}],"vertices":[{"id":0,"vertexType":"COLUMN","vertexId":"default.dest_v2.c1"},{"id":1,"vertexType":"COLUMN","vertexId":"default.dest_v2.x2"},{"id":2,"vertexType":"COLUMN","vertexId":"default.alltypesorc.cint"},{"id":3,"vertexType":"COLUMN","vertexId":"default.alltypesorc.ctinyint"}]} PREHOOK: query: drop view if exists dest_v3 PREHOOK: type: DROPVIEW PREHOOK: query: create view dest_v3 (a1, a2, a3, a4, a5, a6, a7) as