/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b:


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 20 7b 0a  apable !stat4 {.
0290: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
02a0: 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  return.}..#-----
02b0: 2d 2d 2d 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 0a 23 20 54 65 73 74 20 4f 72 67 61 6e 69 7a  -.# Test Organiz
0300: 61 74 69 6f 6e 3a 0a 23 0a 23 20 61 6e 61 6c 79  ation:.#.# analy
0310: 7a 65 33 2d 31 2e 2a 3a 20 54 65 73 74 20 74 68  ze3-1.*: Test th
0320: 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  at the values of
0330: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
0340: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
0350: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
0360: 20 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61    in the same wa
0370: 79 20 61 73 20 63 6f 6e 73 74 61 6e 74 73 20 77  y as constants w
0380: 68 65 6e 20 70 6c 61 6e 6e 69 6e 67 20 71 75 65  hen planning que
0390: 72 69 65 73 20 74 68 61 74 0a 23 20 20 20 20 20  ries that.#     
03a0: 20 20 20 20 20 20 20 20 20 20 75 73 65 20 72 61            use ra
03b0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
03c0: 0a 23 0a 23 20 61 6e 61 6c 79 7a 65 33 2d 32 2e  .#.# analyze3-2.
03d0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
03e0: 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64   values of bound
03f0: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
0400: 63 6f 6e 73 69 64 65 72 65 64 20 0a 23 20 20 20  considered .#   
0410: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 74              in t
0420: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 63  he same way as c
0430: 6f 6e 73 74 61 6e 74 73 20 77 68 65 6e 20 70 6c  onstants when pl
0440: 61 6e 6e 69 6e 67 20 71 75 65 72 69 65 73 20 74  anning queries t
0450: 68 61 74 0a 23 20 20 20 20 20 20 20 20 20 20 20  hat.#           
0460: 20 20 20 20 75 73 65 20 4c 49 4b 45 20 65 78 70      use LIKE exp
0470: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0480: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 23 0a  WHERE clause..#.
0490: 23 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 2a 3a 20  # analyze3-3.*: 
04a0: 54 65 73 74 20 74 68 61 74 20 62 69 6e 64 69 6e  Test that bindin
04b0: 67 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 20  g to a variable 
04c0: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64  does not invalid
04d0: 61 74 65 20 74 68 65 20 0a 23 20 20 20 20 20 20  ate the .#      
04e0: 20 20 20 20 20 20 20 20 20 71 75 65 72 79 20 70           query p
04f0: 6c 61 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69  lan when there i
0500: 73 20 6e 6f 20 77 61 79 20 69 6e 20 77 68 69 63  s no way in whic
0510: 68 20 72 65 70 6c 61 6e 6e 69 6e 67 20 74 68 65  h replanning the
0520: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
0530: 20 71 75 65 72 79 20 6d 61 79 20 70 72 6f 64 75   query may produ
0540: 63 65 20 61 20 73 75 70 65 72 69 6f 72 20 6f 75  ce a superior ou
0550: 74 63 6f 6d 65 2e 0a 23 0a 23 20 61 6e 61 6c 79  tcome..#.# analy
0560: 7a 65 33 2d 34 2e 2a 3a 20 54 65 73 74 20 74 68  ze3-4.*: Test th
0570: 61 74 20 53 51 4c 20 6f 72 20 61 75 74 68 6f 72  at SQL or author
0580: 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
0590: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 69 6e 67   errors occuring
05a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
05b0: 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 52   within sqlite3R
05c0: 65 70 72 65 70 61 72 65 28 29 20 61 72 65 20 68  eprepare() are h
05d0: 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  andled correctly
05e0: 2e 0a 23 0a 23 20 61 6e 61 6c 79 7a 65 33 2d 35  ..#.# analyze3-5
05f0: 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .*: Check that t
0600: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 73 20 6f  he query plans o
0610: 66 20 61 70 70 6c 69 63 61 62 6c 65 20 73 74 61  f applicable sta
0620: 74 65 6d 65 6e 74 73 20 61 72 65 0a 23 20 20 20  tements are.#   
0630: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 76 61              inva
0640: 6c 69 64 61 74 65 64 20 69 66 20 74 68 65 20 76  lidated if the v
0650: 61 6c 75 65 73 20 6f 66 20 53 51 4c 20 70 61 72  alues of SQL par
0660: 61 6d 65 74 65 72 20 61 72 65 20 6d 6f 64 69 66  ameter are modif
0670: 69 65 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  ied.#           
0680: 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 63 6c      using the cl
0690: 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 29 20 6f  ear_bindings() o
06a0: 72 20 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  r transfer_bindi
06b0: 6e 67 73 28 29 20 41 50 49 73 2e 0a 23 20 0a 23  ngs() APIs..# .#
06c0: 20 61 6e 61 6c 79 7a 65 33 2d 36 2e 2a 3a 20 54   analyze3-6.*: T
06d0: 65 73 74 20 74 68 61 74 20 74 68 65 20 70 72 6f  est that the pro
06e0: 62 6c 65 6d 20 66 69 78 65 64 20 62 79 20 63 6f  blem fixed by co
06f0: 6d 6d 69 74 20 5b 31 32 37 61 35 62 37 37 36 64  mmit [127a5b776d
0700: 5d 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 23 20  ] is fixed..#.# 
0710: 61 6e 61 6c 79 7a 65 33 2d 37 2e 2a 3a 20 54 65  analyze3-7.*: Te
0720: 73 74 20 74 68 61 74 20 73 6f 6d 65 20 6d 65 6d  st that some mem
0730: 6f 72 79 20 6c 65 61 6b 73 20 64 69 73 63 6f 76  ory leaks discov
0740: 65 72 65 64 20 62 79 20 66 75 7a 7a 20 74 65 73  ered by fuzz tes
0750: 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20 20 20  ting .#         
0760: 20 20 20 20 20 20 68 61 76 65 20 62 65 65 6e 20        have been 
0770: 66 69 78 65 64 2e 0a 23 0a 0a 70 72 6f 63 20 67  fixed..#..proc g
0780: 65 74 76 61 72 20 7b 76 61 72 6e 61 6d 65 7d 20  etvar {varname} 
0790: 7b 20 75 70 6c 65 76 65 6c 20 23 30 20 73 65 74  { uplevel #0 set
07a0: 20 24 76 61 72 6e 61 6d 65 20 7d 0a 64 62 20 66   $varname }.db f
07b0: 75 6e 63 74 69 6f 6e 20 76 61 72 20 67 65 74 76  unction var getv
07c0: 61 72 0a 0a 70 72 6f 63 20 65 71 70 20 7b 73 71  ar..proc eqp {sq
07d0: 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 75  l {db db}} {.  u
07e0: 70 6c 65 76 65 6c 20 65 78 65 63 73 71 6c 20 5b  plevel execsql [
07f0: 6c 69 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55  list "EXPLAIN QU
0800: 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 20  ERY PLAN $sql"] 
0810: 24 64 62 0a 7d 0a 0a 70 72 6f 63 20 73 66 5f 65  $db.}..proc sf_e
0820: 78 65 63 73 71 6c 20 7b 73 71 6c 20 7b 64 62 20  xecsql {sql {db 
0830: 64 62 7d 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73  db}} {.  set ::s
0840: 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
0850: 6e 74 20 30 0a 20 20 73 65 74 20 72 20 5b 75 70  nt 0.  set r [up
0860: 6c 65 76 65 6c 20 5b 6c 69 73 74 20 65 78 65 63  level [list exec
0870: 73 71 6c 20 24 73 71 6c 20 24 64 62 5d 5d 0a 0a  sql $sql $db]]..
0880: 20 20 63 6f 6e 63 61 74 20 24 3a 3a 73 71 6c 69    concat $::sqli
0890: 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 20  te_search_count 
08a0: 5b 24 64 62 20 73 74 61 74 75 73 20 73 74 65 70  [$db status step
08b0: 5d 20 24 72 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ] $r.}..#-------
08c0: 2d 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 0a 23 0a 23 20 61 6e 61 6c 79 7a 65 33 2d  --.#.# analyze3-
0910: 31 2e 31 2e 31 3a 20 0a 23 20 20 20 43 72 65 61  1.1.1: .#   Crea
0920: 74 65 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  te a table with 
0930: 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e 20 50 6f 70  two columns. Pop
0940: 75 6c 61 74 65 20 74 68 65 20 66 69 72 73 74 20  ulate the first 
0950: 63 6f 6c 75 6d 6e 20 28 61 66 66 69 6e 69 74 79  column (affinity
0960: 20 0a 23 20 20 20 49 4e 54 45 47 45 52 29 20 77   .#   INTEGER) w
0970: 69 74 68 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ith integer valu
0980: 65 73 20 66 72 6f 6d 20 31 30 30 20 74 6f 20 31  es from 100 to 1
0990: 31 30 30 2e 20 43 72 65 61 74 65 20 61 6e 20 69  100. Create an i
09a0: 6e 64 65 78 20 6f 6e 20 74 68 69 73 20 0a 23 20  ndex on this .# 
09b0: 20 20 63 6f 6c 75 6d 6e 2e 20 41 4e 41 4c 59 5a    column. ANALYZ
09c0: 45 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 23  E the table..#.#
09d0: 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 32 20   analyze3-1.1.2 
09e0: 2d 20 33 2e 31 2e 33 0a 23 20 20 20 53 68 6f 77  - 3.1.3.#   Show
09f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
0a00: 74 77 6f 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  two possible pla
0a10: 6e 73 20 66 6f 72 20 71 75 65 72 79 69 6e 67 20  ns for querying 
0a20: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 0a 23  the table with.#
0a30: 20 20 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74     a range const
0a40: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 69 6e 64  raint on the ind
0a50: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 2d 20 22 66  exed column - "f
0a60: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 22 20  ull table scan" 
0a70: 6f 72 20 22 75 73 65 20 0a 23 20 20 20 74 68 65  or "use .#   the
0a80: 20 69 6e 64 65 78 22 2e 20 57 68 65 6e 20 74 68   index". When th
0a90: 65 20 72 61 6e 67 65 20 69 73 20 73 70 65 63 69  e range is speci
0aa0: 66 69 65 64 20 75 73 69 6e 67 20 6c 69 74 65 72  fied using liter
0ab0: 61 6c 20 76 61 6c 75 65 73 2c 20 53 51 4c 69 74  al values, SQLit
0ac0: 65 0a 23 20 20 20 69 73 20 61 62 6c 65 20 74 6f  e.#   is able to
0ad0: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 70   pick the best p
0ae0: 6c 61 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lan based on the
0af0: 20 73 61 6d 70 6c 65 73 20 69 6e 20 73 71 6c 69   samples in sqli
0b00: 74 65 5f 73 74 61 74 33 2e 0a 23 0a 23 20 61 6e  te_stat3..#.# an
0b10: 61 6c 79 7a 65 33 2d 31 2e 31 2e 34 20 2d 20 33  alyze3-1.1.4 - 3
0b20: 2e 31 2e 39 0a 23 20 20 20 53 68 6f 77 20 74 68  .1.9.#   Show th
0b30: 61 74 20 75 73 69 6e 67 20 53 51 4c 20 76 61 72  at using SQL var
0b40: 69 61 62 6c 65 73 20 70 72 6f 64 75 63 65 73 20  iables produces 
0b50: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 73  the same results
0b60: 20 61 73 20 75 73 69 6e 67 0a 23 20 20 20 6c 69   as using.#   li
0b70: 74 65 72 61 6c 20 76 61 6c 75 65 73 20 74 6f 20  teral values to 
0b80: 63 6f 6e 73 74 72 61 69 6e 20 74 68 65 20 72 61  constrain the ra
0b90: 6e 67 65 20 73 63 61 6e 2e 0a 23 0a 23 20 20 20  nge scan..#.#   
0ba0: 54 68 65 73 65 20 74 65 73 74 73 20 61 6c 73 6f  These tests also
0bb0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
0bc0: 63 6f 6d 70 69 6c 65 72 20 63 6f 64 65 20 63 6f  compiler code co
0bd0: 6e 73 69 64 65 72 73 20 63 6f 6c 75 6d 6e 20 0a  nsiders column .
0be0: 23 20 20 20 61 66 66 69 6e 69 74 69 65 73 20 77  #   affinities w
0bf0: 68 65 6e 20 65 73 74 69 6d 61 74 69 6e 67 20 74  hen estimating t
0c00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
0c10: 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
0c20: 20 22 75 73 65 20 0a 23 20 20 20 69 6e 64 65 78   "use .#   index
0c30: 20 73 74 72 61 74 65 67 79 22 2e 0a 23 0a 64 6f   strategy"..#.do
0c40: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31  _test analyze3-1
0c50: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
0c60: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0c70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0c80: 31 28 78 20 49 4e 54 45 47 45 52 2c 20 79 29 3b  1(x INTEGER, y);
0c90: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
0ca0: 58 20 69 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20  X i1 ON t1(x);. 
0cb0: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
0cc0: 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b  0} {$i < 1000} {
0cd0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
0ce0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0cf0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
0d00: 2b 31 30 30 2c 20 24 69 29 20 7d 0a 20 20 7d 0a  +100, $i) }.  }.
0d10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0d20: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 41 4e 41 4c  COMMIT;.    ANAL
0d30: 59 5a 45 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63  YZE;.  }..  exec
0d40: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
0d50: 6e 74 28 2a 29 3e 30 20 46 52 4f 4d 20 73 71 6c  nt(*)>0 FROM sql
0d60: 69 74 65 5f 73 74 61 74 34 3b 20 7d 0a 7d 20 7b  ite_stat4; }.} {
0d70: 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  1}..do_execsql_t
0d80: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31  est analyze3-1.1
0d90: 2e 78 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  .x {.  SELECT co
0da0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57  unt(*) FROM t1 W
0db0: 48 45 52 45 20 78 3e 32 30 30 20 41 4e 44 20 78  HERE x>200 AND x
0dc0: 3c 33 30 30 3b 0a 20 20 53 45 4c 45 43 54 20 63  <300;.  SELECT c
0dd0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
0de0: 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20 78 3c  WHERE x>0 AND x<
0df0: 31 31 30 30 3b 0a 7d 20 7b 39 39 20 31 30 30 30  1100;.} {99 1000
0e00: 7d 0a 0a 23 20 54 68 65 20 66 69 72 73 74 20 6f  }..# The first o
0e10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0e20: 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65  two SELECT state
0e30: 6d 65 6e 74 73 20 76 69 73 69 74 73 20 39 39 20  ments visits 99 
0e40: 72 6f 77 73 2e 20 53 6f 0a 23 20 69 74 20 69 73  rows. So.# it is
0e50: 20 62 65 74 74 65 72 20 74 6f 20 75 73 65 20 74   better to use t
0e60: 68 65 20 69 6e 64 65 78 2e 20 42 75 74 20 74 68  he index. But th
0e70: 65 20 73 65 63 6f 6e 64 20 76 69 73 69 74 73 20  e second visits 
0e80: 65 76 65 72 79 20 72 6f 77 20 69 6e 20 0a 23 20  every row in .# 
0e90: 74 68 65 20 74 61 62 6c 65 20 28 31 30 30 30 20  the table (1000 
0ea0: 69 6e 20 74 6f 74 61 6c 29 20 73 6f 20 69 74 20  in total) so it 
0eb0: 69 73 20 62 65 74 74 65 72 20 74 6f 20 64 6f 20  is better to do 
0ec0: 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
0ed0: 6e 2e 0a 23 0a 64 6f 5f 65 71 70 5f 74 65 73 74  n..#.do_eqp_test
0ee0: 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 32 20   analyze3-1.1.2 
0ef0: 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d 28 79  {.  SELECT sum(y
0f00: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
0f10: 78 3e 32 30 30 20 41 4e 44 20 78 3c 33 30 30 0a  x>200 AND x<300.
0f20: 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  } {SEARCH TABLE 
0f30: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
0f40: 31 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 7d  1 (x>? AND x<?)}
0f50: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 61 6e 61  .do_eqp_test ana
0f60: 6c 79 7a 65 33 2d 31 2e 31 2e 33 20 7b 0a 20 20  lyze3-1.1.3 {.  
0f70: 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52  SELECT sum(y) FR
0f80: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e 30 20  OM t1 WHERE x>0 
0f90: 41 4e 44 20 78 3c 31 31 30 30 20 0a 7d 20 7b 53  AND x<1100 .} {S
0fa0: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 0a 23  CAN TABLE t1}..#
0fb0: 20 32 30 31 37 2d 30 36 2d 32 36 3a 20 20 56 65   2017-06-26:  Ve
0fc0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 53 51  rify that the SQ
0fd0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
0fe0: 41 42 4c 45 5f 51 50 53 47 20 73 65 74 74 69 6e  ABLE_QPSG settin
0ff0: 67 20 64 69 73 61 62 6c 65 73 0a 23 20 74 68 65  g disables.# the
1000: 20 75 73 65 20 6f 66 20 62 6f 75 6e 64 20 70 61   use of bound pa
1010: 72 61 6d 65 74 65 72 73 20 62 79 20 53 54 41 54  rameters by STAT
1020: 34 0a 23 0a 64 62 20 63 61 63 68 65 20 66 6c 75  4.#.db cache flu
1030: 73 68 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70  sh.unset -nocomp
1040: 6c 61 69 6e 20 6c 0a 75 6e 73 65 74 20 2d 6e 6f  lain l.unset -no
1050: 63 6f 6d 70 6c 61 69 6e 20 75 0a 64 6f 5f 65 71  complain u.do_eq
1060: 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  p_test analyze3-
1070: 31 2e 31 2e 33 2e 31 30 30 20 7b 0a 20 20 53 45  1.1.3.100 {.  SE
1080: 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d  LECT sum(y) FROM
1090: 20 74 31 20 57 48 45 52 45 20 78 3e 24 6c 20 41   t1 WHERE x>$l A
10a0: 4e 44 20 78 3c 24 75 0a 7d 20 7b 53 45 41 52 43  ND x<$u.} {SEARC
10b0: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
10c0: 20 49 4e 44 45 58 20 69 31 20 28 78 3e 3f 20 41   INDEX i1 (x>? A
10d0: 4e 44 20 78 3c 3f 29 7d 0a 73 65 74 20 6c 20 32  ND x<?)}.set l 2
10e0: 30 30 0a 73 65 74 20 75 20 33 30 30 0a 64 6f 5f  00.set u 300.do_
10f0: 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  eqp_test analyze
1100: 33 2d 31 2e 31 2e 33 2e 31 30 31 20 7b 0a 20 20  3-1.1.3.101 {.  
1110: 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52  SELECT sum(y) FR
1120: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e 24 6c  OM t1 WHERE x>$l
1130: 20 41 4e 44 20 78 3c 24 75 0a 7d 20 7b 53 45 41   AND x<$u.} {SEA
1140: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
1150: 4e 47 20 49 4e 44 45 58 20 69 31 20 28 78 3e 3f  NG INDEX i1 (x>?
1160: 20 41 4e 44 20 78 3c 3f 29 7d 0a 73 65 74 20 6c   AND x<?)}.set l
1170: 20 30 0a 73 65 74 20 75 20 31 31 30 30 0a 64 6f   0.set u 1100.do
1180: 5f 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a  _eqp_test analyz
1190: 65 33 2d 31 2e 31 2e 33 2e 31 30 32 20 7b 0a 20  e3-1.1.3.102 {. 
11a0: 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46   SELECT sum(y) F
11b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e 24  ROM t1 WHERE x>$
11c0: 6c 20 41 4e 44 20 78 3c 24 75 0a 7d 20 7b 53 43  l AND x<$u.} {SC
11d0: 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 64 62 20  AN TABLE t1}.db 
11e0: 63 61 63 68 65 20 66 6c 75 73 68 0a 73 71 6c 69  cache flush.sqli
11f0: 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 64 62  te3_db_config db
1200: 20 45 4e 41 42 4c 45 5f 51 50 53 47 20 31 0a 64   ENABLE_QPSG 1.d
1210: 6f 5f 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79  o_eqp_test analy
1220: 7a 65 33 2d 31 2e 31 2e 33 2e 31 30 33 20 7b 0a  ze3-1.1.3.103 {.
1230: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20    SELECT sum(y) 
1240: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e  FROM t1 WHERE x>
1250: 24 6c 20 41 4e 44 20 78 3c 24 75 0a 7d 20 7b 53  $l AND x<$u.} {S
1260: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
1270: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 78  SING INDEX i1 (x
1280: 3e 3f 20 41 4e 44 20 78 3c 3f 29 7d 0a 64 62 20  >? AND x<?)}.db 
1290: 63 61 63 68 65 20 66 6c 75 73 68 0a 73 71 6c 69  cache flush.sqli
12a0: 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 64 62  te3_db_config db
12b0: 20 45 4e 41 42 4c 45 5f 51 50 53 47 20 30 0a 64   ENABLE_QPSG 0.d
12c0: 6f 5f 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79  o_eqp_test analy
12d0: 7a 65 33 2d 31 2e 31 2e 33 2e 31 30 34 20 7b 0a  ze3-1.1.3.104 {.
12e0: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20    SELECT sum(y) 
12f0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3e  FROM t1 WHERE x>
1300: 24 6c 20 41 4e 44 20 78 3c 24 75 0a 7d 20 7b 53  $l AND x<$u.} {S
1310: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 0a 64  CAN TABLE t1}..d
1320: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
1330: 31 2e 31 2e 34 20 7b 0a 20 20 73 66 5f 65 78 65  1.1.4 {.  sf_exe
1340: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
1350: 6d 28 79 29 20 46 52 4f 4d 20 74 31 20 57 48 45  m(y) FROM t1 WHE
1360: 52 45 20 78 3e 32 30 30 20 41 4e 44 20 78 3c 33  RE x>200 AND x<3
1370: 30 30 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31 34  00 }.} {199 0 14
1380: 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61  850}.do_test ana
1390: 6c 79 7a 65 33 2d 31 2e 31 2e 35 20 7b 0a 20 20  lyze3-1.1.5 {.  
13a0: 73 65 74 20 6c 20 5b 73 74 72 69 6e 67 20 72 61  set l [string ra
13b0: 6e 67 65 20 22 32 30 30 22 20 30 20 65 6e 64 5d  nge "200" 0 end]
13c0: 0a 20 20 73 65 74 20 75 20 5b 73 74 72 69 6e 67  .  set u [string
13d0: 20 72 61 6e 67 65 20 22 33 30 30 22 20 30 20 65   range "300" 0 e
13e0: 6e 64 5d 0a 20 20 73 66 5f 65 78 65 63 73 71 6c  nd].  sf_execsql
13f0: 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29   { SELECT sum(y)
1400: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
1410: 3e 24 6c 20 41 4e 44 20 78 3c 24 75 20 7d 0a 7d  >$l AND x<$u }.}
1420: 20 7b 31 39 39 20 30 20 31 34 38 35 30 7d 0a 64   {199 0 14850}.d
1430: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
1440: 31 2e 31 2e 36 20 7b 0a 20 20 73 65 74 20 6c 20  1.1.6 {.  set l 
1450: 5b 65 78 70 72 20 69 6e 74 28 32 30 30 29 5d 0a  [expr int(200)].
1460: 20 20 73 65 74 20 75 20 5b 65 78 70 72 20 69 6e    set u [expr in
1470: 74 28 33 30 30 29 5d 0a 20 20 73 66 5f 65 78 65  t(300)].  sf_exe
1480: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
1490: 6d 28 79 29 20 46 52 4f 4d 20 74 31 20 57 48 45  m(y) FROM t1 WHE
14a0: 52 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75  RE x>$l AND x<$u
14b0: 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31 34 38 35   }.} {199 0 1485
14c0: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
14d0: 7a 65 33 2d 31 2e 31 2e 37 20 7b 0a 20 20 73 66  ze3-1.1.7 {.  sf
14e0: 5f 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  _execsql { SELEC
14f0: 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 31  T sum(y) FROM t1
1500: 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20 78   WHERE x>0 AND x
1510: 3c 31 31 30 30 20 7d 0a 7d 20 7b 39 39 39 20 39  <1100 }.} {999 9
1520: 39 39 20 34 39 39 35 30 30 7d 0a 64 6f 5f 74 65  99 499500}.do_te
1530: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e  st analyze3-1.1.
1540: 38 20 7b 0a 20 20 73 65 74 20 6c 20 5b 73 74 72  8 {.  set l [str
1550: 69 6e 67 20 72 61 6e 67 65 20 22 30 22 20 30 20  ing range "0" 0 
1560: 65 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b 73 74  end].  set u [st
1570: 72 69 6e 67 20 72 61 6e 67 65 20 22 31 31 30 30  ring range "1100
1580: 22 20 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65 78  " 0 end].  sf_ex
1590: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
15a0: 75 6d 28 79 29 20 46 52 4f 4d 20 74 31 20 57 48  um(y) FROM t1 WH
15b0: 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24  ERE x>$l AND x<$
15c0: 75 20 7d 0a 7d 20 7b 39 39 39 20 39 39 39 20 34  u }.} {999 999 4
15d0: 39 39 35 30 30 7d 0a 64 6f 5f 74 65 73 74 20 61  99500}.do_test a
15e0: 6e 61 6c 79 7a 65 33 2d 31 2e 31 2e 39 20 7b 0a  nalyze3-1.1.9 {.
15f0: 20 20 73 65 74 20 6c 20 5b 65 78 70 72 20 69 6e    set l [expr in
1600: 74 28 30 29 5d 0a 20 20 73 65 74 20 75 20 5b 65  t(0)].  set u [e
1610: 78 70 72 20 69 6e 74 28 31 31 30 30 29 5d 0a 20  xpr int(1100)]. 
1620: 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53 45   sf_execsql { SE
1630: 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d  LECT sum(y) FROM
1640: 20 74 31 20 57 48 45 52 45 20 78 3e 24 6c 20 41   t1 WHERE x>$l A
1650: 4e 44 20 78 3c 24 75 20 7d 0a 7d 20 7b 39 39 39  ND x<$u }.} {999
1660: 20 39 39 39 20 34 39 39 35 30 30 7d 0a 0a 0a 23   999 499500}...#
1670: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1680: 65 73 74 73 20 61 72 65 20 73 69 6d 69 6c 61 72  ests are similar
1690: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   to the block ab
16a0: 6f 76 65 2e 20 54 68 65 20 64 69 66 66 65 72 65  ove. The differe
16b0: 6e 63 65 20 69 73 0a 23 20 74 68 61 74 20 74 68  nce is.# that th
16c0: 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  e indexed column
16d0: 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
16e0: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
16f0: 20 49 6e 20 74 68 65 20 74 65 73 74 73 0a 23 20   In the tests.# 
1700: 61 62 6f 76 65 20 74 68 65 20 61 66 66 69 6e 69  above the affini
1710: 74 79 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 23  ty is INTEGER..#
1720: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
1730: 33 2d 31 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  3-1.2.1 {.  exec
1740: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
1750: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1760: 42 4c 45 20 74 32 28 78 20 54 45 58 54 2c 20 79  BLE t2(x TEXT, y
1770: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1780: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
1790: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
17a0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
17b0: 4f 4e 20 74 32 28 78 29 3b 0a 20 20 20 20 43 4f  ON t2(x);.    CO
17c0: 4d 4d 49 54 3b 0a 20 20 20 20 41 4e 41 4c 59 5a  MMIT;.    ANALYZ
17d0: 45 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65  E;.  }.} {}.do_e
17e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 61 6e 61 6c  xecsql_test anal
17f0: 79 7a 65 33 2d 32 2e 31 2e 78 20 7b 0a 20 20 53  yze3-2.1.x {.  S
1800: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1810: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 31  ROM t2 WHERE x>1
1820: 20 41 4e 44 20 78 3c 32 3b 0a 20 20 53 45 4c 45   AND x<2;.  SELE
1830: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1840: 20 74 32 20 57 48 45 52 45 20 78 3e 30 20 41 4e   t2 WHERE x>0 AN
1850: 44 20 78 3c 39 39 3b 0a 7d 20 7b 32 30 30 20 39  D x<99;.} {200 9
1860: 39 30 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  90}.do_eqp_test 
1870: 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 32 20 7b  analyze3-1.2.2 {
1880: 0a 20 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29  .  SELECT sum(y)
1890: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78   FROM t2 WHERE x
18a0: 3e 31 20 41 4e 44 20 78 3c 32 0a 7d 20 7b 53 45  >1 AND x<2.} {SE
18b0: 41 52 43 48 20 54 41 42 4c 45 20 74 32 20 55 53  ARCH TABLE t2 US
18c0: 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 78 3e  ING INDEX i2 (x>
18d0: 3f 20 41 4e 44 20 78 3c 3f 29 7d 0a 64 6f 5f 65  ? AND x<?)}.do_e
18e0: 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  qp_test analyze3
18f0: 2d 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43  -1.2.3 {.  SELEC
1900: 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 32  T sum(y) FROM t2
1910: 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20 78   WHERE x>0 AND x
1920: 3c 39 39 0a 7d 20 7b 53 43 41 4e 20 54 41 42 4c  <99.} {SCAN TABL
1930: 45 20 74 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  E t2}..do_test a
1940: 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 34 20 7b 0a  nalyze3-1.2.4 {.
1950: 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53    sf_execsql { S
1960: 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f  ELECT sum(y) FRO
1970: 4d 20 74 32 20 57 48 45 52 45 20 78 3e 31 32 20  M t2 WHERE x>12 
1980: 41 4e 44 20 78 3c 32 30 20 7d 0a 7d 20 7b 31 36  AND x<20 }.} {16
1990: 31 20 30 20 34 37 36 30 7d 0a 64 6f 5f 74 65 73  1 0 4760}.do_tes
19a0: 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 35  t analyze3-1.2.5
19b0: 20 7b 0a 20 20 73 65 74 20 6c 20 5b 73 74 72 69   {.  set l [stri
19c0: 6e 67 20 72 61 6e 67 65 20 22 31 32 22 20 30 20  ng range "12" 0 
19d0: 65 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b 73 74  end].  set u [st
19e0: 72 69 6e 67 20 72 61 6e 67 65 20 22 32 30 22 20  ring range "20" 
19f0: 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65 78 65 63  0 end].  sf_exec
1a00: 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65  sql {SELECT type
1a10: 6f 66 28 24 6c 29 2c 20 74 79 70 65 6f 66 28 24  of($l), typeof($
1a20: 75 29 2c 20 73 75 6d 28 79 29 20 46 52 4f 4d 20  u), sum(y) FROM 
1a30: 74 32 20 57 48 45 52 45 20 78 3e 24 6c 20 41 4e  t2 WHERE x>$l AN
1a40: 44 20 78 3c 24 75 7d 0a 7d 20 7b 31 36 31 20 30  D x<$u}.} {161 0
1a50: 20 74 65 78 74 20 74 65 78 74 20 34 37 36 30 7d   text text 4760}
1a60: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
1a70: 33 2d 31 2e 32 2e 36 20 7b 0a 20 20 73 65 74 20  3-1.2.6 {.  set 
1a80: 6c 20 5b 65 78 70 72 20 69 6e 74 28 31 32 29 5d  l [expr int(12)]
1a90: 0a 20 20 73 65 74 20 75 20 5b 65 78 70 72 20 69  .  set u [expr i
1aa0: 6e 74 28 32 30 29 5d 0a 20 20 73 66 5f 65 78 65  nt(20)].  sf_exe
1ab0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70  csql {SELECT typ
1ac0: 65 6f 66 28 24 6c 29 2c 20 74 79 70 65 6f 66 28  eof($l), typeof(
1ad0: 24 75 29 2c 20 73 75 6d 28 79 29 20 46 52 4f 4d  $u), sum(y) FROM
1ae0: 20 74 32 20 57 48 45 52 45 20 78 3e 24 6c 20 41   t2 WHERE x>$l A
1af0: 4e 44 20 78 3c 24 75 7d 0a 7d 20 7b 31 36 31 20  ND x<$u}.} {161 
1b00: 30 20 69 6e 74 65 67 65 72 20 69 6e 74 65 67 65  0 integer intege
1b10: 72 20 34 37 36 30 7d 0a 64 6f 5f 74 65 73 74 20  r 4760}.do_test 
1b20: 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 37 20 7b  analyze3-1.2.7 {
1b30: 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20  .  sf_execsql { 
1b40: 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52  SELECT sum(y) FR
1b50: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 30 20  OM t2 WHERE x>0 
1b60: 41 4e 44 20 78 3c 39 39 20 7d 0a 7d 20 7b 39 39  AND x<99 }.} {99
1b70: 39 20 39 39 39 20 34 39 30 35 35 35 7d 0a 64 6f  9 999 490555}.do
1b80: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31  _test analyze3-1
1b90: 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20 6c 20 5b  .2.8 {.  set l [
1ba0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 30 22  string range "0"
1bb0: 20 30 20 65 6e 64 5d 0a 20 20 73 65 74 20 75 20   0 end].  set u 
1bc0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 22 39  [string range "9
1bd0: 39 22 20 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65  9" 0 end].  sf_e
1be0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74  xecsql {SELECT t
1bf0: 79 70 65 6f 66 28 24 6c 29 2c 20 74 79 70 65 6f  ypeof($l), typeo
1c00: 66 28 24 75 29 2c 20 73 75 6d 28 79 29 20 46 52  f($u), sum(y) FR
1c10: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3e 24 6c  OM t2 WHERE x>$l
1c20: 20 41 4e 44 20 78 3c 24 75 7d 0a 7d 20 7b 39 39   AND x<$u}.} {99
1c30: 39 20 39 39 39 20 74 65 78 74 20 74 65 78 74 20  9 999 text text 
1c40: 34 39 30 35 35 35 7d 0a 64 6f 5f 74 65 73 74 20  490555}.do_test 
1c50: 61 6e 61 6c 79 7a 65 33 2d 31 2e 32 2e 39 20 7b  analyze3-1.2.9 {
1c60: 0a 20 20 73 65 74 20 6c 20 5b 65 78 70 72 20 69  .  set l [expr i
1c70: 6e 74 28 30 29 5d 0a 20 20 73 65 74 20 75 20 5b  nt(0)].  set u [
1c80: 65 78 70 72 20 69 6e 74 28 39 39 29 5d 0a 20 20  expr int(99)].  
1c90: 73 66 5f 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  sf_execsql {SELE
1ca0: 43 54 20 74 79 70 65 6f 66 28 24 6c 29 2c 20 74  CT typeof($l), t
1cb0: 79 70 65 6f 66 28 24 75 29 2c 20 73 75 6d 28 79  ypeof($u), sum(y
1cc0: 29 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  ) FROM t2 WHERE 
1cd0: 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75 7d 0a 7d  x>$l AND x<$u}.}
1ce0: 20 7b 39 39 39 20 39 39 39 20 69 6e 74 65 67 65   {999 999 intege
1cf0: 72 20 69 6e 74 65 67 65 72 20 34 39 30 35 35 35  r integer 490555
1d00: 7d 0a 0a 23 20 53 61 6d 65 20 74 65 73 74 73 20  }..# Same tests 
1d10: 61 20 74 68 69 72 64 20 74 69 6d 65 2e 20 54 68  a third time. Th
1d20: 69 73 20 74 69 6d 65 2c 20 63 6f 6c 75 6d 6e 20  is time, column 
1d30: 78 20 68 61 73 20 49 4e 54 45 47 45 52 20 61 66  x has INTEGER af
1d40: 66 69 6e 69 74 79 20 61 6e 64 0a 23 20 69 73 20  finity and.# is 
1d50: 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
1d60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
1d70: 61 62 6c 65 2e 20 54 68 69 73 20 74 72 69 67 67  able. This trigg
1d80: 65 72 65 64 20 61 20 62 75 67 20 63 61 75 73 69  ered a bug causi
1d90: 6e 67 0a 23 20 53 51 4c 69 74 65 20 74 6f 20 75  ng.# SQLite to u
1da0: 73 65 20 73 75 62 2d 6f 70 74 69 6d 61 6c 20 71  se sub-optimal q
1db0: 75 65 72 79 20 70 6c 61 6e 73 20 69 6e 20 33 2e  uery plans in 3.
1dc0: 36 2e 31 38 20 61 6e 64 20 65 61 72 6c 69 65 72  6.18 and earlier
1dd0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  ..#.do_test anal
1de0: 79 7a 65 33 2d 31 2e 33 2e 31 20 7b 0a 20 20 65  yze3-1.3.1 {.  e
1df0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
1e00: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
1e10: 20 54 41 42 4c 45 20 74 33 28 79 20 54 45 58 54   TABLE t3(y TEXT
1e20: 2c 20 78 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  , x INTEGER);.  
1e30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e40: 74 33 20 53 45 4c 45 43 54 20 79 2c 20 78 20 46  t3 SELECT y, x F
1e50: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 52  ROM t1;.      CR
1e60: 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
1e70: 20 74 33 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d   t3(x);.    COMM
1e80: 49 54 3b 0a 20 20 20 20 41 4e 41 4c 59 5a 45 3b  IT;.    ANALYZE;
1e90: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  .  }.} {}.do_exe
1ea0: 63 73 71 6c 5f 74 65 73 74 20 61 6e 61 6c 79 7a  csql_test analyz
1eb0: 65 33 2d 31 2e 33 2e 78 20 7b 0a 20 20 53 45 4c  e3-1.3.x {.  SEL
1ec0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1ed0: 4d 20 74 33 20 57 48 45 52 45 20 78 3e 32 30 30  M t3 WHERE x>200
1ee0: 20 41 4e 44 20 78 3c 33 30 30 3b 0a 20 20 53 45   AND x<300;.  SE
1ef0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1f00: 4f 4d 20 74 33 20 57 48 45 52 45 20 78 3e 30 20  OM t3 WHERE x>0 
1f10: 41 4e 44 20 78 3c 31 31 30 30 0a 7d 20 7b 39 39  AND x<1100.} {99
1f20: 20 31 30 30 30 7d 0a 64 6f 5f 65 71 70 5f 74 65   1000}.do_eqp_te
1f30: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 33 2e  st analyze3-1.3.
1f40: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d  2 {.  SELECT sum
1f50: 28 79 29 20 46 52 4f 4d 20 74 33 20 57 48 45 52  (y) FROM t3 WHER
1f60: 45 20 78 3e 32 30 30 20 41 4e 44 20 78 3c 33 30  E x>200 AND x<30
1f70: 30 0a 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0.} {SEARCH TABL
1f80: 45 20 74 33 20 55 53 49 4e 47 20 49 4e 44 45 58  E t3 USING INDEX
1f90: 20 69 33 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f   i3 (x>? AND x<?
1fa0: 29 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 61  )}.do_eqp_test a
1fb0: 6e 61 6c 79 7a 65 33 2d 31 2e 33 2e 33 20 7b 0a  nalyze3-1.3.3 {.
1fc0: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 79 29 20    SELECT sum(y) 
1fd0: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 78 3e  FROM t3 WHERE x>
1fe0: 30 20 41 4e 44 20 78 3c 31 31 30 30 0a 7d 20 7b  0 AND x<1100.} {
1ff0: 53 43 41 4e 20 54 41 42 4c 45 20 74 33 7d 0a 0a  SCAN TABLE t3}..
2000: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
2010: 2d 31 2e 33 2e 34 20 7b 0a 20 20 73 66 5f 65 78  -1.3.4 {.  sf_ex
2020: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
2030: 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20 57 48  um(y) FROM t3 WH
2040: 45 52 45 20 78 3e 32 30 30 20 41 4e 44 20 78 3c  ERE x>200 AND x<
2050: 33 30 30 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31  300 }.} {199 0 1
2060: 34 38 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  4850}.do_test an
2070: 61 6c 79 7a 65 33 2d 31 2e 33 2e 35 20 7b 0a 20  alyze3-1.3.5 {. 
2080: 20 73 65 74 20 6c 20 5b 73 74 72 69 6e 67 20 72   set l [string r
2090: 61 6e 67 65 20 22 32 30 30 22 20 30 20 65 6e 64  ange "200" 0 end
20a0: 5d 0a 20 20 73 65 74 20 75 20 5b 73 74 72 69 6e  ].  set u [strin
20b0: 67 20 72 61 6e 67 65 20 22 33 30 30 22 20 30 20  g range "300" 0 
20c0: 65 6e 64 5d 0a 20 20 73 66 5f 65 78 65 63 73 71  end].  sf_execsq
20d0: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 79  l { SELECT sum(y
20e0: 29 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  ) FROM t3 WHERE 
20f0: 78 3e 24 6c 20 41 4e 44 20 78 3c 24 75 20 7d 0a  x>$l AND x<$u }.
2100: 7d 20 7b 31 39 39 20 30 20 31 34 38 35 30 7d 0a  } {199 0 14850}.
2110: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
2120: 2d 31 2e 33 2e 36 20 7b 0a 20 20 73 65 74 20 6c  -1.3.6 {.  set l
2130: 20 5b 65 78 70 72 20 69 6e 74 28 32 30 30 29 5d   [expr int(200)]
2140: 0a 20 20 73 65 74 20 75 20 5b 65 78 70 72 20 69  .  set u [expr i
2150: 6e 74 28 33 30 30 29 5d 0a 20 20 73 66 5f 65 78  nt(300)].  sf_ex
2160: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
2170: 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20 57 48  um(y) FROM t3 WH
2180: 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c 24  ERE x>$l AND x<$
2190: 75 20 7d 0a 7d 20 7b 31 39 39 20 30 20 31 34 38  u }.} {199 0 148
21a0: 35 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  50}.do_test anal
21b0: 79 7a 65 33 2d 31 2e 33 2e 37 20 7b 0a 20 20 73  yze3-1.3.7 {.  s
21c0: 66 5f 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45  f_execsql { SELE
21d0: 43 54 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 74  CT sum(y) FROM t
21e0: 33 20 57 48 45 52 45 20 78 3e 30 20 41 4e 44 20  3 WHERE x>0 AND 
21f0: 78 3c 31 31 30 30 20 7d 0a 7d 20 7b 39 39 39 20  x<1100 }.} {999 
2200: 39 39 39 20 34 39 39 35 30 30 7d 0a 64 6f 5f 74  999 499500}.do_t
2210: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 31 2e 33  est analyze3-1.3
2220: 2e 38 20 7b 0a 20 20 73 65 74 20 6c 20 5b 73 74  .8 {.  set l [st
2230: 72 69 6e 67 20 72 61 6e 67 65 20 22 30 22 20 30  ring range "0" 0
2240: 20 65 6e 64 5d 0a 20 20 73 65 74 20 75 20 5b 73   end].  set u [s
2250: 74 72 69 6e 67 20 72 61 6e 67 65 20 22 31 31 30  tring range "110
2260: 30 22 20 30 20 65 6e 64 5d 0a 20 20 73 66 5f 65  0" 0 end].  sf_e
2270: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
2280: 73 75 6d 28 79 29 20 46 52 4f 4d 20 74 33 20 57  sum(y) FROM t3 W
2290: 48 45 52 45 20 78 3e 24 6c 20 41 4e 44 20 78 3c  HERE x>$l AND x<
22a0: 24 75 20 7d 0a 7d 20 7b 39 39 39 20 39 39 39 20  $u }.} {999 999 
22b0: 34 39 39 35 30 30 7d 0a 64 6f 5f 74 65 73 74 20  499500}.do_test 
22c0: 61 6e 61 6c 79 7a 65 33 2d 31 2e 33 2e 39 20 7b  analyze3-1.3.9 {
22d0: 0a 20 20 73 65 74 20 6c 20 5b 65 78 70 72 20 69  .  set l [expr i
22e0: 6e 74 28 30 29 5d 0a 20 20 73 65 74 20 75 20 5b  nt(0)].  set u [
22f0: 65 78 70 72 20 69 6e 74 28 31 31 30 30 29 5d 0a  expr int(1100)].
2300: 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53    sf_execsql { S
2310: 45 4c 45 43 54 20 73 75 6d 28 79 29 20 46 52 4f  ELECT sum(y) FRO
2320: 4d 20 74 33 20 57 48 45 52 45 20 78 3e 24 6c 20  M t3 WHERE x>$l 
2330: 41 4e 44 20 78 3c 24 75 20 7d 0a 7d 20 7b 39 39  AND x<$u }.} {99
2340: 39 20 39 39 39 20 34 39 39 35 30 30 7d 0a 0a 23  9 999 499500}..#
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
23a0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
23b0: 20 6f 66 20 62 6f 75 6e 64 20 53 51 4c 20 76 61   of bound SQL va
23c0: 72 69 61 62 6c 65 73 20 6d 61 79 20 62 65 20 75  riables may be u
23d0: 73 65 64 20 66 6f 72 20 74 68 65 20 4c 49 4b 45  sed for the LIKE
23e0: 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  .# optimization.
23f0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
2400: 65 73 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  es.do_test analy
2410: 7a 65 33 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63  ze3-2.1 {.  exec
2420: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
2430: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
2440: 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 42 45  like=off;.    BE
2450: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
2460: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 54 45  TABLE t1(a, b TE
2470: 58 54 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  XT COLLATE nocas
2480: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  e);.    CREATE I
2490: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
24a0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
24b0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30   i 0} {$i < 1000
24c0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
24d0: 20 73 65 74 20 74 20 22 22 0a 20 20 20 20 61 70   set t "".    ap
24e0: 70 65 6e 64 20 74 20 5b 6c 69 6e 64 65 78 20 7b  pend t [lindex {
24f0: 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20  a b c d e f g h 
2500: 69 20 6a 7d 20 5b 65 78 70 72 20 24 69 2f 31 30  i j} [expr $i/10
2510: 30 5d 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 74  0]].    append t
2520: 20 5b 6c 69 6e 64 65 78 20 7b 61 20 62 20 63 20   [lindex {a b c 
2530: 64 20 65 20 66 20 67 20 68 20 69 20 6a 7d 20 5b  d e f g h i j} [
2540: 65 78 70 72 20 28 24 69 2f 31 30 29 25 31 30 5d  expr ($i/10)%10]
2550: 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 74 20 5b  ].    append t [
2560: 6c 69 6e 64 65 78 20 7b 61 20 62 20 63 20 64 20  lindex {a b c d 
2570: 65 20 66 20 67 20 68 20 69 20 6a 7d 20 5b 65 78  e f g h i j} [ex
2580: 70 72 20 28 24 69 25 31 30 29 5d 5d 0a 20 20 20  pr ($i%10)]].   
2590: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
25a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
25b0: 28 24 69 2c 20 24 74 29 20 7d 0a 20 20 7d 0a 20  ($i, $t) }.  }. 
25c0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
25d0: 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74  } {}.do_eqp_test
25e0: 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 32 20 7b 0a   analyze3-2.2 {.
25f0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 61    SELECT count(a
2600: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2610: 62 20 4c 49 4b 45 20 27 61 25 27 0a 7d 20 7b 53  b LIKE 'a%'.} {S
2620: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
2630: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 62  SING INDEX i1 (b
2640: 3e 3f 20 41 4e 44 20 62 3c 3f 29 7d 0a 64 6f 5f  >? AND b<?)}.do_
2650: 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  eqp_test analyze
2660: 33 2d 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  3-2.3 {.  SELECT
2670: 20 63 6f 75 6e 74 28 61 29 20 46 52 4f 4d 20 74   count(a) FROM t
2680: 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27  1 WHERE b LIKE '
2690: 25 61 27 0a 7d 20 7b 53 43 41 4e 20 54 41 42 4c  %a'.} {SCAN TABL
26a0: 45 20 74 31 7d 0a 0a 23 20 52 65 74 75 72 6e 20  E t1}..# Return 
26b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
26c0: 6e 74 20 69 66 20 6c 69 6b 65 5f 6d 61 74 63 68  nt if like_match
26d0: 5f 62 6c 6f 62 73 20 69 73 20 74 72 75 65 20 28  _blobs is true (
26e0: 74 68 65 20 64 65 66 61 75 6c 74 29 0a 23 20 6f  the default).# o
26f0: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  r the second arg
2700: 75 6d 65 6e 74 20 69 66 20 6e 6f 74 0a 23 0a 70  ument if not.#.p
2710: 72 6f 63 20 69 6c 6d 62 20 7b 61 20 62 7d 20 7b  roc ilmb {a b} {
2720: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 6c 69 6b  .  ifcapable lik
2730: 65 5f 6d 61 74 63 68 5f 62 6c 6f 62 73 20 7b 72  e_match_blobs {r
2740: 65 74 75 72 6e 20 24 61 7d 0a 20 20 72 65 74 75  eturn $a}.  retu
2750: 72 6e 20 24 62 0a 7d 0a 0a 64 6f 5f 74 65 73 74  rn $b.}..do_test
2760: 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 34 20 7b 0a   analyze3-2.4 {.
2770: 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53    sf_execsql { S
2780: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2790: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 4c  ROM t1 WHERE b L
27a0: 49 4b 45 20 27 61 25 27 20 7d 0a 7d 20 5b 6c 69  IKE 'a%' }.} [li
27b0: 73 74 20 5b 69 6c 6d 62 20 31 30 32 20 31 30 31  st [ilmb 102 101
27c0: 5d 20 30 20 31 30 30 5d 0a 64 6f 5f 74 65 73 74  ] 0 100].do_test
27d0: 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 35 20 7b 0a   analyze3-2.5 {.
27e0: 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20 53    sf_execsql { S
27f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2800: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 4c  ROM t1 WHERE b L
2810: 49 4b 45 20 27 25 61 27 20 7d 0a 7d 20 7b 39 39  IKE '%a' }.} {99
2820: 39 20 39 39 39 20 31 30 30 7d 0a 0a 64 6f 5f 74  9 999 100}..do_t
2830: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 36  est analyze3-2.6
2840: 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20 22 61   {.  set like "a
2850: 25 22 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20  %".  sf_execsql 
2860: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
2870: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2880: 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d 0a 7d  b LIKE $like }.}
2890: 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20 31 30 32   [list [ilmb 102
28a0: 20 31 30 31 5d 20 30 20 31 30 30 5d 0a 64 6f 5f   101] 0 100].do_
28b0: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e  test analyze3-2.
28c0: 37 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20 22  7 {.  set like "
28d0: 25 61 22 0a 20 20 73 66 5f 65 78 65 63 73 71 6c  %a".  sf_execsql
28e0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
28f0: 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  *) FROM t1 WHERE
2900: 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d 0a   b LIKE $like }.
2910: 7d 20 7b 39 39 39 20 39 39 39 20 31 30 30 7d 0a  } {999 999 100}.
2920: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
2930: 2d 32 2e 38 20 7b 0a 20 20 73 65 74 20 6c 69 6b  -2.8 {.  set lik
2940: 65 20 22 61 22 0a 20 20 73 66 5f 65 78 65 63 73  e "a".  sf_execs
2950: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
2960: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45  t(*) FROM t1 WHE
2970: 52 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20  RE b LIKE $like 
2980: 7d 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20  }.} [list [ilmb 
2990: 31 30 32 20 31 30 31 5d 20 30 20 30 5d 0a 64 6f  102 101] 0 0].do
29a0: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32  _test analyze3-2
29b0: 2e 39 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20  .9 {.  set like 
29c0: 22 61 62 22 0a 20 20 73 66 5f 65 78 65 63 73 71  "ab".  sf_execsq
29d0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
29e0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
29f0: 45 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d  E b LIKE $like }
2a00: 0a 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20 31  .} [list [ilmb 1
2a10: 32 20 31 31 5d 20 30 20 30 5d 0a 64 6f 5f 74 65  2 11] 0 0].do_te
2a20: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 32 2e 31 30  st analyze3-2.10
2a30: 20 7b 0a 20 20 73 65 74 20 6c 69 6b 65 20 22 61   {.  set like "a
2a40: 62 63 22 0a 20 20 73 66 5f 65 78 65 63 73 71 6c  bc".  sf_execsql
2a50: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
2a60: 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  *) FROM t1 WHERE
2a70: 20 62 20 4c 49 4b 45 20 24 6c 69 6b 65 20 7d 0a   b LIKE $like }.
2a80: 7d 20 5b 6c 69 73 74 20 5b 69 6c 6d 62 20 33 20  } [list [ilmb 3 
2a90: 32 5d 20 30 20 31 5d 0a 64 6f 5f 74 65 73 74 20  2] 0 1].do_test 
2aa0: 61 6e 61 6c 79 7a 65 33 2d 32 2e 31 31 20 7b 0a  analyze3-2.11 {.
2ab0: 20 20 73 65 74 20 6c 69 6b 65 20 22 61 5f 63 22    set like "a_c"
2ac0: 0a 20 20 73 66 5f 65 78 65 63 73 71 6c 20 7b 20  .  sf_execsql { 
2ad0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2ae0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
2af0: 4c 49 4b 45 20 24 6c 69 6b 65 20 7d 0a 7d 20 5b  LIKE $like }.} [
2b00: 6c 69 73 74 20 5b 69 6c 6d 62 20 31 30 32 20 31  list [ilmb 102 1
2b10: 30 31 5d 20 30 20 31 30 5d 0a 0a 0a 23 2d 2d 2d  01] 0 10]...#---
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c  ------.# This bl
2b70: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 63 68 65  ock of tests che
2b80: 63 6b 73 20 74 68 61 74 20 73 74 61 74 65 6d 65  cks that stateme
2b90: 6e 74 73 20 61 72 65 20 63 6f 72 72 65 63 74 6c  nts are correctl
2ba0: 79 20 6d 61 72 6b 65 64 20 61 73 0a 23 20 65 78  y marked as.# ex
2bb0: 70 69 72 65 64 20 77 68 65 6e 20 74 68 65 20 76  pired when the v
2bc0: 61 6c 75 65 73 20 62 6f 75 6e 64 20 74 6f 20 61  alues bound to a
2bd0: 6e 79 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  ny parameters th
2be0: 61 74 20 6d 61 79 20 61 66 66 65 63 74 20 74 68  at may affect th
2bf0: 65 20 0a 23 20 71 75 65 72 79 20 70 6c 61 6e 20  e .# query plan 
2c00: 61 72 65 20 6d 6f 64 69 66 69 65 64 2e 0a 23 0a  are modified..#.
2c10: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
2c20: 64 62 20 61 75 74 68 20 61 75 74 68 0a 70 72 6f  db auth auth.pro
2c30: 63 20 61 75 74 68 20 7b 61 72 67 73 7d 20 7b 0a  c auth {args} {.
2c40: 20 20 73 65 74 20 3a 3a 61 75 74 68 20 31 0a 20    set ::auth 1. 
2c50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c60: 4b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61  K.}..do_test ana
2c70: 6c 79 7a 65 33 2d 33 2e 31 20 7b 0a 20 20 65 78  lyze3-3.1 {.  ex
2c80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
2c90: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
2ca0: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b  BLE t1(a, b, c);
2cb0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
2cc0: 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i1 ON t1(b);. 
2cd0: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
2ce0: 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69  0} {$i < 100} {i
2cf0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
2d00: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
2d10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
2d20: 20 24 69 2c 20 24 69 29 20 7d 0a 20 20 7d 0a 20   $i, $i) }.  }. 
2d30: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
2d40: 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a    execsql ANALYZ
2d50: 45 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 61  E.} {}.do_test a
2d60: 6e 61 6c 79 7a 65 33 2d 33 2e 32 2e 31 20 7b 0a  nalyze3-3.2.1 {.
2d70: 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65 33    set S [sqlite3
2d80: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 22  _prepare_v2 db "
2d90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2da0: 20 57 48 45 52 45 20 62 3e 3f 22 20 2d 31 20 64   WHERE b>?" -1 d
2db0: 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f  ummy].  sqlite3_
2dc0: 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d  expired $S.} {0}
2dd0: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
2de0: 33 2d 33 2e 32 2e 32 20 7b 0a 20 20 73 71 6c 69  3-3.2.2 {.  sqli
2df0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53  te3_bind_text $S
2e00: 20 31 20 22 61 62 63 22 20 33 0a 20 20 73 71 6c   1 "abc" 3.  sql
2e10: 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a  ite3_expired $S.
2e20: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  } {1}.do_test an
2e30: 61 6c 79 7a 65 33 2d 33 2e 32 2e 34 20 7b 0a 20  alyze3-3.2.4 {. 
2e40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2e50: 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  e $S.} {SQLITE_O
2e60: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  K}..do_test anal
2e70: 79 7a 65 33 2d 33 2e 32 2e 35 20 7b 0a 20 20 73  yze3-3.2.5 {.  s
2e80: 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f 70 72  et S [sqlite3_pr
2e90: 65 70 61 72 65 5f 76 32 20 64 62 20 22 53 45 4c  epare_v2 db "SEL
2ea0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2eb0: 45 52 45 20 62 3d 3f 22 20 2d 31 20 64 75 6d 6d  ERE b=?" -1 dumm
2ec0: 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70  y].  sqlite3_exp
2ed0: 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f  ired $S.} {0}.do
2ee0: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33  _test analyze3-3
2ef0: 2e 32 2e 36 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.6 {.  sqlite3
2f00: 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 31 20  _bind_text $S 1 
2f10: 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69 74 65  "abc" 3.  sqlite
2f20: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
2f30: 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  1}.do_test analy
2f40: 7a 65 33 2d 33 2e 32 2e 37 20 7b 0a 20 20 73 71  ze3-3.2.7 {.  sq
2f50: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
2f60: 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  S.} {SQLITE_OK}.
2f70: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
2f80: 33 2d 33 2e 34 2e 31 20 7b 0a 20 20 73 65 74 20  3-3.4.1 {.  set 
2f90: 53 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  S [sqlite3_prepa
2fa0: 72 65 5f 76 32 20 64 62 20 22 53 45 4c 45 43 54  re_v2 db "SELECT
2fb0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2fc0: 20 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 20 2d 31   a=? AND b>?" -1
2fd0: 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65   dummy].  sqlite
2fe0: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
2ff0: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
3000: 7a 65 33 2d 33 2e 34 2e 32 20 7b 0a 20 20 73 71  ze3-3.4.2 {.  sq
3010: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
3020: 24 53 20 31 20 22 61 62 63 22 20 33 0a 20 20 73  $S 1 "abc" 3.  s
3030: 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24  qlite3_expired $
3040: 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  S.} {0}.do_test 
3050: 61 6e 61 6c 79 7a 65 33 2d 33 2e 34 2e 33 20 7b  analyze3-3.4.3 {
3060: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
3070: 74 65 78 74 20 24 53 20 32 20 22 64 65 66 22 20  text $S 2 "def" 
3080: 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  3.  sqlite3_expi
3090: 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f  red $S.} {1}.do_
30a0: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
30b0: 34 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4.4 {.  sqlite3_
30c0: 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32 20 22  bind_text $S 2 "
30d0: 67 68 69 22 20 33 0a 20 20 73 71 6c 69 74 65 33  ghi" 3.  sqlite3
30e0: 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31  _expired $S.} {1
30f0: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
3100: 65 33 2d 33 2e 34 2e 35 20 7b 0a 20 20 73 71 6c  e3-3.4.5 {.  sql
3110: 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a  ite3_expired $S.
3120: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e  } {1}.do_test an
3130: 61 6c 79 7a 65 33 2d 33 2e 34 2e 36 20 7b 0a 20  alyze3-3.4.6 {. 
3140: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3150: 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  e $S.} {SQLITE_O
3160: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  K}..do_test anal
3170: 79 7a 65 33 2d 33 2e 35 2e 31 20 7b 0a 20 20 73  yze3-3.5.1 {.  s
3180: 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f 70 72  et S [sqlite3_pr
3190: 65 70 61 72 65 5f 76 32 20 64 62 20 7b 0a 20 20  epare_v2 db {.  
31a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
31b0: 74 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 0a  t1 WHERE a IN (.
31c0: 20 20 20 20 20 20 3f 31 2c 20 3f 32 2c 20 3f 33        ?1, ?2, ?3
31d0: 2c 20 3f 34 2c 20 3f 35 2c 20 3f 36 2c 20 3f 37  , ?4, ?5, ?6, ?7
31e0: 2c 20 3f 38 2c 20 3f 39 2c 20 3f 31 30 2c 0a 20  , ?8, ?9, ?10,. 
31f0: 20 20 20 20 20 3f 31 31 2c 20 3f 31 32 2c 20 3f       ?11, ?12, ?
3200: 31 33 2c 20 3f 31 34 2c 20 3f 31 35 2c 20 3f 31  13, ?14, ?15, ?1
3210: 36 2c 20 3f 31 37 2c 20 3f 31 38 2c 20 3f 31 39  6, ?17, ?18, ?19
3220: 2c 20 3f 32 30 2c 0a 20 20 20 20 20 20 3f 32 31  , ?20,.      ?21
3230: 2c 20 3f 32 32 2c 20 3f 32 33 2c 20 3f 32 34 2c  , ?22, ?23, ?24,
3240: 20 3f 32 35 2c 20 3f 32 36 2c 20 3f 32 37 2c 20   ?25, ?26, ?27, 
3250: 3f 32 38 2c 20 3f 32 39 2c 20 3f 33 30 2c 20 3f  ?28, ?29, ?30, ?
3260: 33 31 0a 20 20 20 20 29 20 41 4e 44 20 62 3e 3f  31.    ) AND b>?
3270: 33 32 3b 0a 20 20 7d 20 2d 31 20 64 75 6d 6d 79  32;.  } -1 dummy
3280: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  ].  sqlite3_expi
3290: 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f  red $S.} {0}.do_
32a0: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
32b0: 35 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  5.2 {.  sqlite3_
32c0: 62 69 6e 64 5f 74 65 78 74 20 24 53 20 33 31 20  bind_text $S 31 
32d0: 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69 74 65  "abc" 3.  sqlite
32e0: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
32f0: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
3300: 7a 65 33 2d 33 2e 35 2e 33 20 7b 0a 20 20 73 71  ze3-3.5.3 {.  sq
3310: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
3320: 24 53 20 33 32 20 22 64 65 66 22 20 33 0a 20 20  $S 32 "def" 3.  
3330: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20  sqlite3_expired 
3340: 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  $S.} {1}.do_test
3350: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 35 2e 35 20   analyze3-3.5.5 
3360: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  {.  sqlite3_fina
3370: 6c 69 7a 65 20 24 53 0a 7d 20 7b 53 51 4c 49 54  lize $S.} {SQLIT
3380: 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 61  E_OK}..do_test a
3390: 6e 61 6c 79 7a 65 33 2d 33 2e 36 2e 31 20 7b 0a  nalyze3-3.6.1 {.
33a0: 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65 33    set S [sqlite3
33b0: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 7b  _prepare_v2 db {
33c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
33d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 49 4e  OM t1 WHERE a IN
33e0: 20 28 0a 20 20 20 20 20 20 3f 31 2c 20 3f 32 2c   (.      ?1, ?2,
33f0: 20 3f 33 2c 20 3f 34 2c 20 3f 35 2c 20 3f 36 2c   ?3, ?4, ?5, ?6,
3400: 20 3f 37 2c 20 3f 38 2c 20 3f 39 2c 20 3f 31 30   ?7, ?8, ?9, ?10
3410: 2c 0a 20 20 20 20 20 20 3f 31 31 2c 20 3f 31 32  ,.      ?11, ?12
3420: 2c 20 3f 31 33 2c 20 3f 31 34 2c 20 3f 31 35 2c  , ?13, ?14, ?15,
3430: 20 3f 31 36 2c 20 3f 31 37 2c 20 3f 31 38 2c 20   ?16, ?17, ?18, 
3440: 3f 31 39 2c 20 3f 32 30 2c 0a 20 20 20 20 20 20  ?19, ?20,.      
3450: 3f 32 31 2c 20 3f 32 32 2c 20 3f 32 33 2c 20 3f  ?21, ?22, ?23, ?
3460: 32 34 2c 20 3f 32 35 2c 20 3f 32 36 2c 20 3f 32  24, ?25, ?26, ?2
3470: 37 2c 20 3f 32 38 2c 20 3f 32 39 2c 20 3f 33 30  7, ?28, ?29, ?30
3480: 2c 20 3f 33 31 2c 20 3f 33 32 0a 20 20 20 20 29  , ?31, ?32.    )
3490: 20 41 4e 44 20 62 3e 3f 33 33 3b 0a 20 20 7d 20   AND b>?33;.  } 
34a0: 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69  -1 dummy].  sqli
34b0: 74 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d  te3_expired $S.}
34c0: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61   {0}.do_test ana
34d0: 6c 79 7a 65 33 2d 33 2e 36 2e 32 20 7b 0a 20 20  lyze3-3.6.2 {.  
34e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
34f0: 74 20 24 53 20 33 32 20 22 61 62 63 22 20 33 0a  t $S 32 "abc" 3.
3500: 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
3510: 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  d $S.} {1}.do_te
3520: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 36 2e  st analyze3-3.6.
3530: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  3 {.  sqlite3_bi
3540: 6e 64 5f 74 65 78 74 20 24 53 20 33 33 20 22 64  nd_text $S 33 "d
3550: 65 66 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f  ef" 3.  sqlite3_
3560: 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d  expired $S.} {1}
3570: 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  .do_test analyze
3580: 33 2d 33 2e 36 2e 35 20 7b 0a 20 20 73 71 6c 69  3-3.6.5 {.  sqli
3590: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a  te3_finalize $S.
35a0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64  } {SQLITE_OK}..d
35b0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
35c0: 33 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 53 20  3.7.1 {.  set S 
35d0: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
35e0: 5f 76 32 20 64 62 20 7b 0a 20 20 20 20 53 45 4c  _v2 db {.    SEL
35f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
3600: 45 52 45 20 61 20 49 4e 20 28 0a 20 20 20 20 20  ERE a IN (.     
3610: 20 3f 31 2c 20 3f 32 2c 20 3f 33 2c 20 3f 34 2c   ?1, ?2, ?3, ?4,
3620: 20 3f 35 2c 20 3f 36 2c 20 3f 37 2c 20 3f 38 2c   ?5, ?6, ?7, ?8,
3630: 20 3f 39 2c 20 3f 33 33 2c 0a 20 20 20 20 20 20   ?9, ?33,.      
3640: 3f 31 31 2c 20 3f 31 32 2c 20 3f 31 33 2c 20 3f  ?11, ?12, ?13, ?
3650: 31 34 2c 20 3f 31 35 2c 20 3f 31 36 2c 20 3f 31  14, ?15, ?16, ?1
3660: 37 2c 20 3f 31 38 2c 20 3f 31 39 2c 20 3f 32 30  7, ?18, ?19, ?20
3670: 2c 0a 20 20 20 20 20 20 3f 32 31 2c 20 3f 32 32  ,.      ?21, ?22
3680: 2c 20 3f 32 33 2c 20 3f 32 34 2c 20 3f 32 35 2c  , ?23, ?24, ?25,
3690: 20 3f 32 36 2c 20 3f 32 37 2c 20 3f 32 38 2c 20   ?26, ?27, ?28, 
36a0: 3f 32 39 2c 20 3f 33 30 2c 20 3f 33 31 2c 20 3f  ?29, ?30, ?31, ?
36b0: 33 32 0a 20 20 20 20 29 20 41 4e 44 20 62 3e 3f  32.    ) AND b>?
36c0: 31 30 3b 0a 20 20 7d 20 2d 31 20 64 75 6d 6d 79  10;.  } -1 dummy
36d0: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  ].  sqlite3_expi
36e0: 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f  red $S.} {0}.do_
36f0: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
3700: 37 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  7.2 {.  sqlite3_
3710: 62 69 6e 64 5f 74 65 78 74 20 24 53 20 33 32 20  bind_text $S 32 
3720: 22 61 62 63 22 20 33 0a 20 20 73 71 6c 69 74 65  "abc" 3.  sqlite
3730: 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b  3_expired $S.} {
3740: 30 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  0}.do_test analy
3750: 7a 65 33 2d 33 2e 37 2e 33 20 7b 0a 20 20 73 71  ze3-3.7.3 {.  sq
3760: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
3770: 24 53 20 33 33 20 22 64 65 66 22 20 33 0a 20 20  $S 33 "def" 3.  
3780: 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20  sqlite3_expired 
3790: 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  $S.} {0}.do_test
37a0: 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 37 2e 34 20   analyze3-3.7.4 
37b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  {.  sqlite3_bind
37c0: 5f 74 65 78 74 20 24 53 20 31 30 20 22 64 65 66  _text $S 10 "def
37d0: 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  " 3.  sqlite3_ex
37e0: 70 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64  pired $S.} {1}.d
37f0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
3800: 33 2e 37 2e 36 20 7b 0a 20 20 73 71 6c 69 74 65  3.7.6 {.  sqlite
3810: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a 7d 20  3_finalize $S.} 
3820: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f  {SQLITE_OK}..do_
3830: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
3840: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
3850: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
3860: 4c 45 20 74 34 28 78 2c 20 79 20 54 45 58 54 20  LE t4(x, y TEXT 
3870: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b  COLLATE NOCASE);
3880: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
3890: 58 20 69 34 20 4f 4e 20 74 34 28 79 29 3b 0a 20  X i4 ON t4(y);. 
38a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
38b0: 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 32 20 7b  analyze3-3.8.2 {
38c0: 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65  .  set S [sqlite
38d0: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
38e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
38f0: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78 20 21  ROM t4 WHERE x !
3900: 3d 20 3f 20 41 4e 44 20 79 20 4c 49 4b 45 20 3f  = ? AND y LIKE ?
3910: 0a 20 20 7d 20 2d 31 20 64 75 6d 6d 79 5d 0a 20  .  } -1 dummy]. 
3920: 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
3930: 20 24 53 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73   $S.} {0}.do_tes
3940: 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 33  t analyze3-3.8.3
3950: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   {.  sqlite3_bin
3960: 64 5f 74 65 78 74 20 24 53 20 31 20 22 61 62 63  d_text $S 1 "abc
3970: 22 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  " 3.  sqlite3_ex
3980: 70 69 72 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 64  pired $S.} {0}.d
3990: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
39a0: 33 2e 38 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  3.8.4 {.  sqlite
39b0: 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32  3_bind_text $S 2
39c0: 20 22 64 65 66 22 20 33 0a 20 20 73 71 6c 69 74   "def" 3.  sqlit
39d0: 65 33 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20  e3_expired $S.} 
39e0: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  {1}.do_test anal
39f0: 79 7a 65 33 2d 33 2e 38 2e 37 20 7b 0a 20 20 73  yze3-3.8.7 {.  s
3a00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
3a10: 20 24 53 20 32 20 22 67 68 69 25 22 20 34 0a 20   $S 2 "ghi%" 4. 
3a20: 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
3a30: 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73   $S.} {1}.do_tes
3a40: 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 38  t analyze3-3.8.8
3a50: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   {.  sqlite3_exp
3a60: 69 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f  ired $S.} {1}.do
3a70: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33  _test analyze3-3
3a80: 2e 38 2e 39 20 7b 0a 20 20 73 71 6c 69 74 65 33  .8.9 {.  sqlite3
3a90: 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32 20  _bind_text $S 2 
3aa0: 22 67 68 69 25 64 65 66 22 20 37 0a 20 20 73 71  "ghi%def" 7.  sq
3ab0: 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53  lite3_expired $S
3ac0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61  .} {1}.do_test a
3ad0: 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 31 30 20 7b  nalyze3-3.8.10 {
3ae0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  .  sqlite3_expir
3af0: 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ed $S.} {1}.do_t
3b00: 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e 38  est analyze3-3.8
3b10: 2e 31 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  .11 {.  sqlite3_
3b20: 62 69 6e 64 5f 74 65 78 74 20 24 53 20 32 20 22  bind_text $S 2 "
3b30: 25 61 62 22 20 33 0a 20 20 73 71 6c 69 74 65 33  %ab" 3.  sqlite3
3b40: 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31  _expired $S.} {1
3b50: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
3b60: 65 33 2d 33 2e 38 2e 31 32 20 7b 0a 20 20 73 71  e3-3.8.12 {.  sq
3b70: 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 24 53  lite3_expired $S
3b80: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 61  .} {1}.do_test a
3b90: 6e 61 6c 79 7a 65 33 2d 33 2e 38 2e 31 32 20 7b  nalyze3-3.8.12 {
3ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
3bb0: 74 65 78 74 20 24 53 20 32 20 22 25 64 65 22 20  text $S 2 "%de" 
3bc0: 33 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  3.  sqlite3_expi
3bd0: 72 65 64 20 24 53 0a 7d 20 7b 31 7d 0a 64 6f 5f  red $S.} {1}.do_
3be0: 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 33 2e  test analyze3-3.
3bf0: 38 2e 31 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  8.13 {.  sqlite3
3c00: 5f 65 78 70 69 72 65 64 20 24 53 0a 7d 20 7b 31  _expired $S.} {1
3c10: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
3c20: 65 33 2d 33 2e 38 2e 31 34 20 7b 0a 20 20 73 71  e3-3.8.14 {.  sq
3c30: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
3c40: 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  S.} {SQLITE_OK}.
3c50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
3ca0: 65 73 65 20 74 65 73 74 73 20 63 68 65 63 6b 20  ese tests check 
3cb0: 74 68 61 74 20 65 72 72 6f 72 73 20 65 6e 63 6f  that errors enco
3cc0: 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 72 65  untered while re
3cd0: 70 72 65 70 61 72 69 6e 67 20 61 6e 20 53 51 4c  preparing an SQL
3ce0: 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  .# statement wit
3cf0: 68 69 6e 20 73 71 6c 69 74 65 33 52 65 70 72 65  hin sqlite3Repre
3d00: 70 61 72 65 28 29 20 61 72 65 20 68 61 6e 64 6c  pare() are handl
3d10: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a  ed correctly..#.
3d20: 0a 23 20 43 68 65 63 6b 20 61 20 73 63 68 65 6d  .# Check a schem
3d30: 61 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65  a error..#.do_te
3d40: 73 74 20 61 6e 61 6c 79 7a 65 33 2d 34 2e 31 2e  st analyze3-4.1.
3d50: 31 20 7b 0a 20 20 73 65 74 20 53 20 5b 73 71 6c  1 {.  set S [sql
3d60: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
3d70: 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  db "SELECT * FRO
3d80: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
3d90: 4e 44 20 62 3e 3f 22 20 2d 31 20 64 75 6d 6d 79  ND b>?" -1 dummy
3da0: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ].  sqlite3_step
3db0: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f   $S.} {SQLITE_DO
3dc0: 4e 45 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  NE}.do_test anal
3dd0: 79 7a 65 33 2d 34 2e 31 2e 32 20 7b 0a 20 20 73  yze3-4.1.2 {.  s
3de0: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53 0a  qlite3_reset $S.
3df0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
3e00: 65 78 74 20 24 53 20 32 20 22 61 62 63 22 20 33  ext $S 2 "abc" 3
3e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f  .  execsql { DRO
3e20: 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 20 20 73  P TABLE t1 }.  s
3e30: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 0a 7d  qlite3_step $S.}
3e40: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
3e50: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
3e60: 2d 34 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74  -4.1.3 {.  sqlit
3e70: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a 7d  e3_finalize $S.}
3e80: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
3e90: 0a 23 20 43 68 65 63 6b 20 61 6e 20 61 75 74 68  .# Check an auth
3ea0: 6f 72 69 7a 61 74 69 6f 6e 20 65 72 72 6f 72 2e  orization error.
3eb0: 0a 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79  .#.do_test analy
3ec0: 7a 65 33 2d 34 2e 32 2e 31 20 7b 0a 20 20 65 78  ze3-4.2.1 {.  ex
3ed0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
3ee0: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
3ef0: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b  BLE t1(a, b, c);
3f00: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
3f10: 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i1 ON t1(b);. 
3f20: 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   }.  for {set i 
3f30: 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69  0} {$i < 100} {i
3f40: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
3f50: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3f60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
3f70: 20 24 69 2c 20 24 69 29 20 7d 0a 20 20 7d 0a 20   $i, $i) }.  }. 
3f80: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
3f90: 20 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a    execsql ANALYZ
3fa0: 45 0a 20 20 73 65 74 20 53 20 5b 73 71 6c 69 74  E.  set S [sqlit
3fb0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62  e3_prepare_v2 db
3fc0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
3fd0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
3fe0: 20 62 3e 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a   b>?" -1 dummy].
3ff0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
4000: 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45  S.} {SQLITE_DONE
4010: 7d 0a 64 62 20 61 75 74 68 20 61 75 74 68 0a 70  }.db auth auth.p
4020: 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d 20  roc auth {args} 
4030: 7b 0a 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20  {.  if {[lindex 
4040: 24 61 72 67 73 20 30 5d 20 3d 3d 20 22 53 51 4c  $args 0] == "SQL
4050: 49 54 45 5f 52 45 41 44 22 7d 20 7b 72 65 74 75  ITE_READ"} {retu
4060: 72 6e 20 53 51 4c 49 54 45 5f 44 45 4e 59 7d 0a  rn SQLITE_DENY}.
4070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4080: 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61  OK.}.do_test ana
4090: 6c 79 7a 65 33 2d 34 2e 32 2e 32 20 7b 0a 20 20  lyze3-4.2.2 {.  
40a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53  sqlite3_reset $S
40b0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
40c0: 74 65 78 74 20 24 53 20 32 20 22 61 62 63 22 20  text $S 2 "abc" 
40d0: 33 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  3.  sqlite3_step
40e0: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 41 55   $S.} {SQLITE_AU
40f0: 54 48 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  TH}.do_test anal
4100: 79 7a 65 33 2d 34 2e 32 2e 34 20 7b 0a 20 20 73  yze3-4.2.4 {.  s
4110: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
4120: 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 41 55 54  $S.} {SQLITE_AUT
4130: 48 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20  H}..# Check the 
4140: 65 66 66 65 63 74 20 6f 66 20 61 6e 20 61 75 74  effect of an aut
4150: 68 6f 72 69 7a 61 74 69 6f 6e 20 65 72 72 6f 72  horization error
4160: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
4170: 61 20 72 65 2d 70 72 65 70 61 72 65 0a 23 20 70  a re-prepare.# p
4180: 65 72 66 6f 72 6d 65 64 20 62 79 20 73 71 6c 69  erformed by sqli
4190: 74 65 33 5f 73 74 65 70 28 29 20 69 73 20 74 68  te3_step() is th
41a0: 65 20 73 61 6d 65 20 61 73 20 6f 6e 65 20 74 68  e same as one th
41b0: 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  at occurs within
41c0: 0a 23 20 73 71 6c 69 74 65 33 52 65 70 72 65 70  .# sqlite3Reprep
41d0: 61 72 65 28 29 2e 0a 23 0a 64 6f 5f 74 65 73 74  are()..#.do_test
41e0: 20 61 6e 61 6c 79 7a 65 33 2d 34 2e 33 2e 31 20   analyze3-4.3.1 
41f0: 7b 0a 20 20 64 62 20 61 75 74 68 20 7b 7d 0a 20  {.  db auth {}. 
4200: 20 73 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f   set S [sqlite3_
4210: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 22 53  prepare_v2 db "S
4220: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4230: 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3e  WHERE a=? AND b>
4240: 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 65  ?" -1 dummy].  e
4250: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
4260: 54 41 42 4c 45 20 74 32 28 64 2c 20 65 2c 20 66  TABLE t2(d, e, f
4270: 29 20 7d 0a 20 20 64 62 20 61 75 74 68 20 61 75  ) }.  db auth au
4280: 74 68 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  th.  sqlite3_ste
4290: 70 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 41  p $S.} {SQLITE_A
42a0: 55 54 48 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61  UTH}.do_test ana
42b0: 6c 79 7a 65 33 2d 34 2e 33 2e 32 20 7b 0a 20 20  lyze3-4.3.2 {.  
42c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
42d0: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 41 55   $S.} {SQLITE_AU
42e0: 54 48 7d 0a 64 62 20 61 75 74 68 20 7b 7d 0a 0a  TH}.db auth {}..
42f0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
4340: 74 20 74 68 61 74 20 6d 6f 64 69 66 79 69 6e 67  t that modifying
4350: 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
4360: 20 75 73 69 6e 67 20 74 68 65 20 63 6c 65 61 72   using the clear
4370: 5f 62 69 6e 64 69 6e 67 73 28 29 20 6f 72 0a 23  _bindings() or.#
4380: 20 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e   transfer_bindin
4390: 67 73 28 29 20 41 50 49 73 20 77 6f 72 6b 73 2e  gs() APIs works.
43a0: 0a 23 0a 23 20 20 20 61 6e 61 6c 79 7a 65 33 2d  .#.#   analyze3-
43b0: 35 2e 31 2e 2a 3a 20 73 71 6c 69 74 65 33 5f 63  5.1.*: sqlite3_c
43c0: 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 29 0a  lear_bindings().
43d0: 23 20 20 20 61 6e 61 6c 79 7a 65 33 2d 35 2e 32  #   analyze3-5.2
43e0: 2e 2a 3a 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  .*: sqlite3_tran
43f0: 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 29 0a  sfer_bindings().
4400: 23 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  #.do_test analyz
4410: 65 33 2d 35 2e 31 2e 31 20 7b 0a 20 20 64 72 6f  e3-5.1.1 {.  dro
4420: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
4430: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4440: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 54  ATE TABLE t1(x T
4450: 45 58 54 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41  EXT COLLATE NOCA
4460: 53 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  SE);.    CREATE 
4470: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
4480: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4490: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 61  TO t1 VALUES('aa
44a0: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
44b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
44c0: 61 62 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  abb');.    INSER
44d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
44e0: 28 27 61 63 63 27 29 3b 0a 20 20 20 20 49 4e 53  ('acc');.    INS
44f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4500: 45 53 28 27 62 61 61 27 29 3b 0a 20 20 20 20 49  ES('baa');.    I
4510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4520: 4c 55 45 53 28 27 62 62 62 27 29 3b 0a 20 20 20  LUES('bbb');.   
4530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4540: 56 41 4c 55 45 53 28 27 62 63 63 27 29 3b 0a 20  VALUES('bcc');. 
4550: 20 7d 0a 0a 20 20 73 65 74 20 53 20 5b 73 71 6c   }..  set S [sql
4560: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
4570: 64 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  db "SELECT * FRO
4580: 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b  M t1 WHERE x LIK
4590: 45 20 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20  E ?" -1 dummy]. 
45a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
45b0: 78 74 20 24 53 20 31 20 22 61 25 22 20 32 0a 20  xt $S 1 "a%" 2. 
45c0: 20 73 65 74 20 52 20 5b 6c 69 73 74 5d 0a 20 20   set R [list].  
45d0: 77 68 69 6c 65 20 7b 20 22 53 51 4c 49 54 45 5f  while { "SQLITE_
45e0: 52 4f 57 22 20 3d 3d 20 5b 73 71 6c 69 74 65 33  ROW" == [sqlite3
45f0: 5f 73 74 65 70 20 24 53 5d 20 7d 20 7b 0a 20 20  _step $S] } {.  
4600: 20 20 6c 61 70 70 65 6e 64 20 52 20 5b 73 71 6c    lappend R [sql
4610: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
4620: 20 24 53 20 30 5d 0a 20 20 7d 0a 20 20 63 6f 6e   $S 0].  }.  con
4630: 63 61 74 20 5b 73 71 6c 69 74 65 33 5f 72 65 73  cat [sqlite3_res
4640: 65 74 20 24 53 5d 20 24 52 0a 7d 20 7b 53 51 4c  et $S] $R.} {SQL
4650: 49 54 45 5f 4f 4b 20 61 61 61 20 61 62 62 20 61  ITE_OK aaa abb a
4660: 63 63 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c  cc}.do_test anal
4670: 79 7a 65 33 2d 35 2e 31 2e 32 20 7b 0a 20 20 73  yze3-5.1.2 {.  s
4680: 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
4690: 64 69 6e 67 73 20 24 53 0a 20 20 73 65 74 20 52  dings $S.  set R
46a0: 20 5b 6c 69 73 74 5d 0a 20 20 77 68 69 6c 65 20   [list].  while 
46b0: 7b 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d  { "SQLITE_ROW" =
46c0: 3d 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20  = [sqlite3_step 
46d0: 24 53 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70  $S] } {.    lapp
46e0: 65 6e 64 20 52 20 5b 73 71 6c 69 74 65 33 5f 63  end R [sqlite3_c
46f0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53 20 30 5d  olumn_text $S 0]
4700: 0a 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 73  .  }.  concat [s
4710: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53 5d  qlite3_reset $S]
4720: 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $R.} {SQLITE_OK
4730: 7d 0a 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a  }.do_test analyz
4740: 65 33 2d 35 2e 31 2e 33 20 7b 0a 20 20 73 71 6c  e3-5.1.3 {.  sql
4750: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53  ite3_finalize $S
4760: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a  .} {SQLITE_OK}..
4770: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
4780: 2d 35 2e 31 2e 31 20 7b 0a 20 20 73 65 74 20 53  -5.1.1 {.  set S
4790: 31 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  1 [sqlite3_prepa
47a0: 72 65 5f 76 32 20 64 62 20 22 53 45 4c 45 43 54  re_v2 db "SELECT
47b0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
47c0: 20 78 20 4c 49 4b 45 20 3f 22 20 2d 31 20 64 75   x LIKE ?" -1 du
47d0: 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62  mmy].  sqlite3_b
47e0: 69 6e 64 5f 74 65 78 74 20 24 53 31 20 31 20 22  ind_text $S1 1 "
47f0: 62 25 22 20 32 0a 20 20 73 65 74 20 52 20 5b 6c  b%" 2.  set R [l
4800: 69 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b 20 22  ist].  while { "
4810: 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d 3d 20 5b  SQLITE_ROW" == [
4820: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 31  sqlite3_step $S1
4830: 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  ] } {.    lappen
4840: 64 20 52 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  d R [sqlite3_col
4850: 75 6d 6e 5f 74 65 78 74 20 24 53 31 20 30 5d 0a  umn_text $S1 0].
4860: 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 73 71    }.  concat [sq
4870: 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53 31 5d  lite3_reset $S1]
4880: 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $R.} {SQLITE_OK
4890: 20 62 61 61 20 62 62 62 20 62 63 63 7d 0a 0a 64   baa bbb bcc}..d
48a0: 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d  o_test analyze3-
48b0: 35 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20 53 32  5.1.2 {.  set S2
48c0: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
48d0: 65 5f 76 32 20 64 62 20 22 53 45 4c 45 43 54 20  e_v2 db "SELECT 
48e0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
48f0: 78 20 3d 20 3f 22 20 2d 31 20 64 75 6d 6d 79 5d  x = ?" -1 dummy]
4900: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
4910: 74 65 78 74 20 24 53 32 20 31 20 22 61 25 22 20  text $S2 1 "a%" 
4920: 32 0a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  2.  sqlite3_tran
4930: 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 24 53  sfer_bindings $S
4940: 32 20 24 53 31 0a 20 20 73 65 74 20 52 20 5b 6c  2 $S1.  set R [l
4950: 69 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b 20 22  ist].  while { "
4960: 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d 3d 20 5b  SQLITE_ROW" == [
4970: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 31  sqlite3_step $S1
4980: 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  ] } {.    lappen
4990: 64 20 52 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  d R [sqlite3_col
49a0: 75 6d 6e 5f 74 65 78 74 20 24 53 31 20 30 5d 0a  umn_text $S1 0].
49b0: 20 20 7d 0a 20 20 63 6f 6e 63 61 74 20 5b 73 71    }.  concat [sq
49c0: 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53 31 5d  lite3_reset $S1]
49d0: 20 24 52 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $R.} {SQLITE_OK
49e0: 20 61 61 61 20 61 62 62 20 61 63 63 7d 0a 64 6f   aaa abb acc}.do
49f0: 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33 2d 35  _test analyze3-5
4a00: 2e 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .1.3 {.  sqlite3
4a10: 5f 66 69 6e 61 6c 69 7a 65 20 24 53 32 0a 20 20  _finalize $S2.  
4a20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4a30: 20 24 53 31 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f   $S1.} {SQLITE_O
4a40: 4b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  K}..#-----------
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 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a  --------------..
4a90: 64 6f 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65 33  do_test analyze3
4aa0: 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.1 {.  execsql
4ab0: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46   { DROP TABLE IF
4ac0: 20 45 58 49 53 54 53 20 74 31 20 7d 0a 20 20 65   EXISTS t1 }.  e
4ad0: 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 65  xecsql BEGIN.  e
4ae0: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
4af0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
4b00: 29 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  ) }.  for {set i
4b10: 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20   0} {$i < 1000} 
4b20: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
4b30: 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49  xecsql "INSERT I
4b40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 5b 65  NTO t1 VALUES([e
4b50: 78 70 72 20 24 69 2f 31 30 30 5d 2c 20 27 78 27  xpr $i/100], 'x'
4b60: 2c 20 5b 65 78 70 72 20 24 69 2f 31 30 5d 29 22  , [expr $i/10])"
4b70: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
4b80: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
4b90: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29  X i1 ON t1(a, b)
4ba0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
4bb0: 45 58 20 69 32 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i2 ON t1(c);.
4bc0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f    }.  execsql CO
4bd0: 4d 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20 41  MMIT.  execsql A
4be0: 4e 41 4c 59 5a 45 0a 7d 20 7b 7d 0a 0a 64 6f 5f  NALYZE.} {}..do_
4bf0: 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  eqp_test analyze
4c00: 33 2d 36 2d 33 20 7b 0a 20 20 53 45 4c 45 43 54  3-6-3 {.  SELECT
4c10: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
4c20: 20 61 20 3d 20 35 20 41 4e 44 20 63 20 3d 20 31   a = 5 AND c = 1
4c30: 33 3b 0a 7d 20 7b 53 45 41 52 43 48 20 54 41 42  3;.} {SEARCH TAB
4c40: 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45  LE t1 USING INDE
4c50: 58 20 69 32 20 28 63 3d 3f 29 7d 0a 0a 64 6f 5f  X i2 (c=?)}..do_
4c60: 65 71 70 5f 74 65 73 74 20 61 6e 61 6c 79 7a 65  eqp_test analyze
4c70: 33 2d 36 2d 32 20 7b 0a 20 20 53 45 4c 45 43 54  3-6-2 {.  SELECT
4c80: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
4c90: 20 61 20 3d 20 35 20 41 4e 44 20 62 20 3e 20 27   a = 5 AND b > '
4ca0: 77 27 20 41 4e 44 20 63 20 3d 20 31 33 3b 0a 7d  w' AND c = 13;.}
4cb0: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
4cc0: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32  1 USING INDEX i2
4cd0: 20 28 63 3d 3f 29 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   (c=?)}..#------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 32 30 31 35 2d 30  -------.# 2015-0
4d30: 34 2d 32 30 2e 0a 23 20 4d 65 6d 6f 72 79 20 6c  4-20..# Memory l
4d40: 65 61 6b 20 69 6e 20 73 71 6c 69 74 65 33 53 74  eak in sqlite3St
4d50: 61 74 34 50 72 6f 62 65 46 72 65 65 28 29 2e 20  at4ProbeFree(). 
4d60: 20 28 44 69 73 63 6f 76 65 72 65 64 20 77 68 69   (Discovered whi
4d70: 6c 65 20 66 75 7a 7a 69 6e 67 2e 29 0a 23 0a 64  le fuzzing.).#.d
4d80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 61  o_execsql_test a
4d90: 6e 61 6c 79 7a 65 2d 37 2e 31 20 7b 0a 20 20 44  nalyze-7.1 {.  D
4da0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
4db0: 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45  STS t1;.  CREATE
4dc0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
4dd0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4de0: 20 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54   b, c);.  INSERT
4df0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4e00: 31 2c 31 2c 27 30 30 30 30 27 29 3b 0a 20 20 43  1,1,'0000');.  C
4e10: 52 45 41 54 45 20 49 4e 44 45 58 20 74 30 62 20  REATE INDEX t0b 
4e20: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 41 4e 41 4c  ON t1(b);.  ANAL
4e30: 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20 63 20  YZE;.  SELECT c 
4e40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d  FROM t1 WHERE b=
4e50: 33 20 41 4e 44 20 61 20 42 45 54 57 45 45 4e 20  3 AND a BETWEEN 
4e60: 33 30 20 41 4e 44 20 68 65 78 28 31 29 3b 0a 7d  30 AND hex(1);.}
4e70: 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70 6f   {}..# At one po
4e80: 69 6e 74 20 64 75 70 6c 69 63 61 74 65 20 73 74  int duplicate st
4e90: 61 74 31 20 65 6e 74 72 69 65 73 20 77 65 72 65  at1 entries were
4ea0: 20 63 61 75 73 69 6e 67 20 61 20 6d 65 6d 6f 72   causing a memor
4eb0: 79 20 6c 65 61 6b 2e 0a 23 0a 72 65 73 65 74 5f  y leak..#.reset_
4ec0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
4ed0: 73 74 20 37 2e 32 20 7b 0a 20 20 43 52 45 41 54  st 7.2 {.  CREAT
4ee0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
4ef0: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
4f00: 58 20 74 31 61 20 4f 4e 20 74 31 28 61 29 3b 0a  X t1a ON t1(a);.
4f10: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 53 45 4c    ANALYZE;.  SEL
4f20: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
4f30: 65 5f 73 74 61 74 31 3b 0a 20 20 49 4e 53 45 52  e_stat1;.  INSER
4f40: 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74  T INTO sqlite_st
4f50: 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61 74  at1(tbl,idx,stat
4f60: 29 20 56 41 4c 55 45 53 28 27 74 31 27 2c 27 74  ) VALUES('t1','t
4f70: 31 61 27 2c 27 31 32 30 30 30 27 29 3b 0a 20 20  1a','12000');.  
4f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
4f90: 74 65 5f 73 74 61 74 31 28 74 62 6c 2c 69 64 78  te_stat1(tbl,idx
4fa0: 2c 73 74 61 74 29 20 56 41 4c 55 45 53 28 27 74  ,stat) VALUES('t
4fb0: 31 27 2c 27 74 31 61 27 2c 27 31 32 30 30 30 27  1','t1a','12000'
4fc0: 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c  );.  ANALYZE sql
4fd0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 7d 0a 0a 66  ite_master;.}..f
4fe0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.