/ Hex Artifact Content
Login

Artifact dde4c52a97385a55be6a7cd46be8373f0cf35501:


0000: 23 20 32 30 31 33 2d 30 39 2d 30 35 0a 23 0a 23  # 2013-09-05.#.#
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 23 20 54 65 73 74 20 63 61 73  **.# .# Test cas
0170: 65 73 20 66 6f 72 20 71 75 65 72 79 20 70 6c 61  es for query pla
0180: 6e 6e 69 6e 67 20 64 65 63 69 73 69 6f 6e 73 20  nning decisions 
0190: 61 6e 64 20 74 68 65 20 6c 69 6b 65 6c 79 28 29  and the likely()
01a0: 2c 20 75 6e 6c 69 6b 65 6c 79 28 29 2c 20 61 6e  , unlikely(), an
01b0: 64 0a 23 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  d.# likelihood()
01c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 0a 73 65 74   functions...set
01d0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
01e0: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
01f0: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
0200: 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65  ester.tcl.set te
0210: 73 74 70 72 65 66 69 78 20 77 68 65 72 65 47 0a  stprefix whereG.
0220: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0230: 20 77 68 65 72 65 47 2d 31 2e 30 20 7b 0a 20 20   whereG-1.0 {.  
0240: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 6d  CREATE TABLE com
0250: 70 6f 73 65 72 28 0a 20 20 20 20 63 69 64 20 49  poser(.    cid I
0260: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0270: 45 59 2c 0a 20 20 20 20 63 6e 61 6d 65 20 54 45  EY,.    cname TE
0280: 58 54 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45  XT.  );.  CREATE
0290: 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a 20 20   TABLE album(.  
02a0: 20 20 61 69 64 20 49 4e 54 45 47 45 52 20 50 52    aid INTEGER PR
02b0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 61  IMARY KEY,.    a
02c0: 6e 61 6d 65 20 54 45 58 54 0a 20 20 29 3b 0a 20  name TEXT.  );. 
02d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
02e0: 61 63 6b 28 0a 20 20 20 20 74 69 64 20 49 4e 54  ack(.    tid INT
02f0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0300: 2c 0a 20 20 20 20 63 69 64 20 49 4e 54 45 47 45  ,.    cid INTEGE
0310: 52 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6d  R REFERENCES com
0320: 70 6f 73 65 72 2c 0a 20 20 20 20 61 69 64 20 49  poser,.    aid I
0330: 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45  NTEGER REFERENCE
0340: 53 20 61 6c 62 75 6d 2c 0a 20 20 20 20 74 69 74  S album,.    tit
0350: 6c 65 20 54 45 58 54 0a 20 20 29 3b 0a 20 20 43  le TEXT.  );.  C
0360: 52 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63  REATE INDEX trac
0370: 6b 5f 69 31 20 4f 4e 20 74 72 61 63 6b 28 63 69  k_i1 ON track(ci
0380: 64 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  d);.  CREATE IND
0390: 45 58 20 74 72 61 63 6b 5f 69 32 20 4f 4e 20 74  EX track_i2 ON t
03a0: 72 61 63 6b 28 61 69 64 29 3b 0a 20 20 49 4e 53  rack(aid);.  INS
03b0: 45 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f 73 65  ERT INTO compose
03c0: 72 20 56 41 4c 55 45 53 28 31 2c 20 27 57 2e 20  r VALUES(1, 'W. 
03d0: 41 2e 20 4d 6f 7a 61 72 74 27 29 3b 0a 20 20 49  A. Mozart');.  I
03e0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f  NSERT INTO compo
03f0: 73 65 72 20 56 41 4c 55 45 53 28 32 2c 20 27 42  ser VALUES(2, 'B
0400: 65 65 74 68 6f 76 65 6e 27 29 3b 0a 20 20 49 4e  eethoven');.  IN
0410: 53 45 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f 73  SERT INTO compos
0420: 65 72 20 56 41 4c 55 45 53 28 33 2c 20 27 54 68  er VALUES(3, 'Th
0430: 6f 6d 61 73 20 54 61 6c 6c 69 73 27 29 3b 0a 20  omas Tallis');. 
0440: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 6d   INSERT INTO com
0450: 70 6f 73 65 72 20 56 41 4c 55 45 53 28 34 2c 20  poser VALUES(4, 
0460: 27 4a 6f 73 65 70 68 20 48 61 79 64 65 6e 27 29  'Joseph Hayden')
0470: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0480: 63 6f 6d 70 6f 73 65 72 20 56 41 4c 55 45 53 28  composer VALUES(
0490: 35 2c 20 27 54 68 6f 6d 61 73 20 57 65 65 6c 6b  5, 'Thomas Weelk
04a0: 65 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  es');.  INSERT I
04b0: 4e 54 4f 20 63 6f 6d 70 6f 73 65 72 20 56 41 4c  NTO composer VAL
04c0: 55 45 53 28 36 2c 20 27 4a 2e 20 53 2e 20 42 61  UES(6, 'J. S. Ba
04d0: 63 68 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ch');.  INSERT I
04e0: 4e 54 4f 20 63 6f 6d 70 6f 73 65 72 20 56 41 4c  NTO composer VAL
04f0: 55 45 53 28 37 2c 20 27 4f 72 6c 61 6e 64 6f 20  UES(7, 'Orlando 
0500: 47 69 62 62 6f 6e 73 27 29 3b 0a 20 20 49 4e 53  Gibbons');.  INS
0510: 45 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f 73 65  ERT INTO compose
0520: 72 20 56 41 4c 55 45 53 28 38 2c 20 27 4a 6f 73  r VALUES(8, 'Jos
0530: 71 75 69 6e 20 64 65 73 20 50 72 c3 a9 73 27 29  quin des Pr..s')
0540: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0550: 63 6f 6d 70 6f 73 65 72 20 56 41 4c 55 45 53 28  composer VALUES(
0560: 39 2c 20 27 42 79 72 64 27 29 3b 0a 20 20 49 4e  9, 'Byrd');.  IN
0570: 53 45 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f 73  SERT INTO compos
0580: 65 72 20 56 41 4c 55 45 53 28 31 30 2c 20 27 46  er VALUES(10, 'F
0590: 72 61 6e 63 69 73 20 50 6f 75 6c 65 6e 63 27 29  rancis Poulenc')
05a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
05b0: 63 6f 6d 70 6f 73 65 72 20 56 41 4c 55 45 53 28  composer VALUES(
05c0: 31 31 2c 20 27 4d 65 6e 64 65 6c 73 73 68 6f 6e  11, 'Mendelsshon
05d0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
05e0: 4f 20 63 6f 6d 70 6f 73 65 72 20 56 41 4c 55 45  O composer VALUE
05f0: 53 28 31 32 2c 20 27 5a 6f 6c 74 c3 a1 6e 20 4b  S(12, 'Zolt..n K
0600: 6f 64 c3 a1 6c 79 27 29 3b 0a 20 20 49 4e 53 45  od..ly');.  INSE
0610: 52 54 20 49 4e 54 4f 20 63 6f 6d 70 6f 73 65 72  RT INTO composer
0620: 20 56 41 4c 55 45 53 28 31 33 2c 20 27 48 61 6e   VALUES(13, 'Han
0630: 64 65 6c 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  del');.  INSERT 
0640: 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41 4c 55 45  INTO album VALUE
0650: 53 28 31 30 30 2c 20 27 4b 6f 64 c3 a1 6c 79 3a  S(100, 'Kod..ly:
0660: 20 4d 69 73 73 61 20 42 72 65 76 69 73 27 29 3b   Missa Brevis');
0670: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
0680: 6c 62 75 6d 20 56 41 4c 55 45 53 28 31 30 31 2c  lbum VALUES(101,
0690: 20 27 4d 65 73 73 69 61 68 27 29 3b 0a 20 20 49   'Messiah');.  I
06a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d  NSERT INTO album
06b0: 20 56 41 4c 55 45 53 28 31 30 32 2c 20 27 4d 69   VALUES(102, 'Mi
06c0: 73 73 61 20 42 72 65 76 69 73 20 69 6e 20 44 2d  ssa Brevis in D-
06d0: 2c 20 4b 2e 36 35 27 29 3b 0a 20 20 49 4e 53 45  , K.65');.  INSE
06e0: 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41  RT INTO album VA
06f0: 4c 55 45 53 28 31 30 33 2c 20 27 54 68 65 20 63  LUES(103, 'The c
0700: 6f 6d 70 6c 65 74 65 20 45 6e 67 6c 69 73 68 20  omplete English 
0710: 61 6e 74 68 65 6d 73 27 29 3b 0a 20 20 49 4e 53  anthems');.  INS
0720: 45 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56  ERT INTO album V
0730: 41 4c 55 45 53 28 31 30 34 2c 20 27 4d 61 73 73  ALUES(104, 'Mass
0740: 20 69 6e 20 42 20 4d 69 6e 6f 72 2c 20 42 57 56   in B Minor, BWV
0750: 20 32 33 32 27 29 3b 0a 20 20 49 4e 53 45 52 54   232');.  INSERT
0760: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
0770: 45 53 28 31 30 30 30 35 2c 20 31 32 2c 20 31 30  ES(10005, 12, 10
0780: 30 2c 20 27 53 61 6e 63 74 75 73 27 29 3b 0a 20  0, 'Sanctus');. 
0790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
07a0: 63 6b 20 56 41 4c 55 45 53 28 31 30 30 30 37 2c  ck VALUES(10007,
07b0: 20 31 32 2c 20 31 30 30 2c 20 27 41 67 6e 75 73   12, 100, 'Agnus
07c0: 20 44 65 69 27 29 3b 0a 20 20 49 4e 53 45 52 54   Dei');.  INSERT
07d0: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
07e0: 45 53 28 31 30 31 31 35 2c 20 31 33 2c 20 31 30  ES(10115, 13, 10
07f0: 31 2c 20 27 53 75 72 65 6c 79 20 48 65 20 48 61  1, 'Surely He Ha
0800: 74 68 20 42 6f 72 6e 65 20 4f 75 72 20 47 72 69  th Borne Our Gri
0810: 65 66 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  efs');.  INSERT 
0820: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
0830: 53 28 31 30 31 32 39 2c 20 31 33 2c 20 31 30 31  S(10129, 13, 101
0840: 2c 20 27 53 69 6e 63 65 20 42 79 20 4d 61 6e 20  , 'Since By Man 
0850: 43 61 6d 65 20 44 65 61 74 68 27 29 3b 0a 20 20  Came Death');.  
0860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
0870: 6b 20 56 41 4c 55 45 53 28 31 30 32 30 36 2c 20  k VALUES(10206, 
0880: 31 2c 20 31 30 32 2c 20 27 41 67 6e 75 73 20 44  1, 102, 'Agnus D
0890: 65 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ei');.  INSERT I
08a0: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
08b0: 28 31 30 33 30 31 2c 20 33 2c 20 31 30 33 2c 20  (10301, 3, 103, 
08c0: 27 49 66 20 59 65 20 4c 6f 76 65 20 4d 65 27 29  'If Ye Love Me')
08d0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
08e0: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 30 34  track VALUES(104
08f0: 30 32 2c 20 36 2c 20 31 30 34 2c 20 27 44 6f 6d  02, 6, 104, 'Dom
0900: 69 6e 65 20 44 65 75 73 27 29 3b 0a 20 20 49 4e  ine Deus');.  IN
0910: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
0920: 56 41 4c 55 45 53 28 31 30 34 30 33 2c 20 36 2c  VALUES(10403, 6,
0930: 20 31 30 34 2c 20 27 51 75 69 20 74 6f 6c 6c 69   104, 'Qui tolli
0940: 73 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70  s');.} {}.do_eqp
0950: 5f 74 65 73 74 20 77 68 65 72 65 47 2d 31 2e 31  _test whereG-1.1
0960: 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54   {.  SELECT DIST
0970: 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20 46  INCT aname.    F
0980: 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f  ROM album, compo
0990: 73 65 72 2c 20 74 72 61 63 6b 0a 20 20 20 57 48  ser, track.   WH
09a0: 45 52 45 20 75 6e 6c 69 6b 65 6c 79 28 63 6e 61  ERE unlikely(cna
09b0: 6d 65 20 4c 49 4b 45 20 27 25 62 61 63 68 25 27  me LIKE '%bach%'
09c0: 29 0a 20 20 20 20 20 41 4e 44 20 63 6f 6d 70 6f  ).     AND compo
09d0: 73 65 72 2e 63 69 64 3d 74 72 61 63 6b 2e 63 69  ser.cid=track.ci
09e0: 64 0a 20 20 20 20 20 41 4e 44 20 61 6c 62 75 6d  d.     AND album
09f0: 2e 61 69 64 3d 74 72 61 63 6b 2e 61 69 64 3b 0a  .aid=track.aid;.
0a00: 7d 20 7b 2f 2e 2a 63 6f 6d 70 6f 73 65 72 2e 2a  } {/.*composer.*
0a10: 74 72 61 63 6b 2e 2a 61 6c 62 75 6d 2e 2a 2f 7d  track.*album.*/}
0a20: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0a30: 20 77 68 65 72 65 47 2d 31 2e 32 20 7b 0a 20 20   whereG-1.2 {.  
0a40: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0a50: 61 6e 61 6d 65 0a 20 20 20 20 46 52 4f 4d 20 61  aname.    FROM a
0a60: 6c 62 75 6d 2c 20 63 6f 6d 70 6f 73 65 72 2c 20  lbum, composer, 
0a70: 74 72 61 63 6b 0a 20 20 20 57 48 45 52 45 20 75  track.   WHERE u
0a80: 6e 6c 69 6b 65 6c 79 28 63 6e 61 6d 65 20 4c 49  nlikely(cname LI
0a90: 4b 45 20 27 25 62 61 63 68 25 27 29 0a 20 20 20  KE '%bach%').   
0aa0: 20 20 41 4e 44 20 63 6f 6d 70 6f 73 65 72 2e 63    AND composer.c
0ab0: 69 64 3d 74 72 61 63 6b 2e 63 69 64 0a 20 20 20  id=track.cid.   
0ac0: 20 20 41 4e 44 20 61 6c 62 75 6d 2e 61 69 64 3d    AND album.aid=
0ad0: 74 72 61 63 6b 2e 61 69 64 3b 0a 7d 20 7b 7b 4d  track.aid;.} {{M
0ae0: 61 73 73 20 69 6e 20 42 20 4d 69 6e 6f 72 2c 20  ass in B Minor, 
0af0: 42 57 56 20 32 33 32 7d 7d 0a 0a 64 6f 5f 65 71  BWV 232}}..do_eq
0b00: 70 5f 74 65 73 74 20 77 68 65 72 65 47 2d 31 2e  p_test whereG-1.
0b10: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53  3 {.  SELECT DIS
0b20: 54 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20  TINCT aname.    
0b30: 46 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f 6d 70  FROM album, comp
0b40: 6f 73 65 72 2c 20 74 72 61 63 6b 0a 20 20 20 57  oser, track.   W
0b50: 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
0b60: 63 6e 61 6d 65 20 4c 49 4b 45 20 27 25 62 61 63  cname LIKE '%bac
0b70: 68 25 27 2c 20 30 2e 35 29 0a 20 20 20 20 20 41  h%', 0.5).     A
0b80: 4e 44 20 63 6f 6d 70 6f 73 65 72 2e 63 69 64 3d  ND composer.cid=
0b90: 74 72 61 63 6b 2e 63 69 64 0a 20 20 20 20 20 41  track.cid.     A
0ba0: 4e 44 20 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61  ND album.aid=tra
0bb0: 63 6b 2e 61 69 64 3b 0a 7d 20 7b 2f 2e 2a 74 72  ck.aid;.} {/.*tr
0bc0: 61 63 6b 2e 2a 63 6f 6d 70 6f 73 65 72 2e 2a 61  ack.*composer.*a
0bd0: 6c 62 75 6d 2e 2a 2f 7d 0a 64 6f 5f 65 78 65 63  lbum.*/}.do_exec
0be0: 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 47 2d  sql_test whereG-
0bf0: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 44  1.4 {.  SELECT D
0c00: 49 53 54 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20  ISTINCT aname.  
0c10: 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f    FROM album, co
0c20: 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b 0a 20 20  mposer, track.  
0c30: 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
0c40: 64 28 63 6e 61 6d 65 20 4c 49 4b 45 20 27 25 62  d(cname LIKE '%b
0c50: 61 63 68 25 27 2c 20 30 2e 35 29 0a 20 20 20 20  ach%', 0.5).    
0c60: 20 41 4e 44 20 63 6f 6d 70 6f 73 65 72 2e 63 69   AND composer.ci
0c70: 64 3d 74 72 61 63 6b 2e 63 69 64 0a 20 20 20 20  d=track.cid.    
0c80: 20 41 4e 44 20 61 6c 62 75 6d 2e 61 69 64 3d 74   AND album.aid=t
0c90: 72 61 63 6b 2e 61 69 64 3b 0a 7d 20 7b 7b 4d 61  rack.aid;.} {{Ma
0ca0: 73 73 20 69 6e 20 42 20 4d 69 6e 6f 72 2c 20 42  ss in B Minor, B
0cb0: 57 56 20 32 33 32 7d 7d 0a 0a 64 6f 5f 65 71 70  WV 232}}..do_eqp
0cc0: 5f 74 65 73 74 20 77 68 65 72 65 47 2d 31 2e 35  _test whereG-1.5
0cd0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54   {.  SELECT DIST
0ce0: 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20 46  INCT aname.    F
0cf0: 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f  ROM album, compo
0d00: 73 65 72 2c 20 74 72 61 63 6b 0a 20 20 20 57 48  ser, track.   WH
0d10: 45 52 45 20 63 6e 61 6d 65 20 4c 49 4b 45 20 27  ERE cname LIKE '
0d20: 25 62 61 63 68 25 27 0a 20 20 20 20 20 41 4e 44  %bach%'.     AND
0d30: 20 63 6f 6d 70 6f 73 65 72 2e 63 69 64 3d 74 72   composer.cid=tr
0d40: 61 63 6b 2e 63 69 64 0a 20 20 20 20 20 41 4e 44  ack.cid.     AND
0d50: 20 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61 63 6b   album.aid=track
0d60: 2e 61 69 64 3b 0a 7d 20 7b 2f 2e 2a 74 72 61 63  .aid;.} {/.*trac
0d70: 6b 2e 2a 28 63 6f 6d 70 6f 73 65 72 2e 2a 61 6c  k.*(composer.*al
0d80: 62 75 6d 7c 61 6c 62 75 6d 2e 2a 63 6f 6d 70 6f  bum|album.*compo
0d90: 73 65 72 29 2e 2a 2f 7d 0a 64 6f 5f 65 78 65 63  ser).*/}.do_exec
0da0: 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 47 2d  sql_test whereG-
0db0: 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 44  1.6 {.  SELECT D
0dc0: 49 53 54 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20  ISTINCT aname.  
0dd0: 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f    FROM album, co
0de0: 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b 0a 20 20  mposer, track.  
0df0: 20 57 48 45 52 45 20 63 6e 61 6d 65 20 4c 49 4b   WHERE cname LIK
0e00: 45 20 27 25 62 61 63 68 25 27 0a 20 20 20 20 20  E '%bach%'.     
0e10: 41 4e 44 20 63 6f 6d 70 6f 73 65 72 2e 63 69 64  AND composer.cid
0e20: 3d 74 72 61 63 6b 2e 63 69 64 0a 20 20 20 20 20  =track.cid.     
0e30: 41 4e 44 20 61 6c 62 75 6d 2e 61 69 64 3d 74 72  AND album.aid=tr
0e40: 61 63 6b 2e 61 69 64 3b 0a 7d 20 7b 7b 4d 61 73  ack.aid;.} {{Mas
0e50: 73 20 69 6e 20 42 20 4d 69 6e 6f 72 2c 20 42 57  s in B Minor, BW
0e60: 56 20 32 33 32 7d 7d 0a 0a 64 6f 5f 65 71 70 5f  V 232}}..do_eqp_
0e70: 74 65 73 74 20 77 68 65 72 65 47 2d 31 2e 37 20  test whereG-1.7 
0e80: 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  {.  SELECT DISTI
0e90: 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20 46 52  NCT aname.    FR
0ea0: 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f 73  OM album, compos
0eb0: 65 72 2c 20 74 72 61 63 6b 0a 20 20 20 57 48 45  er, track.   WHE
0ec0: 52 45 20 63 6e 61 6d 65 20 4c 49 4b 45 20 27 25  RE cname LIKE '%
0ed0: 62 61 63 68 25 27 0a 20 20 20 20 20 41 4e 44 20  bach%'.     AND 
0ee0: 75 6e 6c 69 6b 65 6c 79 28 63 6f 6d 70 6f 73 65  unlikely(compose
0ef0: 72 2e 63 69 64 3d 74 72 61 63 6b 2e 63 69 64 29  r.cid=track.cid)
0f00: 0a 20 20 20 20 20 41 4e 44 20 75 6e 6c 69 6b 65  .     AND unlike
0f10: 6c 79 28 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61  ly(album.aid=tra
0f20: 63 6b 2e 61 69 64 29 3b 0a 7d 20 7b 2f 2e 2a 74  ck.aid);.} {/.*t
0f30: 72 61 63 6b 2e 2a 28 63 6f 6d 70 6f 73 65 72 2e  rack.*(composer.
0f40: 2a 61 6c 62 75 6d 7c 61 6c 62 75 6d 2e 2a 63 6f  *album|album.*co
0f50: 6d 70 6f 73 65 72 29 2e 2a 2f 7d 0a 64 6f 5f 65  mposer).*/}.do_e
0f60: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72  xecsql_test wher
0f70: 65 47 2d 31 2e 38 20 7b 0a 20 20 53 45 4c 45 43  eG-1.8 {.  SELEC
0f80: 54 20 44 49 53 54 49 4e 43 54 20 61 6e 61 6d 65  T DISTINCT aname
0f90: 0a 20 20 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c  .    FROM album,
0fa0: 20 63 6f 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b   composer, track
0fb0: 0a 20 20 20 57 48 45 52 45 20 63 6e 61 6d 65 20  .   WHERE cname 
0fc0: 4c 49 4b 45 20 27 25 62 61 63 68 25 27 0a 20 20  LIKE '%bach%'.  
0fd0: 20 20 20 41 4e 44 20 75 6e 6c 69 6b 65 6c 79 28     AND unlikely(
0fe0: 63 6f 6d 70 6f 73 65 72 2e 63 69 64 3d 74 72 61  composer.cid=tra
0ff0: 63 6b 2e 63 69 64 29 0a 20 20 20 20 20 41 4e 44  ck.cid).     AND
1000: 20 75 6e 6c 69 6b 65 6c 79 28 61 6c 62 75 6d 2e   unlikely(album.
1010: 61 69 64 3d 74 72 61 63 6b 2e 61 69 64 29 3b 0a  aid=track.aid);.
1020: 7d 20 7b 7b 4d 61 73 73 20 69 6e 20 42 20 4d 69  } {{Mass in B Mi
1030: 6e 6f 72 2c 20 42 57 56 20 32 33 32 7d 7d 0a 0a  nor, BWV 232}}..
1040: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 47 2d 32  do_test whereG-2
1050: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
1060: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
1070: 54 49 4e 43 54 20 61 6e 61 6d 65 0a 20 20 20 20  TINCT aname.    
1080: 20 20 46 52 4f 4d 20 61 6c 62 75 6d 2c 20 63 6f    FROM album, co
1090: 6d 70 6f 73 65 72 2c 20 74 72 61 63 6b 0a 20 20  mposer, track.  
10a0: 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
10b0: 6f 6f 64 28 63 6e 61 6d 65 20 4c 49 4b 45 20 27  ood(cname LIKE '
10c0: 25 62 61 63 68 25 27 2c 20 2d 30 2e 30 31 29 0a  %bach%', -0.01).
10d0: 20 20 20 20 20 20 20 41 4e 44 20 63 6f 6d 70 6f         AND compo
10e0: 73 65 72 2e 63 69 64 3d 74 72 61 63 6b 2e 63 69  ser.cid=track.ci
10f0: 64 0a 20 20 20 20 20 20 20 41 4e 44 20 61 6c 62  d.       AND alb
1100: 75 6d 2e 61 69 64 3d 74 72 61 63 6b 2e 61 69 64  um.aid=track.aid
1110: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 73 65 63 6f  ;.  }.} {1 {seco
1120: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c  nd argument to l
1130: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74  ikelihood() must
1140: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 62   be a constant b
1150: 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31  etween 0.0 and 1
1160: 2e 30 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  .0}}.do_test whe
1170: 72 65 47 2d 32 2e 32 20 7b 0a 20 20 63 61 74 63  reG-2.2 {.  catc
1180: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
1190: 54 20 44 49 53 54 49 4e 43 54 20 61 6e 61 6d 65  T DISTINCT aname
11a0: 0a 20 20 20 20 20 20 46 52 4f 4d 20 61 6c 62 75  .      FROM albu
11b0: 6d 2c 20 63 6f 6d 70 6f 73 65 72 2c 20 74 72 61  m, composer, tra
11c0: 63 6b 0a 20 20 20 20 20 57 48 45 52 45 20 6c 69  ck.     WHERE li
11d0: 6b 65 6c 69 68 6f 6f 64 28 63 6e 61 6d 65 20 4c  kelihood(cname L
11e0: 49 4b 45 20 27 25 62 61 63 68 25 27 2c 20 31 2e  IKE '%bach%', 1.
11f0: 30 31 29 0a 20 20 20 20 20 20 20 41 4e 44 20 63  01).       AND c
1200: 6f 6d 70 6f 73 65 72 2e 63 69 64 3d 74 72 61 63  omposer.cid=trac
1210: 6b 2e 63 69 64 0a 20 20 20 20 20 20 20 41 4e 44  k.cid.       AND
1220: 20 61 6c 62 75 6d 2e 61 69 64 3d 74 72 61 63 6b   album.aid=track
1230: 2e 61 69 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  .aid;.  }.} {1 {
1240: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1250: 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  to likelihood() 
1260: 6d 75 73 74 20 62 65 20 61 20 63 6f 6e 73 74 61  must be a consta
1270: 6e 74 20 62 65 74 77 65 65 6e 20 30 2e 30 20 61  nt between 0.0 a
1280: 6e 64 20 31 2e 30 7d 7d 0a 64 6f 5f 74 65 73 74  nd 1.0}}.do_test
1290: 20 77 68 65 72 65 47 2d 32 2e 33 20 7b 0a 20 20   whereG-2.3 {.  
12a0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
12b0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61  ELECT DISTINCT a
12c0: 6e 61 6d 65 0a 20 20 20 20 20 20 46 52 4f 4d 20  name.      FROM 
12d0: 61 6c 62 75 6d 2c 20 63 6f 6d 70 6f 73 65 72 2c  album, composer,
12e0: 20 74 72 61 63 6b 0a 20 20 20 20 20 57 48 45 52   track.     WHER
12f0: 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 63 6e 61  E likelihood(cna
1300: 6d 65 20 4c 49 4b 45 20 27 25 62 61 63 68 25 27  me LIKE '%bach%'
1310: 2c 20 74 72 61 63 6b 2e 63 69 64 29 0a 20 20 20  , track.cid).   
1320: 20 20 20 20 41 4e 44 20 63 6f 6d 70 6f 73 65 72      AND composer
1330: 2e 63 69 64 3d 74 72 61 63 6b 2e 63 69 64 0a 20  .cid=track.cid. 
1340: 20 20 20 20 20 20 41 4e 44 20 61 6c 62 75 6d 2e        AND album.
1350: 61 69 64 3d 74 72 61 63 6b 2e 61 69 64 3b 0a 20  aid=track.aid;. 
1360: 20 7d 0a 7d 20 7b 31 20 7b 73 65 63 6f 6e 64 20   }.} {1 {second 
1370: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65  argument to like
1380: 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62 65  lihood() must be
1390: 20 61 20 63 6f 6e 73 74 61 6e 74 20 62 65 74 77   a constant betw
13a0: 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30 7d  een 0.0 and 1.0}
13b0: 7d 0a 0a 23 20 43 6f 6d 6d 75 74 69 6e 67 20 61  }..# Commuting a
13c0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
13d0: 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  RE clause should
13e0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
13f0: 71 75 65 72 79 20 70 6c 61 6e 0a 23 0a 64 6f 5f  query plan.#.do_
1400: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65  execsql_test whe
1410: 72 65 47 2d 33 2e 30 20 7b 0a 20 20 43 52 45 41  reG-3.0 {.  CREA
1420: 54 45 20 54 41 42 4c 45 20 61 28 61 31 20 50 52  TE TABLE a(a1 PR
1430: 49 4d 41 52 59 20 4b 45 59 2c 20 61 32 29 3b 0a  IMARY KEY, a2);.
1440: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
1450: 28 62 31 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  (b1 PRIMARY KEY,
1460: 20 62 32 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 71   b2);.} {}.do_eq
1470: 70 5f 74 65 73 74 20 77 68 65 72 65 47 2d 33 2e  p_test whereG-3.
1480: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  1 {.  SELECT * F
1490: 52 4f 4d 20 61 2c 20 62 20 57 48 45 52 45 20 62  ROM a, b WHERE b
14a0: 31 3d 61 31 20 41 4e 44 20 61 32 3d 35 3b 0a 7d  1=a1 AND a2=5;.}
14b0: 20 7b 2f 2e 2a 53 43 41 4e 20 54 41 42 4c 45 20   {/.*SCAN TABLE 
14c0: 61 2e 2a 53 45 41 52 43 48 20 54 41 42 4c 45 20  a.*SEARCH TABLE 
14d0: 62 20 55 53 49 4e 47 20 49 4e 44 45 58 20 2e 2a  b USING INDEX .*
14e0: 62 5f 31 20 2e 62 31 3d 2e 2e 2a 2f 7d 0a 64 6f  b_1 .b1=..*/}.do
14f0: 5f 65 71 70 5f 74 65 73 74 20 77 68 65 72 65 47  _eqp_test whereG
1500: 2d 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  -3.2 {.  SELECT 
1510: 2a 20 46 52 4f 4d 20 61 2c 20 62 20 57 48 45 52  * FROM a, b WHER
1520: 45 20 61 31 3d 62 31 20 41 4e 44 20 61 32 3d 35  E a1=b1 AND a2=5
1530: 3b 0a 7d 20 7b 2f 2e 2a 53 43 41 4e 20 54 41 42  ;.} {/.*SCAN TAB
1540: 4c 45 20 61 2e 2a 53 45 41 52 43 48 20 54 41 42  LE a.*SEARCH TAB
1550: 4c 45 20 62 20 55 53 49 4e 47 20 49 4e 44 45 58  LE b USING INDEX
1560: 20 2e 2a 62 5f 31 20 2e 62 31 3d 2e 2e 2a 2f 7d   .*b_1 .b1=..*/}
1570: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 77 68 65  .do_eqp_test whe
1580: 72 65 47 2d 33 2e 33 20 7b 0a 20 20 53 45 4c 45  reG-3.3 {.  SELE
1590: 43 54 20 2a 20 46 52 4f 4d 20 61 2c 20 62 20 57  CT * FROM a, b W
15a0: 48 45 52 45 20 61 32 3d 35 20 41 4e 44 20 62 31  HERE a2=5 AND b1
15b0: 3d 61 31 3b 0a 7d 20 7b 2f 2e 2a 53 43 41 4e 20  =a1;.} {/.*SCAN 
15c0: 54 41 42 4c 45 20 61 2e 2a 53 45 41 52 43 48 20  TABLE a.*SEARCH 
15d0: 54 41 42 4c 45 20 62 20 55 53 49 4e 47 20 49 4e  TABLE b USING IN
15e0: 44 45 58 20 2e 2a 62 5f 31 20 2e 62 31 3d 2e 2e  DEX .*b_1 .b1=..
15f0: 2a 2f 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  */}.do_eqp_test 
1600: 77 68 65 72 65 47 2d 33 2e 34 20 7b 0a 20 20 53  whereG-3.4 {.  S
1610: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 2c 20  ELECT * FROM a, 
1620: 62 20 57 48 45 52 45 20 61 32 3d 35 20 41 4e 44  b WHERE a2=5 AND
1630: 20 61 31 3d 62 31 3b 0a 7d 20 7b 2f 2e 2a 53 43   a1=b1;.} {/.*SC
1640: 41 4e 20 54 41 42 4c 45 20 61 2e 2a 53 45 41 52  AN TABLE a.*SEAR
1650: 43 48 20 54 41 42 4c 45 20 62 20 55 53 49 4e 47  CH TABLE b USING
1660: 20 49 4e 44 45 58 20 2e 2a 62 5f 31 20 2e 62 31   INDEX .*b_1 .b1
1670: 3d 2e 2e 2a 2f 7d 0a 0a 23 20 54 69 63 6b 65 74  =..*/}..# Ticket
1680: 20 5b 31 65 36 34 64 64 37 38 32 61 31 32 36 66   [1e64dd782a126f
1690: 34 38 64 37 38 63 34 33 61 36 36 34 38 34 34 61  48d78c43a664844a
16a0: 34 31 64 30 65 36 33 33 34 65 5d 3a 0a 23 20 49  41d0e6334e]:.# I
16b0: 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20  ncorrect result 
16c0: 69 6e 20 61 20 6e 65 73 74 65 64 20 47 52 4f 55  in a nested GROU
16d0: 50 20 42 59 2f 44 49 53 54 49 4e 43 54 20 64 75  P BY/DISTINCT du
16e0: 65 20 74 6f 20 74 68 65 20 75 73 65 20 6f 66 20  e to the use of 
16f0: 61 6e 20 4f 50 5f 53 43 6f 70 79 0a 23 20 77 68  an OP_SCopy.# wh
1700: 65 72 65 20 61 6e 20 4f 50 5f 43 6f 70 79 20 77  ere an OP_Copy w
1710: 61 73 20 6e 65 65 64 65 64 2e 0a 23 0a 64 6f 5f  as needed..#.do_
1720: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65  execsql_test whe
1730: 72 65 47 2d 34 2e 30 20 7b 0a 20 20 43 52 45 41  reG-4.0 {.  CREA
1740: 54 45 20 54 41 42 4c 45 20 74 34 28 78 29 3b 0a  TE TABLE t4(x);.
1750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
1760: 20 56 41 4c 55 45 53 28 27 72 69 67 68 74 27 29   VALUES('right')
1770: 2c 28 27 77 72 6f 6e 67 27 29 3b 0a 20 20 53 45  ,('wrong');.  SE
1780: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 0a  LECT DISTINCT x.
1790: 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
17a0: 78 20 46 52 4f 4d 20 74 34 20 47 52 4f 55 50 20  x FROM t4 GROUP 
17b0: 42 59 20 78 29 0a 20 20 20 57 48 45 52 45 20 78  BY x).   WHERE x
17c0: 3d 27 72 69 67 68 74 27 0a 20 20 20 4f 52 44 45  ='right'.   ORDE
17d0: 52 20 42 59 20 78 3b 0a 7d 20 7b 72 69 67 68 74  R BY x;.} {right
17e0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
17f0: 2d 2d 2d 2d 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 0a 23 20  -------------.# 
1830: 54 65 73 74 20 74 68 61 74 20 6c 69 6b 65 6c 69  Test that likeli
1840: 68 6f 6f 64 28 29 20 73 70 65 63 69 66 69 63 61  hood() specifica
1850: 74 69 6f 6e 73 20 6f 6e 20 69 6e 64 65 78 65 64  tions on indexed
1860: 20 74 65 72 6d 73 20 61 72 65 20 74 61 6b 65 6e   terms are taken
1870: 20 69 6e 74 6f 20 0a 23 20 61 63 63 6f 75 6e 74   into .# account
1880: 20 62 79 20 76 61 72 69 6f 75 73 20 66 6f 72 6d   by various form
1890: 73 20 6f 66 20 6c 6f 6f 70 73 2e 0a 23 0a 23 20  s of loops..#.# 
18a0: 20 20 35 2e 31 2e 2a 3a 20 6f 70 65 6e 20 65 6e    5.1.*: open en
18b0: 64 65 64 20 72 61 6e 67 65 20 73 63 61 6e 73 0a  ded range scans.
18c0: 23 20 20 20 35 2e 32 2e 2a 3a 20 73 6b 69 70 2d  #   5.2.*: skip-
18d0: 73 63 61 6e 73 0a 23 0a 72 65 73 65 74 5f 64 62  scans.#.reset_db
18e0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
18f0: 74 20 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 5.1 {.  CREATE
1900: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
1910: 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  c);.  CREATE IND
1920: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
1930: 29 3b 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74  );.}.do_eqp_test
1940: 20 35 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43   5.1.2 {.  SELEC
1950: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1960: 45 20 61 3e 3f 0a 7d 20 7b 30 20 30 20 30 20 7b  E a>?.} {0 0 0 {
1970: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
1980: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28  USING INDEX i1 (
1990: 61 3e 3f 29 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65  a>?)}}.do_eqp_te
19a0: 73 74 20 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  st 5.1.3 {.  SEL
19b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
19c0: 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 61  ERE likelihood(a
19d0: 3e 3f 2c 20 30 2e 39 29 0a 7d 20 7b 30 20 30 20  >?, 0.9).} {0 0 
19e0: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
19f0: 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 35  }}.do_eqp_test 5
1a00: 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.4 {.  SELECT 
1a10: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1a20: 6c 69 6b 65 6c 79 28 61 3e 3f 29 0a 7d 20 7b 30  likely(a>?).} {0
1a30: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
1a40: 20 74 31 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 35   t1}}..do_test 5
1a50: 2e 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20  .2 {.  for {set 
1a60: 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20  i 0} {$i < 100} 
1a70: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
1a80: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
1a90: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
1aa0: 61 62 63 27 2c 20 24 69 2c 20 24 69 29 3b 20 7d  abc', $i, $i); }
1ab0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
1ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1ad0: 53 45 4c 45 43 54 20 27 64 65 66 27 2c 20 62 2c  SELECT 'def', b,
1ae0: 20 63 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20   c FROM t1; }.  
1af0: 65 78 65 63 73 71 6c 20 7b 20 41 4e 41 4c 59 5a  execsql { ANALYZ
1b00: 45 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 71 70 5f  E }.} {}.do_eqp_
1b10: 74 65 73 74 20 35 2e 32 2e 32 20 7b 0a 20 20 53  test 5.2.2 {.  S
1b20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1b30: 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1b40: 28 62 3e 3f 2c 20 30 2e 30 31 29 0a 7d 20 7b 30  (b>?, 0.01).} {0
1b50: 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   0 0 {SEARCH TAB
1b60: 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45  LE t1 USING INDE
1b70: 58 20 69 31 20 28 41 4e 59 28 61 29 20 41 4e 44  X i1 (ANY(a) AND
1b80: 20 62 3e 3f 29 7d 7d 0a 64 6f 5f 65 71 70 5f 74   b>?)}}.do_eqp_t
1b90: 65 73 74 20 35 2e 32 2e 33 20 7b 0a 20 20 53 45  est 5.2.3 {.  SE
1ba0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1bb0: 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1bc0: 62 3e 3f 2c 20 30 2e 39 29 0a 7d 20 7b 30 20 30  b>?, 0.9).} {0 0
1bd0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
1be0: 31 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  1}}.do_eqp_test 
1bf0: 35 2e 32 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  5.2.4 {.  SELECT
1c00: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1c10: 20 6c 69 6b 65 6c 79 28 62 3e 3f 29 0a 7d 20 7b   likely(b>?).} {
1c20: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
1c30: 45 20 74 31 7d 7d 0a 0a 64 6f 5f 65 71 70 5f 74  E t1}}..do_eqp_t
1c40: 65 73 74 20 35 2e 33 2e 31 20 7b 0a 20 20 53 45  est 5.3.1 {.  SE
1c50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1c60: 48 45 52 45 20 61 3d 3f 0a 7d 20 7b 30 20 30 20  HERE a=?.} {0 0 
1c70: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
1c80: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
1c90: 31 20 28 61 3d 3f 29 7d 7d 0a 64 6f 5f 65 71 70  1 (a=?)}}.do_eqp
1ca0: 5f 74 65 73 74 20 35 2e 33 2e 32 20 7b 0a 20 20  _test 5.3.2 {.  
1cb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1cc0: 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1cd0: 64 28 61 3d 3f 2c 20 30 2e 39 29 0a 7d 20 7b 30  d(a=?, 0.9).} {0
1ce0: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
1cf0: 20 74 31 7d 7d 0a 64 6f 5f 65 71 70 5f 74 65 73   t1}}.do_eqp_tes
1d00: 74 20 35 2e 33 2e 33 20 7b 0a 20 20 53 45 4c 45  t 5.3.3 {.  SELE
1d10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1d20: 52 45 20 6c 69 6b 65 6c 79 28 61 3d 3f 29 0a 7d  RE likely(a=?).}
1d30: 20 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41   {0 0 0 {SCAN TA
1d40: 42 4c 45 20 74 31 7d 7d 0a 0a 23 20 32 30 31 35  BLE t1}}..# 2015
1d50: 2d 30 36 2d 31 38 0a 23 20 54 69 63 6b 65 74 20  -06-18.# Ticket 
1d60: 5b 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c  [https://www.sql
1d70: 69 74 65 2e 6f 72 67 2f 73 65 65 2f 74 6b 74 76  ite.org/see/tktv
1d80: 69 65 77 2f 34 37 32 66 30 37 34 32 61 31 38 36  iew/472f0742a186
1d90: 38 66 62 35 38 38 36 32 62 63 35 38 38 65 64 37  8fb58862bc588ed7
1da0: 30 5d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  0].#.do_execsql_
1db0: 74 65 73 74 20 36 2e 30 20 7b 0a 20 20 44 52 4f  test 6.0 {.  DRO
1dc0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
1dd0: 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54  S t1;.  CREATE T
1de0: 41 42 4c 45 20 74 31 28 69 20 69 6e 74 2c 20 78  ABLE t1(i int, x
1df0: 2c 20 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52  , y, z);.  INSER
1e00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1e10: 20 28 31 2c 31 2c 31 2c 31 29 2c 20 28 32 2c 32   (1,1,1,1), (2,2
1e20: 2c 32 2c 32 29 2c 20 28 33 2c 33 2c 33 2c 33 29  ,2,2), (3,3,3,3)
1e30: 2c 20 28 34 2c 34 2c 34 2c 34 29 3b 0a 20 20 44  , (4,4,4,4);.  D
1e40: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
1e50: 53 54 53 20 74 32 3b 0a 20 20 43 52 45 41 54 45  STS t2;.  CREATE
1e60: 20 54 41 42 4c 45 20 74 32 28 69 20 69 6e 74 2c   TABLE t2(i int,
1e70: 20 62 6f 6f 6c 20 63 68 61 72 29 3b 0a 20 20 49   bool char);.  I
1e80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1e90: 4c 55 45 53 28 31 2c 27 54 27 29 2c 20 28 32 2c  LUES(1,'T'), (2,
1ea0: 27 46 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 63  'F');.  SELECT c
1eb0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
1ec0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
1ed0: 74 31 2e 69 3d 74 32 2e 69 20 41 4e 44 20 62 6f  t1.i=t2.i AND bo
1ee0: 6f 6c 3d 27 54 27 3b 0a 20 20 53 45 4c 45 43 54  ol='T';.  SELECT
1ef0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1f00: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
1f10: 4e 20 6c 69 6b 65 6c 79 28 74 31 2e 69 3d 74 32  N likely(t1.i=t2
1f20: 2e 69 29 20 41 4e 44 20 62 6f 6f 6c 3d 27 54 27  .i) AND bool='T'
1f30: 3b 0a 7d 20 7b 34 20 34 7d 0a 0a 23 20 32 30 31  ;.} {4 4}..# 201
1f40: 35 2d 30 36 2d 32 30 0a 23 20 43 72 61 73 68 20  5-06-20.# Crash 
1f50: 64 69 73 63 6f 76 65 72 65 64 20 62 79 20 41 46  discovered by AF
1f60: 4c 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  L.#.do_execsql_t
1f70: 65 73 74 20 37 2e 30 20 7b 0a 20 20 44 52 4f 50  est 7.0 {.  DROP
1f80: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
1f90: 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41   t1;.  CREATE TA
1fa0: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 50 52 49  BLE t1(a, b, PRI
1fb0: 4d 41 52 59 20 4b 45 59 28 61 2c 62 29 29 3b 0a  MARY KEY(a,b));.
1fc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1fd0: 20 56 41 4c 55 45 53 28 39 2c 31 29 2c 28 31 2c   VALUES(9,1),(1,
1fe0: 32 29 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  2);.  DROP TABLE
1ff0: 20 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20   IF EXISTS t2;. 
2000: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
2010: 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b  (x, y, PRIMARY K
2020: 45 59 28 78 2c 79 29 29 3b 0a 20 20 49 4e 53 45  EY(x,y));.  INSE
2030: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2040: 53 28 33 2c 33 29 2c 28 34 2c 34 29 3b 0a 20 20  S(3,3),(4,4);.  
2050: 53 45 4c 45 43 54 20 6c 69 6b 65 6c 79 28 61 29  SELECT likely(a)
2060: 2c 20 78 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  , x FROM t1, t2 
2070: 4f 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d  ORDER BY 1, 2;.}
2080: 20 7b 31 20 33 20 31 20 34 20 39 20 33 20 39 20   {1 3 1 4 9 3 9 
2090: 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  4}.do_execsql_te
20a0: 73 74 20 37 2e 31 20 7b 0a 20 20 53 45 4c 45 43  st 7.1 {.  SELEC
20b0: 54 20 75 6e 6c 69 6b 65 6c 79 28 61 29 2c 20 78  T unlikely(a), x
20c0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4f 52 44   FROM t1, t2 ORD
20d0: 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 31  ER BY 1, 2;.} {1
20e0: 20 33 20 31 20 34 20 39 20 33 20 39 20 34 7d 0a   3 1 4 9 3 9 4}.
20f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2100: 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c  7.2 {.  SELECT l
2110: 69 6b 65 6c 69 68 6f 6f 64 28 61 2c 30 2e 35 29  ikelihood(a,0.5)
2120: 2c 20 78 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  , x FROM t1, t2 
2130: 4f 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d  ORDER BY 1, 2;.}
2140: 20 7b 31 20 33 20 31 20 34 20 39 20 33 20 39 20   {1 3 1 4 9 3 9 
2150: 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  4}.do_execsql_te
2160: 73 74 20 37 2e 33 20 7b 0a 20 20 53 45 4c 45 43  st 7.3 {.  SELEC
2170: 54 20 63 6f 61 6c 65 73 63 65 28 61 2c 61 29 2c  T coalesce(a,a),
2180: 20 78 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4f   x FROM t1, t2 O
2190: 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d 20  RDER BY 1, 2;.} 
21a0: 7b 31 20 33 20 31 20 34 20 39 20 33 20 39 20 34  {1 3 1 4 9 3 9 4
21b0: 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.