diff options
author | Michael Widenius <monty@mariadb.org> | 2018-03-09 14:05:35 +0200 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2018-03-29 13:59:44 +0300 |
commit | a7abddeffa6a760ce948c2dfb007cdf3f1a369d5 (patch) | |
tree | 70eb743fa965a17380bbc0ac88ae79ca1075b896 /mysql-test/r/win.result | |
parent | ab1941266c59a19703a74b5593cf3f508a5752d7 (diff) | |
download | mariadb-git-a7abddeffa6a760ce948c2dfb007cdf3f1a369d5.tar.gz |
Create 'main' test directory and move 't' and 'r' there
Diffstat (limited to 'mysql-test/r/win.result')
-rw-r--r-- | mysql-test/r/win.result | 3304 |
1 files changed, 0 insertions, 3304 deletions
diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result deleted file mode 100644 index dd4d09bb1eb..00000000000 --- a/mysql-test/r/win.result +++ /dev/null @@ -1,3304 +0,0 @@ -drop table if exists t1,t2; -drop view if exists v1; -# ######################################################################## -# # Parser tests -# ######################################################################## -# -# 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); -select row_number() from t1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from t1' at line 1 -select rank() from t1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from t1' at line 1 -# Attempt to use window function in the WHERE clause -select * from t1 where 1=rank() over (order by a); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -select * from t1 where 1>row_number() over (partition by b order by a); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -drop table t1; -# ######################################################################## -# # Functionality tests -# ######################################################################## -# -# Check if ROW_NUMBER() works in basic cases -create table t1(a int, b int, x char(32)); -insert into t1 values (2, 10, 'xx'); -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'); -select a, row_number() over (partition by a order by b) from t1; -a row_number() over (partition by a order by b) -2 1 -2 2 -2 3 -3 1 -3 2 -select a, b, x, row_number() over (partition by a order by x) from t1; -a b x row_number() over (partition by a order by x) -2 10 xx 1 -2 10 zz 3 -2 20 yy 2 -3 10 xxx 2 -3 20 vvv 1 -drop table t1; -create table t1 (pk int primary key, a int, b int); -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), -row_number() over (order by b) -from t1; -pk a b row_number() over (order by a) row_number() over (order by b) -1 10 22 1 5 -2 11 21 2 4 -3 12 20 3 3 -4 13 19 4 2 -5 14 18 5 1 -drop table t1; -# -# Try RANK() function -# -create table t2 ( -pk int primary key, -a int -); -insert into t2 values -( 1 , 0), -( 2 , 0), -( 3 , 1), -( 4 , 1), -( 8 , 2), -( 5 , 2), -( 6 , 2), -( 7 , 2), -( 9 , 4), -(10 , 4); -select pk, a, rank() over (order by a) from t2; -pk a rank() over (order by a) -1 0 1 -10 4 9 -2 0 1 -3 1 3 -4 1 3 -5 2 5 -6 2 5 -7 2 5 -8 2 5 -9 4 9 -select pk, a, rank() over (order by a desc) from t2; -pk a rank() over (order by a desc) -1 0 9 -10 4 1 -2 0 9 -3 1 7 -4 1 7 -5 2 3 -6 2 3 -7 2 3 -8 2 3 -9 4 1 -drop table t2; -# -# Try Aggregates as window functions. With frames. -# -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; -pk c -1 1 -2 1 -3 1 -4 1 -5 2 -6 2 -7 2 -8 2 -9 2 -10 2 -select -pk, c, -count(*) over (partition by c order by pk -rows between 2 preceding and 2 following) as CNT -from t1; -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -select -pk, c, -count(*) over (partition by c order by pk -rows between 1 preceding and 2 following) as CNT -from t1; -pk c CNT -1 1 3 -2 1 4 -3 1 3 -4 1 2 -5 2 3 -6 2 4 -7 2 4 -8 2 4 -9 2 3 -10 2 2 -select -pk, c, -count(*) over (partition by c order by pk -rows between 2 preceding and current row) as CNT -from t1; -pk c CNT -1 1 1 -2 1 2 -3 1 3 -4 1 3 -5 2 1 -6 2 2 -7 2 3 -8 2 3 -9 2 3 -10 2 3 -select -pk,c, -count(*) over (partition by c order by pk rows -between 1 following and 2 following) as CNT -from t1; -pk c CNT -1 1 2 -2 1 2 -3 1 1 -4 1 0 -5 2 2 -6 2 2 -7 2 2 -8 2 2 -9 2 1 -10 2 0 -select -pk,c, -count(*) over (partition by c order by pk rows -between 2 preceding and 1 preceding) as CNT -from t1; -pk c CNT -1 1 0 -2 1 1 -3 1 2 -4 1 2 -5 2 0 -6 2 1 -7 2 2 -8 2 2 -9 2 2 -10 2 2 -select -pk, c, -count(*) over (partition by c order by pk -rows between current row and 1 following) as CNT -from t1; -pk c CNT -1 1 2 -2 1 2 -3 1 2 -4 1 1 -5 2 2 -6 2 2 -7 2 2 -8 2 2 -9 2 2 -10 2 1 -# Check ORDER BY DESC -select -pk, c, -count(*) over (partition by c order by pk desc -rows between 2 preceding and 2 following) as CNT -from t1; -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -drop table t0,t1; -# -# Resolution of window names -# -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; -pk c -1 1 -2 1 -3 1 -4 1 -5 2 -6 2 -7 2 -8 2 -9 2 -10 2 -select -pk, c, -count(*) over w1 as CNT -from t1 -window w1 as (partition by c order by pk -rows between 2 preceding and 2 following); -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -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); -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -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); -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -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); -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -select -pk, c, -count(*) over w3 as CNT -from t1 -window -w1 as (partition by c), -w2 as (w1 order by pk), -w3 as (w2 rows between 2 preceding and 2 following); -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -select -pk, c, -count(*) over w as CNT -from t1 -window w1 as (partition by c order by pk -rows between 2 preceding and 2 following); -ERROR HY000: Window specification with name 'w' is not defined -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 HY000: Multiple window specifications with the same name 'w1' -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 HY000: Window specification with name 'w' is not defined -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 HY000: Window specification referencing another one 'w1' cannot contain partition list -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 HY000: Referenced window specification 'w1' already contains order list -select -pk, c, -count(*) over w3 as CNT -from t1 -window -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 HY000: Referenced window specification 'w2' cannot contain window frame -select -pk, c, -count(*) over w1 as CNT -from t1 -window w1 as (partition by c order by pk -rows between unbounded following and 2 following); -ERROR HY000: Unacceptable combination of window frame bound specifications -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 HY000: Unacceptable combination of window frame bound specifications -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 HY000: Unacceptable combination of window frame bound specifications -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 HY000: Unacceptable combination of window frame bound specifications -select -pk, c -from t1 where rank() over w1 > 2 -window w1 as (partition by c order by pk); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -select -c, max(pk) as m -from t1 -group by c + rank() over w1 -window w1 as (order by m); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -select -c, max(pk) as m, rank() over w1 as r -from t1 -group by c+r -window w1 as (order by m); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -select -c, max(pk) as m, rank() over w1 as r -from t1 -group by c having c+r > 3 -window w1 as (order by m); -ERROR HY000: Window function is allowed only in SELECT list and ORDER BY clause -select -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 HY000: Window function is not allowed in window specification -select -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 HY000: Window function is not allowed in window specification -select -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 HY000: Window function is not allowed in window specification -select -pk, c, -row_number() over (partition by c order by pk -range between unbounded preceding and current row) as r -from t1; -ERROR HY000: Window frame is not allowed with 'row_number' -select -pk, c, -rank() over w1 as r -from t1 -window w1 as (partition by c order by pk -rows between 2 preceding and 2 following); -ERROR HY000: Window frame is not allowed with 'rank' -select -pk, c, -dense_rank() over (partition by c order by pk -rows between 1 preceding and 1 following) as r -from t1; -ERROR HY000: Window frame is not allowed with 'dense_rank' -select -pk, c, -rank() over w1 as r -from t1 -window w1 as (partition by c); -ERROR HY000: No order list in window specification for 'rank' -select -pk, c, -dense_rank() over (partition by c) as r -from t1; -ERROR HY000: No order list in window specification for 'dense_rank' -drop table t0,t1; -# -# MDEV-9634: Window function produces incorrect value -# -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 -if(a<5, 0, 1), a, if(a<5, NULL, 1) from t0; -select * from t2; -part_id pk a -0 0 NULL -0 1 NULL -0 2 NULL -0 3 NULL -0 4 NULL -1 5 1 -1 6 1 -1 7 1 -1 8 1 -1 9 1 -select -part_id, pk, a, -count(a) over (partition by part_id order by pk -rows between 1 preceding and 1 following) as CNT -from t2; -part_id pk a CNT -0 0 NULL 0 -0 1 NULL 0 -0 2 NULL 0 -0 3 NULL 0 -0 4 NULL 0 -1 5 1 2 -1 6 1 3 -1 7 1 3 -1 8 1 3 -1 9 1 2 -drop table t0, t2; -# -# RANGE-type bounds -# -create table t3 ( -pk int, -val int -); -insert into t3 values -(0, 1), -(1, 1), -(2, 1), -(3, 2), -(4, 2), -(5, 2), -(6, 2); -select -pk, -val, -count(val) over (order by val -range between current row and -current row) -as CNT -from t3; -pk val CNT -0 1 3 -1 1 3 -2 1 3 -3 2 4 -4 2 4 -5 2 4 -6 2 4 -insert into t3 values -(7, 3), -(8, 3); -select -pk, -val, -count(val) over (order by val -range between current row and -current row) -as CNT -from t3; -pk val CNT -0 1 3 -1 1 3 -2 1 3 -3 2 4 -4 2 4 -5 2 4 -6 2 4 -7 3 2 -8 3 2 -drop table t3; -# Now, check with PARTITION BY -create table t4 ( -part_id int, -pk int, -val int -); -insert into t4 values -(1234, 100, 1), -(1234, 101, 1), -(1234, 102, 1), -(1234, 103, 2), -(1234, 104, 2), -(1234, 105, 2), -(1234, 106, 2), -(1234, 107, 3), -(1234, 108, 3), -(5678, 200, 1), -(5678, 201, 1), -(5678, 202, 1), -(5678, 203, 2), -(5678, 204, 2), -(5678, 205, 2), -(5678, 206, 2), -(5678, 207, 3), -(5678, 208, 3); -select -part_id, -pk, -val, -count(val) over (partition by part_id -order by val -range between current row and -current row) -as CNT -from t4; -part_id pk val CNT -1234 100 1 3 -1234 101 1 3 -1234 102 1 3 -1234 103 2 4 -1234 104 2 4 -1234 105 2 4 -1234 106 2 4 -1234 107 3 2 -1234 108 3 2 -5678 200 1 3 -5678 201 1 3 -5678 202 1 3 -5678 203 2 4 -5678 204 2 4 -5678 205 2 4 -5678 206 2 4 -5678 207 3 2 -5678 208 3 2 -# -# Try RANGE UNBOUNDED PRECEDING | FOLLOWING -# -select -part_id, -pk, -val, -count(val) over (partition by part_id -order by val -range between unbounded preceding and -current row) -as CNT -from t4; -part_id pk val CNT -1234 100 1 3 -1234 101 1 3 -1234 102 1 3 -1234 103 2 7 -1234 104 2 7 -1234 105 2 7 -1234 106 2 7 -1234 107 3 9 -1234 108 3 9 -5678 200 1 3 -5678 201 1 3 -5678 202 1 3 -5678 203 2 7 -5678 204 2 7 -5678 205 2 7 -5678 206 2 7 -5678 207 3 9 -5678 208 3 9 -select -part_id, -pk, -val, -count(val) over (partition by part_id -order by val -range between current row and -unbounded following) -as CNT -from t4; -part_id pk val CNT -1234 100 1 9 -1234 101 1 9 -1234 102 1 9 -1234 103 2 6 -1234 104 2 6 -1234 105 2 6 -1234 106 2 6 -1234 107 3 2 -1234 108 3 2 -5678 200 1 9 -5678 201 1 9 -5678 202 1 9 -5678 203 2 6 -5678 204 2 6 -5678 205 2 6 -5678 206 2 6 -5678 207 3 2 -5678 208 3 2 -select -part_id, -pk, -val, -count(val) over (partition by part_id -order by val -range between unbounded preceding and -unbounded following) -as CNT -from t4; -part_id pk val CNT -1234 100 1 9 -1234 101 1 9 -1234 102 1 9 -1234 103 2 9 -1234 104 2 9 -1234 105 2 9 -1234 106 2 9 -1234 107 3 9 -1234 108 3 9 -5678 200 1 9 -5678 201 1 9 -5678 202 1 9 -5678 203 2 9 -5678 204 2 9 -5678 205 2 9 -5678 206 2 9 -5678 207 3 9 -5678 208 3 9 -drop table t4; -# -# MDEV-9695: Wrong window frame when using RANGE BETWEEN N FOLLOWING AND PRECEDING -# -create table t1 (pk int, a int, b int); -insert into t1 values -( 1 , 0, 1), -( 2 , 0, 2), -( 3 , 1, 4), -( 4 , 1, 8), -( 5 , 2, 32), -( 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; -pk a b bit_or -1 0 1 3 -2 0 2 3 -3 1 4 12 -4 1 8 12 -5 2 32 96 -6 2 64 224 -7 2 128 208 -8 2 16 144 -# 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; -pk a b bit_or -1 0 1 0 -2 0 2 1 -3 1 4 0 -4 1 8 4 -5 2 32 0 -6 2 64 32 -7 2 128 64 -8 2 16 128 -drop table t1; -create table t2 ( -pk int, -a int, -b int -); -insert into t2 values -( 1, 0, 1), -( 2, 0, 2), -( 3, 0, 4), -( 4, 0, 8), -( 5, 1, 16), -( 6, 1, 32), -( 7, 1, 64), -( 8, 1, 128), -( 9, 2, 256), -(10, 2, 512), -(11, 2, 1024), -(12, 2, 2048); -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 t2; -pk a b bit_or -1 0 1 0 -2 0 2 1 -3 0 4 2 -4 0 8 4 -5 1 16 0 -6 1 32 16 -7 1 64 32 -8 1 128 64 -9 2 256 0 -10 2 512 256 -11 2 1024 512 -12 2 2048 1024 -select pk, a, b, -bit_or(b) over (partition by a order by pk ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING) as bit_or -from t2; -pk a b bit_or -1 0 1 0 -2 0 2 0 -3 0 4 1 -4 0 8 2 -5 1 16 0 -6 1 32 0 -7 1 64 16 -8 1 128 32 -9 2 256 0 -10 2 512 0 -11 2 1024 256 -12 2 2048 512 -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; -pk a b bit_or -1 0 1 0 -2 0 2 1 -3 0 4 3 -4 0 8 6 -5 1 16 0 -6 1 32 16 -7 1 64 48 -8 1 128 96 -9 2 256 0 -10 2 512 256 -11 2 1024 768 -12 2 2048 1536 -# 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 -from t2; -pk a b bit_or -1 0 1 1 -2 0 2 2 -3 0 4 4 -4 0 8 8 -5 1 16 16 -6 1 32 32 -7 1 64 64 -8 1 128 128 -9 2 256 256 -10 2 512 512 -11 2 1024 1024 -12 2 2048 2048 -drop table t2; -# -# Try RANGE PRECEDING|FOLLWING n -# -create table t1 ( -part_id int, -pk int, -a int -); -insert into t1 values -(10, 1, 1), -(10, 2, 2), -(10, 3, 4), -(10, 4, 8), -(10, 5,26), -(10, 6,27), -(10, 7,40), -(10, 8,71), -(10, 9,72); -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 10 FOLLOWING) as cnt -from t1; -pk a cnt -1 1 4 -2 2 4 -3 4 4 -4 8 4 -5 26 6 -6 27 6 -7 40 7 -8 71 9 -9 72 9 -select -pk, a, -count(a) over (ORDER BY a DESC -RANGE BETWEEN UNBOUNDED PRECEDING -AND 10 FOLLOWING) as cnt -from t1; -pk a cnt -1 1 9 -2 2 9 -3 4 9 -4 8 9 -5 26 5 -6 27 5 -7 40 3 -8 71 2 -9 72 2 -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 1 FOLLOWING) as cnt -from t1; -pk a cnt -1 1 2 -2 2 2 -3 4 3 -4 8 4 -5 26 6 -6 27 6 -7 40 7 -8 71 9 -9 72 9 -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 10 PRECEDING) as cnt -from t1; -pk a cnt -1 1 0 -2 2 0 -3 4 0 -4 8 0 -5 26 4 -6 27 4 -7 40 6 -8 71 7 -9 72 7 -select -pk, a, -count(a) over (ORDER BY a DESC -RANGE BETWEEN UNBOUNDED PRECEDING -AND 10 PRECEDING) as cnt -from t1; -pk a cnt -1 1 5 -2 2 5 -3 4 5 -4 8 5 -5 26 3 -6 27 3 -7 40 2 -8 71 0 -9 72 0 -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 1 PRECEDING) as cnt -from t1; -pk a cnt -1 1 0 -2 2 1 -3 4 2 -4 8 3 -5 26 4 -6 27 5 -7 40 6 -8 71 7 -9 72 8 -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN 1 PRECEDING -AND CURRENT ROW) as cnt -from t1; -pk a cnt -1 1 1 -2 2 2 -3 4 1 -4 8 1 -5 26 1 -6 27 2 -7 40 1 -8 71 1 -9 72 2 -select -pk, a, -count(a) over (ORDER BY a DESC -RANGE BETWEEN 1 PRECEDING -AND CURRENT ROW) as cnt -from t1; -pk a cnt -1 1 2 -2 2 1 -3 4 1 -4 8 1 -5 26 2 -6 27 1 -7 40 1 -8 71 2 -9 72 1 -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN 1 FOLLOWING -AND 3 FOLLOWING) as cnt -from t1; -pk a cnt -1 1 2 -2 2 1 -3 4 0 -4 8 0 -5 26 1 -6 27 0 -7 40 0 -8 71 1 -9 72 0 -# Try CURRENT ROW with[out] DESC -select -pk, a, -count(a) over (ORDER BY a -RANGE BETWEEN CURRENT ROW -AND 1 FOLLOWING) as cnt -from t1; -pk a cnt -1 1 2 -2 2 1 -3 4 1 -4 8 1 -5 26 2 -6 27 1 -7 40 1 -8 71 2 -9 72 1 -select -pk, a, -count(a) over (order by a desc -range between current row -and 1 following) as cnt -from t1; -pk a cnt -1 1 1 -2 2 2 -3 4 1 -4 8 1 -5 26 1 -6 27 2 -7 40 1 -8 71 1 -9 72 2 -insert into t1 select 22, pk, a from t1; -select -part_id, pk, a, -count(a) over (PARTITION BY part_id -ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 10 FOLLOWING) as cnt -from t1; -part_id pk a cnt -10 1 1 4 -10 2 2 4 -10 3 4 4 -10 4 8 4 -10 5 26 6 -10 6 27 6 -10 7 40 7 -10 8 71 9 -10 9 72 9 -22 1 1 4 -22 2 2 4 -22 3 4 4 -22 4 8 4 -22 5 26 6 -22 6 27 6 -22 7 40 7 -22 8 71 9 -22 9 72 9 -select -pk, a, -count(a) over (PARTITION BY part_id -ORDER BY a -RANGE BETWEEN UNBOUNDED PRECEDING -AND 1 PRECEDING) as cnt -from t1; -pk a cnt -1 1 0 -2 2 1 -3 4 2 -4 8 3 -5 26 4 -6 27 5 -7 40 6 -8 71 7 -9 72 8 -1 1 0 -2 2 1 -3 4 2 -4 8 3 -5 26 4 -6 27 5 -7 40 6 -8 71 7 -9 72 8 -drop table t1; -# Try a RANGE frame over non-integer datatype: -create table t1 ( -col1 int, -a decimal(5,3) -); -insert into t1 values (1, 0.45); -insert into t1 values (1, 0.5); -insert into t1 values (1, 0.55); -insert into t1 values (1, 1.21); -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) -from t1; -a count(col1) over (order by a -range between 0.1 preceding -and 0.1 following) -0.450 3 -0.500 3 -0.550 3 -1.210 2 -1.220 2 -3.330 1 -drop table t1; -# -# RANGE-type frames and NULL values -# -create table t1 ( -pk int, -a int, -b int -); -insert into t1 values (1, NULL,1); -insert into t1 values (2, NULL,1); -insert into t1 values (3, NULL,1); -insert into t1 values (4, 10 ,1); -insert into t1 values (5, 11 ,1); -insert into t1 values (6, 12 ,1); -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 -and 2 following) as CNT -from t1; -pk a CNT -1 NULL 3 -2 NULL 3 -3 NULL 3 -4 10 3 -5 11 4 -6 12 5 -7 13 4 -8 14 3 -drop table t1; -# -# Try ranges that have bound1 > bound2. The standard actually allows them -# -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; -pk c -1 1 -2 1 -3 1 -4 1 -5 2 -6 2 -7 2 -8 2 -9 2 -10 2 -select -pk, c, -count(*) over (partition by c -order by pk -rows between 1 preceding -and 2 preceding) -as cnt -from t1; -pk c cnt -1 1 0 -2 1 0 -3 1 0 -4 1 0 -5 2 0 -6 2 0 -7 2 0 -8 2 0 -9 2 0 -10 2 0 -select -pk, c, -sum(c) over (partition by c -order by pk -rows between 1 preceding -and 2 preceding) -as sum -from t1; -pk c sum -1 1 NULL -2 1 NULL -3 1 NULL -4 1 NULL -5 2 NULL -6 2 NULL -7 2 NULL -8 2 NULL -9 2 NULL -10 2 NULL -select -pk, c, -sum(c) over (partition by c -order by pk -rows between 2 following -and 1 following) -as sum -from t1; -pk c sum -1 1 NULL -2 1 NULL -3 1 NULL -4 1 NULL -5 2 NULL -6 2 NULL -7 2 NULL -8 2 NULL -9 2 NULL -10 2 NULL -select -pk, c, -count(*) over (partition by c -order by pk -range between 1 preceding -and 2 preceding) -as cnt -from t1; -pk c cnt -1 1 0 -2 1 0 -3 1 0 -4 1 0 -5 2 0 -6 2 0 -7 2 0 -8 2 0 -9 2 0 -10 2 0 -drop table t0, t1; -# -# Error checking for frame bounds -# -create table t1 (a int, b int, c varchar(32)); -insert into t1 values (1,1,'foo'); -insert into t1 values (2,2,'bar'); -select -count(*) over (order by a,b -range between unbounded preceding and current row) -from t1; -ERROR HY000: RANGE-type frame requires ORDER BY clause with single sort key -select -count(*) over (order by c -range between unbounded preceding and current row) -from t1; -ERROR HY000: Numeric datatype is required for RANGE-type frame -select -count(*) over (order by a -range between 'abcd' preceding and current row) -from t1; -ERROR HY000: Numeric datatype is required for RANGE-type frame -select -count(*) over (order by a -range between current row and 'foo' following) -from t1; -ERROR HY000: Numeric datatype is required for RANGE-type frame -# Try range frame with invalid bounds -select -count(*) over (order by a -rows between 0.5 preceding and current row) -from t1; -ERROR HY000: Integer is required for ROWS-type frame -select -count(*) over (order by a -rows between current row and 3.14 following) -from t1; -ERROR HY000: Integer is required for ROWS-type frame -# -# EXCLUDE clause is parsed but not supported -# -select -count(*) over (order by a -rows between 1 preceding and 1 following -exclude current row) -from t1; -ERROR HY000: Frame exclusion is not supported yet -select -count(*) over (order by a -range between 1 preceding and 1 following -exclude ties) -from t1; -ERROR HY000: Frame exclusion is not supported yet -select -count(*) over (order by a -range between 1 preceding and 1 following -exclude group) -from t1; -ERROR HY000: Frame exclusion is not supported yet -select -count(*) over (order by a -rows between 1 preceding and 1 following -exclude no others) -from t1; -count(*) over (order by a -rows between 1 preceding and 1 following -exclude no others) -2 -2 -drop table t1; -# -# Window function in grouping query -# -create table t1 ( -username varchar(32), -amount int -); -insert into t1 values -('user1',1), -('user1',5), -('user1',3), -('user2',10), -('user2',20), -('user2',30); -select -username, -sum(amount) as s, -rank() over (order by s desc) -from t1 -group by username; -username s rank() over (order by s desc) -user1 9 2 -user2 60 1 -drop table t1; -# -# mdev-9719: Window function in prepared statement -# -create table t1(a int, b int, x char(32)); -insert into t1 values (2, 10, 'xx'); -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'; -execute stmt; -a row_number() over (partition by a order by b) -2 1 -2 2 -2 3 -3 1 -3 2 -drop table t1; -# -# mdev-9754: Window name resolution in prepared statement -# -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; -pk c -1 1 -2 1 -3 1 -4 1 -5 2 -6 2 -7 2 -8 2 -9 2 -10 2 -prepare stmt from -'select - pk, c, - count(*) over w1 as CNT -from t1 -window w1 as (partition by c order by pk - rows between 2 preceding and 2 following)'; -execute stmt; -pk c CNT -1 1 3 -2 1 4 -3 1 4 -4 1 3 -5 2 3 -6 2 4 -7 2 5 -8 2 5 -9 2 4 -10 2 3 -drop table t0,t1; -# -# EXPLAIN FORMAT=JSON support for window functions -# -create table t0 (a int); -insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -explain format=json select rank() over (order by a) from t0; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t0.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t0", - "access_type": "ALL", - "rows": 10, - "filtered": 100 - } - } - } - } -} -create table t1 (a int, b int, c int); -insert into t1 select a,a,a from t0; -explain format=json -select -a, -rank() over (order by sum(b)) -from t1 -group by a; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "filesort": { - "sort_key": "t1.a", - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "sum(t1.b)" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 10, - "filtered": 100 - } - } - } - } - } -} -explain format=json -select -a, -rank() over (order by sum(b)) -from t1 -group by a -order by null; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "sum(t1.b)" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 10, - "filtered": 100 - } - } - } - } -} -# -# Check how window function works together with GROUP BY and HAVING -# -select b,max(a) as MX, rank() over (order by b) from t1 group by b having MX in (3,5,7); -b MX rank() over (order by b) -3 3 1 -5 5 2 -7 7 3 -explain format=json -select b,max(a) as MX, rank() over (order by b) from t1 group by b having MX in (3,5,7); -EXPLAIN -{ - "query_block": { - "select_id": 1, - "having_condition": "MX in (3,5,7)", - "filesort": { - "sort_key": "t1.b", - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.b" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 10, - "filtered": 100 - } - } - } - } - } -} -drop table t1; -drop table t0; -# -# Building ordering index for window functions -# -create table t1 ( -pk int primary key, -a int, -b int, -c int -); -insert into t1 values -(101 , 0, 10, 1), -(102 , 0, 10, 2), -(103 , 1, 10, 3), -(104 , 1, 10, 4), -(108 , 2, 10, 5), -(105 , 2, 20, 6), -(106 , 2, 20, 7), -(107 , 2, 20, 8), -(109 , 4, 20, 9), -(110 , 4, 20, 10), -(111 , 5, NULL, 11), -(112 , 5, 1, 12), -(113 , 5, NULL, 13), -(114 , 5, NULL, 14), -(115 , 5, NULL, 15), -(116 , 6, 1, NULL), -(117 , 6, 1, 10), -(118 , 6, 1, 1), -(119 , 6, 1, NULL), -(120 , 6, 1, NULL), -(121 , 6, 1, NULL), -(122 , 6, 1, 2), -(123 , 6, 1, 20), -(124 , 6, 1, -10), -(125 , 6, 1, NULL), -(126 , 6, 1, NULL), -(127 , 6, 1, NULL); -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, -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 -window w1 as (partition by a order by b,pk), -w2 as (partition by b order by c,pk); -c1 c2 c5 c3 c4 -1 1.0000 42 1.0000 1 -1 1.0000 NULL 1.0000 2 -10 1.0000 NULL 1.0000 3 -10 10.0000 3 10.0000 20 -10 10.0000 9 10.0000 20 -10 15.0000 9 17.5000 30 -11 1.0000 NULL 1.0000 3 -12 1.0000 -10 1.0000 2 -2 1.0000 24 1.0000 3 -20 10.0000 12 10.0000 20 -20 10.0000 6 10.0000 20 -20 20.0000 27 20.0000 40 -3 1.0000 -7 1.0000 3 -30 16.6667 13 17.5000 50 -4 1.0000 NULL 1.0000 3 -40 20.0000 19 20.0000 40 -5 1.0000 NULL 1.0000 3 -50 20.0000 21 17.5000 60 -6 1.0000 NULL 1.0000 3 -7 1.0000 13 1.0000 3 -70 20.0000 24 17.5000 40 -8 1.0000 32 1.0000 3 -9 1.0000 -9 1.0000 3 -NULL 1.0000 29 1.0000 1 -NULL NULL 24 1.0000 NULL -NULL NULL 38 1.0000 NULL -NULL NULL 42 1.0000 NULL -drop table t1; -# -# MDEV-9848: Window functions: reuse sorting and/or scanning -# -create table t1 (a int, b int, c int); -insert into t1 values -(1,3,1), -(2,2,1), -(3,1,1); -# Check using counters -flush status; -select -rank() over (partition by c order by a), -rank() over (partition by c order by b) -from t1; -rank() over (partition by c order by a) rank() over (partition by c order by b) -1 3 -2 2 -3 1 -show status like '%sort%'; -Variable_name Value -Sort_merge_passes 0 -Sort_priority_queue_sorts 0 -Sort_range 0 -Sort_rows 6 -Sort_scan 2 -flush status; -select -rank() over (partition by c order by a), -rank() over (partition by c order by a) -from t1; -rank() over (partition by c order by a) rank() over (partition by c order by a) -1 1 -2 2 -3 3 -show status like '%sort%'; -Variable_name Value -Sort_merge_passes 0 -Sort_priority_queue_sorts 0 -Sort_range 0 -Sort_rows 3 -Sort_scan 1 -explain format=json -select -rank() over (partition by c order by a), -rank() over (partition by c order by a) -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.c, t1.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 3, - "filtered": 100 - } - } - } - } -} -explain format=json -select -rank() over (order by a), -row_number() over (order by a) -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 3, - "filtered": 100 - } - } - } - } -} -explain format=json -select -rank() over (partition by c order by a), -count(*) over (partition by c) -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.c, t1.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 3, - "filtered": 100 - } - } - } - } -} -explain format=json -select -count(*) over (partition by c), -rank() over (partition by c order by a) -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.c, t1.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 3, - "filtered": 100 - } - } - } - } -} -drop table t1; -# -# MDEV-9847: Window functions: crash with big_tables=1 -# -create table t1(a int); -insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); -set @tmp=@@big_tables; -set big_tables=1; -select rank() over (order by a) from t1; -rank() over (order by a) -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -set big_tables=@tmp; -drop table t1; -# -# Check if "ORDER BY window_func" works -# -create table t1 (s1 int, s2 char(5)); -insert into t1 values (1,'a'); -insert into t1 values (null,null); -insert into t1 values (1,null); -insert into t1 values (null,'a'); -insert into t1 values (2,'b'); -insert into t1 values (-1,''); -explain format=json -select *, row_number() over (order by s1, s2) as X from t1 order by X desc; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "filesort": { - "sort_key": "row_number() over ( order by t1.s1,t1.s2) desc", - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.s1, t1.s2" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 6, - "filtered": 100 - } - } - } - } - } -} -select *, row_number() over (order by s1, s2) as X from t1 order by X desc; -s1 s2 X -2 b 6 -1 a 5 -1 NULL 4 --1 3 -NULL a 2 -NULL NULL 1 -drop table t1; -# -# Try window functions that are not directly present in the select list -# -create table t1 (a int, b int); -insert into t1 values -(1,3), -(2,2), -(3,1); -select -a, b, -rank() over (order by a), rank() over (order by b), -rank() over (order by a) - rank() over (order by b) as diff -from -t1; -a b rank() over (order by a) rank() over (order by b) diff -1 3 1 3 -2 -2 2 2 2 0 -3 1 3 1 2 -drop table t1; -create table t1 (i int); -insert into t1 values (1),(2); -SELECT MAX(i) OVER (PARTITION BY (i)) FROM t1; -MAX(i) OVER (PARTITION BY (i)) -1 -2 -drop table t1; -# -# Check the 0 in ROWS 0 PRECEDING -# -create table t1 ( -part_id int, -pk int, -a int -); -insert into t1 values (1, 1, 1); -insert into t1 values (1, 2, 2); -insert into t1 values (1, 3, 4); -insert into t1 values (1, 4, 8); -select -pk, a, -sum(a) over (order by pk rows between 0 preceding and current row) -from t1; -pk a sum(a) over (order by pk rows between 0 preceding and current row) -1 1 1 -2 2 2 -3 4 4 -4 8 8 -select -pk, a, -sum(a) over (order by pk rows between 1 preceding and 0 preceding) -from t1; -pk a sum(a) over (order by pk rows between 1 preceding and 0 preceding) -1 1 1 -2 2 3 -3 4 6 -4 8 12 -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 -part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) -from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) -1 1 1 1 -1 2 2 2 -1 3 4 4 -1 4 8 8 -200 1 1 1 -200 2 2 2 -200 3 4 4 -200 4 8 8 -select -part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) -from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) -1 1 1 1 -1 2 2 3 -1 3 4 6 -1 4 8 12 -200 1 1 1 -200 2 2 3 -200 3 4 6 -200 4 8 12 -drop table t1; -# -# MDEV-9780, The "DISTINCT must not bet converted into GROUP BY when -# window functions are present" part -# -create table t1 (part_id int, a int); -insert into t1 values -(100, 1), -(100, 2), -(100, 2), -(100, 3), -(2000, 1), -(2000, 2), -(2000, 3), -(2000, 3), -(2000, 3); -select rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) -1 -2 -2 -4 -1 -2 -3 -3 -3 -select distinct rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) -1 -2 -4 -3 -explain format=json -select distinct rank() over (partition by part_id order by a) from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "duplicate_removal": { - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.part_id, t1.a" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 9, - "filtered": 100 - } - } - } - } - } -} -drop table t1; -# -# MDEV-9893: Window functions with different ORDER BY lists, -# one of these lists containing an expression -# -create table t1 (s1 int, s2 char(5)); -insert into t1 values (1,'a'); -insert into t1 values (null,null); -insert into t1 values (3,null); -insert into t1 values (4,'a'); -insert into t1 values (2,'b'); -insert into t1 values (-1,''); -select -*, -ROW_NUMBER() OVER (order by s1), -CUME_DIST() OVER (order by -s1) -from t1; -s1 s2 ROW_NUMBER() OVER (order by s1) CUME_DIST() OVER (order by -s1) -1 a 3 0.8333333333 -NULL NULL 1 0.1666666667 -3 NULL 5 0.5000000000 -4 a 6 0.3333333333 -2 b 4 0.6666666667 --1 2 1.0000000000 -drop table t1; -# -# MDEV-9925: Wrong result with aggregate function as a window function -# -create table t1 (i int); -insert into t1 values (1),(2); -select i, sum(i) over (partition by i) from t1; -i sum(i) over (partition by i) -1 1 -2 2 -drop table t1; -# -# MDEV-9922: Assertion `!join->only_const_tables() && fsort' failed in int create_sort_index -# -create view v1 as select 1 as i; -select rank() over (order by i) from v1; -rank() over (order by i) -1 -drop view v1; -# -# MDEV-10097: Assertion `count > 0' failed in Item_sum_sum::add_helper(bool) -# -CREATE TABLE `orders` ( -`o_orderkey` int(11) NOT NULL, -`o_custkey` int(11) DEFAULT NULL, -PRIMARY KEY (`o_orderkey`) -) DEFAULT CHARSET=latin1; -INSERT INTO `orders` VALUES (59908,242); -INSERT INTO `orders` VALUES (59940,238); -SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey) -ORDER BY o_custkey -RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) from orders; -o_custkey avg(o_custkey) OVER (PARTITION BY abs(o_custkey) -ORDER BY o_custkey -RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) -242 NULL -238 NULL -DROP table orders; -# -# MDEV-10842: window functions with the same order column -# but different directions -# -create table t1 ( -pk int primary key, -a int, -b int, -c char(10) -); -insert into t1 values -( 1, 0, 1, 'one'), -( 2, 0, 2, 'two'), -( 3, 0, 3, 'three'), -( 4, 1, 1, 'one'), -( 5, 1, 1, 'two'), -( 6, 1, 2, 'three'), -( 7, 2, NULL, 'n_one'), -( 8, 2, 1, 'n_two'), -( 9, 2, 2, 'n_three'), -(10, 2, 0, 'n_four'), -(11, 2, 10, NULL); -select pk, -row_number() over (order by pk desc) as r_desc, -row_number() over (order by pk asc) as r_asc -from t1; -pk r_desc r_asc -1 11 1 -2 10 2 -3 9 3 -4 8 4 -5 7 5 -6 6 6 -7 5 7 -8 4 8 -9 3 9 -10 2 10 -11 1 11 -drop table t1; -# -# MDEV-10874: two window functions with ccompatible sorting -# -create table t1 ( -pk int primary key, -a int, -b int, -c char(10), -d decimal(10, 3), -e real -); -insert into t1 values -( 1, 0, 1, 'one', 0.1, 0.001), -( 2, 0, 2, 'two', 0.2, 0.002), -( 3, 0, 3, 'three', 0.3, 0.003), -( 4, 1, 2, 'three', 0.4, 0.004), -( 5, 1, 1, 'two', 0.5, 0.005), -( 6, 1, 1, 'one', 0.6, 0.006), -( 7, 2, NULL, 'n_one', 0.5, 0.007), -( 8, 2, 1, 'n_two', NULL, 0.008), -( 9, 2, 2, NULL, 0.7, 0.009), -(10, 2, 0, 'n_four', 0.8, 0.010), -(11, 2, 10, NULL, 0.9, NULL); -select pk, a, d, -sum(d) over (partition by a order by pk -ROWS between 1 preceding and current row) as sum_1, -sum(d) over (order by a -ROWS BETWEEN 1 preceding and 2 following) as sum_2 -from t1; -pk a d sum_1 sum_2 -1 0 0.100 0.100 0.600 -2 0 0.200 0.300 1.000 -3 0 0.300 0.500 1.400 -4 1 0.400 0.400 1.800 -5 1 0.500 0.900 2.000 -6 1 0.600 1.100 1.600 -7 2 0.500 0.500 1.800 -8 2 NULL 0.500 2.000 -9 2 0.700 0.700 2.400 -10 2 0.800 1.500 2.400 -11 2 0.900 1.700 1.700 -explain format=json -select pk, a, d, -sum(d) over (partition by a order by pk -ROWS between 1 preceding and current row) as sum_1, -sum(d) over (order by a -ROWS BETWEEN 1 preceding and 2 following) as sum_2 -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.a, t1.pk" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 11, - "filtered": 100 - } - } - } - } -} -select pk, a, d, -sum(d) over (partition by a order by pk desc -ROWS between 1 preceding and current row) as sum_1, -sum(d) over (order by a -ROWS BETWEEN 1 preceding and 2 following) as sum_2 -from t1; -pk a d sum_1 sum_2 -1 0 0.100 0.300 1.400 -2 0 0.200 0.500 1.200 -3 0 0.300 0.300 0.600 -4 1 0.400 0.900 2.600 -5 1 0.500 1.100 2.400 -6 1 0.600 0.600 1.600 -7 2 0.500 0.500 0.500 -8 2 NULL 0.700 1.200 -9 2 0.700 1.500 2.000 -10 2 0.800 1.700 2.400 -11 2 0.900 0.900 2.800 -drop table t1; -# -# MDEV-9941: two window functions with compatible partitions -# -create table t1 ( -a int, -b int, -c int -); -insert into t1 values -(10, 1, 1), -(10, 3, 10), -(10, 1, 10), -(10, 3, 100), -(10, 5, 1000), -(10, 1, 100); -explain format=json -select -a,b,c, -row_number() over (partition by a), -row_number() over (partition by a, b) -from t1; -EXPLAIN -{ - "query_block": { - "select_id": 1, - "window_functions_computation": { - "sorts": { - "filesort": { - "sort_key": "t1.a, t1.b" - } - }, - "temporary_table": { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 6, - "filtered": 100 - } - } - } - } -} -drop table t1; -# -# MDEV-10815: Window Function Expressions Wrong Results -# -create table t(a decimal(35,10), b int); -insert into t(a,b) values(1,1); -insert into t(a,b) values(2,1); -insert into t(a,b) values(0,1); -insert into t(a,b) values(1, 2); -insert into t(a,b) values(1.5,2); -insert into t(a,b) values(3, 2); -insert into t(a,b) values(4.5,2); -select a, b, -sum(t.a) over (partition by t.b order by a) as simple_sum, -sum(t.a) over (partition by t.b order by a) + 1 as sum_and_const, -sum(t.b) over (partition by t.b order by a) + sum(t.a) over (partition by t.b order by a) as sum_and_sum -from t -order by t.b, t.a; -a b simple_sum sum_and_const sum_and_sum -0.0000000000 1 0.0000000000 1.0000000000 1.0000000000 -1.0000000000 1 1.0000000000 2.0000000000 3.0000000000 -2.0000000000 1 3.0000000000 4.0000000000 6.0000000000 -1.0000000000 2 1.0000000000 2.0000000000 3.0000000000 -1.5000000000 2 2.5000000000 3.5000000000 6.5000000000 -3.0000000000 2 5.5000000000 6.5000000000 11.5000000000 -4.5000000000 2 10.0000000000 11.0000000000 18.0000000000 -drop table t; -# -# MDEV-10669: Crash in SELECT with window function used -# -create table t(a decimal(35,10), b int); -insert into t(a,b) values(1,1); -insert into t(a,b) values(2,1); -insert into t(a,b) values(0,1); -SELECT (CASE WHEN sum(t.a) over (partition by t.b)=0 THEN null ELSE null END) AS a FROM t; -a -NULL -NULL -NULL -SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) from t; -ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) -0.00000000000000 -0.00000000000000 -0.00000000000000 -SELECT sum(t.a) over (partition by t.b order by a), -sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) -from t; -sum(t.a) over (partition by t.b order by a) sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) -1.0000000000 1 -3.0000000000 1.7320508075688772 -0.0000000000 0 -drop table t; -# -# MDEV-10868: view definitions with window functions -# -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; -pk c -1 1 -2 1 -3 1 -4 1 -5 2 -6 2 -7 2 -8 2 -9 2 -10 2 -select pk, c, c/count(*) over (partition by c order by pk -rows between 1 preceding and 2 following) as CNT -from t1; -pk c CNT -1 1 0.3333 -2 1 0.2500 -3 1 0.3333 -4 1 0.5000 -5 2 0.6667 -6 2 0.5000 -7 2 0.5000 -8 2 0.5000 -9 2 0.6667 -10 2 1.0000 -create view v1 as select pk, c, c/count(*) over (partition by c order by pk -rows between 1 preceding and 2 following) as CNT -from t1; -show create view v1; -View Create View character_set_client collation_connection -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`pk` AS `pk`,`t1`.`c` AS `c`,`t1`.`c` / count(0) over ( partition by `t1`.`c` order by `t1`.`pk` rows between 1 preceding and 2 following ) AS `CNT` from `t1` latin1 latin1_swedish_ci -select * from v1; -pk c CNT -1 1 0.3333 -2 1 0.2500 -3 1 0.3333 -4 1 0.5000 -5 2 0.6667 -6 2 0.5000 -7 2 0.5000 -8 2 0.5000 -9 2 0.6667 -10 2 1.0000 -select pk, c, c/count(*) over w1 as CNT from t1 -window w1 as (partition by c order by pk rows between 1 preceding and 2 following); -pk c CNT -1 1 0.3333 -2 1 0.2500 -3 1 0.3333 -4 1 0.5000 -5 2 0.6667 -6 2 0.5000 -7 2 0.5000 -8 2 0.5000 -9 2 0.6667 -10 2 1.0000 -create view v2 as select pk, c, c/count(*) over w1 as CNT from t1 -window w1 as (partition by c order by pk rows between 1 preceding and 2 following); -show create view v2; -View Create View character_set_client collation_connection -v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`pk` AS `pk`,`t1`.`c` AS `c`,`t1`.`c` / count(0) over ( partition by `t1`.`c` order by `t1`.`pk` rows between 1 preceding and 2 following ) AS `CNT` from `t1` latin1 latin1_swedish_ci -select * from v2; -pk c CNT -1 1 0.3333 -2 1 0.2500 -3 1 0.3333 -4 1 0.5000 -5 2 0.6667 -6 2 0.5000 -7 2 0.5000 -8 2 0.5000 -9 2 0.6667 -10 2 1.0000 -select pk, c, c/count(*) over w1 as CNT from t1 -window w1 as (partition by c order by pk rows unbounded preceding); -pk c CNT -1 1 1.0000 -2 1 0.5000 -3 1 0.3333 -4 1 0.2500 -5 2 2.0000 -6 2 1.0000 -7 2 0.6667 -8 2 0.5000 -9 2 0.4000 -10 2 0.3333 -create view v3 as select pk, c, c/count(*) over w1 as CNT from t1 -window w1 as (partition by c order by pk rows unbounded preceding); -show create view v3; -View Create View character_set_client collation_connection -v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`pk` AS `pk`,`t1`.`c` AS `c`,`t1`.`c` / count(0) over ( partition by `t1`.`c` order by `t1`.`pk` rows between unbounded preceding and current row ) AS `CNT` from `t1` latin1 latin1_swedish_ci -select * from v3; -pk c CNT -1 1 1.0000 -2 1 0.5000 -3 1 0.3333 -4 1 0.2500 -5 2 2.0000 -6 2 1.0000 -7 2 0.6667 -8 2 0.5000 -9 2 0.4000 -10 2 0.3333 -select pk, c, c/count(*) over (partition by c order by pk -range between 3 preceding and current row) as CNT -from t1; -pk c CNT -1 1 1.0000 -2 1 0.5000 -3 1 0.3333 -4 1 0.2500 -5 2 2.0000 -6 2 1.0000 -7 2 0.6667 -8 2 0.5000 -9 2 0.5000 -10 2 0.5000 -create view v4 as select pk, c, c/count(*) over (partition by c order by pk -range between 3 preceding and current row) as CNT -from t1; -show create view v4; -View Create View character_set_client collation_connection -v4 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS select `t1`.`pk` AS `pk`,`t1`.`c` AS `c`,`t1`.`c` / count(0) over ( partition by `t1`.`c` order by `t1`.`pk` range between 3 preceding and current row ) AS `CNT` from `t1` latin1 latin1_swedish_ci -select * from v4; -pk c CNT -1 1 1.0000 -2 1 0.5000 -3 1 0.3333 -4 1 0.2500 -5 2 2.0000 -6 2 1.0000 -7 2 0.6667 -8 2 0.5000 -9 2 0.5000 -10 2 0.5000 -drop view v1,v2,v3,v4; -drop table t0,t1; -# -# MDEV-10875: window function in subquery -# -CREATE TABLE t1 (i INT); -INSERT INTO t1 VALUES (3),(1); -CREATE TABLE t2 (c VARCHAR(8)); -INSERT INTO t2 VALUES ('foo'),('bar'),('foo'); -SELECT COUNT(*) OVER (PARTITION BY c) FROM t2; -COUNT(*) OVER (PARTITION BY c) -2 -1 -2 -SELECT * FROM t1 WHERE i IN ( SELECT COUNT(*) OVER (PARTITION BY c) FROM t2 ); -i -1 -DROP TABLE t1, t2; -# -# MDEV-9976: window function without PARTITION BY and ORDER BY -# -CREATE TABLE t1 (id int, a int); -INSERT INTO t1 VALUES -(1,1000), (2,1100), (3,1800), (4,1500), (5,1700), (6,1200), -(7,2000), (8,2100), (9,1600); -SELECT id, sum(a) OVER (PARTITION BY id -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -FROM t1; -id sum(a) OVER (PARTITION BY id -1 1000 -2 1100 -3 1800 -4 1500 -5 1700 -6 1200 -7 2000 -8 2100 -9 1600 -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -FROM t1; -id sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -1 14000 -2 13000 -3 5900 -4 10700 -5 7600 -6 11900 -7 4100 -8 2100 -9 9200 -DROP TABLE t1; -# -# MDEV-11867: window function with aggregation -# over the result of grouping -# -create table t1 ( -username varchar(32), -amount int -); -insert into t1 values -('user1',1), -('user1',5), -('user1',3), -('user2',10), -('user2',20), -('user2',30); -select username, sum(amount) as s, avg(sum(amount)) over (order by s desc) -from t1 -group by username; -username s avg(sum(amount)) over (order by s desc) -user1 9 34.5000 -user2 60 60.0000 -select username, sum(amount), avg(sum(amount)) over (order by sum(amount) desc) -from t1 -group by username; -username sum(amount) avg(sum(amount)) over (order by sum(amount) desc) -user1 9 34.5000 -user2 60 60.0000 -drop table t1; -# -# MDEV-11594: window function over implicit grouping -# -create table t1 (id int); -insert into t1 values (1), (2), (3), (2); -select sum(id) over (order by sum(id)) from t1; -sum(id) over (order by sum(id)) -1 -select sum(sum(id)) over (order by sum(id)) from t1; -sum(sum(id)) over (order by sum(id)) -8 -drop table t1; -# -# MDEV-9923: integer constant in order by list -# of window specification -# -create table t1 (id int); -insert into t1 values (1), (2), (3), (2); -select rank() over (order by 1) from t1; -rank() over (order by 1) -1 -1 -1 -1 -select rank() over (order by 2) from t1; -rank() over (order by 2) -1 -1 -1 -1 -select rank() over (partition by id order by 2) from t1; -rank() over (partition by id order by 2) -1 -1 -1 -1 -drop table t1; -# -# MDEV-10660: view using a simple window function -# -create table t1 (id int); -insert into t1 values (1), (2), (3), (2); -create view v1(id,rnk) as -select id, rank() over (order by id) from t1; -show create view v1; -View Create View character_set_client collation_connection -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`id` AS `id`,rank() over ( order by `t1`.`id`) AS `rnk` from `t1` latin1 latin1_swedish_ci -select id, rank() over (order by id) from t1; -id rank() over (order by id) -1 1 -2 2 -3 4 -2 2 -select * from v1; -id rnk -1 1 -2 2 -3 4 -2 2 -drop view v1; -drop table t1; -# -# MDEV-11138: window function in the query without tables -# -select row_number() over (); -row_number() over () -1 -select count(*) over (); -count(*) over () -1 -select sum(5) over (); -sum(5) over () -5 -select row_number() over (), sum(5) over (); -row_number() over () sum(5) over () -1 5 -select row_number() over (order by 2); -row_number() over (order by 2) -1 -select row_number() over (partition by 2); -row_number() over (partition by 2) -1 -select row_number() over (partition by 4 order by 1+2); -row_number() over (partition by 4 order by 1+2) -1 -# -# MDEV-11999: execution of prepared statement for -# tableless query with window functions -# -prepare stmt from -"select row_number() over (partition by 4 order by 1+2)"; -execute stmt; -row_number() over (partition by 4 order by 1+2) -1 -execute stmt; -row_number() over (partition by 4 order by 1+2) -1 -deallocate prepare stmt; -# -# MDEV-11745: window function with min/max -# -create table t1 (i int, b int); -insert into t1 values -(1,1),(2,1),(3,1),(4,4),(5,4),(6,4),(7,8),(8,8),(9,8),(10,8); -select b, min(i) over (partition by b) as f -from t1 as tt -order by i; -b f -1 1 -1 1 -1 1 -4 4 -4 4 -4 4 -8 7 -8 7 -8 7 -8 7 -select b, min(i) over (partition by b) as f -from (select * from t1) as tt -order by i; -b f -1 1 -1 1 -1 1 -4 4 -4 4 -4 4 -8 7 -8 7 -8 7 -8 7 -select b, min(i+10) over (partition by b) as f -from t1 as tt -order by i; -b f -1 11 -1 11 -1 11 -4 14 -4 14 -4 14 -8 17 -8 17 -8 17 -8 17 -select b, min(i) over (partition by b) as f -from (select i+10 as i, b from t1) as tt -order by i; -b f -1 11 -1 11 -1 11 -4 14 -4 14 -4 14 -8 17 -8 17 -8 17 -8 17 -select b, min(i+20) over (partition by b) as f -from (select i+10 as i, b from t1) as tt -order by i; -b f -1 31 -1 31 -1 31 -4 34 -4 34 -4 34 -8 37 -8 37 -8 37 -8 37 -select b, max(i) over (partition by b) as f -from t1 as tt -order by i; -b f -1 3 -1 3 -1 3 -4 6 -4 6 -4 6 -8 10 -8 10 -8 10 -8 10 -select b, max(i) over (partition by b) as f -from (select * from t1) as tt -order by i; -b f -1 3 -1 3 -1 3 -4 6 -4 6 -4 6 -8 10 -8 10 -8 10 -8 10 -select b, max(i+10) over (partition by b) as f -from t1 as tt -order by i; -b f -1 13 -1 13 -1 13 -4 16 -4 16 -4 16 -8 20 -8 20 -8 20 -8 20 -select b, max(i) over (partition by b) as f -from (select i+10 as i, b from t1) as tt -order by i; -b f -1 13 -1 13 -1 13 -4 16 -4 16 -4 16 -8 20 -8 20 -8 20 -8 20 -select b, max(i+20) over (partition by b) as f -from (select i+10 as i, b from t1) as tt -order by i; -b f -1 33 -1 33 -1 33 -4 36 -4 36 -4 36 -8 40 -8 40 -8 40 -8 40 -select max(i), max(i), sum(i), count(i) -from t1 as tt -group by b; -max(i) max(i) sum(i) count(i) -3 3 6 3 -6 6 15 3 -10 10 34 4 -select max(i), min(sum(i)) over (partition by count(i)) f -from t1 as tt -group by b; -max(i) f -3 6 -6 6 -10 34 -select max(i), min(sum(i)) over (partition by count(i)) f -from (select * from t1) as tt -group by b; -max(i) f -3 6 -6 6 -10 34 -select max(i+10), min(sum(i)+10) over (partition by count(i)) f -from t1 as tt -group by b; -max(i+10) f -13 16 -16 16 -20 44 -select max(i), max(i), sum(i), count(i) -from (select i+10 as i, b from t1) as tt -group by b; -max(i) max(i) sum(i) count(i) -13 13 36 3 -16 16 45 3 -20 20 74 4 -select max(i), min(sum(i)) over (partition by count(i)) f -from (select i+10 as i, b from t1) as tt -group by b; -max(i) f -13 36 -16 36 -20 74 -select max(i), min(i), min(max(i)-min(i)) over (partition by count(i)) f -from (select i+10 as i, b from t1) as tt -group by b; -max(i) min(i) f -13 11 2 -16 14 2 -20 17 3 -drop table t1; -# -# MDEV-12015: window function over select with WHERE -# that is always FALSE -# -CREATE TABLE t1 (i INT); -INSERT INTO t1 VALUES (3), (1), (2); -SELECT i, ROW_NUMBER() OVER () FROM t1 WHERE 1 = 2; -i ROW_NUMBER() OVER () -SELECT i, COUNT(*) OVER () FROM t1 WHERE 1 = 2; -i COUNT(*) OVER () -DROP TABLE t1; -# -# MDEV-12051: window function in query with implicit grouping -# on always empty set -# -create table t1 (a int, b varchar(8)); -insert into t1 values (1,'foo'),(2,'bar'); -select max(a), row_number() over () from t1 where a > 10; -max(a) row_number() over () -NULL 1 -select max(a), sum(max(a)) over () from t1 where a > 10; -max(a) sum(max(a)) over () -NULL NULL -select max(a), sum(max(a)) over (partition by max(a)) from t1 where a > 10; -max(a) sum(max(a)) over (partition by max(a)) -NULL NULL -select max(a), row_number() over () from t1 where 1 = 2; -max(a) row_number() over () -NULL 1 -select max(a), sum(max(a)) over () from t1 where 1 = 2; -max(a) sum(max(a)) over () -NULL NULL -select max(a), sum(max(a)) over (partition by max(a)) from t1 where 1 = 2; -max(a) sum(max(a)) over (partition by max(a)) -NULL NULL -select max(a), row_number() over () from t1 where 1 = 2 -having max(a) is not null; -max(a) row_number() over () -select max(a), sum(max(a)) over () from t1 where 1 = 2 -having max(a) is not null; -max(a) sum(max(a)) over () -drop table t1; -# -# MDEV-10885: window function in query with implicit grouping -# with constant condition evaluated to false -# -CREATE TABLE t1 (a INT, b VARCHAR(8)); -INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); -CREATE TABLE t2 (c INT); -INSERT INTO t2 VALUES (3),(4); -CREATE TABLE t3 (d INT); -INSERT INTO t3 VALUES (5),(6); -SELECT MAX(a), ROW_NUMBER() OVER (PARTITION BY MAX(a)) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -MAX(a) ROW_NUMBER() OVER (PARTITION BY MAX(a)) -NULL 1 -SELECT MAX(a), COUNT(MAX(a)) OVER (PARTITION BY MAX(a)) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -MAX(a) COUNT(MAX(a)) OVER (PARTITION BY MAX(a)) -NULL 0 -SELECT MAX(a), SUM(MAX(a)) OVER (PARTITION BY MAX(a)) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -MAX(a) SUM(MAX(a)) OVER (PARTITION BY MAX(a)) -NULL NULL -SELECT MAX(a), ROW_NUMBER() OVER (PARTITION BY MAX(a)) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ) -HAVING MAX(a) IS NOT NULL; -MAX(a) ROW_NUMBER() OVER (PARTITION BY MAX(a)) -SELECT a, MAX(a), ROW_NUMBER() OVER (PARTITION BY b) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -a MAX(a) ROW_NUMBER() OVER (PARTITION BY b) -NULL NULL 1 -SELECT a, COUNT(a), AVG(a) OVER (PARTITION BY b) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -a COUNT(a) AVG(a) OVER (PARTITION BY b) -NULL 0 NULL -SELECT a, MAX(a), AVG(a) OVER (PARTITION BY b) FROM t1 -WHERE EXISTS ( SELECT * FROM t2 WHERE c IN ( SELECT MAX(d) FROM t3 ) ); -a MAX(a) AVG(a) OVER (PARTITION BY b) -NULL NULL NULL -DROP TABLE t1,t2,t3; -# -# MDEV-10859: Wrong result of aggregate window function in query -# with HAVING and no ORDER BY -# -create table empsalary (depname varchar(32), empno smallint primary key, salary int); -insert into empsalary values -('develop', 1, 5000), ('develop', 2, 4000),('sales', 3, '6000'),('sales', 4, 5000); -SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary; -depname empno salary avg(salary) OVER (PARTITION BY depname) -develop 1 5000 4500.0000 -develop 2 4000 4500.0000 -sales 3 6000 5500.0000 -sales 4 5000 5500.0000 -SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname; -depname empno salary avg(salary) OVER (PARTITION BY depname) -develop 1 5000 4500.0000 -develop 2 4000 4500.0000 -sales 3 6000 5500.0000 -sales 4 5000 5500.0000 -# -# These last 2 should have the same row results, ignoring order. -# -SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary HAVING empno > 1; -depname empno salary avg(salary) OVER (PARTITION BY depname) -develop 2 4000 4000.0000 -sales 3 6000 5500.0000 -sales 4 5000 5500.0000 -SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary HAVING empno > 1 ORDER BY depname; -depname empno salary avg(salary) OVER (PARTITION BY depname) -develop 2 4000 4000.0000 -sales 3 6000 5500.0000 -sales 4 5000 5500.0000 -drop table empsalary; -# -# MDEV-11868: min(distinct) over () returns wrong value -# -create table TDEC (CDEC int, RNUM int); -create view VDEC as select * from TDEC; -insert into TDEC (CDEC) values (null),(-1),(0),(1),(0),(10); -select TDEC.CDEC, min(TDEC.CDEC) over () from TDEC; -CDEC min(TDEC.CDEC) over () -NULL -1 --1 -1 -0 -1 -1 -1 -0 -1 -10 -1 -select VDEC.CDEC, min(VDEC.CDEC) over () from VDEC; -CDEC min(VDEC.CDEC) over () -NULL -1 --1 -1 -0 -1 -1 -1 -0 -1 -10 -1 -select TDEC.CDEC, max(TDEC.CDEC) over () from TDEC; -CDEC max(TDEC.CDEC) over () -NULL 10 --1 10 -0 10 -1 10 -0 10 -10 10 -select VDEC.CDEC, max(VDEC.CDEC) over () from VDEC; -CDEC max(VDEC.CDEC) over () -NULL 10 --1 10 -0 10 -1 10 -0 10 -10 10 -select TDEC.CDEC, min(distinct TDEC.CDEC) over () from TDEC; -CDEC min(distinct TDEC.CDEC) over () -NULL -1 --1 -1 -0 -1 -1 -1 -0 -1 -10 -1 -select VDEC.CDEC, min(distinct VDEC.CDEC) over () from VDEC; -CDEC min(distinct VDEC.CDEC) over () -NULL -1 --1 -1 -0 -1 -1 -1 -0 -1 -10 -1 -select TDEC.CDEC, max(distinct TDEC.CDEC) over () from TDEC; -CDEC max(distinct TDEC.CDEC) over () -NULL 10 --1 10 -0 10 -1 10 -0 10 -10 10 -select VDEC.CDEC, max(distinct VDEC.CDEC) over () from VDEC; -CDEC max(distinct VDEC.CDEC) over () -NULL 10 --1 10 -0 10 -1 10 -0 10 -10 10 -# -# These should be removed once support for them is added. -# -select TDEC.CDEC, count(distinct TDEC.CDEC) over () from TDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'COUNT(DISTINCT) aggregate as window function' -select VDEC.CDEC, count(distinct VDEC.CDEC) over () from VDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'COUNT(DISTINCT) aggregate as window function' -select TDEC.CDEC, sum(distinct TDEC.CDEC) over () from TDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'SUM(DISTINCT) aggregate as window function' -select VDEC.CDEC, sum(distinct VDEC.CDEC) over () from VDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'SUM(DISTINCT) aggregate as window function' -select TDEC.CDEC, avg(distinct TDEC.CDEC) over () from TDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'AVG(DISTINCT) aggregate as window function' -select VDEC.CDEC, avg(distinct VDEC.CDEC) over () from VDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'AVG(DISTINCT) aggregate as window function' -select TDEC.CDEC, GROUP_CONCAT(TDEC.CDEC) over () from TDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'GROUP_CONCAT() aggregate as window function' -select VDEC.CDEC, GROUP_CONCAT(distinct VDEC.CDEC) over () from VDEC; -ERROR 42000: This version of MariaDB doesn't yet support 'GROUP_CONCAT() aggregate as window function' -drop table TDEC; -drop view VDEC; -# -# MDEV-10700: 10.2.2 windowing function returns incorrect result -# -create table t(a int,b int, c int , d int); -insert into t(a,b,c,d) values(1, rand(10)*1000, rand(10)*1000, rand(10)*1000); -insert into t(a,b,c,d) values(1, rand(10)*1000, rand(10)*1000, rand(10)*1000); -replace into t(a,b,c,d) select 1, rand(10)*1000, rand(10)*1000, rand(10)*1000 from t t1, t t2, t t3, t t4, t t5, t t6, t t7, t t8, t t9, t t10, t t11, t t12, t t13, t t14, t t15, t t16, t t17; -select count(distinct s) from (select sum(d) over(partition by a,b,c) as s from t) Z where s > 0; -count(distinct s) -993 -select count(distinct s) from (select sum(d) as s from t group by a,b,c) Z where s > 0; -count(distinct s) -993 -select count(distinct s) from (select sum(d) over(partition by a,b) as s from t) Z where s > 0; -count(distinct s) -993 -select count(distinct s) from (select sum(d) as s from t group by a,b) Z where s > 0; -count(distinct s) -993 -select count(distinct s) from (select sum(d) over(partition by a) as s from t) Z where s > 0; -count(distinct s) -1 -select count(distinct s) from (select sum(d) as s from t group by a) Z where s > 0; -count(distinct s) -1 -drop table t; -# -# MDEV-9924: window function in query with group by optimized away -# -create table t1 (i int); -insert into t1 values (2),(3),(1); -select row_number() over () from t1 group by 1+2; -row_number() over () -1 -select max(i), row_number() over () from t1 group by 1+2; -max(i) row_number() over () -3 1 -select rank() over (order by max(i)) from t1 group by 1+2; -rank() over (order by max(i)) -1 -select i, row_number() over () from t1 group by 1+2; -i row_number() over () -2 1 -select i, rank() over (order by i) rnk from t1 group by 1+2; -i rnk -2 1 -drop table t1; -# -# MDEV-11907: window function as the second operand of division -# -create table t1 (pk int, c int); -insert into t1 values (1,1),(2,1),(3,1),(4,1),(5,2); -set @sql_mode_save= @@sql_mode; -set sql_mode='ERROR_FOR_DIVISION_BY_ZERO'; -select pk, c, c/count(*) over -(partition by c order by pk -rows between 1 preceding and 2 following) as CNT -from t1; -pk c CNT -1 1 0.3333 -2 1 0.2500 -3 1 0.3333 -4 1 0.5000 -5 2 2.0000 -show warnings; -Level Code Message -set sql_mode=@sql_mode_save; -drop table t1; -# -# MDEV-12336: several functions over a window function -# -create table t1 (name varchar(10), cnt int); -insert into t1 values ('Fred', 23), ('Fred', 35), ('Joe', 10); -select q.name, q.row_cnt, -round( 100 * ( q.row_cnt / -sum(q.row_cnt) over -( -order by q.name -rows between -unbounded preceding and -unbounded following -) -),2 -) pct_of_total -from -( -select name, count(*) row_cnt, sum(cnt) sum_cnt -from t1 -group by 1 -) q; -name row_cnt pct_of_total -Fred 2 66.67 -Joe 1 33.33 -drop table t1; -# -# MDEV-11990: window function over min/max aggregation -# -create table t1 (id int); -insert into t1 values (1), (2), (3), (2), (4), (2); -select sum(max(id)) over (order by max(id)) from t1; -sum(max(id)) over (order by max(id)) -4 -explain -select sum(max(id)) over (order by max(id)) from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary -create index idx on t1(id); -select sum(max(id)) over (order by max(id)) from t1; -sum(max(id)) over (order by max(id)) -4 -explain -select sum(max(id)) over (order by max(id)) from t1; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used -select sum(max(id)) over (order by max(id)) from t1 where id < 3; -sum(max(id)) over (order by max(id)) -2 -select count(max(id)) over (order by max(id)) from t1 where id < 3; -count(max(id)) over (order by max(id)) -1 -select max(id), rank() over (order by max(id)) from t1 where id < 3; -max(id) rank() over (order by max(id)) -2 1 -drop table t1; -# -# main.win failure post MDEV-12336 -# -create table t(a decimal(35,10), b int); -insert into t values (1, 10), (2, 20), (3, 30); -prepare stmt from "SELECT (CASE WHEN sum(t.a) over (partition by t.b)=1 THEN 1000 ELSE 300 END) AS a FROM t"; -execute stmt; -a -1000 -300 -300 -drop table t; -# -# MDEV-12851 case with window functions query crashes server -# -create table t1(dt datetime); -insert into t1 values ('2017-05-17'), ('2017-05-18'); -select dt, -case when (max(dt) over (order by dt rows between 1 following and 1 following) is null) -then '9999-12-31 12:00:00' - else max(dt) over (order by dt rows between 1 following and 1 following) -end x, -case when (max(dt) over (order by dt rows between 1 following and 1 following) is not null) -then '9999-12-31 12:00:00' - else max(dt) over (order by dt rows between 1 following and 1 following) -end x -from t1; -dt x x -2017-05-17 00:00:00 2017-05-18 00:00:00 9999-12-31 12:00:00 -2017-05-18 00:00:00 9999-12-31 12:00:00 NULL -drop table t1; -create table t1(i int); -insert into t1 values (null),(1),(2); -select max(i) over (order by i), -max(i) over (order by i) is null, -max(i) over (order by i) is not null -from t1; -max(i) over (order by i) max(i) over (order by i) is null max(i) over (order by i) is not null -NULL 1 0 -1 0 1 -2 0 1 -drop table t1; -# -# MDEV-13189: Window functions crash when using INTERVAL function -# -create table t1(i int); -insert into t1 values (1),(2),(10),(20),(30); -select sum(i) over (order by i), interval(sum(i) over (order by i), 10, 20) -from t1; -sum(i) over (order by i) interval(sum(i) over (order by i), 10, 20) -1 0 -3 0 -13 1 -33 2 -63 2 -drop table t1; -# -# MDEV-13352: Server crashes in st_join_table::remove_duplicates -# -CREATE TABLE t1 (i INT); -INSERT INTO t1 VALUES (1),(2); -SELECT DISTINCT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; -ROW_NUMBER() OVER() i -SELECT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; -ROW_NUMBER() OVER() i -DROP TABLE t1; -# -# MDEV-13344: Server crashes in in AGGR_OP::put_record on subquery -# with window function and constant table -# (Testcase only) -# -CREATE TABLE t1 (c CHAR(8)) ENGINE=MyISAM; -INSERT IGNORE INTO t1 VALUES ('foo'); -SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); -('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) -0 -DROP TABLE t1; -# -# MDEV-13351: Server crashes in st_select_lex::set_explain_type upon UNION with window function -# -CREATE TABLE t1 (i INT); -INSERT INTO t1 VALUES (1),(2); -SELECT Nth_value(i,1) OVER() FROM t1 -UNION ALL -( SELECT Nth_value(i,2) OVER() FROM t1 LIMIT 0 ) -; -Nth_value(i,1) OVER() -1 -1 -DROP TABLE t1; -# -# A regression after MDEV-13351: -# MDEV-13374 : Server crashes in first_linear_tab / st_select_lex::set_explain_type -# upon UNION with aggregate function -# -CREATE TABLE t1 (i INT) ENGINE=MyISAM; -INSERT INTO t1 VALUES (1),(2); -SELECT i AS fld FROM t1 UNION SELECT COUNT(*) AS fld FROM t1; -fld -1 -2 -DROP TABLE t1; -# -# MDEV-13240 Wrong warning with MAX(datetime_field) OVER (...) -# -CREATE TABLE t1 (dt DATETIME); -INSERT INTO t1 VALUES ('2017-05-17'); -SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1; -MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) -NULL -DROP TABLE t1; -# -# MDEV-13358 FIRST_VALUE throws SQL Error (1292): Incorrect datetime value -# -CREATE TABLE IF NOT EXISTS `fv_test` ( -`SOME_DATE` datetime NOT NULL -); -INSERT INTO `fv_test` (`SOME_DATE`) VALUES ('2017-07-20 12:47:56'); -CREATE TABLE fv_result -SELECT -FIRST_VALUE(SOME_DATE) OVER(ORDER BY SOME_DATE DESC) AS somedate -FROM fv_test; -SHOW CREATE TABLE fv_result; -Table Create Table -fv_result CREATE TABLE `fv_result` ( - `somedate` datetime DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 -SELECT * FROM fv_result; -somedate -2017-07-20 12:47:56 -DROP TABLE fv_test, fv_result; -# -# MDEV-13649: Server crashes in set_field_to_null_with_conversions or in Field::set_notnull -# -CREATE TABLE t1 (a int); -INSERT INTO t1 VALUES (0),(1),(2); -SELECT LEAD(a) OVER (PARTITION BY a) as lead, -a AND LEAD(a) OVER (PARTITION BY a) AS a_and_lead_part -FROM t1; -lead a_and_lead_part -NULL 0 -NULL NULL -NULL NULL -SELECT a OR LEAD(a) OVER (ORDER BY a) AS a_or_lead_order -FROM t1 -ORDER BY a; -a_or_lead_order -1 -1 -1 -SELECT a AND LEAD(a) OVER (ORDER BY a) AS a_and_lead_order -FROM t1 -ORDER BY a; -a_and_lead_order -0 -1 -NULL -SELECT a XOR LEAD(a) OVER (ORDER BY a) AS a_xor_lead_order -FROM t1 -ORDER BY a; -a_xor_lead_order -1 -0 -NULL -SELECT NOT LEAD(a) OVER (ORDER BY a) AS not_lead_order -FROM t1 -ORDER BY a; -not_lead_order -0 -0 -NULL -SELECT LEAD(a) OVER (ORDER BY a) is not null AS is_not_null_lead_order -FROM t1 -ORDER BY a; -is_not_null_lead_order -1 -1 -0 -drop table t1; -# -# MDEV-13354: Server crashes in find_field_in_tables upon PS with window function and subquery -# -CREATE TABLE t1 (i INT, a char); -INSERT INTO t1 VALUES (1, 'a'),(2, 'b'); -PREPARE stmt FROM "SELECT row_number() over (partition by i order by i), i FROM (SELECT * from t1) as sq"; -EXECUTE stmt; -row_number() over (partition by i order by i) i -1 1 -1 2 -DROP TABLE t1; -# -# MDEV-13384: "window" seems like a reserved column name but it's not listed as one -# -# Currently we allow window as an identifier, except for table aliases. -# -CREATE TABLE door (id INT, window VARCHAR(10)); -SELECT id -FROM door as window; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'window' at line 2 -SELECT id, window -FROM door; -id window -SELECT id, window -FROM door as window; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'window' at line 2 -DROP TABLE door; -# -# MDEV-13352: Server crashes in st_join_table::remove_duplicates -# -CREATE TABLE t1 (i INT); -INSERT INTO t1 VALUES (1),(2); -SELECT DISTINCT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; -ROW_NUMBER() OVER() i -SELECT ROW_NUMBER() OVER(), i FROM t1 WHERE 0; -ROW_NUMBER() OVER() i -DROP TABLE t1; -# -# Start of 10.3 tests -# |