You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kr...@apache.org on 2022/12/09 05:37:30 UTC

[hive] branch master updated: HIVE-26817: Set column names in result schema when plan has Values root (Krisztian Kasa, reviewed by Stamatis Zampetakis)

This is an automated email from the ASF dual-hosted git repository.

krisztiankasa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 93bcb126ab4 HIVE-26817: Set column names in result schema when plan has Values root (Krisztian Kasa, reviewed by Stamatis Zampetakis)
93bcb126ab4 is described below

commit 93bcb126ab4e6d5c946b4d3a8c76355d95232a6f
Author: Krisztian Kasa <ka...@gmail.com>
AuthorDate: Fri Dec 9 06:37:20 2022 +0100

    HIVE-26817: Set column names in result schema when plan has Values root (Krisztian Kasa, reviewed by Stamatis Zampetakis)
---
 .../optimizer/calcite/reloperators/HiveValues.java | 16 ++++++++
 .../calcite/translator/PlanModifierForASTConv.java |  4 +-
 ql/src/test/queries/clientpositive/empty_result.q  |  9 +++++
 .../results/clientpositive/llap/empty_result.q.out | 45 ++++++++++++++++++++++
 .../llap/empty_result_outerjoin.q.out              | 10 ++---
 5 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveValues.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveValues.java
index 93740091c1f..ecf2804c2b4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveValues.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveValues.java
@@ -24,7 +24,9 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rex.RexLiteral;
+import org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException;
 
 import java.util.List;
 
@@ -43,4 +45,18 @@ public class HiveValues extends Values implements HiveRelNode {
   public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
     return new HiveValues(getCluster(), getRowType(), tuples, getTraitSet());
   }
+
+  public RelNode copy(List<String> newColumnNames) throws CalciteSemanticException {
+    if (newColumnNames.size() != getRowType().getFieldCount()) {
+      throw new CalciteSemanticException("The number of new column names and columns in the schema does not match!");
+    }
+
+    RelDataTypeFactory.Builder builder = getCluster().getTypeFactory().builder();
+
+    for (int i = 0; i < getRowType().getFieldCount(); ++i) {
+      builder.add(newColumnNames.get(i), getRowType().getFieldList().get(i).getType());
+    }
+
+    return new HiveValues(getCluster(), builder.uniquify().build(), tuples, getTraitSet());
+  }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java
index 2724a748ba3..61eb3282eb8 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hive.ql.optimizer.calcite.translator;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.calcite.adapter.druid.DruidQuery;
 import org.apache.calcite.plan.RelOptUtil;
