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