xref: /sqlite-3.40.0/test/limit.test (revision bc7819d1)
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