/ Hex Artifact Content
Login

Artifact 3f7904d623ef8dc6e55f2206db5ce0549077b438:


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 23 73   ORDER BY}.}..#s
0f00: 65 74 20 73 71 6c 69 74 65 5f 77 68 65 72 65 5f  et sqlite_where_
0f10: 74 72 61 63 65 20 30 78 66 66 66 0a 64 6f 5f 65  trace 0xfff.do_e
0f20: 71 70 5f 74 65 73 74 20 37 2e 33 20 7b 0a 20 20  qp_test 7.3 {.  
0f30: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
0f40: 4d 20 74 31 0a 20 20 57 48 45 52 45 20 28 2b 62  M t1.  WHERE (+b
0f50: 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 63 20 4e   IS NULL AND c N
0f60: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 64 20 4e 4f  OT NULL AND d NO
0f70: 54 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 20 20  T NULL).        
0f80: 4f 52 20 28 62 20 4e 4f 54 20 4e 55 4c 4c 20 41  OR (b NOT NULL A
0f90: 4e 44 20 63 20 49 53 20 4e 55 4c 4c 20 41 4e 44  ND c IS NULL AND
0fa0: 20 64 20 4e 4f 54 20 4e 55 4c 4c 29 0a 20 20 20   d NOT NULL).   
0fb0: 20 20 20 20 20 4f 52 20 28 62 20 4e 4f 54 20 4e       OR (b NOT N
0fc0: 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 4e 55  ULL AND c NOT NU
0fd0: 4c 4c 20 41 4e 44 20 64 20 49 53 20 4e 55 4c 4c  LL AND d IS NULL
0fe0: 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  ).} {.  0 0 0 {S
0ff0: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 7d 0a  CAN TABLE t1}.}.
1000: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 0a 72 65  -----------.#.re
1050: 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71  set_db.do_execsq
1060: 6c 5f 74 65 73 74 20 38 2e 31 20 7b 0a 20 20 43  l_test 8.1 {.  C
1070: 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 6d 70  REATE TABLE comp
1080: 6f 73 65 72 28 0a 20 20 20 20 63 69 64 20 49 4e  oser(.    cid IN
1090: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
10a0: 59 2c 0a 20 20 20 20 63 6e 61 6d 65 20 54 45 58  Y,.    cname TEX
10b0: 54 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20  T.  );.  CREATE 
10c0: 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a 20 20 20  TABLE album(.   
10d0: 20 61 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   aid INTEGER PRI
10e0: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 61 6e  MARY KEY,.    an
10f0: 61 6d 65 20 54 45 58 54 0a 20 20 29 3b 0a 20 20  ame TEXT.  );.  
1100: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61  CREATE TABLE tra
1110: 63 6b 28 0a 20 20 20 20 74 69 64 20 49 4e 54 45  ck(.    tid INTE
1120: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1130: 0a 20 20 20 20 63 69 64 20 49 4e 54 45 47 45 52  .    cid INTEGER
1140: 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6d 70   REFERENCES comp
1150: 6f 73 65 72 2c 0a 20 20 20 20 61 69 64 20 49 4e  oser,.    aid IN
1160: 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53  TEGER REFERENCES
1170: 20 61 6c 62 75 6d 2c 0a 20 20 20 20 74 69 74 6c   album,.    titl
1180: 65 20 54 45 58 54 0a 20 20 29 3b 0a 20 20 43 52  e TEXT.  );.  CR
1190: 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63 6b  EATE INDEX track
11a0: 5f 69 31 20 4f 4e 20 74 72 61 63 6b 28 63 69 64  _i1 ON track(cid
11b0: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
11c0: 58 20 74 72 61 63 6b 5f 69 32 20 4f 4e 20 74 72  X track_i2 ON tr
11d0: 61 63 6b 28 61 69 64 29 3b 0a 7d 0a 0a 64 6f 5f  ack(aid);.}..do_
11e0: 65 71 70 5f 74 65 73 74 20 38 2e 32 20 7b 0a 20  eqp_test 8.2 {. 
11f0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
1200: 20 61 6e 61 6d 65 0a 20 20 20 20 46 52 4f 4d 20   aname.    FROM 
1210: 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f 73 65 72 2c  album, composer,
1220: 20 74 72 61 63 6b 0a 20 20 20 57 48 45 52 45 20   track.   WHERE 
1230: 63 6e 61 6d 65 20 4c 49 4b 45 20 27 25 62 61 63  cname LIKE '%bac
1240: 68 25 27 0a 20 20 20 20 20 41 4e 44 20 75 6e 6c  h%'.     AND unl
1250: 69 6b 65 6c 79 28 63 6f 6d 70 6f 73 65 72 2e 63  ikely(composer.c
1260: 69 64 3d 74 72 61 63 6b 2e 63 69 64 29 0a 20 20  id=track.cid).  
1270: 20 20 20 41 4e 44 20 75 6e 6c 69 6b 65 6c 79 28     AND unlikely(
1280: 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61 63 6b 2e  album.aid=track.
1290: 61 69 64 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  aid);.} {.  0 0 
12a0: 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 72  2 {SCAN TABLE tr
12b0: 61 63 6b 7d 20 0a 20 20 30 20 31 20 30 20 7b 53  ack} .  0 1 0 {S
12c0: 45 41 52 43 48 20 54 41 42 4c 45 20 61 6c 62 75  EARCH TABLE albu
12d0: 6d 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  m USING INTEGER 
12e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
12f0: 69 64 3d 3f 29 7d 0a 20 20 30 20 32 20 31 20 7b  id=?)}.  0 2 1 {
1300: 53 45 41 52 43 48 20 54 41 42 4c 45 20 63 6f 6d  SEARCH TABLE com
1310: 70 6f 73 65 72 20 55 53 49 4e 47 20 49 4e 54 45  poser USING INTE
1320: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
1330: 28 72 6f 77 69 64 3d 3f 29 7d 0a 20 20 30 20 30  (rowid=?)}.  0 0
1340: 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54   0 {USE TEMP B-T
1350: 52 45 45 20 46 4f 52 20 44 49 53 54 49 4e 43 54  REE FOR DISTINCT
1360: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
1370: 2d 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 0a  ---------------.
13b0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
13c0: 74 20 39 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 9.1 {.  CREATE
13d0: 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20 61   TABLE t1(.    a
13e0: 2c 62 2c 63 2c 64 2c 65 2c 20 66 2c 67 2c 68 2c  ,b,c,d,e, f,g,h,
13f0: 69 2c 6a 2c 0a 20 20 20 20 6b 2c 6c 2c 6d 2c 6e  i,j,.    k,l,m,n
1400: 2c 6f 2c 20 70 2c 71 2c 72 2c 73 2c 74 0a 20 20  ,o, p,q,r,s,t.  
1410: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
1420: 58 20 69 31 20 4f 4e 20 74 31 28 6b 2c 6c 2c 6d  X i1 ON t1(k,l,m
1430: 2c 6e 2c 6f 2c 70 2c 71 2c 72 2c 73 2c 74 29 3b  ,n,o,p,q,r,s,t);
1440: 0a 7d 0a 64 6f 5f 74 65 73 74 20 39 2e 32 20 7b  .}.do_test 9.2 {
1450: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
1460: 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63   {$i < 100} {inc
1470: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
1480: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1490: 20 74 31 20 44 45 46 41 55 4c 54 20 56 41 4c 55   t1 DEFAULT VALU
14a0: 45 53 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  ES }.  }.  execs
14b0: 71 6c 20 7b 0a 20 20 20 20 41 4e 41 4c 59 5a 45  ql {.    ANALYZE
14c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
14d0: 45 58 20 69 32 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i2 ON t1(a,b,
14e0: 63 2c 64 2c 65 2c 66 2c 67 2c 68 2c 69 2c 6a 29  c,d,e,f,g,h,i,j)
14f0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 73 65 74 20  ;.  }.} {}..set 
1500: 4c 20 5b 6c 69 73 74 20 61 3d 3f 20 62 3d 3f 20  L [list a=? b=? 
1510: 63 3d 3f 20 64 3d 3f 20 65 3d 3f 20 66 3d 3f 20  c=? d=? e=? f=? 
1520: 67 3d 3f 20 68 3d 3f 20 69 3d 3f 20 6a 3d 3f 5d  g=? h=? i=? j=?]
1530: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6e 54 65  .foreach {tn nTe
1540: 72 6d 20 6e 52 6f 77 7d 20 7b 0a 20 20 31 20 20  rm nRow} {.  1  
1550: 20 31 20 31 30 0a 20 20 32 20 20 20 32 20 20 39   1 10.  2   2  9
1560: 0a 20 20 33 20 20 20 33 20 20 38 0a 20 20 34 20  .  3   3  8.  4 
1570: 20 20 34 20 20 37 0a 20 20 35 20 20 20 35 20 20    4  7.  5   5  
1580: 36 0a 20 20 36 20 20 20 36 20 20 35 0a 20 20 37  6.  6   6  5.  7
1590: 20 20 20 37 20 20 35 0a 20 20 38 20 20 20 38 20     7  5.  8   8 
15a0: 20 35 0a 20 20 39 20 20 20 39 20 20 35 0a 20 20   5.  9   9  5.  
15b0: 31 30 20 31 30 20 20 35 0a 7d 20 7b 0a 20 20 73  10 10  5.} {.  s
15c0: 65 74 20 77 20 5b 6a 6f 69 6e 20 5b 6c 72 61 6e  et w [join [lran
15d0: 67 65 20 24 4c 20 30 20 5b 65 78 70 72 20 24 6e  ge $L 0 [expr $n
15e0: 54 65 72 6d 2d 31 5d 5d 20 22 20 41 4e 44 20 22  Term-1]] " AND "
15f0: 5d 0a 20 20 73 65 74 20 70 31 20 5b 65 78 70 72  ].  set p1 [expr
1600: 20 28 24 6e 52 6f 77 2d 31 29 20 2f 20 31 30 30   ($nRow-1) / 100
1610: 2e 30 5d 0a 20 20 73 65 74 20 70 32 20 5b 65 78  .0].  set p2 [ex
1620: 70 72 20 28 24 6e 52 6f 77 2b 31 29 20 2f 20 31  pr ($nRow+1) / 1
1630: 30 30 2e 30 5d 0a 0a 20 20 73 65 74 20 73 71 6c  00.0]..  set sql
1640: 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  1 "SELECT * FROM
1650: 20 74 31 20 57 48 45 52 45 20 6c 69 6b 65 6c 69   t1 WHERE likeli
1660: 68 6f 6f 64 28 6b 3d 3f 2c 20 24 70 31 29 20 41  hood(k=?, $p1) A
1670: 4e 44 20 24 77 22 0a 20 20 73 65 74 20 73 71 6c  ND $w".  set sql
1680: 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 "SELECT * FROM
1690: 20 74 31 20 57 48 45 52 45 20 6c 69 6b 65 6c 69   t1 WHERE likeli
16a0: 68 6f 6f 64 28 6b 3d 3f 2c 20 24 70 32 29 20 41  hood(k=?, $p2) A
16b0: 4e 44 20 24 77 22 0a 0a 20 20 64 6f 5f 65 71 70  ND $w"..  do_eqp
16c0: 5f 74 65 73 74 20 39 2e 33 2e 24 74 6e 2e 31 20  _test 9.3.$tn.1 
16d0: 24 73 71 6c 31 20 7b 2f 49 4e 44 45 58 20 69 31  $sql1 {/INDEX i1
16e0: 2f 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74  /}.  do_eqp_test
16f0: 20 39 2e 33 2e 24 74 6e 2e 32 20 24 73 71 6c 32   9.3.$tn.2 $sql2
1700: 20 7b 2f 49 4e 44 45 58 20 69 32 2f 7d 0a 7d 0a   {/INDEX i2/}.}.
1710: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a  ...finish_test..
1720: 0a 0a                                            ..