mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Cleanup win testcase to always be deterministic
Also remove some whitespace
This commit is contained in:
@ -11,7 +11,7 @@ drop view if exists v1;
|
||||
--echo # # Parser tests
|
||||
--echo # ########################################################################
|
||||
--echo #
|
||||
--echo # Check what happens when one attempts to use window function without OVER clause
|
||||
--echo # Check what happens when one attempts to use window function without OVER clause
|
||||
create table t1 (a int, b int);
|
||||
insert into t1 values (1,1),(2,2);
|
||||
|
||||
@ -21,7 +21,7 @@ select row_number() from t1;
|
||||
select rank() from t1;
|
||||
|
||||
--echo # Attempt to use window function in the WHERE clause
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select * from t1 where 1=rank() over (order by a);
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select * from t1 where 1>row_number() over (partition by b order by a);
|
||||
@ -47,16 +47,16 @@ select a, b, x, row_number() over (partition by a order by x) from t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (pk int primary key, a int, b int);
|
||||
insert into t1 values
|
||||
insert into t1 values
|
||||
(1, 10, 22),
|
||||
(2, 11, 21),
|
||||
(3, 12, 20),
|
||||
(4, 13, 19),
|
||||
(5, 14, 18);
|
||||
|
||||
select
|
||||
pk, a, b,
|
||||
row_number() over (order by a),
|
||||
select
|
||||
pk, a, b,
|
||||
row_number() over (order by a),
|
||||
row_number() over (order by b)
|
||||
from t1;
|
||||
|
||||
@ -66,7 +66,7 @@ drop table t1;
|
||||
--echo # Try RANK() function
|
||||
--echo #
|
||||
create table t2 (
|
||||
pk int primary key,
|
||||
pk int primary key,
|
||||
a int
|
||||
);
|
||||
|
||||
@ -82,7 +82,9 @@ insert into t2 values
|
||||
( 9 , 4),
|
||||
(10 , 4);
|
||||
|
||||
--sorted_result
|
||||
select pk, a, rank() over (order by a) from t2;
|
||||
--sorted_result
|
||||
select pk, a, rank() over (order by a desc) from t2;
|
||||
|
||||
drop table t2;
|
||||
@ -98,45 +100,45 @@ insert into t1 select a+1,1 from t0;
|
||||
update t1 set c=2 where pk not in (1,2,3,4);
|
||||
select * from t1;
|
||||
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
rows between 2 preceding and 2 following) as CNT
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
rows between 1 preceding and 2 following) as CNT
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, c,
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
rows between 2 preceding and current row) as CNT
|
||||
rows between 2 preceding and current row) as CNT
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk,c,
|
||||
select
|
||||
pk,c,
|
||||
count(*) over (partition by c order by pk rows
|
||||
between 1 following and 2 following) as CNT
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk,c,
|
||||
select
|
||||
pk,c,
|
||||
count(*) over (partition by c order by pk rows
|
||||
between 2 preceding and 1 preceding) as CNT
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, c,
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk
|
||||
rows between current row and 1 following) as CNT
|
||||
rows between current row and 1 following) as CNT
|
||||
from t1;
|
||||
|
||||
--echo # Check ORDER BY DESC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (partition by c order by pk desc
|
||||
rows between 2 preceding and 2 following) as CNT
|
||||
from t1;
|
||||
@ -155,197 +157,197 @@ insert into t1 select a+1,1 from t0;
|
||||
update t1 set c=2 where pk not in (1,2,3,4);
|
||||
select * from t1;
|
||||
|
||||
select
|
||||
select
|
||||
pk, c,
|
||||
count(*) over w1 as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk
|
||||
window w1 as (partition by c order by pk
|
||||
rows between 2 preceding and 2 following);
|
||||
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w1 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk);
|
||||
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w1 order by pk rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c);
|
||||
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c), w2 as (w1 order by pk);
|
||||
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over w3 as CNT
|
||||
from t1
|
||||
window
|
||||
w1 as (partition by c),
|
||||
w1 as (partition by c),
|
||||
w2 as (w1 order by pk),
|
||||
w3 as (w2 rows between 2 preceding and 2 following);
|
||||
|
||||
--error ER_WRONG_WINDOW_SPEC_NAME
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over w as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk
|
||||
window w1 as (partition by c order by pk
|
||||
rows between 2 preceding and 2 following);
|
||||
|
||||
--error ER_DUP_WINDOW_NAME
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c), w1 as (order by pk);
|
||||
|
||||
--error ER_WRONG_WINDOW_SPEC_NAME
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c), w2 as (w partition by c order by pk);
|
||||
|
||||
--error ER_PARTITION_LIST_IN_REFERENCING_WINDOW_SPEC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c), w2 as (w1 partition by c order by pk);
|
||||
|
||||
--error ER_ORDER_LIST_IN_REFERENCING_WINDOW_SPEC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk), w2 as (w1 order by pk);
|
||||
|
||||
--error ER_WINDOW_FRAME_IN_REFERENCED_WINDOW_SPEC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over w3 as CNT
|
||||
from t1
|
||||
window
|
||||
w1 as (partition by c),
|
||||
w1 as (partition by c),
|
||||
w2 as (w1 order by pk rows between 3 preceding and 2 following),
|
||||
w3 as (w2 rows between 2 preceding and 2 following);
|
||||
|
||||
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over w1 as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk
|
||||
window w1 as (partition by c order by pk
|
||||
rows between unbounded following and 2 following);
|
||||
|
||||
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w1 rows between 2 preceding and unbounded preceding) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk);
|
||||
|
||||
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w1 order by pk rows between current row and 2 preceding) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c);
|
||||
|
||||
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
count(*) over (w2 rows between 2 following and current row) as CNT
|
||||
from t1
|
||||
window w1 as (partition by c), w2 as (w1 order by pk);
|
||||
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select
|
||||
pk, c
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select
|
||||
pk, c
|
||||
from t1 where rank() over w1 > 2
|
||||
window w1 as (partition by c order by pk);
|
||||
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select
|
||||
c, max(pk) as m
|
||||
from t1
|
||||
from t1
|
||||
group by c + rank() over w1
|
||||
window w1 as (order by m);
|
||||
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select
|
||||
c, max(pk) as m, rank() over w1 as r
|
||||
from t1
|
||||
c, max(pk) as m, rank() over w1 as r
|
||||
from t1
|
||||
group by c+r
|
||||
window w1 as (order by m);
|
||||
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
||||
select
|
||||
c, max(pk) as m, rank() over w1 as r
|
||||
from t1
|
||||
from t1
|
||||
group by c having c+r > 3
|
||||
window w1 as (order by m);
|
||||
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
select
|
||||
c, max(pk) as m, rank() over w1 as r,
|
||||
rank() over (partition by r+1 order by m)
|
||||
from t1
|
||||
c, max(pk) as m, rank() over w1 as r,
|
||||
rank() over (partition by r+1 order by m)
|
||||
from t1
|
||||
group by c
|
||||
window w1 as (order by m);
|
||||
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
select
|
||||
c, max(pk) as m, rank() over w1 as r,
|
||||
rank() over (partition by m order by r)
|
||||
from t1
|
||||
c, max(pk) as m, rank() over w1 as r,
|
||||
rank() over (partition by m order by r)
|
||||
from t1
|
||||
group by c
|
||||
window w1 as (order by m);
|
||||
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
||||
select
|
||||
c, max(pk) as m, rank() over w1 as r, dense_rank() over w2 as dr
|
||||
from t1
|
||||
c, max(pk) as m, rank() over w1 as r, dense_rank() over w2 as dr
|
||||
from t1
|
||||
group by c
|
||||
window w1 as (order by m), w2 as (partition by r order by m);
|
||||
|
||||
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
||||
select
|
||||
pk, c,
|
||||
row_number() over (partition by c order by pk
|
||||
range between unbounded preceding and current row) as r
|
||||
select
|
||||
pk, c,
|
||||
row_number() over (partition by c order by pk
|
||||
range between unbounded preceding and current row) as r
|
||||
from t1;
|
||||
|
||||
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
rank() over w1 as r
|
||||
from t1
|
||||
window w1 as (partition by c order by pk
|
||||
window w1 as (partition by c order by pk
|
||||
rows between 2 preceding and 2 following);
|
||||
|
||||
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
dense_rank() over (partition by c order by pk
|
||||
rows between 1 preceding and 1 following) as r
|
||||
from t1;
|
||||
|
||||
--error ER_NO_ORDER_LIST_IN_WINDOW_SPEC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
rank() over w1 as r
|
||||
from t1
|
||||
window w1 as (partition by c);
|
||||
|
||||
--error ER_NO_ORDER_LIST_IN_WINDOW_SPEC
|
||||
select
|
||||
pk, c,
|
||||
select
|
||||
pk, c,
|
||||
dense_rank() over (partition by c) as r
|
||||
from t1;
|
||||
|
||||
@ -358,11 +360,11 @@ drop table t0,t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 (part_id int, pk int, a int);
|
||||
insert into t2 select
|
||||
insert into t2 select
|
||||
if(a<5, 0, 1), a, if(a<5, NULL, 1) from t0;
|
||||
select * from t2;
|
||||
|
||||
select
|
||||
select
|
||||
part_id, pk, a,
|
||||
count(a) over (partition by part_id order by pk
|
||||
rows between 1 preceding and 1 following) as CNT
|
||||
@ -371,11 +373,11 @@ from t2;
|
||||
drop table t0, t2;
|
||||
|
||||
--echo #
|
||||
--echo # RANGE-type bounds
|
||||
--echo # RANGE-type bounds
|
||||
--echo #
|
||||
|
||||
create table t3 (
|
||||
pk int,
|
||||
pk int,
|
||||
val int
|
||||
);
|
||||
|
||||
@ -388,25 +390,25 @@ insert into t3 values
|
||||
(5, 2),
|
||||
(6, 2);
|
||||
|
||||
select
|
||||
pk,
|
||||
select
|
||||
pk,
|
||||
val,
|
||||
count(val) over (order by val
|
||||
range between current row and
|
||||
current row)
|
||||
count(val) over (order by val
|
||||
range between current row and
|
||||
current row)
|
||||
as CNT
|
||||
from t3;
|
||||
|
||||
insert into t3 values
|
||||
insert into t3 values
|
||||
(7, 3),
|
||||
(8, 3);
|
||||
|
||||
select
|
||||
pk,
|
||||
select
|
||||
pk,
|
||||
val,
|
||||
count(val) over (order by val
|
||||
range between current row and
|
||||
current row)
|
||||
count(val) over (order by val
|
||||
range between current row and
|
||||
current row)
|
||||
as CNT
|
||||
from t3;
|
||||
|
||||
@ -440,50 +442,50 @@ insert into t4 values
|
||||
(5678, 207, 3),
|
||||
(5678, 208, 3);
|
||||
|
||||
select
|
||||
select
|
||||
part_id,
|
||||
pk,
|
||||
pk,
|
||||
val,
|
||||
count(val) over (partition by part_id
|
||||
order by val
|
||||
range between current row and
|
||||
current row)
|
||||
order by val
|
||||
range between current row and
|
||||
current row)
|
||||
as CNT
|
||||
from t4;
|
||||
|
||||
--echo #
|
||||
--echo # Try RANGE UNBOUNDED PRECEDING | FOLLOWING
|
||||
--echo #
|
||||
select
|
||||
select
|
||||
part_id,
|
||||
pk,
|
||||
pk,
|
||||
val,
|
||||
count(val) over (partition by part_id
|
||||
order by val
|
||||
range between unbounded preceding and
|
||||
current row)
|
||||
order by val
|
||||
range between unbounded preceding and
|
||||
current row)
|
||||
as CNT
|
||||
from t4;
|
||||
|
||||
select
|
||||
select
|
||||
part_id,
|
||||
pk,
|
||||
pk,
|
||||
val,
|
||||
count(val) over (partition by part_id
|
||||
order by val
|
||||
range between current row and
|
||||
unbounded following)
|
||||
order by val
|
||||
range between current row and
|
||||
unbounded following)
|
||||
as CNT
|
||||
from t4;
|
||||
|
||||
select
|
||||
select
|
||||
part_id,
|
||||
pk,
|
||||
pk,
|
||||
val,
|
||||
count(val) over (partition by part_id
|
||||
order by val
|
||||
range between unbounded preceding and
|
||||
unbounded following)
|
||||
order by val
|
||||
range between unbounded preceding and
|
||||
unbounded following)
|
||||
as CNT
|
||||
from t4;
|
||||
|
||||
@ -502,12 +504,12 @@ insert into t1 values
|
||||
( 6 , 2, 64),
|
||||
( 7 , 2, 128),
|
||||
( 8 , 2, 16);
|
||||
|
||||
|
||||
select pk, a, b,
|
||||
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as bit_or
|
||||
from t1;
|
||||
|
||||
--echo # Extra ROWS n PRECEDING tests
|
||||
--echo # Extra ROWS n PRECEDING tests
|
||||
select pk, a, b,
|
||||
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as bit_or
|
||||
from t1;
|
||||
@ -515,8 +517,8 @@ drop table t1;
|
||||
|
||||
|
||||
create table t2 (
|
||||
pk int,
|
||||
a int,
|
||||
pk int,
|
||||
a int,
|
||||
b int
|
||||
);
|
||||
|
||||
@ -546,7 +548,7 @@ select pk, a, b,
|
||||
bit_or(b) over (partition by a order by pk ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) as bit_or
|
||||
from t2;
|
||||
|
||||
--echo # Check CURRENT ROW
|
||||
--echo # Check CURRENT ROW
|
||||
|
||||
select pk, a, b,
|
||||
bit_or(b) over (partition by a order by pk ROWS BETWEEN CURRENT ROW AND CURRENT ROW) as bit_or
|
||||
@ -563,12 +565,12 @@ create table t1 (
|
||||
a int
|
||||
);
|
||||
|
||||
insert into t1 values
|
||||
insert into t1 values
|
||||
(10, 1, 1),
|
||||
(10, 2, 2),
|
||||
(10, 3, 4),
|
||||
(10, 4, 8),
|
||||
(10, 5,26),
|
||||
(10, 5,26),
|
||||
(10, 6,27),
|
||||
(10, 7,40),
|
||||
(10, 8,71),
|
||||
@ -577,64 +579,64 @@ insert into t1 values
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 10 FOLLOWING) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a DESC
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 10 FOLLOWING) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 1 FOLLOWING) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 10 PRECEDING) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a DESC
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 10 PRECEDING) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 1 PRECEDING) as cnt
|
||||
from t1;
|
||||
|
||||
# Try bottom bound
|
||||
# Try bottom bound
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN 1 PRECEDING
|
||||
RANGE BETWEEN 1 PRECEDING
|
||||
AND CURRENT ROW) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a DESC
|
||||
RANGE BETWEEN 1 PRECEDING
|
||||
RANGE BETWEEN 1 PRECEDING
|
||||
AND CURRENT ROW) as cnt
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(a) over (ORDER BY a
|
||||
RANGE BETWEEN 1 FOLLOWING
|
||||
RANGE BETWEEN 1 FOLLOWING
|
||||
AND 3 FOLLOWING) as cnt
|
||||
from t1;
|
||||
|
||||
@ -660,7 +662,7 @@ select
|
||||
part_id, pk, a,
|
||||
count(a) over (PARTITION BY part_id
|
||||
ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 10 FOLLOWING) as cnt
|
||||
from t1;
|
||||
|
||||
@ -668,7 +670,7 @@ select
|
||||
pk, a,
|
||||
count(a) over (PARTITION BY part_id
|
||||
ORDER BY a
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
RANGE BETWEEN UNBOUNDED PRECEDING
|
||||
AND 1 PRECEDING) as cnt
|
||||
from t1;
|
||||
|
||||
@ -689,17 +691,17 @@ insert into t1 values (1, 1.22);
|
||||
insert into t1 values (1, 3.33);
|
||||
|
||||
select
|
||||
a,
|
||||
count(col1) over (order by a
|
||||
range between 0.1 preceding
|
||||
and 0.1 following)
|
||||
a,
|
||||
count(col1) over (order by a
|
||||
range between 0.1 preceding
|
||||
and 0.1 following)
|
||||
from t1;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # RANGE-type frames and NULL values
|
||||
--echo #
|
||||
--echo #
|
||||
--echo # RANGE-type frames and NULL values
|
||||
--echo #
|
||||
create table t1 (
|
||||
pk int,
|
||||
a int,
|
||||
@ -716,17 +718,17 @@ insert into t1 values (7, 13 ,1);
|
||||
insert into t1 values (8, 14 ,1);
|
||||
|
||||
|
||||
select
|
||||
pk, a,
|
||||
count(b) over (order by a
|
||||
range between 2 preceding
|
||||
select
|
||||
pk, a,
|
||||
count(b) over (order by a
|
||||
range between 2 preceding
|
||||
and 2 following) as CNT
|
||||
from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo #
|
||||
--echo # Try ranges that have bound1 > bound2. The standard actually allows them
|
||||
--echo #
|
||||
--echo #
|
||||
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
@ -741,7 +743,7 @@ select
|
||||
count(*) over (partition by c
|
||||
order by pk
|
||||
rows between 1 preceding
|
||||
and 2 preceding)
|
||||
and 2 preceding)
|
||||
as cnt
|
||||
from t1;
|
||||
|
||||
@ -769,7 +771,7 @@ select
|
||||
count(*) over (partition by c
|
||||
order by pk
|
||||
range between 1 preceding
|
||||
and 2 preceding)
|
||||
and 2 preceding)
|
||||
as cnt
|
||||
from t1;
|
||||
drop table t0, t1;
|
||||
@ -782,7 +784,7 @@ create table t1 (a int, b int, c varchar(32));
|
||||
insert into t1 values (1,1,'foo');
|
||||
insert into t1 values (2,2,'bar');
|
||||
--error ER_RANGE_FRAME_NEEDS_SIMPLE_ORDERBY
|
||||
select
|
||||
select
|
||||
count(*) over (order by a,b
|
||||
range between unbounded preceding and current row)
|
||||
from t1;
|
||||
@ -819,7 +821,7 @@ select
|
||||
from t1;
|
||||
|
||||
--echo #
|
||||
--echo # EXCLUDE clause is parsed but not supported
|
||||
--echo # EXCLUDE clause is parsed but not supported
|
||||
--echo #
|
||||
|
||||
--error ER_FRAME_EXCLUSION_NOT_SUPPORTED
|
||||
@ -852,15 +854,15 @@ from t1;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # Window function in grouping query
|
||||
--echo #
|
||||
--echo #
|
||||
--echo # Window function in grouping query
|
||||
--echo #
|
||||
|
||||
create table t1 (
|
||||
username varchar(32),
|
||||
amount int
|
||||
);
|
||||
|
||||
|
||||
insert into t1 values
|
||||
('user1',1),
|
||||
('user1',5),
|
||||
@ -868,19 +870,19 @@ insert into t1 values
|
||||
('user2',10),
|
||||
('user2',20),
|
||||
('user2',30);
|
||||
|
||||
select
|
||||
|
||||
select
|
||||
username,
|
||||
sum(amount) as s,
|
||||
sum(amount) as s,
|
||||
rank() over (order by s desc)
|
||||
from t1
|
||||
group by username;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # mdev-9719: Window function in prepared statement
|
||||
--echo #
|
||||
--echo #
|
||||
--echo # mdev-9719: Window function in prepared statement
|
||||
--echo #
|
||||
|
||||
create table t1(a int, b int, x char(32));
|
||||
insert into t1 values (2, 10, 'xx');
|
||||
@ -888,31 +890,31 @@ insert into t1 values (2, 10, 'zz');
|
||||
insert into t1 values (2, 20, 'yy');
|
||||
insert into t1 values (3, 10, 'xxx');
|
||||
insert into t1 values (3, 20, 'vvv');
|
||||
|
||||
|
||||
prepare stmt from 'select a, row_number() over (partition by a order by b) from t1';
|
||||
--sorted_result
|
||||
execute stmt;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # mdev-9754: Window name resolution in prepared statement
|
||||
--echo #
|
||||
--echo #
|
||||
--echo # mdev-9754: Window name resolution in prepared statement
|
||||
--echo #
|
||||
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
|
||||
|
||||
create table t1 (pk int, c int);
|
||||
insert into t1 select a+1,1 from t0;
|
||||
update t1 set c=2 where pk not in (1,2,3,4);
|
||||
select * from t1;
|
||||
|
||||
prepare stmt from
|
||||
'select
|
||||
pk, c,
|
||||
|
||||
prepare stmt from
|
||||
'select
|
||||
pk, c,
|
||||
count(*) over w1 as CNT
|
||||
from t1
|
||||
window w1 as (partition by c order by pk
|
||||
window w1 as (partition by c order by pk
|
||||
rows between 2 preceding and 2 following)';
|
||||
execute stmt;
|
||||
|
||||
@ -999,10 +1001,10 @@ insert into t1 values
|
||||
select sum(b) over (partition by a order by b,pk
|
||||
rows between unbounded preceding and current row) as c1,
|
||||
avg(b) over (w1 rows between 1 preceding and 1 following) as c2,
|
||||
sum(c) over (w2 rows between 1 preceding and 1 following) as c5,
|
||||
sum(c) over (w2 rows between 1 preceding and 1 following) as c5,
|
||||
avg(b) over (w1 rows between 5 preceding and 5 following) as c3,
|
||||
sum(b) over (w1 rows between 1 preceding and 1 following) as c4
|
||||
from t1
|
||||
from t1
|
||||
window w1 as (partition by a order by b,pk),
|
||||
w2 as (partition by b order by c,pk);
|
||||
|
||||
@ -1014,47 +1016,47 @@ drop table t1;
|
||||
--echo #
|
||||
|
||||
create table t1 (a int, b int, c int);
|
||||
insert into t1 values
|
||||
insert into t1 values
|
||||
(1,3,1),
|
||||
(2,2,1),
|
||||
(3,1,1);
|
||||
|
||||
--echo # Check using counters
|
||||
flush status;
|
||||
select
|
||||
select
|
||||
rank() over (partition by c order by a),
|
||||
rank() over (partition by c order by b)
|
||||
from t1;
|
||||
show status like '%sort%';
|
||||
|
||||
flush status;
|
||||
select
|
||||
select
|
||||
rank() over (partition by c order by a),
|
||||
rank() over (partition by c order by a)
|
||||
from t1;
|
||||
show status like '%sort%';
|
||||
|
||||
# Check using EXPLAIN FORMAT=JSON
|
||||
# Check using EXPLAIN FORMAT=JSON
|
||||
explain format=json
|
||||
select
|
||||
select
|
||||
rank() over (partition by c order by a),
|
||||
rank() over (partition by c order by a)
|
||||
from t1;
|
||||
|
||||
explain format=json
|
||||
select
|
||||
select
|
||||
rank() over (order by a),
|
||||
row_number() over (order by a)
|
||||
from t1;
|
||||
|
||||
explain format=json
|
||||
select
|
||||
select
|
||||
rank() over (partition by c order by a),
|
||||
count(*) over (partition by c)
|
||||
from t1;
|
||||
|
||||
explain format=json
|
||||
select
|
||||
select
|
||||
count(*) over (partition by c),
|
||||
rank() over (partition by c order by a)
|
||||
from t1;
|
||||
@ -1094,7 +1096,7 @@ drop table t1;
|
||||
--echo # Try window functions that are not directly present in the select list
|
||||
--echo #
|
||||
create table t1 (a int, b int);
|
||||
insert into t1 values
|
||||
insert into t1 values
|
||||
(1,3),
|
||||
(2,2),
|
||||
(3,1);
|
||||
@ -1128,13 +1130,13 @@ insert into t1 values (1, 2, 2);
|
||||
insert into t1 values (1, 3, 4);
|
||||
insert into t1 values (1, 4, 8);
|
||||
|
||||
select
|
||||
select
|
||||
pk, a,
|
||||
sum(a) over (order by pk rows between 0 preceding and current row)
|
||||
from t1;
|
||||
|
||||
select
|
||||
pk, a,
|
||||
select
|
||||
pk, a,
|
||||
sum(a) over (order by pk rows between 1 preceding and 0 preceding)
|
||||
from t1;
|
||||
|
||||
@ -1142,20 +1144,20 @@ insert into t1 values (200, 1, 1);
|
||||
insert into t1 values (200, 2, 2);
|
||||
insert into t1 values (200, 3, 4);
|
||||
insert into t1 values (200, 4, 8);
|
||||
select
|
||||
select
|
||||
part_id, pk, a,
|
||||
sum(a) over (partition by part_id order by pk rows between 0 preceding and current row)
|
||||
from t1;
|
||||
|
||||
select
|
||||
part_id, pk, a,
|
||||
select
|
||||
part_id, pk, a,
|
||||
sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding)
|
||||
from t1;
|
||||
|
||||
drop table t1;
|
||||
--echo #
|
||||
--echo # MDEV-9780, The "DISTINCT must not bet converted into GROUP BY when
|
||||
--echo # window functions are present" part
|
||||
--echo # window functions are present" part
|
||||
--echo #
|
||||
|
||||
create table t1 (part_id int, a int);
|
||||
@ -1178,8 +1180,8 @@ select distinct rank() over (partition by part_id order by a) from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9893: Window functions with different ORDER BY lists,
|
||||
--echo # one of these lists containing an expression
|
||||
--echo # MDEV-9893: Window functions with different ORDER BY lists,
|
||||
--echo # one of these lists containing an expression
|
||||
--echo #
|
||||
|
||||
create table t1 (s1 int, s2 char(5));
|
||||
@ -1189,11 +1191,11 @@ insert into t1 values (3,null);
|
||||
insert into t1 values (4,'a');
|
||||
insert into t1 values (2,'b');
|
||||
insert into t1 values (-1,'');
|
||||
|
||||
select
|
||||
|
||||
select
|
||||
*,
|
||||
ROW_NUMBER() OVER (order by s1),
|
||||
CUME_DIST() OVER (order by -s1)
|
||||
CUME_DIST() OVER (order by -s1)
|
||||
from t1;
|
||||
|
||||
drop table t1;
|
||||
@ -1221,7 +1223,7 @@ CREATE TABLE `orders` (
|
||||
`o_orderkey` int(11) NOT NULL,
|
||||
`o_custkey` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`o_orderkey`)
|
||||
) DEFAULT CHARSET=latin1;
|
||||
) DEFAULT CHARSET=latin1;
|
||||
|
||||
INSERT INTO `orders` VALUES (59908,242);
|
||||
INSERT INTO `orders` VALUES (59940,238);
|
||||
@ -1233,7 +1235,7 @@ SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey)
|
||||
DROP table orders;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10842: window functions with the same order column
|
||||
--echo # MDEV-10842: window functions with the same order column
|
||||
--echo # but different directions
|
||||
--echo #
|
||||
|
||||
|
Reference in New Issue
Block a user