limit.test 16 KB

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