xref: /sqlite-3.40.0/test/limit.test (revision 7aa3ebee)
1# 2001 November 6
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this file is testing the LIMIT ... OFFSET ... clause
13#  of SELECT statements.
14#
15# $Id: limit.test,v 1.32 2008/08/02 03:50:39 drh Exp $
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20# Build some test data
21#
22execsql {
23  CREATE TABLE t1(x int, y int);
24  BEGIN;
25}
26for {set i 1} {$i<=32} {incr i} {
27  for {set j 0} {(1<<$j)<$i} {incr j} {}
28  execsql "INSERT INTO t1 VALUES([expr {32-$i}],[expr {10-$j}])"
29}
30execsql {
31  COMMIT;
32}
33
34do_test limit-1.0 {
35  execsql {SELECT count(*) FROM t1}
36} {32}
37do_test limit-1.1 {
38  execsql {SELECT count(*) FROM t1 LIMIT  5}
39} {32}
40do_test limit-1.2.1 {
41  execsql {SELECT x FROM t1 ORDER BY x LIMIT 5}
42} {0 1 2 3 4}
43do_test limit-1.2.2 {
44  execsql {SELECT x FROM t1 ORDER BY x LIMIT 5 OFFSET 2}
45} {2 3 4 5 6}
46do_test limit-1.2.3 {
47  execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT 5 OFFSET -2}
48} {0 1 2 3 4}
49do_test limit-1.2.4 {
50  execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT 2, -5}
51} {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}
52do_test limit-1.2.5 {
53  execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT -2, 5}
54} {0 1 2 3 4}
55do_test limit-1.2.6 {
56  execsql {SELECT x FROM t1 ORDER BY x+1 LIMIT -2, -5}
57} {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}
58do_test limit-1.2.7 {
59  execsql {SELECT x FROM t1 ORDER BY x LIMIT 2, 5}
60} {2 3 4 5 6}
61do_test limit-1.3 {
62  execsql {SELECT x FROM t1 ORDER BY x LIMIT 5 OFFSET 5}
63} {5 6 7 8 9}
64do_test limit-1.4.1 {
65  execsql {SELECT x FROM t1 ORDER BY x LIMIT 50 OFFSET 30}
66} {30 31}
67do_test limit-1.4.2 {
68  execsql {SELECT x FROM t1 ORDER BY x LIMIT 30, 50}
69} {30 31}
70do_test limit-1.5 {
71  execsql {SELECT x FROM t1 ORDER BY x LIMIT 50 OFFSET 50}
72} {}
73do_test limit-1.6 {
74  execsql {SELECT * FROM t1 AS a, t1 AS b ORDER BY a.x, b.x LIMIT 5}
75} {0 5 0 5 0 5 1 5 0 5 2 5 0 5 3 5 0 5 4 5}
76do_test limit-1.7 {
77  execsql {SELECT * FROM t1 AS a, t1 AS b ORDER BY a.x, b.x LIMIT 5 OFFSET 32}
78} {1 5 0 5 1 5 1 5 1 5 2 5 1 5 3 5 1 5 4 5}
79
80ifcapable {view && subquery} {
81  do_test limit-2.1 {
82    execsql {
83      CREATE VIEW v1 AS SELECT * FROM t1 LIMIT 2;
84      SELECT count(*) FROM (SELECT * FROM v1);
85    }
86  } 2
87} ;# ifcapable view
88do_test limit-2.2 {
89  execsql {
90    CREATE TABLE t2 AS SELECT * FROM t1 LIMIT 2;
91    SELECT count(*) FROM t2;
92  }
93} 2
94ifcapable subquery {
95  do_test limit-2.3 {
96    execsql {
97      SELECT count(*) FROM t1 WHERE rowid IN (SELECT rowid FROM t1 LIMIT 2);
98    }
99  } 2
100}
101
102ifcapable subquery {
103  do_test limit-3.1 {
104    execsql {
105      SELECT z FROM (SELECT y*10+x AS z FROM t1 ORDER BY x LIMIT 10)
106      ORDER BY z LIMIT 5;
107    }
108  } {50 51 52 53 54}
109}
110
111do_test limit-4.1 {
112  ifcapable subquery {
113    execsql {
114      BEGIN;
115      CREATE TABLE t3(x);
116      INSERT INTO t3 SELECT x FROM t1 ORDER BY x LIMIT 10 OFFSET 1;
117      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
118      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
119      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
120      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
121      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
122      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
123      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
124      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
125      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
126      INSERT INTO t3 SELECT x+(SELECT max(x) FROM t3) FROM t3;
127      END;
128      SELECT count(*) FROM t3;
129    }
130  } else {
131    execsql {
132      BEGIN;
133      CREATE TABLE t3(x);
134      INSERT INTO t3 SELECT x FROM t1 ORDER BY x LIMIT 10 OFFSET 1;
135    }
136    for {set i 0} {$i<10} {incr i} {
137      set max_x_t3 [execsql {SELECT max(x) FROM t3}]
138      execsql "INSERT INTO t3 SELECT x+$max_x_t3 FROM t3;"
139    }
140    execsql {
141      END;
142      SELECT count(*) FROM t3;
143    }
144  }
145} {10240}
146do_test limit-4.2 {
147  execsql {
148    SELECT x FROM t3 LIMIT 2 OFFSET 10000
149  }
150} {10001 10002}
151do_test limit-4.3 {
152  execsql {
153    CREATE TABLE t4 AS SELECT x,
154       'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x ||
155       'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x ||
156       'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x ||
157       'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x ||
158       'abcdefghijklmnopqrstuvwyxz ABCDEFGHIJKLMNOPQRSTUVWYXZ' || x AS y
159    FROM t3 LIMIT 1000;
160    SELECT x FROM t4 ORDER BY y DESC LIMIT 1 OFFSET 999;
161  }
162} {1000}
163
164do_test limit-5.1 {
165  execsql {
166    CREATE TABLE t5(x,y);
167    INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x BETWEEN 10 AND 15
168        ORDER BY x LIMIT 2;
169    SELECT * FROM t5 ORDER BY x;
170  }
171} {5 15 6 16}
172do_test limit-5.2 {
173  execsql {
174    DELETE FROM t5;
175    INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x BETWEEN 10 AND 15
176        ORDER BY x DESC LIMIT 2;
177    SELECT * FROM t5 ORDER BY x;
178  }
179} {9 19 10 20}
180do_test limit-5.3 {
181  execsql {
182    DELETE FROM t5;
183    INSERT INTO t5 SELECT x-y, x+y FROM t1 WHERE x ORDER BY x DESC LIMIT 31;
184    SELECT * FROM t5 ORDER BY x LIMIT 2;
185  }
186} {-4 6 -3 7}
187do_test limit-5.4 {
188  execsql {
189    SELECT * FROM t5 ORDER BY x DESC, y DESC LIMIT 2;
190  }
191} {21 41 21 39}
192do_test limit-5.5 {
193  execsql {
194    DELETE FROM t5;
195    INSERT INTO t5 SELECT a.x*100+b.x, a.y*100+b.y FROM t1 AS a, t1 AS b
196                   ORDER BY 1, 2 LIMIT 1000;
197    SELECT count(*), sum(x), sum(y), min(x), max(x), min(y), max(y) FROM t5;
198  }
199} {1000 1528204 593161 0 3107 505 1005}
200
201# There is some contraversy about whether LIMIT 0 should be the same as
202# no limit at all or if LIMIT 0 should result in zero output rows.
203#
204do_test limit-6.1 {
205  execsql {
206    BEGIN;
207    CREATE TABLE t6(a);
208    INSERT INTO t6 VALUES(1);
209    INSERT INTO t6 VALUES(2);
210    INSERT INTO t6 SELECT a+2 FROM t6;
211    COMMIT;
212    SELECT * FROM t6;
213  }
214} {1 2 3 4}
215do_test limit-6.2 {
216  execsql {
217    SELECT * FROM t6 LIMIT -1 OFFSET -1;
218  }
219} {1 2 3 4}
220do_test limit-6.3 {
221  execsql {
222    SELECT * FROM t6 LIMIT 2 OFFSET -123;
223  }
224} {1 2}
225do_test limit-6.4 {
226  execsql {
227    SELECT * FROM t6 LIMIT -432 OFFSET 2;
228  }
229} {3 4}
230do_test limit-6.5 {
231  execsql {
232    SELECT * FROM t6 LIMIT -1
233  }
234} {1 2 3 4}
235do_test limit-6.6 {
236  execsql {
237    SELECT * FROM t6 LIMIT -1 OFFSET 1
238  }
239} {2 3 4}
240do_test limit-6.7 {
241  execsql {
242    SELECT * FROM t6 LIMIT 0
243  }
244} {}
245do_test limit-6.8 {
246  execsql {
247    SELECT * FROM t6 LIMIT 0 OFFSET 1
248  }
249} {}
250
251# Make sure LIMIT works well with compound SELECT statements.
252# Ticket #393
253#
254# EVIDENCE-OF: R-13512-64012 In a compound SELECT, only the last or
255# right-most simple SELECT may contain a LIMIT clause.
256#
257# EVIDENCE-OF: R-03782-50113 In a compound SELECT, the LIMIT clause
258# applies to the entire compound, not just the final SELECT.
259#
260ifcapable compound {
261do_test limit-7.1.1 {
262  catchsql {
263    SELECT x FROM t2 LIMIT 5 UNION ALL SELECT a FROM t6;
264  }
265} {1 {LIMIT clause should come after UNION ALL not before}}
266do_test limit-7.1.2 {
267  catchsql {
268    SELECT x FROM t2 LIMIT 5 UNION SELECT a FROM t6;
269  }
270} {1 {LIMIT clause should come after UNION not before}}
271do_test limit-7.1.3 {
272  catchsql {
273    SELECT x FROM t2 LIMIT 5 EXCEPT SELECT a FROM t6 LIMIT 3;
274  }
275} {1 {LIMIT clause should come after EXCEPT not before}}
276do_test limit-7.1.4 {
277  catchsql {
278    SELECT x FROM t2 LIMIT 0,5 INTERSECT SELECT a FROM t6;
279  }
280} {1 {LIMIT clause should come after INTERSECT not before}}
281do_test limit-7.2 {
282  execsql {
283    SELECT x FROM t2 UNION ALL SELECT a FROM t6 LIMIT 5;
284  }
285} {31 30 1 2 3}
286do_test limit-7.3 {
287  execsql {
288    SELECT x FROM t2 UNION ALL SELECT a FROM t6 LIMIT 3 OFFSET 1;
289  }
290} {30 1 2}
291do_test limit-7.4 {
292  execsql {
293    SELECT x FROM t2 UNION ALL SELECT a FROM t6 ORDER BY 1 LIMIT 3 OFFSET 1;
294  }
295} {2 3 4}
296do_test limit-7.5 {
297  execsql {
298    SELECT x FROM t2 UNION SELECT x+2 FROM t2 LIMIT 2 OFFSET 1;
299  }
300} {31 32}
301do_test limit-7.6 {
302  execsql {
303    SELECT x FROM t2 UNION SELECT x+2 FROM t2 ORDER BY 1 DESC LIMIT 2 OFFSET 1;
304  }
305} {32 31}
306do_test limit-7.7 {
307  execsql {
308    SELECT a+9 FROM t6 EXCEPT SELECT y FROM t2 LIMIT 2;
309  }
310} {11 12}
311do_test limit-7.8 {
312  execsql {
313    SELECT a+9 FROM t6 EXCEPT SELECT y FROM t2 ORDER BY 1 DESC LIMIT 2;
314  }
315} {13 12}
316do_test limit-7.9 {
317  execsql {
318    SELECT a+26 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1;
319  }
320} {30}
321do_test limit-7.10 {
322  execsql {
323    SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1;
324  }
325} {30}
326do_test limit-7.11 {
327  execsql {
328    SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2 LIMIT 1 OFFSET 1;
329  }
330} {31}
331do_test limit-7.12 {
332  execsql {
333    SELECT a+27 FROM t6 INTERSECT SELECT x FROM t2
334       ORDER BY 1 DESC LIMIT 1 OFFSET 1;
335  }
336} {30}
337} ;# ifcapable compound
338
339# Tests for limit in conjunction with distinct.  The distinct should
340# occur before both the limit and the offset.  Ticket #749.
341#
342do_test limit-8.1 {
343  execsql {
344    SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5;
345  }
346} {0 1 2 3 4}
347do_test limit-8.2 {
348  execsql {
349    SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5 OFFSET 5;
350  }
351} {5 6 7 8 9}
352do_test limit-8.3 {
353  execsql {
354    SELECT DISTINCT cast(round(x/100) as integer) FROM t3 LIMIT 5 OFFSET 25;
355  }
356} {25 26 27 28 29}
357
358# Make sure limits on multiple subqueries work correctly.
359# Ticket #1035
360#
361ifcapable subquery {
362  do_test limit-9.1 {
363    execsql {
364      SELECT * FROM (SELECT * FROM t6 LIMIT 3);
365    }
366  } {1 2 3}
367}
368do_test limit-9.2.1 {
369  execsql {
370    CREATE TABLE t7 AS SELECT * FROM t6;
371  }
372} {}
373ifcapable subquery {
374  do_test limit-9.2.2 {
375    execsql {
376      SELECT * FROM (SELECT * FROM t7 LIMIT 3);
377    }
378  } {1 2 3}
379}
380ifcapable compound {
381  ifcapable subquery {
382    do_test limit-9.3 {
383      execsql {
384        SELECT * FROM (SELECT * FROM t6 LIMIT 3)
385        UNION
386        SELECT * FROM (SELECT * FROM t7 LIMIT 3)
387        ORDER BY 1
388      }
389    } {1 2 3}
390    do_test limit-9.4 {
391      execsql {
392        SELECT * FROM (SELECT * FROM t6 LIMIT 3)
393        UNION
394        SELECT * FROM (SELECT * FROM t7 LIMIT 3)
395        ORDER BY 1
396        LIMIT 2
397      }
398    } {1 2}
399  }
400  do_test limit-9.5 {
401    catchsql {
402      SELECT * FROM t6 LIMIT 3
403      UNION
404      SELECT * FROM t7 LIMIT 3
405    }
406  } {1 {LIMIT clause should come after UNION not before}}
407}
408
409# Test LIMIT and OFFSET using SQL variables.
410do_test limit-10.1 {
411  set limit 10
412  db eval {
413    SELECT x FROM t1 LIMIT :limit;
414  }
415} {31 30 29 28 27 26 25 24 23 22}
416do_test limit-10.2 {
417  set limit 5
418  set offset 5
419  db eval {
420    SELECT x FROM t1 LIMIT :limit OFFSET :offset;
421  }
422} {26 25 24 23 22}
423do_test limit-10.3 {
424  set limit -1
425  db eval {
426    SELECT x FROM t1 WHERE x<10 LIMIT :limit;
427  }
428} {9 8 7 6 5 4 3 2 1 0}
429do_test limit-10.4 {
430  set limit 1.5
431  set rc [catch {
432  db eval {
433    SELECT x FROM t1 WHERE x<10 LIMIT :limit;
434  } } msg]
435  list $rc $msg
436} {1 {datatype mismatch}}
437do_test limit-10.5 {
438  set limit "hello world"
439  set rc [catch {
440  db eval {
441    SELECT x FROM t1 WHERE x<10 LIMIT :limit;
442  } } msg]
443  list $rc $msg
444} {1 {datatype mismatch}}
445
446ifcapable subquery {
447do_test limit-11.1 {
448  db eval {
449     SELECT x FROM (SELECT x FROM t1 ORDER BY x LIMIT 0) ORDER BY x
450  }
451} {}
452} ;# ifcapable subquery
453
454# Test error processing.
455#
456do_test limit-12.1 {
457  catchsql {
458     SELECT * FROM t1 LIMIT replace(1)
459  }
460} {1 {wrong number of arguments to function replace()}}
461do_test limit-12.2 {
462  catchsql {
463     SELECT * FROM t1 LIMIT 5 OFFSET replace(1)
464  }
465} {1 {wrong number of arguments to function replace()}}
466do_test limit-12.3 {
467  catchsql {
468     SELECT * FROM t1 LIMIT x
469  }
470} {1 {no such column: x}}
471do_test limit-12.4 {
472  catchsql {
473     SELECT * FROM t1 LIMIT 1 OFFSET x
474  }
475} {1 {no such column: x}}
476
477# Ticket [db4d96798da8b]
478# LIMIT does not work with nested views containing UNION ALL
479#
480do_test limit-13.1 {
481  db eval {
482    CREATE TABLE t13(x);
483    INSERT INTO t13 VALUES(1),(2);
484    CREATE VIEW v13a AS SELECT x AS y FROM t13;
485    CREATE VIEW v13b AS SELECT y AS z FROM v13a UNION ALL SELECT y+10 FROM v13a;
486    CREATE VIEW v13c AS SELECT z FROM v13b UNION ALL SELECT z+20 FROM v13b;
487  }
488} {}
489do_test limit-13.2 {
490  db eval {SELECT z FROM v13c LIMIT 1}
491} {1}
492do_test limit-13.3 {
493  db eval {SELECT z FROM v13c LIMIT 2}
494} {1 2}
495do_test limit-13.4 {
496  db eval {SELECT z FROM v13c LIMIT 3}
497} {1 2 11}
498do_test limit-13.5 {
499  db eval {SELECT z FROM v13c LIMIT 4}
500} {1 2 11 12}
501do_test limit-13.6 {
502  db eval {SELECT z FROM v13c LIMIT 5}
503} {1 2 11 12 21}
504do_test limit-13.7 {
505  db eval {SELECT z FROM v13c LIMIT 6}
506} {1 2 11 12 21 22}
507do_test limit-13.8 {
508  db eval {SELECT z FROM v13c LIMIT 7}
509} {1 2 11 12 21 22 31}
510do_test limit-13.9 {
511  db eval {SELECT z FROM v13c LIMIT 8}
512} {1 2 11 12 21 22 31 32}
513do_test limit-13.10 {
514  db eval {SELECT z FROM v13c LIMIT 9}
515} {1 2 11 12 21 22 31 32}
516do_test limit-13.11 {
517  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 1}
518} {2}
519do_test limit-13.12 {
520  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 1}
521} {2 11}
522do_test limit-13.13 {
523  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 1}
524} {2 11 12}
525do_test limit-13.14 {
526  db eval {SELECT z FROM v13c LIMIT 4 OFFSET 1}
527} {2 11 12 21}
528do_test limit-13.15 {
529  db eval {SELECT z FROM v13c LIMIT 5 OFFSET 1}
530} {2 11 12 21 22}
531do_test limit-13.16 {
532  db eval {SELECT z FROM v13c LIMIT 6 OFFSET 1}
533} {2 11 12 21 22 31}
534do_test limit-13.17 {
535  db eval {SELECT z FROM v13c LIMIT 7 OFFSET 1}
536} {2 11 12 21 22 31 32}
537do_test limit-13.18 {
538  db eval {SELECT z FROM v13c LIMIT 8 OFFSET 1}
539} {2 11 12 21 22 31 32}
540do_test limit-13.21 {
541  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 2}
542} {11}
543do_test limit-13.22 {
544  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 2}
545} {11 12}
546do_test limit-13.23 {
547  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 2}
548} {11 12 21}
549do_test limit-13.24 {
550  db eval {SELECT z FROM v13c LIMIT 4 OFFSET 2}
551} {11 12 21 22}
552do_test limit-13.25 {
553  db eval {SELECT z FROM v13c LIMIT 5 OFFSET 2}
554} {11 12 21 22 31}
555do_test limit-13.26 {
556  db eval {SELECT z FROM v13c LIMIT 6 OFFSET 2}
557} {11 12 21 22 31 32}
558do_test limit-13.27 {
559  db eval {SELECT z FROM v13c LIMIT 7 OFFSET 2}
560} {11 12 21 22 31 32}
561do_test limit-13.31 {
562  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 3}
563} {12}
564do_test limit-13.32 {
565  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 3}
566} {12 21}
567do_test limit-13.33 {
568  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 3}
569} {12 21 22}
570do_test limit-13.34 {
571  db eval {SELECT z FROM v13c LIMIT 4 OFFSET 3}
572} {12 21 22 31}
573do_test limit-13.35 {
574  db eval {SELECT z FROM v13c LIMIT 5 OFFSET 3}
575} {12 21 22 31 32}
576do_test limit-13.36 {
577  db eval {SELECT z FROM v13c LIMIT 6 OFFSET 3}
578} {12 21 22 31 32}
579do_test limit-13.41 {
580  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 4}
581} {21}
582do_test limit-13.42 {
583  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 4}
584} {21 22}
585do_test limit-13.43 {
586  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 4}
587} {21 22 31}
588do_test limit-13.44 {
589  db eval {SELECT z FROM v13c LIMIT 4 OFFSET 4}
590} {21 22 31 32}
591do_test limit-13.45 {
592  db eval {SELECT z FROM v13c LIMIT 5 OFFSET 4}
593} {21 22 31 32}
594do_test limit-13.51 {
595  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 5}
596} {22}
597do_test limit-13.52 {
598  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 5}
599} {22 31}
600do_test limit-13.53 {
601  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 5}
602} {22 31 32}
603do_test limit-13.54 {
604  db eval {SELECT z FROM v13c LIMIT 4 OFFSET 5}
605} {22 31 32}
606do_test limit-13.61 {
607  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 6}
608} {31}
609do_test limit-13.62 {
610  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 6}
611} {31 32}
612do_test limit-13.63 {
613  db eval {SELECT z FROM v13c LIMIT 3 OFFSET 6}
614} {31 32}
615do_test limit-13.71 {
616  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 7}
617} {32}
618do_test limit-13.72 {
619  db eval {SELECT z FROM v13c LIMIT 2 OFFSET 7}
620} {32}
621do_test limit-13.81 {
622  db eval {SELECT z FROM v13c LIMIT 1 OFFSET 8}
623} {}
624
625do_execsql_test limit-14.1 {
626  SELECT 123 LIMIT 1 OFFSET 0
627} {123}
628do_execsql_test limit-14.2 {
629  SELECT 123 LIMIT 1 OFFSET 1
630} {}
631do_execsql_test limit-14.3 {
632  SELECT 123 LIMIT 0 OFFSET 0
633} {}
634do_execsql_test limit-14.4 {
635  SELECT 123 LIMIT 0 OFFSET 1
636} {}
637do_execsql_test limit-14.6 {
638  SELECT 123 LIMIT -1 OFFSET 0
639} {123}
640do_execsql_test limit-14.7 {
641  SELECT 123 LIMIT -1 OFFSET 1
642} {}
643
644
645finish_test
646