/ Hex Artifact Content
Login

Artifact 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54:


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 61  ide db 0 0 0..da
2240: 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
2250: 72 72 75 70 74 0a 64 6f 5f 65 78 65 63 73 71 6c  rrupt.do_execsql
2260: 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43 52  _test 7.1 {.  CR
2270: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2280: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   b);.  CREATE IN
2290: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
22a0: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
22b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31  O t1 VALUES(1, 1
22c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
22d0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32 29   t1 VALUES(2, 2)
22e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
22f0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b  t1 VALUES(3, 3);
2300: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2310: 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a  1 VALUES(4, 4);.
2320: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2330: 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20   VALUES(5, 5);. 
2340: 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44 41   ANALYZE;.  UPDA
2350: 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  TE sqlite_stat4 
2360: 53 45 54 20 73 61 6d 70 6c 65 20 3d 20 58 27 27  SET sample = X''
2370: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
2380: 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69  ;.  ANALYZE sqli
2390: 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 0a 0a 64 6f  te_master;.}..do
23a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
23b0: 32 20 7b 0a 20 20 55 50 44 41 54 45 20 73 71 6c  2 {.  UPDATE sql
23c0: 69 74 65 5f 73 74 61 74 34 20 53 45 54 20 73 61  ite_stat4 SET sa
23d0: 6d 70 6c 65 20 3d 20 58 27 46 46 46 46 27 3b 0a  mple = X'FFFF';.
23e0: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
23f0: 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45 43  _master;.  SELEC
2400: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
2410: 45 20 61 20 3d 20 31 3b 0a 7d 20 7b 31 20 31 7d  E a = 1;.} {1 1}
2420: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
2430: 74 20 37 2e 33 20 7b 0a 20 20 41 4e 41 4c 59 5a  t 7.3 {.  ANALYZ
2440: 45 3b 0a 20 20 55 50 44 41 54 45 20 73 71 6c 69  E;.  UPDATE sqli
2450: 74 65 5f 73 74 61 74 34 20 53 45 54 20 6e 65 71  te_stat4 SET neq
2460: 20 3d 20 27 30 20 30 20 30 27 3b 0a 20 20 41 4e   = '0 0 0';.  AN
2470: 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2480: 74 65 72 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ter;.  SELECT * 
2490: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
24a0: 3d 20 31 3b 0a 7d 20 7b 31 20 31 7d 0a 0a 64 6f  = 1;.} {1 1}..do
24b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
24c0: 34 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20  4 {.  ANALYZE;. 
24d0: 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73   UPDATE sqlite_s
24e0: 74 61 74 34 20 53 45 54 20 6e 64 6c 74 20 3d 20  tat4 SET ndlt = 
24f0: 27 30 20 30 20 30 27 3b 0a 20 20 41 4e 41 4c 59  '0 0 0';.  ANALY
2500: 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
2510: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
2520: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 33  M t1 WHERE a = 3
2530: 3b 0a 7d 20 7b 33 20 33 7d 0a 0a 64 6f 5f 65 78  ;.} {3 3}..do_ex
2540: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 35 20 7b  ecsql_test 7.5 {
2550: 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 55 50  .  ANALYZE;.  UP
2560: 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61 74  DATE sqlite_stat
2570: 34 20 53 45 54 20 6e 6c 74 20 3d 20 27 30 20 30  4 SET nlt = '0 0
2580: 20 30 27 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73   0';.  ANALYZE s
2590: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
25a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25b0: 20 57 48 45 52 45 20 61 20 3d 20 35 3b 0a 7d 20   WHERE a = 5;.} 
25c0: 7b 35 20 35 7d 0a 0a 64 61 74 61 62 61 73 65 5f  {5 5}..database_
25d0: 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 0a 23  never_corrupt..#
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 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65  ---------.#.rese
2630: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
2640: 74 65 73 74 20 38 2e 31 20 7b 0a 20 20 43 52 45  test 8.1 {.  CRE
2650: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 54  ATE TABLE t1(x T
2660: 45 58 54 29 3b 0a 20 20 43 52 45 41 54 45 20 49  EXT);.  CREATE I
2670: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 29  NDEX i1 ON t1(x)
2680: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2690: 74 31 20 56 41 4c 55 45 53 28 27 31 27 29 3b 0a  t1 VALUES('1');.
26a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
26b0: 20 56 41 4c 55 45 53 28 27 32 27 29 3b 0a 20 20   VALUES('2');.  
26c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
26d0: 41 4c 55 45 53 28 27 33 27 29 3b 0a 20 20 49 4e  ALUES('3');.  IN
26e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
26f0: 55 45 53 28 27 34 27 29 3b 0a 20 20 41 4e 41 4c  UES('4');.  ANAL
2700: 59 5a 45 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71  YZE;.}.do_execsq
2710: 6c 5f 74 65 73 74 20 38 2e 32 20 7b 0a 20 20 53  l_test 8.2 {.  S
2720: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2730: 57 48 45 52 45 20 78 20 3d 20 33 3b 0a 7d 20 7b  WHERE x = 3;.} {
2740: 33 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3}..#-----------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2790: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
27a0: 62 75 67 20 66 69 78 65 64 20 62 79 20 5b 39 31  bug fixed by [91
27b0: 37 33 33 62 63 34 38 35 5d 20 72 65 61 6c 6c 79  733bc485] really
27c0: 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 72 65 73   is fixed..#.res
27d0: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
27e0: 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 43 52  _test 9.1 {.  CR
27f0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2800: 20 62 2c 20 63 2c 20 64 2c 20 65 29 3b 0a 20 20   b, c, d, e);.  
2810: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
2820: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64  ON t1(a, b, c, d
2830: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
2840: 58 20 69 32 20 4f 4e 20 74 31 28 65 29 3b 0a 7d  X i2 ON t1(e);.}
2850: 0a 64 6f 5f 74 65 73 74 20 39 2e 32 20 7b 0a 20  .do_test 9.2 {. 
2860: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a   execsql BEGIN;.
2870: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
2880: 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72  {$i < 100} {incr
2890: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
28a0: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
28b0: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79  1 VALUES('x', 'y
28c0: 27 2c 20 27 7a 27 2c 20 24 69 2c 20 5b 65 78 70  ', 'z', $i, [exp
28d0: 72 20 24 69 2f 32 5d 29 22 0a 20 20 7d 0a 20 20  r $i/2])".  }.  
28e0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
28f0: 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72 20 69 7d  i < 20} {incr i}
2900: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
2910: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2920: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 2c 20  ALUES('x', 'y', 
2930: 27 7a 27 2c 20 31 30 31 2c 20 24 69 29 22 0a 20  'z', 101, $i)". 
2940: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
2950: 31 30 32 7d 20 7b 24 69 20 3c 20 32 30 30 7d 20  102} {$i < 200} 
2960: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
2970: 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49  xecsql "INSERT I
2980: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78  NTO t1 VALUES('x
2990: 27 2c 20 27 79 27 2c 20 27 7a 27 2c 20 24 69 2c  ', 'y', 'z', $i,
29a0: 20 5b 65 78 70 72 20 24 69 2f 32 5d 29 22 0a 20   [expr $i/2])". 
29b0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   }.  execsql COM
29c0: 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20 41 4e  MIT.  execsql AN
29d0: 41 4c 59 5a 45 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65  ALYZE.} {}..do_e
29e0: 71 70 5f 74 65 73 74 20 39 2e 33 2e 31 20 7b 0a  qp_test 9.3.1 {.
29f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2a00: 74 31 20 57 48 45 52 45 20 61 3d 27 78 27 20 41  t1 WHERE a='x' A
2a10: 4e 44 20 62 3d 27 79 27 20 41 4e 44 20 63 3d 27  ND b='y' AND c='
2a20: 7a 27 20 41 4e 44 20 64 3d 31 30 31 20 41 4e 44  z' AND d=101 AND
2a30: 20 65 3d 35 3b 0a 7d 20 7b 2f 74 31 20 55 53 49   e=5;.} {/t1 USI
2a40: 4e 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a 64 6f  NG INDEX i2/}.do
2a50: 5f 65 71 70 5f 74 65 73 74 20 39 2e 33 2e 32 20  _eqp_test 9.3.2 
2a60: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2a70: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 27 78 27  M t1 WHERE a='x'
2a80: 20 41 4e 44 20 62 3d 27 79 27 20 41 4e 44 20 63   AND b='y' AND c
2a90: 3d 27 7a 27 20 41 4e 44 20 64 3d 39 39 20 41 4e  ='z' AND d=99 AN
2aa0: 44 20 65 3d 35 3b 0a 7d 20 7b 2f 74 31 20 55 53  D e=5;.} {/t1 US
2ab0: 49 4e 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a 0a  ING INDEX i1/}..
2ac0: 73 65 74 20 76 61 6c 75 65 5f 64 20 5b 65 78 70  set value_d [exp
2ad0: 72 20 31 30 31 5d 0a 64 6f 5f 65 71 70 5f 74 65  r 101].do_eqp_te
2ae0: 73 74 20 39 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  st 9.4.1 {.  SEL
2af0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2b00: 45 52 45 20 61 3d 27 78 27 20 41 4e 44 20 62 3d  ERE a='x' AND b=
2b10: 27 79 27 20 41 4e 44 20 63 3d 27 7a 27 20 41 4e  'y' AND c='z' AN
2b20: 44 20 64 3d 24 76 61 6c 75 65 5f 64 20 41 4e 44  D d=$value_d AND
2b30: 20 65 3d 35 0a 7d 20 7b 2f 74 31 20 55 53 49 4e   e=5.} {/t1 USIN
2b40: 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a 73 65 74  G INDEX i2/}.set
2b50: 20 76 61 6c 75 65 5f 64 20 5b 65 78 70 72 20 39   value_d [expr 9
2b60: 39 5d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 39  9].do_eqp_test 9
2b70: 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.2 {.  SELECT 
2b80: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
2b90: 61 3d 27 78 27 20 41 4e 44 20 62 3d 27 79 27 20  a='x' AND b='y' 
2ba0: 41 4e 44 20 63 3d 27 7a 27 20 41 4e 44 20 64 3d  AND c='z' AND d=
2bb0: 24 76 61 6c 75 65 5f 64 20 41 4e 44 20 65 3d 35  $value_d AND e=5
2bc0: 0a 7d 20 7b 2f 74 31 20 55 53 49 4e 47 20 49 4e  .} {/t1 USING IN
2bd0: 44 45 58 20 69 31 2f 7d 0a 0a 23 2d 2d 2d 2d 2d  DEX i1/}..#-----
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
2c30: 74 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 74 61  t the planner ta
2c40: 6b 65 73 20 73 74 61 74 34 20 64 61 74 61 20 69  kes stat4 data i
2c50: 6e 74 6f 20 61 63 63 6f 75 6e 74 20 77 68 65 6e  nto account when
2c60: 20 63 6f 6e 73 69 64 65 72 69 6e 67 0a 23 20 22   considering.# "
2c70: 49 53 20 4e 55 4c 4c 22 20 61 6e 64 20 22 49 53  IS NULL" and "IS
2c80: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74   NOT NULL" const
2c90: 72 61 69 6e 74 73 2e 0a 23 0a 64 6f 5f 65 78 65  raints..#.do_exe
2ca0: 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 31 2e 31  csql_test 10.1.1
2cb0: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
2cc0: 49 46 20 45 58 49 53 54 53 20 74 33 3b 0a 20 20  IF EXISTS t3;.  
2cd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
2ce0: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
2cf0: 49 4e 44 45 58 20 74 33 61 20 4f 4e 20 74 33 28  INDEX t3a ON t3(
2d00: 61 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  a);.  CREATE IND
2d10: 45 58 20 74 33 62 20 4f 4e 20 74 33 28 62 29 3b  EX t3b ON t3(b);
2d20: 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 30 2e 31 2e  .}.do_test 10.1.
2d30: 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  2 {.  for {set i
2d40: 20 31 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b   1} {$i < 100} {
2d50: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 69 66  incr i} {.    if
2d60: 20 7b 24 69 3e 39 30 7d 20 7b 20 73 65 74 20 61   {$i>90} { set a
2d70: 20 24 69 20 7d 20 65 6c 73 65 20 7b 20 73 65 74   $i } else { set
2d80: 20 61 20 4e 55 4c 4c 20 7d 0a 20 20 20 20 73 65   a NULL }.    se
2d90: 74 20 62 20 5b 65 78 70 72 20 24 69 20 25 20 35  t b [expr $i % 5
2da0: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 49  ].    execsql "I
2db0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2dc0: 4c 55 45 53 28 24 61 2c 20 24 62 29 22 0a 20 20  LUES($a, $b)".  
2dd0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c  }.  execsql ANAL
2de0: 59 5a 45 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f  YZE.} {}.do_eqp_
2df0: 74 65 73 74 20 31 30 2e 31 2e 33 20 7b 0a 20 20  test 10.1.3 {.  
2e00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
2e10: 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c   WHERE a IS NULL
2e20: 20 41 4e 44 20 62 20 3d 20 32 0a 7d 20 7b 2f 74   AND b = 2.} {/t
2e30: 33 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 33  3 USING INDEX t3
2e40: 62 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  b/}.do_eqp_test 
2e50: 31 30 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  10.1.4 {.  SELEC
2e60: 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T * FROM t3 WHER
2e70: 45 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  E a IS NOT NULL 
2e80: 41 4e 44 20 62 20 3d 20 32 0a 7d 20 7b 2f 74 33  AND b = 2.} {/t3
2e90: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 33 61   USING INDEX t3a
2ea0: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
2eb0: 65 73 74 20 31 30 2e 32 2e 31 20 7b 0a 20 20 44  est 10.2.1 {.  D
2ec0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2ed0: 53 54 53 20 74 33 3b 0a 20 20 43 52 45 41 54 45  STS t3;.  CREATE
2ee0: 20 54 41 42 4c 45 20 74 33 28 78 2c 20 61 2c 20   TABLE t3(x, a, 
2ef0: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  b);.  CREATE IND
2f00: 45 58 20 74 33 61 20 4f 4e 20 74 33 28 78 2c 20  EX t3a ON t3(x, 
2f10: 61 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  a);.  CREATE IND
2f20: 45 58 20 74 33 62 20 4f 4e 20 74 33 28 78 2c 20  EX t3b ON t3(x, 
2f30: 62 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 30  b);.}.do_test 10
2f40: 2e 32 2e 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65  .2.2 {.  for {se
2f50: 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 31 30 30  t i 1} {$i < 100
2f60: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
2f70: 20 69 66 20 7b 24 69 3e 39 30 7d 20 7b 20 73 65   if {$i>90} { se
2f80: 74 20 61 20 24 69 20 7d 20 65 6c 73 65 20 7b 20  t a $i } else { 
2f90: 73 65 74 20 61 20 4e 55 4c 4c 20 7d 0a 20 20 20  set a NULL }.   
2fa0: 20 73 65 74 20 62 20 5b 65 78 70 72 20 24 69 20   set b [expr $i 
2fb0: 25 20 35 5d 0a 20 20 20 20 65 78 65 63 73 71 6c  % 5].    execsql
2fc0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33   "INSERT INTO t3
2fd0: 20 56 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 24   VALUES('xyz', $
2fe0: 61 2c 20 24 62 29 22 0a 20 20 7d 0a 20 20 65 78  a, $b)".  }.  ex
2ff0: 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 7d 20  ecsql ANALYZE.} 
3000: 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  {}.do_eqp_test 1
3010: 30 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  0.2.3 {.  SELECT
3020: 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   * FROM t3 WHERE
3030: 20 78 20 3d 20 27 78 79 7a 27 20 41 4e 44 20 61   x = 'xyz' AND a
3040: 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 62 20 3d   IS NULL AND b =
3050: 20 32 0a 7d 20 7b 2f 74 33 20 55 53 49 4e 47 20   2.} {/t3 USING 
3060: 49 4e 44 45 58 20 74 33 62 2f 7d 0a 64 6f 5f 65  INDEX t3b/}.do_e
3070: 71 70 5f 74 65 73 74 20 31 30 2e 32 2e 34 20 7b  qp_test 10.2.4 {
3080: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3090: 20 74 33 20 57 48 45 52 45 20 78 20 3d 20 27 78   t3 WHERE x = 'x
30a0: 79 7a 27 20 41 4e 44 20 61 20 49 53 20 4e 4f 54  yz' AND a IS NOT
30b0: 20 4e 55 4c 4c 20 41 4e 44 20 62 20 3d 20 32 0a   NULL AND b = 2.
30c0: 7d 20 7b 2f 74 33 20 55 53 49 4e 47 20 49 4e 44  } {/t3 USING IND
30d0: 45 58 20 74 33 61 2f 7d 0a 0a 23 2d 2d 2d 2d 2d  EX t3a/}..#-----
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
3130: 74 20 73 74 61 74 34 20 64 61 74 61 20 69 73 20  t stat4 data is 
3140: 75 73 65 64 20 63 6f 72 72 65 63 74 6c 79 20 77  used correctly w
3150: 69 74 68 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20  ith non-default 
3160: 63 6f 6c 6c 61 74 69 6f 6e 0a 23 20 73 65 71 75  collation.# sequ
3170: 65 6e 63 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  ences..#.foreach
3180: 20 7b 74 6e 20 73 63 68 65 6d 61 7d 20 7b 0a 20   {tn schema} {. 
3190: 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   1 {.    CREATE 
31a0: 54 41 42 4c 45 20 74 34 28 61 20 43 4f 4c 4c 41  TABLE t4(a COLLA
31b0: 54 45 20 6e 6f 63 61 73 65 2c 20 62 29 3b 0a 20  TE nocase, b);. 
31c0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
31d0: 74 34 61 20 4f 4e 20 74 34 28 61 29 3b 0a 20 20  t4a ON t4(a);.  
31e0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
31f0: 34 62 20 4f 4e 20 74 34 28 62 29 3b 0a 20 20 7d  4b ON t4(b);.  }
3200: 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54  .  2 {.    CREAT
3210: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
3220: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
3230: 45 58 20 74 34 61 20 4f 4e 20 74 34 28 61 20 43  EX t4a ON t4(a C
3240: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
3250: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
3260: 20 74 34 62 20 4f 4e 20 74 34 28 62 29 3b 0a 20   t4b ON t4(b);. 
3270: 20 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c   }.} {.  drop_al
3280: 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65  l_tables.  do_te
3290: 73 74 20 31 31 2e 24 74 6e 2e 31 20 7b 20 65 78  st 11.$tn.1 { ex
32a0: 65 63 73 71 6c 20 24 73 63 68 65 6d 61 20 7d 20  ecsql $schema } 
32b0: 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 31  {}..  do_test 11
32c0: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 6f 72  .$tn.2 {.    for
32d0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
32e0: 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   100} {incr i} {
32f0: 0a 20 20 20 20 20 20 69 66 20 7b 20 28 24 69 20  .      if { ($i 
3300: 25 20 31 30 29 3d 3d 30 20 7d 20 7b 20 73 65 74  % 10)==0 } { set
3310: 20 61 20 41 42 43 20 7d 20 65 6c 73 65 20 7b 20   a ABC } else { 
3320: 73 65 74 20 61 20 44 45 46 20 7d 0a 20 20 20 20  set a DEF }.    
3330: 20 20 73 65 74 20 62 20 5b 65 78 70 72 20 24 69    set b [expr $i
3340: 20 25 20 35 5d 0a 20 20 20 20 20 20 20 20 65 78   % 5].        ex
3350: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
3360: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 24 61  NTO t4 VALUES($a
3370: 2c 20 24 62 29 20 7d 0a 20 20 20 20 7d 0a 20 20  , $b) }.    }.  
3380: 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a    execsql ANALYZ
3390: 45 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 65  E.  } {}..  do_e
33a0: 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e 33  qp_test 11.$tn.3
33b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
33c0: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20  FROM t4 WHERE a 
33d0: 3d 20 27 64 65 66 27 20 41 4e 44 20 62 20 3d 20  = 'def' AND b = 
33e0: 33 3b 0a 20 20 7d 20 7b 2f 74 34 20 55 53 49 4e  3;.  } {/t4 USIN
33f0: 47 20 49 4e 44 45 58 20 74 34 62 2f 7d 0a 0a 20  G INDEX t4b/}.. 
3400: 20 69 66 20 7b 24 74 6e 3d 3d 31 7d 20 7b 0a 20   if {$tn==1} {. 
3410: 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45     set sql "SELE
3420: 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57 48 45  CT * FROM t4 WHE
3430: 52 45 20 61 20 3d 20 27 61 62 63 27 20 41 4e 44  RE a = 'abc' AND
3440: 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64 6f 5f   b = 3;".    do_
3450: 65 71 70 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e  eqp_test 11.$tn.
3460: 34 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49 4e  4 $sql {/t4 USIN
3470: 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 20 20  G INDEX t4a/}.  
3480: 7d 20 65 6c 73 65 20 7b 0a 0a 20 20 20 20 73 65  } else {..    se
3490: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20  t sql "SELECT * 
34a0: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20  FROM t4 WHERE a 
34b0: 3d 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45 20  = 'abc' COLLATE 
34c0: 6e 6f 63 61 73 65 20 41 4e 44 20 62 20 3d 20 33  nocase AND b = 3
34d0: 3b 22 0a 20 20 20 20 64 6f 5f 65 71 70 5f 74 65  ;".    do_eqp_te
34e0: 73 74 20 31 31 2e 24 74 6e 2e 35 20 24 73 71 6c  st 11.$tn.5 $sql
34f0: 20 7b 2f 74 34 20 55 53 49 4e 47 20 49 4e 44 45   {/t4 USING INDE
3500: 58 20 74 34 61 2f 7d 0a 0a 20 20 20 20 73 65 74  X t4a/}..    set
3510: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46   sql "SELECT * F
3520: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 61 20 43  ROM t4 WHERE a C
3530: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 3d 20  OLLATE nocase = 
3540: 27 61 62 63 27 20 41 4e 44 20 62 20 3d 20 33 3b  'abc' AND b = 3;
3550: 22 0a 20 20 20 20 64 6f 5f 65 71 70 5f 74 65 73  ".    do_eqp_tes
3560: 74 20 31 31 2e 24 74 6e 2e 36 20 24 73 71 6c 20  t 11.$tn.6 $sql 
3570: 7b 2f 74 34 20 55 53 49 4e 47 20 49 4e 44 45 58  {/t4 USING INDEX
3580: 20 74 34 61 2f 7d 0a 20 20 7d 0a 7d 0a 0a 66 6f   t4a/}.  }.}..fo
3590: 72 65 61 63 68 20 7b 74 6e 20 73 63 68 65 6d 61  reach {tn schema
35a0: 7d 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20 43 52  } {.  1 {.    CR
35b0: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c  EATE TABLE t4(x,
35c0: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
35d0: 65 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  e, b);.    CREAT
35e0: 45 20 49 4e 44 45 58 20 74 34 61 20 4f 4e 20 74  E INDEX t4a ON t
35f0: 34 28 78 2c 20 61 29 3b 0a 20 20 20 20 43 52 45  4(x, a);.    CRE
3600: 41 54 45 20 49 4e 44 45 58 20 74 34 62 20 4f 4e  ATE INDEX t4b ON
3610: 20 74 34 28 78 2c 20 62 29 3b 0a 20 20 7d 0a 20   t4(x, b);.  }. 
3620: 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   2 {.    CREATE 
3630: 54 41 42 4c 45 20 74 34 28 78 2c 20 61 2c 20 62  TABLE t4(x, a, b
3640: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
3650: 44 45 58 20 74 34 61 20 4f 4e 20 74 34 28 78 2c  DEX t4a ON t4(x,
3660: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
3670: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  e);.    CREATE I
3680: 4e 44 45 58 20 74 34 62 20 4f 4e 20 74 34 28 78  NDEX t4b ON t4(x
3690: 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20  , b);.  }.} {.  
36a0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
36b0: 20 20 64 6f 5f 74 65 73 74 20 31 32 2e 24 74 6e    do_test 12.$tn
36c0: 2e 31 20 7b 20 65 78 65 63 73 71 6c 20 24 73 63  .1 { execsql $sc
36d0: 68 65 6d 61 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f  hema } {}..  do_
36e0: 74 65 73 74 20 31 32 2e 24 74 6e 2e 32 20 7b 0a  test 12.$tn.2 {.
36f0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
3700: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
3710: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 69 66  cr i} {.      if
3720: 20 7b 20 28 24 69 20 25 20 31 30 29 3d 3d 30 20   { ($i % 10)==0 
3730: 7d 20 7b 20 73 65 74 20 61 20 41 42 43 20 7d 20  } { set a ABC } 
3740: 65 6c 73 65 20 7b 20 73 65 74 20 61 20 44 45 46  else { set a DEF
3750: 20 7d 0a 20 20 20 20 20 20 73 65 74 20 62 20 5b   }.      set b [
3760: 65 78 70 72 20 24 69 20 25 20 35 5d 0a 20 20 20  expr $i % 5].   
3770: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49       execsql { I
3780: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
3790: 4c 55 45 53 28 58 27 61 62 63 64 65 66 27 2c 20  LUES(X'abcdef', 
37a0: 24 61 2c 20 24 62 29 20 7d 0a 20 20 20 20 7d 0a  $a, $b) }.    }.
37b0: 20 20 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c      execsql ANAL
37c0: 59 5a 45 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f  YZE.  } {}..  do
37d0: 5f 65 71 70 5f 74 65 73 74 20 31 32 2e 24 74 6e  _eqp_test 12.$tn
37e0: 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .3 {.    SELECT 
37f0: 2a 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  * FROM t4 WHERE 
3800: 78 3d 58 27 61 62 63 64 65 66 27 20 41 4e 44 20  x=X'abcdef' AND 
3810: 61 20 3d 20 27 64 65 66 27 20 41 4e 44 20 62 20  a = 'def' AND b 
3820: 3d 20 33 3b 0a 20 20 7d 20 7b 2f 74 34 20 55 53  = 3;.  } {/t4 US
3830: 49 4e 47 20 49 4e 44 45 58 20 74 34 62 2f 7d 0a  ING INDEX t4b/}.
3840: 0a 20 20 69 66 20 7b 24 74 6e 3d 3d 31 7d 20 7b  .  if {$tn==1} {
3850: 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45  .    set sql "SE
3860: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
3870: 48 45 52 45 20 78 3d 58 27 61 62 63 64 65 66 27  HERE x=X'abcdef'
3880: 20 41 4e 44 20 61 20 3d 20 27 61 62 63 27 20 41   AND a = 'abc' A
3890: 4e 44 20 62 20 3d 20 33 3b 22 0a 20 20 20 20 64  ND b = 3;".    d
38a0: 6f 5f 65 71 70 5f 74 65 73 74 20 31 32 2e 24 74  o_eqp_test 12.$t
38b0: 6e 2e 34 20 24 73 71 6c 20 7b 2f 74 34 20 55 53  n.4 $sql {/t4 US
38c0: 49 4e 47 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a  ING INDEX t4a/}.
38d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
38e0: 65 74 20 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  et sql {.      S
38f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20  ELECT * FROM t4 
3900: 57 48 45 52 45 20 78 3d 58 27 61 62 63 64 65 66  WHERE x=X'abcdef
3910: 27 20 41 4e 44 20 61 20 3d 20 27 61 62 63 27 20  ' AND a = 'abc' 
3920: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 41  COLLATE nocase A
3930: 4e 44 20 62 20 3d 20 33 0a 20 20 20 20 7d 0a 20  ND b = 3.    }. 
3940: 20 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31     do_eqp_test 1
3950: 32 2e 24 74 6e 2e 35 20 24 73 71 6c 20 7b 2f 74  2.$tn.5 $sql {/t
3960: 34 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 34  4 USING INDEX t4
3970: 61 2f 7d 0a 20 20 20 20 73 65 74 20 73 71 6c 20  a/}.    set sql 
3980: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3990: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78   FROM t4 WHERE x
39a0: 3d 58 27 61 62 63 64 65 66 27 20 41 4e 44 20 61  =X'abcdef' AND a
39b0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
39c0: 3d 20 27 61 62 63 27 20 41 4e 44 20 62 20 3d 20  = 'abc' AND b = 
39d0: 33 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f 65  3.    }.    do_e
39e0: 71 70 5f 74 65 73 74 20 31 32 2e 24 74 6e 2e 36  qp_test 12.$tn.6
39f0: 20 24 73 71 6c 20 7b 2f 74 34 20 55 53 49 4e 47   $sql {/t4 USING
3a00: 20 49 4e 44 45 58 20 74 34 61 2f 7d 0a 20 20 7d   INDEX t4a/}.  }
3a10: 0a 7d 0a 0a 23 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 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3a60: 20 43 68 65 63 6b 20 74 68 61 74 20 61 66 66 69   Check that affi
3a70: 6e 69 74 69 65 73 20 61 72 65 20 74 61 6b 65 6e  nities are taken
3a80: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 77 68   into account wh
3a90: 65 6e 20 75 73 69 6e 67 20 73 74 61 74 34 20 64  en using stat4 d
3aa0: 61 74 61 20 74 6f 0a 23 20 65 73 74 69 6d 61 74  ata to.# estimat
3ab0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
3ac0: 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
3ad0: 61 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69  a rowid constrai
3ae0: 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  nt..#.drop_all_t
3af0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 31 33  ables.do_test 13
3b00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
3b10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3b20: 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64 29  E t1(a, b, c, d)
3b30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
3b40: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
3b50: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
3b60: 20 69 32 20 4f 4e 20 74 31 28 62 2c 20 63 29 3b   i2 ON t1(b, c);
3b70: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
3b80: 69 20 30 7d 20 7b 24 69 3c 31 30 30 7d 20 7b 69  i 0} {$i<100} {i
3b90: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 69 66 20  ncr i} {.    if 
3ba0: 7b 24 69 20 25 32 7d 20 7b 73 65 74 20 61 20 61  {$i %2} {set a a
3bb0: 62 63 7d 20 65 6c 73 65 20 7b 73 65 74 20 61 20  bc} else {set a 
3bc0: 64 65 66 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  def}.    execsql
3bd0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3be0: 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  1(rowid, a, b, c
3bf0: 29 20 56 41 4c 55 45 53 28 24 69 2c 20 24 61 2c  ) VALUES($i, $a,
3c00: 20 24 69 2c 20 24 69 29 20 7d 0a 20 20 7d 0a 20   $i, $i) }.  }. 
3c10: 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45   execsql ANALYZE
3c20: 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  .} {}.do_eqp_tes
3c30: 74 20 31 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c  t 13.2.1 {.  SEL
3c40: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
3c50: 45 52 45 20 61 3d 27 61 62 63 27 20 41 4e 44 20  ERE a='abc' AND 
3c60: 72 6f 77 69 64 3c 31 35 20 41 4e 44 20 62 3c 31  rowid<15 AND b<1
3c70: 32 0a 7d 20 7b 2f 53 45 41 52 43 48 20 54 41 42  2.} {/SEARCH TAB
3c80: 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45  LE t1 USING INDE
3c90: 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65  X i1/}.do_eqp_te
3ca0: 73 74 20 31 33 2e 32 2e 32 20 7b 0a 20 20 53 45  st 13.2.2 {.  SE
3cb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
3cc0: 48 45 52 45 20 61 3d 27 61 62 63 27 20 41 4e 44  HERE a='abc' AND
3cd0: 20 72 6f 77 69 64 3c 27 31 35 27 20 41 4e 44 20   rowid<'15' AND 
3ce0: 62 3c 31 32 0a 7d 20 7b 2f 53 45 41 52 43 48 20  b<12.} {/SEARCH 
3cf0: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49  TABLE t1 USING I
3d00: 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71 70  NDEX i1/}.do_eqp
3d10: 5f 74 65 73 74 20 31 33 2e 33 2e 31 20 7b 0a 20  _test 13.3.1 {. 
3d20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3d30: 31 20 57 48 45 52 45 20 61 3d 27 61 62 63 27 20  1 WHERE a='abc' 
3d40: 41 4e 44 20 72 6f 77 69 64 3c 31 30 30 20 41 4e  AND rowid<100 AN
3d50: 44 20 62 3c 31 32 0a 7d 20 7b 2f 53 45 41 52 43  D b<12.} {/SEARC
3d60: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
3d70: 20 49 4e 44 45 58 20 69 32 2f 7d 0a 64 6f 5f 65   INDEX i2/}.do_e
3d80: 71 70 5f 74 65 73 74 20 31 33 2e 33 2e 32 20 7b  qp_test 13.3.2 {
3d90: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3da0: 20 74 31 20 57 48 45 52 45 20 61 3d 27 61 62 63   t1 WHERE a='abc
3db0: 27 20 41 4e 44 20 72 6f 77 69 64 3c 27 31 30 30  ' AND rowid<'100
3dc0: 27 20 41 4e 44 20 62 3c 31 32 0a 7d 20 7b 2f 53  ' AND b<12.} {/S
3dd0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
3de0: 53 49 4e 47 20 49 4e 44 45 58 20 69 32 2f 7d 0a  SING INDEX i2/}.
3df0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
3e40: 65 63 6b 20 61 6c 73 6f 20 74 68 61 74 20 61 66  eck also that af
3e50: 66 69 6e 69 74 69 65 73 20 61 72 65 20 74 61 6b  finities are tak
3e60: 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  en into account 
3e70: 77 68 65 6e 20 75 73 69 6e 67 20 73 74 61 74 34  when using stat4
3e80: 20 64 61 74 61 20 0a 23 20 74 6f 20 65 73 74 69   data .# to esti
3e90: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
3ea0: 6f 66 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  of rows scanned 
3eb0: 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
3ec0: 73 74 72 61 69 6e 74 20 6f 6e 20 61 20 0a 23 20  straint on a .# 
3ed0: 63 6f 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61  column other tha
3ee0: 6e 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 2e 0a  n the leftmost..
3ef0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
3f00: 73 0a 64 6f 5f 74 65 73 74 20 31 34 2e 31 20 7b  s.do_test 14.1 {
3f10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
3f20: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3f30: 62 20 49 4e 54 45 47 45 52 2c 20 63 29 20 7d 0a  b INTEGER, c) }.
3f40: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
3f50: 7b 24 69 3c 31 30 30 7d 20 7b 69 6e 63 72 20 69  {$i<100} {incr i
3f60: 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 20 5b 65  } {.    set c [e
3f70: 78 70 72 20 24 69 20 25 20 33 5d 0a 20 20 20 20  xpr $i % 3].    
3f80: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3f90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3fa0: 27 6f 74 74 27 2c 20 24 69 2c 20 24 63 29 20 7d  'ott', $i, $c) }
3fb0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
3fc0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
3fd0: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29  X i1 ON t1(a, b)
3fe0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
3ff0: 45 58 20 69 32 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i2 ON t1(c);.
4000: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d      ANALYZE;.  }
4010: 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  .} {}.do_eqp_tes
4020: 74 20 31 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c  t 13.2.1 {.  SEL
4030: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
4040: 45 52 45 20 61 3d 27 6f 74 74 27 20 41 4e 44 20  ERE a='ott' AND 
4050: 62 3c 31 30 20 41 4e 44 20 63 3d 31 0a 7d 20 7b  b<10 AND c=1.} {
4060: 2f 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  /SEARCH TABLE t1
4070: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 2f   USING INDEX i1/
4080: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 33  }.do_eqp_test 13
4090: 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.2 {.  SELECT 
40a0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
40b0: 61 3d 27 6f 74 74 27 20 41 4e 44 20 62 3c 27 31  a='ott' AND b<'1
40c0: 30 27 20 41 4e 44 20 63 3d 31 0a 7d 20 7b 2f 53  0' AND c=1.} {/S
40d0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
40e0: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 2f 7d 0a  SING INDEX i1/}.
40f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 42 79  -----------.# By
4140: 20 64 65 66 61 75 6c 74 2c 20 31 36 20 6e 6f 6e   default, 16 non
4150: 2d 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65  -periodic sample
4160: 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20  s are collected 
4170: 66 6f 72 20 74 68 65 20 73 74 61 74 34 20 74 61  for the stat4 ta
4180: 62 6c 65 2e 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ble..# The follo
4190: 77 69 6e 67 20 74 65 73 74 73 20 61 74 74 65 6d  wing tests attem
41a0: 70 74 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  pt to verify tha
41b0: 74 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  t the most commo
41c0: 6e 20 6b 65 79 73 20 61 72 65 0a 23 20 62 65 69  n keys are.# bei
41d0: 6e 67 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 23 0a  ng collected..#.
41e0: 70 72 6f 63 20 63 68 65 63 6b 5f 73 74 61 74 34  proc check_stat4
41f0: 20 7b 74 6e 7d 20 7b 0a 20 20 64 62 20 65 76 61   {tn} {.  db eva
4200: 6c 20 41 4e 41 4c 59 5a 45 0a 20 20 64 62 20 65  l ANALYZE.  db e
4210: 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20 62  val {SELECT a, b
4220: 2c 20 63 2c 20 64 20 46 52 4f 4d 20 74 31 7d 20  , c, d FROM t1} 
4230: 7b 0a 20 20 20 20 69 6e 63 72 20 6b 28 24 61 29  {.    incr k($a)
4240: 0a 20 20 20 20 69 6e 63 72 20 6b 28 5b 6c 69 73  .    incr k([lis
4250: 74 20 24 61 20 24 62 5d 29 0a 20 20 20 20 69 6e  t $a $b]).    in
4260: 63 72 20 6b 28 5b 6c 69 73 74 20 24 61 20 24 62  cr k([list $a $b
4270: 20 24 63 5d 29 0a 20 20 20 20 69 66 20 7b 20 5b   $c]).    if { [
4280: 69 6e 66 6f 20 65 78 69 73 74 73 20 6b 28 5b 6c  info exists 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 5d 3d 3d 30 20 7d 20 7b 20 69 6e 63 72 20 6e  )]==0 } { incr n
42b0: 52 6f 77 20 7d 0a 20 20 20 20 69 6e 63 72 20 6b  Row }.    incr k
42c0: 28 5b 6c 69 73 74 20 24 61 20 24 62 20 24 63 20  ([list $a $b $c 
42d0: 24 64 5d 29 0a 20 20 7d 0a 0a 20 20 73 65 74 20  $d]).  }..  set 
42e0: 4c 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  L [list].  forea
42f0: 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20 6e 61  ch key [array na
4300: 6d 65 73 20 6b 5d 20 7b 0a 20 20 20 20 6c 61 70  mes k] {.    lap
4310: 70 65 6e 64 20 4c 20 5b 6c 69 73 74 20 24 6b 28  pend L [list $k(
4320: 24 6b 65 79 29 20 24 6b 65 79 5d 0a 20 20 7d 0a  $key) $key].  }.
4330: 0a 20 20 73 65 74 20 6e 53 61 6d 70 6c 65 20 24  .  set nSample $
4340: 6e 52 6f 77 0a 20 20 69 66 20 7b 24 6e 53 61 6d  nRow.  if {$nSam
4350: 70 6c 65 3e 31 36 7d 20 7b 73 65 74 20 6e 53 61  ple>16} {set nSa
4360: 6d 70 6c 65 20 31 36 7d 0a 0a 20 20 73 65 74 20  mple 16}..  set 
4370: 6e 54 68 72 65 73 68 6f 6c 64 20 5b 6c 69 6e 64  nThreshold [lind
4380: 65 78 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 20  ex [lsort -decr 
4390: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 64 65 78 20  -integer -index 
43a0: 30 20 24 4c 5d 20 5b 65 78 70 72 20 24 6e 53 61  0 $L] [expr $nSa
43b0: 6d 70 6c 65 2d 31 5d 20 30 5d 0a 20 20 66 6f 72  mple-1] 0].  for
43c0: 65 61 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20  each key [array 
43d0: 6e 61 6d 65 73 20 6b 5d 20 7b 0a 20 20 20 20 69  names k] {.    i
43e0: 66 20 7b 24 6b 28 24 6b 65 79 29 3e 24 6e 54 68  f {$k($key)>$nTh
43f0: 72 65 73 68 6f 6c 64 7d 20 7b 0a 20 20 20 20 20  reshold} {.     
4400: 20 73 65 74 20 65 78 70 65 63 74 28 24 6b 65 79   set expect($key
4410: 29 20 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ) 1.    }.    if
4420: 20 7b 24 6b 28 24 6b 65 79 29 3d 3d 24 6e 54 68   {$k($key)==$nTh
4430: 72 65 73 68 6f 6c 64 7d 20 7b 0a 20 20 20 20 20  reshold} {.     
4440: 20 73 65 74 20 70 6f 73 73 69 62 6c 65 28 24 6b   set possible($k
4450: 65 79 29 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a  ey) 1.    }.  }.
4460: 0a 0a 20 20 73 65 74 20 6e 50 6f 73 73 69 62 6c  ..  set nPossibl
4470: 65 20 5b 65 78 70 72 20 24 6e 53 61 6d 70 6c 65  e [expr $nSample
4480: 20 2d 20 5b 6c 6c 65 6e 67 74 68 20 5b 61 72 72   - [llength [arr
4490: 61 79 20 6e 61 6d 65 73 20 65 78 70 65 63 74 5d  ay names expect]
44a0: 5d 5d 0a 0a 20 20 23 70 75 74 73 20 22 45 58 50  ]]..  #puts "EXP
44b0: 45 43 54 3a 20 5b 61 72 72 61 79 20 6e 61 6d 65  ECT: [array name
44c0: 73 20 65 78 70 65 63 74 5d 22 0a 20 20 23 70 75  s expect]".  #pu
44d0: 74 73 20 22 50 4f 53 53 49 42 4c 45 28 24 6e 50  ts "POSSIBLE($nP
44e0: 6f 73 73 69 62 6c 65 2f 5b 61 72 72 61 79 20 73  ossible/[array s
44f0: 69 7a 65 20 70 6f 73 73 69 62 6c 65 5d 29 3a 20  ize possible]): 
4500: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 70 6f 73  [array names pos
4510: 73 69 62 6c 65 5d 22 0a 20 20 23 70 75 74 73 20  sible]".  #puts 
4520: 22 48 41 56 45 3a 20 5b 64 62 20 65 76 61 6c 20  "HAVE: [db eval 
4530: 7b 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65 63  {SELECT test_dec
4540: 6f 64 65 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d  ode(sample) FROM
4550: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 57 48   sqlite_stat4 WH
4560: 45 52 45 20 69 64 78 3d 27 69 31 27 7d 5d 22 0a  ERE idx='i1'}]".
4570: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
4580: 43 54 20 74 65 73 74 5f 64 65 63 6f 64 65 28 73  CT test_decode(s
4590: 61 6d 70 6c 65 29 20 41 53 20 73 20 46 52 4f 4d  ample) AS s FROM
45a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 57 48   sqlite_stat4 WH
45b0: 45 52 45 20 69 64 78 3d 27 69 31 27 7d 20 7b 0a  ERE idx='i1'} {.
45c0: 20 20 20 20 73 65 74 20 73 65 65 6e 20 30 0a 20      set seen 0. 
45d0: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
45e0: 20 7b 24 69 3c 34 7d 20 7b 69 6e 63 72 20 69 7d   {$i<4} {incr i}
45f0: 20 7b 0a 20 20 20 20 20 20 75 6e 73 65 74 20 2d   {.      unset -
4600: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 65 78 70 65 63  nocomplain expec
4610: 74 28 5b 6c 72 61 6e 67 65 20 24 73 20 30 20 24  t([lrange $s 0 $
4620: 69 5d 29 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  i]).      if {[i
4630: 6e 66 6f 20 65 78 69 73 74 73 20 70 6f 73 73 69  nfo exists possi
4640: 62 6c 65 28 5b 6c 72 61 6e 67 65 20 24 73 20 30  ble([lrange $s 0
4650: 20 24 69 5d 29 5d 7d 20 7b 0a 20 20 20 20 20 20   $i])]} {.      
4660: 20 20 73 65 74 20 73 65 65 6e 20 31 0a 20 20 20    set seen 1.   
4670: 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
4680: 6d 70 6c 61 69 6e 20 70 6f 73 73 69 62 6c 65 28  mplain possible(
4690: 5b 6c 72 61 6e 67 65 20 24 73 20 30 20 24 69 5d  [lrange $s 0 $i]
46a0: 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ).      }.    }.
46b0: 20 20 20 20 69 66 20 7b 24 73 65 65 6e 7d 20 7b      if {$seen} {
46c0: 69 6e 63 72 20 6e 50 6f 73 73 69 62 6c 65 20 2d  incr nPossible -
46d0: 31 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 6e 50  1}.  }.  if {$nP
46e0: 6f 73 73 69 62 6c 65 3c 30 7d 20 7b 73 65 74 20  ossible<0} {set 
46f0: 6e 50 6f 73 73 69 62 6c 65 20 30 7d 0a 0a 20 20  nPossible 0}..  
4700: 73 65 74 20 72 65 73 20 5b 6c 69 73 74 20 5b 6c  set res [list [l
4710: 6c 65 6e 67 74 68 20 5b 61 72 72 61 79 20 6e 61  length [array na
4720: 6d 65 73 20 65 78 70 65 63 74 5d 5d 20 24 6e 50  mes expect]] $nP
4730: 6f 73 73 69 62 6c 65 5d 0a 20 20 75 70 6c 65 76  ossible].  uplev
4740: 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65 73 74  el [list do_test
4750: 20 24 74 6e 20 5b 6c 69 73 74 20 73 65 74 20 7b   $tn [list set {
4760: 7d 20 24 72 65 73 5d 20 7b 30 20 30 7d 5d 0a 7d  } $res] {0 0}].}
4770: 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  ..drop_all_table
4780: 73 0a 64 6f 5f 74 65 73 74 20 31 34 2e 31 2e 31  s.do_test 14.1.1
4790: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
47a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
47b0: 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
47c0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
47d0: 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b   ON t1(a,b,c,d);
47e0: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
47f0: 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 30 7d 20  i 0} {$i < 160} 
4800: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
4810: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
4820: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
4830: 69 2c 24 69 2c 24 69 2c 24 69 29 20 7d 0a 20 20  i,$i,$i,$i) }.  
4840: 20 20 69 66 20 7b 28 24 69 20 25 20 31 30 29 3d    if {($i % 10)=
4850: 3d 30 7d 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  =0} { execsql { 
4860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4870: 41 4c 55 45 53 28 24 69 2c 24 69 2c 24 69 2c 24  ALUES($i,$i,$i,$
4880: 69 29 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a  i) } }.  }.} {}.
4890: 63 68 65 63 6b 5f 73 74 61 74 34 20 31 34 2e 31  check_stat4 14.1
48a0: 2e 32 0a 0a 64 6f 5f 74 65 73 74 20 31 34 2e 32  .2..do_test 14.2
48b0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
48c0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
48d0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
48e0: 7d 20 7b 24 69 20 3c 20 31 36 30 30 7d 20 7b 69  } {$i < 1600} {i
48f0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
4900: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
4910: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2f  TO t1 VALUES($i/
4920: 31 30 2c 24 69 2f 31 37 2c 24 69 2f 32 37 2c 24  10,$i/17,$i/27,$
4930: 69 2f 33 37 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d  i/37) }.  }.} {}
4940: 0a 63 68 65 63 6b 5f 73 74 61 74 34 20 31 34 2e  .check_stat4 14.
4950: 32 2e 32 0a 0a 64 6f 5f 74 65 73 74 20 31 34 2e  2.2..do_test 14.
4960: 33 2e 31 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74  3.1 {.  for {set
4970: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 7d 20   i 0} {$i < 10} 
4980: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
4990: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
49a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
49b0: 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30  i*50,$i*50,$i*50
49c0: 2c 24 69 2a 35 30 29 20 7d 0a 20 20 20 20 65 78  ,$i*50) }.    ex
49d0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
49e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
49f0: 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c  *50,$i*50,$i*50,
4a00: 24 69 2a 35 30 29 20 7d 0a 20 20 20 20 65 78 65  $i*50) }.    exe
4a10: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
4a20: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2a  TO t1 VALUES($i*
4a30: 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24  50,$i*50,$i*50,$
4a40: 69 2a 35 30 29 20 7d 0a 20 20 20 20 65 78 65 63  i*50) }.    exec
4a50: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
4a60: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35  O t1 VALUES($i*5
4a70: 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69  0,$i*50,$i*50,$i
4a80: 2a 35 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73  *50) }.    execs
4a90: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4aa0: 20 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30   t1 VALUES($i*50
4ab0: 2c 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a  ,$i*50,$i*50,$i*
4ac0: 35 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71  50) }.    execsq
4ad0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4ae0: 74 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c  t1 VALUES($i*50,
4af0: 24 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35  $i*50,$i*50,$i*5
4b00: 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  0) }.    execsql
4b10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4b20: 31 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24  1 VALUES($i*50,$
4b30: 69 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30  i*50,$i*50,$i*50
4b40: 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ) }.    execsql 
4b50: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
4b60: 20 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69   VALUES($i*50,$i
4b70: 2a 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29  *50,$i*50,$i*50)
4b80: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
4b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4ba0: 56 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69 2a  VALUES($i*50,$i*
4bb0: 35 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29 20  50,$i*50,$i*50) 
4bc0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
4bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4be0: 41 4c 55 45 53 28 24 69 2a 35 30 2c 24 69 2a 35  ALUES($i*50,$i*5
4bf0: 30 2c 24 69 2a 35 30 2c 24 69 2a 35 30 29 20 7d  0,$i*50,$i*50) }
4c00: 0a 20 20 7d 0a 7d 20 7b 7d 0a 63 68 65 63 6b 5f  .  }.} {}.check_
4c10: 73 74 61 74 34 20 31 34 2e 33 2e 32 0a 0a 64 6f  stat4 14.3.2..do
4c20: 5f 74 65 73 74 20 31 34 2e 34 2e 31 20 7b 0a 20  _test 14.4.1 {. 
4c30: 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45   execsql {DELETE
4c40: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 66 6f 72 20   FROM t1}.  for 
4c50: 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 20  {set i 1} {$i < 
4c60: 31 36 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  160} {incr i} {.
4c70: 20 20 20 20 73 65 74 20 62 20 5b 65 78 70 72 20      set b [expr 
4c80: 24 69 20 25 20 31 30 5d 0a 20 20 20 20 69 66 20  $i % 10].    if 
4c90: 7b 24 62 3d 3d 30 20 7c 7c 20 24 62 3d 3d 32 7d  {$b==0 || $b==2}
4ca0: 20 7b 73 65 74 20 62 20 31 7d 0a 20 20 20 20 65   {set b 1}.    e
4cb0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
4cc0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
4cd0: 69 2f 31 30 2c 24 62 2c 24 69 2c 24 69 29 20 7d  i/10,$b,$i,$i) }
4ce0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 63 68 65 63 6b 5f  .  }.} {}.check_
4cf0: 73 74 61 74 34 20 31 34 2e 34 2e 32 0a 64 62 20  stat4 14.4.2.db 
4d00: 66 75 6e 63 20 6c 72 61 6e 67 65 20 6c 72 61 6e  func lrange lran
4d10: 67 65 0a 64 62 20 66 75 6e 63 20 6c 69 6e 64 65  ge.db func linde
4d20: 78 20 6c 69 6e 64 65 78 0a 64 6f 5f 65 78 65 63  x lindex.do_exec
4d30: 73 71 6c 5f 74 65 73 74 20 31 34 2e 34 2e 33 20  sql_test 14.4.3 
4d40: 7b 0a 20 20 53 45 4c 45 43 54 20 6c 72 61 6e 67  {.  SELECT lrang
4d50: 65 28 74 65 73 74 5f 64 65 63 6f 64 65 28 73 61  e(test_decode(sa
4d60: 6d 70 6c 65 29 2c 20 30 2c 20 31 29 20 41 53 20  mple), 0, 1) AS 
4d70: 73 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  s FROM sqlite_st
4d80: 61 74 34 0a 20 20 57 48 45 52 45 20 6c 69 6e 64  at4.  WHERE lind
4d90: 65 78 28 73 2c 20 31 29 3d 3d 27 31 27 20 4f 52  ex(s, 1)=='1' OR
4da0: 44 45 52 20 42 59 20 72 6f 77 69 64 0a 7d 20 7b  DER BY rowid.} {
4db0: 0a 20 20 7b 30 20 31 7d 20 7b 31 20 31 7d 20 7b  .  {0 1} {1 1} {
4dc0: 32 20 31 7d 20 7b 33 20 31 7d 20 0a 20 20 7b 34  2 1} {3 1} .  {4
4dd0: 20 31 7d 20 7b 35 20 31 7d 20 7b 36 20 31 7d 20   1} {5 1} {6 1} 
4de0: 7b 37 20 31 7d 20 0a 20 20 7b 38 20 31 7d 20 7b  {7 1} .  {8 1} {
4df0: 39 20 31 7d 20 7b 31 30 20 31 7d 20 7b 31 31 20  9 1} {10 1} {11 
4e00: 31 7d 20 0a 20 20 7b 31 32 20 31 7d 20 7b 31 33  1} .  {12 1} {13
4e10: 20 31 7d 20 7b 31 34 20 31 7d 20 7b 31 35 20 31   1} {14 1} {15 1
4e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4e70: 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f 74 68  # Test that noth
4e80: 69 6e 67 20 75 6e 74 6f 77 61 72 64 20 68 61 70  ing untoward hap
4e90: 70 65 6e 73 20 69 66 20 74 68 65 20 73 74 61 74  pens if the stat
4ea0: 34 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  4 table contains
4eb0: 20 65 6e 74 72 69 65 73 0a 23 20 66 6f 72 20 69   entries.# for i
4ec0: 6e 64 65 78 65 73 20 74 68 61 74 20 64 6f 20 6e  ndexes that do n
4ed0: 6f 74 20 65 78 69 73 74 2e 20 4f 72 20 4e 55 4c  ot exist. Or NUL
4ee0: 4c 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  L values in the 
4ef0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 0a 23 20 4f 72  idx column..# Or
4f00: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20   NULL values in 
4f10: 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
4f20: 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 72 6f 70   columns..#.drop
4f30: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
4f40: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31  xecsql_test 15.1
4f50: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
4f60: 45 20 78 31 28 61 2c 20 62 2c 20 55 4e 49 51 55  E x1(a, b, UNIQU
4f70: 45 28 61 2c 20 62 29 29 3b 0a 20 20 49 4e 53 45  E(a, b));.  INSE
4f80: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
4f90: 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  S(1, 2);.  INSER
4fa0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
4fb0: 28 33 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54  (3, 4);.  INSERT
4fc0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
4fd0: 35 2c 20 36 29 3b 0a 20 20 41 4e 41 4c 59 5a 45  5, 6);.  ANALYZE
4fe0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
4ff0: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 56 41 4c  sqlite_stat4 VAL
5000: 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  UES(NULL, NULL, 
5010: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
5020: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 64 62 20 63 6c  , NULL);.}.db cl
5030: 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74  ose.sqlite3 db t
5040: 65 73 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71  est.db.do_execsq
5050: 6c 5f 74 65 73 74 20 31 35 2e 32 20 7b 20 53 45  l_test 15.2 { SE
5060: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d  LECT * FROM x1 }
5070: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
5080: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5090: 31 35 2e 33 20 7b 0a 20 20 49 4e 53 45 52 54 20  15.3 {.  INSERT 
50a0: 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74 61 74  INTO sqlite_stat
50b0: 34 20 56 41 4c 55 45 53 28 34 32 2c 20 34 32 2c  4 VALUES(42, 42,
50c0: 20 34 32 2c 20 34 32 2c 20 34 32 2c 20 34 32 29   42, 42, 42, 42)
50d0: 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c  ;.}.db close.sql
50e0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
50f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5100: 31 35 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20  15.4 { SELECT * 
5110: 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32 20 33  FROM x1 } {1 2 3
5120: 20 34 20 35 20 36 7d 0a 0a 64 6f 5f 65 78 65 63   4 5 6}..do_exec
5130: 73 71 6c 5f 74 65 73 74 20 31 35 2e 35 20 7b 0a  sql_test 15.5 {.
5140: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
5150: 73 74 61 74 31 20 53 45 54 20 73 74 61 74 20 3d  stat1 SET stat =
5160: 20 4e 55 4c 4c 3b 0a 7d 0a 64 62 20 63 6c 6f 73   NULL;.}.db clos
5170: 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  e.sqlite3 db tes
5180: 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t.db.do_execsql_
5190: 74 65 73 74 20 31 35 2e 36 20 7b 20 53 45 4c 45  test 15.6 { SELE
51a0: 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b  CT * FROM x1 } {
51b0: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 64 6f  1 2 3 4 5 6}..do
51c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
51d0: 2e 37 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a  .7 {.  ANALYZE;.
51e0: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
51f0: 73 74 61 74 31 20 53 45 54 20 74 62 6c 20 3d 20  stat1 SET tbl = 
5200: 27 6e 6f 20 73 75 63 68 20 74 62 6c 27 3b 0a 7d  'no such tbl';.}
5210: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
5220: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
5230: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e  execsql_test 15.
5240: 38 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  8 { SELECT * FRO
5250: 4d 20 78 31 20 7d 20 7b 31 20 32 20 33 20 34 20  M x1 } {1 2 3 4 
5260: 35 20 36 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  5 6}..do_execsql
5270: 5f 74 65 73 74 20 31 35 2e 39 20 7b 0a 20 20 41  _test 15.9 {.  A
5280: 4e 41 4c 59 5a 45 3b 0a 20 20 55 50 44 41 54 45  NALYZE;.  UPDATE
5290: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 53 45   sqlite_stat4 SE
52a0: 54 20 6e 65 71 20 3d 20 4e 55 4c 4c 2c 20 6e 6c  T neq = NULL, nl
52b0: 74 3d 4e 55 4c 4c 2c 20 6e 64 6c 74 3d 4e 55 4c  t=NULL, ndlt=NUL
52c0: 4c 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71  L;.}.db close.sq
52d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
52e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
52f0: 20 31 35 2e 31 30 20 7b 20 53 45 4c 45 43 54 20   15.10 { SELECT 
5300: 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31 20 32  * FROM x1 } {1 2
5310: 20 33 20 34 20 35 20 36 7d 0a 0a 23 20 54 68 69   3 4 5 6}..# Thi
5320: 73 20 69 73 20 6a 75 73 74 20 66 6f 72 20 63 6f  s is just for co
5330: 76 65 72 61 67 65 2e 2e 2e 2e 0a 64 6f 5f 65 78  verage.....do_ex
5340: 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 31  ecsql_test 15.11
5350: 20 7b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20   {.  ANALYZE;.  
5360: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74  UPDATE sqlite_st
5370: 61 74 31 20 53 45 54 20 73 74 61 74 20 3d 20 73  at1 SET stat = s
5380: 74 61 74 20 7c 7c 20 27 20 75 6e 6f 72 64 65 72  tat || ' unorder
5390: 65 64 27 3b 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  ed';.}.db close.
53a0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
53b0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
53c0: 73 74 20 31 35 2e 31 32 20 7b 20 53 45 4c 45 43  st 15.12 { SELEC
53d0: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 7b 31  T * FROM x1 } {1
53e0: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 2d 2d   2 3 4 5 6}..#--
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
5440: 68 61 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  hat allocations 
5450: 75 73 65 64 20 66 6f 72 20 73 71 6c 69 74 65 5f  used for sqlite_
5460: 73 74 61 74 34 20 73 61 6d 70 6c 65 73 20 61 72  stat4 samples ar
5470: 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 23 20  e included in.# 
5480: 74 68 65 20 71 75 61 6e 74 69 74 79 20 72 65 74  the quantity ret
5490: 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  urned by SQLITE_
54a0: 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f  DBSTATUS_SCHEMA_
54b0: 55 53 45 44 2e 0a 23 0a 73 65 74 20 6f 6e 65 20  USED..#.set one 
54c0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
54d0: 20 31 30 30 30 5d 0a 73 65 74 20 74 77 6f 20 5b   1000].set two [
54e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
54f0: 32 30 30 30 5d 0a 64 6f 5f 74 65 73 74 20 31 36  2000].do_test 16
5500: 2e 31 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  .1 {.  reset_db.
5510: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5520: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5530: 61 2c 20 55 4e 49 51 55 45 28 61 29 29 3b 0a 20  a, UNIQUE(a));. 
5540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5550: 31 20 56 41 4c 55 45 53 28 24 6f 6e 65 29 3b 0a  1 VALUES($one);.
5560: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d      ANALYZE;.  }
5570: 0a 20 20 73 65 74 20 6e 42 79 74 65 20 5b 6c 69  .  set nByte [li
5580: 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 64 62  ndex [sqlite3_db
5590: 5f 73 74 61 74 75 73 20 64 62 20 53 43 48 45 4d  _status db SCHEM
55a0: 41 5f 55 53 45 44 20 30 5d 20 31 5d 0a 0a 20 20  A_USED 0] 1]..  
55b0: 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
55c0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
55d0: 54 41 42 4c 45 20 74 31 28 61 2c 20 55 4e 49 51  TABLE t1(a, UNIQ
55e0: 55 45 28 61 29 29 3b 0a 20 20 20 20 49 4e 53 45  UE(a));.    INSE
55f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5600: 53 28 24 74 77 6f 29 3b 0a 20 20 20 20 41 4e 41  S($two);.    ANA
5610: 4c 59 5a 45 3b 0a 20 20 7d 0a 20 20 73 65 74 20  LYZE;.  }.  set 
5620: 6e 42 79 74 65 32 20 5b 6c 69 6e 64 65 78 20 5b  nByte2 [lindex [
5630: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
5640: 73 20 64 62 20 53 43 48 45 4d 41 5f 55 53 45 44  s db SCHEMA_USED
5650: 20 30 5d 20 31 5d 0a 20 20 70 75 74 73 20 2d 6e   0] 1].  puts -n
5660: 6f 6e 65 77 6c 69 6e 65 20 22 20 28 6e 42 79 74  onewline " (nByt
5670: 65 3d 24 6e 42 79 74 65 20 6e 42 79 74 65 32 3d  e=$nByte nByte2=
5680: 24 6e 42 79 74 65 32 29 22 0a 0a 20 20 65 78 70  $nByte2)"..  exp
5690: 72 20 7b 24 6e 42 79 74 65 32 20 3e 20 24 6e 42  r {$nByte2 > $nB
56a0: 79 74 65 2b 39 30 30 20 26 26 20 24 6e 42 79 74  yte+900 && $nByt
56b0: 65 32 20 3c 20 24 6e 42 79 74 65 2b 31 31 30 30  e2 < $nByte+1100
56c0: 7d 0a 7d 20 7b 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {1}..#------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
5720: 73 74 61 74 34 20 64 61 74 61 20 6d 61 79 20 62  stat4 data may b
5730: 65 20 75 73 65 64 20 77 69 74 68 20 70 61 72 74  e used with part
5740: 69 61 6c 20 69 6e 64 65 78 65 73 2e 0a 23 0a 64  ial indexes..#.d
5750: 6f 5f 74 65 73 74 20 31 37 2e 31 20 7b 0a 20 20  o_test 17.1 {.  
5760: 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
5770: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5780: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
5790: 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , d);.    CREATE
57a0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
57b0: 61 2c 20 62 29 20 57 48 45 52 45 20 64 20 49 53  a, b) WHERE d IS
57c0: 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20 20 20 20 49   NOT NULL;.    I
57d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
57e0: 4c 55 45 53 28 2d 31 2c 20 2d 31 2c 20 2d 31 2c  LUES(-1, -1, -1,
57f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45   NULL);.    INSE
5800: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
5810: 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64 20  T 2*a,2*b,2*c,d 
5820: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
5830: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
5840: 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c 64  CT 2*a,2*b,2*c,d
5850: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
5860: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
5870: 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63 2c  ECT 2*a,2*b,2*c,
5880: 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  d FROM t1;.    I
5890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
58a0: 4c 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a 63  LECT 2*a,2*b,2*c
58b0: 2c 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  ,d FROM t1;.    
58c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
58d0: 45 4c 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32 2a  ELECT 2*a,2*b,2*
58e0: 63 2c 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  c,d FROM t1;.   
58f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5900: 53 45 4c 45 43 54 20 32 2a 61 2c 32 2a 62 2c 32  SELECT 2*a,2*b,2
5910: 2a 63 2c 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20  *c,d FROM t1;.  
5920: 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  }..  for {set i 
5930: 30 7d 20 7b 24 69 20 3c 20 33 32 7d 20 7b 69 6e  0} {$i < 32} {in
5940: 63 72 20 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b  cr i} {.    if {
5950: 24 69 3c 38 7d 20 7b 73 65 74 20 62 20 30 7d 20  $i<8} {set b 0} 
5960: 65 6c 73 65 20 7b 20 73 65 74 20 62 20 24 69 20  else { set b $i 
5970: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
5980: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5990: 41 4c 55 45 53 28 24 69 25 32 2c 20 24 62 2c 20  ALUES($i%2, $b, 
59a0: 24 69 2f 32 2c 20 27 61 62 63 27 29 20 7d 0a 20  $i/2, 'abc') }. 
59b0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 41 4e   }.  execsql {AN
59c0: 41 4c 59 5a 45 20 6d 61 69 6e 2e 74 31 7d 0a 7d  ALYZE main.t1}.}
59d0: 20 7b 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c   {}..do_catchsql
59e0: 5f 74 65 73 74 20 31 37 2e 31 2e 32 20 7b 0a 20  _test 17.1.2 {. 
59f0: 20 41 4e 41 4c 59 5a 45 20 74 65 6d 70 2e 74 31   ANALYZE temp.t1
5a00: 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  ;.} {1 {no such 
5a10: 74 61 62 6c 65 3a 20 74 65 6d 70 2e 74 31 7d 7d  table: temp.t1}}
5a20: 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 37  ..do_eqp_test 17
5a30: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
5a40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 64 20  FROM t1 WHERE d 
5a50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  IS NOT NULL AND 
5a60: 61 3d 30 20 41 4e 44 20 62 3d 31 30 20 41 4e 44  a=0 AND b=10 AND
5a70: 20 63 3d 31 30 3b 0a 7d 20 7b 2f 55 53 49 4e 47   c=10;.} {/USING
5a80: 20 49 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65   INDEX i1/}.do_e
5a90: 71 70 5f 74 65 73 74 20 31 37 2e 33 20 7b 0a 20  qp_test 17.3 {. 
5aa0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5ab0: 31 20 57 48 45 52 45 20 64 20 49 53 20 4e 4f 54  1 WHERE d IS NOT
5ac0: 20 4e 55 4c 4c 20 41 4e 44 20 61 3d 30 20 41 4e   NULL AND a=0 AN
5ad0: 44 20 62 3d 30 20 41 4e 44 20 63 3d 31 30 3b 0a  D b=0 AND c=10;.
5ae0: 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20  } {/USING INDEX 
5af0: 69 31 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  i1/}..do_execsql
5b00: 5f 74 65 73 74 20 31 37 2e 34 20 7b 0a 20 20 43  _test 17.4 {.  C
5b10: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
5b20: 4e 20 74 31 28 63 2c 20 64 29 3b 0a 20 20 41 4e  N t1(c, d);.  AN
5b30: 41 4c 59 5a 45 20 6d 61 69 6e 2e 69 32 3b 0a 7d  ALYZE main.i2;.}
5b40: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 37 2e  .do_eqp_test 17.
5b50: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  5 {.  SELECT * F
5b60: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 64 20 49  ROM t1 WHERE d I
5b70: 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 61  S NOT NULL AND a
5b80: 3d 30 20 41 4e 44 20 62 3d 31 30 20 41 4e 44 20  =0 AND b=10 AND 
5b90: 63 3d 31 30 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  c=10;.} {/USING 
5ba0: 49 4e 44 45 58 20 69 31 2f 7d 0a 64 6f 5f 65 71  INDEX i1/}.do_eq
5bb0: 70 5f 74 65 73 74 20 31 37 2e 36 20 7b 0a 20 20  p_test 17.6 {.  
5bc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5bd0: 20 57 48 45 52 45 20 64 20 49 53 20 4e 4f 54 20   WHERE d IS NOT 
5be0: 4e 55 4c 4c 20 41 4e 44 20 61 3d 30 20 41 4e 44  NULL AND a=0 AND
5bf0: 20 62 3d 30 20 41 4e 44 20 63 3d 31 30 3b 0a 7d   b=0 AND c=10;.}
5c00: 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 69   {/USING INDEX i
5c10: 32 2f 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2/}..#----------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5c60: 23 0a 64 6f 5f 74 65 73 74 20 31 38 2e 31 20 7b  #.do_test 18.1 {
5c70: 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78  .  reset_db.  ex
5c80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
5c90: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
5ca0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
5cb0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
5cc0: 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  b);.  }.  for {s
5cd0: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 39 7d  et i 0} {$i < 9}
5ce0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
5cf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
5d00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5d10: 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20  ALUES($i, 0);.  
5d20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5d30: 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29  t1 VALUES($i, 0)
5d40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5d50: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
5d60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 0);.      INSE
5d70: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5d80: 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  S($i, 0);.      
5d90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5da0: 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20  ALUES($i, 0);.  
5db0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5dc0: 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29  t1 VALUES($i, 0)
5dd0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5de0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
5df0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 0);.      INSE
5e00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5e10: 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  S($i, 0);.      
5e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5e30: 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20  ALUES($i, 0);.  
5e40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5e50: 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29  t1 VALUES($i, 0)
5e60: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5e70: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
5e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 0);.      INSE
5e90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5ea0: 53 28 24 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  S($i, 0);.      
5eb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5ec0: 41 4c 55 45 53 28 24 69 2c 20 30 29 3b 0a 20 20  ALUES($i, 0);.  
5ed0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5ee0: 74 31 20 56 41 4c 55 45 53 28 24 69 2c 20 30 29  t1 VALUES($i, 0)
5ef0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
5f00: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
5f10: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
5f20: 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a    execsql ANALYZ
5f30: 45 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  E.  execsql { SE
5f40: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5f50: 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  OM sqlite_stat4 
5f60: 7d 0a 7d 20 7b 39 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {9}..#------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 0a 23 20 46 6f 72 20 63 6f 76 65 72 61  ---.# For covera
5fc0: 67 65 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ge..#.ifcapable 
5fd0: 76 69 65 77 20 7b 0a 20 20 64 6f 5f 74 65 73 74  view {.  do_test
5fe0: 20 31 39 2e 31 20 7b 0a 20 20 20 20 72 65 73 65   19.1 {.    rese
5ff0: 74 5f 64 62 20 0a 20 20 20 20 65 78 65 63 73 71  t_db .    execsq
6000: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
6010: 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
6020: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  .      CREATE IN
6030: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20  DEX i1 ON t1(x, 
6040: 79 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  y);.      CREATE
6050: 20 56 49 45 57 20 76 31 20 41 53 20 53 45 4c 45   VIEW v1 AS SELE
6060: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
6070: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20      ANALYZE;.   
6080: 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 69 66 63 61   }.  } {}.}.ifca
6090: 70 61 62 6c 65 20 61 75 74 68 20 7b 0a 20 20 70  pable auth {.  p
60a0: 72 6f 63 20 61 75 74 68 70 72 6f 63 20 7b 6f 70  roc authproc {op
60b0: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20   args} {.    if 
60c0: 7b 24 6f 70 20 3d 3d 20 22 53 51 4c 49 54 45 5f  {$op == "SQLITE_
60d0: 41 4e 41 4c 59 5a 45 22 7d 20 7b 20 72 65 74 75  ANALYZE"} { retu
60e0: 72 6e 20 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  rn "SQLITE_DENY"
60f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 53   }.    return "S
6100: 51 4c 49 54 45 5f 4f 4b 22 0a 20 20 7d 0a 20 20  QLITE_OK".  }.  
6110: 64 6f 5f 74 65 73 74 20 31 39 2e 32 20 7b 0a 20  do_test 19.2 {. 
6120: 20 20 20 72 65 73 65 74 5f 64 62 20 0a 20 20 20     reset_db .   
6130: 20 64 62 20 61 75 74 68 20 61 75 74 68 70 72 6f   db auth authpro
6140: 63 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  c.    execsql {.
6150: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
6160: 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20  LE t1(x, y);.   
6170: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76     CREATE VIEW v
6180: 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  1 AS SELECT * FR
6190: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 20  OM t1;.    }.   
61a0: 20 63 61 74 63 68 73 71 6c 20 41 4e 41 4c 59 5a   catchsql ANALYZ
61b0: 45 0a 20 20 7d 20 7b 31 20 7b 6e 6f 74 20 61 75  E.  } {1 {not au
61c0: 74 68 6f 72 69 7a 65 64 7d 7d 0a 7d 0a 0a 23 2d  thorized}}.}..#-
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74  --------.#.reset
6220: 5f 64 62 0a 70 72 6f 63 20 72 20 7b 61 72 67 73  _db.proc r {args
6230: 7d 20 7b 20 65 78 70 72 20 72 61 6e 64 28 29 20  } { expr rand() 
6240: 7d 0a 64 62 20 66 75 6e 63 20 72 20 72 0a 64 62  }.db func r r.db
6250: 20 66 75 6e 63 20 6c 72 61 6e 67 65 20 6c 72 61   func lrange lra
6260: 6e 67 65 0a 64 6f 5f 74 65 73 74 20 32 30 2e 31  nge.do_test 20.1
6270: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6280: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6290: 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
62a0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
62b0: 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b   ON t1(a,b,c,d);
62c0: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
62d0: 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b  i 0} {$i < 16} {
62e0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
62f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
6300: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6310: 55 45 53 28 24 69 2c 20 72 28 29 2c 20 72 28 29  UES($i, r(), r()
6320: 2c 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e  , r());.      IN
6330: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6340: 55 45 53 28 24 69 2c 20 24 69 2c 20 20 72 28 29  UES($i, $i,  r()
6350: 2c 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e  , r());.      IN
6360: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6370: 55 45 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c  UES($i, $i,  $i,
6380: 20 20 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e    r());.      IN
6390: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
63a0: 55 45 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c  UES($i, $i,  $i,
63b0: 20 20 24 69 29 3b 0a 20 20 20 20 20 20 49 4e 53    $i);.      INS
63c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
63d0: 45 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20  ES($i, $i,  $i, 
63e0: 20 24 69 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   $i);.      INSE
63f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6400: 53 28 24 69 2c 20 24 69 2c 20 20 24 69 2c 20 20  S($i, $i,  $i,  
6410: 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  r());.      INSE
6420: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6430: 53 28 24 69 2c 20 24 69 2c 20 20 72 28 29 2c 20  S($i, $i,  r(), 
6440: 72 28 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  r());.      INSE
6450: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6460: 53 28 24 69 2c 20 72 28 29 2c 20 72 28 29 2c 20  S($i, r(), r(), 
6470: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r());.    }.  }.
6480: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
6490: 74 65 73 74 20 32 30 2e 32 20 7b 20 41 4e 41 4c  test 20.2 { ANAL
64a0: 59 5a 45 20 7d 0a 66 6f 72 20 7b 73 65 74 20 69  YZE }.for {set i
64b0: 20 30 7d 20 7b 24 69 3c 31 36 7d 20 7b 69 6e 63   0} {$i<16} {inc
64c0: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 76  r i} {.    set v
64d0: 61 6c 20 22 24 69 20 24 69 20 24 69 20 24 69 22  al "$i $i $i $i"
64e0: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
64f0: 74 65 73 74 20 32 30 2e 33 2e 24 69 20 7b 0a 20  test 20.3.$i {. 
6500: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
6510: 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
6520: 5f 73 74 61 74 34 20 0a 20 20 20 20 20 20 57 48  _stat4 .      WH
6530: 45 52 45 20 6c 72 61 6e 67 65 28 74 65 73 74 5f  ERE lrange(test_
6540: 64 65 63 6f 64 65 28 73 61 6d 70 6c 65 29 2c 20  decode(sample), 
6550: 30 2c 20 33 29 3d 24 76 61 6c 0a 20 20 20 20 7d  0, 3)=$val.    }
6560: 20 7b 31 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   {1}.}..#-------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65b0: 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a 0a 64  --.#.reset_db..d
65c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
65d0: 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.0 {.  CREATE T
65e0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
65f0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
6600: 20 4f 4e 20 74 32 28 61 29 3b 0a 7d 0a 0a 64 6f   ON t2(a);.}..do
6610: 5f 74 65 73 74 20 32 31 2e 31 20 7b 0a 20 20 66  _test 21.1 {.  f
6620: 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69  or {set i 1} {$i
6630: 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d   < 100} {incr i}
6640: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
6650: 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49   .      INSERT I
6660: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 43 41  NTO t2 VALUES(CA
6670: 53 45 20 57 48 45 4e 20 24 69 20 3c 20 38 30 20  SE WHEN $i < 80 
6680: 54 48 45 4e 20 27 6f 6e 65 27 20 45 4c 53 45 20  THEN 'one' ELSE 
6690: 27 74 77 6f 27 20 45 4e 44 2c 20 24 69 29 20 0a  'two' END, $i) .
66a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63      }.  }.  exec
66b0: 73 71 6c 20 41 4e 41 4c 59 5a 45 0a 7d 20 7b 7d  sql ANALYZE.} {}
66c0: 0a 0a 23 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61  ..# Condition (a
66d0: 3d 27 6f 6e 65 27 29 20 6d 61 74 63 68 65 73 20  ='one') matches 
66e0: 38 30 25 20 6f 66 20 74 68 65 20 74 61 62 6c 65  80% of the table
66f0: 2e 20 28 72 6f 77 69 64 3c 31 30 29 20 72 65 64  . (rowid<10) red
6700: 75 63 65 73 20 74 68 69 73 20 74 6f 0a 23 20 31  uces this to.# 1
6710: 30 25 2c 20 62 75 74 20 28 72 6f 77 69 64 3c 35  0%, but (rowid<5
6720: 30 29 20 6f 6e 6c 79 20 72 65 64 75 63 65 73 20  0) only reduces 
6730: 69 74 20 74 6f 20 35 30 25 2e 20 53 6f 20 69 6e  it to 50%. So in
6740: 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65 20   the first case 
6750: 62 65 6c 6f 77 0a 23 20 74 68 65 20 69 6e 64 65  below.# the inde
6760: 78 20 69 73 20 75 73 65 64 2e 20 49 6e 20 74 68  x is used. In th
6770: 65 20 73 65 63 6f 6e 64 2c 20 69 74 20 69 73 20  e second, it is 
6780: 6e 6f 74 2e 20 0a 23 0a 64 6f 5f 65 71 70 5f 74  not. .#.do_eqp_t
6790: 65 73 74 20 32 31 2e 32 20 7b 0a 20 20 53 45 4c  est 21.2 {.  SEL
67a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
67b0: 45 52 45 20 61 3d 27 6f 6e 65 27 20 41 4e 44 20  ERE a='one' AND 
67c0: 72 6f 77 69 64 20 3c 20 31 30 0a 7d 20 7b 2f 2a  rowid < 10.} {/*
67d0: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28  USING INDEX i2 (
67e0: 61 3d 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  a=? AND rowid<?)
67f0: 2a 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  */}.do_eqp_test 
6800: 32 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  21.3 {.  SELECT 
6810: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
6820: 61 3d 27 6f 6e 65 27 20 41 4e 44 20 72 6f 77 69  a='one' AND rowi
6830: 64 20 3c 20 35 30 0a 7d 20 7b 2f 2a 55 53 49 4e  d < 50.} {/*USIN
6840: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
6850: 59 20 4b 45 59 2a 2f 7d 0a 0a 23 2d 2d 2d 2d 2d  Y KEY*/}..#-----
6860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ----.#.reset_db.
68b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
68c0: 32 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  22.0 {.  CREATE 
68d0: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20 63  TABLE t3(a, b, c
68e0: 2c 20 64 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , d, PRIMARY KEY
68f0: 28 61 2c 20 62 29 29 20 57 49 54 48 4f 55 54 20  (a, b)) WITHOUT 
6900: 52 4f 57 49 44 3b 0a 20 20 53 45 4c 45 43 54 20  ROWID;.  SELECT 
6910: 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 7d 0a  * FROM t3;.} {}.
6920: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6930: 32 32 2e 31 20 7b 0a 20 20 57 49 54 48 20 72 28  22.1 {.  WITH r(
6940: 78 29 20 41 53 20 28 0a 20 20 20 20 53 45 4c 45  x) AS (.    SELE
6950: 43 54 20 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41  CT 1.    UNION A
6960: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2b  LL.    SELECT x+
6970: 31 20 46 52 4f 4d 20 72 20 57 48 45 52 45 20 78  1 FROM r WHERE x
6980: 3c 3d 31 30 30 0a 20 20 29 0a 0a 20 20 49 4e 53  <=100.  )..  INS
6990: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
69a0: 43 54 0a 20 20 20 20 43 41 53 45 20 57 48 45 4e  CT.    CASE WHEN
69b0: 20 28 78 3e 34 35 20 41 4e 44 20 78 3c 39 36 29   (x>45 AND x<96)
69c0: 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20 27   THEN 'B' ELSE '
69d0: 41 27 20 45 4e 44 2c 20 20 2f 2a 20 43 6f 6c 75  A' END,  /* Colu
69e0: 6d 6e 20 22 61 22 20 2a 2f 0a 20 20 20 20 78 2c  mn "a" */.    x,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 2f 2a 20 43 6f 6c 75 6d 6e 20 22 62 22 20 2a 2f  /* Column "b" */
6a30: 0a 20 20 20 20 43 41 53 45 20 57 48 45 4e 20 28  .    CASE WHEN (
6a40: 78 3c 35 31 29 20 54 48 45 4e 20 27 6f 6e 65 27  x<51) THEN 'one'
6a50: 20 45 4c 53 45 20 27 74 77 6f 27 20 45 4e 44 2c   ELSE 'two' END,
6a60: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
6a70: 20 22 63 22 20 2a 2f 0a 20 20 20 20 78 20 20 20   "c" */.    x   
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ab0: 20 43 6f 6c 75 6d 6e 20 22 64 22 20 2a 2f 0a 20   Column "d" */. 
6ac0: 20 46 52 4f 4d 20 72 3b 0a 0a 20 20 43 52 45 41   FROM r;..  CREA
6ad0: 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
6ae0: 33 28 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49  3(c);.  CREATE I
6af0: 4e 44 45 58 20 69 34 20 4f 4e 20 74 33 28 64 29  NDEX i4 ON t3(d)
6b00: 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 7d 0a 0a  ;.  ANALYZE;.}..
6b10: 23 20 45 78 70 72 65 73 73 69 6f 6e 20 28 63 3d  # Expression (c=
6b20: 27 6f 6e 65 27 20 41 4e 44 20 61 3d 27 42 27 29  'one' AND a='B')
6b30: 20 6d 61 74 63 68 65 73 20 35 20 74 61 62 6c 65   matches 5 table
6b40: 20 72 6f 77 73 2e 20 42 75 74 20 28 63 3d 27 6f   rows. But (c='o
6b50: 6e 65 27 20 41 4e 44 20 61 3d 41 27 29 0a 23 20  ne' AND a=A').# 
6b60: 6d 61 74 63 68 65 73 20 34 35 2e 20 45 78 70 72  matches 45. Expr
6b70: 65 73 73 69 6f 6e 20 28 64 3c 3f 29 20 6d 61 74  ession (d<?) mat
6b80: 63 68 65 73 20 32 30 2e 20 4e 65 69 74 68 65 72  ches 20. Neither
6b90: 20 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65   index is a cove
6ba0: 72 69 6e 67 20 69 6e 64 65 78 2e 0a 23 0a 23 20  ring index..#.# 
6bb0: 54 68 65 72 65 66 6f 72 65 2c 20 77 69 74 68 20  Therefore, with 
6bc0: 73 74 61 74 34 20 64 61 74 61 2c 20 53 51 4c 69  stat4 data, SQLi
6bd0: 74 65 20 70 72 65 66 65 72 73 20 28 63 3d 27 6f  te prefers (c='o
6be0: 6e 65 27 20 41 4e 44 20 61 3d 27 42 27 29 20 6f  ne' AND a='B') o
6bf0: 76 65 72 20 28 64 3c 32 30 29 2c 0a 23 20 61 6e  ver (d<20),.# an
6c00: 64 20 28 64 3c 32 30 29 20 6f 76 65 72 20 28 63  d (d<20) over (c
6c10: 3d 27 6f 6e 65 27 20 41 4e 44 20 61 3d 27 41 27  ='one' AND a='A'
6c20: 29 2e 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 77  )..foreach {tn w
6c30: 68 65 72 65 20 72 65 73 7d 20 7b 0a 20 20 31 20  here res} {.  1 
6c40: 22 63 3d 27 6f 6e 65 27 20 41 4e 44 20 61 3d 27  "c='one' AND a='
6c50: 42 27 20 41 4e 44 20 64 20 3c 20 32 30 22 20 20  B' AND d < 20"  
6c60: 20 7b 2f 2a 49 4e 44 45 58 20 69 33 20 28 63 3d   {/*INDEX i3 (c=
6c70: 3f 20 41 4e 44 20 61 3d 3f 29 2a 2f 7d 0a 20 20  ? AND a=?)*/}.  
6c80: 32 20 22 63 3d 27 6f 6e 65 27 20 41 4e 44 20 61  2 "c='one' AND a
6c90: 3d 27 41 27 20 41 4e 44 20 64 20 3c 20 32 30 22  ='A' AND d < 20"
6ca0: 20 20 20 7b 2f 2a 49 4e 44 45 58 20 69 34 20 28     {/*INDEX i4 (
6cb0: 64 3c 3f 29 2a 2f 7d 0a 7d 20 7b 0a 20 20 64 6f  d<?)*/}.} {.  do
6cc0: 5f 65 71 70 5f 74 65 73 74 20 32 32 2e 32 2e 24  _eqp_test 22.2.$
6cd0: 74 6e 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tn "SELECT * FRO
6ce0: 4d 20 74 33 20 57 48 45 52 45 20 24 77 68 65 72  M t3 WHERE $wher
6cf0: 65 22 20 24 72 65 73 0a 7d 0a 0a 70 72 6f 63 20  e" $res.}..proc 
6d00: 69 6e 74 5f 74 6f 5f 63 68 61 72 20 7b 69 7d 20  int_to_char {i} 
6d10: 7b 0a 20 20 73 65 74 20 72 65 74 20 22 22 0a 20  {.  set ret "". 
6d20: 20 73 65 74 20 63 68 61 72 20 5b 6c 69 73 74 20   set char [list 
6d30: 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20  a b c d e f g h 
6d40: 69 20 6a 5d 0a 20 20 66 6f 72 65 61 63 68 20 7b  i j].  foreach {
6d50: 64 69 76 7d 20 7b 31 30 30 30 20 31 30 30 20 31  div} {1000 100 1
6d60: 30 20 31 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e  0 1} {.    appen
6d70: 64 20 72 65 74 20 5b 6c 69 6e 64 65 78 20 24 63  d ret [lindex $c
6d80: 68 61 72 20 5b 65 78 70 72 20 28 24 69 20 2f 20  har [expr ($i / 
6d90: 24 64 69 76 29 20 25 20 31 30 5d 5d 0a 20 20 7d  $div) % 10]].  }
6da0: 0a 20 20 73 65 74 20 72 65 74 0a 7d 0a 64 62 20  .  set ret.}.db 
6db0: 66 75 6e 63 20 69 6e 74 5f 74 6f 5f 63 68 61 72  func int_to_char
6dc0: 20 69 6e 74 5f 74 6f 5f 63 68 61 72 0a 0a 64 6f   int_to_char..do
6dd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 33  _execsql_test 23
6de0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
6df0: 42 4c 45 20 74 34 28 0a 20 20 20 20 61 20 43 4f  BLE t4(.    a CO
6e00: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 62 2c  LLATE nocase, b,
6e10: 20 63 2c 20 0a 20 20 20 20 64 2c 20 65 2c 20 66   c, .    d, e, f
6e20: 2c 20 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b  , .    PRIMARY K
6e30: 45 59 28 63 2c 20 62 2c 20 61 29 0a 20 20 29 20  EY(c, b, a).  ) 
6e40: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20  WITHOUT ROWID;. 
6e50: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 34   CREATE INDEX i4
6e60: 31 20 4f 4e 20 74 34 28 65 29 3b 0a 20 20 43 52  1 ON t4(e);.  CR
6e70: 45 41 54 45 20 49 4e 44 45 58 20 69 34 32 20 4f  EATE INDEX i42 O
6e80: 4e 20 74 34 28 66 29 3b 0a 0a 20 20 57 49 54 48  N t4(f);..  WITH
6e90: 20 64 61 74 61 28 61 2c 20 62 2c 20 63 2c 20 64   data(a, b, c, d
6ea0: 2c 20 65 2c 20 66 29 20 41 53 20 28 0a 20 20 20  , e, f) AS (.   
6eb0: 20 53 45 4c 45 43 54 20 69 6e 74 5f 74 6f 5f 63   SELECT int_to_c
6ec0: 68 61 72 28 30 29 2c 20 27 78 79 7a 27 2c 20 27  har(0), 'xyz', '
6ed0: 7a 79 78 27 2c 20 27 2a 27 2c 20 30 2c 20 30 0a  zyx', '*', 0, 0.
6ee0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
6ef0: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20    SELECT .      
6f00: 69 6e 74 5f 74 6f 5f 63 68 61 72 28 66 2b 31 29  int_to_char(f+1)
6f10: 2c 20 62 2c 20 63 2c 20 64 2c 20 28 65 2b 31 29  , b, c, d, (e+1)
6f20: 20 25 20 32 2c 20 66 2b 31 0a 20 20 20 20 46 52   % 2, f+1.    FR
6f30: 4f 4d 20 64 61 74 61 20 57 48 45 52 45 20 66 3c  OM data WHERE f<
6f40: 31 30 32 34 0a 20 20 29 0a 20 20 49 4e 53 45 52  1024.  ).  INSER
6f50: 54 20 49 4e 54 4f 20 74 34 20 53 45 4c 45 43 54  T INTO t4 SELECT
6f60: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20   a, b, c, d, e, 
6f70: 66 20 46 52 4f 4d 20 64 61 74 61 3b 0a 20 20 41  f FROM data;.  A
6f80: 4e 41 4c 59 5a 45 3b 0a 7d 20 7b 7d 0a 0a 64 6f  NALYZE;.} {}..do
6f90: 5f 65 71 70 5f 74 65 73 74 20 32 33 2e 31 20 7b  _eqp_test 23.1 {
6fa0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
6fb0: 20 74 34 20 57 48 45 52 45 20 0a 20 20 20 20 28   t4 WHERE .    (
6fc0: 65 3d 31 20 41 4e 44 20 62 3d 27 78 79 7a 27 20  e=1 AND b='xyz' 
6fd0: 41 4e 44 20 63 3d 27 7a 79 78 27 20 41 4e 44 20  AND c='zyx' AND 
6fe0: 61 3c 27 41 45 41 27 29 20 41 4e 44 20 66 3c 33  a<'AEA') AND f<3
6ff0: 30 30 0a 20 20 2d 2d 20 46 6f 72 6d 65 72 6c 79  00.  -- Formerly
7000: 20 75 73 65 64 20 69 6e 64 65 78 20 69 34 31 2e   used index i41.
7010: 20 20 42 75 74 20 69 34 31 20 69 73 20 6e 6f 74    But i41 is not
7020: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
7030: 78 20 77 68 65 72 65 61 73 0a 20 20 2d 2d 20 74  x whereas.  -- t
7040: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
7050: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
7060: 65 78 2c 20 61 6e 64 20 73 6f 20 61 73 20 6f 66  ex, and so as of
7070: 20 32 30 31 37 2d 31 30 2d 31 35 2c 20 74 68 65   2017-10-15, the
7080: 0a 20 20 2d 2d 20 50 52 49 4d 41 52 59 20 4b 45  .  -- PRIMARY KE
7090: 59 20 69 73 20 70 72 65 66 65 72 72 65 64 2e 0a  Y is preferred..
70a0: 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  } {SEARCH TABLE 
70b0: 74 34 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  t4 USING PRIMARY
70c0: 20 4b 45 59 20 28 63 3d 3f 20 41 4e 44 20 62 3d   KEY (c=? AND b=
70d0: 3f 20 41 4e 44 20 61 3c 3f 29 7d 0a 64 6f 5f 65  ? AND a<?)}.do_e
70e0: 71 70 5f 74 65 73 74 20 32 33 2e 32 20 7b 0a 20  qp_test 23.2 {. 
70f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
7100: 34 20 57 48 45 52 45 20 0a 20 20 20 20 28 65 3d  4 WHERE .    (e=
7110: 31 20 41 4e 44 20 62 3d 27 78 79 7a 27 20 41 4e  1 AND b='xyz' AN
7120: 44 20 63 3d 27 7a 79 78 27 20 41 4e 44 20 61 3c  D c='zyx' AND a<
7130: 27 4a 4a 4a 27 29 20 41 4e 44 20 66 3c 33 30 30  'JJJ') AND f<300
7140: 0a 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45  .} {SEARCH TABLE
7150: 20 74 34 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t4 USING INDEX 
7160: 69 34 32 20 28 66 3c 3f 29 7d 0a 0a 64 6f 5f 65  i42 (f<?)}..do_e
7170: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34 2e 30  xecsql_test 24.0
7180: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
7190: 45 20 74 35 28 63 2c 20 64 2c 20 62 2c 20 65 2c  E t5(c, d, b, e,
71a0: 20 61 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   a, PRIMARY KEY(
71b0: 61 2c 20 62 2c 20 63 29 29 20 57 49 54 48 4f 55  a, b, c)) WITHOU
71c0: 54 20 52 4f 57 49 44 3b 0a 20 20 57 49 54 48 20  T ROWID;.  WITH 
71d0: 64 61 74 61 28 61 2c 20 62 2c 20 63 2c 20 64 2c  data(a, b, c, d,
71e0: 20 65 29 20 41 53 20 28 0a 20 20 20 20 53 45 4c   e) AS (.    SEL
71f0: 45 43 54 20 27 7a 27 2c 20 27 79 27 2c 20 30 2c  ECT 'z', 'y', 0,
7200: 20 30 2c 20 30 0a 20 20 20 20 55 4e 49 4f 4e 20   0, 0.    UNION 
7210: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 0a  ALL.    SELECT .
7220: 20 20 20 20 20 20 61 2c 20 43 41 53 45 20 57 48        a, CASE WH
7230: 45 4e 20 62 3d 27 79 27 20 54 48 45 4e 20 27 6e  EN b='y' THEN 'n
7240: 27 20 45 4c 53 45 20 27 79 27 20 45 4e 44 2c 20  ' ELSE 'y' END, 
7250: 63 2b 31 2c 20 65 2f 32 35 30 2c 20 65 2b 31 20  c+1, e/250, e+1 
7260: 0a 20 20 20 20 46 52 4f 4d 20 64 61 74 61 0a 20  .    FROM data. 
7270: 20 20 20 57 48 45 52 45 20 65 3c 31 30 30 30 0a     WHERE e<1000.
7280: 20 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e 54    ).  INSERT INT
7290: 4f 20 74 35 28 61 2c 20 62 2c 20 63 2c 20 64 2c  O t5(a, b, c, d,
72a0: 20 65 29 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   e) SELECT * FRO
72b0: 4d 20 64 61 74 61 3b 0a 20 20 43 52 45 41 54 45  M data;.  CREATE
72c0: 20 49 4e 44 45 58 20 74 35 64 20 4f 4e 20 74 35   INDEX t5d ON t5
72d0: 28 64 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  (d);.  CREATE IN
72e0: 44 45 58 20 74 35 65 20 4f 4e 20 74 35 28 65 29  DEX t5e ON t5(e)
72f0: 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 7d 0a 0a  ;.  ANALYZE;.}..
7300: 66 6f 72 65 61 63 68 20 7b 74 6e 20 77 68 65 72  foreach {tn wher
7310: 65 20 65 71 70 7d 20 7b 0a 20 20 31 20 22 64 3d  e eqp} {.  1 "d=
7320: 30 20 41 4e 44 20 61 3d 27 7a 27 20 41 4e 44 20  0 AND a='z' AND 
7330: 62 3d 27 6e 27 20 41 4e 44 20 65 3c 32 30 30 22  b='n' AND e<200"
7340: 20 7b 2f 2a 74 35 64 20 28 64 3d 3f 20 41 4e 44   {/*t5d (d=? AND
7350: 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2a 2f 7d   a=? AND b=?)*/}
7360: 0a 20 20 32 20 22 64 3d 30 20 41 4e 44 20 61 3d  .  2 "d=0 AND a=
7370: 27 7a 27 20 41 4e 44 20 62 3d 27 6e 27 20 41 4e  'z' AND b='n' AN
7380: 44 20 65 3c 31 30 30 22 20 7b 2f 2a 74 35 65 20  D e<100" {/*t5e 
7390: 28 65 3c 3f 29 2a 2f 7d 0a 0a 20 20 33 20 22 64  (e<?)*/}..  3 "d
73a0: 3d 30 20 41 4e 44 20 65 3c 33 30 30 22 20 20 20  =0 AND e<300"   
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 7b 2f 2a 74 35 64 20 28 64 3d 3f 29 2a 2f    {/*t5d (d=?)*/
73d0: 7d 0a 20 20 34 20 22 64 3d 30 20 41 4e 44 20 65  }.  4 "d=0 AND e
73e0: 3c 32 30 30 22 20 20 20 20 20 20 20 20 20 20 20  <200"           
73f0: 20 20 20 20 20 20 20 20 20 20 7b 2f 2a 74 35 65            {/*t5e
7400: 20 28 65 3c 3f 29 2a 2f 7d 0a 7d 20 7b 0a 20 20   (e<?)*/}.} {.  
7410: 64 6f 5f 65 71 70 5f 74 65 73 74 20 32 34 2e 24  do_eqp_test 24.$
7420: 74 6e 20 22 53 65 4c 65 43 74 20 2a 20 46 52 4f  tn "SeLeCt * FRO
7430: 4d 20 74 35 20 57 48 45 52 45 20 24 77 68 65 72  M t5 WHERE $wher
7440: 65 22 20 24 65 71 70 0a 7d 0a 0a 23 2d 2d 2d 2d  e" $eqp.}..#----
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7490: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
74a0: 74 20 69 66 20 73 74 61 74 34 20 64 61 74 61 20  t if stat4 data 
74b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 62 75 74  is available but
74c0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
74d0: 62 65 63 61 75 73 65 20 74 68 65 0a 23 20 72 68  because the.# rh
74e0: 73 20 6f 66 20 61 20 72 61 6e 67 65 20 63 6f 6e  s of a range con
74f0: 73 74 72 61 69 6e 74 20 69 73 20 61 20 63 6f 6d  straint is a com
7500: 70 6c 65 78 20 65 78 70 72 65 73 73 69 6f 6e 2c  plex expression,
7510: 20 74 68 65 20 64 65 66 61 75 6c 74 20 65 73 74   the default est
7520: 69 6d 61 74 65 73 0a 23 20 61 72 65 20 75 73 65  imates.# are use
7530: 64 20 69 6e 73 74 65 61 64 2e 0a 69 66 63 61 70  d instead..ifcap
7540: 61 62 6c 65 20 73 74 61 74 34 26 26 63 74 65 20  able stat4&&cte 
7550: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
7560: 65 73 74 20 32 35 2e 31 20 7b 0a 20 20 20 20 43  est 25.1 {.    C
7570: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
7580: 2c 20 62 29 3b 0a 20 20 20 20 57 49 54 48 20 69  , b);.    WITH i
7590: 6e 74 73 28 69 2c 6a 29 20 41 53 20 28 0a 20 20  nts(i,j) AS (.  
75a0: 20 20 20 20 53 45 4c 45 43 54 20 31 2c 31 20 55      SELECT 1,1 U
75b0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
75c0: 69 2b 31 2c 6a 2b 31 20 46 52 4f 4d 20 69 6e 74  i+1,j+1 FROM int
75d0: 73 20 57 48 45 52 45 20 69 3c 31 30 30 0a 20 20  s WHERE i<100.  
75e0: 20 20 29 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    ) INSERT INTO 
75f0: 74 36 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t6 SELECT * FROM
7600: 20 69 6e 74 73 3b 0a 20 20 20 20 43 52 45 41 54   ints;.    CREAT
7610: 45 20 49 4e 44 45 58 20 61 61 20 4f 4e 20 74 36  E INDEX aa ON t6
7620: 28 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (a);.    CREATE 
7630: 49 4e 44 45 58 20 62 62 20 4f 4e 20 74 36 28 62  INDEX bb ON t6(b
7640: 29 3b 0a 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a  );.    ANALYZE;.
7650: 20 20 7d 0a 0a 20 20 23 20 54 65 72 6d 20 28 62    }..  # Term (b
7660: 3c 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64  <?) is estimated
7670: 20 61 74 20 32 35 25 2e 20 42 65 74 74 65 72 20   at 25%. Better 
7680: 74 68 61 6e 20 28 61 3c 33 30 29 20 62 75 74 20  than (a<30) but 
7690: 6e 6f 74 20 61 73 0a 20 20 23 20 67 6f 6f 64 20  not as.  # good 
76a0: 61 73 20 28 61 3c 32 30 29 2e 0a 20 20 64 6f 5f  as (a<20)..  do_
76b0: 65 71 70 5f 74 65 73 74 20 32 35 2e 32 2e 31 20  eqp_test 25.2.1 
76c0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
76d0: 74 36 20 57 48 45 52 45 20 61 3c 33 30 20 41 4e  t6 WHERE a<30 AN
76e0: 44 20 62 3c 3f 20 7d 20 5c 0a 20 20 20 20 7b 53  D b<? } \.    {S
76f0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 36 20 55  EARCH TABLE t6 U
7700: 53 49 4e 47 20 49 4e 44 45 58 20 62 62 20 28 62  SING INDEX bb (b
7710: 3c 3f 29 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65  <?)}.  do_eqp_te
7720: 73 74 20 32 35 2e 32 2e 32 20 7b 20 53 45 4c 45  st 25.2.2 { SELE
7730: 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 57 48 45  CT * FROM t6 WHE
7740: 52 45 20 61 3c 32 30 20 41 4e 44 20 62 3c 3f 20  RE a<20 AND b<? 
7750: 7d 20 5c 0a 20 20 20 20 7b 53 45 41 52 43 48 20  } \.    {SEARCH 
7760: 54 41 42 4c 45 20 74 36 20 55 53 49 4e 47 20 49  TABLE t6 USING I
7770: 4e 44 45 58 20 61 61 20 28 61 3c 3f 29 7d 0a 0a  NDEX aa (a<?)}..
7780: 20 20 23 20 54 65 72 6d 20 28 62 20 42 45 54 57    # Term (b BETW
7790: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
77a0: 65 73 74 69 6d 61 74 65 64 20 61 74 20 31 2f 36  estimated at 1/6
77b0: 34 2e 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74  4..  do_eqp_test
77c0: 20 32 35 2e 33 2e 31 20 7b 20 0a 20 20 20 20 53   25.3.1 { .    S
77d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20  ELECT * FROM t6 
77e0: 57 48 45 52 45 20 61 20 42 45 54 57 45 45 4e 20  WHERE a BETWEEN 
77f0: 35 20 41 4e 44 20 31 30 20 41 4e 44 20 62 20 42  5 AND 10 AND b B
7800: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 0a  ETWEEN ? AND ? .
7810: 20 20 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c    } {SEARCH TABL
7820: 45 20 74 36 20 55 53 49 4e 47 20 49 4e 44 45 58  E t6 USING INDEX
7830: 20 62 62 20 28 62 3e 3f 20 41 4e 44 20 62 3c 3f   bb (b>? AND b<?
7840: 29 7d 0a 20 20 0a 20 20 23 20 54 65 72 6d 20 28  )}.  .  # Term (
7850: 62 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  b BETWEEN ? AND 
7860: 36 30 29 20 69 73 20 65 73 74 69 6d 61 74 65 64  60) is estimated
7870: 20 74 6f 20 72 65 74 75 72 6e 20 72 6f 75 67 68   to return rough
7880: 6c 79 20 31 35 20 72 6f 77 73 20 2d 0a 20 20 23  ly 15 rows -.  #
7890: 20 36 30 20 66 72 6f 6d 20 28 62 3c 3d 36 30 29   60 from (b<=60)
78a0: 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 30   multiplied by 0
78b0: 2e 32 35 20 66 6f 72 20 74 68 65 20 62 3e 3d 3f  .25 for the b>=?
78c0: 20 74 65 72 6d 2e 20 42 65 74 74 65 72 20 74 68   term. Better th
78d0: 61 6e 0a 20 20 23 20 28 61 3c 32 30 29 20 62 75  an.  # (a<20) bu
78e0: 74 20 6e 6f 74 20 61 73 20 67 6f 6f 64 20 61 73  t not as good as
78f0: 20 28 61 3c 31 30 29 2e 0a 20 20 64 6f 5f 65 71   (a<10)..  do_eq
7900: 70 5f 74 65 73 74 20 32 35 2e 34 2e 31 20 7b 20  p_test 25.4.1 { 
7910: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
7920: 4f 4d 20 74 36 20 57 48 45 52 45 20 61 20 3c 20  OM t6 WHERE a < 
7930: 31 30 20 41 4e 44 20 28 62 20 42 45 54 57 45 45  10 AND (b BETWEE
7940: 4e 20 3f 20 41 4e 44 20 36 30 29 0a 20 20 7d 20  N ? AND 60).  } 
7950: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 36  {SEARCH TABLE t6
7960: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 61 61 20   USING INDEX aa 
7970: 28 61 3c 3f 29 7d 0a 0a 20 20 64 6f 5f 65 71 70  (a<?)}..  do_eqp
7980: 5f 74 65 73 74 20 32 35 2e 34 2e 32 20 7b 20 0a  _test 25.4.2 { .
7990: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
79a0: 4d 20 74 36 20 57 48 45 52 45 20 61 20 3c 20 32  M t6 WHERE a < 2
79b0: 30 20 41 4e 44 20 28 62 20 42 45 54 57 45 45 4e  0 AND (b BETWEEN
79c0: 20 3f 20 41 4e 44 20 36 30 29 0a 20 20 7d 20 7b   ? AND 60).  } {
79d0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 36 20  SEARCH TABLE t6 
79e0: 55 53 49 4e 47 20 49 4e 44 45 58 20 62 62 20 28  USING INDEX bb (
79f0: 62 3e 3f 20 41 4e 44 20 62 3c 3f 29 7d 0a 7d 0a  b>? AND b<?)}.}.
7a00: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
7a50: 65 63 6b 20 74 68 61 74 20 61 20 70 72 6f 62 6c  eck that a probl
7a60: 65 6d 20 69 6e 20 74 68 65 79 20 77 61 79 20 73  em in they way s
7a70: 74 61 74 34 20 64 61 74 61 20 69 73 20 75 73 65  tat4 data is use
7a80: 64 20 68 61 73 20 62 65 65 6e 20 0a 23 20 72 65  d has been .# re
7a90: 73 6f 6c 76 65 64 20 28 73 65 65 20 62 65 6c 6f  solved (see belo
7aa0: 77 29 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  w)..#.reset_db.d
7ab0: 6f 5f 74 65 73 74 20 32 36 2e 31 2e 31 20 7b 0a  o_test 26.1.1 {.
7ac0: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
7ad0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
7ae0: 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54   .      CREATE T
7af0: 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 7a 29  ABLE t1(x, y, z)
7b00: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 49  ;.      CREATE I
7b10: 4e 44 45 58 20 74 31 78 79 20 4f 4e 20 74 31 28  NDEX t1xy ON t1(
7b20: 78 2c 20 79 29 3b 0a 20 20 20 20 20 20 43 52 45  x, y);.      CRE
7b30: 41 54 45 20 49 4e 44 45 58 20 74 31 7a 20 4f 4e  ATE INDEX t1z ON
7b40: 20 74 31 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20   t1(z);.    }.  
7b50: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
7b60: 7b 24 69 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e  {$i < 10000} {in
7b70: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78  cr i} {.      ex
7b80: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
7b90: 4e 54 4f 20 74 31 28 78 2c 20 79 29 20 56 41 4c  NTO t1(x, y) VAL
7ba0: 55 45 53 28 24 69 2c 20 24 69 29 20 7d 0a 20 20  UES($i, $i) }.  
7bb0: 20 20 7d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74    }.    for {set
7bc0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 7d 20   i 0} {$i < 10} 
7bd0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20  {incr i} {.     
7be0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
7bf0: 20 20 20 57 49 54 48 20 63 6e 74 28 78 29 20 41     WITH cnt(x) A
7c00: 53 20 28 53 45 4c 45 43 54 20 31 20 55 4e 49 4f  S (SELECT 1 UNIO
7c10: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31  N ALL SELECT x+1
7c20: 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52 45 20   FROM cnt WHERE 
7c30: 78 3c 31 30 30 29 0a 20 20 20 20 20 20 20 20 49  x<100).        I
7c40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78 2c  NSERT INTO t1(x,
7c50: 20 79 29 20 53 45 4c 45 43 54 20 31 30 30 30 30   y) SELECT 10000
7c60: 2b 24 69 2c 20 78 20 46 52 4f 4d 20 63 6e 74 3b  +$i, x FROM cnt;
7c70: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
7c80: 49 4e 54 4f 20 74 31 28 78 2c 20 79 29 20 53 45  INTO t1(x, y) SE
7c90: 4c 45 43 54 20 31 30 30 30 30 2b 24 69 2c 20 31  LECT 10000+$i, 1
7ca0: 30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  00;.      }.    
7cb0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
7cc0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
7cd0: 53 45 54 20 7a 20 3d 20 72 6f 77 69 64 20 2f 20  SET z = rowid / 
7ce0: 32 30 3b 0a 20 20 20 20 20 20 41 4e 41 4c 59 5a  20;.      ANALYZ
7cf0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 7b  E;.    }.  }.} {
7d00: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
7d10: 73 74 20 32 36 2e 31 2e 32 20 7b 0a 20 20 53 45  st 26.1.2 {.  SE
7d20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
7d30: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 3d 20  OM t1 WHERE x = 
7d40: 31 30 30 30 30 20 41 4e 44 20 79 20 3c 20 35 30  10000 AND y < 50
7d50: 3b 0a 7d 20 7b 34 39 7d 0a 64 6f 5f 65 78 65 63  ;.} {49}.do_exec
7d60: 73 71 6c 5f 74 65 73 74 20 32 36 2e 31 2e 33 20  sql_test 26.1.3 
7d70: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
7d80: 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
7d90: 45 20 7a 20 3d 20 34 34 34 3b 0a 7d 20 7b 32 30  E z = 444;.} {20
7da0: 7d 0a 0a 23 20 54 68 65 20 61 6e 61 6c 79 7a 65  }..# The analyze
7db0: 72 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 6e 79  r knows that any
7dc0: 20 28 7a 3d 3f 29 20 65 78 70 72 65 73 73 69 6f   (z=?) expressio
7dd0: 6e 20 6d 61 74 63 68 65 73 20 32 30 20 72 6f 77  n matches 20 row
7de0: 73 2e 20 53 6f 20 69 74 0a 23 20 77 69 6c 6c 20  s. So it.# will 
7df0: 75 73 65 20 69 6e 64 65 78 20 22 74 31 7a 22 20  use index "t1z" 
7e00: 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  if the estimate 
7e10: 6f 66 20 68 69 74 73 20 66 6f 72 20 28 78 3d 31  of hits for (x=1
7e20: 30 30 30 30 20 41 4e 44 20 79 3c 35 30 29 0a 23  0000 AND y<50).#
7e30: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
7e40: 20 32 30 20 72 6f 77 73 2e 0a 23 0a 23 20 41 6e   20 rows..#.# An
7e50: 64 20 69 74 20 73 68 6f 75 6c 64 20 62 65 2e 20  d it should be. 
7e60: 54 68 65 20 61 6e 61 6c 79 7a 65 72 20 68 61 73  The analyzer has
7e70: 20 61 20 73 74 61 74 34 20 73 61 6d 70 6c 65 20   a stat4 sample 
7e80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20  as follows:.#.# 
7e90: 20 20 73 61 6d 70 6c 65 3d 28 78 3d 31 30 30 30    sample=(x=1000
7ea0: 30 2c 20 79 3d 31 30 30 29 20 6e 4c 74 3d 28 31  0, y=100) nLt=(1
7eb0: 30 30 30 30 20 31 30 30 39 39 29 0a 23 0a 23 20  0000 10099).#.# 
7ec0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
7ed0: 6e 6f 20 6f 74 68 65 72 20 73 61 6d 70 6c 65 73  no other samples
7ee0: 20 74 68 61 74 20 73 74 61 72 74 20 77 69 74 68   that start with
7ef0: 20 28 78 3d 31 30 30 30 30 29 2e 20 53 6f 20 69   (x=10000). So i
7f00: 74 20 6b 6e 6f 77 73 20 0a 23 20 74 68 61 74 20  t knows .# that 
7f10: 28 78 3d 31 30 30 30 30 20 41 4e 44 20 79 3c 35  (x=10000 AND y<5
7f20: 30 29 20 6d 75 73 74 20 6d 61 74 63 68 20 73 6f  0) must match so
7f30: 6d 65 77 68 65 72 65 20 62 65 74 77 65 65 6e 20  mewhere between 
7f40: 30 20 61 6e 64 20 39 39 20 72 6f 77 73 2c 20 62  0 and 99 rows, b
7f50: 75 74 0a 23 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ut.# no more tha
7f60: 6e 20 74 68 61 74 2e 20 47 75 65 73 73 69 6e 67  n that. Guessing
7f70: 20 6c 65 73 73 20 74 68 61 6e 20 32 30 20 69 73   less than 20 is
7f80: 20 74 68 65 72 65 66 6f 72 65 20 75 6e 72 65 61   therefore unrea
7f90: 73 6f 6e 61 62 6c 65 2e 0a 23 0a 23 20 41 74 20  sonable..#.# At 
7fa0: 6f 6e 65 20 70 6f 69 6e 74 20 74 68 6f 75 67 68  one point though
7fb0: 2c 20 64 75 65 20 74 6f 20 61 20 70 72 6f 62 6c  , due to a probl
7fc0: 65 6d 20 69 6e 20 77 68 65 72 65 4b 65 79 53 74  em in whereKeySt
7fd0: 61 74 73 28 29 2c 20 74 68 65 20 70 6c 61 6e 6e  ats(), the plann
7fe0: 65 72 20 77 61 73 0a 23 20 65 73 74 69 6d 61 74  er was.# estimat
7ff0: 69 6e 67 20 74 68 61 74 20 28 78 3d 31 30 30 30  ing that (x=1000
8000: 30 20 41 4e 44 20 79 3c 35 30 29 20 77 6f 75 6c  0 AND y<50) woul
8010: 64 20 6d 61 74 63 68 20 6f 6e 6c 79 20 32 20 72  d match only 2 r
8020: 6f 77 73 2e 0a 23 0a 64 6f 5f 65 71 70 5f 74 65  ows..#.do_eqp_te
8030: 73 74 20 32 36 2e 31 2e 34 20 7b 0a 20 20 53 45  st 26.1.4 {.  SE
8040: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
8050: 48 45 52 45 20 78 20 3d 20 31 30 30 30 30 20 41  HERE x = 10000 A
8060: 4e 44 20 79 20 3c 20 35 30 20 41 4e 44 20 7a 20  ND y < 50 AND z 
8070: 3d 20 34 34 34 3b 0a 7d 20 7b 53 45 41 52 43 48  = 444;.} {SEARCH
8080: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
8090: 49 4e 44 45 58 20 74 31 7a 20 28 7a 3d 3f 29 7d  INDEX t1z (z=?)}
80a0: 0a 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d  ...# This test -
80b0: 20 32 36 2e 32 2e 2a 20 2d 20 74 65 73 74 73 20   26.2.* - tests 
80c0: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 6d 61 6e  that another man
80d0: 69 66 65 73 74 61 74 69 6f 6e 20 6f 66 20 74 68  ifestation of th
80e0: 65 20 73 61 6d 65 20 70 72 6f 62 6c 65 6d 0a 23  e same problem.#
80f0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 72   is no longer pr
8100: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 62  esent in the lib
8110: 72 61 72 79 2e 20 41 73 73 75 6d 69 6e 67 3a 0a  rary. Assuming:.
8120: 23 20 0a 23 20 20 20 43 52 45 41 54 45 20 49 4e  # .#   CREATE IN
8130: 44 45 58 20 74 31 78 79 20 4f 4e 20 74 31 28 78  DEX t1xy ON t1(x
8140: 2c 20 79 29 0a 23 0a 23 20 61 6e 64 20 74 68 61  , y).#.# and tha
8150: 74 20 68 61 76 65 20 73 61 6d 70 6c 65 73 20 66  t have samples f
8160: 6f 72 20 69 6e 64 65 78 20 74 31 78 79 20 61 73  or index t1xy as
8170: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 0a 23 20   follows:.#.#.# 
8180: 20 20 73 61 6d 70 6c 65 3d 28 27 41 27 2c 20 37    sample=('A', 7
8190: 30 29 20 20 20 20 20 20 20 20 6e 45 71 3d 28 31  0)        nEq=(1
81a0: 30 30 2c 20 32 29 20 20 20 20 20 20 20 20 6e 4c  00, 2)        nL
81b0: 74 3d 28 39 30 30 2c 20 39 37 30 29 0a 23 20 20  t=(900, 970).#  
81c0: 20 73 61 6d 70 6c 65 3d 28 27 42 27 2c 20 37 30   sample=('B', 70
81d0: 29 20 20 20 20 20 20 20 20 6e 45 71 3d 28 31 30  )        nEq=(10
81e0: 30 2c 20 32 29 20 20 20 20 20 20 20 20 6e 4c 74  0, 2)        nLt
81f0: 3d 28 31 30 30 30 2c 20 31 30 37 30 29 20 20 20  =(1000, 1070)   
8200: 20 0a 23 0a 23 20 74 68 65 20 70 6c 61 6e 6e 65   .#.# the planne
8210: 72 20 73 68 6f 75 6c 64 20 65 73 74 69 6d 61 74  r should estimat
8220: 65 20 74 68 61 74 20 28 78 20 3d 20 27 42 27 20  e that (x = 'B' 
8230: 41 4e 44 20 79 20 3e 20 32 35 29 20 6d 61 74 63  AND y > 25) matc
8240: 68 65 73 20 37 36 20 72 6f 77 73 0a 23 20 28 37  hes 76 rows.# (7
8250: 30 20 2a 20 32 2f 33 20 2b 20 33 30 29 2e 20 42  0 * 2/3 + 30). B
8260: 65 66 6f 72 65 2c 20 64 75 65 20 74 6f 20 74 68  efore, due to th
8270: 65 20 70 72 6f 62 6c 65 6d 2c 20 74 68 65 20 70  e problem, the p
8280: 6c 61 6e 6e 65 72 20 77 61 73 20 65 73 74 69 6d  lanner was estim
8290: 61 74 69 6e 67 20 0a 23 20 74 68 61 74 20 74 68  ating .# that th
82a0: 69 73 20 6d 61 74 63 68 65 64 20 31 30 30 20 72  is matched 100 r
82b0: 6f 77 73 2e 0a 23 20 0a 72 65 73 65 74 5f 64 62  ows..# .reset_db
82c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
82d0: 20 32 36 2e 32 2e 31 20 7b 0a 20 20 42 45 47 49   26.2.1 {.  BEGI
82e0: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
82f0: 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 7a 29 3b  BLE t1(x, y, z);
8300: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
8310: 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 79 29  X i1 ON t1(x, y)
8320: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
8330: 45 58 20 69 32 20 4f 4e 20 74 31 28 7a 29 3b 0a  EX i2 ON t1(z);.
8340: 20 20 0a 20 20 20 20 57 49 54 48 20 0a 20 20 20    .    WITH .   
8350: 20 63 6e 74 28 79 29 20 41 53 20 28 53 45 4c 45   cnt(y) AS (SELE
8360: 43 54 20 30 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  CT 0 UNION ALL S
8370: 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 63  ELECT y+1 FROM c
8380: 6e 74 20 57 48 45 52 45 20 79 3c 39 39 29 2c 0a  nt WHERE y<99),.
8390: 20 20 20 20 6c 65 74 74 65 72 73 28 78 29 20 41      letters(x) A
83a0: 53 20 28 0a 20 20 20 20 20 20 53 45 4c 45 43 54  S (.      SELECT
83b0: 20 27 41 27 20 55 4e 49 4f 4e 20 53 45 4c 45 43   'A' UNION SELEC
83c0: 54 20 27 42 27 20 55 4e 49 4f 4e 20 53 45 4c 45  T 'B' UNION SELE
83d0: 43 54 20 27 43 27 20 55 4e 49 4f 4e 20 53 45 4c  CT 'C' UNION SEL
83e0: 45 43 54 20 27 44 27 0a 20 20 20 20 29 0a 20 20  ECT 'D'.    ).  
83f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8400: 28 78 2c 20 79 29 20 53 45 4c 45 43 54 20 78 2c  (x, y) SELECT x,
8410: 20 79 20 46 52 4f 4d 20 6c 65 74 74 65 72 73 2c   y FROM letters,
8420: 20 63 6e 74 3b 0a 20 20 0a 20 20 20 20 57 49 54   cnt;.  .    WIT
8430: 48 0a 20 20 20 20 6c 65 74 74 65 72 73 28 78 29  H.    letters(x)
8440: 20 41 53 20 28 0a 20 20 20 20 20 20 53 45 4c 45   AS (.      SELE
8450: 43 54 20 27 41 27 20 55 4e 49 4f 4e 20 53 45 4c  CT 'A' UNION SEL
8460: 45 43 54 20 27 42 27 20 55 4e 49 4f 4e 20 53 45  ECT 'B' UNION SE
8470: 4c 45 43 54 20 27 43 27 20 55 4e 49 4f 4e 20 53  LECT 'C' UNION S
8480: 45 4c 45 43 54 20 27 44 27 0a 20 20 20 20 29 0a  ELECT 'D'.    ).
8490: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
84a0: 74 31 28 78 2c 20 79 29 20 53 45 4c 45 43 54 20  t1(x, y) SELECT 
84b0: 78 2c 20 37 30 20 46 52 4f 4d 20 6c 65 74 74 65  x, 70 FROM lette
84c0: 72 73 3b 0a 20 20 0a 20 20 20 20 57 49 54 48 0a  rs;.  .    WITH.
84d0: 20 20 20 20 63 6e 74 28 69 29 20 41 53 20 28 53      cnt(i) AS (S
84e0: 45 4c 45 43 54 20 30 20 55 4e 49 4f 4e 20 41 4c  ELECT 0 UNION AL
84f0: 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f  L SELECT i+1 FRO
8500: 4d 20 63 6e 74 20 57 48 45 52 45 20 69 3c 39 39  M cnt WHERE i<99
8510: 39 39 29 0a 20 20 20 20 49 4e 53 45 52 54 20 49  99).    INSERT I
8520: 4e 54 4f 20 74 31 28 78 2c 20 79 29 20 53 45 4c  NTO t1(x, y) SEL
8530: 45 43 54 20 69 2c 20 69 20 46 52 4f 4d 20 63 6e  ECT i, i FROM cn
8540: 74 3b 0a 20 20 0a 20 20 20 20 55 50 44 41 54 45  t;.  .    UPDATE
8550: 20 74 31 20 53 45 54 20 7a 20 3d 20 28 72 6f 77   t1 SET z = (row
8560: 69 64 20 2f 20 39 35 29 3b 0a 20 20 20 20 41 4e  id / 95);.    AN
8570: 41 4c 59 5a 45 3b 0a 20 20 43 4f 4d 4d 49 54 3b  ALYZE;.  COMMIT;
8580: 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  .}..do_eqp_test 
8590: 32 36 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  26.2.2 {.  SELEC
85a0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
85b0: 45 20 78 3d 27 42 27 20 41 4e 44 20 79 3e 32 35  E x='B' AND y>25
85c0: 20 41 4e 44 20 7a 3d 3f 3b 0a 7d 20 7b 53 45 41   AND z=?;.} {SEA
85d0: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
85e0: 4e 47 20 49 4e 44 45 58 20 69 31 20 28 78 3d 3f  NG INDEX i1 (x=?
85f0: 20 41 4e 44 20 79 3e 3f 29 7d 0a 0a 0a 66 69 6e   AND y>?)}...fin
8600: 69 73 68 5f 74 65 73 74 0a                       ish_test.