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 <kasakri...@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