sqlite/test/windowB.test
dan e7579a53fb Further simplifications to window-function code.
FossilOrigin-Name: 5fe15c1d8383989257e11d1806e6b035acacd1b504ae385ba58d20db10f26eee
2019-09-25 16:41:44 +00:00

340 lines
9.1 KiB
Plaintext

# 2019-08-30
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
# Test cases for RANGE BETWEEN and especially with NULLS LAST
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix windowB
ifcapable !windowfunc {
finish_test
return
}
do_execsql_test 1.0 {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(NULL, 1);
INSERT INTO t1 VALUES(NULL, 2);
INSERT INTO t1 VALUES(NULL, 3);
} {}
foreach {tn win} {
1 { ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
2 { ORDER BY a NULLS LAST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
3 { ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
4 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING }
5 { ORDER BY a NULLS LAST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING }
6 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING }
7 { ORDER BY a NULLS LAST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING }
8 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING }
} {
do_execsql_test 1.$tn "
SELECT sum(b) OVER win FROM t1
WINDOW win AS ( $win )
" {6 6 6}
}
do_execsql_test 1.2 {
SELECT sum(b) OVER win FROM t1
WINDOW win AS (
ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
)
} {6 6 6}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 2.0 {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(1, NULL);
INSERT INTO t1 VALUES(2, 45);
INSERT INTO t1 VALUES(3, 66.2);
INSERT INTO t1 VALUES(4, 'hello world');
INSERT INTO t1 VALUES(5, 'hello world');
INSERT INTO t1 VALUES(6, X'1234');
INSERT INTO t1 VALUES(7, X'1234');
INSERT INTO t1 VALUES(8, NULL);
}
foreach {tn win} {
1 "ORDER BY b RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING"
2 "ORDER BY b RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING"
3 "ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING"
4 "ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING"
} {
do_execsql_test 2.1.$tn "
SELECT a, sum(a) OVER win FROM t1
WINDOW win AS ( $win )
ORDER BY 1
" {1 9 2 {} 3 {} 4 9 5 9 6 13 7 13 8 9}
}
#-------------------------------------------------------------------------
ifcapable json1 {
reset_db
do_execsql_test 3.0 {
CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT, x TEXT);
INSERT INTO testjson VALUES(1, '{"a":1}', 'a');
INSERT INTO testjson VALUES(2, '{"b":2}', 'b');
INSERT INTO testjson VALUES(3, '{"c":3}', 'c');
INSERT INTO testjson VALUES(4, '{"d":4}', 'd');
}
do_execsql_test 3.1 {
SELECT json_group_array(json(j)) FROM testjson;
} {
{[{"a":1},{"b":2},{"c":3},{"d":4}]}
}
do_execsql_test 3.2 {
SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson;
} {
{[{"a":1}]}
{[{"a":1},{"b":2}]}
{[{"a":1},{"b":2},{"c":3}]}
{[{"a":1},{"b":2},{"c":3},{"d":4}]}
}
do_execsql_test 3.3 {
SELECT json_group_array(json(j)) OVER (
ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
EXCLUDE TIES
) FROM testjson;
} {
{[{"a":1}]}
{[{"a":1},{"b":2}]}
{[{"a":1},{"b":2},{"c":3}]}
{[{"a":1},{"b":2},{"c":3},{"d":4}]}
}
do_execsql_test 3.4 {
SELECT json_group_array(json(j)) OVER (
ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) FROM testjson;
} {
{[{"a":1},{"b":2}]}
{[{"a":1},{"b":2},{"c":3}]}
{[{"b":2},{"c":3},{"d":4}]}
{[{"c":3},{"d":4}]}
}
do_execsql_test 3.5 {
SELECT json_group_array(json(j)) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) FROM testjson;
} {
{[]}
{[{"a":1}]}
{[{"a":1},{"b":2}]}
{[{"b":2},{"c":3}]}
}
do_execsql_test 3.5a {
UPDATE testjson SET j = replace(j,char(125),',"e":9'||char(125));
SELECT j FROM testjson;
} {
{{"a":1,"e":9}}
{{"b":2,"e":9}}
{{"c":3,"e":9}}
{{"d":4,"e":9}}
}
do_execsql_test 3.5b {
SELECT group_concat(x,'') OVER (
ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
) FROM testjson ORDER BY id;
} {bc cd d {}}
do_execsql_test 3.5c {
SELECT json_group_array(json(j)) OVER (
ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
) FROM testjson;
} {
{[{"b":2,"e":9},{"c":3,"e":9}]}
{[{"c":3,"e":9},{"d":4,"e":9}]}
{[{"d":4,"e":9}]}
{[]}
}
do_execsql_test 3.5d {
SELECT json_group_object(x,json(j)) OVER (
ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
) FROM testjson;
} {
{{"b":{"b":2,"e":9},"c":{"c":3,"e":9}}}
{{"c":{"c":3,"e":9},"d":{"d":4,"e":9}}}
{{"d":{"d":4,"e":9}}}
{{}}
}
do_execsql_test 3.7b {
SELECT group_concat(x,'') FILTER (WHERE id!=2) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) FROM testjson;
} {{} a a c}
do_execsql_test 3.7c {
SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) FROM testjson
} {
{[]}
{[{"a":1,"e":9}]}
{[{"a":1,"e":9}]}
{[{"c":3,"e":9}]}
}
do_execsql_test 3.7d {
SELECT json_group_object(x,json(j)) FILTER (WHERE id!=2) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) FROM testjson
} {
{{}}
{{"a":{"a":1,"e":9}}}
{{"a":{"a":1,"e":9}}}
{{"c":{"c":3,"e":9}}}
}
}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 4.0 {
CREATE TABLE x(a);
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(2);
}
do_execsql_test 4.1 {
WITH y AS (
SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION BY a)
)
SELECT * FROM y;
} {
1 1
}
do_catchsql_test 4.2 {
WITH y AS (
SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION
BY fake_column))
SELECT * FROM y;
} {1 {no such column: fake_column}}
do_catchsql_test 4.3 {
SELECT 1 WINDOW win AS (PARTITION BY fake_column);
} {0 1}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 5.0 {
CREATE TABLE t1(a, c);
CREATE INDEX i1 ON t1(a);
INSERT INTO t1 VALUES(0, 421);
INSERT INTO t1 VALUES(1, 844);
INSERT INTO t1 VALUES(2, 1001);
}
do_execsql_test 5.1 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING
) FROM t1;
} {0 {} 1 {} 2 {}}
do_execsql_test 5.2 {
INSERT INTO t1 VALUES(NULL, 123);
INSERT INTO t1 VALUES(NULL, 111);
INSERT INTO t1 VALUES('xyz', 222);
INSERT INTO t1 VALUES('xyz', 333);
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING
) FROM t1;
} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
do_execsql_test 5.3 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
) FROM t1;
} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
do_execsql_test 5.4 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 3 PRECEDING EXCLUDE NO OTHERS
) FROM t1;
} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
do_execsql_test 5.5 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS
) FROM t1;
} {{} 234 {} 234 0 {} 1 {} 2 {} xyz 555 xyz 555}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 6.0 {
CREATE TABLE t1(a, c);
CREATE INDEX i1 ON t1(a);
INSERT INTO t1 VALUES(7, 997);
INSERT INTO t1 VALUES(8, 997);
INSERT INTO t1 VALUES('abc', 1001);
}
do_execsql_test 6.1 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
) FROM t1;
} {7 {} 8 {} abc 1001}
do_execsql_test 6.2 {
SELECT a, sum(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING EXCLUDE NO OTHERS
) FROM t1;
} {7 {} 8 {} abc 1001}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 7.0 {
CREATE TABLE t1(a, c);
CREATE INDEX i1 ON t1(a);
INSERT INTO t1 VALUES(NULL, 46);
INSERT INTO t1 VALUES(NULL, 45);
INSERT INTO t1 VALUES(7, 997);
INSERT INTO t1 VALUES(7, 1000);
INSERT INTO t1 VALUES(8, 997);
INSERT INTO t1 VALUES(8, 1000);
INSERT INTO t1 VALUES('abc', 1001);
INSERT INTO t1 VALUES('abc', 1004);
INSERT INTO t1 VALUES('xyz', 3333);
}
do_execsql_test 7.1 {
SELECT a, max(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
) FROM t1;
} {{} 46 {} 46 7 {} 7 {} 8 {} 8 {} abc 1004 abc 1004 xyz 3333}
do_execsql_test 7.2 {
SELECT a, min(c) OVER (
ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 0 FOLLOWING
) FROM t1;
} {{} 45 {} 45 7 {} 7 {} 8 {} 8 {} abc 1001 abc 1001 xyz 3333}
do_execsql_test 7.3 {
SELECT a, max(c) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING
) FROM t1;
} {{} 46 {} 46 7 {} 7 {} 8 {} 8 {} abc 1004 abc 1004 xyz 3333}
do_execsql_test 7.4 {
SELECT a, min(c) OVER (
ORDER BY a RANGE BETWEEN 0 PRECEDING AND 2 PRECEDING
) FROM t1;
} {{} 45 {} 45 7 {} 7 {} 8 {} 8 {} abc 1001 abc 1001 xyz 3333}
finish_test