117e24df6Sdrh# 2001 November 6 217e24df6Sdrh# 317e24df6Sdrh# The author disclaims copyright to this source code. In place of 417e24df6Sdrh# a legal notice, here is a blessing: 517e24df6Sdrh# 617e24df6Sdrh# May you do good and not evil. 717e24df6Sdrh# May you find forgiveness for yourself and forgive others. 817e24df6Sdrh# May you share freely, never taking more than you give. 917e24df6Sdrh# 1017e24df6Sdrh#*********************************************************************** 1117e24df6Sdrh# This file implements regression tests for SQLite library. The 1217e24df6Sdrh# focus of this file is testing the LIMIT ... OFFSET ... clause 1317e24df6Sdrh# of SELECT statements. 1417e24df6Sdrh# 15701bb3b4Sdrh# $Id: limit.test,v 1.32 2008/08/02 03:50:39 drh Exp $ 1617e24df6Sdrh 1717e24df6Sdrhset testdir [file dirname $argv0] 1817e24df6Sdrhsource $testdir/tester.tcl 1917e24df6Sdrh 2017e24df6Sdrh# Build some test data 2117e24df6Sdrh# 2217e24df6Sdrhexecsql { 2317e24df6Sdrh CREATE TABLE t1(x int, y int); 245f3b4ab5Sdrh BEGIN; 2517e24df6Sdrh} 265f3b4ab5Sdrhfor {set i 1} {$i<=32} {incr i} { 2724acd8f9Sdanielk1977 for {set j 0} {(1<<$j)<$i} {incr j} {} 285f3b4ab5Sdrh execsql "INSERT INTO t1 VALUES([expr {32-$i}],[expr {10-$j}])" 295f3b4ab5Sdrh} 305f3b4ab5Sdrhexecsql { 315f3b4ab5Sdrh COMMIT; 325f3b4ab5Sdrh} 3317e24df6Sdrh 3417e24df6Sdrhdo_test limit-1.0 { 3517e24df6Sdrh execsql {SELECT count(*) FROM t1} 3617e24df6Sdrh} {32} 3717e24df6Sdrhdo_test limit-1.1 { 3817e24df6Sdrh execsql {SELECT count(*) FROM t1 LIMIT 5} 3917e24df6Sdrh} {32} 40e6da3c18Sdrhdo_test limit-1.2.1 { 4117e24df6Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 5} 4217e24df6Sdrh} {0 1 2 3 4} 43e6da3c18Sdrhdo_test limit-1.2.2 { 44e6da3c18Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 5 OFFSET 2} 45e6da3c18Sdrh} {2 3 4 5 6} 46e6da3c18Sdrhdo_test limit-1.2.3 { 4715007a99Sdrh execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT 5 OFFSET -2} 4815007a99Sdrh} {0 1 2 3 4} 4915007a99Sdrhdo_test limit-1.2.4 { 5015007a99Sdrh execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT 2, -5} 5115007a99Sdrh} {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31} 5215007a99Sdrhdo_test limit-1.2.5 { 5315007a99Sdrh execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT -2, 5} 5415007a99Sdrh} {0 1 2 3 4} 5515007a99Sdrhdo_test limit-1.2.6 { 5615007a99Sdrh execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT -2, -5} 5715007a99Sdrh} {0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31} 5815007a99Sdrhdo_test limit-1.2.7 { 59e6da3c18Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 2, 5} 60e6da3c18Sdrh} {2 3 4 5 6} 6117e24df6Sdrhdo_test limit-1.3 { 6217e24df6Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 5 OFFSET 5} 6317e24df6Sdrh} {5 6 7 8 9} 64e6da3c18Sdrhdo_test limit-1.4.1 { 6517e24df6Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 50 OFFSET 30} 6617e24df6Sdrh} {30 31} 67e6da3c18Sdrhdo_test limit-1.4.2 { 68e6da3c18Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 30, 50} 69e6da3c18Sdrh} {30 31} 7017e24df6Sdrhdo_test limit-1.5 { 7117e24df6Sdrh execsql {SELECT x FROM t1 ORDER BY x LIMIT 50 OFFSET 50} 7217e24df6Sdrh} {} 7317e24df6Sdrhdo_test limit-1.6 { 7401f3f253Sdrh execsql {SELECT * FROM t1 AS a, t1 AS b ORDER BY a.x, b.x LIMIT 5} 7517e24df6Sdrh} {0 5 0 5 0 5 1 5 0 5 2 5 0 5 3 5 0 5 4 5} 7617e24df6Sdrhdo_test limit-1.7 { 7701f3f253Sdrh execsql {SELECT * FROM t1 AS a, t1 AS b ORDER BY a.x, b.x LIMIT 5 OFFSET 32} 7817e24df6Sdrh} {1 5 0 5 1 5 1 5 1 5 2 5 1 5 3 5 1 5 4 5} 7917e24df6Sdrh 80e61b9f4fSdanielk1977ifcapable {view && subquery} { 81df199a25Sdrh do_test limit-2.1 { 82df199a25Sdrh execsql { 83df199a25Sdrh CREATE VIEW v1 AS SELECT * FROM t1 LIMIT 2; 84df199a25Sdrh SELECT count(*) FROM (SELECT * FROM v1); 85df199a25Sdrh } 86df199a25Sdrh } 2 870fa8ddbdSdanielk1977} ;# ifcapable view 88df199a25Sdrhdo_test limit-2.2 { 89df199a25Sdrh execsql { 90df199a25Sdrh CREATE TABLE t2 AS SELECT * FROM t1 LIMIT 2; 91df199a25Sdrh SELECT count(*) FROM t2; 92df199a25Sdrh } 93df199a25Sdrh} 2 943e8c37e7Sdanielk1977ifcapable subquery { 95df199a25Sdrh do_test limit-2.3 { 96df199a25Sdrh execsql { 97df199a25Sdrh SELECT count(*) FROM t1 WHERE rowid IN (SELECT rowid FROM t1 LIMIT 2); 98df199a25Sdrh } 99df199a25Sdrh } 2 1003e8c37e7Sdanielk1977} 101df199a25Sdrh 1023e8c37e7Sdanielk1977ifcapable subquery { 103d11d382cSdrh do_test limit-3.1 { 104d11d382cSdrh execsql { 105d11d382cSdrh SELECT z FROM (SELECT y*10+x AS z FROM t1 ORDER BY x LIMIT 10) 106d11d382cSdrh ORDER BY z LIMIT 5; 107d11d382cSdrh } 108d11d382cSdrh } {50 51 52 53 54} 1093e8c37e7Sdanielk1977} 110d11d382cSdrh 111d11d382cSdrhdo_test limit-4.1 { 1123e8c37e7Sdanielk1977 ifcapable subquery { 113d11d382cSdrh execsql { 114d11d382cSdrh BEGIN; 115489c4677Sdrh CREATE TABLE t3(x); 116489c4677Sdrh INSERT INTO t3 SELECT x FROM t1 ORDER BY x LIMIT 10 OFFSET 1; 117d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 118d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 119d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 120d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 121d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 122d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 123d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 124d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 125d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 126d11d382cSdrh INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3; 127d11d382cSdrh END; 128d11d382cSdrh SELECT count(*) FROM t3; 129d11d382cSdrh } 1303e8c37e7Sdanielk1977 } else { 1313e8c37e7Sdanielk1977 execsql { 1323e8c37e7Sdanielk1977 BEGIN; 1333e8c37e7Sdanielk1977 CREATE TABLE t3(x); 1343e8c37e7Sdanielk1977 INSERT INTO t3 SELECT x FROM t1 ORDER BY x LIMIT 10 OFFSET 1; 1353e8c37e7Sdanielk1977 } 1363e8c37e7Sdanielk1977 for {set i 0} {$i<10} {incr i} { 1373e8c37e7Sdanielk1977 set max_x_t3 [execsql {SELECT max(x) FROM t3}] 1383e8c37e7Sdanielk1977 execsql "INSERT INTO t3 SELECT x+$max_x_t3 FROM t3;" 1393e8c37e7Sdanielk1977 } 1403e8c37e7Sdanielk1977 execsql { 1413e8c37e7Sdanielk1977 END; 1423e8c37e7Sdanielk1977 SELECT count(*) FROM t3; 1433e8c37e7Sdanielk1977 } 1443e8c37e7Sdanielk1977 } 145d11d382cSdrh} {10240} 146d11d382cSdrhdo_test limit-4.2 { 147d11d382cSdrh execsql { 148d11d382cSdrh SELECT x FROM t3 LIMIT 2 OFFSET 10000 149d11d382cSdrh } 150d11d382cSdrh} {10001 10002} 151d11d382cSdrhdo_test limit-4.3 { 152d11d382cSdrh execsql { 153d11d382cSdrh CREATE TABLE t4 AS SELECT x, 154d11d382cSdrh 'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x || 155d11d382cSdrh 'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x || 156d11d382cSdrh 'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x || 157d11d382cSdrh 'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x || 158d11d382cSdrh 'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x AS y 159d11d382cSdrh FROM t3 LIMIT 1000; 160d11d382cSdrh SELECT x FROM t4 ORDER BY y DESC LIMIT 1 OFFSET 999; 161d11d382cSdrh } 162a9e99aeeSdrh} {1000} 16317e24df6Sdrh 164ac82fcf5Sdrhdo_test limit-5.1 { 165ac82fcf5Sdrh execsql { 166ac82fcf5Sdrh CREATE TABLE t5(x,y); 167ac82fcf5Sdrh INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x BETWEEN 10 AND 15 168ac82fcf5Sdrh ORDER BY x LIMIT 2; 169ac82fcf5Sdrh SELECT * FROM t5 ORDER BY x; 170ac82fcf5Sdrh } 171ac82fcf5Sdrh} {5 15 6 16} 172ac82fcf5Sdrhdo_test limit-5.2 { 173ac82fcf5Sdrh execsql { 174ac82fcf5Sdrh DELETE FROM t5; 175ac82fcf5Sdrh INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x BETWEEN 10 AND 15 176ac82fcf5Sdrh ORDER BY x DESC LIMIT 2; 177ac82fcf5Sdrh SELECT * FROM t5 ORDER BY x; 178ac82fcf5Sdrh } 179ac82fcf5Sdrh} {9 19 10 20} 180ac82fcf5Sdrhdo_test limit-5.3 { 181ac82fcf5Sdrh execsql { 182ac82fcf5Sdrh DELETE FROM t5; 183ac82fcf5Sdrh INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x ORDER BY x DESC LIMIT 31; 184ac82fcf5Sdrh SELECT * FROM t5 ORDER BY x LIMIT 2; 185ac82fcf5Sdrh } 186ac82fcf5Sdrh} {-4 6 -3 7} 187ac82fcf5Sdrhdo_test limit-5.4 { 188ac82fcf5Sdrh execsql { 189ac82fcf5Sdrh SELECT * FROM t5 ORDER BY x DESC, y DESC LIMIT 2; 190ac82fcf5Sdrh } 191ac82fcf5Sdrh} {21 41 21 39} 192ac82fcf5Sdrhdo_test limit-5.5 { 193ac82fcf5Sdrh execsql { 194ac82fcf5Sdrh DELETE FROM t5; 195ac82fcf5Sdrh INSERT INTO t5 SELECT a.x*100+b.x, a.y*100+b.y FROM t1 AS a, t1 AS b 196ac82fcf5Sdrh ORDER BY 1, 2 LIMIT 1000; 197ac82fcf5Sdrh SELECT count(*), sum(x), sum(y), min(x), max(x), min(y), max(y) FROM t5; 198ac82fcf5Sdrh } 1993d1d95e6Sdrh} {1000 1528204 593161 0 3107 505 1005} 200ac82fcf5Sdrh 201ef0cae50Sdrh# There is some contraversy about whether LIMIT 0 should be the same as 202ef0cae50Sdrh# no limit at all or if LIMIT 0 should result in zero output rows. 203ef0cae50Sdrh# 204ef0cae50Sdrhdo_test limit-6.1 { 205ef0cae50Sdrh execsql { 206ef0cae50Sdrh BEGIN; 207ef0cae50Sdrh CREATE TABLE t6(a); 208ef0cae50Sdrh INSERT INTO t6 VALUES(1); 209ef0cae50Sdrh INSERT INTO t6 VALUES(2); 210ef0cae50Sdrh INSERT INTO t6 SELECT a+2 FROM t6; 211ef0cae50Sdrh COMMIT; 212ef0cae50Sdrh SELECT * FROM t6; 213ef0cae50Sdrh } 214ef0cae50Sdrh} {1 2 3 4} 215ef0cae50Sdrhdo_test limit-6.2 { 216ef0cae50Sdrh execsql { 217ef0cae50Sdrh SELECT * FROM t6 LIMIT -1 OFFSET -1; 218ef0cae50Sdrh } 219ef0cae50Sdrh} {1 2 3 4} 220ef0cae50Sdrhdo_test limit-6.3 { 221ef0cae50Sdrh execsql { 222ef0cae50Sdrh SELECT * FROM t6 LIMIT 2 OFFSET -123; 223ef0cae50Sdrh } 224ef0cae50Sdrh} {1 2} 225ef0cae50Sdrhdo_test limit-6.4 { 226ef0cae50Sdrh execsql { 227ef0cae50Sdrh SELECT * FROM t6 LIMIT -432 OFFSET 2; 228ef0cae50Sdrh } 229ef0cae50Sdrh} {3 4} 230ef0cae50Sdrhdo_test limit-6.5 { 231ef0cae50Sdrh execsql { 232a88dc3f6Sdrh SELECT * FROM t6 LIMIT -1 233ef0cae50Sdrh } 234ef0cae50Sdrh} {1 2 3 4} 235ef0cae50Sdrhdo_test limit-6.6 { 236ef0cae50Sdrh execsql { 237a88dc3f6Sdrh SELECT * FROM t6 LIMIT -1 OFFSET 1 238ef0cae50Sdrh } 239ef0cae50Sdrh} {2 3 4} 240a88dc3f6Sdrhdo_test limit-6.7 { 241a88dc3f6Sdrh execsql { 242a88dc3f6Sdrh SELECT * FROM t6 LIMIT 0 243a88dc3f6Sdrh } 244a88dc3f6Sdrh} {} 245a88dc3f6Sdrhdo_test limit-6.8 { 246a88dc3f6Sdrh execsql { 247a88dc3f6Sdrh SELECT * FROM t6 LIMIT 0 OFFSET 1 248a88dc3f6Sdrh } 249a88dc3f6Sdrh} {} 250ef0cae50Sdrh 2517b58daeaSdrh# Make sure LIMIT works well with compound SELECT statements. 2527b58daeaSdrh# Ticket #393 2537b58daeaSdrh# 2542af878ecSdrh# EVIDENCE-OF: R-13512-64012 In a compound SELECT, only the last or 2552af878ecSdrh# right-most simple SELECT may contain a LIMIT clause. 2562af878ecSdrh# 2572af878ecSdrh# EVIDENCE-OF: R-03782-50113 In a compound SELECT, the LIMIT clause 2582af878ecSdrh# applies to the entire compound, not just the final SELECT. 2592af878ecSdrh# 26027c77438Sdanielk1977ifcapable compound { 2617b58daeaSdrhdo_test limit-7.1.1 { 2627b58daeaSdrh catchsql { 2637b58daeaSdrh SELECT x FROM t2 LIMIT 5 UNION ALL SELECT a FROM t6; 2647b58daeaSdrh } 2657b58daeaSdrh} {1 {LIMIT clause should come after UNION ALL not before}} 2667b58daeaSdrhdo_test limit-7.1.2 { 2677b58daeaSdrh catchsql { 2687b58daeaSdrh SELECT x FROM t2 LIMIT 5 UNION SELECT a FROM t6; 2697b58daeaSdrh } 2707b58daeaSdrh} {1 {LIMIT clause should come after UNION not before}} 2717b58daeaSdrhdo_test limit-7.1.3 { 2727b58daeaSdrh catchsql { 2737b58daeaSdrh SELECT x FROM t2 LIMIT 5 EXCEPT SELECT a FROM t6 LIMIT 3; 2747b58daeaSdrh } 2757b58daeaSdrh} {1 {LIMIT clause should come after EXCEPT not before}} 2767b58daeaSdrhdo_test limit-7.1.4 { 2777b58daeaSdrh catchsql { 2787b58daeaSdrh SELECT x FROM t2 LIMIT 0,5 INTERSECT SELECT a FROM t6; 2797b58daeaSdrh } 2807b58daeaSdrh} {1 {LIMIT clause should come after INTERSECT not before}} 2817b58daeaSdrhdo_test limit-7.2 { 2827b58daeaSdrh execsql { 2837b58daeaSdrh SELECT x FROM t2 UNION ALL SELECT a FROM t6 LIMIT 5; 2847b58daeaSdrh } 2857b58daeaSdrh} {31 30 1 2 3} 2867b58daeaSdrhdo_test limit-7.3 { 2877b58daeaSdrh execsql { 2887b58daeaSdrh SELECT x FROM t2 UNION ALL SELECT a FROM t6 LIMIT 3 OFFSET 1; 2897b58daeaSdrh } 2907b58daeaSdrh} {30 1 2} 2917b58daeaSdrhdo_test limit-7.4 { 2927b58daeaSdrh execsql { 2937b58daeaSdrh SELECT x FROM t2 UNION ALL SELECT a FROM t6 ORDER BY 1 LIMIT 3 OFFSET 1; 2947b58daeaSdrh } 2957b58daeaSdrh} {2 3 4} 2967b58daeaSdrhdo_test limit-7.5 { 2977b58daeaSdrh execsql { 2987b58daeaSdrh SELECT x FROM t2 UNION SELECT x+2 FROM t2 LIMIT 2 OFFSET 1; 2997b58daeaSdrh } 3007b58daeaSdrh} {31 32} 3017b58daeaSdrhdo_test limit-7.6 { 3027b58daeaSdrh execsql { 3037b58daeaSdrh SELECT x FROM t2 UNION SELECT x+2 FROM t2 ORDER BY 1 DESC LIMIT 2 OFFSET 1; 3047b58daeaSdrh } 3057b58daeaSdrh} {32 31} 3067b58daeaSdrhdo_test limit-7.7 { 3077b58daeaSdrh execsql { 3087b58daeaSdrh SELECT a+9 FROM t6 EXCEPT SELECT y FROM t2 LIMIT 2; 3097b58daeaSdrh } 3107b58daeaSdrh} {11 12} 3117b58daeaSdrhdo_test limit-7.8 { 3127b58daeaSdrh execsql { 3137b58daeaSdrh SELECT a+9 FROM t6 EXCEPT SELECT y FROM t2 ORDER BY 1 DESC LIMIT 2; 3147b58daeaSdrh } 3157b58daeaSdrh} {13 12} 3167b58daeaSdrhdo_test limit-7.9 { 3177b58daeaSdrh execsql { 3187b58daeaSdrh SELECT a+26 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1; 3197b58daeaSdrh } 3207b58daeaSdrh} {30} 3217b58daeaSdrhdo_test limit-7.10 { 3227b58daeaSdrh execsql { 3237b58daeaSdrh SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1; 3247b58daeaSdrh } 3257b58daeaSdrh} {30} 3267b58daeaSdrhdo_test limit-7.11 { 3277b58daeaSdrh execsql { 3287b58daeaSdrh SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1 OFFSET 1; 3297b58daeaSdrh } 3307b58daeaSdrh} {31} 3317b58daeaSdrhdo_test limit-7.12 { 3327b58daeaSdrh execsql { 3337b58daeaSdrh SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2 3347b58daeaSdrh ORDER BY 1 DESC LIMIT 1 OFFSET 1; 3357b58daeaSdrh } 3367b58daeaSdrh} {30} 33727c77438Sdanielk1977} ;# ifcapable compound 3387b58daeaSdrh 339bab39e13Sdrh# Tests for limit in conjunction with distinct. The distinct should 340bab39e13Sdrh# occur before both the limit and the offset. Ticket #749. 341ea48eb2eSdrh# 342ea48eb2eSdrhdo_test limit-8.1 { 343ea48eb2eSdrh execsql { 34457bacb22Sdrh SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5; 345ea48eb2eSdrh } 346ea48eb2eSdrh} {0 1 2 3 4} 347ea48eb2eSdrhdo_test limit-8.2 { 348ea48eb2eSdrh execsql { 34957bacb22Sdrh SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5 OFFSET 5; 350ea48eb2eSdrh } 351ea48eb2eSdrh} {5 6 7 8 9} 352bab39e13Sdrhdo_test limit-8.3 { 353bab39e13Sdrh execsql { 35457bacb22Sdrh SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5 OFFSET 25; 355bab39e13Sdrh } 356bab39e13Sdrh} {25 26 27 28 29} 357ea48eb2eSdrh 358be5fd490Sdrh# Make sure limits on multiple subqueries work correctly. 359be5fd490Sdrh# Ticket #1035 360be5fd490Sdrh# 3613e8c37e7Sdanielk1977ifcapable subquery { 362be5fd490Sdrh do_test limit-9.1 { 363be5fd490Sdrh execsql { 364be5fd490Sdrh SELECT * FROM (SELECT * FROM t6 LIMIT 3); 365be5fd490Sdrh } 366be5fd490Sdrh } {1 2 3} 3673e8c37e7Sdanielk1977} 3683e8c37e7Sdanielk1977do_test limit-9.2.1 { 369be5fd490Sdrh execsql { 370be5fd490Sdrh CREATE TABLE t7 AS SELECT * FROM t6; 3713e8c37e7Sdanielk1977 } 3723e8c37e7Sdanielk1977} {} 3733e8c37e7Sdanielk1977ifcapable subquery { 3743e8c37e7Sdanielk1977 do_test limit-9.2.2 { 3753e8c37e7Sdanielk1977 execsql { 376be5fd490Sdrh SELECT * FROM (SELECT * FROM t7 LIMIT 3); 377be5fd490Sdrh } 378be5fd490Sdrh } {1 2 3} 3793e8c37e7Sdanielk1977} 3804489f9bdSdanielk1977ifcapable compound { 3813e8c37e7Sdanielk1977 ifcapable subquery { 382be5fd490Sdrh do_test limit-9.3 { 383be5fd490Sdrh execsql { 384be5fd490Sdrh SELECT * FROM (SELECT * FROM t6 LIMIT 3) 385be5fd490Sdrh UNION 386be5fd490Sdrh SELECT * FROM (SELECT * FROM t7 LIMIT 3) 387be5fd490Sdrh ORDER BY 1 388be5fd490Sdrh } 389be5fd490Sdrh } {1 2 3} 390be5fd490Sdrh do_test limit-9.4 { 391be5fd490Sdrh execsql { 392be5fd490Sdrh SELECT * FROM (SELECT * FROM t6 LIMIT 3) 393be5fd490Sdrh UNION 394be5fd490Sdrh SELECT * FROM (SELECT * FROM t7 LIMIT 3) 395be5fd490Sdrh ORDER BY 1 396be5fd490Sdrh LIMIT 2 397be5fd490Sdrh } 398be5fd490Sdrh } {1 2} 3993e8c37e7Sdanielk1977 } 400018d1a49Sdrh do_test limit-9.5 { 401018d1a49Sdrh catchsql { 402018d1a49Sdrh SELECT * FROM t6 LIMIT 3 403018d1a49Sdrh UNION 404018d1a49Sdrh SELECT * FROM t7 LIMIT 3 405018d1a49Sdrh } 406018d1a49Sdrh } {1 {LIMIT clause should come after UNION not before}} 4074489f9bdSdanielk1977} 408be5fd490Sdrh 409a2dc3b1aSdanielk1977# Test LIMIT and OFFSET using SQL variables. 410a2dc3b1aSdanielk1977do_test limit-10.1 { 411a2dc3b1aSdanielk1977 set limit 10 412a2dc3b1aSdanielk1977 db eval { 4133bdca9c9Sdanielk1977 SELECT x FROM t1 LIMIT :limit; 414a2dc3b1aSdanielk1977 } 415a2dc3b1aSdanielk1977} {31 30 29 28 27 26 25 24 23 22} 416a2dc3b1aSdanielk1977do_test limit-10.2 { 417a2dc3b1aSdanielk1977 set limit 5 418a2dc3b1aSdanielk1977 set offset 5 419a2dc3b1aSdanielk1977 db eval { 4203bdca9c9Sdanielk1977 SELECT x FROM t1 LIMIT :limit OFFSET :offset; 421a2dc3b1aSdanielk1977 } 422a2dc3b1aSdanielk1977} {26 25 24 23 22} 423a2dc3b1aSdanielk1977do_test limit-10.3 { 424a2dc3b1aSdanielk1977 set limit -1 425a2dc3b1aSdanielk1977 db eval { 4263bdca9c9Sdanielk1977 SELECT x FROM t1 WHERE x<10 LIMIT :limit; 427a2dc3b1aSdanielk1977 } 428a2dc3b1aSdanielk1977} {9 8 7 6 5 4 3 2 1 0} 429a2dc3b1aSdanielk1977do_test limit-10.4 { 430a2dc3b1aSdanielk1977 set limit 1.5 431a2dc3b1aSdanielk1977 set rc [catch { 432a2dc3b1aSdanielk1977 db eval { 4333bdca9c9Sdanielk1977 SELECT x FROM t1 WHERE x<10 LIMIT :limit; 434a2dc3b1aSdanielk1977 } } msg] 435a2dc3b1aSdanielk1977 list $rc $msg 436a2dc3b1aSdanielk1977} {1 {datatype mismatch}} 437a2dc3b1aSdanielk1977do_test limit-10.5 { 438a2dc3b1aSdanielk1977 set limit "hello world" 439a2dc3b1aSdanielk1977 set rc [catch { 440a2dc3b1aSdanielk1977 db eval { 4413bdca9c9Sdanielk1977 SELECT x FROM t1 WHERE x<10 LIMIT :limit; 442a2dc3b1aSdanielk1977 } } msg] 443a2dc3b1aSdanielk1977 list $rc $msg 444a2dc3b1aSdanielk1977} {1 {datatype mismatch}} 445a2dc3b1aSdanielk1977 4464b2688abSdanielk1977ifcapable subquery { 447f42bacc2Sdrhdo_test limit-11.1 { 448f42bacc2Sdrh db eval { 449f42bacc2Sdrh SELECT x FROM (SELECT x FROM t1 ORDER BY x LIMIT 0) ORDER BY x 450f42bacc2Sdrh } 451f42bacc2Sdrh} {} 4524b2688abSdanielk1977} ;# ifcapable subquery 453f42bacc2Sdrh 454701bb3b4Sdrh# Test error processing. 455701bb3b4Sdrh# 456701bb3b4Sdrhdo_test limit-12.1 { 457701bb3b4Sdrh catchsql { 458701bb3b4Sdrh SELECT * FROM t1 LIMIT replace(1) 459701bb3b4Sdrh } 460701bb3b4Sdrh} {1 {wrong number of arguments to function replace()}} 461701bb3b4Sdrhdo_test limit-12.2 { 462701bb3b4Sdrh catchsql { 463701bb3b4Sdrh SELECT * FROM t1 LIMIT 5 OFFSET replace(1) 464701bb3b4Sdrh } 465701bb3b4Sdrh} {1 {wrong number of arguments to function replace()}} 466701bb3b4Sdrhdo_test limit-12.3 { 467701bb3b4Sdrh catchsql { 468701bb3b4Sdrh SELECT * FROM t1 LIMIT x 469701bb3b4Sdrh } 470701bb3b4Sdrh} {1 {no such column: x}} 471701bb3b4Sdrhdo_test limit-12.4 { 472701bb3b4Sdrh catchsql { 473701bb3b4Sdrh SELECT * FROM t1 LIMIT 1 OFFSET x 474701bb3b4Sdrh } 475701bb3b4Sdrh} {1 {no such column: x}} 476701bb3b4Sdrh 477547180baSdrh# Ticket [db4d96798da8b] 478547180baSdrh# LIMIT does not work with nested views containing UNION ALL 479547180baSdrh# 480547180baSdrhdo_test limit-13.1 { 481547180baSdrh db eval { 482547180baSdrh CREATE TABLE t13(x); 483547180baSdrh INSERT INTO t13 VALUES(1),(2); 484547180baSdrh CREATE VIEW v13a AS SELECT x AS y FROM t13; 485547180baSdrh CREATE VIEW v13b AS SELECT y AS z FROM v13a UNION ALL SELECT y+10 FROM v13a; 486547180baSdrh CREATE VIEW v13c AS SELECT z FROM v13b UNION ALL SELECT z+20 FROM v13b; 487547180baSdrh } 488547180baSdrh} {} 489547180baSdrhdo_test limit-13.2 { 490547180baSdrh db eval {SELECT z FROM v13c LIMIT 1} 491547180baSdrh} {1} 492547180baSdrhdo_test limit-13.3 { 493547180baSdrh db eval {SELECT z FROM v13c LIMIT 2} 494547180baSdrh} {1 2} 495547180baSdrhdo_test limit-13.4 { 496547180baSdrh db eval {SELECT z FROM v13c LIMIT 3} 497547180baSdrh} {1 2 11} 498547180baSdrhdo_test limit-13.5 { 499547180baSdrh db eval {SELECT z FROM v13c LIMIT 4} 500547180baSdrh} {1 2 11 12} 501547180baSdrhdo_test limit-13.6 { 502547180baSdrh db eval {SELECT z FROM v13c LIMIT 5} 503547180baSdrh} {1 2 11 12 21} 504547180baSdrhdo_test limit-13.7 { 505547180baSdrh db eval {SELECT z FROM v13c LIMIT 6} 506547180baSdrh} {1 2 11 12 21 22} 507547180baSdrhdo_test limit-13.8 { 508547180baSdrh db eval {SELECT z FROM v13c LIMIT 7} 509547180baSdrh} {1 2 11 12 21 22 31} 510547180baSdrhdo_test limit-13.9 { 511547180baSdrh db eval {SELECT z FROM v13c LIMIT 8} 512547180baSdrh} {1 2 11 12 21 22 31 32} 513547180baSdrhdo_test limit-13.10 { 514547180baSdrh db eval {SELECT z FROM v13c LIMIT 9} 515547180baSdrh} {1 2 11 12 21 22 31 32} 516547180baSdrhdo_test limit-13.11 { 517547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 1} 518547180baSdrh} {2} 519547180baSdrhdo_test limit-13.12 { 520547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 1} 521547180baSdrh} {2 11} 522547180baSdrhdo_test limit-13.13 { 523547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 1} 524547180baSdrh} {2 11 12} 525547180baSdrhdo_test limit-13.14 { 526547180baSdrh db eval {SELECT z FROM v13c LIMIT 4 OFFSET 1} 527547180baSdrh} {2 11 12 21} 528547180baSdrhdo_test limit-13.15 { 529547180baSdrh db eval {SELECT z FROM v13c LIMIT 5 OFFSET 1} 530547180baSdrh} {2 11 12 21 22} 531547180baSdrhdo_test limit-13.16 { 532547180baSdrh db eval {SELECT z FROM v13c LIMIT 6 OFFSET 1} 533547180baSdrh} {2 11 12 21 22 31} 534547180baSdrhdo_test limit-13.17 { 535547180baSdrh db eval {SELECT z FROM v13c LIMIT 7 OFFSET 1} 536547180baSdrh} {2 11 12 21 22 31 32} 537547180baSdrhdo_test limit-13.18 { 538547180baSdrh db eval {SELECT z FROM v13c LIMIT 8 OFFSET 1} 539547180baSdrh} {2 11 12 21 22 31 32} 540547180baSdrhdo_test limit-13.21 { 541547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 2} 542547180baSdrh} {11} 543547180baSdrhdo_test limit-13.22 { 544547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 2} 545547180baSdrh} {11 12} 546547180baSdrhdo_test limit-13.23 { 547547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 2} 548547180baSdrh} {11 12 21} 549547180baSdrhdo_test limit-13.24 { 550547180baSdrh db eval {SELECT z FROM v13c LIMIT 4 OFFSET 2} 551547180baSdrh} {11 12 21 22} 552547180baSdrhdo_test limit-13.25 { 553547180baSdrh db eval {SELECT z FROM v13c LIMIT 5 OFFSET 2} 554547180baSdrh} {11 12 21 22 31} 555547180baSdrhdo_test limit-13.26 { 556547180baSdrh db eval {SELECT z FROM v13c LIMIT 6 OFFSET 2} 557547180baSdrh} {11 12 21 22 31 32} 558547180baSdrhdo_test limit-13.27 { 559547180baSdrh db eval {SELECT z FROM v13c LIMIT 7 OFFSET 2} 560547180baSdrh} {11 12 21 22 31 32} 561547180baSdrhdo_test limit-13.31 { 562547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 3} 563547180baSdrh} {12} 564547180baSdrhdo_test limit-13.32 { 565547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 3} 566547180baSdrh} {12 21} 567547180baSdrhdo_test limit-13.33 { 568547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 3} 569547180baSdrh} {12 21 22} 570547180baSdrhdo_test limit-13.34 { 571547180baSdrh db eval {SELECT z FROM v13c LIMIT 4 OFFSET 3} 572547180baSdrh} {12 21 22 31} 573547180baSdrhdo_test limit-13.35 { 574547180baSdrh db eval {SELECT z FROM v13c LIMIT 5 OFFSET 3} 575547180baSdrh} {12 21 22 31 32} 576547180baSdrhdo_test limit-13.36 { 577547180baSdrh db eval {SELECT z FROM v13c LIMIT 6 OFFSET 3} 578547180baSdrh} {12 21 22 31 32} 579547180baSdrhdo_test limit-13.41 { 580547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 4} 581547180baSdrh} {21} 582547180baSdrhdo_test limit-13.42 { 583547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 4} 584547180baSdrh} {21 22} 585547180baSdrhdo_test limit-13.43 { 586547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 4} 587547180baSdrh} {21 22 31} 588547180baSdrhdo_test limit-13.44 { 589547180baSdrh db eval {SELECT z FROM v13c LIMIT 4 OFFSET 4} 590547180baSdrh} {21 22 31 32} 591547180baSdrhdo_test limit-13.45 { 592547180baSdrh db eval {SELECT z FROM v13c LIMIT 5 OFFSET 4} 593547180baSdrh} {21 22 31 32} 594547180baSdrhdo_test limit-13.51 { 595547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 5} 596547180baSdrh} {22} 597547180baSdrhdo_test limit-13.52 { 598547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 5} 599547180baSdrh} {22 31} 600547180baSdrhdo_test limit-13.53 { 601547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 5} 602547180baSdrh} {22 31 32} 603547180baSdrhdo_test limit-13.54 { 604547180baSdrh db eval {SELECT z FROM v13c LIMIT 4 OFFSET 5} 605547180baSdrh} {22 31 32} 606547180baSdrhdo_test limit-13.61 { 607547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 6} 608547180baSdrh} {31} 609547180baSdrhdo_test limit-13.62 { 610547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 6} 611547180baSdrh} {31 32} 612547180baSdrhdo_test limit-13.63 { 613547180baSdrh db eval {SELECT z FROM v13c LIMIT 3 OFFSET 6} 614547180baSdrh} {31 32} 615547180baSdrhdo_test limit-13.71 { 616547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 7} 617547180baSdrh} {32} 618547180baSdrhdo_test limit-13.72 { 619547180baSdrh db eval {SELECT z FROM v13c LIMIT 2 OFFSET 7} 620547180baSdrh} {32} 621547180baSdrhdo_test limit-13.81 { 622547180baSdrh db eval {SELECT z FROM v13c LIMIT 1 OFFSET 8} 623547180baSdrh} {} 624701bb3b4Sdrh 625a22a75e5Sdrhdo_execsql_test limit-14.1 { 626a22a75e5Sdrh SELECT 123 LIMIT 1 OFFSET 0 627a22a75e5Sdrh} {123} 628a22a75e5Sdrhdo_execsql_test limit-14.2 { 629a22a75e5Sdrh SELECT 123 LIMIT 1 OFFSET 1 630a22a75e5Sdrh} {} 631a22a75e5Sdrhdo_execsql_test limit-14.3 { 632a22a75e5Sdrh SELECT 123 LIMIT 0 OFFSET 0 633a22a75e5Sdrh} {} 634a22a75e5Sdrhdo_execsql_test limit-14.4 { 635a22a75e5Sdrh SELECT 123 LIMIT 0 OFFSET 1 636a22a75e5Sdrh} {} 637a22a75e5Sdrhdo_execsql_test limit-14.6 { 638a22a75e5Sdrh SELECT 123 LIMIT -1 OFFSET 0 639a22a75e5Sdrh} {123} 640a22a75e5Sdrhdo_execsql_test limit-14.7 { 641a22a75e5Sdrh SELECT 123 LIMIT -1 OFFSET 1 642a22a75e5Sdrh} {} 643a22a75e5Sdrh 644*bc7819d1Sdrh# 2021-03-05 dbsqlfuzz crash-d811039c9f44f2d43199d5889fcf4085ef6221b9 645*bc7819d1Sdrh# 646*bc7819d1Sdrhreset_db 647*bc7819d1Sdrhdo_execsql_test limit-15.1 { 648*bc7819d1Sdrh CREATE TABLE t1(a PRIMARY KEY, b TEXT); 649*bc7819d1Sdrh CREATE TABLE t4(c PRIMARY KEY, d); 650*bc7819d1Sdrh CREATE TABLE t5(e PRIMARY KEY, f); 651*bc7819d1Sdrh CREATE TABLE t6(g, h); 652*bc7819d1Sdrh CREATE TABLE t3_a(k, v); 653*bc7819d1Sdrh CREATE TABLE t3_b(k, v); 654*bc7819d1Sdrh CREATE VIEW t3 AS SELECT * FROM t3_a UNION ALL SELECT * FROM t3_b; 655*bc7819d1Sdrh INSERT INTO t5(e,f) VALUES(500000,'orange'); 656*bc7819d1Sdrh INSERT INTO t4(c,d) VALUES(300000,'blue'),(400,'green'),(8000,'grey'); 657*bc7819d1Sdrh INSERT INTO t1(a,b) VALUES(300000,'purple'); 658*bc7819d1Sdrh INSERT INTO t3_a VALUES(300000,'yellow'),(500,'pink'),(8000,'red'); 659*bc7819d1Sdrh INSERT INTO t6 default values; 660*bc7819d1Sdrh SELECT ( 661*bc7819d1Sdrh SELECT 100000 FROM 662*bc7819d1Sdrh (SELECT 200000 FROM t6 WHERE a = ( SELECT 300000 FROM t3 WHERE a ) ), 663*bc7819d1Sdrh (SELECT 400000 FROM t5 WHERE e=500000), 664*bc7819d1Sdrh (SELECT 600000 FROM t4 WHERE c=a) 665*bc7819d1Sdrh ) FROM t1; 666*bc7819d1Sdrh} {100000} 667a22a75e5Sdrh 66817e24df6Sdrhfinish_test 669