1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Do not mistake constant integers in a PARTITION BY expression for references to ORDER BY style references to values returned by the SELECT statement.

FossilOrigin-Name: 45c64d39d5afed7fdc6b1de19408559740d1fba1f5e0269ab68b132366a289e4
This commit is contained in:
dan
2019-12-27 15:31:47 +00:00
parent 09bee5743d
commit d8d2fb9222
6 changed files with 103 additions and 19 deletions

View File

@ -1363,12 +1363,43 @@ do_execsql_test 39.4 {
# 2019-12-25 ticket d87336c81c7d0873
#
reset_db
do_catchsql_test 40.1 {
CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2);
SELECT * FROM t0
WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0);
} {1 {1st ORDER BY term out of range - should be between 1 and 3}}
#reset_db
#do_catchsql_test 40.1 {
# CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2);
# SELECT * FROM t0
# WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0);
#} {1 {1st ORDER BY term out of range - should be between 1 and 3}}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 41.1 {
CREATE TABLE t1(a, b, c);
INSERT INTO t1 VALUES(NULL,'bb',355);
INSERT INTO t1 VALUES('CC','aa',158);
INSERT INTO t1 VALUES('GG','bb',929);
INSERT INTO t1 VALUES('FF','Rb',574);
}
do_execsql_test 41.2 {
SELECT min(c) OVER (
ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
) FROM t1
} {355 158 574 929}
do_execsql_test 41.2 {
SELECT min(c) OVER (
ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
) << 100 FROM t1
} {0 0 0 0}
do_execsql_test 41.3 {
SELECT
min(c) OVER win3 << first_value(c) OVER win3,
min(c) OVER win3 << first_value(c) OVER win3
FROM t1
WINDOW win3 AS (
PARTITION BY 6 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
);
} {0 0 0 0 0 0 0 0}
finish_test

View File

@ -463,6 +463,32 @@ execsql_test 6.2 {
(0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0);
}
==========
execsql_test 7.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER);
INSERT INTO t1 VALUES(1, 1, 1);
INSERT INTO t1 VALUES(1, 2, 2);
INSERT INTO t1 VALUES(3, 3, 3);
INSERT INTO t1 VALUES(3, 4, 4);
}
execsql_test 7.1 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (ORDER BY b)
}
execsql_test 7.2 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (PARTITION BY 1 ORDER BY b)
}
execsql_test 7.3 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (ORDER BY 1)
}
finish_test

View File

@ -947,4 +947,30 @@ do_execsql_test 6.2 {
(0, t0.c0) IN (SELECT DENSE_RANK() OVER(), LAG(0) OVER() FROM t0);
} {}
#==========================================================================
do_execsql_test 7.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INTEGER, b INTEGER, c INTEGER);
INSERT INTO t1 VALUES(1, 1, 1);
INSERT INTO t1 VALUES(1, 2, 2);
INSERT INTO t1 VALUES(3, 3, 3);
INSERT INTO t1 VALUES(3, 4, 4);
} {}
do_execsql_test 7.1 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (ORDER BY b)
} {1 1 2 3 3 6 4 10}
do_execsql_test 7.2 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (PARTITION BY 1 ORDER BY b)
} {1 1 2 3 3 6 4 10}
do_execsql_test 7.3 {
SELECT c, sum(c) OVER win1 FROM t1
WINDOW win1 AS (ORDER BY 1)
} {1 10 2 10 3 10 4 10}
finish_test