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

Artifact dadd9905a9f34631a1821ff3d1b3e571ebad8afcd14ba0dca6d0818d9fd91237:


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 53  UERY PLAN.  |--S
05a0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 35 20 55  EARCH TABLE t5 U
05b0: 53 49 4e 47 20 49 4e 44 45 58 20 74 35 62 20 28  SING INDEX t5b (
05c0: 62 3d 3f 29 0a 20 20 7c 2d 2d 53 45 41 52 43 48  b=?).  |--SEARCH
05d0: 20 54 41 42 4c 45 20 74 35 20 55 53 49 4e 47 20   TABLE t5 USING 
05e0: 49 4e 44 45 58 20 74 35 63 20 28 63 3d 3f 29 0a  INDEX t5c (c=?).
05f0: 20 20 7c 2d 2d 53 45 41 52 43 48 20 54 41 42 4c    |--SEARCH TABL
0600: 45 20 74 35 20 55 53 49 4e 47 20 49 4e 44 45 58  E t5 USING INDEX
0610: 20 74 35 64 20 28 64 3d 3f 29 0a 20 20 60 2d 2d   t5d (d=?).  `--
0620: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
0630: 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a  FOR ORDER BY.}..
0640: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20  ----------.# If 
0690: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
06a0: 6c 69 68 6f 6f 64 28 29 20 6f 72 20 73 74 61 74  lihood() or stat
06b0: 33 20 64 61 74 61 2c 20 53 51 4c 69 74 65 20 61  3 data, SQLite a
06c0: 73 73 75 6d 65 73 20 74 68 61 74 20 61 20 63 6c  ssumes that a cl
06d0: 6f 73 65 64 0a 23 20 72 61 6e 67 65 20 73 63 61  osed.# range sca
06e0: 6e 20 28 65 2e 67 2e 20 6f 6e 65 20 63 6f 6e 73  n (e.g. one cons
06f0: 74 72 61 69 6e 65 64 20 62 79 20 22 63 6f 6c 20  trained by "col 
0700: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22  BETWEEN ? AND ?"
0710: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 23 20 76   constraint).# v
0720: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
0730: 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
0740: 65 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20 31 2f 36  e..#.# Note: 1/6
0750: 33 20 3d 7e 20 30 2e 30 31 36 0a 23 20 4e 6f 74  3 =~ 0.016.# Not
0760: 65 3a 20 31 2f 36 35 20 3d 7e 20 30 2e 30 31 35  e: 1/65 =~ 0.015
0770: 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  .#.reset_db.do_e
0780: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 20  xecsql_test 4.1 
0790: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
07a0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   t1(a, b);.  CRE
07b0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
07c0: 74 31 28 61 29 3b 0a 20 20 43 52 45 41 54 45 20  t1(a);.  CREATE 
07d0: 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
07e0: 29 3b 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74  );.}.do_eqp_test
07f0: 20 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   4.2 {.  SELECT 
0800: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0810: 6c 69 6b 65 6c 69 68 6f 6f 64 28 61 3d 3f 2c 20  likelihood(a=?, 
0820: 30 2e 30 31 34 29 20 41 4e 44 20 62 20 42 45 54  0.014) AND b BET
0830: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 7d 20  WEEN ? AND ?;.} 
0840: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
0850: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20   USING INDEX i1 
0860: 28 61 3d 3f 29 7d 0a 0a 64 6f 5f 65 71 70 5f 74  (a=?)}..do_eqp_t
0870: 65 73 74 20 34 2e 33 20 7b 0a 20 20 53 45 4c 45  est 4.3 {.  SELE
0880: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0890: 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 61 3d  RE likelihood(a=
08a0: 3f 2c 20 30 2e 30 31 36 29 20 41 4e 44 20 62 20  ?, 0.016) AND b 
08b0: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b  BETWEEN ? AND ?;
08c0: 0a 7d 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45  .} {SEARCH TABLE
08d0: 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t1 USING INDEX 
08e0: 69 32 20 28 62 3e 3f 20 41 4e 44 20 62 3c 3f 29  i2 (b>? AND b<?)
08f0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0940: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65  .reset_db.do_exe
0950: 63 73 71 6c 5f 74 65 73 74 20 35 2e 31 20 7b 0a  csql_test 5.1 {.
0960: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0970: 32 28 78 2c 20 79 29 3b 0a 20 20 43 52 45 41 54  2(x, y);.  CREAT
0980: 45 20 49 4e 44 45 58 20 74 32 69 31 20 4f 4e 20  E INDEX t2i1 ON 
0990: 74 32 28 78 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70  t2(x);.}..do_eqp
09a0: 5f 74 65 73 74 20 35 2e 32 20 7b 0a 20 20 53 45  _test 5.2 {.  SE
09b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
09c0: 52 44 45 52 20 42 59 20 78 2c 20 79 3b 0a 7d 20  RDER BY x, y;.} 
09d0: 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  {.  QUERY PLAN. 
09e0: 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   |--SCAN TABLE t
09f0: 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32  2 USING INDEX t2
0a00: 69 31 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50  i1.  `--USE TEMP
0a10: 20 42 2d 54 52 45 45 20 46 4f 52 20 52 49 47 48   B-TREE FOR RIGH
0a20: 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
0a30: 42 59 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  BY.}..do_eqp_tes
0a40: 74 20 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  t 5.3 {.  SELECT
0a50: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
0a60: 20 78 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   x BETWEEN ? AND
0a70: 20 3f 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69   ? ORDER BY rowi
0a80: 64 3b 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50  d;.} {.  QUERY P
0a90: 4c 41 4e 0a 20 20 7c 2d 2d 53 45 41 52 43 48 20  LAN.  |--SEARCH 
0aa0: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49  TABLE t2 USING I
0ab0: 4e 44 45 58 20 74 32 69 31 20 28 78 3e 3f 20 41  NDEX t2i1 (x>? A
0ac0: 4e 44 20 78 3c 3f 29 0a 20 20 60 2d 2d 55 53 45  ND x<?).  `--USE
0ad0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
0ae0: 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a 23 20 77   ORDER BY.}..# w
0af0: 68 65 72 65 37 2e 74 65 73 74 2c 20 77 68 65 72  here7.test, wher
0b00: 65 38 2e 74 65 73 74 3a 0a 23 0a 64 6f 5f 65 78  e8.test:.#.do_ex
0b10: 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 31 20 7b  ecsql_test 6.1 {
0b20: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0b30: 74 33 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t3(a INTEGER PRI
0b40: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b  MARY KEY, b, c);
0b50: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0b60: 74 33 69 31 20 4f 4e 20 74 33 28 62 29 3b 0a 20  t3i1 ON t3(b);. 
0b70: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 33   CREATE INDEX t3
0b80: 69 32 20 4f 4e 20 74 33 28 63 29 3b 0a 7d 0a 0a  i2 ON t3(c);.}..
0b90: 64 6f 5f 65 71 70 5f 74 65 73 74 20 36 2e 32 20  do_eqp_test 6.2 
0ba0: 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  {.  SELECT a FRO
0bb0: 4d 20 74 33 20 57 48 45 52 45 20 28 62 20 42 45  M t3 WHERE (b BE
0bc0: 54 57 45 45 4e 20 32 20 41 4e 44 20 34 29 20 4f  TWEEN 2 AND 4) O
0bd0: 52 20 63 3d 31 30 30 20 4f 52 44 45 52 20 42 59  R c=100 ORDER BY
0be0: 20 61 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50   a.} {.  QUERY P
0bf0: 4c 41 4e 0a 20 20 7c 2d 2d 53 45 41 52 43 48 20  LAN.  |--SEARCH 
0c00: 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20 49  TABLE t3 USING I
0c10: 4e 44 45 58 20 74 33 69 31 20 28 62 3e 3f 20 41  NDEX t3i1 (b>? A
0c20: 4e 44 20 62 3c 3f 29 0a 20 20 7c 2d 2d 53 45 41  ND b<?).  |--SEA
0c30: 52 43 48 20 54 41 42 4c 45 20 74 33 20 55 53 49  RCH TABLE t3 USI
0c40: 4e 47 20 49 4e 44 45 58 20 74 33 69 32 20 28 63  NG INDEX t3i2 (c
0c50: 3d 3f 29 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d  =?).  `--USE TEM
0c60: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
0c70: 45 52 20 42 59 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ER BY.}..#------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  ---.#.reset_db.d
0cd0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37  o_execsql_test 7
0ce0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
0cf0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
0d00: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 62 2c 63   PRIMARY KEY,b,c
0d10: 2c 64 2c 65 2c 66 2c 67 29 3b 0a 20 20 43 52 45  ,d,e,f,g);.  CRE
0d20: 41 54 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e  ATE INDEX t1b ON
0d30: 20 74 31 28 62 29 3b 0a 20 20 43 52 45 41 54 45   t1(b);.  CREATE
0d40: 20 49 4e 44 45 58 20 74 31 63 20 4f 4e 20 74 31   INDEX t1c ON t1
0d50: 28 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  (c);.  CREATE IN
0d60: 44 45 58 20 74 31 64 20 4f 4e 20 74 31 28 64 29  DEX t1d ON t1(d)
0d70: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
0d80: 20 74 31 65 20 4f 4e 20 74 31 28 65 29 3b 0a 20   t1e ON t1(e);. 
0d90: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
0da0: 66 20 4f 4e 20 74 31 28 66 29 3b 0a 20 20 43 52  f ON t1(f);.  CR
0db0: 45 41 54 45 20 49 4e 44 45 58 20 74 31 67 20 4f  EATE INDEX t1g O
0dc0: 4e 20 74 31 28 67 29 3b 0a 7d 0a 0a 64 6f 5f 65  N t1(g);.}..do_e
0dd0: 71 70 5f 74 65 73 74 20 37 2e 32 20 7b 0a 20 20  qp_test 7.2 {.  
0de0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
0df0: 0a 20 20 20 20 20 57 48 45 52 45 20 28 62 3e 3d  .     WHERE (b>=
0e00: 39 35 30 20 41 4e 44 20 62 3c 3d 31 30 31 30 29  950 AND b<=1010)
0e10: 20 4f 52 20 28 62 20 49 53 20 4e 55 4c 4c 20 41   OR (b IS NULL A
0e20: 4e 44 20 63 20 4e 4f 54 20 4e 55 4c 4c 29 0a 20  ND c NOT NULL). 
0e30: 20 4f 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a   ORDER BY a.} {.
0e40: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c    QUERY PLAN.  |
0e50: 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74  --SEARCH TABLE t
0e60: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31  1 USING INDEX t1
0e70: 62 20 28 62 3e 3f 20 41 4e 44 20 62 3c 3f 29 0a  b (b>? AND b<?).
0e80: 20 20 7c 2d 2d 53 45 41 52 43 48 20 54 41 42 4c    |--SEARCH TABL
0e90: 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58  E t1 USING INDEX
0ea0: 20 74 31 62 20 28 62 3d 3f 29 0a 20 20 60 2d 2d   t1b (b=?).  `--
0eb0: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
0ec0: 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a  FOR ORDER BY.}..
0ed0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 37 2e 33 20  do_eqp_test 7.3 
0ee0: 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64  {.  SELECT rowid
0ef0: 20 46 52 4f 4d 20 74 31 0a 20 20 57 48 45 52 45   FROM t1.  WHERE
0f00: 20 28 2b 62 20 49 53 20 4e 55 4c 4c 20 41 4e 44   (+b IS NULL AND
0f10: 20 63 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20   c NOT NULL AND 
0f20: 64 20 4e 4f 54 20 4e 55 4c 4c 29 0a 20 20 20 20  d NOT NULL).    
0f30: 20 20 20 20 4f 52 20 28 62 20 4e 4f 54 20 4e 55      OR (b NOT NU
0f40: 4c 4c 20 41 4e 44 20 63 20 49 53 20 4e 55 4c 4c  LL AND c IS NULL
0f50: 20 41 4e 44 20 64 20 4e 4f 54 20 4e 55 4c 4c 29   AND d NOT NULL)
0f60: 0a 20 20 20 20 20 20 20 20 4f 52 20 28 62 20 4e  .        OR (b N
0f70: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 63 20 4e 4f  OT NULL AND c NO
0f80: 54 20 4e 55 4c 4c 20 41 4e 44 20 64 20 49 53 20  T NULL AND d IS 
0f90: 4e 55 4c 4c 29 0a 7d 20 7b 53 43 41 4e 20 54 41  NULL).} {SCAN TA
0fa0: 42 4c 45 20 74 31 7d 0a 0a 64 6f 5f 65 71 70 5f  BLE t1}..do_eqp_
0fb0: 74 65 73 74 20 37 2e 34 20 7b 0a 20 20 53 45 4c  test 7.4 {.  SEL
0fc0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
0fd0: 31 20 57 48 45 52 45 20 28 2b 62 20 49 53 20 4e  1 WHERE (+b IS N
0fe0: 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 4e 55  ULL AND c NOT NU
0ff0: 4c 4c 29 20 4f 52 20 63 20 49 53 20 4e 55 4c 4c  LL) OR c IS NULL
1000: 0a 7d 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74  .} {SCAN TABLE t
1010: 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1}..#-----------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1060: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65  .reset_db.do_exe
1070: 63 73 71 6c 5f 74 65 73 74 20 38 2e 31 20 7b 0a  csql_test 8.1 {.
1080: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
1090: 6f 6d 70 6f 73 65 72 28 0a 20 20 20 20 63 69 64  omposer(.    cid
10a0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
10b0: 20 4b 45 59 2c 0a 20 20 20 20 63 6e 61 6d 65 20   KEY,.    cname 
10c0: 54 45 58 54 0a 20 20 29 3b 0a 20 20 43 52 45 41  TEXT.  );.  CREA
10d0: 54 45 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a  TE TABLE album(.
10e0: 20 20 20 20 61 69 64 20 49 4e 54 45 47 45 52 20      aid INTEGER 
10f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
1100: 20 61 6e 61 6d 65 20 54 45 58 54 0a 20 20 29 3b   aname TEXT.  );
1110: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1120: 74 72 61 63 6b 28 0a 20 20 20 20 74 69 64 20 49  track(.    tid I
1130: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1140: 45 59 2c 0a 20 20 20 20 63 69 64 20 49 4e 54 45  EY,.    cid INTE
1150: 47 45 52 20 52 45 46 45 52 45 4e 43 45 53 20 63  GER REFERENCES c
1160: 6f 6d 70 6f 73 65 72 2c 0a 20 20 20 20 61 69 64  omposer,.    aid
1170: 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e   INTEGER REFEREN
1180: 43 45 53 20 61 6c 62 75 6d 2c 0a 20 20 20 20 74  CES album,.    t
1190: 69 74 6c 65 20 54 45 58 54 0a 20 20 29 3b 0a 20  itle TEXT.  );. 
11a0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 72   CREATE INDEX tr
11b0: 61 63 6b 5f 69 31 20 4f 4e 20 74 72 61 63 6b 28  ack_i1 ON track(
11c0: 63 69 64 29 3b 0a 20 20 43 52 45 41 54 45 20 49  cid);.  CREATE I
11d0: 4e 44 45 58 20 74 72 61 63 6b 5f 69 32 20 4f 4e  NDEX track_i2 ON
11e0: 20 74 72 61 63 6b 28 61 69 64 29 3b 0a 7d 0a 0a   track(aid);.}..
11f0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 38 2e 32 20  do_eqp_test 8.2 
1200: 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  {.  SELECT DISTI
1210: 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20 46 52  NCT aname.    FR
1220: 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f 73  OM album, compos
1230: 65 72 2c 20 74 72 61 63 6b 0a 20 20 20 57 48 45  er, track.   WHE
1240: 52 45 20 63 6e 61 6d 65 20 4c 49 4b 45 20 27 25  RE cname LIKE '%
1250: 62 61 63 68 25 27 0a 20 20 20 20 20 41 4e 44 20  bach%'.     AND 
1260: 75 6e 6c 69 6b 65 6c 79 28 63 6f 6d 70 6f 73 65  unlikely(compose
1270: 72 2e 63 69 64 3d 74 72 61 63 6b 2e 63 69 64 29  r.cid=track.cid)
1280: 0a 20 20 20 20 20 41 4e 44 20 75 6e 6c 69 6b 65  .     AND unlike
1290: 6c 79 28 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61  ly(album.aid=tra
12a0: 63 6b 2e 61 69 64 29 3b 0a 7d 20 7b 0a 20 20 51  ck.aid);.} {.  Q
12b0: 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53  UERY PLAN.  |--S
12c0: 43 41 4e 20 54 41 42 4c 45 20 74 72 61 63 6b 0a  CAN TABLE track.
12d0: 20 20 7c 2d 2d 53 45 41 52 43 48 20 54 41 42 4c    |--SEARCH TABL
12e0: 45 20 61 6c 62 75 6d 20 55 53 49 4e 47 20 49 4e  E album USING IN
12f0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1300: 59 20 28 72 6f 77 69 64 3d 3f 29 0a 20 20 7c 2d  Y (rowid=?).  |-
1310: 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 63 6f  -SEARCH TABLE co
1320: 6d 70 6f 73 65 72 20 55 53 49 4e 47 20 49 4e 54  mposer USING INT
1330: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1340: 20 28 72 6f 77 69 64 3d 3f 29 0a 20 20 60 2d 2d   (rowid=?).  `--
1350: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
1360: 46 4f 52 20 44 49 53 54 49 4e 43 54 0a 7d 0a 0a  FOR DISTINCT.}..
1370: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
13c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 31  execsql_test 9.1
13d0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
13e0: 45 20 74 31 28 0a 20 20 20 20 61 2c 62 2c 63 2c  E t1(.    a,b,c,
13f0: 64 2c 65 2c 20 66 2c 67 2c 68 2c 69 2c 6a 2c 0a  d,e, f,g,h,i,j,.
1400: 20 20 20 20 6b 2c 6c 2c 6d 2c 6e 2c 6f 2c 20 70      k,l,m,n,o, p
1410: 2c 71 2c 72 2c 73 2c 74 0a 20 20 29 3b 0a 20 20  ,q,r,s,t.  );.  
1420: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1430: 4f 4e 20 74 31 28 6b 2c 6c 2c 6d 2c 6e 2c 6f 2c  ON t1(k,l,m,n,o,
1440: 70 2c 71 2c 72 2c 73 2c 74 29 3b 0a 7d 0a 64 6f  p,q,r,s,t);.}.do
1450: 5f 74 65 73 74 20 39 2e 32 20 7b 0a 20 20 66 6f  _test 9.2 {.  fo
1460: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
1470: 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20  < 100} {incr i} 
1480: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
1490: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 44  INSERT INTO t1 D
14a0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a  EFAULT VALUES }.
14b0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
14c0: 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20      ANALYZE;.   
14d0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
14e0: 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65   ON t1(a,b,c,d,e
14f0: 2c 66 2c 67 2c 68 2c 69 2c 6a 29 3b 0a 20 20 7d  ,f,g,h,i,j);.  }
1500: 0a 7d 20 7b 7d 0a 0a 73 65 74 20 4c 20 5b 6c 69  .} {}..set L [li
1510: 73 74 20 61 3d 3f 20 62 3d 3f 20 63 3d 3f 20 64  st a=? b=? c=? d
1520: 3d 3f 20 65 3d 3f 20 66 3d 3f 20 67 3d 3f 20 68  =? e=? f=? g=? h
1530: 3d 3f 20 69 3d 3f 20 6a 3d 3f 5d 0a 66 6f 72 65  =? i=? j=?].fore
1540: 61 63 68 20 7b 74 6e 20 6e 54 65 72 6d 20 6e 52  ach {tn nTerm nR
1550: 6f 77 7d 20 7b 0a 20 20 31 20 20 20 31 20 31 30  ow} {.  1   1 10
1560: 0a 20 20 32 20 20 20 32 20 20 39 0a 20 20 33 20  .  2   2  9.  3 
1570: 20 20 33 20 20 38 0a 20 20 34 20 20 20 34 20 20    3  8.  4   4  
1580: 37 0a 20 20 35 20 20 20 35 20 20 36 0a 20 20 36  7.  5   5  6.  6
1590: 20 20 20 36 20 20 35 0a 20 20 37 20 20 20 37 20     6  5.  7   7 
15a0: 20 35 0a 20 20 38 20 20 20 38 20 20 35 0a 20 20   5.  8   8  5.  
15b0: 39 20 20 20 39 20 20 35 0a 20 20 31 30 20 31 30  9   9  5.  10 10
15c0: 20 20 35 0a 7d 20 7b 0a 20 20 73 65 74 20 77 20    5.} {.  set w 
15d0: 5b 6a 6f 69 6e 20 5b 6c 72 61 6e 67 65 20 24 4c  [join [lrange $L
15e0: 20 30 20 5b 65 78 70 72 20 24 6e 54 65 72 6d 2d   0 [expr $nTerm-
15f0: 31 5d 5d 20 22 20 41 4e 44 20 22 5d 0a 20 20 73  1]] " AND "].  s
1600: 65 74 20 70 31 20 5b 65 78 70 72 20 28 24 6e 52  et p1 [expr ($nR
1610: 6f 77 2d 31 29 20 2f 20 31 30 30 2e 30 5d 0a 20  ow-1) / 100.0]. 
1620: 20 73 65 74 20 70 32 20 5b 65 78 70 72 20 28 24   set p2 [expr ($
1630: 6e 52 6f 77 2b 31 29 20 2f 20 31 30 30 2e 30 5d  nRow+1) / 100.0]
1640: 0a 0a 20 20 73 65 74 20 73 71 6c 31 20 22 53 45  ..  set sql1 "SE
1650: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1660: 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1670: 6b 3d 3f 2c 20 24 70 31 29 20 41 4e 44 20 24 77  k=?, $p1) AND $w
1680: 22 0a 20 20 73 65 74 20 73 71 6c 32 20 22 53 45  ".  set sql2 "SE
1690: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
16a0: 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
16b0: 6b 3d 3f 2c 20 24 70 32 29 20 41 4e 44 20 24 77  k=?, $p2) AND $w
16c0: 22 0a 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74  "..  do_eqp_test
16d0: 20 39 2e 33 2e 24 74 6e 2e 31 20 24 73 71 6c 31   9.3.$tn.1 $sql1
16e0: 20 7b 2f 49 4e 44 45 58 20 69 31 2f 7d 0a 20 20   {/INDEX i1/}.  
16f0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 39 2e 33 2e  do_eqp_test 9.3.
1700: 24 74 6e 2e 32 20 24 73 71 6c 32 20 7b 2f 49 4e  $tn.2 $sql2 {/IN
1710: 44 45 58 20 69 32 2f 7d 0a 7d 0a 0a 0a 23 2d 2d  DEX i2/}.}...#--
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a 69 66 63 61 70  -------.#..ifcap
1770: 61 62 6c 65 20 73 74 61 74 34 20 7b 0a 20 20 64  able stat4 {.  d
1780: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
1790: 30 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45  0.1 {.    CREATE
17a0: 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 2c 20   TABLE t6(a, b, 
17b0: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  c);.    CREATE I
17c0: 4e 44 45 58 20 74 36 69 31 20 4f 4e 20 74 36 28  NDEX t6i1 ON t6(
17d0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
17e0: 45 20 49 4e 44 45 58 20 74 36 69 32 20 4f 4e 20  E INDEX t6i2 ON 
17f0: 74 36 28 63 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  t6(c);.  }.  .  
1800: 64 6f 5f 74 65 73 74 20 31 30 2e 32 20 7b 0a 20  do_test 10.2 {. 
1810: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
1820: 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e 63 72   {$i < 16} {incr
1830: 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63   i} {.      exec
1840: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1850: 4f 20 74 36 20 56 41 4c 55 45 53 28 24 69 25 34  O t6 VALUES($i%4
1860: 2c 20 27 78 79 7a 27 2c 20 24 69 25 38 29 20 7d  , 'xyz', $i%8) }
1870: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
1880: 71 6c 20 41 4e 41 4c 59 5a 45 0a 20 20 7d 20 7b  ql ANALYZE.  } {
1890: 7d 0a 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74  }..  do_eqp_test
18a0: 20 31 30 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45   10.3 {.    SELE
18b0: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 36  CT rowid FROM t6
18c0: 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 63   WHERE a=0 AND c
18d0: 3d 30 0a 20 20 7d 20 7b 53 45 41 52 43 48 20 54  =0.  } {SEARCH T
18e0: 41 42 4c 45 20 74 36 20 55 53 49 4e 47 20 49 4e  ABLE t6 USING IN
18f0: 44 45 58 20 74 36 69 32 20 28 63 3d 3f 29 7d 0a  DEX t6i2 (c=?)}.
1900: 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  .  do_eqp_test 1
1910: 30 2e 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  0.4 {.    SELECT
1920: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 36 20 57   rowid FROM t6 W
1930: 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 27  HERE a=0 AND b='
1940: 78 79 7a 27 20 41 4e 44 20 63 3d 30 0a 20 20 7d  xyz' AND c=0.  }
1950: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
1960: 36 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 36  6 USING INDEX t6
1970: 69 32 20 28 63 3d 3f 29 7d 0a 0a 20 20 64 6f 5f  i2 (c=?)}..  do_
1980: 65 71 70 5f 74 65 73 74 20 31 30 2e 35 20 7b 0a  eqp_test 10.5 {.
1990: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
19a0: 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 6c   FROM t6 WHERE l
19b0: 69 6b 65 6c 69 68 6f 6f 64 28 61 3d 30 2c 20 30  ikelihood(a=0, 0
19c0: 2e 31 29 20 41 4e 44 20 63 3d 30 0a 20 20 7d 20  .1) AND c=0.  } 
19d0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 36  {SEARCH TABLE t6
19e0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 36 69   USING INDEX t6i
19f0: 31 20 28 61 3d 3f 29 7d 0a 0a 20 20 64 6f 5f 65  1 (a=?)}..  do_e
1a00: 71 70 5f 74 65 73 74 20 31 30 2e 36 20 7b 0a 20  qp_test 10.6 {. 
1a10: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20     SELECT rowid 
1a20: 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 6c 69  FROM t6 WHERE li
1a30: 6b 65 6c 69 68 6f 6f 64 28 61 3d 30 2c 20 30 2e  kelihood(a=0, 0.
1a40: 31 29 20 41 4e 44 20 62 3d 27 78 79 7a 27 20 41  1) AND b='xyz' A
1a50: 4e 44 20 63 3d 30 0a 20 20 7d 20 7b 53 45 41 52  ND c=0.  } {SEAR
1a60: 43 48 20 54 41 42 4c 45 20 74 36 20 55 53 49 4e  CH TABLE t6 USIN
1a70: 47 20 49 4e 44 45 58 20 74 36 69 31 20 28 61 3d  G INDEX t6i1 (a=
1a80: 3f 20 41 4e 44 20 62 3d 3f 29 7d 0a 7d 0a 0a 66  ? AND b=?)}.}..f
1a90: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.