/ Hex Artifact Content
Login

Artifact 339e87723cd4dc158dc5e9095acd8df9e87faf79:


0000: 23 20 32 30 31 33 20 41 75 67 75 73 74 20 33 0a  # 2013 August 3.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   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 0a 23 0a 23 20 54 68 69 73 20 66  *****.#.# This f
0170: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 75 74  ile contains aut
0180: 6f 6d 61 74 65 64 20 74 65 73 74 73 20 75 73 65  omated tests use
0190: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
01a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
01b0: 34 0a 23 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  4.# functionalit
01c0: 79 20 69 73 20 77 6f 72 6b 69 6e 67 2e 0a 23 0a  y is working..#.
01d0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
01e0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
01f0: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0200: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 65  ir/tester.tcl.se
0210: 74 20 74 65 73 74 70 72 65 66 69 78 20 61 6e 61  t testprefix ana
0220: 6c 79 7a 65 39 0a 0a 69 66 63 61 70 61 62 6c 65  lyze9..ifcapable
0230: 20 21 73 74 61 74 34 20 7b 0a 20 20 66 69 6e 69   !stat4 {.  fini
0240: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
0250: 0a 7d 0a 0a 70 72 6f 63 20 73 20 7b 62 6c 6f 62  .}..proc s {blob
0260: 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20 22 22  } {.  set ret ""
0270: 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24  .  binary scan $
0280: 62 6c 6f 62 20 63 2a 20 62 79 74 65 73 0a 20 20  blob c* bytes.  
0290: 66 6f 72 65 61 63 68 20 62 20 24 62 79 74 65 73  foreach b $bytes
02a0: 20 7b 0a 20 20 20 20 73 65 74 20 74 20 5b 62 69   {.    set t [bi
02b0: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 20 24 62  nary format c $b
02c0: 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ].    if {[strin
02d0: 67 20 69 73 20 70 72 69 6e 74 20 24 74 5d 7d 20  g is print $t]} 
02e0: 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 72  {.      append r
02f0: 65 74 20 24 74 0a 20 20 20 20 7d 20 65 6c 73 65  et $t.    } else
0300: 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20   {.      append 
0310: 72 65 74 20 2e 0a 20 20 20 20 7d 0a 20 20 7d 0a  ret ..    }.  }.
0320: 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a    return $ret.}.
0330: 64 62 20 66 75 6e 63 74 69 6f 6e 20 73 20 73 0a  db function s s.
0340: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0350: 20 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   1.0 {.  CREATE 
0360: 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 2c  TABLE t1(a TEXT,
0370: 20 62 20 54 45 58 54 29 3b 20 0a 20 20 49 4e 53   b TEXT); .  INS
0380: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0390: 45 53 28 27 28 30 29 27 2c 20 27 28 30 29 27 29  ES('(0)', '(0)')
03a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
03b0: 74 31 20 56 41 4c 55 45 53 28 27 28 31 29 27 2c  t1 VALUES('(1)',
03c0: 20 27 28 31 29 27 29 3b 0a 20 20 49 4e 53 45 52   '(1)');.  INSER
03d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
03e0: 28 27 28 32 29 27 2c 20 27 28 32 29 27 29 3b 0a  ('(2)', '(2)');.
03f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0400: 20 56 41 4c 55 45 53 28 27 28 33 29 27 2c 20 27   VALUES('(3)', '
0410: 28 33 29 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  (3)');.  INSERT 
0420: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
0430: 28 34 29 27 2c 20 27 28 34 29 27 29 3b 0a 20 20  (4)', '(4)');.  
0440: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
0450: 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 7d 20 7b  ON t1(a, b);.} {
0460: 7d 0a 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }...do_execsql_t
0470: 65 73 74 20 31 2e 31 20 7b 0a 20 20 41 4e 41 4c  est 1.1 {.  ANAL
0480: 59 5a 45 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78  YZE;.} {}..do_ex
0490: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 32 20 7b  ecsql_test 1.2 {
04a0: 0a 20 20 53 45 4c 45 43 54 20 74 62 6c 2c 69 64  .  SELECT tbl,id
04b0: 78 2c 6e 45 71 2c 6e 4c 74 2c 6e 44 4c 74 2c 74  x,nEq,nLt,nDLt,t
04c0: 65 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70 6c  est_decode(sampl
04d0: 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  e) FROM sqlite_s
04e0: 74 61 74 34 3b 0a 7d 20 7b 0a 20 20 74 31 20 69  tat4;.} {.  t1 i
04f0: 31 20 7b 31 20 31 20 31 7d 20 7b 30 20 30 20 30  1 {1 1 1} {0 0 0
0500: 7d 20 7b 30 20 30 20 30 7d 20 7b 28 30 29 20 28  } {0 0 0} {(0) (
0510: 30 29 20 31 7d 0a 20 20 74 31 20 69 31 20 7b 31  0) 1}.  t1 i1 {1
0520: 20 31 20 31 7d 20 7b 31 20 31 20 31 7d 20 7b 31   1 1} {1 1 1} {1
0530: 20 31 20 31 7d 20 7b 28 31 29 20 28 31 29 20 32   1 1} {(1) (1) 2
0540: 7d 0a 20 20 74 31 20 69 31 20 7b 31 20 31 20 31  }.  t1 i1 {1 1 1
0550: 7d 20 7b 32 20 32 20 32 7d 20 7b 32 20 32 20 32  } {2 2 2} {2 2 2
0560: 7d 20 7b 28 32 29 20 28 32 29 20 33 7d 0a 20 20  } {(2) (2) 3}.  
0570: 74 31 20 69 31 20 7b 31 20 31 20 31 7d 20 7b 33  t1 i1 {1 1 1} {3
0580: 20 33 20 33 7d 20 7b 33 20 33 20 33 7d 20 7b 28   3 3} {3 3 3} {(
0590: 33 29 20 28 33 29 20 34 7d 0a 20 20 74 31 20 69  3) (3) 4}.  t1 i
05a0: 31 20 7b 31 20 31 20 31 7d 20 7b 34 20 34 20 34  1 {1 1 1} {4 4 4
05b0: 7d 20 7b 34 20 34 20 34 7d 20 7b 28 34 29 20 28  } {4 4 4} {(4) (
05c0: 34 29 20 35 7d 0a 7d 0a 0a 69 66 20 7b 5b 70 65  4) 5}.}..if {[pe
05d0: 72 6d 75 74 61 74 69 6f 6e 5d 20 21 3d 20 22 75  rmutation] != "u
05e0: 74 66 31 36 22 7d 20 7b 0a 20 20 64 6f 5f 65 78  tf16"} {.  do_ex
05f0: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20 7b  ecsql_test 1.3 {
0600: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 62 6c 2c  .    SELECT tbl,
0610: 69 64 78 2c 6e 45 71 2c 6e 4c 74 2c 6e 44 4c 74  idx,nEq,nLt,nDLt
0620: 2c 73 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20  ,s(sample) FROM 
0630: 73 71 6c 69 74 65 5f 73 74 61 74 34 3b 0a 20 20  sqlite_stat4;.  
0640: 7d 20 7b 0a 20 20 20 20 74 31 20 69 31 20 7b 31  } {.    t1 i1 {1
0650: 20 31 20 31 7d 20 7b 30 20 30 20 30 7d 20 7b 30   1 1} {0 0 0} {0
0660: 20 30 20 30 7d 20 2e 2e 2e 2e 28 30 29 28 30 29   0 0} ....(0)(0)
0670: 0a 20 20 20 20 74 31 20 69 31 20 7b 31 20 31 20  .    t1 i1 {1 1 
0680: 31 7d 20 7b 31 20 31 20 31 7d 20 7b 31 20 31 20  1} {1 1 1} {1 1 
0690: 31 7d 20 2e 2e 2e 2e 28 31 29 28 31 29 2e 0a 20  1} ....(1)(1).. 
06a0: 20 20 20 74 31 20 69 31 20 7b 31 20 31 20 31 7d     t1 i1 {1 1 1}
06b0: 20 7b 32 20 32 20 32 7d 20 7b 32 20 32 20 32 7d   {2 2 2} {2 2 2}
06c0: 20 2e 2e 2e 2e 28 32 29 28 32 29 2e 0a 20 20 20   ....(2)(2)..   
06d0: 20 74 31 20 69 31 20 7b 31 20 31 20 31 7d 20 7b   t1 i1 {1 1 1} {
06e0: 33 20 33 20 33 7d 20 7b 33 20 33 20 33 7d 20 2e  3 3 3} {3 3 3} .
06f0: 2e 2e 2e 28 33 29 28 33 29 2e 0a 20 20 20 20 74  ...(3)(3)..    t
0700: 31 20 69 31 20 7b 31 20 31 20 31 7d 20 7b 34 20  1 i1 {1 1 1} {4 
0710: 34 20 34 7d 20 7b 34 20 34 20 34 7d 20 2e 2e 2e  4 4} {4 4 4} ...
0720: 2e 28 34 29 28 34 29 2e 0a 20 20 7d 0a 7d 0a 0a  .(4)(4)..  }.}..
0730: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
0780: 69 73 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  is is really jus
0790: 74 20 74 6f 20 74 65 73 74 20 53 51 4c 20 75 73  t to test SQL us
07a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 22 74 65 73  er function "tes
07b0: 74 5f 64 65 63 6f 64 65 22 2e 0a 23 0a 72 65 73  t_decode"..#.res
07c0: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
07d0: 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 43 52  _test 2.1 {.  CR
07e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
07f0: 20 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54   b, c);.  INSERT
0800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0810: 27 73 6f 6d 65 20 74 65 78 74 27 2c 20 31 34 2c  'some text', 14,
0820: 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54   NULL);.  INSERT
0830: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0840: 32 32 2e 30 2c 20 4e 55 4c 4c 2c 20 78 27 36 35  22.0, NULL, x'65
0850: 36 36 36 37 27 29 3b 0a 20 20 43 52 45 41 54 45  6667');.  CREATE
0860: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
0870: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 41 4e 41 4c  a, b, c);.  ANAL
0880: 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20 74 65  YZE;.  SELECT te
0890: 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70 6c 65  st_decode(sample
08a0: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  ) FROM sqlite_st
08b0: 61 74 34 3b 0a 7d 20 7b 0a 20 20 7b 32 32 2e 30  at4;.} {.  {22.0
08c0: 20 4e 55 4c 4c 20 78 27 36 35 36 36 36 37 27 20   NULL x'656667' 
08d0: 32 7d 20 0a 20 20 7b 7b 73 6f 6d 65 20 74 65 78  2} .  {{some tex
08e0: 74 7d 20 31 34 20 4e 55 4c 4c 20 31 7d 0a 7d 0a  t} 14 NULL 1}.}.
08f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 0a 72  -----------.# .r
0940: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
0950: 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20  ql_test 3.1 {.  
0960: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
0970: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
0980: 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28 61  INDEX i2 ON t2(a
0990: 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d  , b);.  BEGIN;.}
09a0: 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 32 20 7b 0a  ..do_test 3.2 {.
09b0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
09c0: 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b 69 6e 63  {$i < 1000} {inc
09d0: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 61  r i} {.    set a
09e0: 20 5b 65 78 70 72 20 24 69 20 2f 20 31 30 5d 0a   [expr $i / 10].
09f0: 20 20 20 20 73 65 74 20 62 20 5b 65 78 70 72 20      set b [expr 
0a00: 69 6e 74 28 72 61 6e 64 28 29 20 2a 20 31 35 2e  int(rand() * 15.
0a10: 30 29 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  0)].    execsql 
0a20: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
0a30: 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62 29 20   VALUES($a, $b) 
0a40: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
0a50: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 62 20  COMMIT.} {}..db 
0a60: 66 75 6e 63 20 6c 69 6e 64 65 78 20 6c 69 6e 64  func lindex lind
0a70: 65 78 0a 0a 23 20 45 61 63 68 20 76 61 6c 75 65  ex..# Each value
0a80: 20 6f 66 20 22 61 22 20 6f 63 63 75 72 73 20 65   of "a" occurs e
0a90: 78 61 63 74 6c 79 20 31 30 20 74 69 6d 65 73 20  xactly 10 times 
0aa0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a  in the table..#.
0ab0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0ac0: 33 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  3.3.1 {.  SELECT
0ad0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0ae0: 32 20 47 52 4f 55 50 20 42 59 20 61 3b 0a 7d 20  2 GROUP BY a;.} 
0af0: 5b 6c 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20  [lrange [string 
0b00: 72 65 70 65 61 74 20 22 31 30 20 22 20 31 30 30  repeat "10 " 100
0b10: 5d 20 30 20 39 39 5d 0a 0a 23 20 54 68 65 20 66  ] 0 99]..# The f
0b20: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  irst element in 
0b30: 74 68 65 20 22 6e 45 71 22 20 6c 69 73 74 20 6f  the "nEq" list o
0b40: 66 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 73 68  f all samples sh
0b50: 6f 75 6c 64 20 74 68 65 72 65 66 6f 72 65 20 62  ould therefore b
0b60: 65 20 31 30 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  e 10..#.do_execs
0b70: 71 6c 5f 74 65 73 74 20 33 2e 33 2e 32 20 7b 0a  ql_test 3.3.2 {.
0b80: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 53 45 4c    ANALYZE;.  SEL
0b90: 45 43 54 20 6c 69 6e 64 65 78 28 6e 45 71 2c 20  ECT lindex(nEq, 
0ba0: 30 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  0) FROM sqlite_s
0bb0: 74 61 74 34 3b 0a 7d 20 5b 6c 72 61 6e 67 65 20  tat4;.} [lrange 
0bc0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
0bd0: 31 30 20 22 20 31 30 30 5d 20 30 20 32 33 5d 0a  10 " 100] 0 23].
0be0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 0a 64  -----------.# .d
0c30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
0c40: 2e 34 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  .4 {.  DROP TABL
0c50: 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a  E IF EXISTS t1;.
0c60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0c70: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
0c80: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a  ARY KEY, b, c);.
0c90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0ca0: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27 6f   VALUES(1, 1, 'o
0cb0: 6e 65 2d 61 27 29 3b 0a 20 20 49 4e 53 45 52 54  ne-a');.  INSERT
0cc0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0cd0: 31 31 2c 20 31 2c 20 27 6f 6e 65 2d 62 27 29 3b  11, 1, 'one-b');
0ce0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0cf0: 31 20 56 41 4c 55 45 53 28 32 31 2c 20 31 2c 20  1 VALUES(21, 1, 
0d00: 27 6f 6e 65 2d 63 27 29 3b 0a 20 20 49 4e 53 45  'one-c');.  INSE
0d10: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0d20: 53 28 33 31 2c 20 31 2c 20 27 6f 6e 65 2d 64 27  S(31, 1, 'one-d'
0d30: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0d40: 20 74 31 20 56 41 4c 55 45 53 28 34 31 2c 20 31   t1 VALUES(41, 1
0d50: 2c 20 27 6f 6e 65 2d 65 27 29 3b 0a 20 20 49 4e  , 'one-e');.  IN
0d60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0d70: 55 45 53 28 35 31 2c 20 31 2c 20 27 6f 6e 65 2d  UES(51, 1, 'one-
0d80: 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  f');.  INSERT IN
0d90: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 31 2c  TO t1 VALUES(61,
0da0: 20 31 2c 20 27 6f 6e 65 2d 67 27 29 3b 0a 20 20   1, 'one-g');.  
0db0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0dc0: 41 4c 55 45 53 28 37 31 2c 20 31 2c 20 27 6f 6e  ALUES(71, 1, 'on
0dd0: 65 2d 68 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  e-h');.  INSERT 
0de0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38  INTO t1 VALUES(8
0df0: 31 2c 20 31 2c 20 27 6f 6e 65 2d 69 27 29 3b 0a  1, 1, 'one-i');.
0e00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0e10: 20 56 41 4c 55 45 53 28 39 31 2c 20 31 2c 20 27   VALUES(91, 1, '
0e20: 6f 6e 65 2d 6a 27 29 3b 0a 20 20 49 4e 53 45 52  one-j');.  INSER
0e30: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0e40: 20 61 2b 31 2c 32 2c 27 74 77 6f 27 20 7c 7c 20   a+1,2,'two' || 
0e50: 73 75 62 73 74 72 28 63 2c 34 29 20 46 52 4f 4d  substr(c,4) FROM
0e60: 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   t1;.  INSERT IN
0e70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b 32  TO t1 SELECT a+2
0e80: 2c 33 2c 27 74 68 72 65 65 27 7c 7c 73 75 62 73  ,3,'three'||subs
0e90: 74 72 28 63 2c 34 29 20 46 52 4f 4d 20 74 31 20  tr(c,4) FROM t1 
0ea0: 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27 6f 6e  WHERE c GLOB 'on
0eb0: 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52 54 20 49  e-*';.  INSERT I
0ec0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0ed0: 33 2c 34 2c 27 66 6f 75 72 27 7c 7c 73 75 62 73  3,4,'four'||subs
0ee0: 74 72 28 63 2c 34 29 20 46 52 4f 4d 20 74 31 20  tr(c,4) FROM t1 
0ef0: 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27 6f 6e  WHERE c GLOB 'on
0f00: 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52 54 20 49  e-*';.  INSERT I
0f10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0f20: 34 2c 35 2c 27 66 69 76 65 27 7c 7c 73 75 62 73  4,5,'five'||subs
0f30: 74 72 28 63 2c 34 29 20 46 52 4f 4d 20 74 31 20  tr(c,4) FROM t1 
0f40: 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27 6f 6e  WHERE c GLOB 'on
0f50: 65 2d 2a 27 3b 0a 20 20 49 4e 53 45 52 54 20 49  e-*';.  INSERT I
0f60: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0f70: 35 2c 36 2c 27 73 69 78 27 7c 7c 73 75 62 73 74  5,6,'six'||subst
0f80: 72 28 63 2c 34 29 20 46 52 4f 4d 20 74 31 20 57  r(c,4) FROM t1 W
0f90: 48 45 52 45 20 63 20 47 4c 4f 42 20 27 6f 6e 65  HERE c GLOB 'one
0fa0: 2d 2a 27 3b 09 0a 20 20 43 52 45 41 54 45 20 49  -*';..  CREATE I
0fb0: 4e 44 45 58 20 74 31 62 20 4f 4e 20 74 31 28 62  NDEX t1b ON t1(b
0fc0: 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20  );.  ANALYZE;.  
0fd0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
0fe0: 20 57 48 45 52 45 20 62 3d 33 20 41 4e 44 20 61   WHERE b=3 AND a
0ff0: 20 42 45 54 57 45 45 4e 20 33 30 20 41 4e 44 20   BETWEEN 30 AND 
1000: 36 30 3b 0a 7d 20 7b 74 68 72 65 65 2d 64 20 74  60;.} {three-d t
1010: 68 72 65 65 2d 65 20 74 68 72 65 65 2d 66 7d 0a  hree-e three-f}.
1020: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
1070: 68 65 73 65 20 74 65 73 74 73 20 76 65 72 69 66  hese tests verif
1080: 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 70 6c  y that the sampl
1090: 65 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20  e selection for 
10a0: 73 74 61 74 34 20 61 70 70 65 61 72 73 20 74 6f  stat4 appears to
10b0: 20 62 65 20 0a 23 20 77 6f 72 6b 69 6e 67 20 61   be .# working a
10c0: 73 20 64 65 73 69 67 6e 65 64 2e 0a 23 0a 0a 72  s designed..#..r
10d0: 65 73 65 74 5f 64 62 0a 64 62 20 66 75 6e 63 20  eset_db.db func 
10e0: 6c 69 6e 64 65 78 20 6c 69 6e 64 65 78 0a 64 62  lindex lindex.db
10f0: 20 66 75 6e 63 20 6c 72 61 6e 67 65 20 6c 72 61   func lrange lra
1100: 6e 67 65 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  nge..do_execsql_
1110: 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 44 52 4f  test 4.0 {.  DRO
1120: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
1130: 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54  S t1;.  CREATE T
1140: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29  ABLE t1(a, b, c)
1150: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
1160: 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62 2c 20   i1 ON t1(c, b, 
1170: 61 29 3b 0a 7d 0a 0a 0a 70 72 6f 63 20 69 6e 73  a);.}...proc ins
1180: 65 72 74 5f 66 69 6c 6c 65 72 5f 72 6f 77 73 5f  ert_filler_rows_
1190: 6e 20 7b 69 53 74 61 72 74 20 61 72 67 73 7d 20  n {iStart args} 
11a0: 7b 0a 20 20 73 65 74 20 41 28 2d 6e 63 6f 70 79  {.  set A(-ncopy
11b0: 29 20 31 0a 20 20 73 65 74 20 41 28 2d 6e 76 61  ) 1.  set A(-nva
11c0: 6c 29 20 31 0a 0a 20 20 66 6f 72 65 61 63 68 20  l) 1..  foreach 
11d0: 7b 6b 20 76 7d 20 24 61 72 67 73 20 7b 0a 20 20  {k v} $args {.  
11e0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
11f0: 74 73 20 41 28 24 6b 29 5d 3d 3d 30 7d 20 7b 20  ts A($k)]==0} { 
1200: 65 72 72 6f 72 20 22 6e 6f 20 73 75 63 68 20 6f  error "no such o
1210: 70 74 69 6f 6e 3a 20 24 6b 22 20 7d 0a 20 20 20  ption: $k" }.   
1220: 20 73 65 74 20 41 28 24 6b 29 20 24 76 0a 20 20   set A($k) $v.  
1230: 7d 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  }.  if {[llength
1240: 20 24 61 72 67 73 5d 20 25 20 32 7d 20 7b 0a 20   $args] % 2} {. 
1250: 20 20 20 65 72 72 6f 72 20 22 6f 70 74 69 6f 6e     error "option
1260: 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
1270: 75 6d 65 6e 74 3a 20 5b 6c 69 6e 64 65 78 20 24  ument: [lindex $
1280: 61 72 67 73 20 65 6e 64 5d 22 0a 20 20 7d 0a 0a  args end]".  }..
1290: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
12a0: 7b 24 69 20 3c 20 24 41 28 2d 6e 76 61 6c 29 7d  {$i < $A(-nval)}
12b0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
12c0: 73 65 74 20 69 56 61 6c 20 5b 65 78 70 72 20 24  set iVal [expr $
12d0: 69 53 74 61 72 74 2b 24 69 5d 0a 20 20 20 20 66  iStart+$i].    f
12e0: 6f 72 20 7b 73 65 74 20 6a 20 30 7d 20 7b 24 6a  or {set j 0} {$j
12f0: 20 3c 20 24 41 28 2d 6e 63 6f 70 79 29 7d 20 7b   < $A(-ncopy)} {
1300: 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20 20 20 20  incr j} {.      
1310: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
1320: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1330: 24 69 56 61 6c 2c 20 24 69 56 61 6c 2c 20 24 69  $iVal, $iVal, $i
1340: 56 61 6c 29 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  Val) }.    }.  }
1350: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 31 20  .}..do_test 4.1 
1360: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45  {.  execsql { BE
1370: 47 49 4e 20 7d 0a 20 20 69 6e 73 65 72 74 5f 66  GIN }.  insert_f
1380: 69 6c 6c 65 72 5f 72 6f 77 73 5f 6e 20 20 30 20  iller_rows_n  0 
1390: 20 2d 6e 63 6f 70 79 20 31 30 20 2d 6e 76 61 6c   -ncopy 10 -nval
13a0: 20 31 39 0a 20 20 69 6e 73 65 72 74 5f 66 69 6c   19.  insert_fil
13b0: 6c 65 72 5f 72 6f 77 73 5f 6e 20 32 30 20 20 2d  ler_rows_n 20  -
13c0: 6e 63 6f 70 79 20 20 31 20 2d 6e 76 61 6c 20 31  ncopy  1 -nval 1
13d0: 30 30 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  00..  execsql {.
13e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13f0: 74 31 28 63 2c 20 62 2c 20 61 29 20 56 41 4c 55  t1(c, b, a) VALU
1400: 45 53 28 32 30 30 2c 20 31 2c 20 27 61 27 29 3b  ES(200, 1, 'a');
1410: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1420: 20 74 31 28 63 2c 20 62 2c 20 61 29 20 56 41 4c   t1(c, b, a) VAL
1430: 55 45 53 28 32 30 30 2c 20 31 2c 20 27 62 27 29  UES(200, 1, 'b')
1440: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1450: 4f 20 74 31 28 63 2c 20 62 2c 20 61 29 20 56 41  O t1(c, b, a) VA
1460: 4c 55 45 53 28 32 30 30 2c 20 31 2c 20 27 63 27  LUES(200, 1, 'c'
1470: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
1480: 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20 61 29 20  NTO t1(c, b, a) 
1490: 56 41 4c 55 45 53 28 32 30 30 2c 20 32 2c 20 27  VALUES(200, 2, '
14a0: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
14b0: 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20 61 29  INTO t1(c, b, a)
14c0: 20 56 41 4c 55 45 53 28 32 30 30 2c 20 32 2c 20   VALUES(200, 2, 
14d0: 27 66 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  'f');..    INSER
14e0: 54 20 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c 20  T INTO t1(c, b, 
14f0: 61 29 20 56 41 4c 55 45 53 28 32 30 31 2c 20 33  a) VALUES(201, 3
1500: 2c 20 27 67 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'g');.    INSE
1510: 52 54 20 49 4e 54 4f 20 74 31 28 63 2c 20 62 2c  RT INTO t1(c, b,
1520: 20 61 29 20 56 41 4c 55 45 53 28 32 30 31 2c 20   a) VALUES(201, 
1530: 34 2c 20 27 68 27 29 3b 0a 0a 20 20 20 20 41 4e  4, 'h');..    AN
1540: 41 4c 59 5a 45 3b 0a 20 20 20 20 53 45 4c 45 43  ALYZE;.    SELEC
1550: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1560: 73 71 6c 69 74 65 5f 73 74 61 74 34 3b 0a 20 20  sqlite_stat4;.  
1570: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1580: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  ) FROM t1;.  }.}
1590: 20 7b 32 34 20 32 39 37 7d 0a 0a 64 6f 5f 65 78   {24 297}..do_ex
15a0: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 32 20 7b  ecsql_test 4.2 {
15b0: 0a 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 6e  .  SELECT .    n
15c0: 65 71 2c 0a 20 20 20 20 6c 72 61 6e 67 65 28 6e  eq,.    lrange(n
15d0: 6c 74 2c 20 30 2c 20 32 29 2c 0a 20 20 20 20 6c  lt, 0, 2),.    l
15e0: 72 61 6e 67 65 28 6e 64 6c 74 2c 20 30 2c 20 32  range(ndlt, 0, 2
15f0: 29 2c 0a 20 20 20 20 6c 72 61 6e 67 65 28 74 65  ),.    lrange(te
1600: 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70 6c 65  st_decode(sample
1610: 29 2c 20 30 2c 20 32 29 0a 20 20 20 20 46 52 4f  ), 0, 2).    FRO
1620: 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 20  M sqlite_stat4. 
1630: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
1640: 4c 49 4d 49 54 20 31 36 3b 0a 7d 20 7b 0a 20 20  LIMIT 16;.} {.  
1650: 7b 31 30 20 31 30 20 31 30 20 31 7d 20 7b 30 20  {10 10 10 1} {0 
1660: 30 20 30 7d 20 7b 30 20 30 20 30 7d 20 7b 30 20  0 0} {0 0 0} {0 
1670: 30 20 30 7d 0a 20 20 7b 31 30 20 31 30 20 31 30  0 0}.  {10 10 10
1680: 20 31 7d 20 7b 31 30 20 31 30 20 31 30 7d 20 7b   1} {10 10 10} {
1690: 31 20 31 20 31 7d 20 7b 31 20 31 20 31 7d 0a 20  1 1 1} {1 1 1}. 
16a0: 20 7b 31 30 20 31 30 20 31 30 20 31 7d 20 7b 32   {10 10 10 1} {2
16b0: 30 20 32 30 20 32 30 7d 20 7b 32 20 32 20 32 7d  0 20 20} {2 2 2}
16c0: 20 7b 32 20 32 20 32 7d 0a 20 20 7b 31 30 20 31   {2 2 2}.  {10 1
16d0: 30 20 31 30 20 31 7d 20 7b 33 30 20 33 30 20 33  0 10 1} {30 30 3
16e0: 30 7d 20 7b 33 20 33 20 33 7d 20 7b 33 20 33 20  0} {3 3 3} {3 3 
16f0: 33 7d 0a 20 20 7b 31 30 20 31 30 20 31 30 20 31  3}.  {10 10 10 1
1700: 7d 20 7b 34 30 20 34 30 20 34 30 7d 20 7b 34 20  } {40 40 40} {4 
1710: 34 20 34 7d 20 7b 34 20 34 20 34 7d 0a 20 20 7b  4 4} {4 4 4}.  {
1720: 31 30 20 31 30 20 31 30 20 31 7d 20 7b 35 30 20  10 10 10 1} {50 
1730: 35 30 20 35 30 7d 20 7b 35 20 35 20 35 7d 20 7b  50 50} {5 5 5} {
1740: 35 20 35 20 35 7d 0a 20 20 7b 31 30 20 31 30 20  5 5 5}.  {10 10 
1750: 31 30 20 31 7d 20 7b 36 30 20 36 30 20 36 30 7d  10 1} {60 60 60}
1760: 20 7b 36 20 36 20 36 7d 20 7b 36 20 36 20 36 7d   {6 6 6} {6 6 6}
1770: 0a 20 20 7b 31 30 20 31 30 20 31 30 20 31 7d 20  .  {10 10 10 1} 
1780: 7b 37 30 20 37 30 20 37 30 7d 20 7b 37 20 37 20  {70 70 70} {7 7 
1790: 37 7d 20 7b 37 20 37 20 37 7d 0a 20 20 7b 31 30  7} {7 7 7}.  {10
17a0: 20 31 30 20 31 30 20 31 7d 20 7b 38 30 20 38 30   10 10 1} {80 80
17b0: 20 38 30 7d 20 7b 38 20 38 20 38 7d 20 7b 38 20   80} {8 8 8} {8 
17c0: 38 20 38 7d 0a 20 20 7b 31 30 20 31 30 20 31 30  8 8}.  {10 10 10
17d0: 20 31 7d 20 7b 39 30 20 39 30 20 39 30 7d 20 7b   1} {90 90 90} {
17e0: 39 20 39 20 39 7d 20 7b 39 20 39 20 39 7d 0a 20  9 9 9} {9 9 9}. 
17f0: 20 7b 31 30 20 31 30 20 31 30 20 31 7d 20 7b 31   {10 10 10 1} {1
1800: 30 30 20 31 30 30 20 31 30 30 7d 20 7b 31 30 20  00 100 100} {10 
1810: 31 30 20 31 30 7d 20 7b 31 30 20 31 30 20 31 30  10 10} {10 10 10
1820: 7d 0a 20 20 7b 31 30 20 31 30 20 31 30 20 31 7d  }.  {10 10 10 1}
1830: 20 7b 31 31 30 20 31 31 30 20 31 31 30 7d 20 7b   {110 110 110} {
1840: 31 31 20 31 31 20 31 31 7d 20 7b 31 31 20 31 31  11 11 11} {11 11
1850: 20 31 31 7d 0a 20 20 7b 31 30 20 31 30 20 31 30   11}.  {10 10 10
1860: 20 31 7d 20 7b 31 32 30 20 31 32 30 20 31 32 30   1} {120 120 120
1870: 7d 20 7b 31 32 20 31 32 20 31 32 7d 20 7b 31 32  } {12 12 12} {12
1880: 20 31 32 20 31 32 7d 0a 20 20 7b 31 30 20 31 30   12 12}.  {10 10
1890: 20 31 30 20 31 7d 20 7b 31 33 30 20 31 33 30 20   10 1} {130 130 
18a0: 31 33 30 7d 20 7b 31 33 20 31 33 20 31 33 7d 20  130} {13 13 13} 
18b0: 7b 31 33 20 31 33 20 31 33 7d 0a 20 20 7b 31 30  {13 13 13}.  {10
18c0: 20 31 30 20 31 30 20 31 7d 20 7b 31 34 30 20 31   10 10 1} {140 1
18d0: 34 30 20 31 34 30 7d 20 7b 31 34 20 31 34 20 31  40 140} {14 14 1
18e0: 34 7d 20 7b 31 34 20 31 34 20 31 34 7d 0a 20 20  4} {14 14 14}.  
18f0: 7b 31 30 20 31 30 20 31 30 20 31 7d 20 7b 31 35  {10 10 10 1} {15
1900: 30 20 31 35 30 20 31 35 30 7d 20 7b 31 35 20 31  0 150 150} {15 1
1910: 35 20 31 35 7d 20 7b 31 35 20 31 35 20 31 35 7d  5 15} {15 15 15}
1920: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
1930: 65 73 74 20 34 2e 33 20 7b 0a 20 20 53 45 4c 45  est 4.3 {.  SELE
1940: 43 54 20 0a 20 20 20 20 6e 65 71 2c 0a 20 20 20  CT .    neq,.   
1950: 20 6c 72 61 6e 67 65 28 6e 6c 74 2c 20 30 2c 20   lrange(nlt, 0, 
1960: 32 29 2c 0a 20 20 20 20 6c 72 61 6e 67 65 28 6e  2),.    lrange(n
1970: 64 6c 74 2c 20 30 2c 20 32 29 2c 0a 20 20 20 20  dlt, 0, 2),.    
1980: 6c 72 61 6e 67 65 28 74 65 73 74 5f 64 65 63 6f  lrange(test_deco
1990: 64 65 28 73 61 6d 70 6c 65 29 2c 20 30 2c 20 31  de(sample), 0, 1
19a0: 29 0a 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74  ).    FROM sqlit
19b0: 65 5f 73 74 61 74 34 0a 20 20 4f 52 44 45 52 20  e_stat4.  ORDER 
19c0: 42 59 20 72 6f 77 69 64 20 44 45 53 43 20 4c 49  BY rowid DESC LI
19d0: 4d 49 54 20 32 3b 0a 7d 20 7b 0a 20 20 7b 32 20  MIT 2;.} {.  {2 
19e0: 31 20 31 20 31 7d 20 7b 32 39 35 20 32 39 36 20  1 1 1} {295 296 
19f0: 32 39 36 7d 20 7b 31 32 30 20 31 32 32 20 31 32  296} {120 122 12
1a00: 35 7d 20 7b 32 30 31 20 34 7d 20 0a 20 20 7b 35  5} {201 4} .  {5
1a10: 20 33 20 31 20 31 7d 20 7b 32 39 30 20 32 39 30   3 1 1} {290 290
1a20: 20 32 39 30 7d 20 7b 31 31 39 20 31 31 39 20 31   290} {119 119 1
1a30: 31 39 7d 20 7b 32 30 30 20 31 7d 0a 7d 0a 0a 64  19} {200 1}.}..d
1a40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1a50: 2e 34 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  .4 { SELECT coun
1a60: 74 28 44 49 53 54 49 4e 43 54 20 63 29 20 46 52  t(DISTINCT c) FR
1a70: 4f 4d 20 74 31 20 57 48 45 52 45 20 63 3c 32 30  OM t1 WHERE c<20
1a80: 31 20 7d 20 31 32 30 0a 64 6f 5f 65 78 65 63 73  1 } 120.do_execs
1a90: 71 6c 5f 74 65 73 74 20 34 2e 35 20 7b 20 53 45  ql_test 4.5 { SE
1aa0: 4c 45 43 54 20 63 6f 75 6e 74 28 44 49 53 54 49  LECT count(DISTI
1ab0: 4e 43 54 20 63 29 20 46 52 4f 4d 20 74 31 20 57  NCT c) FROM t1 W
1ac0: 48 45 52 45 20 63 3c 32 30 30 20 7d 20 31 31 39  HERE c<200 } 119
1ad0: 0a 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 74  ..# Check that t
1ae0: 68 65 20 70 65 72 69 6f 69 64 69 63 20 73 61 6d  he perioidic sam
1af0: 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  ples are present
1b00: 2e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1b10: 74 20 34 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  t 4.6 {.  SELECT
1b20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
1b30: 71 6c 69 74 65 5f 73 74 61 74 34 0a 20 20 57 48  qlite_stat4.  WH
1b40: 45 52 45 20 6c 69 6e 64 65 78 28 74 65 73 74 5f  ERE lindex(test_
1b50: 64 65 63 6f 64 65 28 73 61 6d 70 6c 65 29 2c 20  decode(sample), 
1b60: 33 29 20 49 4e 20 0a 20 20 20 20 28 27 33 34 27  3) IN .    ('34'
1b70: 2c 20 27 36 38 27 2c 20 27 31 30 32 27 2c 20 27  , '68', '102', '
1b80: 31 33 36 27 2c 20 27 31 37 30 27 2c 20 27 32 30  136', '170', '20
1b90: 34 27 2c 20 27 32 33 38 27 2c 20 27 32 37 32 27  4', '238', '272'
1ba0: 29 0a 7d 20 7b 38 7d 0a 0a 72 65 73 65 74 5f 64  ).} {8}..reset_d
1bb0: 62 0a 64 6f 5f 74 65 73 74 20 34 2e 37 20 7b 0a  b.do_test 4.7 {.
1bc0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
1bd0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
1be0: 54 45 20 54 41 42 4c 45 20 74 31 28 6f 2c 74 20  TE TABLE t1(o,t 
1bf0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1c00: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
1c10: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1c20: 6f 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  o);.  }.  for {s
1c30: 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 30 30 30  et i 0} {$i<1000
1c40: 30 7d 20 7b 69 6e 63 72 20 69 20 5b 65 78 70 72  0} {incr i [expr
1c50: 20 28 28 24 69 3c 31 30 30 30 29 3f 31 3a 31 30   (($i<1000)?1:10
1c60: 29 5d 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71  )]} {.    execsq
1c70: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1c80: 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 24  t1 VALUES('x', $
1c90: 69 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  i) }.  }.  execs
1ca0: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
1cb0: 0a 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20  .    ANALYZE;.  
1cc0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1cd0: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  ) FROM sqlite_st
1ce0: 61 74 34 3b 0a 20 20 7d 0a 7d 20 7b 38 7d 0a 64  at4;.  }.} {8}.d
1cf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1d00: 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65  .8 {.  SELECT te
1d10: 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70 6c 65  st_decode(sample
1d20: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  ) FROM sqlite_st
1d30: 61 74 34 3b 0a 7d 20 7b 0a 20 20 7b 78 20 32 31  at4;.} {.  {x 21
1d40: 31 7d 20 7b 78 20 34 32 33 7d 20 7b 78 20 36 33  1} {x 423} {x 63
1d50: 35 7d 20 7b 78 20 38 34 37 7d 20 0a 20 20 7b 78  5} {x 847} .  {x
1d60: 20 31 35 39 30 7d 20 7b 78 20 33 37 31 30 7d 20   1590} {x 3710} 
1d70: 7b 78 20 35 38 33 30 7d 20 7b 78 20 37 39 35 30  {x 5830} {x 7950
1d80: 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}...#---------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dd0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1de0: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 61 20 63   would cause a c
1df0: 72 61 73 68 20 61 74 20 6f 6e 65 20 70 6f 69 6e  rash at one poin
1e00: 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f  t..#.reset_db.do
1e10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
1e20: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 65 6e 63  1 {.  PRAGMA enc
1e30: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 27  oding = 'utf-16'
1e40: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1e50: 20 74 30 28 76 29 3b 0a 20 20 41 4e 41 4c 59 5a   t0(v);.  ANALYZ
1e60: 45 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  E;.}..#---------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 0a 23 20 54 68 69 73 20 77 61 73 20 61 6c 73 6f  .# This was also
1ec0: 20 63 72 61 73 68 69 6e 67 20 28 63 6f 72 72 75   crashing (corru
1ed0: 70 74 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  pt sqlite_stat4 
1ee0: 74 61 62 6c 65 29 2e 0a 23 0a 72 65 73 65 74 5f  table)..#.reset_
1ef0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
1f00: 73 74 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54  st 6.1 {.  CREAT
1f10: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
1f20: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
1f30: 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
1f40: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
1f50: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 49 4e 53 45  ON t1(b);.  INSE
1f60: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1f70: 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  S(1, 1);.  INSER
1f80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1f90: 28 32 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  (2, 2);.  INSERT
1fa0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1fb0: 33 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  3, 3);.  INSERT 
1fc0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
1fd0: 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 4);.  INSERT I
1fe0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
1ff0: 20 35 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a   5);.  ANALYZE;.
2000: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
2010: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
2020: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
2030: 45 20 78 31 20 41 53 0a 20 20 20 20 53 45 4c 45  E x1 AS.    SELE
2040: 43 54 20 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e  CT tbl,idx,neq,n
2050: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46  lt,ndlt,sample F
2060: 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ROM sqlite_stat4
2070: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 28 72  .    ORDER BY (r
2080: 6f 77 69 64 25 35 29 2c 20 72 6f 77 69 64 3b 0a  owid%5), rowid;.
2090: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71    DELETE FROM sq
20a0: 6c 69 74 65 5f 73 74 61 74 34 3b 0a 20 20 49 4e  lite_stat4;.  IN
20b0: 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
20c0: 5f 73 74 61 74 34 20 53 45 4c 45 43 54 20 2a 20  _stat4 SELECT * 
20d0: 46 52 4f 4d 20 78 31 3b 0a 20 20 50 52 41 47 4d  FROM x1;.  PRAGM
20e0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
20f0: 61 20 3d 20 30 3b 0a 20 20 41 4e 41 4c 59 5a 45  a = 0;.  ANALYZE
2100: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
2110: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2120: 74 20 36 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 6.2 {.  SELECT
2130: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2140: 20 61 20 3d 20 27 61 62 63 27 3b 0a 7d 0a 0a 23   a = 'abc';.}..#
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
21a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
21b0: 65 78 70 65 72 69 6d 65 6e 74 20 77 69 74 68 20  experiment with 
21c0: 61 64 64 69 6e 67 20 63 6f 72 72 75 70 74 65 64  adding corrupted
21d0: 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 0a   records to the.
21e0: 23 20 27 73 61 6d 70 6c 65 27 20 63 6f 6c 75 6d  # 'sample' colum
21f0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
2200: 73 74 61 74 34 20 74 61 62 6c 65 2e 0a 23 0a 72  stat4 table..#.r
2210: 65 73 65 74 5f 64 62 0a 73 71 6c 69 74 65 33 5f  eset_db.sqlite3_
2220: 64 62 5f 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73  db_config_lookas
2230: 69 64 65 20 64 62 20 30 20 30 20 30 0a 0a 64 6f  ide db 0 0 0..do
2240: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
2250: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
2260: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43  LE t1(a, b);.  C
2270: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
2280: 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  N t1(a, b);.  IN
2290: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
22a0: 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53  UES(1, 1);.  INS
22b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
22c0: 45 53 28 32 2c 20 32 29 3b 0a 20 20 49 4e 53 45  ES(2, 2);.  INSE
22d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
22e0: 53 28 33 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52  S(3, 3);.  INSER
22f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2300: 28 34 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54  (4, 4);.  INSERT
2310: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2320: 35 2c 20 35 29 3b 0a 20 20 41 4e 41 4c 59 5a 45  5, 5);.  ANALYZE
2330: 3b 0a 20 20 55 50 44 41 54 45 20 73 71 6c 69 74  ;.  UPDATE sqlit
2340: 65 5f 73 74 61 74 34 20 53 45 54 20 73 61 6d 70  e_stat4 SET samp
2350: 6c 65 20 3d 20 58 27 27 20 57 48 45 52 45 20 72  le = X'' WHERE r
2360: 6f 77 69 64 20 3d 20 31 3b 0a 20 20 41 4e 41 4c  owid = 1;.  ANAL
2370: 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
2380: 72 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  r;.}..do_execsql
2390: 5f 74 65 73 74 20 37 2e 32 20 7b 0a 20 20 55 50  _test 7.2 {.  UP
23a0: 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74  DATE sqlite_stat
23b0: 34 20 53 45 54 20 73 61 6d 70 6c 65 20 3d 20 58  4 SET sample = X
23c0: 27 46 46 46 46 27 3b 0a 20 20 41 4e 41 4c 59 5a  'FFFF';.  ANALYZ
23d0: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
23e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
23f0: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31 3b   t1 WHERE a = 1;
2400: 0a 7d 20 7b 31 20 31 7d 0a 0a 64 6f 5f 65 78 65  .} {1 1}..do_exe
2410: 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 20 7b 0a  csql_test 7.3 {.
2420: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44    ANALYZE;.  UPD
2430: 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ATE sqlite_stat4
2440: 20 53 45 54 20 6e 65 71 20 3d 20 27 30 20 30 20   SET neq = '0 0 
2450: 30 27 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71  0';.  ANALYZE sq
2460: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 53  lite_master;.  S
2470: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2480: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 7d 20 7b  WHERE a = 1;.} {
2490: 31 20 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  1 1}..do_execsql
24a0: 5f 74 65 73 74 20 37 2e 34 20 7b 0a 20 20 41 4e  _test 7.4 {.  AN
24b0: 41 4c 59 5a 45 3b 0a 20 20 55 50 44 41 54 45 20  ALYZE;.  UPDATE 
24c0: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 53 45 54  sqlite_stat4 SET
24d0: 20 6e 64 6c 74 20 3d 20 27 30 20 30 20 30 27 3b   ndlt = '0 0 0';
24e0: 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  .  ANALYZE sqlit
24f0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45  e_master;.  SELE
2500: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2510: 52 45 20 61 20 3d 20 33 3b 0a 7d 20 7b 33 20 33  RE a = 3;.} {3 3
2520: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
2530: 73 74 20 37 2e 35 20 7b 0a 20 20 41 4e 41 4c 59  st 7.5 {.  ANALY
2540: 5a 45 3b 0a 20 20 55 50 44 41 54 45 20 73 71 6c  ZE;.  UPDATE sql
2550: 69 74 65 5f 73 74 61 74 34 20 53 45 54 20 6e 6c  ite_stat4 SET nl
2560: 74 20 3d 20 27 30 20 30 20 30 27 3b 0a 20 20 41  t = '0 0 0';.  A
2570: 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2580: 73 74 65 72 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ster;.  SELECT *
2590: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
25a0: 20 3d 20 35 3b 0a 7d 20 7b 35 20 35 7d 0a 0a 23   = 5;.} {5 5}..#
25b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65  ---------.#.rese
2600: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
2610: 74 65 73 74 20 38 2e 31 20 7b 0a 20 20 43 52 45  test 8.1 {.  CRE
2620: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 54  ATE TABLE t1(x T
2630: 45 58 54 29 3b 0a 20 20 43 52 45 41 54 45 20 49  EXT);.  CREATE I
2640: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 29  NDEX i1 ON t1(x)
2650: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2660: 74 31 20 56 41 4c 55 45 53 28 27 31 27 29 3b 0a  t1 VALUES('1');.
2670: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2680: 20 56 41 4c 55 45 53 28 27 32 27 29 3b 0a 20 20   VALUES('2');.  
2690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
26a0: 41 4c 55 45 53 28 27 33 27 29 3b 0a 20 20 49 4e  ALUES('3');.  IN
26b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
26c0: 55 45 53 28 27 34 27 29 3b 0a 20 20 41 4e 41 4c  UES('4');.  ANAL
26d0: 59 5a 45 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71  YZE;.}.do_execsq
26e0: 6c 5f 74 65 73 74 20 38 2e 32 20 7b 0a 20 20 53  l_test 8.2 {.  S
26f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2700: 57 48 45 52 45 20 78 20 3d 20 33 3b 0a 7d 20 7b  WHERE x = 3;.} {
2710: 33 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3}..#-----------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2760: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2770: 62 75 67 20 66 69 78 65 64 20 62 79 20 5b 39 31  bug fixed by [91
2780: 37 33 33 62 63 34 38 35 5d 20 72 65 61 6c 6c 79  733bc485] really
2790: 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 72 65 73   is fixed..#.res
27a0: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
27b0: 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 43 52  _test 9.1 {.  CR
27c0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
27d0: 20 62 2c 20 63 2c 20 64 2c 20 65 29 3b 0a 20 20   b, c, d, e);.  
27e0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
27f0: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64  ON t1(a, b, c, d
2800: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
2810: 58 20 69 32 20 4f 4e 20 74 31 28 65 29 3b 0a 7d  X i2 ON t1(e);.}
2820: 0a 64 6f 5f 74 65 73 74 20 39 2e 32 20 7b 0a 20  .do_test 9.2 {. 
2830: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a   execsql BEGIN;.
2840: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
2850: 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72  {$i < 100} {incr
2860: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
2870: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
2880: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79  1 VALUES('x', 'y
2890: 27 2c 20 27 7a 27 2c 20 24 69 2c 20 5b 65 78 70  ', 'z', $i, [exp
28a0: 72 20 24 69 2f 32 5d 29 22 0a 20 20 7d 0a 20 20  r $i/2])".  }.  
28b0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
28c0: 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72 20 69 7d  i < 20} {incr i}
28d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
28e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
28f0: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 2c 20  ALUES('x', 'y', 
2900: 27 7a 27 2c 20 31 30 31 2c 20 24 69 29 22 0a 20  'z', 101, $i)". 
2910: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
2920: 31 30 32 7d 20 7b 24 69 20 3c 20 32 30 30 7d 20  102} {$i < 200} 
2930: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
2940: 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49  xecsql "INSERT I
2950: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78  NTO t1 VALUES('x
2960: 27 2c 20 27 79 27 2c 20 27 7a 27 2c 20 24 69 2c  ', 'y', 'z', $i,
2970: 20 5b 65 78 70 72 20 24 69 2f 32 5d 29 22 0a 20   [expr $i/2])". 
2980: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   }.  execsql COM
2990: 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20 41 4e  MIT.  execsql AN
29a0: 41 4c 59 5a 45 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65  ALYZE.} {}..do_e
29b0: 71 70 5f 74 65 73 74 20 39 2e 33 2e 31 20 7b 0a  qp_test 9.3.1 {.
29c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
29d0: 74 31 20 57 48 45 52 45 20 61 3d 27 78 27 20 41  t1 WHERE a='x' A
29e0: 4e 44 20 62 3d 27 79 27 20 41 4e 44 20 63 3d 27  ND b='y' AND c='
29f0: 7a 27 20 41 4e 44 20 64 3d 31 30 31 20 41 4e 44  z' AND d=101 AND
2a00: 20 65 3d 35 3b 0a 7d 20 7b 2f 74 31 20 55 53 49   e=5;.} {/t1 USI
2a10: 4e 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a 64 6f  NG INDEX i2/}.do
2a20: 5f 65 71 70 5f 74 65 73 74 20 39 2e 33 2e 32 20  _eqp_test 9.3.2 
2a30: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2a40: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 27 78 27  M t1 WHERE a='x'
2a50: 20 41 4e 44 20 62 3d 27 79 27 20 41 4e 44 20 63   AND b='y' AND c
2a60: 3d 27 7a 27 20 41 4e 44 20 64 3d 39 39 20 41 4e  ='z' AND d=99 AN
2a70: 44 20 65 3d 35 3b 0a 7d 20 7b 2f 74 31 20 55 53  D e=5;.} {/t1 US
2a80: 49 4e 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a 0a  ING INDEX i1/}..
2a90: 73 65 74 20 76 61 6c 75 65 5f 64 20 5b 65 78 70  set value_d [exp
2aa0: 72 20 31 30 31 5d 0a 64 6f 5f 65 71 70 5f 74 65  r 101].do_eqp_te
2ab0: 73 74 20 39 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  st 9.4.1 {.  SEL
2ac0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2ad0: 45 52 45 20 61 3d 27 78 27 20 41 4e 44 20 62 3d  ERE a='x' AND b=
2ae0: 27 79 27 20 41 4e 44 20 63 3d 27 7a 27 20 41 4e  'y' AND c='z' AN
2af0: 44 20 64 3d 24 76 61 6c 75 65 5f 64 20 41 4e 44  D d=$value_d AND
2b00: 20 65 3d 35 0a 7d 20 7b 2f 74 31 20 55 53 49 4e   e=5.} {/t1 USIN
2b10: 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a 73 65 74  G INDEX i2/}.set
2b20: 20 76 61 6c 75 65 5f 64 20 5b 65 78 70 72 20 39   value_d [expr 9
2b30: 39 5d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 39  9].do_eqp_test 9
2b40: 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.2 {.  SELECT 
2b50: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
2b60: 61 3d 27 78 27 20 41 4e 44 20 62 3d 27 79 27 20  a='x' AND b='y' 
2b70: 41 4e 44 20 63 3d 27 7a 27 20 41 4e 44 20 64 3d  AND c='z' AND d=
2b80: 24 76 61 6c 75 65 5f 64 20 41 4e 44 20 65 3d 35  $value_d AND e=5
2b90: 0a 7d 20 7b 2f 74 31 20 55 53 49 4e 47 20 49 4e  .} {/t1 USING IN
2ba0: 44 45 58 20 69 31 2f 7d 0a 0a 23 2d 2d 2d 2d 2d  DEX i1/}..#-----
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
2c00: 74 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 74 61  t the planner ta
2c10: 6b 65 73 20 73 74 61 74 34 20 64 61 74 61 20 69  kes stat4 data i
2c20: 6e 74 6f 20 61 63 63 6f 75 6e 74 20 77 68 65 6e  nto account when
2c30: 20 63 6f 6e 73 69 64 65 72 69 6e 67 0a 23 20 22   considering.# "
2c40: 49 53 20 4e 55 4c 4c 22 20 61 6e 64 20 22 49 53  IS NULL" and "IS
2c50: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74   NOT NULL" const
2c60: 72 61 69 6e 74 73 2e 0a 23 0a 64 6f 5f 65 78 65  raints..#.do_exe
2c70: 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 31 2e 31  csql_test 10.1.1
2c80: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
2c90: 49 46 20 45 58 49 53 54 53 20 74 33 3b 0a 20 20  IF EXISTS t3;.  
2ca0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
2cb0: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
2cc0: 49 4e 44 45 58 20 74 33 61 20 4f 4e 20 74 33 28  INDEX t3a ON t3(
2cd0: 61 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  a);.  CREATE IND
2ce0: 45 58 20 74 33 62 20 4f 4e 20 74 33 28 62 29 3b  EX t3b ON t3(b);
2cf0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 30 2e 31 2e  .}.do_test 10.1.
2d00: 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  2 {.  for {set i
2d10: 20 31 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b   1} {$i < 100} {
2d20: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 69 66  incr i} {.    if
2d30: 20 7b 24 69 3e 39 30 7d 20 7b 20 73 65 74 20 61   {$i>90} { set a
2d40: 20 24 69 20 7d 20 65 6c 73 65 20 7b 20 73 65 74   $i } else { set
2d50: 20 61 20 4e 55 4c 4c 20 7d 0a 20 20 20 20 73 65   a NULL }.    se
2d60: 74 20 62 20 5b 65 78 70 72 20 24 69 20 25 20 35  t b [expr $i % 5
2d70: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 49  ].    execsql "I
2d80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2d90: 4c 55 45 53 28 24 61 2c 20 24 62 29 22 0a 20 20  LUES($a, $b)".  
2da0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c  }.  execsql ANAL
2db0: 59 5a 45 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f  YZE.} {}.do_eqp_
2dc0: 74 65 73 74 20 31 30 2e 31 2e 33 20 7b 0a 20 20  test 10.1.3 {.  
2dd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
2de0: 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c   WHERE a IS NULL
2df0: 20 41 4e 44 20 62 20 3d 20 32 0a 7d 20 7b 2f 74   AND b = 2.} {/t
2e00: 33 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 33  3 USING INDEX t3
2e10: 62 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  b/}.do_eqp_test 
2e20: 31 30 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  10.1.4 {.  SELEC
2e30: 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T * FROM t3 WHER
2e40: 45 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  E a IS NOT NULL 
2e50: 41 4e 44 20 62 20 3d 20 32 0a 7d 20 7b 2f 74 33  AND b = 2.} {/t3
2e60: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 33 61   USING INDEX t3a
2e70: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
2e80: 65 73 74 20 31 30 2e 32 2e 31 20 7b 0a 20 20 44  est 10.2.1 {.  D
2e90: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2ea0: 53 54 53 20 74 33 3b 0a 20 20 43 52 45 41 54 45  STS t3;.  CREATE
2eb0: 20 54 41 42 4c 45 20 74 33 28 78 2c 20 61 2c 20   TABLE t3(x, a, 
2ec0: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  b);.  CREATE IND
2ed0: 45 58 20 74 33 61 20 4f 4e 20 74 33 28 78 2c 20  EX t3a ON t3(x, 
2ee0: 61 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  a);.  CREATE IND
2ef0: 45 58 20 74 33 62 20 4f 4e 20 74 33 28 78 2c 20  EX t3b ON t3(x, 
2f00: 62 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 30  b);.}.do_test 10
2f10: 2e 32 2e 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65  .2.2 {.  for {se
2f20: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 31 30 30  t i 1} {$i < 100
2f30: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
2f40: 20 69 66 20 7b 24 69 3e 39 30 7d 20 7b 20 73 65   if {$i>90} { se
2f50: 74 20 61 20 24 69 20 7d 20 65 6c 73 65 20 7b 20  t a $i } else { 
2f60: 73 65 74 20 61 20 4e 55 4c 4c 20 7d 0a 20 20 20  set a NULL }.   
2f70: 20 73 65 74 20 62 20 5b 65 78 70 72 20 24 69 20   set b [expr $i 
2f80: 25 20 35 5d 0a 20 20 20 20 65 78 65 63 73 71 6c  % 5].    execsql
2f90: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33   "INSERT INTO t3
2fa0: 20 56 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 24   VALUES('xyz', $
2fb0: 61 2c 20 24 62 29 22 0a 20 20 7d 0a 20 20 65 78  a, $b)".  }.  ex
2fc0: 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 7d 20  ecsql ANALYZE.} 
2fd0: 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  {}.do_eqp_test 1
2fe0: 30 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  0.2.3 {.  SELECT
2ff0: 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   * FROM t3 WHERE
3000: 20 78 20 3d 20 27 78 79 7a 27 20 41 4e 44 20 61   x = 'xyz' AND a
3010: 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 62 20 3d   IS NULL AND b =
3020: 20 32 0a 7d 20 7b 2f 74 33 20 55 53 49 4e 47 20   2.} {/t3 USING 
3030: 49 4e 44 45 58 20 74 33 62 2f 7d 0a 64 6f 5f 65  INDEX t3b/}.do_e
3040: 71 70 5f 74 65 73 74 20 31 30 2e 32 2e 34 20 7b  qp_test 10.2.4 {
3050: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3060: 20 74 33 20 57 48 45 52 45 20 78 20 3d 20 27 78   t3 WHERE x = 'x
3070: 79 7a 27 20 41 4e 44 20 61 20 49 53 20 4e 4f 54  yz' AND a IS NOT
3080: 20 4e 55 4c 4c 20 41 4e 44 20 62 20 3d 20 32 0a   NULL AND b = 2.
3090: 7d 20 7b 2f 74 33 20 55 53 49 4e 47 20 49 4e 44  } {/t3 USING IND
30a0: 45 58 20 74 33 61 2f 7d 0a 0a 23 2d 2d 2d 2d 2d  EX t3a/}..#-----
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
3100: 74 20 73 74 61 74 34 20 64 61 74 61 20 69 73 20  t stat4 data is 
3110: 75 73 65 64 20 63 6f 72 72 65 63 74 6c 79 20 77  used correctly w
3120: 69 74 68 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20  ith non-default 
3130: 63 6f 6c 6c 61 74 69 6f 6e 0a 23 20 73 65 71 75  collation.# sequ
3140: 65 6e 63 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  ences..#.foreach
3150: 20 7b 74 6e 20 73 63 68 65 6d 61 7d 20 7b 0a 20   {tn schema} {. 
3160: 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   1 {.    CREATE 
3170: 54 41 42 4c 45 20 74 34 28 61 20 43 4f 4c 4c 41  TABLE t4(a COLLA
3180: 54 45 20 6e 6f 63 61 73 65 2c 20 62 29 3b 0a 20  TE nocase, b);. 
3190: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
31a0: 74 34 61 20 4f 4e 20 74 34 28 61 29 3b 0a 20 20  t4a ON t4(a);.  
31b0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
31c0: 34 62 20 4f 4e 20 74 34 28 62 29 3b 0a 20 20 7d  4b ON t4(b);.  }
31d0: 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54  .  2 {.    CREAT
31e0: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
31f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
3200: 45 58 20 74 34 61 20 4f 4e 20 74 34 28 61 20 43  EX t4a ON t4(a C
3210: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
3220: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
3230: 20 74 34 62 20 4f 4e 20 74 34 28 62 29 3b 0a 20   t4b ON t4(b);. 
3240: 20 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c   }.} {.  drop_al
3250: 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65  l_tables.  do_te
3260: 73 74 20 31 31 2e 24 74 6e 2e 31 20 7b 20 65 78  st 11.$tn.1 { ex
3270: 65 63 73 71 6c 20 24 73 63 68 65 6d 61 20 7d 20  ecsql $schema } 
3280: 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 31  {}..  do_test 11
3290: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 6f 72  .$tn.2 {.    for
32a0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
32b0: 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   100} {incr i} {
32c0: 0a 20 20 20 20 20 20 69 66 20 7b 20 28 24 69 20  .      if { ($i 
32d0: 25 20 31 30 29 3d 3d 30 20 7d 20 7b 20 73 65 74  % 10)==0 } { set
32e0: 20 61 20 41 42 43 20 7d 20 65 6c 73 65 20 7b 20   a ABC } else { 
32f0: 73 65 74 20 61 20 44 45 46 20 7d 0a 20 20 20 20  set a DEF }.    
3300: 20 20 73 65 74 20 62 20 5b 65 78 70 72 20 24 69    set b [expr $i
3310: 20 25 20 35 5d 0a 20 20 20 20 20 20 20 20 65 78   % 5].        ex
3320: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
3330: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 24 61  NTO t4 VALUES($a
3340: 2c 20 24 62 29 20 7d 0a 20 20 20 20 7d 0a 20 20  , $b) }.    }.  
3350: 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a    execsql ANALYZ
3360: 45 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 65  E.  } {}..  do_e
3370: 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e 33  qp_test 11.$tn.3
3380: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
3390: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20  FROM t4 WHERE a 
33a0: 3d 20 27 64 65 66 27 20 41 4e 44 20 62 20 3d 20  = 'def' AND b = 
33b0: 33 3b 0a 20 20 7d 20 7b 2f 74 34 20 55 53 49 4e  3;.  } {/t4 USIN
33c0: 47 20 49 4e 44 45 58 20 74 34 62 2f 7d 0a 0a 20  G INDEX t4b/}.. 
33d0: 20 69 66 20 7b 24 74 6e 3d 3d 31 7d 20 7b 0a 20   if {$tn==1} {. 
33e0: 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45     set sql "SELE
33f0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57 48 45  CT * FROM t4 WHE
3400: 52 45 20 61 20 3d 20 27 61 62 63 27 20 41 4e 44  RE a = 'abc' AND
3410: 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64 6f 5f   b = 3;".    do_
3420: 65 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e  eqp_test 11.$tn.
3430: 34 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49 4e  4 $sql {/t4 USIN
3440: 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 20 20  G INDEX t4a/}.  
3450: 7d 20 65 6c 73 65 20 7b 0a 0a 20 20 20 20 73 65  } else {..    se
3460: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20  t sql "SELECT * 
3470: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20  FROM t4 WHERE a 
3480: 3d 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45 20  = 'abc' COLLATE 
3490: 6e 6f 63 61 73 65 20 41 4e 44 20 62 20 3d 20 33  nocase AND b = 3
34a0: 3b 22 0a 20 20 20 20 64 6f 5f 65 71 70 5f 74 65  ;".    do_eqp_te
34b0: 73 74 20 31 31 2e 24 74 6e 2e 35 20 24 73 71 6c  st 11.$tn.5 $sql
34c0: 20 7b 2f 74 34 20 55 53 49 4e 47 20 49 4e 44 45   {/t4 USING INDE
34d0: 58 20 74 34 61 2f 7d 0a 0a 20 20 20 20 73 65 74  X t4a/}..    set
34e0: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46   sql "SELECT * F
34f0: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20 43  ROM t4 WHERE a C
3500: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 3d 20  OLLATE nocase = 
3510: 27 61 62 63 27 20 41 4e 44 20 62 20 3d 20 33 3b  'abc' AND b = 3;
3520: 22 0a 20 20 20 20 64 6f 5f 65 71 70 5f 74 65 73  ".    do_eqp_tes
3530: 74 20 31 31 2e 24 74 6e 2e 36 20 24 73 71 6c 20  t 11.$tn.6 $sql 
3540: 7b 2f 74 34 20 55 53 49 4e 47 20 49 4e 44 45 58  {/t4 USING INDEX
3550: 20 74 34 61 2f 7d 0a 20 20 7d 0a 7d 0a 0a 66 6f   t4a/}.  }.}..fo
3560: 72 65 61 63 68 20 7b 74 6e 20 73 63 68 65 6d 61  reach {tn schema
3570: 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20 43 52  } {.  1 {.    CR
3580: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c  EATE TABLE t4(x,
3590: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
35a0: 65 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  e, b);.    CREAT
35b0: 45 20 49 4e 44 45 58 20 74 34 61 20 4f 4e 20 74  E INDEX t4a ON t
35c0: 34 28 78 2c 20 61 29 3b 0a 20 20 20 20 43 52 45  4(x, a);.    CRE
35d0: 41 54 45 20 49 4e 44 45 58 20 74 34 62 20 4f 4e  ATE INDEX t4b ON
35e0: 20 74 34 28 78 2c 20 62 29 3b 0a 20 20 7d 0a 20   t4(x, b);.  }. 
35f0: 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   2 {.    CREATE 
3600: 54 41 42 4c 45 20 74 34 28 78 2c 20 61 2c 20 62  TABLE t4(x, a, b
3610: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
3620: 44 45 58 20 74 34 61 20 4f 4e 20 74 34 28 78 2c  DEX t4a ON t4(x,
3630: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
3640: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  e);.    CREATE I
3650: 4e 44 45 58 20 74 34 62 20 4f 4e 20 74 34 28 78  NDEX t4b ON t4(x
3660: 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20  , b);.  }.} {.  
3670: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
3680: 20 20 64 6f 5f 74 65 73 74 20 31 32 2e 24 74 6e    do_test 12.$tn
3690: 2e 31 20 7b 20 65 78 65 63 73 71 6c 20 24 73 63  .1 { execsql $sc
36a0: 68 65 6d 61 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f  hema } {}..  do_
36b0: 74 65 73 74 20 31 32 2e 24 74 6e 2e 32 20 7b 0a  test 12.$tn.2 {.
36c0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
36d0: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
36e0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 69 66  cr i} {.      if
36f0: 20 7b 20 28 24 69 20 25 20 31 30 29 3d 3d 30 20   { ($i % 10)==0 
3700: 7d 20 7b 20 73 65 74 20 61 20 41 42 43 20 7d 20  } { set a ABC } 
3710: 65 6c 73 65 20 7b 20 73 65 74 20 61 20 44 45 46  else { set a DEF
3720: 20 7d 0a 20 20 20 20 20 20 73 65 74 20 62 20 5b   }.      set b [
3730: 65 78 70 72 20 24 69 20 25 20 35 5d 0a 20 20 20  expr $i % 5].   
3740: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49       execsql { I
3750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
3760: 4c 55 45 53 28 58 27 61 62 63 64 65 66 27 2c 20  LUES(X'abcdef', 
3770: 24 61 2c 20 24 62 29 20 7d 0a 20 20 20 20 7d 0a  $a, $b) }.    }.
3780: 20 20 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c      execsql ANAL
3790: 59 5a 45 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f  YZE.  } {}..  do
37a0: 5f 65 71 70 5f 74 65 73 74 20 31 32 2e 24 74 6e  _eqp_test 12.$tn
37b0: 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .3 {.    SELECT 
37c0: 2a 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  * FROM t4 WHERE 
37d0: 78 3d 58 27 61 62 63 64 65 66 27 20 41 4e 44 20  x=X'abcdef' AND 
37e0: 61 20 3d 20 27 64 65 66 27 20 41 4e 44 20 62 20  a = 'def' AND b 
37f0: 3d 20 33 3b 0a 20 20 7d 20 7b 2f 74 34 20 55 53  = 3;.  } {/t4 US
3800: 49 4e 47 20 49 4e 44 45 58 20 74 34 62 2f 7d 0a  ING INDEX t4b/}.
3810: 0a 20 20 69 66 20 7b 24 74 6e 3d 3d 31 7d 20 7b  .  if {$tn==1} {
3820: 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45  .    set sql "SE
3830: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
3840: 48 45 52 45 20 78 3d 58 27 61 62 63 64 65 66 27  HERE x=X'abcdef'
3850: 20 41 4e 44 20 61 20 3d 20 27 61 62 63 27 20 41   AND a = 'abc' A
3860: 4e 44 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64  ND b = 3;".    d
3870: 6f 5f 65 71 70 5f 74 65 73 74 20 31 32 2e 24 74  o_eqp_test 12.$t
3880: 6e 2e 34 20 24 73 71 6c 20 7b 2f 74 34 20 55 53  n.4 $sql {/t4 US
3890: 49 4e 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a  ING INDEX t4a/}.
38a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
38b0: 65 74 20 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  et sql {.      S
38c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20  ELECT * FROM t4 
38d0: 57 48 45 52 45 20 78 3d 58 27 61 62 63 64 65 66  WHERE x=X'abcdef
38e0: 27 20 41 4e 44 20 61 20 3d 20 27 61 62 63 27 20  ' AND a = 'abc' 
38f0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 41  COLLATE nocase A
3900: 4e 44 20 62 20 3d 20 33 0a 20 20 20 20 7d 0a 20  ND b = 3.    }. 
3910: 20 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31     do_eqp_test 1
3920: 32 2e 24 74 6e 2e 35 20 24 73 71 6c 20 7b 2f 74  2.$tn.5 $sql {/t
3930: 34 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 34  4 USING INDEX t4
3940: 61 2f 7d 0a 20 20 20 20 73 65 74 20 73 71 6c 20  a/}.    set sql 
3950: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3960: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78   FROM t4 WHERE x
3970: 3d 58 27 61 62 63 64 65 66 27 20 41 4e 44 20 61  =X'abcdef' AND a
3980: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3990: 3d 20 27 61 62 63 27 20 41 4e 44 20 62 20 3d 20  = 'abc' AND b = 
39a0: 33 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f 65  3.    }.    do_e
39b0: 71 70 5f 74 65 73 74 20 31 32 2e 24 74 6e 2e 36  qp_test 12.$tn.6
39c0: 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49 4e 47   $sql {/t4 USING
39d0: 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 20 20 7d   INDEX t4a/}.  }
39e0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3a30: 20 43 68 65 63 6b 20 74 68 61 74 20 61 66 66 69   Check that affi
3a40: 6e 69 74 69 65 73 20 61 72 65 20 74 61 6b 65 6e  nities are taken
3a50: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 77 68   into account wh
3a60: 65 6e 20 75 73 69 6e 67 20 73 74 61 74 34 20 64  en using stat4 d
3a70: 61 74 61 20 74 6f 0a 23 20 65 73 74 69 6d 61 74  ata to.# estimat
3a80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
3a90: 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
3aa0: 61 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69  a rowid constrai
3ab0: 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  nt..#.drop_all_t
3ac0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 31 33  ables.do_test 13
3ad0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
3ae0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3af0: 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E t1(a, b, c);. 
3b00: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
3b10: 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
3b20: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
3b30: 20 4f 4e 20 74 31 28 62 2c 20 63 29 3b 0a 20 20   ON t1(b, c);.  
3b40: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
3b50: 7d 20 7b 24 69 3c 31 30 30 7d 20 7b 69 6e 63 72  } {$i<100} {incr
3b60: 20 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 69   i} {.    if {$i
3b70: 20 25 32 7d 20 7b 73 65 74 20 61 20 61 62 63 7d   %2} {set a abc}
3b80: 20 65 6c 73 65 20 7b 73 65 74 20 61 20 64 65 66   else {set a def
3b90: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
3ba0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72  INSERT INTO t1(r
3bb0: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 29 20 56  owid, a, b, c) V
3bc0: 41 4c 55 45 53 28 24 69 2c 20 24 61 2c 20 24 69  ALUES($i, $a, $i
3bd0: 2c 20 24 69 29 20 7d 0a 20 20 7d 0a 20 20 65 78  , $i) }.  }.  ex
3be0: 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 7d 20  ecsql ANALYZE.} 
3bf0: 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  {}.do_eqp_test 1
3c00: 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  3.2.1 {.  SELECT
3c10: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3c20: 20 61 3d 27 61 62 63 27 20 41 4e 44 20 72 6f 77   a='abc' AND row
3c30: 69 64 3c 31 35 20 41 4e 44 20 62 3c 32 30 0a 7d  id<15 AND b<20.}
3c40: 20 7b 2f 53 45 41 52 43 48 20 54 41 42 4c 45 20   {/SEARCH TABLE 
3c50: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
3c60: 31 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  1/}.do_eqp_test 
3c70: 31 33 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  13.2.2 {.  SELEC
3c80: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
3c90: 45 20 61 3d 27 61 62 63 27 20 41 4e 44 20 72 6f  E a='abc' AND ro
3ca0: 77 69 64 3c 27 31 35 27 20 41 4e 44 20 62 3c 32  wid<'15' AND b<2
3cb0: 30 0a 7d 20 7b 2f 53 45 41 52 43 48 20 54 41 42  0.} {/SEARCH TAB
3cc0: 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45  LE t1 USING INDE
3cd0: 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65  X i1/}.do_eqp_te
3ce0: 73 74 20 31 33 2e 33 2e 31 20 7b 0a 20 20 53 45  st 13.3.1 {.  SE
3cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
3d00: 48 45 52 45 20 61 3d 27 61 62 63 27 20 41 4e 44  HERE a='abc' AND
3d10: 20 72 6f 77 69 64 3c 31 30 30 20 41 4e 44 20 62   rowid<100 AND b
3d20: 3c 32 30 0a 7d 20 7b 2f 53 45 41 52 43 48 20 54  <20.} {/SEARCH T
3d30: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e  ABLE t1 USING IN
3d40: 44 45 58 20 69 32 2f 7d 0a 64 6f 5f 65 71 70 5f  DEX i2/}.do_eqp_
3d50: 74 65 73 74 20 31 33 2e 33 2e 32 20 7b 0a 20 20  test 13.3.2 {.  
3d60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3d70: 20 57 48 45 52 45 20 61 3d 27 61 62 63 27 20 41   WHERE a='abc' A
3d80: 4e 44 20 72 6f 77 69 64 3c 27 31 30 30 27 20 41  ND rowid<'100' A
3d90: 4e 44 20 62 3c 32 30 0a 7d 20 7b 2f 53 45 41 52  ND b<20.} {/SEAR
3da0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
3db0: 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a 0a 23 2d  G INDEX i2/}..#-
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
3e10: 20 61 6c 73 6f 20 74 68 61 74 20 61 66 66 69 6e   also that affin
3e20: 69 74 69 65 73 20 61 72 65 20 74 61 6b 65 6e 20  ities are taken 
3e30: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 77 68 65  into account whe
3e40: 6e 20 75 73 69 6e 67 20 73 74 61 74 34 20 64 61  n using stat4 da
3e50: 74 61 20 0a 23 20 74 6f 20 65 73 74 69 6d 61 74  ta .# to estimat
3e60: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
3e70: 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
3e80: 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 73 74 72  any other constr
3e90: 61 69 6e 74 20 6f 6e 20 61 20 0a 23 20 63 6f 6c  aint on a .# col
3ea0: 75 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  umn other than t
3eb0: 68 65 20 6c 65 66 74 6d 6f 73 74 2e 0a 23 0a 64  he leftmost..#.d
3ec0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
3ed0: 6f 5f 74 65 73 74 20 31 34 2e 31 20 7b 0a 20 20  o_test 14.1 {.  
3ee0: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
3ef0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 49   TABLE t1(a, b I
3f00: 4e 54 45 47 45 52 2c 20 63 29 20 7d 0a 20 20 66  NTEGER, c) }.  f
3f10: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
3f20: 3c 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  <100} {incr i} {
3f30: 0a 20 20 20 20 73 65 74 20 63 20 5b 65 78 70 72  .    set c [expr
3f40: 20 24 69 20 25 20 33 5d 0a 20 20 20 20 65 78 65   $i % 3].    exe
3f50: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3f60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6f 74  TO t1 VALUES('ot
3f70: 74 27 2c 20 24 69 2c 20 24 63 29 20 7d 0a 20 20  t', $i, $c) }.  
3f80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3f90: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
3fa0: 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20  1 ON t1(a, b);. 
3fb0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
3fc0: 69 32 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i2 ON t1(c);.   
3fd0: 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d 0a 7d 20   ANALYZE;.  }.} 
3fe0: 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  {}.do_eqp_test 1
3ff0: 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  3.2.1 {.  SELECT
4000: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
4010: 20 61 3d 27 6f 74 74 27 20 41 4e 44 20 62 3c 31   a='ott' AND b<1
4020: 30 20 41 4e 44 20 63 3d 31 0a 7d 20 7b 2f 53 45  0 AND c=1.} {/SE
4030: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
4040: 49 4e 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a 64  ING INDEX i1/}.d
4050: 6f 5f 65 71 70 5f 74 65 73 74 20 31 33 2e 32 2e  o_eqp_test 13.2.
4060: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
4070: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 27  ROM t1 WHERE a='
4080: 6f 74 74 27 20 41 4e 44 20 62 3c 27 31 30 27 20  ott' AND b<'10' 
4090: 41 4e 44 20 63 3d 31 0a 7d 20 7b 2f 53 45 41 52  AND c=1.} {/SEAR
40a0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
40b0: 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a 0a 23 2d  G INDEX i1/}..#-
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 42 79 20 64 65  --------.# By de
4110: 66 61 75 6c 74 2c 20 31 36 20 6e 6f 6e 2d 70 65  fault, 16 non-pe
4120: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 73 20 61  riodic samples a
4130: 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 66 6f 72  re collected for
4140: 20 74 68 65 20 73 74 61 74 34 20 74 61 62 6c 65   the stat4 table
4150: 2e 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
4160: 67 20 74 65 73 74 73 20 61 74 74 65 6d 70 74 20  g tests attempt 
4170: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
4180: 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 6b  he most common k
4190: 65 79 73 20 61 72 65 0a 23 20 62 65 69 6e 67 20  eys are.# being 
41a0: 63 6f 6c 6c 65 63 74 65 64 2e 0a 23 0a 70 72 6f  collected..#.pro
41b0: 63 20 63 68 65 63 6b 5f 73 74 61 74 34 20 7b 74  c check_stat4 {t
41c0: 6e 7d 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 41  n} {.  db eval A
41d0: 4e 41 4c 59 5a 45 0a 20 20 64 62 20 65 76 61 6c  NALYZE.  db eval
41e0: 20 7b 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   {SELECT a, b, c
41f0: 2c 20 64 20 46 52 4f 4d 20 74 31 7d 20 7b 0a 20  , d FROM t1} {. 
4200: 20 20 20 69 6e 63 72 20 6b 28 24 61 29 0a 20 20     incr k($a).  
4210: 20 20 69 6e 63 72 20 6b 28 5b 6c 69 73 74 20 24    incr k([list $
4220: 61 20 24 62 5d 29 0a 20 20 20 20 69 6e 63 72 20  a $b]).    incr 
4230: 6b 28 5b 6c 69 73 74 20 24 61 20 24 62 20 24 63  k([list $a $b $c
4240: 5d 29 0a 20 20 20 20 69 66 20 7b 20 5b 69 6e 66  ]).    if { [inf
4250: 6f 20 65 78 69 73 74 73 20 6b 28 5b 6c 69 73 74  o exists k([list
4260: 20 24 61 20 24 62 20 24 63 20 24 64 5d 29 5d 3d   $a $b $c $d])]=
4270: 3d 30 20 7d 20 7b 20 69 6e 63 72 20 6e 52 6f 77  =0 } { incr nRow
4280: 20 7d 0a 20 20 20 20 69 6e 63 72 20 6b 28 5b 6c   }.    incr k([l
4290: 69 73 74 20 24 61 20 24 62 20 24 63 20 24 64 5d  ist $a $b $c $d]
42a0: 29 0a 20 20 7d 0a 0a 20 20 73 65 74 20 4c 20 5b  ).  }..  set L [
42b0: 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20  list].  foreach 
42c0: 6b 65 79 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  key [array names
42d0: 20 6b 5d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e   k] {.    lappen
42e0: 64 20 4c 20 5b 6c 69 73 74 20 24 6b 28 24 6b 65  d L [list $k($ke
42f0: 79 29 20 24 6b 65 79 5d 0a 20 20 7d 0a 0a 20 20  y) $key].  }..  
4300: 73 65 74 20 6e 53 61 6d 70 6c 65 20 24 6e 52 6f  set nSample $nRo
4310: 77 0a 20 20 69 66 20 7b 24 6e 53 61 6d 70 6c 65  w.  if {$nSample
4320: 3e 31 36 7d 20 7b 73 65 74 20 6e 53 61 6d 70 6c  >16} {set nSampl
4330: 65 20 31 36 7d 0a 0a 20 20 73 65 74 20 6e 54 68  e 16}..  set nTh
4340: 72 65 73 68 6f 6c 64 20 5b 6c 69 6e 64 65 78 20  reshold [lindex 
4350: 5b 6c 73 6f 72 74 20 2d 64 65 63 72 20 2d 69 6e  [lsort -decr -in
4360: 74 65 67 65 72 20 2d 69 6e 64 65 78 20 30 20 24  teger -index 0 $
4370: 4c 5d 20 5b 65 78 70 72 20 24 6e 53 61 6d 70 6c  L] [expr $nSampl
4380: 65 2d 31 5d 20 30 5d 0a 20 20 66 6f 72 65 61 63  e-1] 0].  foreac
4390: 68 20 6b 65 79 20 5b 61 72 72 61 79 20 6e 61 6d  h key [array nam
43a0: 65 73 20 6b 5d 20 7b 0a 20 20 20 20 69 66 20 7b  es k] {.    if {
43b0: 24 6b 28 24 6b 65 79 29 3e 24 6e 54 68 72 65 73  $k($key)>$nThres
43c0: 68 6f 6c 64 7d 20 7b 0a 20 20 20 20 20 20 73 65  hold} {.      se
43d0: 74 20 65 78 70 65 63 74 28 24 6b 65 79 29 20 31  t expect($key) 1
43e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 24  .    }.    if {$
43f0: 6b 28 24 6b 65 79 29 3d 3d 24 6e 54 68 72 65 73  k($key)==$nThres
4400: 68 6f 6c 64 7d 20 7b 0a 20 20 20 20 20 20 73 65  hold} {.      se
4410: 74 20 70 6f 73 73 69 62 6c 65 28 24 6b 65 79 29  t possible($key)
4420: 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20   1.    }.  }... 
4430: 20 73 65 74 20 6e 50 6f 73 73 69 62 6c 65 20 5b   set nPossible [
4440: 65 78 70 72 20 24 6e 53 61 6d 70 6c 65 20 2d 20  expr $nSample - 
4450: 5b 6c 6c 65 6e 67 74 68 20 5b 61 72 72 61 79 20  [llength [array 
4460: 6e 61 6d 65 73 20 65 78 70 65 63 74 5d 5d 5d 0a  names expect]]].
4470: 0a 20 20 23 70 75 74 73 20 22 45 58 50 45 43 54  .  #puts "EXPECT
4480: 3a 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 65  : [array names e
4490: 78 70 65 63 74 5d 22 0a 20 20 23 70 75 74 73 20  xpect]".  #puts 
44a0: 22 50 4f 53 53 49 42 4c 45 28 24 6e 50 6f 73 73  "POSSIBLE($nPoss
44b0: 69 62 6c 65 2f 5b 61 72 72 61 79 20 73 69 7a 65  ible/[array size
44c0: 20 70 6f 73 73 69 62 6c 65 5d 29 3a 20 5b 61 72   possible]): [ar
44d0: 72 61 79 20 6e 61 6d 65 73 20 70 6f 73 73 69 62  ray names possib
44e0: 6c 65 5d 22 0a 20 20 23 70 75 74 73 20 22 48 41  le]".  #puts "HA
44f0: 56 45 3a 20 5b 64 62 20 65 76 61 6c 20 7b 53 45  VE: [db eval {SE
4500: 4c 45 43 54 20 74 65 73 74 5f 64 65 63 6f 64 65  LECT test_decode
4510: 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 73 71  (sample) FROM sq
4520: 6c 69 74 65 5f 73 74 61 74 34 20 57 48 45 52 45  lite_stat4 WHERE
4530: 20 69 64 78 3d 27 69 31 27 7d 5d 22 0a 0a 20 20   idx='i1'}]"..  
4540: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
4550: 74 65 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70  test_decode(samp
4560: 6c 65 29 20 41 53 20 73 20 46 52 4f 4d 20 73 71  le) AS s FROM sq
4570: 6c 69 74 65 5f 73 74 61 74 34 20 57 48 45 52 45  lite_stat4 WHERE
4580: 20 69 64 78 3d 27 69 31 27 7d 20 7b 0a 20 20 20   idx='i1'} {.   
4590: 20 73 65 74 20 73 65 65 6e 20 30 0a 20 20 20 20   set seen 0.    
45a0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
45b0: 69 3c 34 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  i<4} {incr i} {.
45c0: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
45d0: 6f 6d 70 6c 61 69 6e 20 65 78 70 65 63 74 28 5b  omplain expect([
45e0: 6c 72 61 6e 67 65 20 24 73 20 30 20 24 69 5d 29  lrange $s 0 $i])
45f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
4600: 20 65 78 69 73 74 73 20 70 6f 73 73 69 62 6c 65   exists possible
4610: 28 5b 6c 72 61 6e 67 65 20 24 73 20 30 20 24 69  ([lrange $s 0 $i
4620: 5d 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  ])]} {.        s
4630: 65 74 20 73 65 65 6e 20 31 0a 20 20 20 20 20 20  et seen 1.      
4640: 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
4650: 61 69 6e 20 70 6f 73 73 69 62 6c 65 28 5b 6c 72  ain possible([lr
4660: 61 6e 67 65 20 24 73 20 30 20 24 69 5d 29 0a 20  ange $s 0 $i]). 
4670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4680: 20 69 66 20 7b 24 73 65 65 6e 7d 20 7b 69 6e 63   if {$seen} {inc
4690: 72 20 6e 50 6f 73 73 69 62 6c 65 20 2d 31 7d 0a  r nPossible -1}.
46a0: 20 20 7d 0a 20 20 69 66 20 7b 24 6e 50 6f 73 73    }.  if {$nPoss
46b0: 69 62 6c 65 3c 30 7d 20 7b 73 65 74 20 6e 50 6f  ible<0} {set nPo
46c0: 73 73 69 62 6c 65 20 30 7d 0a 0a 20 20 73 65 74  ssible 0}..  set
46d0: 20 72 65 73 20 5b 6c 69 73 74 20 5b 6c 6c 65 6e   res [list [llen
46e0: 67 74 68 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  gth [array names
46f0: 20 65 78 70 65 63 74 5d 5d 20 24 6e 50 6f 73 73   expect]] $nPoss
4700: 69 62 6c 65 5d 0a 20 20 75 70 6c 65 76 65 6c 20  ible].  uplevel 
4710: 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74 20 24 74  [list do_test $t
4720: 6e 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24  n [list set {} $
4730: 72 65 73 5d 20 7b 30 20 30 7d 5d 0a 7d 0a 0a 64  res] {0 0}].}..d
4740: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
4750: 6f 5f 74 65 73 74 20 31 34 2e 31 2e 31 20 7b 0a  o_test 14.1.1 {.
4760: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4770: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4780: 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 43 52  a,b,c,d);.    CR
4790: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
47a0: 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
47b0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
47c0: 7d 20 7b 24 69 20 3c 20 31 36 30 7d 20 7b 69 6e  } {$i < 160} {in
47d0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
47e0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
47f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c 24  O t1 VALUES($i,$
4800: 69 2c 24 69 2c 24 69 29 20 7d 0a 20 20 20 20 69  i,$i,$i) }.    i
4810: 66 20 7b 28 24 69 20 25 20 31 30 29 3d 3d 30 7d  f {($i % 10)==0}
4820: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53   { execsql { INS
4830: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4840: 45 53 28 24 69 2c 24 69 2c 24 69 2c 24 69 29 20  ES($i,$i,$i,$i) 
4850: 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 63 68 65  } }.  }.} {}.che
4860: 63 6b 5f 73 74 61 74 34 20 31 34 2e 31 2e 32 0a  ck_stat4 14.1.2.
4870: 0a 64 6f 5f 74 65 73 74 20 31 34 2e 32 2e 31 20  .do_test 14.2.1 
4880: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45  {.  execsql { DE
4890: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20  LETE FROM t1 }. 
48a0: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
48b0: 24 69 20 3c 20 31 36 30 30 7d 20 7b 69 6e 63 72  $i < 1600} {incr
48c0: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
48d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
48e0: 74 31 20 56 41 4c 55 45 53 28 24 69 2f 31 30 2c  t1 VALUES($i/10,
48f0: 24 69 2f 31 37 2c 24 69 2f 32 37 2c 24 69 2f 33  $i/17,$i/27,$i/3
4900: 37 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 63 68  7) }.  }.} {}.ch
4910: 65 63 6b 5f 73 74 61 74 34 20 31 34 2e 32 2e 32  eck_stat4 14.2.2
4920: 0a 0a 64 6f 5f 74 65 73 74 20 31 34 2e 33 2e 31  ..do_test 14.3.1
4930: 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   {.  for {set i 
4940: 30 7d 20 7b 24 69 20 3c 20 31 30 7d 20 7b 69 6e  0} {$i < 10} {in
4950: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
4960: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
4970: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35  O t1 VALUES($i*5
4980: 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69  0,$i*50,$i*50,$i
4990: 2a 35 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73  *50) }.    execs
49a0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
49b0: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30   t1 VALUES($i*50
49c0: 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a  ,$i*50,$i*50,$i*
49d0: 35 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71  50) }.    execsq
49e0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
49f0: 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c  t1 VALUES($i*50,
4a00: 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35  $i*50,$i*50,$i*5
4a10: 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  0) }.    execsql
4a20: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4a30: 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24  1 VALUES($i*50,$
4a40: 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30  i*50,$i*50,$i*50
4a50: 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) }.    execsql 
4a60: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
4a70: 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69   VALUES($i*50,$i
4a80: 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29  *50,$i*50,$i*50)
4a90: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
4aa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4ab0: 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69 2a  VALUES($i*50,$i*
4ac0: 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29 20  50,$i*50,$i*50) 
4ad0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
4ae0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4af0: 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69 2a 35  ALUES($i*50,$i*5
4b00: 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29 20 7d  0,$i*50,$i*50) }
4b10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
4b20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4b30: 4c 55 45 53 28 24 69 2a 35 30 2c 24 69 2a 35 30  LUES($i*50,$i*50
4b40: 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29 20 7d 0a  ,$i*50,$i*50) }.
4b50: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
4b60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4b70: 55 45 53 28 24 69 2a 35 30 2c 24 69 2a 35 30 2c  UES($i*50,$i*50,
4b80: 24 69 2a 35 30 2c 24 69 2a 35 30 29 20 7d 0a 20  $i*50,$i*50) }. 
4b90: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
4ba0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4bb0: 45 53 28 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24  ES($i*50,$i*50,$
4bc0: 69 2a 35 30 2c 24 69 2a 35 30 29 20 7d 0a 20 20  i*50,$i*50) }.  
4bd0: 7d 0a 7d 20 7b 7d 0a 63 68 65 63 6b 5f 73 74 61  }.} {}.check_sta
4be0: 74 34 20 31 34 2e 33 2e 32 0a 0a 64 6f 5f 74 65  t4 14.3.2..do_te
4bf0: 73 74 20 31 34 2e 34 2e 31 20 7b 0a 20 20 65 78  st 14.4.1 {.  ex
4c00: 65 63 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52  ecsql {DELETE FR
4c10: 4f 4d 20 74 31 7d 0a 20 20 66 6f 72 20 7b 73 65  OM t1}.  for {se
4c20: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 31 36 30  t i 1} {$i < 160
4c30: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
4c40: 20 73 65 74 20 62 20 5b 65 78 70 72 20 24 69 20   set b [expr $i 
4c50: 25 20 31 30 5d 0a 20 20 20 20 69 66 20 7b 24 62  % 10].    if {$b
4c60: 3d 3d 30 20 7c 7c 20 24 62 3d 3d 32 7d 20 7b 73  ==0 || $b==2} {s
4c70: 65 74 20 62 20 31 7d 0a 20 20 20 20 65 78 65 63  et b 1}.    exec
4c80: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
4c90: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2f 31  O t1 VALUES($i/1
4ca0: 30 2c 24 62 2c 24 69 2c 24 69 29 20 7d 0a 20 20  0,$b,$i,$i) }.  
4cb0: 7d 0a 7d 20 7b 7d 0a 63 68 65 63 6b 5f 73 74 61  }.} {}.check_sta
4cc0: 74 34 20 31 34 2e 34 2e 32 0a 64 62 20 66 75 6e  t4 14.4.2.db fun
4cd0: 63 20 6c 72 61 6e 67 65 20 6c 72 61 6e 67 65 0a  c lrange lrange.
4ce0: 64 62 20 66 75 6e 63 20 6c 69 6e 64 65 78 20 6c  db func lindex l
4cf0: 69 6e 64 65 78 0a 64 6f 5f 65 78 65 63 73 71 6c  index.do_execsql
4d00: 5f 74 65 73 74 20 31 34 2e 34 2e 33 20 7b 0a 20  _test 14.4.3 {. 
4d10: 20 53 45 4c 45 43 54 20 6c 72 61 6e 67 65 28 74   SELECT lrange(t
4d20: 65 73 74 5f 64 65 63 6f 64 65 28 73 61 6d 70 6c  est_decode(sampl
4d30: 65 29 2c 20 30 2c 20 31 29 20 41 53 20 73 20 46  e), 0, 1) AS s F
4d40: 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ROM sqlite_stat4
4d50: 0a 20 20 57 48 45 52 45 20 6c 69 6e 64 65 78 28  .  WHERE lindex(
4d60: 73 2c 20 31 29 3d 3d 27 31 27 20 4f 52 44 45 52  s, 1)=='1' ORDER
4d70: 20 42 59 20 72 6f 77 69 64 0a 7d 20 7b 0a 20 20   BY rowid.} {.  
4d80: 7b 30 20 31 7d 20 7b 31 20 31 7d 20 7b 32 20 31  {0 1} {1 1} {2 1
4d90: 7d 20 7b 33 20 31 7d 20 0a 20 20 7b 34 20 31 7d  } {3 1} .  {4 1}
4da0: 20 7b 35 20 31 7d 20 7b 36 20 31 7d 20 7b 37 20   {5 1} {6 1} {7 
4db0: 31 7d 20 0a 20 20 7b 38 20 31 7d 20 7b 39 20 31  1} .  {8 1} {9 1
4dc0: 7d 20 7b 31 30 20 31 7d 20 7b 31 31 20 31 7d 20  } {10 1} {11 1} 
4dd0: 0a 20 20 7b 31 32 20 31 7d 20 7b 31 33 20 31 7d  .  {12 1} {13 1}
4de0: 20 7b 31 34 20 31 7d 20 7b 31 35 20 31 7d 0a 7d   {14 1} {15 1}.}
4df0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
4e40: 65 73 74 20 74 68 61 74 20 6e 6f 74 68 69 6e 67  est that nothing
4e50: 20 75 6e 74 6f 77 61 72 64 20 68 61 70 70 65 6e   untoward happen
4e60: 73 20 69 66 20 74 68 65 20 73 74 61 74 34 20 74  s if the stat4 t
4e70: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 65 6e  able contains en
4e80: 74 72 69 65 73 0a 23 20 66 6f 72 20 69 6e 64 65  tries.# for inde
4e90: 78 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  xes that do not 
4ea0: 65 78 69 73 74 2e 20 4f 72 20 4e 55 4c 4c 20 76  exist. Or NULL v
4eb0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 69 64 78  alues in the idx
4ec0: 20 63 6f 6c 75 6d 6e 2e 0a 23 20 4f 72 20 4e 55   column..# Or NU
4ed0: 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20 61 6e 79  LL values in any
4ee0: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 63 6f   of the other co
4ef0: 6c 75 6d 6e 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c  lumns..#.drop_al
4f00: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63  l_tables.do_exec
4f10: 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 20 7b 0a  sql_test 15.1 {.
4f20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
4f30: 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61  1(a, b, UNIQUE(a
4f40: 2c 20 62 29 29 3b 0a 20 20 49 4e 53 45 52 54 20  , b));.  INSERT 
4f50: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 31  INTO x1 VALUES(1
4f60: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
4f70: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 33 2c  NTO x1 VALUES(3,
4f80: 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   4);.  INSERT IN
4f90: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 35 2c 20  TO x1 VALUES(5, 
4fa0: 36 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20  6);.  ANALYZE;. 
4fb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c   INSERT INTO sql
4fc0: 69 74 65 5f 73 74 61 74 34 20 56 41 4c 55 45 53  ite_stat4 VALUES
4fd0: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  (NULL, NULL, NUL
4fe0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  L, NULL, NULL, N
4ff0: 55 4c 4c 29 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65  ULL);.}.db close
5000: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
5010: 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .db.do_execsql_t
5020: 65 73 74 20 31 35 2e 32 20 7b 20 53 45 4c 45 43  est 15.2 { SELEC
5030: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31  T * FROM x1 } {1
5040: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 64 6f 5f   2 3 4 5 6}..do_
5050: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e  execsql_test 15.
5060: 33 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3 {.  INSERT INT
5070: 4f 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 56  O sqlite_stat4 V
5080: 41 4c 55 45 53 28 34 32 2c 20 34 32 2c 20 34 32  ALUES(42, 42, 42
5090: 2c 20 34 32 2c 20 34 32 2c 20 34 32 29 3b 0a 7d  , 42, 42, 42);.}
50a0: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
50b0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
50c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e  execsql_test 15.
50d0: 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  4 { SELECT * FRO
50e0: 4d 20 78 31 20 7d 20 7b 31 20 32 20 33 20 34 20  M x1 } {1 2 3 4 
50f0: 35 20 36 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  5 6}..do_execsql
5100: 5f 74 65 73 74 20 31 35 2e 35 20 7b 0a 20 20 55  _test 15.5 {.  U
5110: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61  PDATE sqlite_sta
5120: 74 31 20 53 45 54 20 73 74 61 74 20 3d 20 4e 55  t1 SET stat = NU
5130: 4c 4c 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73  LL;.}.db close.s
5140: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
5150: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
5160: 74 20 31 35 2e 36 20 7b 20 53 45 4c 45 43 54 20  t 15.6 { SELECT 
5170: 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32  * FROM x1 } {1 2
5180: 20 33 20 34 20 35 20 36 7d 0a 0a 64 6f 5f 65 78   3 4 5 6}..do_ex
5190: 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 37 20  ecsql_test 15.7 
51a0: 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55  {.  ANALYZE;.  U
51b0: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61  PDATE sqlite_sta
51c0: 74 31 20 53 45 54 20 74 62 6c 20 3d 20 27 6e 6f  t1 SET tbl = 'no
51d0: 20 73 75 63 68 20 74 62 6c 27 3b 0a 7d 0a 64 62   such tbl';.}.db
51e0: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64   close.sqlite3 d
51f0: 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 65 78 65  b test.db.do_exe
5200: 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 38 20 7b  csql_test 15.8 {
5210: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
5220: 31 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  1 } {1 2 3 4 5 6
5230: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
5240: 73 74 20 31 35 2e 39 20 7b 0a 20 20 41 4e 41 4c  st 15.9 {.  ANAL
5250: 59 5a 45 3b 0a 20 20 55 50 44 41 54 45 20 73 71  YZE;.  UPDATE sq
5260: 6c 69 74 65 5f 73 74 61 74 34 20 53 45 54 20 6e  lite_stat4 SET n
5270: 65 71 20 3d 20 4e 55 4c 4c 2c 20 6e 6c 74 3d 4e  eq = NULL, nlt=N
5280: 55 4c 4c 2c 20 6e 64 6c 74 3d 4e 55 4c 4c 3b 0a  ULL, ndlt=NULL;.
5290: 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74  }.db close.sqlit
52a0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f  e3 db test.db.do
52b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
52c0: 2e 31 30 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  .10 { SELECT * F
52d0: 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32 20 33 20  ROM x1 } {1 2 3 
52e0: 34 20 35 20 36 7d 0a 0a 23 20 54 68 69 73 20 69  4 5 6}..# This i
52f0: 73 20 6a 75 73 74 20 66 6f 72 20 63 6f 76 65 72  s just for cover
5300: 61 67 65 2e 2e 2e 2e 0a 64 6f 5f 65 78 65 63 73  age.....do_execs
5310: 71 6c 5f 74 65 73 74 20 31 35 2e 31 31 20 7b 0a  ql_test 15.11 {.
5320: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44    ANALYZE;.  UPD
5330: 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ATE sqlite_stat1
5340: 20 53 45 54 20 73 74 61 74 20 3d 20 73 74 61 74   SET stat = stat
5350: 20 7c 7c 20 27 20 75 6e 6f 72 64 65 72 65 64 27   || ' unordered'
5360: 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c  ;.}.db close.sql
5370: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
5380: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5390: 31 35 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 2a  15.12 { SELECT *
53a0: 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32 20   FROM x1 } {1 2 
53b0: 33 20 34 20 35 20 36 7d 0a 0a 23 2d 2d 2d 2d 2d  3 4 5 6}..#-----
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
5410: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65   allocations use
5420: 64 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  d for sqlite_sta
5430: 74 34 20 73 61 6d 70 6c 65 73 20 61 72 65 20 69  t4 samples are i
5440: 6e 63 6c 75 64 65 64 20 69 6e 0a 23 20 74 68 65  ncluded in.# the
5450: 20 71 75 61 6e 74 69 74 79 20 72 65 74 75 72 6e   quantity return
5460: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 44 42 53  ed by SQLITE_DBS
5470: 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45  TATUS_SCHEMA_USE
5480: 44 2e 0a 23 0a 73 65 74 20 6f 6e 65 20 5b 73 74  D..#.set one [st
5490: 72 69 6e 67 20 72 65 70 65 61 74 20 78 20 31 30  ring repeat x 10
54a0: 30 30 5d 0a 73 65 74 20 74 77 6f 20 5b 73 74 72  00].set two [str
54b0: 69 6e 67 20 72 65 70 65 61 74 20 78 20 32 30 30  ing repeat x 200
54c0: 30 5d 0a 64 6f 5f 74 65 73 74 20 31 36 2e 31 20  0].do_test 16.1 
54d0: 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65  {.  reset_db.  e
54e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
54f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
5500: 55 4e 49 51 55 45 28 61 29 29 3b 0a 20 20 20 20  UNIQUE(a));.    
5510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5520: 41 4c 55 45 53 28 24 6f 6e 65 29 3b 0a 20 20 20  ALUES($one);.   
5530: 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d 0a 20 20   ANALYZE;.  }.  
5540: 73 65 74 20 6e 42 79 74 65 20 5b 6c 69 6e 64 65  set nByte [linde
5550: 78 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  x [sqlite3_db_st
5560: 61 74 75 73 20 64 62 20 53 43 48 45 4d 41 5f 55  atus db SCHEMA_U
5570: 53 45 44 20 30 5d 20 31 5d 0a 0a 20 20 72 65 73  SED 0] 1]..  res
5580: 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
5590: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
55a0: 4c 45 20 74 31 28 61 2c 20 55 4e 49 51 55 45 28  LE t1(a, UNIQUE(
55b0: 61 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a));.    INSERT 
55c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
55d0: 74 77 6f 29 3b 0a 20 20 20 20 41 4e 41 4c 59 5a  two);.    ANALYZ
55e0: 45 3b 0a 20 20 7d 0a 20 20 73 65 74 20 6e 42 79  E;.  }.  set nBy
55f0: 74 65 32 20 5b 6c 69 6e 64 65 78 20 5b 73 71 6c  te2 [lindex [sql
5600: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64  ite3_db_status d
5610: 62 20 53 43 48 45 4d 41 5f 55 53 45 44 20 30 5d  b SCHEMA_USED 0]
5620: 20 31 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   1].  puts -none
5630: 77 6c 69 6e 65 20 22 20 28 6e 42 79 74 65 3d 24  wline " (nByte=$
5640: 6e 42 79 74 65 20 6e 42 79 74 65 32 3d 24 6e 42  nByte nByte2=$nB
5650: 79 74 65 32 29 22 0a 0a 20 20 65 78 70 72 20 7b  yte2)"..  expr {
5660: 24 6e 42 79 74 65 32 20 3e 20 24 6e 42 79 74 65  $nByte2 > $nByte
5670: 2b 39 30 30 20 26 26 20 24 6e 42 79 74 65 32 20  +900 && $nByte2 
5680: 3c 20 24 6e 42 79 74 65 2b 31 31 30 30 7d 0a 7d  < $nByte+1100}.}
5690: 20 7b 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {1}..#---------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 73 74 61  .# Test that sta
56f0: 74 34 20 64 61 74 61 20 6d 61 79 20 62 65 20 75  t4 data may be u
5700: 73 65 64 20 77 69 74 68 20 70 61 72 74 69 61 6c  sed with partial
5710: 20 69 6e 64 65 78 65 73 2e 0a 23 0a 64 6f 5f 74   indexes..#.do_t
5720: 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 72 65 73  est 17.1 {.  res
5730: 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  et_db.  execsql 
5740: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5750: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64  LE t1(a, b, c, d
5760: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
5770: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
5780: 62 29 20 57 48 45 52 45 20 64 20 49 53 20 4e 4f  b) WHERE d IS NO
5790: 54 20 4e 55 4c 4c 3b 0a 20 20 20 20 49 4e 53 45  T NULL;.    INSE
57a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
57b0: 53 28 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 4e 55  S(-1, -1, -1, NU
57c0: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
57d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 32  INTO t1 SELECT 2
57e0: 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46 52 4f  *a,2*b,2*c,d FRO
57f0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
5800: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
5810: 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46 52  2*a,2*b,2*c,d FR
5820: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
5830: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
5840: 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20 46   2*a,2*b,2*c,d F
5850: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
5860: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
5870: 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20  T 2*a,2*b,2*c,d 
5880: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
5890: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
58a0: 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64  CT 2*a,2*b,2*c,d
58b0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
58c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
58d0: 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c  ECT 2*a,2*b,2*c,
58e0: 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a  d FROM t1;.  }..
58f0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
5900: 7b 24 69 20 3c 20 33 32 7d 20 7b 69 6e 63 72 20  {$i < 32} {incr 
5910: 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 69 3c  i} {.    if {$i<
5920: 38 7d 20 7b 73 65 74 20 62 20 30 7d 20 65 6c 73  8} {set b 0} els
5930: 65 20 7b 20 73 65 74 20 62 20 24 69 20 7d 0a 20  e { set b $i }. 
5940: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
5950: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5960: 45 53 28 24 69 25 32 2c 20 24 62 2c 20 24 69 2f  ES($i%2, $b, $i/
5970: 32 2c 20 27 61 62 63 27 29 20 7d 0a 20 20 7d 0a  2, 'abc') }.  }.
5980: 20 20 65 78 65 63 73 71 6c 20 7b 41 4e 41 4c 59    execsql {ANALY
5990: 5a 45 20 6d 61 69 6e 2e 74 31 7d 0a 7d 20 7b 7d  ZE main.t1}.} {}
59a0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
59b0: 73 74 20 31 37 2e 31 2e 32 20 7b 0a 20 20 41 4e  st 17.1.2 {.  AN
59c0: 41 4c 59 5a 45 20 74 65 6d 70 2e 74 31 3b 0a 7d  ALYZE temp.t1;.}
59d0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
59e0: 6c 65 3a 20 74 65 6d 70 2e 74 31 7d 7d 0a 0a 64  le: temp.t1}}..d
59f0: 6f 5f 65 71 70 5f 74 65 73 74 20 31 37 2e 32 20  o_eqp_test 17.2 
5a00: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5a10: 4d 20 74 31 20 57 48 45 52 45 20 64 20 49 53 20  M t1 WHERE d IS 
5a20: 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 61 3d 30  NOT NULL AND a=0
5a30: 20 41 4e 44 20 62 3d 31 30 20 41 4e 44 20 63 3d   AND b=10 AND c=
5a40: 31 30 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49 4e  10;.} {/USING IN
5a50: 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70 5f  DEX i1/}.do_eqp_
5a60: 74 65 73 74 20 31 37 2e 33 20 7b 0a 20 20 53 45  test 17.3 {.  SE
5a70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
5a80: 48 45 52 45 20 64 20 49 53 20 4e 4f 54 20 4e 55  HERE d IS NOT NU
5a90: 4c 4c 20 41 4e 44 20 61 3d 30 20 41 4e 44 20 62  LL AND a=0 AND b
5aa0: 3d 30 20 41 4e 44 20 63 3d 31 30 3b 0a 7d 20 7b  =0 AND c=10;.} {
5ab0: 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 2f  /USING INDEX i1/
5ac0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
5ad0: 73 74 20 31 37 2e 34 20 7b 0a 20 20 43 52 45 41  st 17.4 {.  CREA
5ae0: 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
5af0: 31 28 63 2c 20 64 29 3b 0a 20 20 41 4e 41 4c 59  1(c, d);.  ANALY
5b00: 5a 45 20 6d 61 69 6e 2e 69 32 3b 0a 7d 0a 64 6f  ZE main.i2;.}.do
5b10: 5f 65 71 70 5f 74 65 73 74 20 31 37 2e 35 20 7b  _eqp_test 17.5 {
5b20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5b30: 20 74 31 20 57 48 45 52 45 20 64 20 49 53 20 4e   t1 WHERE d IS N
5b40: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 61 3d 30 20  OT NULL AND a=0 
5b50: 41 4e 44 20 62 3d 31 30 20 41 4e 44 20 63 3d 31  AND b=10 AND c=1
5b60: 30 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44  0;.} {/USING IND
5b70: 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70 5f 74  EX i1/}.do_eqp_t
5b80: 65 73 74 20 31 37 2e 36 20 7b 0a 20 20 53 45 4c  est 17.6 {.  SEL
5b90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
5ba0: 45 52 45 20 64 20 49 53 20 4e 4f 54 20 4e 55 4c  ERE d IS NOT NUL
5bb0: 4c 20 41 4e 44 20 61 3d 30 20 41 4e 44 20 62 3d  L AND a=0 AND b=
5bc0: 30 20 41 4e 44 20 63 3d 31 30 3b 0a 7d 20 7b 2f  0 AND c=10;.} {/
5bd0: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32 2f 7d  USING INDEX i2/}
5be0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
5c30: 6f 5f 74 65 73 74 20 31 38 2e 31 20 7b 0a 20 20  o_test 18.1 {.  
5c40: 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
5c50: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5c60: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
5c70: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
5c80: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29 3b   i1 ON t1(a, b);
5c90: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
5ca0: 69 20 30 7d 20 7b 24 69 20 3c 20 39 7d 20 7b 69  i 0} {$i < 9} {i
5cb0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
5cc0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
5cd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5ce0: 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20  ES($i, 0);.     
5cf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5d00: 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20  VALUES($i, 0);. 
5d10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5d20: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30   t1 VALUES($i, 0
5d30: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
5d40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
5d50: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53  i, 0);.      INS
5d60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5d70: 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20  ES($i, 0);.     
5d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5d90: 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20  VALUES($i, 0);. 
5da0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5db0: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30   t1 VALUES($i, 0
5dc0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
5dd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
5de0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53  i, 0);.      INS
5df0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5e00: 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20  ES($i, 0);.     
5e10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5e20: 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20  VALUES($i, 0);. 
5e30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5e40: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30   t1 VALUES($i, 0
5e50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
5e60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
5e70: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53  i, 0);.      INS
5e80: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5e90: 45 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20  ES($i, 0);.     
5ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5eb0: 56 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20  VALUES($i, 0);. 
5ec0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5ed0: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30   t1 VALUES($i, 0
5ee0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65  );.    }.  }.  e
5ef0: 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 20  xecsql ANALYZE. 
5f00: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
5f10: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5f20: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 7d 0a 7d  sqlite_stat4 }.}
5f30: 20 7b 39 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {9}..#---------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 0a 23 20 46 6f 72 20 63 6f 76 65 72 61 67 65 2e  .# For coverage.
5f90: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65  .#.ifcapable vie
5fa0: 77 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 31 39  w {.  do_test 19
5fb0: 2e 31 20 7b 0a 20 20 20 20 72 65 73 65 74 5f 64  .1 {.    reset_d
5fc0: 62 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  b .    execsql {
5fd0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
5fe0: 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
5ff0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
6000: 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 79 29 3b   i1 ON t1(x, y);
6010: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
6020: 45 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20  EW v1 AS SELECT 
6030: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
6040: 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 7d 0a   ANALYZE;.    }.
6050: 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61 70 61 62    } {}.}.ifcapab
6060: 6c 65 20 61 75 74 68 20 7b 0a 20 20 70 72 6f 63  le auth {.  proc
6070: 20 61 75 74 68 70 72 6f 63 20 7b 6f 70 20 61 72   authproc {op ar
6080: 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6f  gs} {.    if {$o
6090: 70 20 3d 3d 20 22 53 51 4c 49 54 45 5f 41 4e 41  p == "SQLITE_ANA
60a0: 4c 59 5a 45 22 7d 20 7b 20 72 65 74 75 72 6e 20  LYZE"} { return 
60b0: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 20 7d 0a  "SQLITE_DENY" }.
60c0: 20 20 20 20 72 65 74 75 72 6e 20 22 53 51 4c 49      return "SQLI
60d0: 54 45 5f 4f 4b 22 0a 20 20 7d 0a 20 20 64 6f 5f  TE_OK".  }.  do_
60e0: 74 65 73 74 20 31 39 2e 32 20 7b 0a 20 20 20 20  test 19.2 {.    
60f0: 72 65 73 65 74 5f 64 62 20 0a 20 20 20 20 64 62  reset_db .    db
6100: 20 61 75 74 68 20 61 75 74 68 70 72 6f 63 0a 20   auth authproc. 
6110: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
6120: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6130: 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 20 20  t1(x, y);.      
6140: 43 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41  CREATE VIEW v1 A
6150: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
6160: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  t1;.    }.    ca
6170: 74 63 68 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 20  tchsql ANALYZE. 
6180: 20 7d 20 7b 31 20 7b 6e 6f 74 20 61 75 74 68 6f   } {1 {not autho
6190: 72 69 7a 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  rized}}.}..#----
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62  -----.#.reset_db
61f0: 0a 70 72 6f 63 20 72 20 7b 61 72 67 73 7d 20 7b  .proc r {args} {
6200: 20 65 78 70 72 20 72 61 6e 64 28 29 20 7d 0a 64   expr rand() }.d
6210: 62 20 66 75 6e 63 20 72 20 72 0a 64 62 20 66 75  b func r r.db fu
6220: 6e 63 20 6c 72 61 6e 67 65 20 6c 72 61 6e 67 65  nc lrange lrange
6230: 0a 64 6f 5f 74 65 73 74 20 32 30 2e 31 20 7b 0a  .do_test 20.1 {.
6240: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6250: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6260: 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 43 52  a,b,c,d);.    CR
6270: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
6280: 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
6290: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
62a0: 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e 63  } {$i < 16} {inc
62b0: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
62c0: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
62d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
62e0: 28 24 69 2c 20 72 28 29 2c 20 72 28 29 2c 20 72  ($i, r(), r(), r
62f0: 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ());.      INSER
6300: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6310: 28 24 69 2c 20 24 69 2c 20 20 72 28 29 2c 20 72  ($i, $i,  r(), r
6320: 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ());.      INSER
6330: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6340: 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20 72  ($i, $i,  $i,  r
6350: 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ());.      INSER
6360: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6370: 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20 24  ($i, $i,  $i,  $
6380: 69 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  i);.      INSERT
6390: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
63a0: 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20 24 69  $i, $i,  $i,  $i
63b0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
63c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
63d0: 69 2c 20 24 69 2c 20 20 24 69 2c 20 20 72 28 29  i, $i,  $i,  r()
63e0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
63f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
6400: 69 2c 20 24 69 2c 20 20 72 28 29 2c 20 72 28 29  i, $i,  r(), r()
6410: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
6420: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
6430: 69 2c 20 72 28 29 2c 20 72 28 29 2c 20 72 28 29  i, r(), r(), r()
6440: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 7b  );.    }.  }.} {
6450: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6460: 74 20 32 30 2e 32 20 7b 20 41 4e 41 4c 59 5a 45  t 20.2 { ANALYZE
6470: 20 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d   }.for {set i 0}
6480: 20 7b 24 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69   {$i<16} {incr i
6490: 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 61 6c 20  } {.    set val 
64a0: 22 24 69 20 24 69 20 24 69 20 24 69 22 0a 20 20  "$i $i $i $i".  
64b0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
64c0: 74 20 32 30 2e 33 2e 24 69 20 7b 0a 20 20 20 20  t 20.3.$i {.    
64d0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
64e0: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  ) FROM sqlite_st
64f0: 61 74 34 20 0a 20 20 20 20 20 20 57 48 45 52 45  at4 .      WHERE
6500: 20 6c 72 61 6e 67 65 28 74 65 73 74 5f 64 65 63   lrange(test_dec
6510: 6f 64 65 28 73 61 6d 70 6c 65 29 2c 20 30 2c 20  ode(sample), 0, 
6520: 33 29 3d 24 76 61 6c 0a 20 20 20 20 7d 20 7b 31  3)=$val.    } {1
6530: 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }.}..finish_test
6540: 0a                                               .