/ Hex Artifact Content
Login

Artifact 04842adec34311d70c3f3c5fd698b22be54138fd:


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 30 20 30 20 30 20 7b 53 43 41  } {.  0 0 0 {SCA
02c0: 4e 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47  N TABLE t3 USING
02d0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
02e0: 69 33 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 45  i3} .  0 1 1 {SE
02f0: 41 52 43 48 20 54 41 42 4c 45 20 74 34 20 55 53  ARCH TABLE t4 US
0300: 49 4e 47 20 49 4e 44 45 58 20 69 34 20 28 63 3d  ING INDEX i4 (c=
0310: 3f 29 7d 0a 7d 0a 0a 0a 64 6f 5f 65 78 65 63 73  ?)}.}...do_execs
0320: 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20  ql_test 2.1 {.  
0330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0340: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
0350: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
0360: 29 3b 0a 7d 0a 0a 23 20 49 74 20 69 73 20 62 65  );.}..# It is be
0370: 74 74 65 72 20 74 6f 20 75 73 65 20 61 6e 20 69  tter to use an i
0380: 6e 64 65 78 20 66 6f 72 20 4f 52 44 45 52 20 42  ndex for ORDER B
0390: 59 20 74 68 61 6e 20 73 6f 72 74 20 65 78 74 65  Y than sort exte
03a0: 72 6e 61 6c 6c 79 2c 20 65 76 65 6e 20 0a 23 20  rnally, even .# 
03b0: 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
03c0: 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
03d0: 6e 64 65 78 2e 0a 64 6f 5f 65 71 70 5f 74 65 73  ndex..do_eqp_tes
03e0: 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 2.2 {.  SELECT
03f0: 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   * FROM t1 ORDER
0400: 20 42 59 20 61 3b 0a 7d 20 7b 0a 20 20 30 20 30   BY a;.} {.  0 0
0410: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
0420: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31  1 USING INDEX i1
0430: 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }.}..do_execsql_
0440: 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43 52 45  test 3.1 {.  CRE
0450: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 20 49  ATE TABLE t5(a I
0460: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0470: 45 59 2c 62 2c 63 2c 64 2c 65 2c 66 2c 67 29 3b  EY,b,c,d,e,f,g);
0480: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0490: 74 35 62 20 4f 4e 20 74 35 28 62 29 3b 0a 20 20  t5b ON t5(b);.  
04a0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 35 63  CREATE INDEX t5c
04b0: 20 4f 4e 20 74 35 28 63 29 3b 0a 20 20 43 52 45   ON t5(c);.  CRE
04c0: 41 54 45 20 49 4e 44 45 58 20 74 35 64 20 4f 4e  ATE INDEX t5d ON
04d0: 20 74 35 28 64 29 3b 0a 20 20 43 52 45 41 54 45   t5(d);.  CREATE
04e0: 20 49 4e 44 45 58 20 74 35 65 20 4f 4e 20 74 35   INDEX t5e ON t5
04f0: 28 65 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  (e);.  CREATE IN
0500: 44 45 58 20 74 35 66 20 4f 4e 20 74 35 28 66 29  DEX t5f ON t5(f)
0510: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
0520: 20 74 35 67 20 4f 4e 20 74 35 28 67 29 3b 0a 7d   t5g ON t5(g);.}
0530: 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e  ..do_eqp_test 3.
0540: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46  2 {.  SELECT a F
0550: 52 4f 4d 20 74 35 20 0a 20 20 57 48 45 52 45 20  ROM t5 .  WHERE 
0560: 62 20 49 53 20 4e 55 4c 4c 20 4f 52 20 63 20 49  b IS NULL OR c I
0570: 53 20 4e 55 4c 4c 20 4f 52 20 64 20 49 53 20 4e  S NULL OR d IS N
0580: 55 4c 4c 20 0a 20 20 4f 52 44 45 52 20 42 59 20  ULL .  ORDER BY 
0590: 61 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  a;.} {.  0 0 0 {
05a0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 35 20  SEARCH TABLE t5 
05b0: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 35 62 20  USING INDEX t5b 
05c0: 28 62 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30 20  (b=?)} .  0 0 0 
05d0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 35  {SEARCH TABLE t5
05e0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 35 63   USING INDEX t5c
05f0: 20 28 63 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30   (c=?)} .  0 0 0
0600: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
0610: 35 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 35  5 USING INDEX t5
0620: 64 20 28 64 3d 3f 29 7d 20 0a 20 20 30 20 30 20  d (d=?)} .  0 0 
0630: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
0640: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
0650: 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
06a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
06b0: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6f 72 20  likelihood() or 
06c0: 73 74 61 74 33 20 64 61 74 61 2c 20 53 51 4c 69  stat3 data, SQLi
06d0: 74 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  te assumes that 
06e0: 61 20 63 6c 6f 73 65 64 0a 23 20 72 61 6e 67 65  a closed.# range
06f0: 20 73 63 61 6e 20 28 65 2e 67 2e 20 6f 6e 65 20   scan (e.g. one 
0700: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 22  constrained by "
0710: 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  col BETWEEN ? AN
0720: 44 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 29  D ?" constraint)
0730: 0a 23 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f  .# visits 1/64 o
0740: 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 61 20  f the rows in a 
0750: 74 61 62 6c 65 2e 0a 23 0a 23 20 4e 6f 74 65 3a  table..#.# Note:
0760: 20 31 2f 36 33 20 3d 7e 20 30 2e 30 31 36 0a 23   1/63 =~ 0.016.#
0770: 20 4e 6f 74 65 3a 20 31 2f 36 35 20 3d 7e 20 30   Note: 1/65 =~ 0
0780: 2e 30 31 35 0a 23 0a 72 65 73 65 74 5f 64 62 0a  .015.#.reset_db.
0790: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
07a0: 34 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  4.1 {.  CREATE T
07b0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
07c0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
07d0: 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 43 52 45   ON t1(a);.  CRE
07e0: 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
07f0: 74 31 28 62 29 3b 0a 7d 0a 64 6f 5f 65 71 70 5f  t1(b);.}.do_eqp_
0800: 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 53 45 4c  test 4.2 {.  SEL
0810: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0820: 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 61  ERE likelihood(a
0830: 3d 3f 2c 20 30 2e 30 31 34 29 20 41 4e 44 20 62  =?, 0.014) AND b
0840: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
0850: 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  ;.} {.  0 0 0 {S
0860: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
0870: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61  SING INDEX i1 (a
0880: 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65  =?)}.}.do_eqp_te
0890: 73 74 20 34 2e 33 20 7b 0a 20 20 53 45 4c 45 43  st 4.3 {.  SELEC
08a0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
08b0: 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 61 3d 3f  E likelihood(a=?
08c0: 2c 20 30 2e 30 31 36 29 20 41 4e 44 20 62 20 42  , 0.016) AND b B
08d0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a  ETWEEN ? AND ?;.
08e0: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41  } {.  0 0 0 {SEA
08f0: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
0900: 4e 47 20 49 4e 44 45 58 20 69 32 20 28 62 3e 3f  NG INDEX i2 (b>?
0910: 20 41 4e 44 20 62 3c 3f 29 7d 0a 7d 0a 0a 0a 23   AND b<?)}.}...#
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 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 0a 72 65 73 65  ---------.#.rese
0970: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
0980: 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 43 52 45  test 5.1 {.  CRE
0990: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
09a0: 79 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  y);.  CREATE IND
09b0: 45 58 20 74 32 69 31 20 4f 4e 20 74 32 28 78 29  EX t2i1 ON t2(x)
09c0: 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74  ;.}..do_eqp_test
09d0: 20 35 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   5.2 {.  SELECT 
09e0: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
09f0: 42 59 20 78 2c 20 79 3b 0a 7d 20 7b 0a 20 20 30  BY x, y;.} {.  0
0a00: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
0a10: 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t2 USING INDEX 
0a20: 74 32 69 31 7d 20 0a 20 20 30 20 30 20 30 20 7b  t2i1} .  0 0 0 {
0a30: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
0a40: 46 4f 52 20 52 49 47 48 54 20 50 41 52 54 20 4f  FOR RIGHT PART O
0a50: 46 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 0a 64  F ORDER BY}.}..d
0a60: 6f 5f 65 71 70 5f 74 65 73 74 20 35 2e 33 20 7b  o_eqp_test 5.3 {
0a70: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0a80: 20 74 32 20 57 48 45 52 45 20 78 20 42 45 54 57   t2 WHERE x BETW
0a90: 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52 44 45  EEN ? AND ? ORDE
0aa0: 52 20 42 59 20 72 6f 77 69 64 3b 0a 7d 20 7b 0a  R BY rowid;.} {.
0ab0: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
0ac0: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49  TABLE t2 USING I
0ad0: 4e 44 45 58 20 74 32 69 31 20 28 78 3e 3f 20 41  NDEX t2i1 (x>? A
0ae0: 4e 44 20 78 3c 3f 29 7d 20 0a 20 20 30 20 30 20  ND x<?)} .  0 0 
0af0: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
0b00: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
0b10: 0a 7d 0a 0a 23 20 77 68 65 72 65 37 2e 74 65 73  .}..# where7.tes
0b20: 74 2c 20 77 68 65 72 65 38 2e 74 65 73 74 3a 0a  t, where8.test:.
0b30: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0b40: 74 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 6.1 {.  CREATE
0b50: 20 54 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45   TABLE t3(a INTE
0b60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0b70: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
0b80: 20 49 4e 44 45 58 20 74 33 69 31 20 4f 4e 20 74   INDEX t3i1 ON t
0b90: 33 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49  3(b);.  CREATE I
0ba0: 4e 44 45 58 20 74 33 69 32 20 4f 4e 20 74 33 28  NDEX t3i2 ON t3(
0bb0: 63 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65  c);.}..do_eqp_te
0bc0: 73 74 20 36 2e 32 20 7b 0a 20 20 53 45 4c 45 43  st 6.2 {.  SELEC
0bd0: 54 20 61 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T a FROM t3 WHER
0be0: 45 20 28 62 20 42 45 54 57 45 45 4e 20 32 20 41  E (b BETWEEN 2 A
0bf0: 4e 44 20 34 29 20 4f 52 20 63 3d 31 30 30 20 4f  ND 4) OR c=100 O
0c00: 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a 20 20  RDER BY a.} {.  
0c10: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
0c20: 42 4c 45 20 74 33 20 55 53 49 4e 47 20 49 4e 44  BLE t3 USING IND
0c30: 45 58 20 74 33 69 31 20 28 62 3e 3f 20 41 4e 44  EX t3i1 (b>? AND
0c40: 20 62 3c 3f 29 7d 20 0a 20 20 30 20 30 20 30 20   b<?)} .  0 0 0 
0c50: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 33  {SEARCH TABLE t3
0c60: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 33 69   USING INDEX t3i
0c70: 32 20 28 63 3d 3f 29 7d 0a 20 20 30 20 30 20 30  2 (c=?)}.  0 0 0
0c80: 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   {USE TEMP B-TRE
0c90: 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a  E FOR ORDER BY}.
0ca0: 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
0cf0: 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63  reset_db.do_exec
0d00: 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20  sql_test 7.1 {. 
0d10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0d20: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
0d30: 52 59 20 4b 45 59 2c 62 2c 63 2c 64 2c 65 2c 66  RY KEY,b,c,d,e,f
0d40: 2c 67 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  ,g);.  CREATE IN
0d50: 44 45 58 20 74 31 62 20 4f 4e 20 74 31 28 62 29  DEX t1b ON t1(b)
0d60: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
0d70: 20 74 31 63 20 4f 4e 20 74 31 28 63 29 3b 0a 20   t1c ON t1(c);. 
0d80: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
0d90: 64 20 4f 4e 20 74 31 28 64 29 3b 0a 20 20 43 52  d ON t1(d);.  CR
0da0: 45 41 54 45 20 49 4e 44 45 58 20 74 31 65 20 4f  EATE INDEX t1e O
0db0: 4e 20 74 31 28 65 29 3b 0a 20 20 43 52 45 41 54  N t1(e);.  CREAT
0dc0: 45 20 49 4e 44 45 58 20 74 31 66 20 4f 4e 20 74  E INDEX t1f ON t
0dd0: 31 28 66 29 3b 0a 20 20 43 52 45 41 54 45 20 49  1(f);.  CREATE I
0de0: 4e 44 45 58 20 74 31 67 20 4f 4e 20 74 31 28 67  NDEX t1g ON t1(g
0df0: 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  );.}..do_eqp_tes
0e00: 74 20 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 7.2 {.  SELECT
0e10: 20 61 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20   a FROM t1.     
0e20: 57 48 45 52 45 20 28 62 3e 3d 39 35 30 20 41 4e  WHERE (b>=950 AN
0e30: 44 20 62 3c 3d 31 30 31 30 29 20 4f 52 20 28 62  D b<=1010) OR (b
0e40: 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 63 20 4e   IS NULL AND c N
0e50: 4f 54 20 4e 55 4c 4c 29 0a 20 20 4f 52 44 45 52  OT NULL).  ORDER
0e60: 20 42 59 20 61 0a 7d 20 7b 0a 20 20 30 20 30 20   BY a.} {.  0 0 
0e70: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
0e80: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t1 USING INDEX t
0e90: 31 62 20 28 62 3e 3f 20 41 4e 44 20 62 3c 3f 29  1b (b>? AND b<?)
0ea0: 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52  } .  0 0 0 {SEAR
0eb0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
0ec0: 47 20 49 4e 44 45 58 20 74 31 62 20 28 62 3d 3f  G INDEX t1b (b=?
0ed0: 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 55 53 45  )} .  0 0 0 {USE
0ee0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
0ef0: 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 0a 64 6f   ORDER BY}.}..do
0f00: 5f 65 71 70 5f 74 65 73 74 20 37 2e 33 20 7b 0a  _eqp_test 7.3 {.
0f10: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
0f20: 52 4f 4d 20 74 31 0a 20 20 57 48 45 52 45 20 28  ROM t1.  WHERE (
0f30: 2b 62 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 63  +b IS NULL AND c
0f40: 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 64 20   NOT NULL AND d 
0f50: 4e 4f 54 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20  NOT NULL).      
0f60: 20 20 4f 52 20 28 62 20 4e 4f 54 20 4e 55 4c 4c    OR (b NOT NULL
0f70: 20 41 4e 44 20 63 20 49 53 20 4e 55 4c 4c 20 41   AND c IS NULL A
0f80: 4e 44 20 64 20 4e 4f 54 20 4e 55 4c 4c 29 0a 20  ND d NOT NULL). 
0f90: 20 20 20 20 20 20 20 4f 52 20 28 62 20 4e 4f 54         OR (b NOT
0fa0: 20 4e 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20   NULL AND c NOT 
0fb0: 4e 55 4c 4c 20 41 4e 44 20 64 20 49 53 20 4e 55  NULL AND d IS NU
0fc0: 4c 4c 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20  LL).} {.  0 0 0 
0fd0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a  {SCAN TABLE t1}.
0fe0: 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 37  }..do_eqp_test 7
0ff0: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  .4 {.  SELECT ro
1000: 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52  wid FROM t1 WHER
1010: 45 20 28 2b 62 20 49 53 20 4e 55 4c 4c 20 41 4e  E (+b IS NULL AN
1020: 44 20 63 20 4e 4f 54 20 4e 55 4c 4c 29 20 4f 52  D c NOT NULL) OR
1030: 20 63 20 49 53 20 4e 55 4c 4c 0a 7d 20 7b 0a 20   c IS NULL.} {. 
1040: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
1050: 4c 45 20 74 31 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  LE t1}.}..#-----
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ----.#.reset_db.
10b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
10c0: 38 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  8.1 {.  CREATE T
10d0: 41 42 4c 45 20 63 6f 6d 70 6f 73 65 72 28 0a 20  ABLE composer(. 
10e0: 20 20 20 63 69 64 20 49 4e 54 45 47 45 52 20 50     cid INTEGER P
10f0: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
1100: 63 6e 61 6d 65 20 54 45 58 54 0a 20 20 29 3b 0a  cname TEXT.  );.
1110: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
1120: 6c 62 75 6d 28 0a 20 20 20 20 61 69 64 20 49 4e  lbum(.    aid IN
1130: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1140: 59 2c 0a 20 20 20 20 61 6e 61 6d 65 20 54 45 58  Y,.    aname TEX
1150: 54 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20  T.  );.  CREATE 
1160: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
1170: 20 74 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   tid INTEGER PRI
1180: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 63 69  MARY KEY,.    ci
1190: 64 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  d INTEGER REFERE
11a0: 4e 43 45 53 20 63 6f 6d 70 6f 73 65 72 2c 0a 20  NCES composer,. 
11b0: 20 20 20 61 69 64 20 49 4e 54 45 47 45 52 20 52     aid INTEGER R
11c0: 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75 6d 2c  EFERENCES album,
11d0: 0a 20 20 20 20 74 69 74 6c 65 20 54 45 58 54 0a  .    title TEXT.
11e0: 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e    );.  CREATE IN
11f0: 44 45 58 20 74 72 61 63 6b 5f 69 31 20 4f 4e 20  DEX track_i1 ON 
1200: 74 72 61 63 6b 28 63 69 64 29 3b 0a 20 20 43 52  track(cid);.  CR
1210: 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63 6b  EATE INDEX track
1220: 5f 69 32 20 4f 4e 20 74 72 61 63 6b 28 61 69 64  _i2 ON track(aid
1230: 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  );.}..do_eqp_tes
1240: 74 20 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 8.2 {.  SELECT
1250: 20 44 49 53 54 49 4e 43 54 20 61 6e 61 6d 65 0a   DISTINCT aname.
1260: 20 20 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c 20      FROM album, 
1270: 63 6f 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b 0a  composer, track.
1280: 20 20 20 57 48 45 52 45 20 63 6e 61 6d 65 20 4c     WHERE cname L
1290: 49 4b 45 20 27 25 62 61 63 68 25 27 0a 20 20 20  IKE '%bach%'.   
12a0: 20 20 41 4e 44 20 75 6e 6c 69 6b 65 6c 79 28 63    AND unlikely(c
12b0: 6f 6d 70 6f 73 65 72 2e 63 69 64 3d 74 72 61 63  omposer.cid=trac
12c0: 6b 2e 63 69 64 29 0a 20 20 20 20 20 41 4e 44 20  k.cid).     AND 
12d0: 75 6e 6c 69 6b 65 6c 79 28 61 6c 62 75 6d 2e 61  unlikely(album.a
12e0: 69 64 3d 74 72 61 63 6b 2e 61 69 64 29 3b 0a 7d  id=track.aid);.}
12f0: 20 7b 0a 20 20 30 20 30 20 32 20 7b 53 43 41 4e   {.  0 0 2 {SCAN
1300: 20 54 41 42 4c 45 20 74 72 61 63 6b 7d 20 0a 20   TABLE track} . 
1310: 20 30 20 31 20 30 20 7b 53 45 41 52 43 48 20 54   0 1 0 {SEARCH T
1320: 41 42 4c 45 20 61 6c 62 75 6d 20 55 53 49 4e 47  ABLE album USING
1330: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1340: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a   KEY (rowid=?)}.
1350: 20 20 30 20 32 20 31 20 7b 53 45 41 52 43 48 20    0 2 1 {SEARCH 
1360: 54 41 42 4c 45 20 63 6f 6d 70 6f 73 65 72 20 55  TABLE composer U
1370: 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
1380: 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d  MARY KEY (rowid=
1390: 3f 29 7d 0a 20 20 30 20 30 20 30 20 7b 55 53 45  ?)}.  0 0 0 {USE
13a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
13b0: 20 44 49 53 54 49 4e 43 54 7d 0a 7d 0a 0a 23 2d   DISTINCT}.}..#-
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 65 78  --------.#.do_ex
1410: 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 31 20 7b  ecsql_test 9.1 {
1420: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1430: 74 31 28 0a 20 20 20 20 61 2c 62 2c 63 2c 64 2c  t1(.    a,b,c,d,
1440: 65 2c 20 66 2c 67 2c 68 2c 69 2c 6a 2c 0a 20 20  e, f,g,h,i,j,.  
1450: 20 20 6b 2c 6c 2c 6d 2c 6e 2c 6f 2c 20 70 2c 71    k,l,m,n,o, p,q
1460: 2c 72 2c 73 2c 74 0a 20 20 29 3b 0a 20 20 43 52  ,r,s,t.  );.  CR
1470: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1480: 20 74 31 28 6b 2c 6c 2c 6d 2c 6e 2c 6f 2c 70 2c   t1(k,l,m,n,o,p,
1490: 71 2c 72 2c 73 2c 74 29 3b 0a 7d 0a 64 6f 5f 74  q,r,s,t);.}.do_t
14a0: 65 73 74 20 39 2e 32 20 7b 0a 20 20 66 6f 72 20  est 9.2 {.  for 
14b0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
14c0: 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  100} {incr i} {.
14d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
14e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46  SERT INTO t1 DEF
14f0: 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20 20  AULT VALUES }.  
1500: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
1510: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 43    ANALYZE;.    C
1520: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
1530: 4e 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  N t1(a,b,c,d,e,f
1540: 2c 67 2c 68 2c 69 2c 6a 29 3b 0a 20 20 7d 0a 7d  ,g,h,i,j);.  }.}
1550: 20 7b 7d 0a 0a 73 65 74 20 4c 20 5b 6c 69 73 74   {}..set L [list
1560: 20 61 3d 3f 20 62 3d 3f 20 63 3d 3f 20 64 3d 3f   a=? b=? c=? d=?
1570: 20 65 3d 3f 20 66 3d 3f 20 67 3d 3f 20 68 3d 3f   e=? f=? g=? h=?
1580: 20 69 3d 3f 20 6a 3d 3f 5d 0a 66 6f 72 65 61 63   i=? j=?].foreac
1590: 68 20 7b 74 6e 20 6e 54 65 72 6d 20 6e 52 6f 77  h {tn nTerm nRow
15a0: 7d 20 7b 0a 20 20 31 20 20 20 31 20 31 30 0a 20  } {.  1   1 10. 
15b0: 20 32 20 20 20 32 20 20 39 0a 20 20 33 20 20 20   2   2  9.  3   
15c0: 33 20 20 38 0a 20 20 34 20 20 20 34 20 20 37 0a  3  8.  4   4  7.
15d0: 20 20 35 20 20 20 35 20 20 36 0a 20 20 36 20 20    5   5  6.  6  
15e0: 20 36 20 20 35 0a 20 20 37 20 20 20 37 20 20 35   6  5.  7   7  5
15f0: 0a 20 20 38 20 20 20 38 20 20 35 0a 20 20 39 20  .  8   8  5.  9 
1600: 20 20 39 20 20 35 0a 20 20 31 30 20 31 30 20 20    9  5.  10 10  
1610: 35 0a 7d 20 7b 0a 20 20 73 65 74 20 77 20 5b 6a  5.} {.  set w [j
1620: 6f 69 6e 20 5b 6c 72 61 6e 67 65 20 24 4c 20 30  oin [lrange $L 0
1630: 20 5b 65 78 70 72 20 24 6e 54 65 72 6d 2d 31 5d   [expr $nTerm-1]
1640: 5d 20 22 20 41 4e 44 20 22 5d 0a 20 20 73 65 74  ] " AND "].  set
1650: 20 70 31 20 5b 65 78 70 72 20 28 24 6e 52 6f 77   p1 [expr ($nRow
1660: 2d 31 29 20 2f 20 31 30 30 2e 30 5d 0a 20 20 73  -1) / 100.0].  s
1670: 65 74 20 70 32 20 5b 65 78 70 72 20 28 24 6e 52  et p2 [expr ($nR
1680: 6f 77 2b 31 29 20 2f 20 31 30 30 2e 30 5d 0a 0a  ow+1) / 100.0]..
1690: 20 20 73 65 74 20 73 71 6c 31 20 22 53 45 4c 45    set sql1 "SELE
16a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
16b0: 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 6b 3d  RE likelihood(k=
16c0: 3f 2c 20 24 70 31 29 20 41 4e 44 20 24 77 22 0a  ?, $p1) AND $w".
16d0: 20 20 73 65 74 20 73 71 6c 32 20 22 53 45 4c 45    set sql2 "SELE
16e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
16f0: 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 6b 3d  RE likelihood(k=
1700: 3f 2c 20 24 70 32 29 20 41 4e 44 20 24 77 22 0a  ?, $p2) AND $w".
1710: 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 39  .  do_eqp_test 9
1720: 2e 33 2e 24 74 6e 2e 31 20 24 73 71 6c 31 20 7b  .3.$tn.1 $sql1 {
1730: 2f 49 4e 44 45 58 20 69 31 2f 7d 0a 20 20 64 6f  /INDEX i1/}.  do
1740: 5f 65 71 70 5f 74 65 73 74 20 39 2e 33 2e 24 74  _eqp_test 9.3.$t
1750: 6e 2e 32 20 24 73 71 6c 32 20 7b 2f 49 4e 44 45  n.2 $sql2 {/INDE
1760: 58 20 69 32 2f 7d 0a 7d 0a 0a 0a 0a 66 69 6e 69  X i2/}.}....fini
1770: 73 68 5f 74 65 73 74 0a 0a 0a 0a                 sh_test....