http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/a50c3440/testdata/workloads/functional-planner/queries/PlannerTest/union.test ---------------------------------------------------------------------- diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/union.test b/testdata/workloads/functional-planner/queries/PlannerTest/union.test index 4baf6fe..b2368be 100644 --- a/testdata/workloads/functional-planner/queries/PlannerTest/union.test +++ b/testdata/workloads/functional-planner/queries/PlannerTest/union.test @@ -18,6 +18,7 @@ PLAN-ROOT SINK | partitions=1/4 files=1 size=1.57KB | 00:UNION +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypes] | partitions=2/24 files=2 size=40.32KB @@ -41,6 +42,7 @@ PLAN-ROOT SINK | partitions=1/4 files=1 size=1.57KB | 00:UNION +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypes] | partitions=2/24 files=2 size=40.32KB @@ -60,6 +62,7 @@ select * from functional.alltypestiny where year=2009 and month=2 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -82,6 +85,7 @@ PLAN-ROOT SINK 04:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -102,10 +106,7 @@ select * from functional.alltypestiny where year=2009 and month=2 limit 1 PLAN-ROOT SINK | 00:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| limit: 1 +| pass-through-operands: 01,04 | |--03:TOP-N [LIMIT=1] | | order by: int_col ASC @@ -113,6 +114,10 @@ PLAN-ROOT SINK | 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | +|--04:SCAN HDFS [functional.alltypestiny] +| partitions=1/4 files=1 size=115B +| limit: 1 +| 01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B limit: 1 @@ -127,15 +132,9 @@ NODE 4: PLAN-ROOT SINK | 00:UNION +| pass-through-operands: 05,06 | -|--07:EXCHANGE [UNPARTITIONED] -| | limit: 1 -| | -| 04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| limit: 1 -| -|--06:MERGING-EXCHANGE [UNPARTITIONED] +|--07:MERGING-EXCHANGE [UNPARTITIONED] | | order by: int_col ASC | | limit: 1 | | @@ -145,6 +144,13 @@ PLAN-ROOT SINK | 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | +|--06:EXCHANGE [UNPARTITIONED] +| | limit: 1 +| | +| 04:SCAN HDFS [functional.alltypestiny] +| partitions=1/4 files=1 size=115B +| limit: 1 +| 05:EXCHANGE [UNPARTITIONED] | limit: 1 | @@ -165,6 +171,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -195,6 +202,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -218,6 +226,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=2 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -236,6 +245,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=2 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -259,6 +269,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=2 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -285,6 +296,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=2 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -312,6 +324,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -352,6 +365,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -381,11 +395,13 @@ PLAN-ROOT SINK | order by: tinyint_col ASC, smallint_col ASC | 04:UNION +| pass-through-operands: all | |--03:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 00:UNION +| | pass-through-operands: all | | | |--02:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -418,27 +434,29 @@ PLAN-ROOT SINK | order by: tinyint_col ASC, smallint_col ASC | 04:UNION +| pass-through-operands: all | -|--06:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--05:SCAN HDFS [functional.alltypestiny] +|--09:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 03:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 00:UNION +| | pass-through-operands: all +| | +| |--02:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 01:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -09:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -03:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -00:UNION -| -|--02:SCAN HDFS [functional.alltypestiny] +|--06:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -01:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Mixed UNION ALL/DISTINCT, no nested unions, with order by and limit @@ -457,11 +475,13 @@ PLAN-ROOT SINK | order by: tinyint_col ASC, smallint_col ASC | 05:UNION +| pass-through-operands: all | |--04:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 00:UNION +| | pass-through-operands: all | | | |--03:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -494,27 +514,29 @@ PLAN-ROOT SINK | order by: tinyint_col ASC, smallint_col ASC | 05:UNION +| pass-through-operands: all | -|--06:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -09:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -04:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -00:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--02:SCAN HDFS [functional.alltypestiny] +|--09:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 04:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 00:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| |--02:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 01:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -01:SCAN HDFS [functional.alltypestiny] +06:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: Only UNION ALL, first operand is nested @@ -527,6 +549,7 @@ select * from functional.alltypestiny where year=2009 and month=1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -549,6 +572,7 @@ PLAN-ROOT SINK 04:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -569,6 +593,7 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -591,6 +616,7 @@ PLAN-ROOT SINK 04:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -614,6 +640,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -644,6 +671,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -667,6 +695,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -697,6 +726,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -718,6 +748,7 @@ select * from functional.alltypestiny where year=2009 and month=1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -726,6 +757,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 01:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -745,6 +777,7 @@ PLAN-ROOT SINK 08:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -758,6 +791,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 01:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -776,11 +810,13 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--05:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 02:UNION +| | pass-through-operands: all | | | |--04:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -803,24 +839,26 @@ PLAN-ROOT SINK 08:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -07:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -06:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -05:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] +|--07:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 06:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 05:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 02:UNION +| | pass-through-operands: all +| | +| |--04:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -03:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION ALL absorbs the children but not directly the operands @@ -836,6 +874,7 @@ select * from functional.alltypestiny where year=2009 and month=1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--06:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -844,6 +883,7 @@ PLAN-ROOT SINK | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 02:UNION +| | pass-through-operands: all | | | |--04:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -868,27 +908,29 @@ PLAN-ROOT SINK 09:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--06:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -08:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -07:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -05:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] +|--08:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 07:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 05:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 02:UNION +| | pass-through-operands: all +| | +| |--04:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -03:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION ALL absorbs the children but not directly the operands @@ -904,11 +946,13 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--06:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 03:UNION +| | pass-through-operands: all | | | |--05:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -936,27 +980,29 @@ PLAN-ROOT SINK 09:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | -|--02:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--01:SCAN HDFS [functional.alltypestiny] +|--08:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 07:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 06:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 03:UNION +| | pass-through-operands: all +| | +| |--05:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -08:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -07:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -06:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -03:UNION -| -|--05:SCAN HDFS [functional.alltypestiny] +|--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -04:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION ALL doesn't absorb the children of a nested union @@ -973,14 +1019,17 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--06:UNION +| | pass-through-operands: all | | limit: 10 | | | |--05:AGGREGATE [FINALIZE] | | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | | | 02:UNION +| | | pass-through-operands: all | | | | | |--04:SCAN HDFS [functional.alltypestiny] | | | partitions=1/4 files=1 size=115B @@ -1008,35 +1057,38 @@ PLAN-ROOT SINK 12:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -11:EXCHANGE [RANDOM] -| -10:EXCHANGE [UNPARTITIONED] -| limit: 10 -| -06:UNION -| limit: 10 -| -|--07:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -09:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -05:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] +|--11:EXCHANGE [RANDOM] +| | +| 10:EXCHANGE [UNPARTITIONED] +| | limit: 10 +| | +| 06:UNION +| | pass-through-operands: all +| | limit: 10 +| | +| |--09:AGGREGATE [FINALIZE] +| | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | | +| | 08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | | +| | 05:AGGREGATE [STREAMING] +| | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | | +| | 02:UNION +| | | pass-through-operands: all +| | | +| | |--04:SCAN HDFS [functional.alltypestiny] +| | | partitions=1/4 files=1 size=115B +| | | +| | 03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 07:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -03:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION ALL doesn't absorb nested union with order by and limit, @@ -1051,19 +1103,21 @@ select * from functional.alltypestiny where year=2009 and month=1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -04:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--04:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ---- SCANRANGELOCATIONS NODE 2: @@ -1078,25 +1132,27 @@ PLAN-ROOT SINK 08:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -07:EXCHANGE [RANDOM] -| -06:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -04:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--07:EXCHANGE [RANDOM] +| | +| 06:MERGING-EXCHANGE [UNPARTITIONED] +| | order by: tinyint_col ASC +| | limit: 3 +| | +| 04:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION ALL doesn't absorb nested union with order by and limit, @@ -1111,11 +1167,13 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: 01 | |--05:TOP-N [LIMIT=3] | | order by: tinyint_col ASC | | | 02:UNION +| | pass-through-operands: all | | | |--04:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -1138,25 +1196,27 @@ PLAN-ROOT SINK 08:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: 01 | -|--01:SCAN HDFS [functional.alltypestiny] +|--07:EXCHANGE [RANDOM] +| | +| 06:MERGING-EXCHANGE [UNPARTITIONED] +| | order by: tinyint_col ASC +| | limit: 3 +| | +| 05:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 02:UNION +| | pass-through-operands: all +| | +| |--04:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -07:EXCHANGE [RANDOM] -| -06:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -05:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -03:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION DISTINCT absorbs nested union with ALL @@ -1173,6 +1233,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1203,6 +1264,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1227,6 +1289,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1257,6 +1320,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1283,6 +1347,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1318,6 +1383,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1347,6 +1413,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1382,6 +1449,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--04:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1410,19 +1478,21 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -04:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--04:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ---- SCANRANGELOCATIONS NODE 2: @@ -1445,25 +1515,27 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -08:EXCHANGE [RANDOM] -| -07:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -04:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--08:EXCHANGE [RANDOM] +| | +| 07:MERGING-EXCHANGE [UNPARTITIONED] +| | order by: tinyint_col ASC +| | limit: 3 +| | +| 04:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Union unnesting: UNION DISTINCT doesn't absorb nested union with order by and limit @@ -1481,11 +1553,13 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 01 | |--05:TOP-N [LIMIT=3] | | order by: tinyint_col ASC | | | 02:UNION +| | pass-through-operands: all | | | |--04:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -1516,25 +1590,27 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 01 | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -08:EXCHANGE [RANDOM] -| -07:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -05:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] +|--08:EXCHANGE [RANDOM] +| | +| 07:MERGING-EXCHANGE [UNPARTITIONED] +| | order by: tinyint_col ASC +| | limit: 3 +| | +| 05:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 02:UNION +| | pass-through-operands: all +| | +| |--04:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -03:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Complex union unnesting: Multiple levels of UNION ALL, fully unnestable @@ -1551,6 +1627,7 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1583,6 +1660,7 @@ PLAN-ROOT SINK 06:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1616,6 +1694,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1656,6 +1735,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: all | |--05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -1687,11 +1767,13 @@ union all PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--10:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 02:UNION +| | pass-through-operands: 03,04 | | | |--09:TOP-N [LIMIT=3] | | | order by: tinyint_col ASC @@ -1700,6 +1782,7 @@ PLAN-ROOT SINK | | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | | | 05:UNION +| | | pass-through-operands: all | | | | | |--07:SCAN HDFS [functional.alltypestiny] | | | partitions=1/4 files=1 size=115B @@ -1732,49 +1815,52 @@ PLAN-ROOT SINK 17:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -16:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -15:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -10:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -02:UNION -| -|--04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--03:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -14:EXCHANGE [RANDOM] -| -13:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -09:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -12:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -11:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -08:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -05:UNION -| -|--07:SCAN HDFS [functional.alltypestiny] +|--16:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 15:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 10:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 02:UNION +| | pass-through-operands: 03,04 +| | +| |--14:EXCHANGE [RANDOM] +| | | +| | 13:MERGING-EXCHANGE [UNPARTITIONED] +| | | order by: tinyint_col ASC +| | | limit: 3 +| | | +| | 09:TOP-N [LIMIT=3] +| | | order by: tinyint_col ASC +| | | +| | 12:AGGREGATE [FINALIZE] +| | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | | +| | 11:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | | +| | 08:AGGREGATE [STREAMING] +| | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | | +| | 05:UNION +| | | pass-through-operands: all +| | | +| | |--07:SCAN HDFS [functional.alltypestiny] +| | | partitions=1/4 files=1 size=115B +| | | +| | 06:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| |--04:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -06:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Complex union unnesting: Partially unnestable up to 1st level @@ -1795,6 +1881,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 01,02,03 | |--08:TOP-N [LIMIT=3] | | order by: tinyint_col ASC @@ -1803,6 +1890,7 @@ PLAN-ROOT SINK | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 04:UNION +| | pass-through-operands: all | | | |--06:SCAN HDFS [functional.alltypestiny] | | partitions=1/4 files=1 size=115B @@ -1843,39 +1931,41 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 01,02,03 | -|--03:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--02:SCAN HDFS [functional.alltypestiny] +|--13:EXCHANGE [RANDOM] +| | +| 12:MERGING-EXCHANGE [UNPARTITIONED] +| | order by: tinyint_col ASC +| | limit: 3 +| | +| 08:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 11:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 10:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 07:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 04:UNION +| | pass-through-operands: all +| | +| |--06:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 05:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -|--01:SCAN HDFS [functional.alltypestiny] +|--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -13:EXCHANGE [RANDOM] -| -12:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -08:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -11:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -10:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -07:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -04:UNION -| -|--06:SCAN HDFS [functional.alltypestiny] +|--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -05:SCAN HDFS [functional.alltypestiny] +01:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // Complex union unnesting: Multiple nested unions to test all rules in a single query @@ -1902,16 +1992,31 @@ union all PLAN-ROOT SINK | 09:UNION +| pass-through-operands: 10,11,08 +| +|--15:TOP-N [LIMIT=3] +| | order by: tinyint_col ASC +| | +| 12:UNION +| | pass-through-operands: all +| | +| |--14:SCAN HDFS [functional.alltypestiny] +| | partitions=0/4 files=0 size=0B +| | +| 13:SCAN HDFS [functional.alltypestiny] +| partitions=1/4 files=1 size=115B | |--08:AGGREGATE [FINALIZE] | | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | | | 00:UNION +| | pass-through-operands: 01,02,03 | | | |--07:TOP-N [LIMIT=3] | | | order by: tinyint_col ASC | | | | | 04:UNION +| | | pass-through-operands: all | | | | | |--06:SCAN HDFS [functional.alltypestiny] | | | partitions=1/4 files=1 size=115B @@ -1928,17 +2033,6 @@ PLAN-ROOT SINK | 01:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -|--15:TOP-N [LIMIT=3] -| | order by: tinyint_col ASC -| | -| 12:UNION -| | -| |--14:SCAN HDFS [functional.alltypestiny] -| | partitions=0/4 files=0 size=0B -| | -| 13:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| |--11:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | @@ -1968,16 +2062,11 @@ PLAN-ROOT SINK 22:EXCHANGE [UNPARTITIONED] | 09:UNION -| -|--11:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--10:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B +| pass-through-operands: 10,11,19 | |--21:EXCHANGE [RANDOM] | | -| 16:MERGING-EXCHANGE [UNPARTITIONED] +| 20:MERGING-EXCHANGE [UNPARTITIONED] | | order by: tinyint_col ASC | | limit: 3 | | @@ -1985,6 +2074,7 @@ PLAN-ROOT SINK | | order by: tinyint_col ASC | | | 12:UNION +| | pass-through-operands: all | | | |--14:SCAN HDFS [functional.alltypestiny] | | partitions=0/4 files=0 size=0B @@ -1992,40 +2082,48 @@ PLAN-ROOT SINK | 13:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -20:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -19:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -08:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -00:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--02:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -|--01:SCAN HDFS [functional.alltypestiny] +|--19:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 18:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 08:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 00:UNION +| | pass-through-operands: 01,02,03 +| | +| |--17:EXCHANGE [RANDOM] +| | | +| | 16:MERGING-EXCHANGE [UNPARTITIONED] +| | | order by: tinyint_col ASC +| | | limit: 3 +| | | +| | 07:TOP-N [LIMIT=3] +| | | order by: tinyint_col ASC +| | | +| | 04:UNION +| | | pass-through-operands: all +| | | +| | |--06:SCAN HDFS [functional.alltypestiny] +| | | partitions=1/4 files=1 size=115B +| | | +| | 05:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| |--02:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 01:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -18:EXCHANGE [RANDOM] -| -17:MERGING-EXCHANGE [UNPARTITIONED] -| order by: tinyint_col ASC -| limit: 3 -| -07:TOP-N [LIMIT=3] -| order by: tinyint_col ASC -| -04:UNION -| -|--06:SCAN HDFS [functional.alltypestiny] +|--11:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -05:SCAN HDFS [functional.alltypestiny] +10:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // UNION ALL in subquery @@ -2043,16 +2141,18 @@ PLAN-ROOT SINK | order by: tinyint_col ASC | 00:UNION +| pass-through-operands: 04 | -|--04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +04:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ---- SCANRANGELOCATIONS NODE 2: @@ -2072,16 +2172,18 @@ PLAN-ROOT SINK | order by: tinyint_col ASC | 00:UNION +| pass-through-operands: 04 | -|--04:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +04:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // UNION DISTINCT in subquery @@ -2102,19 +2204,21 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -04:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--04:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ---- SCANRANGELOCATIONS NODE 2: @@ -2142,24 +2246,26 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 05 | -|--05:SCAN HDFS [functional.alltypestiny] -| partitions=1/4 files=1 size=115B -| -09:AGGREGATE [FINALIZE] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] -| -04:AGGREGATE [STREAMING] -| group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month -| -01:UNION -| -|--03:SCAN HDFS [functional.alltypestiny] +|--09:AGGREGATE [FINALIZE] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 08:EXCHANGE [HASH(id,bool_col,tinyint_col,smallint_col,int_col,bigint_col,float_col,double_col,date_string_col,string_col,timestamp_col,year,month)] +| | +| 04:AGGREGATE [STREAMING] +| | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month +| | +| 01:UNION +| | pass-through-operands: all +| | +| |--03:SCAN HDFS [functional.alltypestiny] +| | partitions=1/4 files=1 size=115B +| | +| 02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B | -02:SCAN HDFS [functional.alltypestiny] +05:SCAN HDFS [functional.alltypestiny] partitions=1/4 files=1 size=115B ==== // UNION ALL in subquery with a WHERE condition in the outer select. @@ -2174,6 +2280,7 @@ where x.int_col < 5 and x.bool_col = false PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--04:AGGREGATE [FINALIZE] | | output: count(*) @@ -2201,6 +2308,7 @@ PLAN-ROOT SINK 09:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--08:AGGREGATE [FINALIZE] | | output: count:merge(*) @@ -2282,12 +2390,14 @@ select int_col, string_col, bool_col, float_col from functional.alltypestiny PLAN-ROOT SINK | 03:UNION +| pass-through-operands: all | |--02:AGGREGATE [FINALIZE] | | group by: 1, 'a', null, f | | | 00:UNION | | constant-operands=2 +| | pass-through-operands: all | | | 01:SCAN HDFS [functional.alltypestiny] | partitions=4/4 files=4 size=460B @@ -2300,22 +2410,24 @@ PLAN-ROOT SINK 07:EXCHANGE [UNPARTITIONED] | 03:UNION +| pass-through-operands: all | -|--04:SCAN HDFS [functional.alltypestiny] +|--06:AGGREGATE [FINALIZE] +| | group by: 1, 'a', null, f +| | +| 05:EXCHANGE [HASH(1,'a',null,f)] +| | +| 02:AGGREGATE [STREAMING] +| | group by: 1, 'a', null, f +| | +| 00:UNION +| | constant-operands=2 +| | pass-through-operands: all +| | +| 01:SCAN HDFS [functional.alltypestiny] | partitions=4/4 files=4 size=460B | -06:AGGREGATE [FINALIZE] -| group by: 1, 'a', null, f -| -05:EXCHANGE [HASH(1,'a',null,f)] -| -02:AGGREGATE [STREAMING] -| group by: 1, 'a', null, f -| -00:UNION -| constant-operands=2 -| -01:SCAN HDFS [functional.alltypestiny] +04:SCAN HDFS [functional.alltypestiny] partitions=4/4 files=4 size=460B ==== // UNION ALL/DISTINCT with mixed constant selects and non-constant selects and nested unions @@ -2335,12 +2447,14 @@ PLAN-ROOT SINK | 05:UNION | constant-operands=1 +| pass-through-operands: all | 04:AGGREGATE [FINALIZE] | group by: 500 | 00:UNION | constant-operands=2 +| pass-through-operands: 02 | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -2357,6 +2471,7 @@ PLAN-ROOT SINK | 05:UNION | constant-operands=1 +| pass-through-operands: all | 09:AGGREGATE [FINALIZE] | group by: 500 @@ -2368,6 +2483,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=2 +| pass-through-operands: 07 | |--03:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -2436,12 +2552,14 @@ select int_col, string_col, bool_col, float_col from functional.alltypessmall PLAN-ROOT SINK | 03:UNION +| pass-through-operands: all | |--02:AGGREGATE [FINALIZE] | | group by: 1, 'a', null, f | | | 00:UNION | | constant-operands=2 +| | pass-through-operands: all | | | 01:SCAN HDFS [functional.alltypestiny] | partitions=4/4 files=4 size=460B @@ -2454,23 +2572,25 @@ PLAN-ROOT SINK 07:EXCHANGE [UNPARTITIONED] | 03:UNION +| pass-through-operands: all | -|--04:SCAN HDFS [functional.alltypessmall] -| partitions=4/4 files=4 size=6.32KB -| -06:AGGREGATE [FINALIZE] -| group by: 1, 'a', null, f -| -05:EXCHANGE [HASH(1,'a',null,f)] -| -02:AGGREGATE [STREAMING] -| group by: 1, 'a', null, f -| -00:UNION -| constant-operands=2 +|--06:AGGREGATE [FINALIZE] +| | group by: 1, 'a', null, f +| | +| 05:EXCHANGE [HASH(1,'a',null,f)] +| | +| 02:AGGREGATE [STREAMING] +| | group by: 1, 'a', null, f +| | +| 00:UNION +| | constant-operands=2 +| | pass-through-operands: all +| | +| 01:SCAN HDFS [functional.alltypestiny] +| partitions=4/4 files=4 size=460B | -01:SCAN HDFS [functional.alltypestiny] - partitions=4/4 files=4 size=460B +04:SCAN HDFS [functional.alltypessmall] + partitions=4/4 files=4 size=6.32KB ==== # all union output slots are being materialized even though none is referenced by # the enclosing scope @@ -2503,6 +2623,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=3 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypes] | partitions=24/24 files=24 size=478.45KB @@ -2530,6 +2651,7 @@ PLAN-ROOT SINK | 00:UNION | constant-operands=3 +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypes] | partitions=24/24 files=24 size=478.45KB @@ -2540,7 +2662,7 @@ PLAN-ROOT SINK # UNION ALL in subquery with a WHERE condition in the outer select; # Where clause conjuncts are used as scan predicates and for partition pruning. select x.int_col, x.bool_col, x.month from - (select * from functional.alltypestiny where year=2009 + (select * from functional.alltypestiny where year=2009 union all select * from functional.alltypestiny where year=2009) x where x.int_col < 5 and x.bool_col = false and x.month = 1 @@ -2548,6 +2670,7 @@ where x.int_col < 5 and x.bool_col = false and x.month = 1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -2562,6 +2685,7 @@ PLAN-ROOT SINK 03:EXCHANGE [UNPARTITIONED] | 00:UNION +| pass-through-operands: all | |--02:SCAN HDFS [functional.alltypestiny] | partitions=1/4 files=1 size=115B @@ -2656,9 +2780,6 @@ PLAN-ROOT SINK 00:UNION | constant-operands=1 | -|--01:SCAN HDFS [functional.alltypestiny] -| partitions=4/4 files=4 size=460B -| |--06:HASH JOIN [INNER JOIN, PARTITIONED] | | hash predicates: a.id = b.id | | runtime filters: RF000 <- b.id @@ -2674,18 +2795,21 @@ PLAN-ROOT SINK | partitions=4/4 files=4 size=460B | runtime filters: RF000 -> a.id | -08:AGGREGATE [FINALIZE] -| output: sum:merge(int_col) -| group by: bigint_col -| -07:EXCHANGE [HASH(bigint_col)] -| -03:AGGREGATE [STREAMING] -| output: sum(int_col) -| group by: bigint_col +|--08:AGGREGATE [FINALIZE] +| | output: sum:merge(int_col) +| | group by: bigint_col +| | +| 07:EXCHANGE [HASH(bigint_col)] +| | +| 03:AGGREGATE [STREAMING] +| | output: sum(int_col) +| | group by: bigint_col +| | +| 02:SCAN HDFS [functional.alltypes] +| partitions=1/24 files=1 size=18.12KB | -02:SCAN HDFS [functional.alltypes] - partitions=1/24 files=1 size=18.12KB +01:SCAN HDFS [functional.alltypestiny] + partitions=4/4 files=4 size=460B ==== # Test union merging only unpartitioned inputs. select count(id), sum(bigint_col) from functional.alltypes @@ -2799,6 +2923,34 @@ PLAN-ROOT SINK 00:UNION | constant-operands=1 | +|--10:HASH JOIN [INNER JOIN, PARTITIONED] +| | hash predicates: a.id = b.id +| | runtime filters: RF000 <- b.id +| | +| |--17:EXCHANGE [HASH(b.id)] +| | | +| | 09:SCAN HDFS [functional.alltypestiny b] +| | partitions=4/4 files=4 size=460B +| | +| 16:EXCHANGE [HASH(a.id)] +| | +| 08:SCAN HDFS [functional.alltypestiny a] +| partitions=4/4 files=4 size=460B +| runtime filters: RF000 -> a.id +| +|--15:AGGREGATE [FINALIZE] +| | output: sum:merge(int_col) +| | group by: bigint_col +| | +| 14:EXCHANGE [HASH(bigint_col)] +| | +| 07:AGGREGATE [STREAMING] +| | output: sum(int_col) +| | group by: bigint_col +| | +| 06:SCAN HDFS [functional.alltypes] +| partitions=1/24 files=1 size=18.12KB +| |--05:SCAN HDFS [functional.alltypestiny] | partitions=4/4 files=4 size=460B | @@ -2814,46 +2966,18 @@ PLAN-ROOT SINK | 03:SCAN HDFS [functional.alltypessmall] | partitions=4/4 files=4 size=6.32KB | -|--18:EXCHANGE [RANDOM] -| | -| 12:AGGREGATE [FINALIZE] -| | output: count:merge(id), sum:merge(bigint_col) -| | -| 11:EXCHANGE [UNPARTITIONED] -| | -| 02:AGGREGATE -| | output: count(id), sum(bigint_col) -| | -| 01:SCAN HDFS [functional.alltypes] -| partitions=24/24 files=24 size=478.45KB -| -|--10:HASH JOIN [INNER JOIN, PARTITIONED] -| | hash predicates: a.id = b.id -| | runtime filters: RF000 <- b.id -| | -| |--17:EXCHANGE [HASH(b.id)] -| | | -| | 09:SCAN HDFS [functional.alltypestiny b] -| | partitions=4/4 files=4 size=460B -| | -| 16:EXCHANGE [HASH(a.id)] -| | -| 08:SCAN HDFS [functional.alltypestiny a] -| partitions=4/4 files=4 size=460B -| runtime filters: RF000 -> a.id +18:EXCHANGE [RANDOM] | -15:AGGREGATE [FINALIZE] -| output: sum:merge(int_col) -| group by: bigint_col +12:AGGREGATE [FINALIZE] +| output: count:merge(id), sum:merge(bigint_col) | -14:EXCHANGE [HASH(bigint_col)] +11:EXCHANGE [UNPARTITIONED] | -07:AGGREGATE [STREAMING] -| output: sum(int_col) -| group by: bigint_col +02:AGGREGATE +| output: count(id), sum(bigint_col) | -06:SCAN HDFS [functional.alltypes] - partitions=1/24 files=1 size=18.12KB +01:SCAN HDFS [functional.alltypes] + partitions=24/24 files=24 size=478.45KB ==== # IMPALA-3450: limits on union nodes are reflected in cardinality estimates. The test for # this is embedded in PlannerTestBase.java and is not visible in these plans, as they only @@ -2863,6 +2987,7 @@ select * from tpch.lineitem UNION ALL (select * from tpch.lineitem) LIMIT 1 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: all | limit: 1 | |--02:SCAN HDFS [tpch.lineitem] @@ -2880,6 +3005,7 @@ PLAN-ROOT SINK | limit: 1 | 00:UNION +| pass-through-operands: all | |--02:SCAN HDFS [tpch.lineitem] | partitions=1/1 files=1 size=718.94MB @@ -2902,6 +3028,7 @@ where v.id < 10 and v.int_col > 20 PLAN-ROOT SINK | 00:UNION +| pass-through-operands: 01,02 | |--08:SELECT | | predicates: id < 10, int_col > 20 @@ -2946,6 +3073,7 @@ PLAN-ROOT SINK | group by: id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month | 00:UNION +| pass-through-operands: 01,02 | |--08:SELECT | | predicates: id < 10, int_col > 20 @@ -2973,3 +3101,117 @@ PLAN-ROOT SINK partitions=24/24 files=24 size=478.45KB predicates: functional.alltypes.id < 10, functional.alltypes.int_col > 20 ==== +# IMPALA-3678: Both union operands produce rows with non-nullable slots which can be +# passed through. +select kudu_idx from functional_kudu.alltypesagg_idx limit 5 +union all +select count(*) from functional.alltypestiny; +---- PLAN +PLAN-ROOT SINK +| +00:UNION +| pass-through-operands: all +| +|--03:AGGREGATE [FINALIZE] +| | output: count(*) +| | +| 02:SCAN HDFS [functional.alltypestiny] +| partitions=4/4 files=4 size=460B +| +01:SCAN KUDU [functional_kudu.alltypesagg_idx] + limit: 5 +==== +# IMPALA-3678: The Union operands that contain a join should not be passed through, +# because the resulting row contains 2 tuples, instead of one. However, a semi join +# outputs a row with only 1 tuple, so it should be passed through. +select bigint_col from functional.alltypestiny +union +select t1.bigint_col from functional.alltypestiny t1 left semi join + functional.alltypes t2 on t1.bigint_col = t2.bigint_col +union +select t1.bigint_col from functional.alltypestiny t1 left join + functional.alltypes t2 on t1.bigint_col = t2.bigint_col +union +select t1.bigint_col from functional.alltypestiny t1 inner join + functional.alltypes t2 on t1.bigint_col = t2.bigint_col +---- PLAN +PLAN-ROOT SINK +| +11:AGGREGATE [FINALIZE] +| group by: bigint_col +| +00:UNION +| pass-through-operands: 01,04 +| +|--10:HASH JOIN [INNER JOIN] +| | hash predicates: t2.bigint_col = t1.bigint_col +| | runtime filters: RF002 <- t1.bigint_col +| | +| |--08:SCAN HDFS [functional.alltypestiny t1] +| | partitions=4/4 files=4 size=460B +| | +| 09:SCAN HDFS [functional.alltypes t2] +| partitions=24/24 files=24 size=478.45KB +| runtime filters: RF002 -> t2.bigint_col +| +|--07:HASH JOIN [RIGHT OUTER JOIN] +| | hash predicates: t2.bigint_col = t1.bigint_col +| | runtime filters: RF001 <- t1.bigint_col +| | +| |--05:SCAN HDFS [functional.alltypestiny t1] +| | partitions=4/4 files=4 size=460B +| | +| 06:SCAN HDFS [functional.alltypes t2] +| partitions=24/24 files=24 size=478.45KB +| runtime filters: RF001 -> t2.bigint_col +| +|--04:HASH JOIN [RIGHT SEMI JOIN] +| | hash predicates: t2.bigint_col = t1.bigint_col +| | runtime filters: RF000 <- t1.bigint_col +| | +| |--02:SCAN HDFS [functional.alltypestiny t1] +| | partitions=4/4 files=4 size=460B +| | +| 03:SCAN HDFS [functional.alltypes t2] +| partitions=24/24 files=24 size=478.45KB +| runtime filters: RF000 -> t2.bigint_col +| +01:SCAN HDFS [functional.alltypestiny] + partitions=4/4 files=4 size=460B +==== +# IMPALA-3678: union in a subplan - passthrough should be disabled. +select count(c.c_custkey), count(v.tot_price) +from tpch_nested_parquet.customer c, ( + select sum(o_totalprice) tot_price from c.c_orders + union + select sum(o_totalprice) tot_price from c.c_orders) v; +---- PLAN +PLAN-ROOT SINK +| +10:AGGREGATE [FINALIZE] +| output: count(c.c_custkey), count(tot_price) +| +01:SUBPLAN +| +|--09:NESTED LOOP JOIN [CROSS JOIN] +| | +| |--02:SINGULAR ROW SRC +| | +| 08:AGGREGATE [FINALIZE] +| | group by: tot_price +| | +| 03:UNION +| | +| |--07:AGGREGATE [FINALIZE] +| | | output: sum(o_totalprice) +| | | +| | 06:UNNEST [c.c_orders] +| | +| 05:AGGREGATE [FINALIZE] +| | output: sum(o_totalprice) +| | +| 04:UNNEST [c.c_orders] +| +00:SCAN HDFS [tpch_nested_parquet.customer c] + partitions=1/1 files=4 size=292.36MB +====
http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/a50c3440/testdata/workloads/functional-planner/queries/PlannerTest/with-clause.test ---------------------------------------------------------------------- diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/with-clause.test b/testdata/workloads/functional-planner/queries/PlannerTest/with-clause.test index e0d2d8c..69105c7 100644 --- a/testdata/workloads/functional-planner/queries/PlannerTest/with-clause.test +++ b/testdata/workloads/functional-planner/queries/PlannerTest/with-clause.test @@ -68,18 +68,18 @@ PLAN-ROOT SINK | 00:UNION | -|--01:SCAN HDFS [functional.alltypes] -| partitions=24/24 files=24 size=478.45KB -| |--05:EXCHANGE [RANDOM] | | | 03:UNION | constant-operands=2 | -04:EXCHANGE [RANDOM] +|--04:EXCHANGE [RANDOM] +| | +| 02:UNION +| constant-operands=1 | -02:UNION - constant-operands=1 +01:SCAN HDFS [functional.alltypes] + partitions=24/24 files=24 size=478.45KB ==== # Multiple views in with-clause. All views are used in a join. with t1 as (select int_col x, bigint_col y from functional.alltypes), http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/a50c3440/testdata/workloads/functional-query/queries/QueryTest/nested-types-subplan.test ---------------------------------------------------------------------- diff --git a/testdata/workloads/functional-query/queries/QueryTest/nested-types-subplan.test b/testdata/workloads/functional-query/queries/QueryTest/nested-types-subplan.test index 168a6e3..fa494ab 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/nested-types-subplan.test +++ b/testdata/workloads/functional-query/queries/QueryTest/nested-types-subplan.test @@ -576,3 +576,15 @@ where c_custkey = 1 ---- TYPES BIGINT,BIGINT ==== +---- QUERY +# IMPALA-3678: union in a subplan - passthrough should be disabled. +select count(c.c_custkey), count(v.tot_price) +from tpch_nested_parquet.customer c, ( +select sum(o_totalprice) tot_price from c.c_orders +union +select sum(o_totalprice) tot_price from c.c_orders) v; +---- RESULTS +150000,99996 +---- TYPES +bigint,bigint +==== http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/a50c3440/testdata/workloads/functional-query/queries/QueryTest/union.test ---------------------------------------------------------------------- diff --git a/testdata/workloads/functional-query/queries/QueryTest/union.test b/testdata/workloads/functional-query/queries/QueryTest/union.test index 3ccecd9..ae75c12 100644 --- a/testdata/workloads/functional-query/queries/QueryTest/union.test +++ b/testdata/workloads/functional-query/queries/QueryTest/union.test @@ -16,6 +16,7 @@ int, boolean, tinyint, smallint, int, bigint, float, double, string, string, tim ==== ---- QUERY # Only UNION ALL, no nested unions +# IMPALA-3586: In this test, all union nodes are passed through. select id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month from alltypestiny where year=2009 and month=1 union all select id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, float_col, double_col, date_string_col, string_col, timestamp_col, year, month from alltypestiny where year=2009 and month=1 @@ -1042,11 +1043,81 @@ DOUBLE # there are unmaterialized slots. set optimize_partition_key_scans=1; select t1.int_col -from functional.alltypestiny t1 inner join +from alltypestiny t1 inner join (select count(t2.tinyint_col) = 1337 as boolean_col, - min(t2.year) as int_col from functional.alltypestiny t2) t3 + min(t2.year) as int_col from alltypestiny t2) t3 on (t1.int_col = t3.int_col) ---- RESULTS ---- TYPES INT -===== \ No newline at end of file +===== +---- QUERY +# IMPALA-3586: Verify that limit is obeyed in the passthrough case. This test +# is relevant if the execution is on a single node (if exec_single_node_rows_threshold +# large enough) because there is no exchange node above the union node to impose the +# limit. +select bigint_col from alltypestiny where bigint_col > 0 +union all +(select bigint_col from alltypestiny where bigint_col > 0) +limit 1 +---- RESULTS +10 +---- TYPES +bigint +===== +---- QUERY +# IMPALA-3586: Input tuples that have non-nullable slots. Both operands should be passed +# through by the union node. +select count(*) from alltypestiny +union all +select count(*) from alltypestiny +---- RESULTS +8 +8 +---- TYPES +bigint +===== +---- QUERY +# IMPALA-3586: Both operands are not passed through. +select bigint_col + 1 from alltypestiny +union distinct +select bigint_col + 1 from alltypestiny +---- RESULTS +1 +11 +---- TYPES +bigint +===== +---- QUERY +# IMPALA-3586: One operand is passed through, the other is not. +select bigint_col + 1 from alltypestiny +union distinct +select bigint_col from alltypestiny +---- RESULTS +11 +10 +0 +1 +---- TYPES +bigint +===== +---- QUERY +# IMPALA-3678: The union operands that contain a join should not be passed through, +# because the resulting row contains 2 tuples, instead of one. However, a semi join +# outputs a row with only 1 tuple, so it should be passed through. +select bigint_col from alltypestiny +union +select t1.bigint_col from alltypestiny t1 left semi join + alltypes t2 on t1.bigint_col = t2.bigint_col +union +select t1.bigint_col from alltypestiny t1 left join + alltypes t2 on t1.bigint_col = t2.bigint_col +union +select t1.bigint_col from alltypestiny t1 inner join + alltypes t2 on t1.bigint_col = t2.bigint_col +---- RESULTS +10 +0 +---- TYPES +bigint +===== http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/a50c3440/tests/query_test/test_queries.py ---------------------------------------------------------------------- diff --git a/tests/query_test/test_queries.py b/tests/query_test/test_queries.py index d8e1f65..d875cda 100644 --- a/tests/query_test/test_queries.py +++ b/tests/query_test/test_queries.py @@ -75,6 +75,19 @@ class TestQueries(ImpalaTestSuite): def test_union(self, vector): self.run_test_case('QueryTest/union', vector) + # IMPALA-3586: The passthrough and materialized children are interleaved. The batch + # size is small to test the transition between materialized and passthrough children. + query_string = ("select count(c) from ( " + "select bigint_col + 1 as c from functional.alltypes limit 15 " + "union all " + "select bigint_col as c from functional.alltypes limit 15 " + "union all " + "select bigint_col + 1 as c from functional.alltypes limit 15 " + "union all " + "(select bigint_col as c from functional.alltypes limit 15)) t") + vector.get_value('exec_option')['batch_size'] = 10 + result = self.execute_query(query_string, vector.get_value('exec_option')) + assert result.data[0] == '60' def test_sort(self, vector): if vector.get_value('table_format').file_format == 'hbase':
