sqlite/test/offset1.test
drh 9f1ef45f6a Fix the LIMIT and OFFSET handling for UNION ALL queries that contain a
subquery with ORDER BY on the right-hand side.  Fix for ticket
[b65cb2c8d91f668584].

FossilOrigin-Name: 4b631364354068af95a01630469cb6fbfe8b52fd
2015-10-06 17:27:18 +00:00

162 lines
4.0 KiB
Plaintext

# 2015-10-06
#
# 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.
#
#***********************************************************************
#
# This file implements test cases for the [b65cb2c8d91f6685841d7d1e13b6]
# bug: Correct handling of LIMIT and OFFSET on a UNION ALL query where
# the right-hand SELECT contains an ORDER BY in a subquery.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !compound {
finish_test
return
}
do_execsql_test offset1-1.1 {
CREATE TABLE t1(a,b);
INSERT INTO t1 VALUES(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e');
CREATE TABLE t2(x,y);
INSERT INTO t2 VALUES(8,'y'),(9,'z'),(6,'w'),(7,'x');
SELECT count(*) FROM t1, t2;
} {20}
do_execsql_test offset1-1.2.0 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 0;
} {1 a 2 b 3 c}
do_execsql_test offset1-1.2.1 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 1;
} {2 b 3 c 4 d}
do_execsql_test offset1-1.2.2 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 2;
} {3 c 4 d 5 e}
do_execsql_test offset1-1.2.3 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 3;
} {4 d 5 e 6 w}
do_execsql_test offset1-1.2.4 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 4;
} {5 e 6 w 7 x}
do_execsql_test offset1-1.2.5 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 5;
} {6 w 7 x 8 y}
do_execsql_test offset1-1.2.6 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 6;
} {7 x 8 y 9 z}
do_execsql_test offset1-1.2.7 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 7;
} {8 y 9 z}
do_execsql_test offset1-1.2.8 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 8;
} {9 z}
do_execsql_test offset1-1.2.9 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 9;
} {}
do_execsql_test offset1-1.3.0 {
SELECT * FROM t1 LIMIT 0;
} {}
do_execsql_test offset1-1.4.0 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 0 OFFSET 1;
} {}
do_execsql_test offset1-1.4.1 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 1 OFFSET 1;
} {2 b}
do_execsql_test offset1-1.4.2 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 2 OFFSET 1;
} {2 b 3 c}
do_execsql_test offset1-1.4.3 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 1;
} {2 b 3 c 4 d}
do_execsql_test offset1-1.4.4 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 4 OFFSET 1;
} {2 b 3 c 4 d 5 e}
do_execsql_test offset1-1.4.5 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 5 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w}
do_execsql_test offset1-1.4.6 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 6 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x}
do_execsql_test offset1-1.4.7 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 7 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y}
do_execsql_test offset1-1.4.8 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 8 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z}
do_execsql_test offset1-1.4.9 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 9 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z}
finish_test