/ Hex Artifact Content
Login

Artifact 1dccda46a6c374018af617fba00bfe297a61d442:


0000: 23 20 32 30 30 39 20 41 75 67 75 73 74 20 30 36  # 2009 August 06
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
0190: 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72   for SQLite libr
01a0: 61 72 79 2e 20 54 68 69 73 20 66 69 6c 65 20 0a  ary. This file .
01b0: 23 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73  # implements tes
01c0: 74 73 20 66 6f 72 20 72 61 6e 67 65 20 61 6e 64  ts for range and
01d0: 20 4c 49 4b 45 20 63 6f 6e 73 74 72 61 69 6e 74   LIKE constraint
01e0: 73 20 74 68 61 74 20 75 73 65 20 62 6f 75 6e 64  s that use bound
01f0: 20 76 61 72 69 61 62 6c 65 73 0a 23 20 69 6e 73   variables.# ins
0200: 74 65 61 64 20 6f 66 20 6c 69 74 65 72 61 6c 20  tead of literal 
0210: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
0220: 74 73 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64  ts..#..set testd
0230: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0240: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0250: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0260: 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66  tcl.set testpref
0270: 69 78 20 61 6e 61 6c 79 7a 65 33 0a 0a 69 66 63  ix analyze3..ifc
0280: 61 70 61 62 6c 65 20 21 73 74 61 74 34 26 26 21  apable !stat4&&!
0290: 73 74 61 74 33 20 7b 0a 20 20 66 69 6e 69 73 68  stat3 {.  finish
02a0: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
02b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0300: 20 4f 72 67 61 6e 69 7a 61 74 69 6f 6e 3a 0a 23   Organization:.#
0310: 0a 23 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 2a 3a  .# analyze3-1.*:
0320: 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 76   Test that the v
0330: 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70  alues of bound p
0340: 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 63 6f  arameters are co
0350: 6e 73 69 64 65 72 65 64 20 0a 23 20 20 20 20 20  nsidered .#     
0360: 20 20 20 20 20 20 20 20 20 20 69 6e 20 74 68 65            in the
0370: 20 73 61 6d 65 20 77 61 79 20 61 73 20 63 6f 6e   same way as con
0380: 73 74 61 6e 74 73 20 77 68 65 6e 20 70 6c 61 6e  stants when plan
0390: 6e 69 6e 67 20 71 75 65 72 69 65 73 20 74 68 61  ning queries tha
03a0: 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  t.#             
03b0: 20 20 75 73 65 20 72 61 6e 67 65 20 63 6f 6e 73    use range cons
03c0: 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 61 6e 61  traints..#.# ana
03d0: 6c 79 7a 65 33 2d 32 2e 2a 3a 20 54 65 73 74 20  lyze3-2.*: Test 
03e0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
03f0: 6f 66 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74  of bound paramet
0400: 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
0410: 65 64 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  ed .#           
0420: 20 20 20 20 69 6e 20 74 68 65 20 73 61 6d 65 20      in the same 
0430: 77 61 79 20 61 73 20 63 6f 6e 73 74 61 6e 74 73  way as constants
0440: 20 77 68 65 6e 20 70 6c 61 6e 6e 69 6e 67 20 71   when planning q
0450: 75 65 72 69 65 73 20 74 68 61 74 0a 23 20 20 20  ueries that.#   
0460: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 20              use 
0470: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 73  LIKE expressions
0480: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
0490: 61 75 73 65 2e 0a 23 0a 23 20 61 6e 61 6c 79 7a  ause..#.# analyz
04a0: 65 33 2d 33 2e 2a 3a 20 54 65 73 74 20 74 68 61  e3-3.*: Test tha
04b0: 74 20 62 69 6e 64 69 6e 67 20 74 6f 20 61 20 76  t binding to a v
04c0: 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  ariable does not
04d0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
04e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
04f0: 20 71 75 65 72 79 20 70 6c 61 6e 20 77 68 65 6e   query plan when
0500: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
0510: 20 69 6e 20 77 68 69 63 68 20 72 65 70 6c 61 6e   in which replan
0520: 6e 69 6e 67 20 74 68 65 0a 23 20 20 20 20 20 20  ning the.#      
0530: 20 20 20 20 20 20 20 20 20 71 75 65 72 79 20 6d           query m
0540: 61 79 20 70 72 6f 64 75 63 65 20 61 20 73 75 70  ay produce a sup
0550: 65 72 69 6f 72 20 6f 75 74 63 6f 6d 65 2e 0a 23  erior outcome..#
0560: 0a 23 20 61 6e 61 6c 79 7a 65 33 2d 34 2e 2a 3a  .# analyze3-4.*:
0570: 20 54 65 73 74 20 74 68 61 74 20 53 51 4c 20 6f   Test that SQL o
0580: 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
0590: 63 61 6c 6c 62 61 63 6b 20 65 72 72 6f 72 73 20  callback errors 
05a0: 6f 63 63 75 72 69 6e 67 0a 23 20 20 20 20 20 20  occuring.#      
05b0: 20 20 20 20 20 20 20 20 20 77 69 74 68 69 6e 20           within 
05c0: 73 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65  sqlite3Reprepare
05d0: 28 29 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63  () are handled c
05e0: 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 23 20 61 6e  orrectly..#.# an
05f0: 61 6c 79 7a 65 33 2d 35 2e 2a 3a 20 43 68 65 63  alyze3-5.*: Chec
0600: 6b 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  k that the query
0610: 20 70 6c 61 6e 73 20 6f 66 20 61 70 70 6c 69 63   plans of applic
0620: 61 62 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20  able statements 
0630: 61 72 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  are.#           
0640: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 64 20      invalidated 
0650: 69 66 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  if the values of
0660: 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20 61   SQL parameter a
0670: 72 65 20 6d 6f 64 69 66 69 65 64 0a 23 20 20 20  re modified.#   
0680: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
0690: 67 20 74 68 65 20 63 6c 65 61 72 5f 62 69 6e 64  g the clear_bind
06a0: 69 6e 67 73 28 29 20 6f 72 20 74 72 61 6e 73 66  ings() or transf
06b0: 65 72 5f 62 69 6e 64 69 6e 67 73 28 29 20 41 50  er_bindings() AP
06c0: 49 73 2e 0a 23 20 0a 23 20 61 6e 61 6c 79 7a 65  Is..# .# analyze
06d0: 33 2d 36 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  3-6.*: Test that
06e0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 69 78   the problem fix
06f0: 65 64 20 62 79 20 63 6f 6d 6d 69 74 20 5b 31 32  ed by commit [12
0700: 37 61 35 62 37 37 36 64 5d 20 69 73 20 66 69 78  7a5b776d] is fix
0710: 65 64 2e 0a 23 0a 23 20 61 6e 61 6c 79 7a 65 33  ed..#.# analyze3
0720: 2d 37 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  -7.*: Test that 
0730: 73 6f 6d 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  some memory leak
0740: 73 20 64 69 73 63 6f 76 65 72 65 64 20 62 79 20  s discovered by 
0750: 66 75 7a 7a 20 74 65 73 74 69 6e 67 20 0a 23 20  fuzz testing .# 
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61                ha
0770: 76 65 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23  ve been fixed..#
0780: 0a 0a 70 72 6f 63 20 67 65 74 76 61 72 20 7b 76  ..proc getvar {v
0790: 61 72 6e 61 6d 65 7d 20 7b 20 75 70 6c 65 76 65  arname} { upleve
07a0: 6c 20 23 30 20 73 65 74 20 24 76 61 72 6e 61 6d  l #0 set $varnam
07b0: 65 20 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20  e }.db function 
07c0: 76 61 72 20 67 65 74 76 61 72 0a 0a 70 72 6f 63  var getvar..proc
07d0: 20 65 71 70 20 7b 73 71 6c 20 7b 64 62 20 64 62   eqp {sql {db db
07e0: 7d 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 65  }} {.  uplevel e
07f0: 78 65 63 73 71 6c 20 5b 6c 69 73 74 20 22 45 58  xecsql [list "EX
0800: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0810: 20 24 73 71 6c 22 5d 20 24 64 62 0a 7d 0a 0a 70   $sql"] $db.}..p
0820: 72 6f 63 20 73 66 5f 65 78 65 63 73 71 6c 20 7b  roc sf_execsql {
0830: 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20  sql {db db}} {. 
0840: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 65   set ::sqlite_se
0850: 61 72 63 68 5f 63 6f 75 6e 74 20 30 0a 20 20 73  arch_count 0.  s
0860: 65 74 20 72 20 5b 75 70 6c 65 76 65 6c 20 5b 6c  et r [uplevel [l
0870: 69 73 74 20 65 78 65 63 73 71 6c 20 24 73 71 6c  ist execsql $sql
0880: 20 24 64 62 5d 5d 0a 0a 20 20 63 6f 6e 63 61 74   $db]]..  concat
0890: 20 24 3a 3a 73 71 6c 69 74 65 5f 73 65 61 72 63   $::sqlite_searc
08a0: 68 5f 63 6f 75 6e 74 20 5b 24 64 62 20 73 74 61  h_count [$db sta
08b0: 74 75 73 20 73 74 65 70 5d 20 24 72 0a 7d 0a 0a  tus step] $r.}..
08c0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 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 0a 23 0a 23 20 61  ----------.#.# a
0910: 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 31 3a 20 0a  nalyze3-1.1.1: .
0920: 23 20 20 20 43 72 65 61 74 65 20 61 20 74 61 62  #   Create a tab
0930: 6c 65 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75  le with two colu
0940: 6d 6e 73 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  mns. Populate th
0950: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 28  e first column (
0960: 61 66 66 69 6e 69 74 79 20 0a 23 20 20 20 49 4e  affinity .#   IN
0970: 54 45 47 45 52 29 20 77 69 74 68 20 69 6e 74 65  TEGER) with inte
0980: 67 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  ger values from 
0990: 31 30 30 20 74 6f 20 31 31 30 30 2e 20 43 72 65  100 to 1100. Cre
09a0: 61 74 65 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20  ate an index on 
09b0: 74 68 69 73 20 0a 23 20 20 20 63 6f 6c 75 6d 6e  this .#   column
09c0: 2e 20 41 4e 41 4c 59 5a 45 20 74 68 65 20 74 61  . ANALYZE the ta
09d0: 62 6c 65 2e 0a 23 0a 23 20 61 6e 61 6c 79 7a 65  ble..#.# analyze
09e0: 33 2d 31 2e 31 2e 32 20 2d 20 33 2e 31 2e 33 0a  3-1.1.2 - 3.1.3.
09f0: 23 20 20 20 53 68 6f 77 20 74 68 61 74 20 74 68  #   Show that th
0a00: 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
0a10: 69 62 6c 65 20 70 6c 61 6e 73 20 66 6f 72 20 71  ible plans for q
0a20: 75 65 72 79 69 6e 67 20 74 68 65 20 74 61 62 6c  uerying the tabl
0a30: 65 20 77 69 74 68 0a 23 20 20 20 61 20 72 61 6e  e with.#   a ran
0a40: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ge constraint on
0a50: 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c   the indexed col
0a60: 75 6d 6e 20 2d 20 22 66 75 6c 6c 20 74 61 62 6c  umn - "full tabl
0a70: 65 20 73 63 61 6e 22 20 6f 72 20 22 75 73 65 20  e scan" or "use 
0a80: 0a 23 20 20 20 74 68 65 20 69 6e 64 65 78 22 2e  .#   the index".
0a90: 20 57 68 65 6e 20 74 68 65 20 72 61 6e 67 65 20   When the range 
0aa0: 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
0ab0: 6e 67 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  ng literal value
0ac0: 73 2c 20 53 51 4c 69 74 65 0a 23 20 20 20 69 73  s, SQLite.#   is
0ad0: 20 61 62 6c 65 20 74 6f 20 70 69 63 6b 20 74 68   able to pick th
0ae0: 65 20 62 65 73 74 20 70 6c 61 6e 20 62 61 73 65  e best plan base
0af0: 64 20 6f 6e 20 74 68 65 20 73 61 6d 70 6c 65 73  d on the samples
0b00: 20 69 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33   in sqlite_stat3
0b10: 2e 0a 23 0a 23 20 61 6e 61 6c 79 7a 65 33 2d 31  ..#.# analyze3-1
0b20: 2e 31 2e 34 20 2d 20 33 2e 31 2e 39 0a 23 20 20  .1.4 - 3.1.9.#  
0b30: 20 53 68 6f 77 20 74 68 61 74 20 75 73 69 6e 67   Show that using
0b40: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 20 70   SQL variables p
0b50: 72 6f 64 75 63 65 73 20 74 68 65 20 73 61 6d 65  roduces the same
0b60: 20 72 65 73 75 6c 74 73 20 61 73 20 75 73 69 6e   results as usin
0b70: 67 0a 23 20 20 20 6c 69 74 65 72 61 6c 20 76 61  g.#   literal va
0b80: 6c 75 65 73 20 74 6f 20 63 6f 6e 73 74 72 61 69  lues to constrai
0b90: 6e 20 74 68 65 20 72 61 6e 67 65 20 73 63 61 6e  n the range scan
0ba0: 2e 0a 23 0a 23 20 20 20 54 68 65 73 65 20 74 65  ..#.#   These te
0bb0: 73 74 73 20 61 6c 73 6f 20 63 68 65 63 6b 20 74  sts also check t
0bc0: 68 61 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  hat the compiler
0bd0: 20 63 6f 64 65 20 63 6f 6e 73 69 64 65 72 73 20   code considers 
0be0: 63 6f 6c 75 6d 6e 20 0a 23 20 20 20 61 66 66 69  column .#   affi
0bf0: 6e 69 74 69 65 73 20 77 68 65 6e 20 65 73 74 69  nities when esti
0c00: 6d 61 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  mating the numbe
0c10: 72 20 6f 66 20 72 6f 77 73 20 73 63 61 6e 6e 65  r of rows scanne
0c20: 64 20 62 79 20 74 68 65 20 22 75 73 65 20 0a 23  d by the "use .#
0c30: 20 20 20 69 6e 64 65 78 20 73 74 72 61 74 65 67     index strateg
0c40: 79 22 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e  y"..#.do_test an
0c50: 61 6c 79 7a 65 33 2d 31 2e 31 2e 31 20 7b 0a 20  alyze3-1.1.1 {. 
0c60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0c70: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
0c80: 20 54 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45   TABLE t1(x INTE
0c90: 47 45 52 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  GER, y);.    CRE
0ca0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0cb0: 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  t1(x);.  }.  for
0cc0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
0cd0: 20 31 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20   1000} {incr i} 
0ce0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
0cf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0d00: 41 4c 55 45 53 28 24 69 2b 31 30 30 2c 20 24 69  ALUES($i+100, $i
0d10: 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ) }.  }.  execsq
0d20: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
0d30: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d      ANALYZE;.  }
0d40: 0a 0a 20 20 69 66 63 61 70 61 62 6c 65 20 73 74  ..  ifcapable st
0d50: 61 74 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  at4 {.    execsq
0d60: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
0d70: 28 2a 29 3e 30 20 46 52 4f 4d 20 73 71 6c 69 74  (*)>0 FROM sqlit
0d80: 65 5f 73 74 61 74 34 3b 20 7d 0a 20 20 7d 20 65  e_stat4; }.  } e
0d90: 6c 73 65 20 7b 0a 20 20 20 20 65 78 65 63 73 71  lse {.    execsq
0da0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
0db0: 28 2a 29 3e 30 20 46 52 4f 4d 20 73 71 6c 69 74  (*)>0 FROM sqlit
0dc0: 65 5f 73 74 61 74 33 3b 20 7d 0a 20 20 7d 0a 7d  e_stat3; }.  }.}
0dd0: 20 7b 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   {1}..do_execsql
0de0: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31  _test analyze3-1
0df0: 2e 31 2e 78 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.x {.  SELECT 
0e00: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
0e10: 20 57 48 45 52 45 20 78 3e 32 30 30 20 41 4e 44   WHERE x>200 AND
0e20: 20 78 3c 33 30 30 3b 0a 20 20 53 45 4c 45 43 54   x<300;.  SELECT
0e30: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0e40: 31 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20  1 WHERE x>0 AND 
0e50: 78 3c 31 31 30 30 3b 0a 7d 20 7b 39 39 20 31 30  x<1100;.} {99 10
0e60: 30 30 7d 0a 0a 23 20 54 68 65 20 66 69 72 73 74  00}..# The first
0e70: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0e80: 67 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61  g two SELECT sta
0e90: 74 65 6d 65 6e 74 73 20 76 69 73 69 74 73 20 39  tements visits 9
0ea0: 39 20 72 6f 77 73 2e 20 53 6f 0a 23 20 69 74 20  9 rows. So.# it 
0eb0: 69 73 20 62 65 74 74 65 72 20 74 6f 20 75 73 65  is better to use
0ec0: 20 74 68 65 20 69 6e 64 65 78 2e 20 42 75 74 20   the index. But 
0ed0: 74 68 65 20 73 65 63 6f 6e 64 20 76 69 73 69 74  the second visit
0ee0: 73 20 65 76 65 72 79 20 72 6f 77 20 69 6e 20 0a  s every row in .
0ef0: 23 20 74 68 65 20 74 61 62 6c 65 20 28 31 30 30  # the table (100
0f00: 30 20 69 6e 20 74 6f 74 61 6c 29 20 73 6f 20 69  0 in total) so i
0f10: 74 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 64  t is better to d
0f20: 6f 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  o a full-table s
0f30: 63 61 6e 2e 0a 23 0a 64 6f 5f 65 71 70 5f 74 65  can..#.do_eqp_te
0f40: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e  st analyze3-1.1.
0f50: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d  2 {.  SELECT sum
0f60: 28 79 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (y) FROM t1 WHER
0f70: 45 20 78 3e 32 30 30 20 41 4e 44 20 78 3c 33 30  E x>200 AND x<30
0f80: 30 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52  0.} {0 0 0 {SEAR
0f90: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
0fa0: 47 20 49 4e 44 45 58 20 69 31 20 28 78 3e 3f 20  G INDEX i1 (x>? 
0fb0: 41 4e 44 20 78 3c 3f 29 7d 7d 0a 64 6f 5f 65 71  AND x<?)}}.do_eq
0fc0: 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  p_test analyze3-
0fd0: 31 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  1.1.3 {.  SELECT
0fe0: 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 31 20   sum(y) FROM t1 
0ff0: 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20 78 3c  WHERE x>0 AND x<
1000: 31 31 30 30 20 0a 7d 20 7b 30 20 30 20 30 20 7b  1100 .} {0 0 0 {
1010: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 7d 0a  SCAN TABLE t1}}.
1020: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
1030: 33 2d 31 2e 31 2e 34 20 7b 0a 20 20 73 66 5f 65  3-1.1.4 {.  sf_e
1040: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
1050: 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 31 20 57  sum(y) FROM t1 W
1060: 48 45 52 45 20 78 3e 32 30 30 20 41 4e 44 20 78  HERE x>200 AND x
1070: 3c 33 30 30 20 7d 0a 7d 20 7b 31 39 39 20 30 20  <300 }.} {199 0 
1080: 31 34 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61  14850}.do_test a
1090: 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 35 20 7b 0a  nalyze3-1.1.5 {.
10a0: 20 20 73 65 74 20 6c 20 5b 73 74 72 69 6e 67 20    set l [string 
10b0: 72 61 6e 67 65 20 22 32 30 30 22 20 30 20 65 6e  range "200" 0 en
10c0: 64 5d 0a 20 20 73 65 74 20 75 20 5b 73 74 72 69  d].  set u [stri
10d0: 6e 67 20 72 61 6e 67 65 20 22 33 30 30 22 20 30  ng range "300" 0
10e0: 20 65 6e 64 5d 0a 20 20 73 66 5f 65 78 65 63 73   end].  sf_execs
10f0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28  ql { SELECT sum(
1100: 79 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  y) FROM t1 WHERE
1110: 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75 20 7d   x>$l AND x<$u }
1120: 0a 7d 20 7b 31 39 39 20 30 20 31 34 38 35 30 7d  .} {199 0 14850}
1130: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
1140: 33 2d 31 2e 31 2e 36 20 7b 0a 20 20 73 65 74 20  3-1.1.6 {.  set 
1150: 6c 20 5b 65 78 70 72 20 69 6e 74 28 32 30 30 29  l [expr int(200)
1160: 5d 0a 20 20 73 65 74 20 75 20 5b 65 78 70 72 20  ].  set u [expr 
1170: 69 6e 74 28 33 30 30 29 5d 0a 20 20 73 66 5f 65  int(300)].  sf_e
1180: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
1190: 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 31 20 57  sum(y) FROM t1 W
11a0: 48 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c  HERE x>$l AND x<
11b0: 24 75 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31 34  $u }.} {199 0 14
11c0: 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61  850}.do_test ana
11d0: 6c 79 7a 65 33 2d 31 2e 31 2e 37 20 7b 0a 20 20  lyze3-1.1.7 {.  
11e0: 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  sf_execsql { SEL
11f0: 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20  ECT sum(y) FROM 
1200: 74 31 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44  t1 WHERE x>0 AND
1210: 20 78 3c 31 31 30 30 20 7d 0a 7d 20 7b 39 39 39   x<1100 }.} {999
1220: 20 39 39 39 20 34 39 39 35 30 30 7d 0a 64 6f 5f   999 499500}.do_
1230: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e  test analyze3-1.
1240: 31 2e 38 20 7b 0a 20 20 73 65 74 20 6c 20 5b 73  1.8 {.  set l [s
1250: 74 72 69 6e 67 20 72 61 6e 67 65 20 22 30 22 20  tring range "0" 
1260: 30 20 65 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b  0 end].  set u [
1270: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 31 31  string range "11
1280: 30 30 22 20 30 20 65 6e 64 5d 0a 20 20 73 66 5f  00" 0 end].  sf_
1290: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
12a0: 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 31 20   sum(y) FROM t1 
12b0: 57 48 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78  WHERE x>$l AND x
12c0: 3c 24 75 20 7d 0a 7d 20 7b 39 39 39 20 39 39 39  <$u }.} {999 999
12d0: 20 34 39 39 35 30 30 7d 0a 64 6f 5f 74 65 73 74   499500}.do_test
12e0: 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 39 20   analyze3-1.1.9 
12f0: 7b 0a 20 20 73 65 74 20 6c 20 5b 65 78 70 72 20  {.  set l [expr 
1300: 69 6e 74 28 30 29 5d 0a 20 20 73 65 74 20 75 20  int(0)].  set u 
1310: 5b 65 78 70 72 20 69 6e 74 28 31 31 30 30 29 5d  [expr int(1100)]
1320: 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20  .  sf_execsql { 
1330: 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52  SELECT sum(y) FR
1340: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e 24 6c  OM t1 WHERE x>$l
1350: 20 41 4e 44 20 78 3c 24 75 20 7d 0a 7d 20 7b 39   AND x<$u }.} {9
1360: 39 39 20 39 39 39 20 34 39 39 35 30 30 7d 0a 0a  99 999 499500}..
1370: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1380: 20 74 65 73 74 73 20 61 72 65 20 73 69 6d 69 6c   tests are simil
1390: 61 72 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ar to the block 
13a0: 61 62 6f 76 65 2e 20 54 68 65 20 64 69 66 66 65  above. The diffe
13b0: 72 65 6e 63 65 20 69 73 0a 23 20 74 68 61 74 20  rence is.# that 
13c0: 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  the indexed colu
13d0: 6d 6e 20 68 61 73 20 54 45 58 54 20 61 66 66 69  mn has TEXT affi
13e0: 6e 69 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  nity in this cas
13f0: 65 2e 20 49 6e 20 74 68 65 20 74 65 73 74 73 0a  e. In the tests.
1400: 23 20 61 62 6f 76 65 20 74 68 65 20 61 66 66 69  # above the affi
1410: 6e 69 74 79 20 69 73 20 49 4e 54 45 47 45 52 2e  nity is INTEGER.
1420: 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  .#.do_test analy
1430: 7a 65 33 2d 31 2e 32 2e 31 20 7b 0a 20 20 65 78  ze3-1.2.1 {.  ex
1440: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1450: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
1460: 54 41 42 4c 45 20 74 32 28 78 20 54 45 58 54 2c  TABLE t2(x TEXT,
1470: 20 79 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   y);.      INSER
1480: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
1490: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
14a0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
14b0: 32 20 4f 4e 20 74 32 28 78 29 3b 0a 20 20 20 20  2 ON t2(x);.    
14c0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 41 4e 41 4c  COMMIT;.    ANAL
14d0: 59 5a 45 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  YZE;.  }.} {}.do
14e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 61 6e  _execsql_test an
14f0: 61 6c 79 7a 65 33 2d 32 2e 31 2e 78 20 7b 0a 20  alyze3-2.1.x {. 
1500: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1510: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78   FROM t2 WHERE x
1520: 3e 31 20 41 4e 44 20 78 3c 32 3b 0a 20 20 53 45  >1 AND x<2;.  SE
1530: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1540: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 30 20  OM t2 WHERE x>0 
1550: 41 4e 44 20 78 3c 39 39 3b 0a 7d 20 7b 32 30 30  AND x<99;.} {200
1560: 20 39 39 30 7d 0a 64 6f 5f 65 71 70 5f 74 65 73   990}.do_eqp_tes
1570: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 32  t analyze3-1.2.2
1580: 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d 28   {.  SELECT sum(
1590: 79 29 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  y) FROM t2 WHERE
15a0: 20 78 3e 31 20 41 4e 44 20 78 3c 32 0a 7d 20 7b   x>1 AND x<2.} {
15b0: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
15c0: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44  BLE t2 USING IND
15d0: 45 58 20 69 32 20 28 78 3e 3f 20 41 4e 44 20 78  EX i2 (x>? AND x
15e0: 3c 3f 29 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  <?)}}.do_eqp_tes
15f0: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 33  t analyze3-1.2.3
1600: 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d 28   {.  SELECT sum(
1610: 79 29 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  y) FROM t2 WHERE
1620: 20 78 3e 30 20 41 4e 44 20 78 3c 39 39 0a 7d 20   x>0 AND x<99.} 
1630: 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42  {0 0 0 {SCAN TAB
1640: 4c 45 20 74 32 7d 7d 0a 0a 64 6f 5f 74 65 73 74  LE t2}}..do_test
1650: 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 34 20   analyze3-1.2.4 
1660: 7b 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b  {.  sf_execsql {
1670: 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46   SELECT sum(y) F
1680: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 31  ROM t2 WHERE x>1
1690: 32 20 41 4e 44 20 78 3c 32 30 20 7d 0a 7d 20 7b  2 AND x<20 }.} {
16a0: 31 36 31 20 30 20 34 37 36 30 7d 0a 64 6f 5f 74  161 0 4760}.do_t
16b0: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32  est analyze3-1.2
16c0: 2e 35 20 7b 0a 20 20 73 65 74 20 6c 20 5b 73 74  .5 {.  set l [st
16d0: 72 69 6e 67 20 72 61 6e 67 65 20 22 31 32 22 20  ring range "12" 
16e0: 30 20 65 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b  0 end].  set u [
16f0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 32 30  string range "20
1700: 22 20 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65 78  " 0 end].  sf_ex
1710: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79  ecsql {SELECT ty
1720: 70 65 6f 66 28 24 6c 29 2c 20 74 79 70 65 6f 66  peof($l), typeof
1730: 28 24 75 29 2c 20 73 75 6d 28 79 29 20 46 52 4f  ($u), sum(y) FRO
1740: 4d 20 74 32 20 57 48 45 52 45 20 78 3e 24 6c 20  M t2 WHERE x>$l 
1750: 41 4e 44 20 78 3c 24 75 7d 0a 7d 20 7b 31 36 31  AND x<$u}.} {161
1760: 20 30 20 74 65 78 74 20 74 65 78 74 20 34 37 36   0 text text 476
1770: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
1780: 7a 65 33 2d 31 2e 32 2e 36 20 7b 0a 20 20 73 65  ze3-1.2.6 {.  se
1790: 74 20 6c 20 5b 65 78 70 72 20 69 6e 74 28 31 32  t l [expr int(12
17a0: 29 5d 0a 20 20 73 65 74 20 75 20 5b 65 78 70 72  )].  set u [expr
17b0: 20 69 6e 74 28 32 30 29 5d 0a 20 20 73 66 5f 65   int(20)].  sf_e
17c0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74  xecsql {SELECT t
17d0: 79 70 65 6f 66 28 24 6c 29 2c 20 74 79 70 65 6f  ypeof($l), typeo
17e0: 66 28 24 75 29 2c 20 73 75 6d 28 79 29 20 46 52  f($u), sum(y) FR
17f0: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 24 6c  OM t2 WHERE x>$l
1800: 20 41 4e 44 20 78 3c 24 75 7d 0a 7d 20 7b 31 36   AND x<$u}.} {16
1810: 31 20 30 20 69 6e 74 65 67 65 72 20 69 6e 74 65  1 0 integer inte
1820: 67 65 72 20 34 37 36 30 7d 0a 64 6f 5f 74 65 73  ger 4760}.do_tes
1830: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 37  t analyze3-1.2.7
1840: 20 7b 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20   {.  sf_execsql 
1850: 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20  { SELECT sum(y) 
1860: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e  FROM t2 WHERE x>
1870: 30 20 41 4e 44 20 78 3c 39 39 20 7d 0a 7d 20 7b  0 AND x<99 }.} {
1880: 39 39 39 20 39 39 39 20 34 39 30 35 35 35 7d 0a  999 999 490555}.
1890: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
18a0: 2d 31 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20 6c  -1.2.8 {.  set l
18b0: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22   [string range "
18c0: 30 22 20 30 20 65 6e 64 5d 0a 20 20 73 65 74 20  0" 0 end].  set 
18d0: 75 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  u [string range 
18e0: 22 39 39 22 20 30 20 65 6e 64 5d 0a 20 20 73 66  "99" 0 end].  sf
18f0: 5f 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  _execsql {SELECT
1900: 20 74 79 70 65 6f 66 28 24 6c 29 2c 20 74 79 70   typeof($l), typ
1910: 65 6f 66 28 24 75 29 2c 20 73 75 6d 28 79 29 20  eof($u), sum(y) 
1920: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e  FROM t2 WHERE x>
1930: 24 6c 20 41 4e 44 20 78 3c 24 75 7d 0a 7d 20 7b  $l AND x<$u}.} {
1940: 39 39 39 20 39 39 39 20 74 65 78 74 20 74 65 78  999 999 text tex
1950: 74 20 34 39 30 35 35 35 7d 0a 64 6f 5f 74 65 73  t 490555}.do_tes
1960: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 39  t analyze3-1.2.9
1970: 20 7b 0a 20 20 73 65 74 20 6c 20 5b 65 78 70 72   {.  set l [expr
1980: 20 69 6e 74 28 30 29 5d 0a 20 20 73 65 74 20 75   int(0)].  set u
1990: 20 5b 65 78 70 72 20 69 6e 74 28 39 39 29 5d 0a   [expr int(99)].
19a0: 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 53 45    sf_execsql {SE
19b0: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 6c 29 2c  LECT typeof($l),
19c0: 20 74 79 70 65 6f 66 28 24 75 29 2c 20 73 75 6d   typeof($u), sum
19d0: 28 79 29 20 46 52 4f 4d 20 74 32 20 57 48 45 52  (y) FROM t2 WHER
19e0: 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75 7d  E x>$l AND x<$u}
19f0: 0a 7d 20 7b 39 39 39 20 39 39 39 20 69 6e 74 65  .} {999 999 inte
1a00: 67 65 72 20 69 6e 74 65 67 65 72 20 34 39 30 35  ger integer 4905
1a10: 35 35 7d 0a 0a 23 20 53 61 6d 65 20 74 65 73 74  55}..# Same test
1a20: 73 20 61 20 74 68 69 72 64 20 74 69 6d 65 2e 20  s a third time. 
1a30: 54 68 69 73 20 74 69 6d 65 2c 20 63 6f 6c 75 6d  This time, colum
1a40: 6e 20 78 20 68 61 73 20 49 4e 54 45 47 45 52 20  n x has INTEGER 
1a50: 61 66 66 69 6e 69 74 79 20 61 6e 64 0a 23 20 69  affinity and.# i
1a60: 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f  s not the leftmo
1a70: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1a80: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 74 72 69   table. This tri
1a90: 67 67 65 72 65 64 20 61 20 62 75 67 20 63 61 75  ggered a bug cau
1aa0: 73 69 6e 67 0a 23 20 53 51 4c 69 74 65 20 74 6f  sing.# SQLite to
1ab0: 20 75 73 65 20 73 75 62 2d 6f 70 74 69 6d 61 6c   use sub-optimal
1ac0: 20 71 75 65 72 79 20 70 6c 61 6e 73 20 69 6e 20   query plans in 
1ad0: 33 2e 36 2e 31 38 20 61 6e 64 20 65 61 72 6c 69  3.6.18 and earli
1ae0: 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e  er..#.do_test an
1af0: 61 6c 79 7a 65 33 2d 31 2e 33 2e 31 20 7b 0a 20  alyze3-1.3.1 {. 
1b00: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
1b10: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
1b20: 54 45 20 54 41 42 4c 45 20 74 33 28 79 20 54 45  TE TABLE t3(y TE
1b30: 58 54 2c 20 78 20 49 4e 54 45 47 45 52 29 3b 0a  XT, x INTEGER);.
1b40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1b50: 4f 20 74 33 20 53 45 4c 45 43 54 20 79 2c 20 78  O t3 SELECT y, x
1b60: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
1b70: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
1b80: 4f 4e 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f  ON t3(x);.    CO
1b90: 4d 4d 49 54 3b 0a 20 20 20 20 41 4e 41 4c 59 5a  MMIT;.    ANALYZ
1ba0: 45 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65  E;.  }.} {}.do_e
1bb0: 78 65 63 73 71 6c 5f 74 65 73 74 20 61 6e 61 6c  xecsql_test anal
1bc0: 79 7a 65 33 2d 31 2e 33 2e 78 20 7b 0a 20 20 53  yze3-1.3.x {.  S
1bd0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1be0: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 78 3e 32  ROM t3 WHERE x>2
1bf0: 30 30 20 41 4e 44 20 78 3c 33 30 30 3b 0a 20 20  00 AND x<300;.  
1c00: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1c10: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 78 3e  FROM t3 WHERE x>
1c20: 30 20 41 4e 44 20 78 3c 31 31 30 30 0a 7d 20 7b  0 AND x<1100.} {
1c30: 39 39 20 31 30 30 30 7d 0a 64 6f 5f 65 71 70 5f  99 1000}.do_eqp_
1c40: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e  test analyze3-1.
1c50: 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 73  3.2 {.  SELECT s
1c60: 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20 57 48  um(y) FROM t3 WH
1c70: 45 52 45 20 78 3e 32 30 30 20 41 4e 44 20 78 3c  ERE x>200 AND x<
1c80: 33 30 30 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45  300.} {0 0 0 {SE
1c90: 41 52 43 48 20 54 41 42 4c 45 20 74 33 20 55 53  ARCH TABLE t3 US
1ca0: 49 4e 47 20 49 4e 44 45 58 20 69 33 20 28 78 3e  ING INDEX i3 (x>
1cb0: 3f 20 41 4e 44 20 78 3c 3f 29 7d 7d 0a 64 6f 5f  ? AND x<?)}}.do_
1cc0: 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  eqp_test analyze
1cd0: 33 2d 31 2e 33 2e 33 20 7b 0a 20 20 53 45 4c 45  3-1.3.3 {.  SELE
1ce0: 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74  CT sum(y) FROM t
1cf0: 33 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20  3 WHERE x>0 AND 
1d00: 78 3c 31 31 30 30 0a 7d 20 7b 30 20 30 20 30 20  x<1100.} {0 0 0 
1d10: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33 7d 7d  {SCAN TABLE t3}}
1d20: 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  ..do_test analyz
1d30: 65 33 2d 31 2e 33 2e 34 20 7b 0a 20 20 73 66 5f  e3-1.3.4 {.  sf_
1d40: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1d50: 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20   sum(y) FROM t3 
1d60: 57 48 45 52 45 20 78 3e 32 30 30 20 41 4e 44 20  WHERE x>200 AND 
1d70: 78 3c 33 30 30 20 7d 0a 7d 20 7b 31 39 39 20 30  x<300 }.} {199 0
1d80: 20 31 34 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20   14850}.do_test 
1d90: 61 6e 61 6c 79 7a 65 33 2d 31 2e 33 2e 35 20 7b  analyze3-1.3.5 {
1da0: 0a 20 20 73 65 74 20 6c 20 5b 73 74 72 69 6e 67  .  set l [string
1db0: 20 72 61 6e 67 65 20 22 32 30 30 22 20 30 20 65   range "200" 0 e
1dc0: 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b 73 74 72  nd].  set u [str
1dd0: 69 6e 67 20 72 61 6e 67 65 20 22 33 30 30 22 20  ing range "300" 
1de0: 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65 78 65 63  0 end].  sf_exec
1df0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
1e00: 28 79 29 20 46 52 4f 4d 20 74 33 20 57 48 45 52  (y) FROM t3 WHER
1e10: 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75 20  E x>$l AND x<$u 
1e20: 7d 0a 7d 20 7b 31 39 39 20 30 20 31 34 38 35 30  }.} {199 0 14850
1e30: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
1e40: 65 33 2d 31 2e 33 2e 36 20 7b 0a 20 20 73 65 74  e3-1.3.6 {.  set
1e50: 20 6c 20 5b 65 78 70 72 20 69 6e 74 28 32 30 30   l [expr int(200
1e60: 29 5d 0a 20 20 73 65 74 20 75 20 5b 65 78 70 72  )].  set u [expr
1e70: 20 69 6e 74 28 33 30 30 29 5d 0a 20 20 73 66 5f   int(300)].  sf_
1e80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1e90: 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20   sum(y) FROM t3 
1ea0: 57 48 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78  WHERE x>$l AND x
1eb0: 3c 24 75 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31  <$u }.} {199 0 1
1ec0: 34 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  4850}.do_test an
1ed0: 61 6c 79 7a 65 33 2d 31 2e 33 2e 37 20 7b 0a 20  alyze3-1.3.7 {. 
1ee0: 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53 45   sf_execsql { SE
1ef0: 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d  LECT sum(y) FROM
1f00: 20 74 33 20 57 48 45 52 45 20 78 3e 30 20 41 4e   t3 WHERE x>0 AN
1f10: 44 20 78 3c 31 31 30 30 20 7d 0a 7d 20 7b 39 39  D x<1100 }.} {99
1f20: 39 20 39 39 39 20 34 39 39 35 30 30 7d 0a 64 6f  9 999 499500}.do
1f30: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31  _test analyze3-1
1f40: 2e 33 2e 38 20 7b 0a 20 20 73 65 74 20 6c 20 5b  .3.8 {.  set l [
1f50: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 30 22  string range "0"
1f60: 20 30 20 65 6e 64 5d 0a 20 20 73 65 74 20 75 20   0 end].  set u 
1f70: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 31  [string range "1
1f80: 31 30 30 22 20 30 20 65 6e 64 5d 0a 20 20 73 66  100" 0 end].  sf
1f90: 5f 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  _execsql { SELEC
1fa0: 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 33  T sum(y) FROM t3
1fb0: 20 57 48 45 52 45 20 78 3e 24 6c 20 41 4e 44 20   WHERE x>$l AND 
1fc0: 78 3c 24 75 20 7d 0a 7d 20 7b 39 39 39 20 39 39  x<$u }.} {999 99
1fd0: 39 20 34 39 39 35 30 30 7d 0a 64 6f 5f 74 65 73  9 499500}.do_tes
1fe0: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 33 2e 39  t analyze3-1.3.9
1ff0: 20 7b 0a 20 20 73 65 74 20 6c 20 5b 65 78 70 72   {.  set l [expr
2000: 20 69 6e 74 28 30 29 5d 0a 20 20 73 65 74 20 75   int(0)].  set u
2010: 20 5b 65 78 70 72 20 69 6e 74 28 31 31 30 30 29   [expr int(1100)
2020: 5d 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b  ].  sf_execsql {
2030: 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46   SELECT sum(y) F
2040: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 78 3e 24  ROM t3 WHERE x>$
2050: 6c 20 41 4e 44 20 78 3c 24 75 20 7d 0a 7d 20 7b  l AND x<$u }.} {
2060: 39 39 39 20 39 39 39 20 34 39 39 35 30 30 7d 0a  999 999 499500}.
2070: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
20c0: 73 74 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  st that the valu
20d0: 65 73 20 6f 66 20 62 6f 75 6e 64 20 53 51 4c 20  es of bound SQL 
20e0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 62 65  variables may be
20f0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4c 49   used for the LI
2100: 4b 45 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69 6f  KE.# optimizatio
2110: 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  n..#.drop_all_ta
2120: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 61 6e 61  bles.do_test ana
2130: 6c 79 7a 65 33 2d 32 2e 31 20 7b 0a 20 20 65 78  lyze3-2.1 {.  ex
2140: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
2150: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
2160: 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 20 20  e_like=off;.    
2170: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
2180: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
2190: 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  TEXT COLLATE noc
21a0: 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ase);.    CREATE
21b0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
21c0: 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  b);.  }.  for {s
21d0: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30  et i 0} {$i < 10
21e0: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
21f0: 20 20 20 73 65 74 20 74 20 22 22 0a 20 20 20 20     set t "".    
2200: 61 70 70 65 6e 64 20 74 20 5b 6c 69 6e 64 65 78  append t [lindex
2210: 20 7b 61 20 62 20 63 20 64 20 65 20 66 20 67 20   {a b c d e f g 
2220: 68 20 69 20 6a 7d 20 5b 65 78 70 72 20 24 69 2f  h i j} [expr $i/
2230: 31 30 30 5d 5d 0a 20 20 20 20 61 70 70 65 6e 64  100]].    append
2240: 20 74 20 5b 6c 69 6e 64 65 78 20 7b 61 20 62 20   t [lindex {a b 
2250: 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 7d  c d e f g h i j}
2260: 20 5b 65 78 70 72 20 28 24 69 2f 31 30 29 25 31   [expr ($i/10)%1
2270: 30 5d 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 74  0]].    append t
2280: 20 5b 6c 69 6e 64 65 78 20 7b 61 20 62 20 63 20   [lindex {a b c 
2290: 64 20 65 20 66 20 67 20 68 20 69 20 6a 7d 20 5b  d e f g h i j} [
22a0: 65 78 70 72 20 28 24 69 25 31 30 29 5d 5d 0a 20  expr ($i%10)]]. 
22b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
22c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
22d0: 45 53 28 24 69 2c 20 24 74 29 20 7d 0a 20 20 7d  ES($i, $t) }.  }
22e0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
22f0: 54 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65  T.} {}.do_eqp_te
2300: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 32 20  st analyze3-2.2 
2310: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
2320: 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (a) FROM t1 WHER
2330: 45 20 62 20 4c 49 4b 45 20 27 61 25 27 0a 7d 20  E b LIKE 'a%'.} 
2340: 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54  {0 0 0 {SEARCH T
2350: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e  ABLE t1 USING IN
2360: 44 45 58 20 69 31 20 28 62 3e 3f 20 41 4e 44 20  DEX i1 (b>? AND 
2370: 62 3c 3f 29 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65  b<?)}}.do_eqp_te
2380: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 33 20  st analyze3-2.3 
2390: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
23a0: 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (a) FROM t1 WHER
23b0: 45 20 62 20 4c 49 4b 45 20 27 25 61 27 0a 7d 20  E b LIKE '%a'.} 
23c0: 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42  {0 0 0 {SCAN TAB
23d0: 4c 45 20 74 31 7d 7d 0a 0a 23 20 52 65 74 75 72  LE t1}}..# Retur
23e0: 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  n the first argu
23f0: 6d 65 6e 74 20 69 66 20 6c 69 6b 65 5f 6d 61 74  ment if like_mat
2400: 63 68 5f 62 6c 6f 62 73 20 69 73 20 74 72 75 65  ch_blobs is true
2410: 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 0a 23   (the default).#
2420: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61   or the second a
2430: 72 67 75 6d 65 6e 74 20 69 66 20 6e 6f 74 0a 23  rgument if not.#
2440: 0a 70 72 6f 63 20 69 6c 6d 62 20 7b 61 20 62 7d  .proc ilmb {a b}
2450: 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 6c   {.  ifcapable l
2460: 69 6b 65 5f 6d 61 74 63 68 5f 62 6c 6f 62 73 20  ike_match_blobs 
2470: 7b 72 65 74 75 72 6e 20 24 61 7d 0a 20 20 72 65  {return $a}.  re
2480: 74 75 72 6e 20 24 62 0a 7d 0a 0a 64 6f 5f 74 65  turn $b.}..do_te
2490: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 34 20  st analyze3-2.4 
24a0: 7b 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b  {.  sf_execsql {
24b0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
24c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
24d0: 20 4c 49 4b 45 20 27 61 25 27 20 7d 0a 7d 20 5b   LIKE 'a%' }.} [
24e0: 6c 69 73 74 20 5b 69 6c 6d 62 20 31 30 32 20 31  list [ilmb 102 1
24f0: 30 31 5d 20 30 20 31 30 30 5d 0a 64 6f 5f 74 65  01] 0 100].do_te
2500: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 35 20  st analyze3-2.5 
2510: 7b 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b  {.  sf_execsql {
2520: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2530: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
2540: 20 4c 49 4b 45 20 27 25 61 27 20 7d 0a 7d 20 7b   LIKE '%a' }.} {
2550: 39 39 39 20 39 39 39 20 31 30 30 7d 0a 0a 64 6f  999 999 100}..do
2560: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32  _test analyze3-2
2570: 2e 36 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20  .6 {.  set like 
2580: 22 61 25 22 0a 20 20 73 66 5f 65 78 65 63 73 71  "a%".  sf_execsq
2590: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
25a0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
25b0: 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d  E b LIKE $like }
25c0: 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20 31  .} [list [ilmb 1
25d0: 30 32 20 31 30 31 5d 20 30 20 31 30 30 5d 0a 64  02 101] 0 100].d
25e0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
25f0: 32 2e 37 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65  2.7 {.  set like
2600: 20 22 25 61 22 0a 20 20 73 66 5f 65 78 65 63 73   "%a".  sf_execs
2610: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
2620: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45  t(*) FROM t1 WHE
2630: 52 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20  RE b LIKE $like 
2640: 7d 0a 7d 20 7b 39 39 39 20 39 39 39 20 31 30 30  }.} {999 999 100
2650: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
2660: 65 33 2d 32 2e 38 20 7b 0a 20 20 73 65 74 20 6c  e3-2.8 {.  set l
2670: 69 6b 65 20 22 61 22 0a 20 20 73 66 5f 65 78 65  ike "a".  sf_exe
2680: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
2690: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57  unt(*) FROM t1 W
26a0: 48 45 52 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b  HERE b LIKE $lik
26b0: 65 20 7d 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d  e }.} [list [ilm
26c0: 62 20 31 30 32 20 31 30 31 5d 20 30 20 30 5d 0a  b 102 101] 0 0].
26d0: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
26e0: 2d 32 2e 39 20 7b 0a 20 20 73 65 74 20 6c 69 6b  -2.9 {.  set lik
26f0: 65 20 22 61 62 22 0a 20 20 73 66 5f 65 78 65 63  e "ab".  sf_exec
2700: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
2710: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48  nt(*) FROM t1 WH
2720: 45 52 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65  ERE b LIKE $like
2730: 20 7d 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62   }.} [list [ilmb
2740: 20 31 32 20 31 31 5d 20 30 20 30 5d 0a 64 6f 5f   12 11] 0 0].do_
2750: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e  test analyze3-2.
2760: 31 30 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20  10 {.  set like 
2770: 22 61 62 63 22 0a 20 20 73 66 5f 65 78 65 63 73  "abc".  sf_execs
2780: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
2790: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45  t(*) FROM t1 WHE
27a0: 52 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20  RE b LIKE $like 
27b0: 7d 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20  }.} [list [ilmb 
27c0: 33 20 32 5d 20 30 20 31 5d 0a 64 6f 5f 74 65 73  3 2] 0 1].do_tes
27d0: 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 31 31 20  t analyze3-2.11 
27e0: 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20 22 61 5f  {.  set like "a_
27f0: 63 22 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20  c".  sf_execsql 
2800: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
2810: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2820: 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d 0a 7d  b LIKE $like }.}
2830: 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20 31 30 32   [list [ilmb 102
2840: 20 31 30 31 5d 20 30 20 31 30 5d 0a 0a 0a 23 2d   101] 0 10]...#-
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
28a0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 63  block of tests c
28b0: 68 65 63 6b 73 20 74 68 61 74 20 73 74 61 74 65  hecks that state
28c0: 6d 65 6e 74 73 20 61 72 65 20 63 6f 72 72 65 63  ments are correc
28d0: 74 6c 79 20 6d 61 72 6b 65 64 20 61 73 0a 23 20  tly marked as.# 
28e0: 65 78 70 69 72 65 64 20 77 68 65 6e 20 74 68 65  expired when the
28f0: 20 76 61 6c 75 65 73 20 62 6f 75 6e 64 20 74 6f   values bound to
2900: 20 61 6e 79 20 70 61 72 61 6d 65 74 65 72 73 20   any parameters 
2910: 74 68 61 74 20 6d 61 79 20 61 66 66 65 63 74 20  that may affect 
2920: 74 68 65 20 0a 23 20 71 75 65 72 79 20 70 6c 61  the .# query pla
2930: 6e 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2e 0a  n are modified..
2940: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
2950: 73 0a 64 62 20 61 75 74 68 20 61 75 74 68 0a 70  s.db auth auth.p
2960: 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d 20  roc auth {args} 
2970: 7b 0a 20 20 73 65 74 20 3a 3a 61 75 74 68 20 31  {.  set ::auth 1
2980: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2990: 5f 4f 4b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  _OK.}..do_test a
29a0: 6e 61 6c 79 7a 65 33 2d 33 2e 31 20 7b 0a 20 20  nalyze3-3.1 {.  
29b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
29c0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
29d0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
29e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
29f0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b  DEX i1 ON t1(b);
2a00: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
2a10: 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20  i 0} {$i < 100} 
2a20: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
2a30: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
2a40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
2a50: 69 2c 20 24 69 2c 20 24 69 29 20 7d 0a 20 20 7d  i, $i, $i) }.  }
2a60: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
2a70: 54 0a 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c  T.  execsql ANAL
2a80: 59 5a 45 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  YZE.} {}.do_test
2a90: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 32 2e 31 20   analyze3-3.2.1 
2aa0: 7b 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74  {.  set S [sqlit
2ab0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62  e3_prepare_v2 db
2ac0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2ad0: 74 31 20 57 48 45 52 45 20 62 3e 3f 22 20 2d 31  t1 WHERE b>?" -1
2ae0: 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65   dummy].  sqlite
2af0: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
2b00: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
2b10: 7a 65 33 2d 33 2e 32 2e 32 20 7b 0a 20 20 73 71  ze3-3.2.2 {.  sq
2b20: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
2b30: 24 53 20 31 20 22 61 62 63 22 20 33 0a 20 20 73  $S 1 "abc" 3.  s
2b40: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24  qlite3_expired $
2b50: 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  S.} {1}.do_test 
2b60: 61 6e 61 6c 79 7a 65 33 2d 33 2e 32 2e 34 20 7b  analyze3-3.2.4 {
2b70: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
2b80: 69 7a 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45  ize $S.} {SQLITE
2b90: 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e  _OK}..do_test an
2ba0: 61 6c 79 7a 65 33 2d 33 2e 32 2e 35 20 7b 0a 20  alyze3-3.2.5 {. 
2bb0: 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f   set S [sqlite3_
2bc0: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 22 53  prepare_v2 db "S
2bd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2be0: 57 48 45 52 45 20 62 3d 3f 22 20 2d 31 20 64 75  WHERE b=?" -1 du
2bf0: 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65  mmy].  sqlite3_e
2c00: 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a  xpired $S.} {0}.
2c10: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
2c20: 2d 33 2e 32 2e 36 20 7b 0a 20 20 73 71 6c 69 74  -3.2.6 {.  sqlit
2c30: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20  e3_bind_text $S 
2c40: 31 20 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69  1 "abc" 3.  sqli
2c50: 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d  te3_expired $S.}
2c60: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61   {1}.do_test ana
2c70: 6c 79 7a 65 33 2d 33 2e 32 2e 37 20 7b 0a 20 20  lyze3-3.2.7 {.  
2c80: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2c90: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $S.} {SQLITE_OK
2ca0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  }..do_test analy
2cb0: 7a 65 33 2d 33 2e 34 2e 31 20 7b 0a 20 20 73 65  ze3-3.4.1 {.  se
2cc0: 74 20 53 20 5b 73 71 6c 69 74 65 33 5f 70 72 65  t S [sqlite3_pre
2cd0: 70 61 72 65 5f 76 32 20 64 62 20 22 53 45 4c 45  pare_v2 db "SELE
2ce0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2cf0: 52 45 20 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 20  RE a=? AND b>?" 
2d00: 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69  -1 dummy].  sqli
2d10: 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d  te3_expired $S.}
2d20: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61   {0}.do_test ana
2d30: 6c 79 7a 65 33 2d 33 2e 34 2e 32 20 7b 0a 20 20  lyze3-3.4.2 {.  
2d40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2d50: 74 20 24 53 20 31 20 22 61 62 63 22 20 33 0a 20  t $S 1 "abc" 3. 
2d60: 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
2d70: 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73   $S.} {0}.do_tes
2d80: 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 34 2e 33  t analyze3-3.4.3
2d90: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   {.  sqlite3_bin
2da0: 64 5f 74 65 78 74 20 24 53 20 32 20 22 64 65 66  d_text $S 2 "def
2db0: 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  " 3.  sqlite3_ex
2dc0: 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64  pired $S.} {1}.d
2dd0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
2de0: 33 2e 34 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  3.4.4 {.  sqlite
2df0: 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32  3_bind_text $S 2
2e00: 20 22 67 68 69 22 20 33 0a 20 20 73 71 6c 69 74   "ghi" 3.  sqlit
2e10: 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20  e3_expired $S.} 
2e20: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  {1}.do_test anal
2e30: 79 7a 65 33 2d 33 2e 34 2e 35 20 7b 0a 20 20 73  yze3-3.4.5 {.  s
2e40: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24  qlite3_expired $
2e50: 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  S.} {1}.do_test 
2e60: 61 6e 61 6c 79 7a 65 33 2d 33 2e 34 2e 36 20 7b  analyze3-3.4.6 {
2e70: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
2e80: 69 7a 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45  ize $S.} {SQLITE
2e90: 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e  _OK}..do_test an
2ea0: 61 6c 79 7a 65 33 2d 33 2e 35 2e 31 20 7b 0a 20  alyze3-3.5.1 {. 
2eb0: 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f   set S [sqlite3_
2ec0: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 7b 0a  prepare_v2 db {.
2ed0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2ee0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 49 4e 20  M t1 WHERE a IN 
2ef0: 28 0a 20 20 20 20 20 20 3f 31 2c 20 3f 32 2c 20  (.      ?1, ?2, 
2f00: 3f 33 2c 20 3f 34 2c 20 3f 35 2c 20 3f 36 2c 20  ?3, ?4, ?5, ?6, 
2f10: 3f 37 2c 20 3f 38 2c 20 3f 39 2c 20 3f 31 30 2c  ?7, ?8, ?9, ?10,
2f20: 0a 20 20 20 20 20 20 3f 31 31 2c 20 3f 31 32 2c  .      ?11, ?12,
2f30: 20 3f 31 33 2c 20 3f 31 34 2c 20 3f 31 35 2c 20   ?13, ?14, ?15, 
2f40: 3f 31 36 2c 20 3f 31 37 2c 20 3f 31 38 2c 20 3f  ?16, ?17, ?18, ?
2f50: 31 39 2c 20 3f 32 30 2c 0a 20 20 20 20 20 20 3f  19, ?20,.      ?
2f60: 32 31 2c 20 3f 32 32 2c 20 3f 32 33 2c 20 3f 32  21, ?22, ?23, ?2
2f70: 34 2c 20 3f 32 35 2c 20 3f 32 36 2c 20 3f 32 37  4, ?25, ?26, ?27
2f80: 2c 20 3f 32 38 2c 20 3f 32 39 2c 20 3f 33 30 2c  , ?28, ?29, ?30,
2f90: 20 3f 33 31 0a 20 20 20 20 29 20 41 4e 44 20 62   ?31.    ) AND b
2fa0: 3e 3f 33 32 3b 0a 20 20 7d 20 2d 31 20 64 75 6d  >?32;.  } -1 dum
2fb0: 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  my].  sqlite3_ex
2fc0: 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64  pired $S.} {0}.d
2fd0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
2fe0: 33 2e 35 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  3.5.2 {.  sqlite
2ff0: 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 33  3_bind_text $S 3
3000: 31 20 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69  1 "abc" 3.  sqli
3010: 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d  te3_expired $S.}
3020: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61   {0}.do_test ana
3030: 6c 79 7a 65 33 2d 33 2e 35 2e 33 20 7b 0a 20 20  lyze3-3.5.3 {.  
3040: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
3050: 74 20 24 53 20 33 32 20 22 64 65 66 22 20 33 0a  t $S 32 "def" 3.
3060: 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
3070: 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  d $S.} {1}.do_te
3080: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 35 2e  st analyze3-3.5.
3090: 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  5 {.  sqlite3_fi
30a0: 6e 61 6c 69 7a 65 20 24 53 0a 7d 20 7b 53 51 4c  nalize $S.} {SQL
30b0: 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74  ITE_OK}..do_test
30c0: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 36 2e 31 20   analyze3-3.6.1 
30d0: 7b 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74  {.  set S [sqlit
30e0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62  e3_prepare_v2 db
30f0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
3100: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
3110: 49 4e 20 28 0a 20 20 20 20 20 20 3f 31 2c 20 3f  IN (.      ?1, ?
3120: 32 2c 20 3f 33 2c 20 3f 34 2c 20 3f 35 2c 20 3f  2, ?3, ?4, ?5, ?
3130: 36 2c 20 3f 37 2c 20 3f 38 2c 20 3f 39 2c 20 3f  6, ?7, ?8, ?9, ?
3140: 31 30 2c 0a 20 20 20 20 20 20 3f 31 31 2c 20 3f  10,.      ?11, ?
3150: 31 32 2c 20 3f 31 33 2c 20 3f 31 34 2c 20 3f 31  12, ?13, ?14, ?1
3160: 35 2c 20 3f 31 36 2c 20 3f 31 37 2c 20 3f 31 38  5, ?16, ?17, ?18
3170: 2c 20 3f 31 39 2c 20 3f 32 30 2c 0a 20 20 20 20  , ?19, ?20,.    
3180: 20 20 3f 32 31 2c 20 3f 32 32 2c 20 3f 32 33 2c    ?21, ?22, ?23,
3190: 20 3f 32 34 2c 20 3f 32 35 2c 20 3f 32 36 2c 20   ?24, ?25, ?26, 
31a0: 3f 32 37 2c 20 3f 32 38 2c 20 3f 32 39 2c 20 3f  ?27, ?28, ?29, ?
31b0: 33 30 2c 20 3f 33 31 2c 20 3f 33 32 0a 20 20 20  30, ?31, ?32.   
31c0: 20 29 20 41 4e 44 20 62 3e 3f 33 33 3b 0a 20 20   ) AND b>?33;.  
31d0: 7d 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71  } -1 dummy].  sq
31e0: 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53  lite3_expired $S
31f0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61  .} {0}.do_test a
3200: 6e 61 6c 79 7a 65 33 2d 33 2e 36 2e 32 20 7b 0a  nalyze3-3.6.2 {.
3210: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
3220: 65 78 74 20 24 53 20 33 32 20 22 61 62 63 22 20  ext $S 32 "abc" 
3230: 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  3.  sqlite3_expi
3240: 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f  red $S.} {1}.do_
3250: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
3260: 36 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  6.3 {.  sqlite3_
3270: 62 69 6e 64 5f 74 65 78 74 20 24 53 20 33 33 20  bind_text $S 33 
3280: 22 64 65 66 22 20 33 0a 20 20 73 71 6c 69 74 65  "def" 3.  sqlite
3290: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
32a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  1}.do_test analy
32b0: 7a 65 33 2d 33 2e 36 2e 35 20 7b 0a 20 20 73 71  ze3-3.6.5 {.  sq
32c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
32d0: 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  S.} {SQLITE_OK}.
32e0: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
32f0: 33 2d 33 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20  3-3.7.1 {.  set 
3300: 53 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  S [sqlite3_prepa
3310: 72 65 5f 76 32 20 64 62 20 7b 0a 20 20 20 20 53  re_v2 db {.    S
3320: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3330: 57 48 45 52 45 20 61 20 49 4e 20 28 0a 20 20 20  WHERE a IN (.   
3340: 20 20 20 3f 31 2c 20 3f 32 2c 20 3f 33 2c 20 3f     ?1, ?2, ?3, ?
3350: 34 2c 20 3f 35 2c 20 3f 36 2c 20 3f 37 2c 20 3f  4, ?5, ?6, ?7, ?
3360: 38 2c 20 3f 39 2c 20 3f 33 33 2c 0a 20 20 20 20  8, ?9, ?33,.    
3370: 20 20 3f 31 31 2c 20 3f 31 32 2c 20 3f 31 33 2c    ?11, ?12, ?13,
3380: 20 3f 31 34 2c 20 3f 31 35 2c 20 3f 31 36 2c 20   ?14, ?15, ?16, 
3390: 3f 31 37 2c 20 3f 31 38 2c 20 3f 31 39 2c 20 3f  ?17, ?18, ?19, ?
33a0: 32 30 2c 0a 20 20 20 20 20 20 3f 32 31 2c 20 3f  20,.      ?21, ?
33b0: 32 32 2c 20 3f 32 33 2c 20 3f 32 34 2c 20 3f 32  22, ?23, ?24, ?2
33c0: 35 2c 20 3f 32 36 2c 20 3f 32 37 2c 20 3f 32 38  5, ?26, ?27, ?28
33d0: 2c 20 3f 32 39 2c 20 3f 33 30 2c 20 3f 33 31 2c  , ?29, ?30, ?31,
33e0: 20 3f 33 32 0a 20 20 20 20 29 20 41 4e 44 20 62   ?32.    ) AND b
33f0: 3e 3f 31 30 3b 0a 20 20 7d 20 2d 31 20 64 75 6d  >?10;.  } -1 dum
3400: 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  my].  sqlite3_ex
3410: 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64  pired $S.} {0}.d
3420: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
3430: 33 2e 37 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  3.7.2 {.  sqlite
3440: 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 33  3_bind_text $S 3
3450: 32 20 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69  2 "abc" 3.  sqli
3460: 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d  te3_expired $S.}
3470: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61   {0}.do_test ana
3480: 6c 79 7a 65 33 2d 33 2e 37 2e 33 20 7b 0a 20 20  lyze3-3.7.3 {.  
3490: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
34a0: 74 20 24 53 20 33 33 20 22 64 65 66 22 20 33 0a  t $S 33 "def" 3.
34b0: 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
34c0: 64 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  d $S.} {0}.do_te
34d0: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 37 2e  st analyze3-3.7.
34e0: 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  4 {.  sqlite3_bi
34f0: 6e 64 5f 74 65 78 74 20 24 53 20 31 30 20 22 64  nd_text $S 10 "d
3500: 65 66 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f  ef" 3.  sqlite3_
3510: 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d  expired $S.} {1}
3520: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
3530: 33 2d 33 2e 37 2e 36 20 7b 0a 20 20 73 71 6c 69  3-3.7.6 {.  sqli
3540: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a  te3_finalize $S.
3550: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64  } {SQLITE_OK}..d
3560: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
3570: 33 2e 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.8.1 {.  execsq
3580: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
3590: 41 42 4c 45 20 74 34 28 78 2c 20 79 20 54 45 58  ABLE t4(x, y TEX
35a0: 54 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  T COLLATE NOCASE
35b0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
35c0: 44 45 58 20 69 34 20 4f 4e 20 74 34 28 79 29 3b  DEX i4 ON t4(y);
35d0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
35e0: 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 32  t analyze3-3.8.2
35f0: 20 7b 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69   {.  set S [sqli
3600: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64  te3_prepare_v2 d
3610: 62 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  b {.    SELECT *
3620: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78   FROM t4 WHERE x
3630: 20 21 3d 20 3f 20 41 4e 44 20 79 20 4c 49 4b 45   != ? AND y LIKE
3640: 20 3f 0a 20 20 7d 20 2d 31 20 64 75 6d 6d 79 5d   ?.  } -1 dummy]
3650: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  .  sqlite3_expir
3660: 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  ed $S.} {0}.do_t
3670: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38  est analyze3-3.8
3680: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  .3 {.  sqlite3_b
3690: 69 6e 64 5f 74 65 78 74 20 24 53 20 31 20 22 61  ind_text $S 1 "a
36a0: 62 63 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f  bc" 3.  sqlite3_
36b0: 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d  expired $S.} {0}
36c0: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
36d0: 33 2d 33 2e 38 2e 34 20 7b 0a 20 20 73 71 6c 69  3-3.8.4 {.  sqli
36e0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53  te3_bind_text $S
36f0: 20 32 20 22 64 65 66 22 20 33 0a 20 20 73 71 6c   2 "def" 3.  sql
3700: 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a  ite3_expired $S.
3710: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  } {1}.do_test an
3720: 61 6c 79 7a 65 33 2d 33 2e 38 2e 37 20 7b 0a 20  alyze3-3.8.7 {. 
3730: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
3740: 78 74 20 24 53 20 32 20 22 67 68 69 25 22 20 34  xt $S 2 "ghi%" 4
3750: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  .  sqlite3_expir
3760: 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ed $S.} {1}.do_t
3770: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38  est analyze3-3.8
3780: 2e 38 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .8 {.  sqlite3_e
3790: 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a  xpired $S.} {1}.
37a0: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
37b0: 2d 33 2e 38 2e 39 20 7b 0a 20 20 73 71 6c 69 74  -3.8.9 {.  sqlit
37c0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20  e3_bind_text $S 
37d0: 32 20 22 67 68 69 25 64 65 66 22 20 37 0a 20 20  2 "ghi%def" 7.  
37e0: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20  sqlite3_expired 
37f0: 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  $S.} {1}.do_test
3800: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 31 30   analyze3-3.8.10
3810: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   {.  sqlite3_exp
3820: 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f  ired $S.} {1}.do
3830: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33  _test analyze3-3
3840: 2e 38 2e 31 31 20 7b 0a 20 20 73 71 6c 69 74 65  .8.11 {.  sqlite
3850: 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32  3_bind_text $S 2
3860: 20 22 25 61 62 22 20 33 0a 20 20 73 71 6c 69 74   "%ab" 3.  sqlit
3870: 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20  e3_expired $S.} 
3880: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  {1}.do_test anal
3890: 79 7a 65 33 2d 33 2e 38 2e 31 32 20 7b 0a 20 20  yze3-3.8.12 {.  
38a0: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20  sqlite3_expired 
38b0: 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  $S.} {1}.do_test
38c0: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 31 32   analyze3-3.8.12
38d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   {.  sqlite3_bin
38e0: 64 5f 74 65 78 74 20 24 53 20 32 20 22 25 64 65  d_text $S 2 "%de
38f0: 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  " 3.  sqlite3_ex
3900: 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64  pired $S.} {1}.d
3910: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
3920: 33 2e 38 2e 31 33 20 7b 0a 20 20 73 71 6c 69 74  3.8.13 {.  sqlit
3930: 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20  e3_expired $S.} 
3940: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  {1}.do_test anal
3950: 79 7a 65 33 2d 33 2e 38 2e 31 34 20 7b 0a 20 20  yze3-3.8.14 {.  
3960: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3970: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $S.} {SQLITE_OK
3980: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
39d0: 54 68 65 73 65 20 74 65 73 74 73 20 63 68 65 63  These tests chec
39e0: 6b 20 74 68 61 74 20 65 72 72 6f 72 73 20 65 6e  k that errors en
39f0: 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
3a00: 72 65 70 72 65 70 61 72 69 6e 67 20 61 6e 20 53  repreparing an S
3a10: 51 4c 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 77  QL.# statement w
3a20: 69 74 68 69 6e 20 73 71 6c 69 74 65 33 52 65 70  ithin sqlite3Rep
3a30: 72 65 70 61 72 65 28 29 20 61 72 65 20 68 61 6e  repare() are han
3a40: 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  dled correctly..
3a50: 23 0a 0a 23 20 43 68 65 63 6b 20 61 20 73 63 68  #..# Check a sch
3a60: 65 6d 61 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f  ema error..#.do_
3a70: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 34 2e  test analyze3-4.
3a80: 31 2e 31 20 7b 0a 20 20 73 65 74 20 53 20 5b 73  1.1 {.  set S [s
3a90: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3aa0: 32 20 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46  2 db "SELECT * F
3ab0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f  ROM t1 WHERE a=?
3ac0: 20 41 4e 44 20 62 3e 3f 22 20 2d 31 20 64 75 6d   AND b>?" -1 dum
3ad0: 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  my].  sqlite3_st
3ae0: 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep $S.} {SQLITE_
3af0: 44 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  DONE}.do_test an
3b00: 61 6c 79 7a 65 33 2d 34 2e 31 2e 32 20 7b 0a 20  alyze3-4.1.2 {. 
3b10: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24   sqlite3_reset $
3b20: 53 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  S.  sqlite3_bind
3b30: 5f 74 65 78 74 20 24 53 20 32 20 22 61 62 63 22  _text $S 2 "abc"
3b40: 20 33 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   3.  execsql { D
3b50: 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 20  ROP TABLE t1 }. 
3b60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53   sqlite3_step $S
3b70: 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52  .} {SQLITE_ERROR
3b80: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
3b90: 65 33 2d 34 2e 31 2e 33 20 7b 0a 20 20 73 71 6c  e3-4.1.3 {.  sql
3ba0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53  ite3_finalize $S
3bb0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52  .} {SQLITE_ERROR
3bc0: 7d 0a 0a 23 20 43 68 65 63 6b 20 61 6e 20 61 75  }..# Check an au
3bd0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 65 72 72 6f  thorization erro
3be0: 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61  r..#.do_test ana
3bf0: 6c 79 7a 65 33 2d 34 2e 32 2e 31 20 7b 0a 20 20  lyze3-4.2.1 {.  
3c00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
3c10: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
3c20: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
3c30: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
3c40: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b  DEX i1 ON t1(b);
3c50: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
3c60: 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20  i 0} {$i < 100} 
3c70: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
3c80: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
3c90: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
3ca0: 69 2c 20 24 69 2c 20 24 69 29 20 7d 0a 20 20 7d  i, $i, $i) }.  }
3cb0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
3cc0: 54 0a 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c  T.  execsql ANAL
3cd0: 59 5a 45 0a 20 20 73 65 74 20 53 20 5b 73 71 6c  YZE.  set S [sql
3ce0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
3cf0: 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  db "SELECT * FRO
3d00: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
3d10: 4e 44 20 62 3e 3f 22 20 2d 31 20 64 75 6d 6d 79  ND b>?" -1 dummy
3d20: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ].  sqlite3_step
3d30: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f   $S.} {SQLITE_DO
3d40: 4e 45 7d 0a 64 62 20 61 75 74 68 20 61 75 74 68  NE}.db auth auth
3d50: 0a 70 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73  .proc auth {args
3d60: 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 69 6e 64 65  } {.  if {[linde
3d70: 78 20 24 61 72 67 73 20 30 5d 20 3d 3d 20 22 53  x $args 0] == "S
3d80: 51 4c 49 54 45 5f 52 45 41 44 22 7d 20 7b 72 65  QLITE_READ"} {re
3d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 4e 59  turn SQLITE_DENY
3da0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3db0: 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 61  E_OK.}.do_test a
3dc0: 6e 61 6c 79 7a 65 33 2d 34 2e 32 2e 32 20 7b 0a  nalyze3-4.2.2 {.
3dd0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20    sqlite3_reset 
3de0: 24 53 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  $S.  sqlite3_bin
3df0: 64 5f 74 65 78 74 20 24 53 20 32 20 22 61 62 63  d_text $S 2 "abc
3e00: 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  " 3.  sqlite3_st
3e10: 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep $S.} {SQLITE_
3e20: 41 55 54 48 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  AUTH}.do_test an
3e30: 61 6c 79 7a 65 33 2d 34 2e 32 2e 34 20 7b 0a 20  alyze3-4.2.4 {. 
3e40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3e50: 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 41  e $S.} {SQLITE_A
3e60: 55 54 48 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  UTH}..# Check th
3e70: 65 20 65 66 66 65 63 74 20 6f 66 20 61 6e 20 61  e effect of an a
3e80: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 65 72 72  uthorization err
3e90: 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  or that occurs i
3ea0: 6e 20 61 20 72 65 2d 70 72 65 70 61 72 65 0a 23  n a re-prepare.#
3eb0: 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 73 71   performed by sq
3ec0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 73 20  lite3_step() is 
3ed0: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 6e 65 20  the same as one 
3ee0: 74 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68  that occurs with
3ef0: 69 6e 0a 23 20 73 71 6c 69 74 65 33 52 65 70 72  in.# sqlite3Repr
3f00: 65 70 61 72 65 28 29 2e 0a 23 0a 64 6f 5f 74 65  epare()..#.do_te
3f10: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 34 2e 33 2e  st analyze3-4.3.
3f20: 31 20 7b 0a 20 20 64 62 20 61 75 74 68 20 7b 7d  1 {.  db auth {}
3f30: 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65  .  set S [sqlite
3f40: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
3f50: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
3f60: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
3f70: 62 3e 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20  b>?" -1 dummy]. 
3f80: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
3f90: 45 20 54 41 42 4c 45 20 74 32 28 64 2c 20 65 2c  E TABLE t2(d, e,
3fa0: 20 66 29 20 7d 0a 20 20 64 62 20 61 75 74 68 20   f) }.  db auth 
3fb0: 61 75 74 68 0a 20 20 73 71 6c 69 74 65 33 5f 73  auth.  sqlite3_s
3fc0: 74 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45  tep $S.} {SQLITE
3fd0: 5f 41 55 54 48 7d 0a 64 6f 5f 74 65 73 74 20 61  _AUTH}.do_test a
3fe0: 6e 61 6c 79 7a 65 33 2d 34 2e 33 2e 32 20 7b 0a  nalyze3-4.3.2 {.
3ff0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
4000: 7a 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f  ze $S.} {SQLITE_
4010: 41 55 54 48 7d 0a 64 62 20 61 75 74 68 20 7b 7d  AUTH}.db auth {}
4020: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
4070: 65 73 74 20 74 68 61 74 20 6d 6f 64 69 66 79 69  est that modifyi
4080: 6e 67 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ng bound variabl
4090: 65 73 20 75 73 69 6e 67 20 74 68 65 20 63 6c 65  es using the cle
40a0: 61 72 5f 62 69 6e 64 69 6e 67 73 28 29 20 6f 72  ar_bindings() or
40b0: 0a 23 20 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  .# transfer_bind
40c0: 69 6e 67 73 28 29 20 41 50 49 73 20 77 6f 72 6b  ings() APIs work
40d0: 73 2e 0a 23 0a 23 20 20 20 61 6e 61 6c 79 7a 65  s..#.#   analyze
40e0: 33 2d 35 2e 31 2e 2a 3a 20 73 71 6c 69 74 65 33  3-5.1.*: sqlite3
40f0: 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28  _clear_bindings(
4100: 29 0a 23 20 20 20 61 6e 61 6c 79 7a 65 33 2d 35  ).#   analyze3-5
4110: 2e 32 2e 2a 3a 20 73 71 6c 69 74 65 33 5f 74 72  .2.*: sqlite3_tr
4120: 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28  ansfer_bindings(
4130: 29 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  ).#.do_test anal
4140: 79 7a 65 33 2d 35 2e 31 2e 31 20 7b 0a 20 20 64  yze3-5.1.1 {.  d
4150: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
4160: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4170: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
4180: 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 4e 4f   TEXT COLLATE NO
4190: 43 41 53 45 29 3b 0a 20 20 20 20 43 52 45 41 54  CASE);.    CREAT
41a0: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
41b0: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
41c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
41d0: 61 61 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  aaa');.    INSER
41e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
41f0: 28 27 61 62 62 27 29 3b 0a 20 20 20 20 49 4e 53  ('abb');.    INS
4200: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4210: 45 53 28 27 61 63 63 27 29 3b 0a 20 20 20 20 49  ES('acc');.    I
4220: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4230: 4c 55 45 53 28 27 62 61 61 27 29 3b 0a 20 20 20  LUES('baa');.   
4240: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4250: 56 41 4c 55 45 53 28 27 62 62 62 27 29 3b 0a 20  VALUES('bbb');. 
4260: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4270: 31 20 56 41 4c 55 45 53 28 27 62 63 63 27 29 3b  1 VALUES('bcc');
4280: 0a 20 20 7d 0a 0a 20 20 73 65 74 20 53 20 5b 73  .  }..  set S [s
4290: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
42a0: 32 20 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46  2 db "SELECT * F
42b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
42c0: 49 4b 45 20 3f 22 20 2d 31 20 64 75 6d 6d 79 5d  IKE ?" -1 dummy]
42d0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
42e0: 74 65 78 74 20 24 53 20 31 20 22 61 25 22 20 32  text $S 1 "a%" 2
42f0: 0a 20 20 73 65 74 20 52 20 5b 6c 69 73 74 5d 0a  .  set R [list].
4300: 20 20 77 68 69 6c 65 20 7b 20 22 53 51 4c 49 54    while { "SQLIT
4310: 45 5f 52 4f 57 22 20 3d 3d 20 5b 73 71 6c 69 74  E_ROW" == [sqlit
4320: 65 33 5f 73 74 65 70 20 24 53 5d 20 7d 20 7b 0a  e3_step $S] } {.
4330: 20 20 20 20 6c 61 70 70 65 6e 64 20 52 20 5b 73      lappend R [s
4340: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4350: 78 74 20 24 53 20 30 5d 0a 20 20 7d 0a 20 20 63  xt $S 0].  }.  c
4360: 6f 6e 63 61 74 20 5b 73 71 6c 69 74 65 33 5f 72  oncat [sqlite3_r
4370: 65 73 65 74 20 24 53 5d 20 24 52 0a 7d 20 7b 53  eset $S] $R.} {S
4380: 51 4c 49 54 45 5f 4f 4b 20 61 61 61 20 61 62 62  QLITE_OK aaa abb
4390: 20 61 63 63 7d 0a 64 6f 5f 74 65 73 74 20 61 6e   acc}.do_test an
43a0: 61 6c 79 7a 65 33 2d 35 2e 31 2e 32 20 7b 0a 20  alyze3-5.1.2 {. 
43b0: 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
43c0: 69 6e 64 69 6e 67 73 20 24 53 0a 20 20 73 65 74  indings $S.  set
43d0: 20 52 20 5b 6c 69 73 74 5d 0a 20 20 77 68 69 6c   R [list].  whil
43e0: 65 20 7b 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e { "SQLITE_ROW"
43f0: 20 3d 3d 20 5b 73 71 6c 69 74 65 33 5f 73 74 65   == [sqlite3_ste
4400: 70 20 24 53 5d 20 7d 20 7b 0a 20 20 20 20 6c 61  p $S] } {.    la
4410: 70 70 65 6e 64 20 52 20 5b 73 71 6c 69 74 65 33  ppend R [sqlite3
4420: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53 20  _column_text $S 
4430: 30 5d 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20  0].  }.  concat 
4440: 5b 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24  [sqlite3_reset $
4450: 53 5d 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f  S] $R.} {SQLITE_
4460: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  OK}.do_test anal
4470: 79 7a 65 33 2d 35 2e 31 2e 33 20 7b 0a 20 20 73  yze3-5.1.3 {.  s
4480: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
4490: 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  $S.} {SQLITE_OK}
44a0: 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  ..do_test analyz
44b0: 65 33 2d 35 2e 31 2e 31 20 7b 0a 20 20 73 65 74  e3-5.1.1 {.  set
44c0: 20 53 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65   S1 [sqlite3_pre
44d0: 70 61 72 65 5f 76 32 20 64 62 20 22 53 45 4c 45  pare_v2 db "SELE
44e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
44f0: 52 45 20 78 20 4c 49 4b 45 20 3f 22 20 2d 31 20  RE x LIKE ?" -1 
4500: 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33  dummy].  sqlite3
4510: 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 31 20 31  _bind_text $S1 1
4520: 20 22 62 25 22 20 32 0a 20 20 73 65 74 20 52 20   "b%" 2.  set R 
4530: 5b 6c 69 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b  [list].  while {
4540: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d 3d   "SQLITE_ROW" ==
4550: 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24   [sqlite3_step $
4560: 53 31 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70  S1] } {.    lapp
4570: 65 6e 64 20 52 20 5b 73 71 6c 69 74 65 33 5f 63  end R [sqlite3_c
4580: 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53 31 20 30  olumn_text $S1 0
4590: 5d 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b  ].  }.  concat [
45a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53  sqlite3_reset $S
45b0: 31 5d 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f  1] $R.} {SQLITE_
45c0: 4f 4b 20 62 61 61 20 62 62 62 20 62 63 63 7d 0a  OK baa bbb bcc}.
45d0: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
45e0: 33 2d 35 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20  3-5.1.2 {.  set 
45f0: 53 32 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  S2 [sqlite3_prep
4600: 61 72 65 5f 76 32 20 64 62 20 22 53 45 4c 45 43  are_v2 db "SELEC
4610: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
4620: 45 20 78 20 3d 20 3f 22 20 2d 31 20 64 75 6d 6d  E x = ?" -1 dumm
4630: 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  y].  sqlite3_bin
4640: 64 5f 74 65 78 74 20 24 53 32 20 31 20 22 61 25  d_text $S2 1 "a%
4650: 22 20 32 0a 20 20 73 71 6c 69 74 65 33 5f 74 72  " 2.  sqlite3_tr
4660: 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20  ansfer_bindings 
4670: 24 53 32 20 24 53 31 0a 20 20 73 65 74 20 52 20  $S2 $S1.  set R 
4680: 5b 6c 69 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b  [list].  while {
4690: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d 3d   "SQLITE_ROW" ==
46a0: 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24   [sqlite3_step $
46b0: 53 31 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70  S1] } {.    lapp
46c0: 65 6e 64 20 52 20 5b 73 71 6c 69 74 65 33 5f 63  end R [sqlite3_c
46d0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53 31 20 30  olumn_text $S1 0
46e0: 5d 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b  ].  }.  concat [
46f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53  sqlite3_reset $S
4700: 31 5d 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f  1] $R.} {SQLITE_
4710: 4f 4b 20 61 61 61 20 61 62 62 20 61 63 63 7d 0a  OK aaa abb acc}.
4720: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
4730: 2d 35 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74  -5.1.3 {.  sqlit
4740: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 32 0a  e3_finalize $S2.
4750: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
4760: 7a 65 20 24 53 31 0a 7d 20 7b 53 51 4c 49 54 45  ze $S1.} {SQLITE
4770: 5f 4f 4b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  _OK}..#---------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  ..do_test analyz
47d0: 65 33 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  e3-6.1 {.  execs
47e0: 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
47f0: 49 46 20 45 58 49 53 54 53 20 74 31 20 7d 0a 20  IF EXISTS t1 }. 
4800: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20   execsql BEGIN. 
4810: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
4820: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
4830: 20 63 29 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74   c) }.  for {set
4840: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30   i 0} {$i < 1000
4850: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
4860: 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54   execsql "INSERT
4870: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4880: 5b 65 78 70 72 20 24 69 2f 31 30 30 5d 2c 20 27  [expr $i/100], '
4890: 78 27 2c 20 5b 65 78 70 72 20 24 69 2f 31 30 5d  x', [expr $i/10]
48a0: 29 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  )".  }.  execsql
48b0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e   {.    CREATE IN
48c0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20  DEX i1 ON t1(a, 
48d0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  b);.    CREATE I
48e0: 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 63 29  NDEX i2 ON t1(c)
48f0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
4900: 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71 6c  COMMIT.  execsql
4910: 20 41 4e 41 4c 59 5a 45 0a 7d 20 7b 7d 0a 0a 64   ANALYZE.} {}..d
4920: 6f 5f 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79  o_eqp_test analy
4930: 7a 65 33 2d 36 2d 33 20 7b 0a 20 20 53 45 4c 45  ze3-6-3 {.  SELE
4940: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
4950: 52 45 20 61 20 3d 20 35 20 41 4e 44 20 63 20 3d  RE a = 5 AND c =
4960: 20 31 33 3b 0a 7d 20 7b 30 20 30 20 30 20 7b 53   13;.} {0 0 0 {S
4970: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
4980: 53 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 63  SING INDEX i2 (c
4990: 3d 3f 29 7d 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65  =?)}}..do_eqp_te
49a0: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 36 2d 32 20  st analyze3-6-2 
49b0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
49c0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 35  M t1 WHERE a = 5
49d0: 20 41 4e 44 20 62 20 3e 20 27 77 27 20 41 4e 44   AND b > 'w' AND
49e0: 20 63 20 3d 20 31 33 3b 0a 7d 20 7b 30 20 30 20   c = 13;.} {0 0 
49f0: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
4a00: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
4a10: 32 20 28 63 3d 3f 29 7d 7d 0a 0a 23 2d 2d 2d 2d  2 (c=?)}}..#----
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 32 30 31 35  ---------.# 2015
4a70: 2d 30 34 2d 32 30 2e 0a 23 20 4d 65 6d 6f 72 79  -04-20..# Memory
4a80: 20 6c 65 61 6b 20 69 6e 20 73 71 6c 69 74 65 33   leak in sqlite3
4a90: 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 29  Stat4ProbeFree()
4aa0: 2e 20 20 28 44 69 73 63 6f 76 65 72 65 64 20 77  .  (Discovered w
4ab0: 68 69 6c 65 20 66 75 7a 7a 69 6e 67 2e 29 0a 23  hile fuzzing.).#
4ac0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4ad0: 20 61 6e 61 6c 79 7a 65 2d 37 2e 31 20 7b 0a 20   analyze-7.1 {. 
4ae0: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
4af0: 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41  XISTS t1;.  CREA
4b00: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
4b10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4b20: 59 2c 20 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45  Y, b, c);.  INSE
4b30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4b40: 53 28 31 2c 31 2c 27 30 30 30 30 27 29 3b 0a 20  S(1,1,'0000');. 
4b50: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 30   CREATE INDEX t0
4b60: 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 41 4e  b ON t1(b);.  AN
4b70: 41 4c 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20  ALYZE;.  SELECT 
4b80: 63 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  c FROM t1 WHERE 
4b90: 62 3d 33 20 41 4e 44 20 61 20 42 45 54 57 45 45  b=3 AND a BETWEE
4ba0: 4e 20 33 30 20 41 4e 44 20 68 65 78 28 31 29 3b  N 30 AND hex(1);
4bb0: 0a 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e 65 20  .} {}..# At one 
4bc0: 70 6f 69 6e 74 20 64 75 70 6c 69 63 61 74 65 20  point duplicate 
4bd0: 73 74 61 74 31 20 65 6e 74 72 69 65 73 20 77 65  stat1 entries we
4be0: 72 65 20 63 61 75 73 69 6e 67 20 61 20 6d 65 6d  re causing a mem
4bf0: 6f 72 79 20 6c 65 61 6b 2e 0a 23 0a 72 65 73 65  ory leak..#.rese
4c00: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
4c10: 74 65 73 74 20 37 2e 32 20 7b 0a 20 20 43 52 45  test 7.2 {.  CRE
4c20: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
4c30: 2c 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  ,c);.  CREATE IN
4c40: 44 45 58 20 74 31 61 20 4f 4e 20 74 31 28 61 29  DEX t1a ON t1(a)
4c50: 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 53  ;.  ANALYZE;.  S
4c60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
4c70: 69 74 65 5f 73 74 61 74 31 3b 0a 20 20 49 4e 53  ite_stat1;.  INS
4c80: 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
4c90: 73 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74  stat1(tbl,idx,st
4ca0: 61 74 29 20 56 41 4c 55 45 53 28 27 74 31 27 2c  at) VALUES('t1',
4cb0: 27 74 31 61 27 2c 27 31 32 30 30 30 27 29 3b 0a  't1a','12000');.
4cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71    INSERT INTO sq
4cd0: 6c 69 74 65 5f 73 74 61 74 31 28 74 62 6c 2c 69  lite_stat1(tbl,i
4ce0: 64 78 2c 73 74 61 74 29 20 56 41 4c 55 45 53 28  dx,stat) VALUES(
4cf0: 27 74 31 27 2c 27 74 31 61 27 2c 27 31 32 30 30  't1','t1a','1200
4d00: 30 27 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73  0');.  ANALYZE s
4d10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 0a  qlite_master;.}.
4d20: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.