fix ORDER BY after window fuctions over Distributed

This commit is contained in:
Alexander Kuzmenkov 2021-05-27 19:05:49 +03:00
parent bdc5b97d02
commit 6cccb0992a
3 changed files with 39 additions and 5 deletions

View File

@ -1296,9 +1296,12 @@ void InterpreterSelectQuery::executeImpl(QueryPlan & query_plan, const BlockInpu
*/ */
if (from_aggregation_stage) if (from_aggregation_stage)
executeMergeSorted(query_plan, "for ORDER BY"); executeMergeSorted(query_plan, "after aggregation stage for ORDER BY");
else if (!expressions.first_stage && !expressions.need_aggregate && !(query.group_by_with_totals && !aggregate_final)) else if (!expressions.first_stage
executeMergeSorted(query_plan, "for ORDER BY"); && !expressions.need_aggregate
&& !expressions.has_window
&& !(query.group_by_with_totals && !aggregate_final))
executeMergeSorted(query_plan, "for ORDER BY, without aggregation");
else /// Otherwise, just sort. else /// Otherwise, just sort.
executeOrder( executeOrder(
query_plan, query_plan,

View File

@ -10,7 +10,9 @@ select max(identity(dummy + 1)) over () from remote('127.0.0.{1,2}', system, one
1 1
1 1
drop table if exists t_01568; drop table if exists t_01568;
create table t_01568 engine Memory as select intDiv(number, 3) p, number from numbers(9); create table t_01568 engine Memory as
select intDiv(number, 3) p, modulo(number, 3) o, number
from numbers(9);
select sum(number) over w, max(number) over w from t_01568 window w as (partition by p); select sum(number) over w, max(number) over w from t_01568 window w as (partition by p);
3 2 3 2
3 2 3 2
@ -57,4 +59,26 @@ select groupArray(groupArray(number)) over (rows unbounded preceding) from remot
[[0,3,6],[1,4,7]] [[0,3,6],[1,4,7]]
[[0,3,6],[1,4,7],[2,5,8]] [[0,3,6],[1,4,7],[2,5,8]]
select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=2; -- { serverError 48 } select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=2; -- { serverError 48 }
-- proper ORDER BY w/window functions
select p, o, count() over (partition by p)
from remote('127.0.0.{1,2}', '', t_01568)
order by p, o;
0 0 6
0 0 6
0 1 6
0 1 6
0 2 6
0 2 6
1 0 6
1 0 6
1 1 6
1 1 6
1 2 6
1 2 6
2 0 6
2 0 6
2 1 6
2 1 6
2 2 6
2 2 6
drop table t_01568; drop table t_01568;

View File

@ -9,7 +9,9 @@ select max(identity(dummy + 1)) over () from remote('127.0.0.{1,2}', system, one
drop table if exists t_01568; drop table if exists t_01568;
create table t_01568 engine Memory as select intDiv(number, 3) p, number from numbers(9); create table t_01568 engine Memory as
select intDiv(number, 3) p, modulo(number, 3) o, number
from numbers(9);
select sum(number) over w, max(number) over w from t_01568 window w as (partition by p); select sum(number) over w, max(number) over w from t_01568 window w as (partition by p);
@ -22,4 +24,9 @@ select groupArray(groupArray(number)) over (rows unbounded preceding) from remot
select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=1; select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=1;
select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=2; -- { serverError 48 } select groupArray(groupArray(number)) over (rows unbounded preceding) from remote('127.0.0.{1,2}', '', t_01568) group by mod(number, 3) settings distributed_group_by_no_merge=2; -- { serverError 48 }
-- proper ORDER BY w/window functions
select p, o, count() over (partition by p)
from remote('127.0.0.{1,2}', '', t_01568)
order by p, o;
drop table t_01568; drop table t_01568;