mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
1c6b982e02
Users expect window functions to produce a certain ordering of rows in the final result set. Although the standard does not require this, we already have the filesort result done for when we computed the window function. If there is no ORDER BY attached to the query, just keep it till the SELECT is completely evaluated and use that to print the result. Update test cases as many did not take care to guarantee a stable result.
131 lines
4.5 KiB
Text
131 lines
4.5 KiB
Text
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, first_value(pk) over (order by pk),
|
|
last_value(pk) over (order by pk),
|
|
first_value(pk) over (order by pk desc),
|
|
last_value(pk) over (order by pk desc)
|
|
from t1
|
|
order by pk desc;
|
|
pk first_value(pk) over (order by pk) last_value(pk) over (order by pk) first_value(pk) over (order by pk desc) last_value(pk) over (order by pk desc)
|
|
11 1 11 11 11
|
|
10 1 10 11 10
|
|
9 1 9 11 9
|
|
8 1 8 11 8
|
|
7 1 7 11 7
|
|
6 1 6 11 6
|
|
5 1 5 11 5
|
|
4 1 4 11 4
|
|
3 1 3 11 3
|
|
2 1 2 11 2
|
|
1 1 1 11 1
|
|
select pk,
|
|
first_value(pk) over (order by pk
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
|
|
last_value(pk) over (order by pk
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
|
|
first_value(pk) over (order by pk desc
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
|
|
last_value(pk) over (order by pk desc
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
|
|
from t1
|
|
order by pk;
|
|
pk first_value(pk) over (order by pk
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_value(pk) over (order by pk
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_value(pk) over (order by pk desc
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_value(pk) over (order by pk desc
|
|
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
|
|
1 1 11 11 1
|
|
2 1 11 11 1
|
|
3 1 11 11 1
|
|
4 1 11 11 1
|
|
5 1 11 11 1
|
|
6 1 11 11 1
|
|
7 1 11 11 1
|
|
8 1 11 11 1
|
|
9 1 11 11 1
|
|
10 1 11 11 1
|
|
11 1 11 11 1
|
|
select pk,
|
|
first_value(pk) over (order by pk desc),
|
|
last_value(pk) over (order by pk desc)
|
|
from t1;
|
|
pk first_value(pk) over (order by pk desc) last_value(pk) over (order by pk desc)
|
|
11 11 11
|
|
10 11 10
|
|
9 11 9
|
|
8 11 8
|
|
7 11 7
|
|
6 11 6
|
|
5 11 5
|
|
4 11 4
|
|
3 11 3
|
|
2 11 2
|
|
1 11 1
|
|
select pk, a, b, c, d, e,
|
|
first_value(b) over (partition by a order by pk) as fst_b,
|
|
last_value(b) over (partition by a order by pk) as lst_b,
|
|
first_value(c) over (partition by a order by pk) as fst_c,
|
|
last_value(c) over (partition by a order by pk) as lst_c,
|
|
first_value(d) over (partition by a order by pk) as fst_d,
|
|
last_value(d) over (partition by a order by pk) as lst_d,
|
|
first_value(e) over (partition by a order by pk) as fst_e,
|
|
last_value(e) over (partition by a order by pk) as lst_e
|
|
from t1;
|
|
pk a b c d e fst_b lst_b fst_c lst_c fst_d lst_d fst_e lst_e
|
|
1 0 1 one 0.100 0.001 1 1 one one 0.100 0.100 0.001 0.001
|
|
2 0 2 two 0.200 0.002 1 2 one two 0.100 0.200 0.001 0.002
|
|
3 0 3 three 0.300 0.003 1 3 one three 0.100 0.300 0.001 0.003
|
|
4 1 2 three 0.400 0.004 2 2 three three 0.400 0.400 0.004 0.004
|
|
5 1 1 two 0.500 0.005 2 1 three two 0.400 0.500 0.004 0.005
|
|
6 1 1 one 0.600 0.006 2 1 three one 0.400 0.600 0.004 0.006
|
|
7 2 NULL n_one 0.500 0.007 NULL NULL n_one n_one 0.500 0.500 0.007 0.007
|
|
8 2 1 n_two NULL 0.008 NULL 1 n_one n_two 0.500 NULL 0.007 0.008
|
|
9 2 2 NULL 0.700 0.009 NULL 2 n_one NULL 0.500 0.700 0.007 0.009
|
|
10 2 0 n_four 0.800 0.01 NULL 0 n_one n_four 0.500 0.800 0.007 0.01
|
|
11 2 10 NULL 0.900 NULL NULL 10 n_one NULL 0.500 0.900 0.007 NULL
|
|
drop table t1;
|
|
#
|
|
# MDEV-11746: Wrong result upon using FIRST_VALUE with a window frame
|
|
#
|
|
create table t1 (i int);
|
|
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
|
select i,
|
|
first_value(i) OVER (order by i rows between CURRENT ROW and 1 FOLLOWING) as fst_1f,
|
|
last_value(i) OVER (order by i rows between CURRENT ROW and 1 FOLLOWING) as last_1f,
|
|
first_value(i) OVER (order by i rows between 1 PRECEDING AND 1 FOLLOWING) as fst_1p1f,
|
|
last_value(i) OVER (order by i rows between 1 PRECEDING AND 1 FOLLOWING) as fst_1p1f,
|
|
first_value(i) OVER (order by i rows between 2 PRECEDING AND 1 PRECEDING) as fst_2p1p,
|
|
last_value(i) OVER (order by i rows between 2 PRECEDING AND 1 PRECEDING) as fst_2p1p,
|
|
first_value(i) OVER (order by i rows between 1 FOLLOWING AND 2 FOLLOWING) as fst_1f2f,
|
|
last_value(i) OVER (order by i rows between 1 FOLLOWING AND 2 FOLLOWING) as fst_1f2f
|
|
from t1;
|
|
i fst_1f last_1f fst_1p1f fst_1p1f fst_2p1p fst_2p1p fst_1f2f fst_1f2f
|
|
1 1 2 1 2 NULL NULL 2 3
|
|
2 2 3 1 3 1 1 3 4
|
|
3 3 4 2 4 1 2 4 5
|
|
4 4 5 3 5 2 3 5 6
|
|
5 5 6 4 6 3 4 6 7
|
|
6 6 7 5 7 4 5 7 8
|
|
7 7 8 6 8 5 6 8 9
|
|
8 8 9 7 9 6 7 9 10
|
|
9 9 10 8 10 7 8 10 10
|
|
10 10 10 9 10 8 9 NULL NULL
|
|
drop table t1;
|