1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Fix handling of NULL, text and blob values in window queries that use "RANGE BETWEEN A FOLLOWING AND B FOLLOWING", or "B PRECEDING AND A PRECEDING", where A>B.

FossilOrigin-Name: cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0
This commit is contained in:
dan
2019-09-04 06:56:43 +00:00
parent 7dc3547eeb
commit 1a97c413f8
5 changed files with 324 additions and 16 deletions

View File

@ -6213,13 +6213,260 @@ do_execsql_test 7.0 {
INSERT INTO t2 VALUES(2, NULL);
INSERT INTO t2 VALUES(3, NULL);
INSERT INTO t2 VALUES(4, NULL);
INSERT INTO t2 VALUES(5, 66);
INSERT INTO t2 VALUES(6, 67);
} {}
do_execsql_test 7.1 {
SELECT sum(a) OVER win FROM t2
do_execsql_test 7.1.1 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
);
} {9 9 9 9}
} {9 9 9 9 9 9}
do_execsql_test 7.1.2 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.1.3 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.1.4 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.1.5 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.1.6 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
);
} {{} {} 1 9 9 9}
do_execsql_test 7.1.7 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.1.8 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.1.9 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.2.1 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
);
} {2 2 2 2 2 2}
do_execsql_test 7.2.2 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {{} {} {} 2 2 2}
do_execsql_test 7.2.3 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {{} {} {} 2 2 2}
do_execsql_test 7.2.4 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {2 2 2 {} {} {}}
do_execsql_test 7.2.5 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {2 2 2 {} {} {}}
do_execsql_test 7.2.6 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
);
} {{} {} 1 2 2 2}
do_execsql_test 7.2.7 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {{} {} {} 2 2 2}
do_execsql_test 7.2.8 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
);
} {2 2 2 {} {} {}}
do_execsql_test 7.2.9 {
SELECT min (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {2 2 2 {} {} {}}
do_execsql_test 7.3.1 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
);
} {9 9 9 9 9 9}
do_execsql_test 7.3.2 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.3.3 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.3.4 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.3.5 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.3.6 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
);
} {{} {} 1 9 9 9}
do_execsql_test 7.3.7 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {{} {} {} 9 9 9}
do_execsql_test 7.3.8 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.3.9 {
SELECT sum (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {9 9 9 {} {} {}}
do_execsql_test 7.4.1 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
);
} {4 4 4 4 4 4}
do_execsql_test 7.4.2 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {{} {} {} 4 4 4}
do_execsql_test 7.4.3 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {{} {} {} 4 4 4}
do_execsql_test 7.4.4 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
);
} {4 4 4 {} {} {}}
do_execsql_test 7.4.5 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
);
} {4 4 4 {} {} {}}
do_execsql_test 7.4.6 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
);
} {{} {} 1 4 4 4}
do_execsql_test 7.4.7 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {{} {} {} 4 4 4}
do_execsql_test 7.4.8 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
);
} {4 4 4 {} {} {}}
do_execsql_test 7.4.9 {
SELECT max (a) OVER win FROM t2
WINDOW win AS (
ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
);
} {4 4 4 {} {} {}}
finish_test