| Server IP : 88.99.149.37 / Your IP : 216.73.216.141 Web Server : nginx/1.31.2 System : Linux server-88-99-149-37 6.12.0-124.56.5.el10_1.x86_64 #1 SMP PREEMPT_DYNAMIC Fri May 15 06:12:08 EDT 2026 x86_64 User : muralimurth ( 1015) PHP Version : 8.4.23 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /usr/local/mysql/mysql-test/main/ |
Upload File : |
#
# Tests for window functions and ORDER BY
#
--disable_warnings
drop table if exists t0,t1;
--enable_warnings
create table t0(a int primary key);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1(
pk int,
a int,
key(pk)
);
insert into t1
select
A.a + B.a* 10 + C.a * 100,
1
from t0 A, t0 B, t0 C;
select
pk,
count(a) over (order by pk rows between 2 preceding and 2 following) as exp
from t1
where pk between 1 and 30
order by pk desc
limit 4;
drop table t0,t1;
--echo #
--echo # MDEV-30052: Crash with a query containing nested WINDOW clauses
--echo #
CREATE TABLE t1 (c INT);
insert into t1 values (1),(2);
UPDATE t1 SET c=1
WHERE c=2
ORDER BY
(1 IN ((
SELECT *
FROM (SELECT * FROM t1) AS v1
GROUP BY c
WINDOW v2 AS (ORDER BY
(SELECT *
FROM t1
GROUP BY c
WINDOW v3 AS (PARTITION BY c)
)
)
))
);
drop table t1;
--echo #
--echo # MDEV-29359: Server crashed with heap-use-after-free in
--echo # Field::is_null(long long) const (Just testcase)
--echo #
CREATE TABLE t1 (id int);
INSERT INTO t1 VALUES (-1),(0),(84);
SELECT
id IN (SELECT id
FROM t1
WINDOW w AS (ORDER BY (SELECT 1
FROM t1
WHERE
EXISTS ( SELECT id
FROM t1
GROUP BY id
WINDOW w2 AS (ORDER BY id)
)
)
)
) as exp
FROM t1;
DROP TABLE t1;
--echo # End of 10.3 tests
--echo #
--echo # MDEV-32317 ref_ptrs exhaust on multiple ORDER by func from winfunc
--echo #
# Primitive tests, just know how reserve/occupation works
# 2 elements
select row_number() over () x;
select row_number() over (order by 1) x;
select row_number() over (order by 1, 1) x;
select row_number() over (partition by 1) x;
select row_number() over (partition by 1, 1) x;
select row_number() over (partition by 1 order by 1) x;
# 3 elements
select row_number() over (partition by 1, 2) x;
select row_number() over (partition by 1, 2 order by 1, 1) x;
# 1 element
select row_number() over () x order by x;
select row_number() over () order by 1;
# 2 elements
select row_number() over (order by 1) order by 1;
select row_number() over (order by 1, 1) order by 1;
select row_number() over (order by 1) order by 1, 1;
select row_number() over (order by 1, 1) order by 1, 1;
# 3 elements
select row_number() over (partition by 1, 2 order by 1, 1) order by 1;
select row_number() over (partition by 1, 2 order by 1, 1) order by 1, 1;
# 1 element
select nullif(1, 0) order by 1;
select nullif(1, 0) order by 1, 1;
# Now interesting, winfunc inside func
# 7 elements (reserves 11)
select nullif(avg(1) over (), 0) order by 1;
# 8 elements (reserves 12)
select nullif(avg(1) over (order by 1), 0) order by 1;
# 8 elements (reserves 13)
select nullif(avg(1) over (order by 1, 1), 0) order by 1;
# 8 elements (reserves 12)
select nullif(avg(1) over (partition by 1), 0) order by 1;
# 9 elements (reserves 13)
select nullif(avg(1) over (partition by 1, 2), 0) order by 1;
# 11 elements (reserves 15)
select nullif(avg(1) over (), 0) order by 1, 1;
# 13 elements (reserves 17)
select nullif(avg(1) over (partition by 1, 2), 0) order by 1, 1;
# 17 elements (reserves 21)
select nullif(avg(1) over (partition by 1, 2), 0) order by 1, 1, 1;
# 24 elements (reserves 36)
select nullif(avg(1) over (partition by 1, 2), avg(1) over ()) order by 1, 1, 1;
# Extinguishing tests, let's break the code
# 17 elements (reserves 25)
select avg ( '1' ) over ( ) x where ( 1 , 1 , ( 1 , null ) ) in ( ( 1 , 1 , ( 1 , 1 ) ) ) order by x between 25 and ( ( x = x ) / x ) or x = x = avg ( null ) or x = 94 ;
# 14 elements (reserves 20)
select row_number() over () x order by x between 1 and (( x = x ) / x) or x = x = 1 ;
# 16 elements (reserves 20)
select nullif(avg(1) over (order by 1), 0) order by 1, 1, 1;
# 41 elements (reserves 72)
select nullif(avg(1) over (order by 1, 1, 1, 1, 1, 1, 1), avg(2) over (order by 1, 1, 1, 1, 1, 1, 1)) x order by 1, 1, 1, 1, 1, 1;
# 50 elements (reserves 92)
select nullif(avg(1) over (partition by -1,1,0,2,3,4,5,6,7,8 order by 1, 1, 1, 1, 1, 1, 1), avg(2) over (partition by -1,1,0,2,3,4,5,6,7,8 order by 1, 1, 1, 1, 1, 1, 1)) x order by 1, 1, 1, 1, 1, 1;
# 63 elements (reserves 124)
select nullif(avg(1) over (partition by -1,1,0,2,3,4,5,6,7,8 order by 1, 1, 1, 1, 1, 1, 1), avg(2) over (partition by -1,1,0,2,3,4,5,6,7,8 order by 1, 1, 1, 1, 1, 1, 1)) x order by 1, 1, 1, 1, 1, 1, x between 1 and (( x = x ) / x) or x = x = 1 ;
--echo # End of 10.6 tests
--echo #
--echo # MDEV-28619 Server crash and UBSAN null-pointer-use in Window_funcs_sort::setup
--echo #
create table t (c int);
--error ER_WRONG_WINDOW_SPEC_NAME
select * from t order by c=row_number() over t;
--error ER_NO_TABLES_USED
select * union select * from t;
--error ER_WRONG_WINDOW_SPEC_NAME
explain update t set c=1 where exists (
select * from t order by c=row_number() over t);
--error ER_NO_TABLES_USED
select * union select * from t order by c=row_number() over t;
explain update t set c=1 where exists (
select * union select * from t order by c=row_number() over t);
explain update t set c=1 where exists (
select * union select nullif(avg(1) over (order by 1), avg(1) over (order by 1)) x
from t order by x=row_number() over t);
explain update t set c=1 where exists (
select * union select nullif(avg(1) over (order by 1), avg(1) over (order by 1)) x
from t order by x=avg(row_number() over t));
explain update t set c=1 where exists (
select * union select nullif(avg(1) over (order by 1), avg(1) over (order by 1)) x
from t order by x=avg(row_number() over t) over (order by 1));
drop table t;
--echo #
--echo # End of 10.11 tests
--echo #