@@ -71,7 +72,8 @@ public class PlanModifierForASTConv {
   public static RelNode convertOpTree(RelNode rel, List<FieldSchema> resultSchema, boolean alignColumns)
       throws CalciteSemanticException {
     if (rel instanceof HiveValues) {
-      return rel;
+      List<String> fieldNames = resultSchema.stream().map(FieldSchema::getName).collect(Collectors.toList());
+      return ((HiveValues) rel).copy(fieldNames);
     }
 
     RelNode newTopNode = rel;
diff --git a/ql/src/test/queries/clientpositive/empty_result.q b/ql/src/test/queries/clientpositive/empty_result.q
index fe46c33e880..4107b874c77 100644
--- a/ql/src/test/queries/clientpositive/empty_result.q
+++ b/ql/src/test/queries/clientpositive/empty_result.q
@@ -11,12 +11,17 @@ explain
 select a1 from t1
 join (select a2 from t2 where 1 = 0) s on s.a2 = t1.a1;
 
+select a1 from t1
+join (select a2 from t2 where 1 = 0) s on s.a2 = t1.a1;
+
 explain cbo
 select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0;
 
 explain
 select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0;
 
+select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0;
+
 
 create view vw1 as (select t1.b1, t2.b2 from t1, t2 WHERE t1.a1 = t2.a2);
 
@@ -34,3 +39,7 @@ select count(a1) from t1 where 1=0 group by a1 order by a1;
 
 explain cbo
 select min(c1) from t1 where false;
+
+explain cbo
+select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1;
+select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1;
diff --git a/ql/src/test/results/clientpositive/llap/empty_result.q.out b/ql/src/test/results/clientpositive/llap/empty_result.q.out
index ed58941e2fb..d2e90701316 100644
--- a/ql/src/test/results/clientpositive/llap/empty_result.q.out
+++ b/ql/src/test/results/clientpositive/llap/empty_result.q.out
@@ -57,6 +57,19 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
+PREHOOK: query: select a1 from t1
+join (select a2 from t2 where 1 = 0) s on s.a2 = t1.a1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+PREHOOK: Input: default@t2
+#### A masked pattern was here ####
+POSTHOOK: query: select a1 from t1
+join (select a2 from t2 where 1 = 0) s on s.a2 = t1.a1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+POSTHOOK: Input: default@t2
+#### A masked pattern was here ####
+a1
 PREHOOK: query: explain cbo
 select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0
 PREHOOK: type: QUERY
@@ -92,6 +105,15 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
+PREHOOK: query: select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: select y + 1 from (select a1 y, b1 z from t1 where b1 > 10) q WHERE 1=0
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+_c0
 PREHOOK: query: create view vw1 as (select t1.b1, t2.b2 from t1, t2 WHERE t1.a1 = t2.a2)
 PREHOOK: type: CREATEVIEW
 PREHOOK: Input: default@t1
@@ -202,3 +224,26 @@ CBO PLAN:
 HiveAggregate(group=[{}], agg#0=[min($0)])
   HiveValues(tuples=[[]])
 
+PREHOOK: query: explain cbo
+select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: explain cbo
+select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+Explain
+CBO PLAN:
+HiveValues(tuples=[[]])
+
+PREHOOK: query: select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: select b1, count(a1) count1 from (select a1, b1 from t1) s where 1=0 group by b1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+b1	count1
diff --git a/ql/src/test/results/clientpositive/llap/empty_result_outerjoin.q.out b/ql/src/test/results/clientpositive/llap/empty_result_outerjoin.q.out
index 487309e4807..19ad909b104 100644
--- a/ql/src/test/results/clientpositive/llap/empty_result_outerjoin.q.out
+++ b/ql/src/test/results/clientpositive/llap/empty_result_outerjoin.q.out
@@ -66,7 +66,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@t1
 POSTHOOK: Input: default@t2
 #### A masked pattern was here ####
-a	b	c	d
+s.a	s.b	t2.c	t2.d
 PREHOOK: query: explain cbo
 select * from t1
 left join (select c, d from t2 where 1=0) s on t1.a = s.c
@@ -133,7 +133,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@t1
 POSTHOOK: Input: default@t2
 #### A masked pattern was here ####
-a	b	c	d
+s1.a	s1.b	s2.c	s2.d
 PREHOOK: query: explain cbo
 select * from t1
 right join (select c, d from t2 where 1=0) s on t1.a = s.c
@@ -164,7 +164,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@t1
 POSTHOOK: Input: default@t2
 #### A masked pattern was here ####
-a	b	c	d
+t1.a	t1.b	s.c	s.d
 PREHOOK: query: explain cbo
 select * from (select a, b from t1 where 0=1) s
 right join t2 on s.a = t2.c
@@ -231,7 +231,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@t1
 POSTHOOK: Input: default@t2
 #### A masked pattern was here ####
-a	b	c	d
+s1.a	s1.b	s2.c	s2.d
 PREHOOK: query: explain cbo
 select * from (select a, b from t1 where 0=1) s
 full outer join t2 on s.a = t2.c
@@ -334,7 +334,7 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@t1
 POSTHOOK: Input: default@t2
 #### A masked pattern was here ####
-a	b	c	d
+s1.a	s1.b	s2.c	s2.d
 PREHOOK: query: explain cbo
 select t1.a from t1 left join (select c, d from t2 where 1=0) s on s.c = t1.a where s.c is null
 PREHOOK: type: QUERY