/ Hex Artifact Content
Login

Artifact 2a87b9cb2165abb49ca0ddcf5cb43cf24074581f:


0000: 23 20 32 30 30 31 20 4e 6f 76 65 6d 62 65 72 20  # 2001 November 
0010: 36 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  6.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 4c 49 4d   testing the LIM
01d0: 49 54 20 2e 2e 2e 20 4f 46 46 53 45 54 20 2e 2e  IT ... OFFSET ..
01e0: 2e 20 63 6c 61 75 73 65 0a 23 20 20 6f 66 20 53  . clause.#  of S
01f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
0200: 2e 0a 23 0a 23 20 24 49 64 3a 20 6c 69 6d 69 74  ..#.# $Id: limit
0210: 2e 74 65 73 74 2c 76 20 31 2e 33 30 20 32 30 30  .test,v 1.30 200
0220: 36 2f 30 36 2f 32 30 20 31 31 3a 30 31 3a 30 39  6/06/20 11:01:09
0230: 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70   danielk1977 Exp
0240: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
0250: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
0260: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
0270: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
0280: 0a 0a 23 20 42 75 69 6c 64 20 73 6f 6d 65 20 74  ..# Build some t
0290: 65 73 74 20 64 61 74 61 0a 23 0a 65 78 65 63 73  est data.#.execs
02a0: 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  ql {.  CREATE TA
02b0: 42 4c 45 20 74 31 28 78 20 69 6e 74 2c 20 79 20  BLE t1(x int, y 
02c0: 69 6e 74 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d  int);.  BEGIN;.}
02d0: 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b  .for {set i 1} {
02e0: 24 69 3c 3d 33 32 7d 20 7b 69 6e 63 72 20 69 7d  $i<=32} {incr i}
02f0: 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 6a 20   {.  for {set j 
0300: 30 7d 20 7b 70 6f 77 28 32 2c 24 6a 29 3c 24 69  0} {pow(2,$j)<$i
0310: 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 7d 0a 20 20  } {incr j} {}.  
0320: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
0330: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 5b  INTO t1 VALUES([
0340: 65 78 70 72 20 7b 33 32 2d 24 69 7d 5d 2c 5b 65  expr {32-$i}],[e
0350: 78 70 72 20 7b 31 30 2d 24 6a 7d 5d 29 22 0a 7d  xpr {10-$j}])".}
0360: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 4f 4d  .execsql {.  COM
0370: 4d 49 54 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  MIT;.}..do_test 
0380: 6c 69 6d 69 74 2d 31 2e 30 20 7b 0a 20 20 65 78  limit-1.0 {.  ex
0390: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f  ecsql {SELECT co
03a0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 7d 0a  unt(*) FROM t1}.
03b0: 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65 73 74 20 6c  } {32}.do_test l
03c0: 69 6d 69 74 2d 31 2e 31 20 7b 0a 20 20 65 78 65  imit-1.1 {.  exe
03d0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  csql {SELECT cou
03e0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 4c 49  nt(*) FROM t1 LI
03f0: 4d 49 54 20 20 35 7d 0a 7d 20 7b 33 32 7d 0a 64  MIT  5}.} {32}.d
0400: 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 31 2e 32  o_test limit-1.2
0410: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0420: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
0430: 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d 49   ORDER BY x LIMI
0440: 54 20 35 7d 0a 7d 20 7b 30 20 31 20 32 20 33 20  T 5}.} {0 1 2 3 
0450: 34 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74  4}.do_test limit
0460: 2d 31 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  -1.2.2 {.  execs
0470: 71 6c 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f  ql {SELECT x FRO
0480: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 20  M t1 ORDER BY x 
0490: 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20 32  LIMIT 5 OFFSET 2
04a0: 7d 0a 7d 20 7b 32 20 33 20 34 20 35 20 36 7d 0a  }.} {2 3 4 5 6}.
04b0: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 31 2e  do_test limit-1.
04c0: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
04d0: 7b 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  {SELECT x FROM t
04e0: 31 20 4f 52 44 45 52 20 42 59 20 78 2b 31 20 4c  1 ORDER BY x+1 L
04f0: 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20 2d 32  IMIT 5 OFFSET -2
0500: 7d 0a 7d 20 7b 30 20 31 20 32 20 33 20 34 7d 0a  }.} {0 1 2 3 4}.
0510: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 31 2e  do_test limit-1.
0520: 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.4 {.  execsql 
0530: 7b 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  {SELECT x FROM t
0540: 31 20 4f 52 44 45 52 20 42 59 20 78 2b 31 20 4c  1 ORDER BY x+1 L
0550: 49 4d 49 54 20 32 2c 20 2d 35 7d 0a 7d 20 7b 32  IMIT 2, -5}.} {2
0560: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0570: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
0580: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 20   16 17 18 19 20 
0590: 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 32  21 22 23 24 25 2
05a0: 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33 31  6 27 28 29 30 31
05b0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  }.do_test limit-
05c0: 31 2e 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  1.2.5 {.  execsq
05d0: 6c 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  l {SELECT x FROM
05e0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 2b 31   t1 ORDER BY x+1
05f0: 20 4c 49 4d 49 54 20 2d 32 2c 20 35 7d 0a 7d 20   LIMIT -2, 5}.} 
0600: 7b 30 20 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74  {0 1 2 3 4}.do_t
0610: 65 73 74 20 6c 69 6d 69 74 2d 31 2e 32 2e 36 20  est limit-1.2.6 
0620: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0630: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 4f 52  ECT x FROM t1 OR
0640: 44 45 52 20 42 59 20 78 2b 31 20 4c 49 4d 49 54  DER BY x+1 LIMIT
0650: 20 2d 32 2c 20 2d 35 7d 0a 7d 20 7b 30 20 31 20   -2, -5}.} {0 1 
0660: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
0670: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
0680: 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30  5 16 17 18 19 20
0690: 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20   21 22 23 24 25 
06a0: 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33  26 27 28 29 30 3
06b0: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74  1}.do_test limit
06c0: 2d 31 2e 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  -1.2.7 {.  execs
06d0: 71 6c 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f  ql {SELECT x FRO
06e0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 20  M t1 ORDER BY x 
06f0: 4c 49 4d 49 54 20 32 2c 20 35 7d 0a 7d 20 7b 32  LIMIT 2, 5}.} {2
0700: 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73   3 4 5 6}.do_tes
0710: 74 20 6c 69 6d 69 74 2d 31 2e 33 20 7b 0a 20 20  t limit-1.3 {.  
0720: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0730: 78 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  x FROM t1 ORDER 
0740: 42 59 20 78 20 4c 49 4d 49 54 20 35 20 4f 46 46  BY x LIMIT 5 OFF
0750: 53 45 54 20 35 7d 0a 7d 20 7b 35 20 36 20 37 20  SET 5}.} {5 6 7 
0760: 38 20 39 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d  8 9}.do_test lim
0770: 69 74 2d 31 2e 34 2e 31 20 7b 0a 20 20 65 78 65  it-1.4.1 {.  exe
0780: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 78 20 46  csql {SELECT x F
0790: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
07a0: 78 20 4c 49 4d 49 54 20 35 30 20 4f 46 46 53 45  x LIMIT 50 OFFSE
07b0: 54 20 33 30 7d 0a 7d 20 7b 33 30 20 33 31 7d 0a  T 30}.} {30 31}.
07c0: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 31 2e  do_test limit-1.
07d0: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
07e0: 7b 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  {SELECT x FROM t
07f0: 31 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d  1 ORDER BY x LIM
0800: 49 54 20 33 30 2c 20 35 30 7d 0a 7d 20 7b 33 30  IT 30, 50}.} {30
0810: 20 33 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d   31}.do_test lim
0820: 69 74 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  it-1.5 {.  execs
0830: 71 6c 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f  ql {SELECT x FRO
0840: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 20  M t1 ORDER BY x 
0850: 4c 49 4d 49 54 20 35 30 20 4f 46 46 53 45 54 20  LIMIT 50 OFFSET 
0860: 35 30 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  50}.} {}.do_test
0870: 20 6c 69 6d 69 74 2d 31 2e 36 20 7b 0a 20 20 65   limit-1.6 {.  e
0880: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
0890: 20 46 52 4f 4d 20 74 31 20 41 53 20 61 2c 20 74   FROM t1 AS a, t
08a0: 31 20 41 53 20 62 20 4f 52 44 45 52 20 42 59 20  1 AS b ORDER BY 
08b0: 61 2e 78 2c 20 62 2e 78 20 4c 49 4d 49 54 20 35  a.x, b.x LIMIT 5
08c0: 7d 0a 7d 20 7b 30 20 35 20 30 20 35 20 30 20 35  }.} {0 5 0 5 0 5
08d0: 20 31 20 35 20 30 20 35 20 32 20 35 20 30 20 35   1 5 0 5 2 5 0 5
08e0: 20 33 20 35 20 30 20 35 20 34 20 35 7d 0a 64 6f   3 5 0 5 4 5}.do
08f0: 5f 74 65 73 74 20 6c 69 6d 69 74 2d 31 2e 37 20  _test limit-1.7 
0900: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0910: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 41 53  ECT * FROM t1 AS
0920: 20 61 2c 20 74 31 20 41 53 20 62 20 4f 52 44 45   a, t1 AS b ORDE
0930: 52 20 42 59 20 61 2e 78 2c 20 62 2e 78 20 4c 49  R BY a.x, b.x LI
0940: 4d 49 54 20 35 20 4f 46 46 53 45 54 20 33 32 7d  MIT 5 OFFSET 32}
0950: 0a 7d 20 7b 31 20 35 20 30 20 35 20 31 20 35 20  .} {1 5 0 5 1 5 
0960: 31 20 35 20 31 20 35 20 32 20 35 20 31 20 35 20  1 5 1 5 2 5 1 5 
0970: 33 20 35 20 31 20 35 20 34 20 35 7d 0a 0a 69 66  3 5 1 5 4 5}..if
0980: 63 61 70 61 62 6c 65 20 7b 76 69 65 77 20 26 26  capable {view &&
0990: 20 73 75 62 71 75 65 72 79 7d 20 7b 0a 20 20 64   subquery} {.  d
09a0: 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 32 2e 31  o_test limit-2.1
09b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
09c0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
09d0: 45 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20  EW v1 AS SELECT 
09e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  * FROM t1 LIMIT 
09f0: 32 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  2;.      SELECT 
0a00: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53  count(*) FROM (S
0a10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 29  ELECT * FROM v1)
0a20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 32 0a 7d 20  ;.    }.  } 2.} 
0a30: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 76 69 65  ;# ifcapable vie
0a40: 77 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  w.do_test limit-
0a50: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
0a60: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0a70: 4c 45 20 74 32 20 41 53 20 53 45 4c 45 43 54 20  LE t2 AS SELECT 
0a80: 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  * FROM t1 LIMIT 
0a90: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  2;.    SELECT co
0aa0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
0ab0: 20 20 7d 0a 7d 20 32 0a 69 66 63 61 70 61 62 6c    }.} 2.ifcapabl
0ac0: 65 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64  e subquery {.  d
0ad0: 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 32 2e 33  o_test limit-2.3
0ae0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
0af0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
0b00: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57  unt(*) FROM t1 W
0b10: 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 53  HERE rowid IN (S
0b20: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0b30: 20 74 31 20 4c 49 4d 49 54 20 32 29 3b 0a 20 20   t1 LIMIT 2);.  
0b40: 20 20 7d 0a 20 20 7d 20 32 0a 7d 0a 0a 69 66 63    }.  } 2.}..ifc
0b50: 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20  apable subquery 
0b60: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6d 69  {.  do_test limi
0b70: 74 2d 33 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  t-3.1 {.    exec
0b80: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
0b90: 43 54 20 7a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT z FROM (SELEC
0ba0: 54 20 79 2a 31 30 2b 78 20 41 53 20 7a 20 46 52  T y*10+x AS z FR
0bb0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
0bc0: 20 4c 49 4d 49 54 20 31 30 29 0a 20 20 20 20 20   LIMIT 10).     
0bd0: 20 4f 52 44 45 52 20 42 59 20 7a 20 4c 49 4d 49   ORDER BY z LIMI
0be0: 54 20 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  T 5;.    }.  } {
0bf0: 35 30 20 35 31 20 35 32 20 35 33 20 35 34 7d 0a  50 51 52 53 54}.
0c00: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74  }..do_test limit
0c10: 2d 34 2e 31 20 7b 0a 20 20 69 66 63 61 70 61 62  -4.1 {.  ifcapab
0c20: 6c 65 20 73 75 62 71 75 65 72 79 20 7b 20 0a 20  le subquery { . 
0c30: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
0c40: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
0c50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
0c60: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
0c70: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
0c80: 78 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  x FROM t1 ORDER 
0c90: 42 59 20 78 20 4c 49 4d 49 54 20 31 30 20 4f 46  BY x LIMIT 10 OF
0ca0: 46 53 45 54 20 31 3b 0a 20 20 20 20 20 20 49 4e  FSET 1;.      IN
0cb0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c  SERT INTO t3 SEL
0cc0: 45 43 54 20 78 2b 28 53 45 4c 45 43 54 20 6d 61  ECT x+(SELECT ma
0cd0: 78 28 78 29 20 46 52 4f 4d 20 74 33 29 20 46 52  x(x) FROM t3) FR
0ce0: 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53  OM t3;.      INS
0cf0: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
0d00: 43 54 20 78 2b 28 53 45 4c 45 43 54 20 6d 61 78  CT x+(SELECT max
0d10: 28 78 29 20 46 52 4f 4d 20 74 33 29 20 46 52 4f  (x) FROM t3) FRO
0d20: 4d 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t3;.      INSE
0d30: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
0d40: 54 20 78 2b 28 53 45 4c 45 43 54 20 6d 61 78 28  T x+(SELECT max(
0d50: 78 29 20 46 52 4f 4d 20 74 33 29 20 46 52 4f 4d  x) FROM t3) FROM
0d60: 20 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t3;.      INSER
0d70: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
0d80: 20 78 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 78   x+(SELECT max(x
0d90: 29 20 46 52 4f 4d 20 74 33 29 20 46 52 4f 4d 20  ) FROM t3) FROM 
0da0: 74 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t3;.      INSERT
0db0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
0dc0: 78 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 78 29  x+(SELECT max(x)
0dd0: 20 46 52 4f 4d 20 74 33 29 20 46 52 4f 4d 20 74   FROM t3) FROM t
0de0: 33 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  3;.      INSERT 
0df0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 78  INTO t3 SELECT x
0e00: 2b 28 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20  +(SELECT max(x) 
0e10: 46 52 4f 4d 20 74 33 29 20 46 52 4f 4d 20 74 33  FROM t3) FROM t3
0e20: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0e30: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 78 2b  NTO t3 SELECT x+
0e40: 28 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46  (SELECT max(x) F
0e50: 52 4f 4d 20 74 33 29 20 46 52 4f 4d 20 74 33 3b  ROM t3) FROM t3;
0e60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0e70: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 78 2b 28  TO t3 SELECT x+(
0e80: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
0e90: 4f 4d 20 74 33 29 20 46 52 4f 4d 20 74 33 3b 0a  OM t3) FROM t3;.
0ea0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0eb0: 4f 20 74 33 20 53 45 4c 45 43 54 20 78 2b 28 53  O t3 SELECT x+(S
0ec0: 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
0ed0: 4d 20 74 33 29 20 46 52 4f 4d 20 74 33 3b 0a 20  M t3) FROM t3;. 
0ee0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0ef0: 20 74 33 20 53 45 4c 45 43 54 20 78 2b 28 53 45   t3 SELECT x+(SE
0f00: 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
0f10: 20 74 33 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20   t3) FROM t3;.  
0f20: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 53      END;.      S
0f30: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0f40: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20  ROM t3;.    }.  
0f50: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 65 78 65  } else {.    exe
0f60: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47  csql {.      BEG
0f70: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
0f80: 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20 20   TABLE t3(x);.  
0f90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0fa0: 74 33 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  t3 SELECT x FROM
0fb0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 20 4c   t1 ORDER BY x L
0fc0: 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 31  IMIT 10 OFFSET 1
0fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20  ;.    }.    for 
0fe0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 30  {set i 0} {$i<10
0ff0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1000: 20 20 20 73 65 74 20 6d 61 78 5f 78 5f 74 33 20     set max_x_t3 
1010: 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  [execsql {SELECT
1020: 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74 33 7d   max(x) FROM t3}
1030: 5d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  ].      execsql 
1040: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20  "INSERT INTO t3 
1050: 53 45 4c 45 43 54 20 78 2b 24 6d 61 78 5f 78 5f  SELECT x+$max_x_
1060: 74 33 20 46 52 4f 4d 20 74 33 3b 22 0a 20 20 20  t3 FROM t3;".   
1070: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
1080: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
1090: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
10a0: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d  ) FROM t3;.    }
10b0: 0a 20 20 7d 0a 7d 20 7b 31 30 32 34 30 7d 0a 64  .  }.} {10240}.d
10c0: 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 34 2e 32  o_test limit-4.2
10d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10e0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
10f0: 20 74 33 20 4c 49 4d 49 54 20 32 20 4f 46 46 53   t3 LIMIT 2 OFFS
1100: 45 54 20 31 30 30 30 30 0a 20 20 7d 0a 7d 20 7b  ET 10000.  }.} {
1110: 31 30 30 30 31 20 31 30 30 30 32 7d 0a 64 6f 5f  10001 10002}.do_
1120: 74 65 73 74 20 6c 69 6d 69 74 2d 34 2e 33 20 7b  test limit-4.3 {
1130: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1140: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
1150: 20 41 53 20 53 45 4c 45 43 54 20 78 2c 0a 20 20   AS SELECT x,.  
1160: 20 20 20 20 20 27 61 62 63 64 65 66 67 68 69 6a       'abcdefghij
1170: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
1180: 20 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f   ABCDEFGHIJKLMNO
1190: 50 51 52 53 54 55 56 57 59 58 5a 27 20 7c 7c 20  PQRSTUVWYXZ' || 
11a0: 78 20 7c 7c 0a 20 20 20 20 20 20 20 27 61 62 63  x ||.       'abc
11b0: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
11c0: 74 75 76 77 79 78 7a 20 41 42 43 44 45 46 47 48  tuvwyxz ABCDEFGH
11d0: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
11e0: 58 5a 27 20 7c 7c 20 78 20 7c 7c 0a 20 20 20 20  XZ' || x ||.    
11f0: 20 20 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c     'abcdefghijkl
1200: 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 20 41  mnopqrstuvwyxz A
1210: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
1220: 52 53 54 55 56 57 59 58 5a 27 20 7c 7c 20 78 20  RSTUVWYXZ' || x 
1230: 7c 7c 0a 20 20 20 20 20 20 20 27 61 62 63 64 65  ||.       'abcde
1240: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1250: 76 77 79 78 7a 20 41 42 43 44 45 46 47 48 49 4a  vwyxz ABCDEFGHIJ
1260: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
1270: 27 20 7c 7c 20 78 20 7c 7c 0a 20 20 20 20 20 20  ' || x ||.      
1280: 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   'abcdefghijklmn
1290: 6f 70 71 72 73 74 75 76 77 79 78 7a 20 41 42 43  opqrstuvwyxz ABC
12a0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
12b0: 54 55 56 57 59 58 5a 27 20 7c 7c 20 78 20 41 53  TUVWYXZ' || x AS
12c0: 20 79 0a 20 20 20 20 46 52 4f 4d 20 74 33 20 4c   y.    FROM t3 L
12d0: 49 4d 49 54 20 31 30 30 30 3b 0a 20 20 20 20 53  IMIT 1000;.    S
12e0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
12f0: 4f 52 44 45 52 20 42 59 20 79 20 44 45 53 43 20  ORDER BY y DESC 
1300: 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54 20 39  LIMIT 1 OFFSET 9
1310: 39 39 3b 0a 20 20 7d 0a 7d 20 7b 31 30 30 30 7d  99;.  }.} {1000}
1320: 0a 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  ..do_test limit-
1330: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
1340: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1350: 4c 45 20 74 35 28 78 2c 79 29 3b 0a 20 20 20 20  LE t5(x,y);.    
1360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 53  INSERT INTO t5 S
1370: 45 4c 45 43 54 20 78 2d 79 2c 20 78 2b 79 20 46  ELECT x-y, x+y F
1380: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 42  ROM t1 WHERE x B
1390: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 31 35  ETWEEN 10 AND 15
13a0: 0a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  .        ORDER B
13b0: 59 20 78 20 4c 49 4d 49 54 20 32 3b 0a 20 20 20  Y x LIMIT 2;.   
13c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13d0: 35 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 20 20  5 ORDER BY x;.  
13e0: 7d 0a 7d 20 7b 35 20 31 35 20 36 20 31 36 7d 0a  }.} {5 15 6 16}.
13f0: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 35 2e  do_test limit-5.
1400: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
1410: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1420: 74 35 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t5;.    INSERT I
1430: 4e 54 4f 20 74 35 20 53 45 4c 45 43 54 20 78 2d  NTO t5 SELECT x-
1440: 79 2c 20 78 2b 79 20 46 52 4f 4d 20 74 31 20 57  y, x+y FROM t1 W
1450: 48 45 52 45 20 78 20 42 45 54 57 45 45 4e 20 31  HERE x BETWEEN 1
1460: 30 20 41 4e 44 20 31 35 0a 20 20 20 20 20 20 20  0 AND 15.       
1470: 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43   ORDER BY x DESC
1480: 20 4c 49 4d 49 54 20 32 3b 0a 20 20 20 20 53 45   LIMIT 2;.    SE
1490: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 4f  LECT * FROM t5 O
14a0: 52 44 45 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d  RDER BY x;.  }.}
14b0: 20 7b 39 20 31 39 20 31 30 20 32 30 7d 0a 64 6f   {9 19 10 20}.do
14c0: 5f 74 65 73 74 20 6c 69 6d 69 74 2d 35 2e 33 20  _test limit-5.3 
14d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
14e0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35    DELETE FROM t5
14f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1500: 4f 20 74 35 20 53 45 4c 45 43 54 20 78 2d 79 2c  O t5 SELECT x-y,
1510: 20 78 2b 79 20 46 52 4f 4d 20 74 31 20 57 48 45   x+y FROM t1 WHE
1520: 52 45 20 78 20 4f 52 44 45 52 20 42 59 20 78 20  RE x ORDER BY x 
1530: 44 45 53 43 20 4c 49 4d 49 54 20 33 31 3b 0a 20  DESC LIMIT 31;. 
1540: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1550: 20 74 35 20 4f 52 44 45 52 20 42 59 20 78 20 4c   t5 ORDER BY x L
1560: 49 4d 49 54 20 32 3b 0a 20 20 7d 0a 7d 20 7b 2d  IMIT 2;.  }.} {-
1570: 34 20 36 20 2d 33 20 37 7d 0a 64 6f 5f 74 65 73  4 6 -3 7}.do_tes
1580: 74 20 6c 69 6d 69 74 2d 35 2e 34 20 7b 0a 20 20  t limit-5.4 {.  
1590: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
15a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 4f  LECT * FROM t5 O
15b0: 52 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20  RDER BY x DESC, 
15c0: 79 20 44 45 53 43 20 4c 49 4d 49 54 20 32 3b 0a  y DESC LIMIT 2;.
15d0: 20 20 7d 0a 7d 20 7b 32 31 20 34 31 20 32 31 20    }.} {21 41 21 
15e0: 33 39 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69  39}.do_test limi
15f0: 74 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  t-5.5 {.  execsq
1600: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
1610: 52 4f 4d 20 74 35 3b 0a 20 20 20 20 49 4e 53 45  ROM t5;.    INSE
1620: 52 54 20 49 4e 54 4f 20 74 35 20 53 45 4c 45 43  RT INTO t5 SELEC
1630: 54 20 61 2e 78 2a 31 30 30 2b 62 2e 78 2c 20 61  T a.x*100+b.x, a
1640: 2e 79 2a 31 30 30 2b 62 2e 79 20 46 52 4f 4d 20  .y*100+b.y FROM 
1650: 74 31 20 41 53 20 61 2c 20 74 31 20 41 53 20 62  t1 AS a, t1 AS b
1660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1670: 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 2c 20      ORDER BY 1, 
1680: 32 20 4c 49 4d 49 54 20 31 30 30 30 3b 0a 20 20  2 LIMIT 1000;.  
1690: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
16a0: 29 2c 20 73 75 6d 28 78 29 2c 20 73 75 6d 28 79  ), sum(x), sum(y
16b0: 29 2c 20 6d 69 6e 28 78 29 2c 20 6d 61 78 28 78  ), min(x), max(x
16c0: 29 2c 20 6d 69 6e 28 79 29 2c 20 6d 61 78 28 79  ), min(y), max(y
16d0: 29 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d  ) FROM t5;.  }.}
16e0: 20 7b 31 30 30 30 20 31 35 32 38 32 30 34 20 35   {1000 1528204 5
16f0: 39 33 31 36 31 20 30 20 33 31 30 37 20 35 30 35  93161 0 3107 505
1700: 20 31 30 30 35 7d 0a 0a 23 20 54 68 65 72 65 20   1005}..# There 
1710: 69 73 20 73 6f 6d 65 20 63 6f 6e 74 72 61 76 65  is some contrave
1720: 72 73 79 20 61 62 6f 75 74 20 77 68 65 74 68 65  rsy about whethe
1730: 72 20 4c 49 4d 49 54 20 30 20 73 68 6f 75 6c 64  r LIMIT 0 should
1740: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
1750: 23 20 6e 6f 20 6c 69 6d 69 74 20 61 74 20 61 6c  # no limit at al
1760: 6c 20 6f 72 20 69 66 20 4c 49 4d 49 54 20 30 20  l or if LIMIT 0 
1770: 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e  should result in
1780: 20 7a 65 72 6f 20 6f 75 74 70 75 74 20 72 6f 77   zero output row
1790: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6d  s..#.do_test lim
17a0: 69 74 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  it-6.1 {.  execs
17b0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
17c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
17d0: 20 74 36 28 61 29 3b 0a 20 20 20 20 49 4e 53 45   t6(a);.    INSE
17e0: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
17f0: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
1800: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
1810: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
1820: 4e 54 4f 20 74 36 20 53 45 4c 45 43 54 20 61 2b  NTO t6 SELECT a+
1830: 32 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20 43  2 FROM t6;.    C
1840: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
1850: 54 20 2a 20 46 52 4f 4d 20 74 36 3b 0a 20 20 7d  T * FROM t6;.  }
1860: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
1870: 74 65 73 74 20 6c 69 6d 69 74 2d 36 2e 32 20 7b  test limit-6.2 {
1880: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1890: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18a0: 36 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45  6 LIMIT -1 OFFSE
18b0: 54 20 2d 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  T -1;.  }.} {1 2
18c0: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 6c 69   3 4}.do_test li
18d0: 6d 69 74 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63  mit-6.3 {.  exec
18e0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
18f0: 20 2a 20 46 52 4f 4d 20 74 36 20 4c 49 4d 49 54   * FROM t6 LIMIT
1900: 20 32 20 4f 46 46 53 45 54 20 2d 31 32 33 3b 0a   2 OFFSET -123;.
1910: 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74    }.} {1 2}.do_t
1920: 65 73 74 20 6c 69 6d 69 74 2d 36 2e 34 20 7b 0a  est limit-6.4 {.
1930: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
1950: 20 4c 49 4d 49 54 20 2d 34 33 32 20 4f 46 46 53   LIMIT -432 OFFS
1960: 45 54 20 32 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34  ET 2;.  }.} {3 4
1970: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  }.do_test limit-
1980: 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.5 {.  execsql 
1990: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
19a0: 52 4f 4d 20 74 36 20 4c 49 4d 49 54 20 2d 31 0a  ROM t6 LIMIT -1.
19b0: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a    }.} {1 2 3 4}.
19c0: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 36 2e  do_test limit-6.
19d0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
19e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
19f0: 4d 20 74 36 20 4c 49 4d 49 54 20 2d 31 20 4f 46  M t6 LIMIT -1 OF
1a00: 46 53 45 54 20 31 0a 20 20 7d 0a 7d 20 7b 32 20  FSET 1.  }.} {2 
1a10: 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d  3 4}.do_test lim
1a20: 69 74 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73  it-6.7 {.  execs
1a30: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1a40: 2a 20 46 52 4f 4d 20 74 36 20 4c 49 4d 49 54 20  * FROM t6 LIMIT 
1a50: 30 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  0.  }.} {}.do_te
1a60: 73 74 20 6c 69 6d 69 74 2d 36 2e 38 20 7b 0a 20  st limit-6.8 {. 
1a70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
1a80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20  ELECT * FROM t6 
1a90: 4c 49 4d 49 54 20 30 20 4f 46 46 53 45 54 20 31  LIMIT 0 OFFSET 1
1aa0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 4d 61 6b  .  }.} {}..# Mak
1ab0: 65 20 73 75 72 65 20 4c 49 4d 49 54 20 77 6f 72  e sure LIMIT wor
1ac0: 6b 73 20 77 65 6c 6c 20 77 69 74 68 20 63 6f 6d  ks well with com
1ad0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1ae0: 74 65 6d 65 6e 74 73 2e 0a 23 20 54 69 63 6b 65  tements..# Ticke
1af0: 74 20 23 33 39 33 0a 23 0a 69 66 63 61 70 61 62  t #393.#.ifcapab
1b00: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 64 6f  le compound {.do
1b10: 5f 74 65 73 74 20 6c 69 6d 69 74 2d 37 2e 31 2e  _test limit-7.1.
1b20: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
1b30: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
1b40: 4f 4d 20 74 32 20 4c 49 4d 49 54 20 35 20 55 4e  OM t2 LIMIT 5 UN
1b50: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61  ION ALL SELECT a
1b60: 20 46 52 4f 4d 20 74 36 3b 0a 20 20 7d 0a 7d 20   FROM t6;.  }.} 
1b70: 7b 31 20 7b 4c 49 4d 49 54 20 63 6c 61 75 73 65  {1 {LIMIT clause
1b80: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
1b90: 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 6e 6f 74  er UNION ALL not
1ba0: 20 62 65 66 6f 72 65 7d 7d 0a 64 6f 5f 74 65 73   before}}.do_tes
1bb0: 74 20 6c 69 6d 69 74 2d 37 2e 31 2e 32 20 7b 0a  t limit-7.1.2 {.
1bc0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1bd0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1be0: 32 20 4c 49 4d 49 54 20 35 20 55 4e 49 4f 4e 20  2 LIMIT 5 UNION 
1bf0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 36  SELECT a FROM t6
1c00: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 4c 49 4d 49  ;.  }.} {1 {LIMI
1c10: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
1c20: 63 6f 6d 65 20 61 66 74 65 72 20 55 4e 49 4f 4e  come after UNION
1c30: 20 6e 6f 74 20 62 65 66 6f 72 65 7d 7d 0a 64 6f   not before}}.do
1c40: 5f 74 65 73 74 20 6c 69 6d 69 74 2d 37 2e 31 2e  _test limit-7.1.
1c50: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
1c60: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
1c70: 4f 4d 20 74 32 20 4c 49 4d 49 54 20 35 20 45 58  OM t2 LIMIT 5 EX
1c80: 43 45 50 54 20 53 45 4c 45 43 54 20 61 20 46 52  CEPT SELECT a FR
1c90: 4f 4d 20 74 36 20 4c 49 4d 49 54 20 33 3b 0a 20  OM t6 LIMIT 3;. 
1ca0: 20 7d 0a 7d 20 7b 31 20 7b 4c 49 4d 49 54 20 63   }.} {1 {LIMIT c
1cb0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
1cc0: 65 20 61 66 74 65 72 20 45 58 43 45 50 54 20 6e  e after EXCEPT n
1cd0: 6f 74 20 62 65 66 6f 72 65 7d 7d 0a 64 6f 5f 74  ot before}}.do_t
1ce0: 65 73 74 20 6c 69 6d 69 74 2d 37 2e 31 2e 34 20  est limit-7.1.4 
1cf0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1d00: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1d10: 20 74 32 20 4c 49 4d 49 54 20 30 2c 35 20 49 4e   t2 LIMIT 0,5 IN
1d20: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 61  TERSECT SELECT a
1d30: 20 46 52 4f 4d 20 74 36 3b 0a 20 20 7d 0a 7d 20   FROM t6;.  }.} 
1d40: 7b 31 20 7b 4c 49 4d 49 54 20 63 6c 61 75 73 65  {1 {LIMIT clause
1d50: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
1d60: 65 72 20 49 4e 54 45 52 53 45 43 54 20 6e 6f 74  er INTERSECT not
1d70: 20 62 65 66 6f 72 65 7d 7d 0a 64 6f 5f 74 65 73   before}}.do_tes
1d80: 74 20 6c 69 6d 69 74 2d 37 2e 32 20 7b 0a 20 20  t limit-7.2 {.  
1d90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1da0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 55  LECT x FROM t2 U
1db0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
1dc0: 61 20 46 52 4f 4d 20 74 36 20 4c 49 4d 49 54 20  a FROM t6 LIMIT 
1dd0: 35 3b 0a 20 20 7d 0a 7d 20 7b 33 31 20 33 30 20  5;.  }.} {31 30 
1de0: 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 6c  1 2 3}.do_test l
1df0: 69 6d 69 74 2d 37 2e 33 20 7b 0a 20 20 65 78 65  imit-7.3 {.  exe
1e00: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1e10: 54 20 78 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T x FROM t2 UNIO
1e20: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20 46  N ALL SELECT a F
1e30: 52 4f 4d 20 74 36 20 4c 49 4d 49 54 20 33 20 4f  ROM t6 LIMIT 3 O
1e40: 46 46 53 45 54 20 31 3b 0a 20 20 7d 0a 7d 20 7b  FFSET 1;.  }.} {
1e50: 33 30 20 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  30 1 2}.do_test 
1e60: 6c 69 6d 69 74 2d 37 2e 34 20 7b 0a 20 20 65 78  limit-7.4 {.  ex
1e70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
1e80: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT x FROM t2 UNI
1e90: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20  ON ALL SELECT a 
1ea0: 46 52 4f 4d 20 74 36 20 4f 52 44 45 52 20 42 59  FROM t6 ORDER BY
1eb0: 20 31 20 4c 49 4d 49 54 20 33 20 4f 46 46 53 45   1 LIMIT 3 OFFSE
1ec0: 54 20 31 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 20  T 1;.  }.} {2 3 
1ed0: 34 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74  4}.do_test limit
1ee0: 2d 37 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.5 {.  execsql
1ef0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
1f00: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
1f10: 4c 45 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 32  LECT x+2 FROM t2
1f20: 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54 20   LIMIT 2 OFFSET 
1f30: 31 3b 0a 20 20 7d 0a 7d 20 7b 33 31 20 33 32 7d  1;.  }.} {31 32}
1f40: 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 37  .do_test limit-7
1f50: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
1f60: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
1f70: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
1f80: 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 32 20 4f  CT x+2 FROM t2 O
1f90: 52 44 45 52 20 42 59 20 31 20 44 45 53 43 20 4c  RDER BY 1 DESC L
1fa0: 49 4d 49 54 20 32 20 4f 46 46 53 45 54 20 31 3b  IMIT 2 OFFSET 1;
1fb0: 0a 20 20 7d 0a 7d 20 7b 33 32 20 33 31 7d 0a 64  .  }.} {32 31}.d
1fc0: 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 37 2e 37  o_test limit-7.7
1fd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fe0: 20 20 20 53 45 4c 45 43 54 20 61 2b 39 20 46 52     SELECT a+9 FR
1ff0: 4f 4d 20 74 36 20 45 58 43 45 50 54 20 53 45 4c  OM t6 EXCEPT SEL
2000: 45 43 54 20 79 20 46 52 4f 4d 20 74 32 20 4c 49  ECT y FROM t2 LI
2010: 4d 49 54 20 32 3b 0a 20 20 7d 0a 7d 20 7b 31 31  MIT 2;.  }.} {11
2020: 20 31 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d   12}.do_test lim
2030: 69 74 2d 37 2e 38 20 7b 0a 20 20 65 78 65 63 73  it-7.8 {.  execs
2040: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2050: 61 2b 39 20 46 52 4f 4d 20 74 36 20 45 58 43 45  a+9 FROM t6 EXCE
2060: 50 54 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  PT SELECT y FROM
2070: 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 20 44   t2 ORDER BY 1 D
2080: 45 53 43 20 4c 49 4d 49 54 20 32 3b 0a 20 20 7d  ESC LIMIT 2;.  }
2090: 0a 7d 20 7b 31 33 20 31 32 7d 0a 64 6f 5f 74 65  .} {13 12}.do_te
20a0: 73 74 20 6c 69 6d 69 74 2d 37 2e 39 20 7b 0a 20  st limit-7.9 {. 
20b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
20c0: 45 4c 45 43 54 20 61 2b 32 36 20 46 52 4f 4d 20  ELECT a+26 FROM 
20d0: 74 36 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  t6 INTERSECT SEL
20e0: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 4c 49  ECT x FROM t2 LI
20f0: 4d 49 54 20 31 3b 0a 20 20 7d 0a 7d 20 7b 33 30  MIT 1;.  }.} {30
2100: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  }.do_test limit-
2110: 37 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  7.10 {.  execsql
2120: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2b   {.    SELECT a+
2130: 32 37 20 46 52 4f 4d 20 74 36 20 49 4e 54 45 52  27 FROM t6 INTER
2140: 53 45 43 54 20 53 45 4c 45 43 54 20 78 20 46 52  SECT SELECT x FR
2150: 4f 4d 20 74 32 20 4c 49 4d 49 54 20 31 3b 0a 20  OM t2 LIMIT 1;. 
2160: 20 7d 0a 7d 20 7b 33 30 7d 0a 64 6f 5f 74 65 73   }.} {30}.do_tes
2170: 74 20 6c 69 6d 69 74 2d 37 2e 31 31 20 7b 0a 20  t limit-7.11 {. 
2180: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
2190: 45 4c 45 43 54 20 61 2b 32 37 20 46 52 4f 4d 20  ELECT a+27 FROM 
21a0: 74 36 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  t6 INTERSECT SEL
21b0: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 4c 49  ECT x FROM t2 LI
21c0: 4d 49 54 20 31 20 4f 46 46 53 45 54 20 31 3b 0a  MIT 1 OFFSET 1;.
21d0: 20 20 7d 0a 7d 20 7b 33 31 7d 0a 64 6f 5f 74 65    }.} {31}.do_te
21e0: 73 74 20 6c 69 6d 69 74 2d 37 2e 31 32 20 7b 0a  st limit-7.12 {.
21f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2200: 53 45 4c 45 43 54 20 61 2b 32 37 20 46 52 4f 4d  SELECT a+27 FROM
2210: 20 74 36 20 49 4e 54 45 52 53 45 43 54 20 53 45   t6 INTERSECT SE
2220: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 0a  LECT x FROM t2 .
2230: 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20         ORDER BY 
2240: 31 20 44 45 53 43 20 4c 49 4d 49 54 20 31 20 4f  1 DESC LIMIT 1 O
2250: 46 46 53 45 54 20 31 3b 0a 20 20 7d 0a 7d 20 7b  FFSET 1;.  }.} {
2260: 33 30 7d 0a 7d 20 3b 23 20 69 66 63 61 70 61 62  30}.} ;# ifcapab
2270: 6c 65 20 63 6f 6d 70 6f 75 6e 64 0a 0a 23 20 54  le compound..# T
2280: 65 73 74 73 20 66 6f 72 20 6c 69 6d 69 74 20 69  ests for limit i
2290: 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77 69  n conjunction wi
22a0: 74 68 20 64 69 73 74 69 6e 63 74 2e 20 20 54 68  th distinct.  Th
22b0: 65 20 64 69 73 74 69 6e 63 74 20 73 68 6f 75 6c  e distinct shoul
22c0: 64 0a 23 20 6f 63 63 75 72 20 62 65 66 6f 72 65  d.# occur before
22d0: 20 62 6f 74 68 20 74 68 65 20 6c 69 6d 69 74 20   both the limit 
22e0: 61 6e 64 20 74 68 65 20 6f 66 66 73 65 74 2e 20  and the offset. 
22f0: 20 54 69 63 6b 65 74 20 23 37 34 39 2e 0a 23 0a   Ticket #749..#.
2300: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 38 2e  do_test limit-8.
2310: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2320: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
2330: 4e 43 54 20 63 61 73 74 28 72 6f 75 6e 64 28 78  NCT cast(round(x
2340: 2f 31 30 30 29 20 61 73 20 69 6e 74 65 67 65 72  /100) as integer
2350: 29 20 46 52 4f 4d 20 74 33 20 4c 49 4d 49 54 20  ) FROM t3 LIMIT 
2360: 35 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20  5;.  }.} {0 1 2 
2370: 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d  3 4}.do_test lim
2380: 69 74 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  it-8.2 {.  execs
2390: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
23a0: 44 49 53 54 49 4e 43 54 20 63 61 73 74 28 72 6f  DISTINCT cast(ro
23b0: 75 6e 64 28 78 2f 31 30 30 29 20 61 73 20 69 6e  und(x/100) as in
23c0: 74 65 67 65 72 29 20 46 52 4f 4d 20 74 33 20 4c  teger) FROM t3 L
23d0: 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20 35 3b  IMIT 5 OFFSET 5;
23e0: 0a 20 20 7d 0a 7d 20 7b 35 20 36 20 37 20 38 20  .  }.} {5 6 7 8 
23f0: 39 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74  9}.do_test limit
2400: 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.3 {.  execsql
2410: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
2420: 53 54 49 4e 43 54 20 63 61 73 74 28 72 6f 75 6e  STINCT cast(roun
2430: 64 28 78 2f 31 30 30 29 20 61 73 20 69 6e 74 65  d(x/100) as inte
2440: 67 65 72 29 20 46 52 4f 4d 20 74 33 20 4c 49 4d  ger) FROM t3 LIM
2450: 49 54 20 35 20 4f 46 46 53 45 54 20 32 35 3b 0a  IT 5 OFFSET 25;.
2460: 20 20 7d 0a 7d 20 7b 32 35 20 32 36 20 32 37 20    }.} {25 26 27 
2470: 32 38 20 32 39 7d 0a 0a 23 20 4d 61 6b 65 20 73  28 29}..# Make s
2480: 75 72 65 20 6c 69 6d 69 74 73 20 6f 6e 20 6d 75  ure limits on mu
2490: 6c 74 69 70 6c 65 20 73 75 62 71 75 65 72 69 65  ltiple subquerie
24a0: 73 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  s work correctly
24b0: 2e 0a 23 20 54 69 63 6b 65 74 20 23 31 30 33 35  ..# Ticket #1035
24c0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62  .#.ifcapable sub
24d0: 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73  query {.  do_tes
24e0: 74 20 6c 69 6d 69 74 2d 39 2e 31 20 7b 0a 20 20  t limit-9.1 {.  
24f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2500: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2510: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
2520: 36 20 4c 49 4d 49 54 20 33 29 3b 0a 20 20 20 20  6 LIMIT 3);.    
2530: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 7d 0a 7d 0a  }.  } {1 2 3}.}.
2540: 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d 39 2e  do_test limit-9.
2550: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
2560: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2570: 4c 45 20 74 37 20 41 53 20 53 45 4c 45 43 54 20  LE t7 AS SELECT 
2580: 2a 20 46 52 4f 4d 20 74 36 3b 0a 20 20 7d 0a 7d  * FROM t6;.  }.}
2590: 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75   {}.ifcapable su
25a0: 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65  bquery {.  do_te
25b0: 73 74 20 6c 69 6d 69 74 2d 39 2e 32 2e 32 20 7b  st limit-9.2.2 {
25c0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
25d0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25e0: 4f 4d 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  OM (SELECT * FRO
25f0: 4d 20 74 37 20 4c 49 4d 49 54 20 33 29 3b 0a 20  M t7 LIMIT 3);. 
2600: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 7d     }.  } {1 2 3}
2610: 0a 7d 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d  .}.ifcapable com
2620: 70 6f 75 6e 64 20 7b 0a 20 20 69 66 63 61 70 61  pound {.  ifcapa
2630: 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b 0a 20  ble subquery {. 
2640: 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74     do_test limit
2650: 2d 39 2e 33 20 7b 0a 20 20 20 20 20 20 65 78 65  -9.3 {.      exe
2660: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 53  csql {.        S
2670: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
2680: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 4c  LECT * FROM t6 L
2690: 49 4d 49 54 20 33 29 0a 20 20 20 20 20 20 20 20  IMIT 3).        
26a0: 55 4e 49 4f 4e 0a 20 20 20 20 20 20 20 20 53 45  UNION.        SE
26b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
26c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 4c 49  ECT * FROM t7 LI
26d0: 4d 49 54 20 33 29 0a 20 20 20 20 20 20 20 20 4f  MIT 3).        O
26e0: 52 44 45 52 20 42 59 20 31 0a 20 20 20 20 20 20  RDER BY 1.      
26f0: 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20 33 7d 0a  }.    } {1 2 3}.
2700: 20 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6d 69      do_test limi
2710: 74 2d 39 2e 34 20 7b 0a 20 20 20 20 20 20 65 78  t-9.4 {.      ex
2720: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
2730: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
2740: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20  ELECT * FROM t6 
2750: 4c 49 4d 49 54 20 33 29 0a 20 20 20 20 20 20 20  LIMIT 3).       
2760: 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 20 20 53   UNION.        S
2770: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
2780: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 4c  LECT * FROM t7 L
2790: 49 4d 49 54 20 33 29 0a 20 20 20 20 20 20 20 20  IMIT 3).        
27a0: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 20 20 20  ORDER BY 1.     
27b0: 20 20 20 4c 49 4d 49 54 20 32 0a 20 20 20 20 20     LIMIT 2.     
27c0: 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 7d 0a 20   }.    } {1 2}. 
27d0: 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6d   }.  do_test lim
27e0: 69 74 2d 39 2e 35 20 7b 0a 20 20 20 20 63 61 74  it-9.5 {.    cat
27f0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  chsql {.      SE
2800: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 4c  LECT * FROM t6 L
2810: 49 4d 49 54 20 33 0a 20 20 20 20 20 20 55 4e 49  IMIT 3.      UNI
2820: 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ON.      SELECT 
2830: 2a 20 46 52 4f 4d 20 74 37 20 4c 49 4d 49 54 20  * FROM t7 LIMIT 
2840: 33 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  3.    }.  } {1 {
2850: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
2860: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 55  uld come after U
2870: 4e 49 4f 4e 20 6e 6f 74 20 62 65 66 6f 72 65 7d  NION not before}
2880: 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 4c 49 4d 49  }.}..# Test LIMI
2890: 54 20 61 6e 64 20 4f 46 46 53 45 54 20 75 73 69  T and OFFSET usi
28a0: 6e 67 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ng SQL variables
28b0: 2e 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  ..do_test limit-
28c0: 31 30 2e 31 20 7b 0a 20 20 73 65 74 20 6c 69 6d  10.1 {.  set lim
28d0: 69 74 20 31 30 0a 20 20 64 62 20 65 76 61 6c 20  it 10.  db eval 
28e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
28f0: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 3a 6c 69  ROM t1 LIMIT :li
2900: 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b 33 31 20 33  mit;.  }.} {31 3
2910: 30 20 32 39 20 32 38 20 32 37 20 32 36 20 32 35  0 29 28 27 26 25
2920: 20 32 34 20 32 33 20 32 32 7d 0a 64 6f 5f 74 65   24 23 22}.do_te
2930: 73 74 20 6c 69 6d 69 74 2d 31 30 2e 32 20 7b 0a  st limit-10.2 {.
2940: 20 20 73 65 74 20 6c 69 6d 69 74 20 35 0a 20 20    set limit 5.  
2950: 73 65 74 20 6f 66 66 73 65 74 20 35 0a 20 20 64  set offset 5.  d
2960: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
2970: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 4c 49  ECT x FROM t1 LI
2980: 4d 49 54 20 3a 6c 69 6d 69 74 20 4f 46 46 53 45  MIT :limit OFFSE
2990: 54 20 3a 6f 66 66 73 65 74 3b 0a 20 20 7d 0a 7d  T :offset;.  }.}
29a0: 20 7b 32 36 20 32 35 20 32 34 20 32 33 20 32 32   {26 25 24 23 22
29b0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  }.do_test limit-
29c0: 31 30 2e 33 20 7b 0a 20 20 73 65 74 20 6c 69 6d  10.3 {.  set lim
29d0: 69 74 20 2d 31 0a 20 20 64 62 20 65 76 61 6c 20  it -1.  db eval 
29e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
29f0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3c 31  ROM t1 WHERE x<1
2a00: 30 20 4c 49 4d 49 54 20 3a 6c 69 6d 69 74 3b 0a  0 LIMIT :limit;.
2a10: 20 20 7d 0a 7d 20 7b 39 20 38 20 37 20 36 20 35    }.} {9 8 7 6 5
2a20: 20 34 20 33 20 32 20 31 20 30 7d 0a 64 6f 5f 74   4 3 2 1 0}.do_t
2a30: 65 73 74 20 6c 69 6d 69 74 2d 31 30 2e 34 20 7b  est limit-10.4 {
2a40: 0a 20 20 73 65 74 20 6c 69 6d 69 74 20 31 2e 35  .  set limit 1.5
2a50: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2a60: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
2a70: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2a80: 20 74 31 20 57 48 45 52 45 20 78 3c 31 30 20 4c   t1 WHERE x<10 L
2a90: 49 4d 49 54 20 3a 6c 69 6d 69 74 3b 0a 20 20 7d  IMIT :limit;.  }
2aa0: 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24   } msg].  list $
2ab0: 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61  rc $msg.} {1 {da
2ac0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d  tatype mismatch}
2ad0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6d 69 74 2d  }.do_test limit-
2ae0: 31 30 2e 35 20 7b 0a 20 20 73 65 74 20 6c 69 6d  10.5 {.  set lim
2af0: 69 74 20 22 68 65 6c 6c 6f 20 77 6f 72 6c 64 22  it "hello world"
2b00: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2b10: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
2b20: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2b30: 20 74 31 20 57 48 45 52 45 20 78 3c 31 30 20 4c   t1 WHERE x<10 L
2b40: 49 4d 49 54 20 3a 6c 69 6d 69 74 3b 0a 20 20 7d  IMIT :limit;.  }
2b50: 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24   } msg].  list $
2b60: 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61  rc $msg.} {1 {da
2b70: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d  tatype mismatch}
2b80: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62  }..ifcapable sub
2b90: 71 75 65 72 79 20 7b 0a 64 6f 5f 74 65 73 74 20  query {.do_test 
2ba0: 6c 69 6d 69 74 2d 31 31 2e 31 20 7b 0a 20 20 64  limit-11.1 {.  d
2bb0: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 53 45  b eval {.     SE
2bc0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c  LECT x FROM (SEL
2bd0: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 4f 52  ECT x FROM t1 OR
2be0: 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54 20 30  DER BY x LIMIT 0
2bf0: 29 20 4f 52 44 45 52 20 42 59 20 78 0a 20 20 7d  ) ORDER BY x.  }
2c00: 0a 7d 20 7b 7d 0a 7d 20 3b 23 20 69 66 63 61 70  .} {}.} ;# ifcap
2c10: 61 62 6c 65 20 73 75 62 71 75 65 72 79 0a 0a 66  able subquery..f
2c20: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.