/ Hex Artifact Content
Login

Artifact 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34:


0000: 23 20 32 30 31 34 2d 30 34 2d 32 36 0a 23 0a 23  # 2014-04-26.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 0a 0a 73 65 74 20 74 65 73 74 64  **.# ..set testd
0170: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0180: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0190: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
01a0: 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66  tcl.set testpref
01b0: 69 78 20 63 6f 73 74 0a 0a 0a 64 6f 5f 65 78 65  ix cost...do_exe
01c0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 20 7b 0a  csql_test 1.1 {.
01d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
01e0: 33 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  3(id INTEGER PRI
01f0: 4d 41 52 59 20 4b 45 59 2c 20 62 20 4e 4f 54 20  MARY KEY, b NOT 
0200: 4e 55 4c 4c 29 3b 0a 20 20 43 52 45 41 54 45 20  NULL);.  CREATE 
0210: 54 41 42 4c 45 20 74 34 28 63 2c 20 64 2c 20 65  TABLE t4(c, d, e
0220: 29 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51  );.  CREATE UNIQ
0230: 55 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  UE INDEX i3 ON t
0240: 33 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20 55  3(b);.  CREATE U
0250: 4e 49 51 55 45 20 49 4e 44 45 58 20 69 34 20 4f  NIQUE INDEX i4 O
0260: 4e 20 74 34 28 63 2c 20 64 29 3b 0a 7d 0a 64 6f  N t4(c, d);.}.do
0270: 5f 65 71 70 5f 74 65 73 74 20 31 2e 32 20 7b 0a  _eqp_test 1.2 {.
0280: 20 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20    SELECT e FROM 
0290: 74 33 2c 20 74 34 20 57 48 45 52 45 20 62 3d 63  t3, t4 WHERE b=c
02a0: 20 4f 52 44 45 52 20 42 59 20 62 2c 20 64 3b 0a   ORDER BY b, d;.
02b0: 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e  } {.  QUERY PLAN
02c0: 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45  .  |--SCAN TABLE
02d0: 20 74 33 20 55 53 49 4e 47 20 43 4f 56 45 52 49   t3 USING COVERI
02e0: 4e 47 20 49 4e 44 45 58 20 69 33 0a 20 20 60 2d  NG INDEX i3.  `-
02f0: 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 34  -SEARCH TABLE t4
0300: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 34 20   USING INDEX i4 
0310: 28 63 3d 3f 29 0a 7d 0a 0a 0a 64 6f 5f 65 78 65  (c=?).}...do_exe
0320: 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b 0a  csql_test 2.1 {.
0330: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0340: 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  1(a, b);.  CREAT
0350: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
0360: 28 61 29 3b 0a 7d 0a 0a 23 20 49 74 20 69 73 20  (a);.}..# It is 
0370: 62 65 74 74 65 72 20 74 6f 20 75 73 65 20 61 6e  better to use an
0380: 20 69 6e 64 65 78 20 66 6f 72 20 4f 52 44 45 52   index for ORDER
0390: 20 42 59 20 74 68 61 6e 20 73 6f 72 74 20 65 78   BY than sort ex
03a0: 74 65 72 6e 61 6c 6c 79 2c 20 65 76 65 6e 20 0a  ternally, even .
03b0: 23 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  # if the index i
03c0: 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
03d0: 20 69 6e 64 65 78 2e 0a 64 6f 5f 65 71 70 5f 74   index..do_eqp_t
03e0: 65 73 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45  est 2.2 {.  SELE
03f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT * FROM t1 ORD
0400: 45 52 20 42 59 20 61 3b 0a 7d 20 7b 53 43 41 4e  ER BY a;.} {SCAN
0410: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
0420: 49 4e 44 45 58 20 69 31 7d 0a 0a 64 6f 5f 65 78  INDEX i1}..do_ex
0430: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b  ecsql_test 3.1 {
0440: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0450: 74 35 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t5(a INTEGER PRI
0460: 4d 41 52 59 20 4b 45 59 2c 62 2c 63 2c 64 2c 65  MARY KEY,b,c,d,e
0470: 2c 66 2c 67 29 3b 0a 20 20 43 52 45 41 54 45 20  ,f,g);.  CREATE 
0480: 49 4e 44 45 58 20 74 35 62 20 4f 4e 20 74 35 28  INDEX t5b ON t5(
0490: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  b);.  CREATE IND
04a0: 45 58 20 74 35 63 20 4f 4e 20 74 35 28 63 29 3b  EX t5c ON t5(c);
04b0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
04c0: 74 35 64 20 4f 4e 20 74 35 28 64 29 3b 0a 20 20  t5d ON t5(d);.  
04d0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 35 65  CREATE INDEX t5e
04e0: 20 4f 4e 20 74 35 28 65 29 3b 0a 20 20 43 52 45   ON t5(e);.  CRE
04f0: 41 54 45 20 49 4e 44 45 58 20 74 35 66 20 4f 4e  ATE INDEX t5f ON
0500: 20 74 35 28 66 29 3b 0a 20 20 43 52 45 41 54 45   t5(f);.  CREATE
0510: 20 49 4e 44 45 58 20 74 35 67 20 4f 4e 20 74 35   INDEX t5g ON t5
0520: 28 67 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74  (g);.}..do_eqp_t
0530: 65 73 74 20 33 2e 32 20 7b 0a 20 20 53 45 4c 45  est 3.2 {.  SELE
0540: 43 54 20 61 20 46 52 4f 4d 20 74 35 20 0a 20 20  CT a FROM t5 .  
0550: 57 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 20  WHERE b IS NULL 
0560: 4f 52 20 63 20 49 53 20 4e 55 4c 4c 20 4f 52 20  OR c IS NULL OR 
0570: 64 20 49 53 20 4e 55 4c 4c 20 0a 20 20 4f 52 44  d IS NULL .  ORD
0580: 45 52 20 42 59 20 61 3b 0a 7d 20 7b 0a 20 20 51  ER BY a;.} {.  Q
0590: 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 4d  UERY PLAN.  |--M
05a0: 55 4c 54 49 2d 49 4e 44 45 58 20 4f 52 0a 20 20  ULTI-INDEX OR.  
05b0: 7c 20 20 7c 2d 2d 49 4e 44 45 58 20 31 0a 20 20  |  |--INDEX 1.  
05c0: 7c 20 20 7c 20 20 60 2d 2d 53 45 41 52 43 48 20  |  |  `--SEARCH 
05d0: 54 41 42 4c 45 20 74 35 20 55 53 49 4e 47 20 49  TABLE t5 USING I
05e0: 4e 44 45 58 20 74 35 62 20 28 62 3d 3f 29 0a 20  NDEX t5b (b=?). 
05f0: 20 7c 20 20 7c 2d 2d 49 4e 44 45 58 20 32 0a 20   |  |--INDEX 2. 
0600: 20 7c 20 20 7c 20 20 60 2d 2d 53 45 41 52 43 48   |  |  `--SEARCH
0610: 20 54 41 42 4c 45 20 74 35 20 55 53 49 4e 47 20   TABLE t5 USING 
0620: 49 4e 44 45 58 20 74 35 63 20 28 63 3d 3f 29 0a  INDEX t5c (c=?).
0630: 20 20 7c 20 20 60 2d 2d 49 4e 44 45 58 20 33 0a    |  `--INDEX 3.
0640: 20 20 7c 20 20 20 20 20 60 2d 2d 53 45 41 52 43    |     `--SEARC
0650: 48 20 54 41 42 4c 45 20 74 35 20 55 53 49 4e 47  H TABLE t5 USING
0660: 20 49 4e 44 45 58 20 74 35 64 20 28 64 3d 3f 29   INDEX t5d (d=?)
0670: 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42  .  `--USE TEMP B
0680: 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20  -TREE FOR ORDER 
0690: 42 59 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  BY.}..#---------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 0a 23 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .# If there is n
06f0: 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6f  o likelihood() o
0700: 72 20 73 74 61 74 33 20 64 61 74 61 2c 20 53 51  r stat3 data, SQ
0710: 4c 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61  Lite assumes tha
0720: 74 20 61 20 63 6c 6f 73 65 64 0a 23 20 72 61 6e  t a closed.# ran
0730: 67 65 20 73 63 61 6e 20 28 65 2e 67 2e 20 6f 6e  ge scan (e.g. on
0740: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  e constrained by
0750: 20 22 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20   "col BETWEEN ? 
0760: 41 4e 44 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e  AND ?" constrain
0770: 74 29 0a 23 20 76 69 73 69 74 73 20 31 2f 36 34  t).# visits 1/64
0780: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20   of the rows in 
0790: 61 20 74 61 62 6c 65 2e 0a 23 0a 23 20 4e 6f 74  a table..#.# Not
07a0: 65 3a 20 31 2f 36 33 20 3d 7e 20 30 2e 30 31 36  e: 1/63 =~ 0.016
07b0: 0a 23 20 4e 6f 74 65 3a 20 31 2f 36 35 20 3d 7e  .# Note: 1/65 =~
07c0: 20 30 2e 30 31 35 0a 23 0a 72 65 73 65 74 5f 64   0.015.#.reset_d
07d0: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
07e0: 74 20 34 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 4.1 {.  CREATE
07f0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
0800: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0810: 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 43  i1 ON t1(a);.  C
0820: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
0830: 4e 20 74 31 28 62 29 3b 0a 7d 0a 64 6f 5f 65 71  N t1(b);.}.do_eq
0840: 70 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 53  p_test 4.2 {.  S
0850: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0860: 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
0870: 28 61 3d 3f 2c 20 30 2e 30 31 34 29 20 41 4e 44  (a=?, 0.014) AND
0880: 20 62 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   b BETWEEN ? AND
0890: 20 3f 3b 0a 7d 20 7b 53 45 41 52 43 48 20 54 41   ?;.} {SEARCH TA
08a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44  BLE t1 USING IND
08b0: 45 58 20 69 31 20 28 61 3d 3f 29 7d 0a 0a 64 6f  EX i1 (a=?)}..do
08c0: 5f 65 71 70 5f 74 65 73 74 20 34 2e 33 20 7b 0a  _eqp_test 4.3 {.
08d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
08e0: 74 31 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68  t1 WHERE likelih
08f0: 6f 6f 64 28 61 3d 3f 2c 20 30 2e 30 31 36 29 20  ood(a=?, 0.016) 
0900: 41 4e 44 20 62 20 42 45 54 57 45 45 4e 20 3f 20  AND b BETWEEN ? 
0910: 41 4e 44 20 3f 3b 0a 7d 20 7b 53 45 41 52 43 48  AND ?;.} {SEARCH
0920: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
0930: 49 4e 44 45 58 20 69 32 20 28 62 3e 3f 20 41 4e  INDEX i2 (b>? AN
0940: 44 20 62 3c 3f 29 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  D b<?)}...#-----
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ----.#.reset_db.
09a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
09b0: 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  5.1 {.  CREATE T
09c0: 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a 20  ABLE t2(x, y);. 
09d0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32   CREATE INDEX t2
09e0: 69 31 20 4f 4e 20 74 32 28 78 29 3b 0a 7d 0a 0a  i1 ON t2(x);.}..
09f0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 35 2e 32 20  do_eqp_test 5.2 
0a00: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
0a10: 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 78 2c  M t2 ORDER BY x,
0a20: 20 79 3b 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20   y;.} {.  QUERY 
0a30: 50 4c 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54  PLAN.  |--SCAN T
0a40: 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e  ABLE t2 USING IN
0a50: 44 45 58 20 74 32 69 31 0a 20 20 60 2d 2d 55 53  DEX t2i1.  `--US
0a60: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
0a70: 52 20 52 49 47 48 54 20 50 41 52 54 20 4f 46 20  R RIGHT PART OF 
0a80: 4f 52 44 45 52 20 42 59 0a 7d 0a 0a 64 6f 5f 65  ORDER BY.}..do_e
0a90: 71 70 5f 74 65 73 74 20 35 2e 33 20 7b 0a 20 20  qp_test 5.3 {.  
0aa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0ab0: 20 57 48 45 52 45 20 78 20 42 45 54 57 45 45 4e   WHERE x BETWEEN
0ac0: 20 3f 20 41 4e 44 20 3f 20 4f 52 44 45 52 20 42   ? AND ? ORDER B
0ad0: 59 20 72 6f 77 69 64 3b 0a 7d 20 7b 0a 20 20 51  Y rowid;.} {.  Q
0ae0: 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53  UERY PLAN.  |--S
0af0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20 55  EARCH TABLE t2 U
0b00: 53 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 20  SING INDEX t2i1 
0b10: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 0a 20 20  (x>? AND x<?).  
0b20: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
0b30: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a  EE FOR ORDER BY.
0b40: 7d 0a 0a 23 20 77 68 65 72 65 37 2e 74 65 73 74  }..# where7.test
0b50: 2c 20 77 68 65 72 65 38 2e 74 65 73 74 3a 0a 23  , where8.test:.#
0b60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0b70: 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20   6.1 {.  CREATE 
0b80: 54 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47  TABLE t3(a INTEG
0b90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
0ba0: 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20  b, c);.  CREATE 
0bb0: 49 4e 44 45 58 20 74 33 69 31 20 4f 4e 20 74 33  INDEX t3i1 ON t3
0bc0: 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  (b);.  CREATE IN
0bd0: 44 45 58 20 74 33 69 32 20 4f 4e 20 74 33 28 63  DEX t3i2 ON t3(c
0be0: 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  );.}..do_eqp_tes
0bf0: 74 20 36 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 6.2 {.  SELECT
0c00: 20 61 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   a FROM t3 WHERE
0c10: 20 28 62 20 42 45 54 57 45 45 4e 20 32 20 41 4e   (b BETWEEN 2 AN
0c20: 44 20 34 29 20 4f 52 20 63 3d 31 30 30 20 4f 52  D 4) OR c=100 OR
0c30: 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a 20 20 51  DER BY a.} {.  Q
0c40: 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 4d  UERY PLAN.  |--M
0c50: 55 4c 54 49 2d 49 4e 44 45 58 20 4f 52 0a 20 20  ULTI-INDEX OR.  
0c60: 7c 20 20 7c 2d 2d 49 4e 44 45 58 20 31 0a 20 20  |  |--INDEX 1.  
0c70: 7c 20 20 7c 20 20 60 2d 2d 53 45 41 52 43 48 20  |  |  `--SEARCH 
0c80: 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20 49  TABLE t3 USING I
0c90: 4e 44 45 58 20 74 33 69 31 20 28 62 3e 3f 20 41  NDEX t3i1 (b>? A
0ca0: 4e 44 20 62 3c 3f 29 0a 20 20 7c 20 20 60 2d 2d  ND b<?).  |  `--
0cb0: 49 4e 44 45 58 20 32 0a 20 20 7c 20 20 20 20 20  INDEX 2.  |     
0cc0: 60 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20  `--SEARCH TABLE 
0cd0: 74 33 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t3 USING INDEX t
0ce0: 33 69 32 20 28 63 3d 3f 29 0a 20 20 60 2d 2d 55  3i2 (c=?).  `--U
0cf0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
0d00: 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a 23  OR ORDER BY.}..#
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65  ---------.#.rese
0d60: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
0d70: 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43 52 45  test 7.1 {.  CRE
0d80: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
0d90: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0da0: 45 59 2c 62 2c 63 2c 64 2c 65 2c 66 2c 67 29 3b  EY,b,c,d,e,f,g);
0db0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0dc0: 74 31 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20  t1b ON t1(b);.  
0dd0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 63  CREATE INDEX t1c
0de0: 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 43 52 45   ON t1(c);.  CRE
0df0: 41 54 45 20 49 4e 44 45 58 20 74 31 64 20 4f 4e  ATE INDEX t1d ON
0e00: 20 74 31 28 64 29 3b 0a 20 20 43 52 45 41 54 45   t1(d);.  CREATE
0e10: 20 49 4e 44 45 58 20 74 31 65 20 4f 4e 20 74 31   INDEX t1e ON t1
0e20: 28 65 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  (e);.  CREATE IN
0e30: 44 45 58 20 74 31 66 20 4f 4e 20 74 31 28 66 29  DEX t1f ON t1(f)
0e40: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
0e50: 20 74 31 67 20 4f 4e 20 74 31 28 67 29 3b 0a 7d   t1g ON t1(g);.}
0e60: 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 37 2e  ..do_eqp_test 7.
0e70: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46  2 {.  SELECT a F
0e80: 52 4f 4d 20 74 31 0a 20 20 20 20 20 57 48 45 52  ROM t1.     WHER
0e90: 45 20 28 62 3e 3d 39 35 30 20 41 4e 44 20 62 3c  E (b>=950 AND b<
0ea0: 3d 31 30 31 30 29 20 4f 52 20 28 62 20 49 53 20  =1010) OR (b IS 
0eb0: 4e 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 4e  NULL AND c NOT N
0ec0: 55 4c 4c 29 0a 20 20 4f 52 44 45 52 20 42 59 20  ULL).  ORDER BY 
0ed0: 61 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  a.} {.  QUERY PL
0ee0: 41 4e 0a 20 20 7c 2d 2d 4d 55 4c 54 49 2d 49 4e  AN.  |--MULTI-IN
0ef0: 44 45 58 20 4f 52 0a 20 20 7c 20 20 7c 2d 2d 49  DEX OR.  |  |--I
0f00: 4e 44 45 58 20 31 0a 20 20 7c 20 20 7c 20 20 60  NDEX 1.  |  |  `
0f10: 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74  --SEARCH TABLE t
0f20: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31  1 USING INDEX t1
0f30: 62 20 28 62 3e 3f 20 41 4e 44 20 62 3c 3f 29 0a  b (b>? AND b<?).
0f40: 20 20 7c 20 20 60 2d 2d 49 4e 44 45 58 20 32 0a    |  `--INDEX 2.
0f50: 20 20 7c 20 20 20 20 20 60 2d 2d 53 45 41 52 43    |     `--SEARC
0f60: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
0f70: 20 49 4e 44 45 58 20 74 31 62 20 28 62 3d 3f 29   INDEX t1b (b=?)
0f80: 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42  .  `--USE TEMP B
0f90: 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20  -TREE FOR ORDER 
0fa0: 42 59 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  BY.}..do_eqp_tes
0fb0: 74 20 37 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  t 7.3 {.  SELECT
0fc0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 0a 20   rowid FROM t1. 
0fd0: 20 57 48 45 52 45 20 28 2b 62 20 49 53 20 4e 55   WHERE (+b IS NU
0fe0: 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 4e 55 4c  LL AND c NOT NUL
0ff0: 4c 20 41 4e 44 20 64 20 4e 4f 54 20 4e 55 4c 4c  L AND d NOT NULL
1000: 29 0a 20 20 20 20 20 20 20 20 4f 52 20 28 62 20  ).        OR (b 
1010: 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 63 20 49  NOT NULL AND c I
1020: 53 20 4e 55 4c 4c 20 41 4e 44 20 64 20 4e 4f 54  S NULL AND d NOT
1030: 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 4f   NULL).        O
1040: 52 20 28 62 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e  R (b NOT NULL AN
1050: 44 20 63 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  D c NOT NULL AND
1060: 20 64 20 49 53 20 4e 55 4c 4c 29 0a 7d 20 7b 53   d IS NULL).} {S
1070: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 0a 64  CAN TABLE t1}..d
1080: 6f 5f 65 71 70 5f 74 65 73 74 20 37 2e 34 20 7b  o_eqp_test 7.4 {
1090: 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20  .  SELECT rowid 
10a0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 2b  FROM t1 WHERE (+
10b0: 62 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 63 20  b IS NULL AND c 
10c0: 4e 4f 54 20 4e 55 4c 4c 29 20 4f 52 20 63 20 49  NOT NULL) OR c I
10d0: 53 20 4e 55 4c 4c 0a 7d 20 7b 53 43 41 4e 20 54  S NULL.} {SCAN T
10e0: 41 42 4c 45 20 74 31 7d 0a 0a 23 2d 2d 2d 2d 2d  ABLE t1}..#-----
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1130: 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ----.#.reset_db.
1140: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1150: 38 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  8.1 {.  CREATE T
1160: 41 42 4c 45 20 63 6f 6d 70 6f 73 65 72 28 0a 20  ABLE composer(. 
1170: 20 20 20 63 69 64 20 49 4e 54 45 47 45 52 20 50     cid INTEGER P
1180: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
1190: 63 6e 61 6d 65 20 54 45 58 54 0a 20 20 29 3b 0a  cname TEXT.  );.
11a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
11b0: 6c 62 75 6d 28 0a 20 20 20 20 61 69 64 20 49 4e  lbum(.    aid IN
11c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11d0: 59 2c 0a 20 20 20 20 61 6e 61 6d 65 20 54 45 58  Y,.    aname TEX
11e0: 54 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20  T.  );.  CREATE 
11f0: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
1200: 20 74 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   tid INTEGER PRI
1210: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 63 69  MARY KEY,.    ci
1220: 64 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  d INTEGER REFERE
1230: 4e 43 45 53 20 63 6f 6d 70 6f 73 65 72 2c 0a 20  NCES composer,. 
1240: 20 20 20 61 69 64 20 49 4e 54 45 47 45 52 20 52     aid INTEGER R
1250: 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75 6d 2c  EFERENCES album,
1260: 0a 20 20 20 20 74 69 74 6c 65 20 54 45 58 54 0a  .    title TEXT.
1270: 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e    );.  CREATE IN
1280: 44 45 58 20 74 72 61 63 6b 5f 69 31 20 4f 4e 20  DEX track_i1 ON 
1290: 74 72 61 63 6b 28 63 69 64 29 3b 0a 20 20 43 52  track(cid);.  CR
12a0: 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63 6b  EATE INDEX track
12b0: 5f 69 32 20 4f 4e 20 74 72 61 63 6b 28 61 69 64  _i2 ON track(aid
12c0: 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  );.}..do_eqp_tes
12d0: 74 20 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 8.2 {.  SELECT
12e0: 20 44 49 53 54 49 4e 43 54 20 61 6e 61 6d 65 0a   DISTINCT aname.
12f0: 20 20 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c 20      FROM album, 
1300: 63 6f 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b 0a  composer, track.
1310: 20 20 20 57 48 45 52 45 20 63 6e 61 6d 65 20 4c     WHERE cname L
1320: 49 4b 45 20 27 25 62 61 63 68 25 27 0a 20 20 20  IKE '%bach%'.   
1330: 20 20 41 4e 44 20 75 6e 6c 69 6b 65 6c 79 28 63    AND unlikely(c
1340: 6f 6d 70 6f 73 65 72 2e 63 69 64 3d 74 72 61 63  omposer.cid=trac
1350: 6b 2e 63 69 64 29 0a 20 20 20 20 20 41 4e 44 20  k.cid).     AND 
1360: 75 6e 6c 69 6b 65 6c 79 28 61 6c 62 75 6d 2e 61  unlikely(album.a
1370: 69 64 3d 74 72 61 63 6b 2e 61 69 64 29 3b 0a 7d  id=track.aid);.}
1380: 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a   {.  QUERY PLAN.
1390: 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20    |--SCAN TABLE 
13a0: 74 72 61 63 6b 0a 20 20 7c 2d 2d 53 45 41 52 43  track.  |--SEARC
13b0: 48 20 54 41 42 4c 45 20 61 6c 62 75 6d 20 55 53  H TABLE album US
13c0: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
13d0: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
13e0: 29 0a 20 20 7c 2d 2d 53 45 41 52 43 48 20 54 41  ).  |--SEARCH TA
13f0: 42 4c 45 20 63 6f 6d 70 6f 73 65 72 20 55 53 49  BLE composer USI
1400: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1410: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
1420: 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42  .  `--USE TEMP B
1430: 2d 54 52 45 45 20 46 4f 52 20 44 49 53 54 49 4e  -TREE FOR DISTIN
1440: 43 54 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  CT.}..#---------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
14a0: 73 74 20 39 2e 31 20 7b 0a 20 20 43 52 45 41 54  st 9.1 {.  CREAT
14b0: 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20  E TABLE t1(.    
14c0: 61 2c 62 2c 63 2c 64 2c 65 2c 20 66 2c 67 2c 68  a,b,c,d,e, f,g,h
14d0: 2c 69 2c 6a 2c 0a 20 20 20 20 6b 2c 6c 2c 6d 2c  ,i,j,.    k,l,m,
14e0: 6e 2c 6f 2c 20 70 2c 71 2c 72 2c 73 2c 74 0a 20  n,o, p,q,r,s,t. 
14f0: 20 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44   );.  CREATE IND
1500: 45 58 20 69 31 20 4f 4e 20 74 31 28 6b 2c 6c 2c  EX i1 ON t1(k,l,
1510: 6d 2c 6e 2c 6f 2c 70 2c 71 2c 72 2c 73 2c 74 29  m,n,o,p,q,r,s,t)
1520: 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 39 2e 32 20  ;.}.do_test 9.2 
1530: 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  {.  for {set i 0
1540: 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e  } {$i < 100} {in
1550: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
1560: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1570: 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56 41 4c  O t1 DEFAULT VAL
1580: 55 45 53 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63  UES }.  }.  exec
1590: 73 71 6c 20 7b 0a 20 20 20 20 41 4e 41 4c 59 5a  sql {.    ANALYZ
15a0: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  E;.    CREATE IN
15b0: 44 45 58 20 69 32 20 4f 4e 20 74 31 28 61 2c 62  DEX i2 ON t1(a,b
15c0: 2c 63 2c 64 2c 65 2c 66 2c 67 2c 68 2c 69 2c 6a  ,c,d,e,f,g,h,i,j
15d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 73 65 74  );.  }.} {}..set
15e0: 20 4c 20 5b 6c 69 73 74 20 61 3d 3f 20 62 3d 3f   L [list a=? b=?
15f0: 20 63 3d 3f 20 64 3d 3f 20 65 3d 3f 20 66 3d 3f   c=? d=? e=? f=?
1600: 20 67 3d 3f 20 68 3d 3f 20 69 3d 3f 20 6a 3d 3f   g=? h=? i=? j=?
1610: 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6e 54  ].foreach {tn nT
1620: 65 72 6d 20 6e 52 6f 77 7d 20 7b 0a 20 20 31 20  erm nRow} {.  1 
1630: 20 20 31 20 31 30 0a 20 20 32 20 20 20 32 20 20    1 10.  2   2  
1640: 39 0a 20 20 33 20 20 20 33 20 20 38 0a 20 20 34  9.  3   3  8.  4
1650: 20 20 20 34 20 20 37 0a 20 20 35 20 20 20 35 20     4  7.  5   5 
1660: 20 36 0a 20 20 36 20 20 20 36 20 20 35 0a 20 20   6.  6   6  5.  
1670: 37 20 20 20 37 20 20 35 0a 20 20 38 20 20 20 38  7   7  5.  8   8
1680: 20 20 35 0a 20 20 39 20 20 20 39 20 20 35 0a 20    5.  9   9  5. 
1690: 20 31 30 20 31 30 20 20 35 0a 7d 20 7b 0a 20 20   10 10  5.} {.  
16a0: 73 65 74 20 77 20 5b 6a 6f 69 6e 20 5b 6c 72 61  set w [join [lra
16b0: 6e 67 65 20 24 4c 20 30 20 5b 65 78 70 72 20 24  nge $L 0 [expr $
16c0: 6e 54 65 72 6d 2d 31 5d 5d 20 22 20 41 4e 44 20  nTerm-1]] " AND 
16d0: 22 5d 0a 20 20 73 65 74 20 70 31 20 5b 65 78 70  "].  set p1 [exp
16e0: 72 20 28 24 6e 52 6f 77 2d 31 29 20 2f 20 31 30  r ($nRow-1) / 10
16f0: 30 2e 30 5d 0a 20 20 73 65 74 20 70 32 20 5b 65  0.0].  set p2 [e
1700: 78 70 72 20 28 24 6e 52 6f 77 2b 31 29 20 2f 20  xpr ($nRow+1) / 
1710: 31 30 30 2e 30 5d 0a 0a 20 20 73 65 74 20 73 71  100.0]..  set sq
1720: 6c 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l1 "SELECT * FRO
1730: 4d 20 74 31 20 57 48 45 52 45 20 6c 69 6b 65 6c  M t1 WHERE likel
1740: 69 68 6f 6f 64 28 6b 3d 3f 2c 20 24 70 31 29 20  ihood(k=?, $p1) 
1750: 41 4e 44 20 24 77 22 0a 20 20 73 65 74 20 73 71  AND $w".  set sq
1760: 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 "SELECT * FRO
1770: 4d 20 74 31 20 57 48 45 52 45 20 6c 69 6b 65 6c  M t1 WHERE likel
1780: 69 68 6f 6f 64 28 6b 3d 3f 2c 20 24 70 32 29 20  ihood(k=?, $p2) 
1790: 41 4e 44 20 24 77 22 0a 0a 20 20 64 6f 5f 65 71  AND $w"..  do_eq
17a0: 70 5f 74 65 73 74 20 39 2e 33 2e 24 74 6e 2e 31  p_test 9.3.$tn.1
17b0: 20 24 73 71 6c 31 20 7b 2f 49 4e 44 45 58 20 69   $sql1 {/INDEX i
17c0: 31 2f 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73  1/}.  do_eqp_tes
17d0: 74 20 39 2e 33 2e 24 74 6e 2e 32 20 24 73 71 6c  t 9.3.$tn.2 $sql
17e0: 32 20 7b 2f 49 4e 44 45 58 20 69 32 2f 7d 0a 7d  2 {/INDEX i2/}.}
17f0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
1840: 0a 69 66 63 61 70 61 62 6c 65 20 73 74 61 74 34  .ifcapable stat4
1850: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
1860: 74 65 73 74 20 31 30 2e 31 20 7b 0a 20 20 20 20  test 10.1 {.    
1870: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
1880: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52  a, b, c);.    CR
1890: 45 41 54 45 20 49 4e 44 45 58 20 74 36 69 31 20  EATE INDEX t6i1 
18a0: 4f 4e 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  ON t6(a, b);.   
18b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 36   CREATE INDEX t6
18c0: 69 32 20 4f 4e 20 74 36 28 63 29 3b 0a 20 20 7d  i2 ON t6(c);.  }
18d0: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 31 30  .  .  do_test 10
18e0: 2e 32 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65  .2 {.    for {se
18f0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d  t i 0} {$i < 16}
1900: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
1910: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
1920: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
1930: 53 28 24 69 25 34 2c 20 27 78 79 7a 27 2c 20 24  S($i%4, 'xyz', $
1940: 69 25 38 29 20 7d 0a 20 20 20 20 7d 0a 20 20 20  i%8) }.    }.   
1950: 20 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45   execsql ANALYZE
1960: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 65 71  .  } {}..  do_eq
1970: 70 5f 74 65 73 74 20 31 30 2e 33 20 7b 0a 20 20  p_test 10.3 {.  
1980: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
1990: 52 4f 4d 20 74 36 20 57 48 45 52 45 20 61 3d 30  ROM t6 WHERE a=0
19a0: 20 41 4e 44 20 63 3d 30 0a 20 20 7d 20 7b 53 45   AND c=0.  } {SE
19b0: 41 52 43 48 20 54 41 42 4c 45 20 74 36 20 55 53  ARCH TABLE t6 US
19c0: 49 4e 47 20 49 4e 44 45 58 20 74 36 69 32 20 28  ING INDEX t6i2 (
19d0: 63 3d 3f 29 7d 0a 0a 20 20 64 6f 5f 65 71 70 5f  c=?)}..  do_eqp_
19e0: 74 65 73 74 20 31 30 2e 34 20 7b 0a 20 20 20 20  test 10.4 {.    
19f0: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
1a00: 4d 20 74 36 20 57 48 45 52 45 20 61 3d 30 20 41  M t6 WHERE a=0 A
1a10: 4e 44 20 62 3d 27 78 79 7a 27 20 41 4e 44 20 63  ND b='xyz' AND c
1a20: 3d 30 0a 20 20 7d 20 7b 53 45 41 52 43 48 20 54  =0.  } {SEARCH T
1a30: 41 42 4c 45 20 74 36 20 55 53 49 4e 47 20 49 4e  ABLE t6 USING IN
1a40: 44 45 58 20 74 36 69 32 20 28 63 3d 3f 29 7d 0a  DEX t6i2 (c=?)}.
1a50: 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  .  do_eqp_test 1
1a60: 30 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  0.5 {.    SELECT
1a70: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 36 20 57   rowid FROM t6 W
1a80: 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1a90: 61 3d 30 2c 20 30 2e 31 29 20 41 4e 44 20 63 3d  a=0, 0.1) AND c=
1aa0: 30 0a 20 20 7d 20 7b 53 45 41 52 43 48 20 54 41  0.  } {SEARCH TA
1ab0: 42 4c 45 20 74 36 20 55 53 49 4e 47 20 49 4e 44  BLE t6 USING IND
1ac0: 45 58 20 74 36 69 31 20 28 61 3d 3f 29 7d 0a 0a  EX t6i1 (a=?)}..
1ad0: 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 30    do_eqp_test 10
1ae0: 2e 36 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .6 {.    SELECT 
1af0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 36 20 57 48  rowid FROM t6 WH
1b00: 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 61  ERE likelihood(a
1b10: 3d 30 2c 20 30 2e 31 29 20 41 4e 44 20 62 3d 27  =0, 0.1) AND b='
1b20: 78 79 7a 27 20 41 4e 44 20 63 3d 30 0a 20 20 7d  xyz' AND c=0.  }
1b30: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
1b40: 36 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 36  6 USING INDEX t6
1b50: 69 31 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29  i1 (a=? AND b=?)
1b60: 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }.}..finish_test
1b70: 0a                                               .