/ Hex Artifact Content
Login

Artifact 1ad55ba900bd7747f98b6082e65bd3e442c5004e:


0000: 23 20 32 30 30 36 20 4a 61 6e 75 61 72 79 20 33  # 2006 January 3
0010: 31 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  1.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you 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 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 6a 6f 69   testing the joi
01d0: 6e 20 72 65 6f 72 64 65 72 69 6e 67 20 6f 70 74  n reordering opt
01e0: 69 6d 69 7a 61 74 69 6f 6e 0a 23 20 69 6e 20 63  imization.# in c
01f0: 61 73 65 73 20 74 68 61 74 20 69 6e 63 6c 75 64  ases that includ
0200: 65 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 23  e a LEFT JOIN..#
0210: 0a 23 20 24 49 64 3a 20 77 68 65 72 65 33 2e 74  .# $Id: where3.t
0220: 65 73 74 2c 76 20 31 2e 34 20 32 30 30 38 2f 30  est,v 1.4 2008/0
0230: 34 2f 31 37 20 31 39 3a 31 34 3a 30 32 20 64 72  4/17 19:14:02 dr
0240: 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73  h Exp $..set tes
0250: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0260: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0270: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0280: 72 2e 74 63 6c 0a 0a 23 20 54 68 65 20 66 6f 6c  r.tcl..# The fol
0290: 6c 6f 77 69 6e 67 20 69 73 20 66 72 6f 6d 20 74  lowing is from t
02a0: 69 63 6b 65 74 20 23 31 36 35 32 2e 0a 23 0a 23  icket #1652..#.#
02b0: 20 41 20 63 6f 6d 6d 61 20 6a 6f 69 6e 20 74 68   A comma join th
02c0: 65 6e 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  en a left outer 
02d0: 6a 6f 69 6e 3a 20 20 41 2c 42 20 6c 65 66 74 20  join:  A,B left 
02e0: 6a 6f 69 6e 20 43 2e 0a 23 20 41 72 72 61 6e 67  join C..# Arrang
02f0: 65 20 69 6e 64 69 63 65 73 20 73 6f 20 74 68 61  e indices so tha
0300: 74 20 74 68 65 20 42 20 74 61 62 6c 65 20 69 73  t the B table is
0310: 20 63 68 6f 73 65 6e 20 74 6f 20 67 6f 20 66 69   chosen to go fi
0320: 72 73 74 2e 0a 23 20 41 6c 73 6f 20 70 75 74 20  rst..# Also put 
0330: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 43 2c 20 62  an index on C, b
0340: 75 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ut make sure tha
0350: 74 20 41 20 69 73 20 63 68 6f 73 65 6e 20 62 65  t A is chosen be
0360: 66 6f 72 65 20 43 2e 0a 23 0a 64 6f 5f 74 65 73  fore C..#.do_tes
0370: 74 20 77 68 65 72 65 33 2d 31 2e 31 20 7b 0a 20  t where3-1.1 {. 
0380: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
0390: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03a0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
03b0: 20 54 41 42 4c 45 20 74 32 28 70 2c 20 71 29 3b   TABLE t2(p, q);
03c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
03d0: 45 20 74 33 28 78 2c 20 79 29 3b 0a 20 20 20 20  E t3(x, y);.    
03e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
03f0: 20 74 31 20 56 41 4c 55 45 53 28 31 31 31 2c 27   t1 VALUES(111,'
0400: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
0410: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0420: 28 32 32 32 2c 27 74 77 6f 27 29 3b 0a 20 20 20  (222,'two');.   
0430: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0440: 56 41 4c 55 45 53 28 33 33 33 2c 27 74 68 72 65  VALUES(333,'thre
0450: 65 27 29 3b 0a 20 20 20 20 0a 20 20 20 20 49 4e  e');.    .    IN
0460: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0470: 55 45 53 28 31 2c 31 31 31 29 3b 0a 20 20 20 20  UES(1,111);.    
0480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0490: 41 4c 55 45 53 28 32 2c 32 32 32 29 3b 0a 20 20  ALUES(2,222);.  
04a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
04b0: 20 56 41 4c 55 45 53 28 34 2c 34 34 34 29 3b 0a   VALUES(4,444);.
04c0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
04d0: 20 74 32 69 31 20 4f 4e 20 74 32 28 70 29 3b 0a   t2i1 ON t2(p);.
04e0: 20 20 20 20 0a 20 20 20 20 49 4e 53 45 52 54 20      .    INSERT 
04f0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 39  INTO t3 VALUES(9
0500: 39 39 2c 27 6e 69 6e 65 27 29 3b 0a 20 20 20 20  99,'nine');.    
0510: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 69  CREATE INDEX t3i
0520: 31 20 4f 4e 20 74 33 28 78 29 3b 0a 20 20 20 20  1 ON t3(x);.    
0530: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0540: 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a  OM t1, t2 LEFT J
0550: 4f 49 4e 20 74 33 20 4f 4e 20 71 3d 78 20 57 48  OIN t3 ON q=x WH
0560: 45 52 45 20 70 3d 32 20 41 4e 44 20 61 3d 71 3b  ERE p=2 AND a=q;
0570: 0a 20 20 7d 0a 7d 20 7b 32 32 32 20 74 77 6f 20  .  }.} {222 two 
0580: 32 20 32 32 32 20 7b 7d 20 7b 7d 7d 0a 0a 69 66  2 222 {} {}}..if
0590: 63 61 70 61 62 6c 65 20 65 78 70 6c 61 69 6e 20  capable explain 
05a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  {.  do_test wher
05b0: 65 33 2d 31 2e 31 2e 31 20 7b 0a 20 20 20 20 20  e3-1.1.1 {.     
05c0: 65 78 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 63 65  explain_no_trace
05d0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
05e0: 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
05f0: 20 74 33 20 4f 4e 20 71 3d 78 0a 20 20 20 20 20   t3 ON q=x.     
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 57 48 45 52 45 20 70 3d 32 20 41 4e 44     WHERE p=2 AND
0620: 20 61 3d 71 7d 0a 20 20 7d 20 5b 65 78 70 6c 61   a=q}.  } [expla
0630: 69 6e 5f 6e 6f 5f 74 72 61 63 65 20 7b 53 45 4c  in_no_trace {SEL
0640: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
0650: 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 4f  2 LEFT JOIN t3 O
0660: 4e 20 78 3d 71 0a 20 20 20 20 20 20 20 20 20 20  N x=q.          
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
0680: 45 52 45 20 70 3d 32 20 41 4e 44 20 61 3d 71 7d  ERE p=2 AND a=q}
0690: 5d 0a 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 31  ].}..# Ticket #1
06a0: 38 33 30 0a 23 0a 23 20 54 68 69 73 20 69 73 20  830.#.# This is 
06b0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61  similar to the a
06c0: 62 6f 76 65 20 62 75 74 20 77 69 74 68 20 74 68  bove but with th
06d0: 65 20 4c 45 46 54 20 4a 4f 49 4e 20 6f 6e 20 74  e LEFT JOIN on t
06e0: 68 65 0a 23 20 6f 74 68 65 72 20 73 69 64 65 2e  he.# other side.
06f0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .#.do_test where
0700: 33 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3-1.2 {.  execsq
0710: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0720: 41 42 4c 45 20 70 61 72 65 6e 74 31 28 70 61 72  ABLE parent1(par
0730: 65 6e 74 31 6b 65 79 2c 20 63 68 69 6c 64 31 6b  ent1key, child1k
0740: 65 79 2c 20 43 68 69 6c 64 32 6b 65 79 2c 20 63  ey, Child2key, c
0750: 68 69 6c 64 33 6b 65 79 29 3b 0a 20 20 20 20 43  hild3key);.    C
0760: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
0770: 64 31 20 28 20 63 68 69 6c 64 31 6b 65 79 20 4e  d1 ( child1key N
0780: 56 41 52 43 48 41 52 2c 20 76 61 6c 75 65 20 4e  VARCHAR, value N
0790: 56 41 52 43 48 41 52 20 29 3b 0a 20 20 20 20 43  VARCHAR );.    C
07a0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
07b0: 45 58 20 50 4b 49 44 58 43 68 69 6c 64 31 20 4f  EX PKIDXChild1 O
07c0: 4e 20 63 68 69 6c 64 31 20 28 20 63 68 69 6c 64  N child1 ( child
07d0: 31 6b 65 79 20 29 3b 0a 20 20 20 20 43 52 45 41  1key );.    CREA
07e0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 20  TE TABLE child2 
07f0: 28 20 63 68 69 6c 64 32 6b 65 79 20 4e 56 41 52  ( child2key NVAR
0800: 43 48 41 52 2c 20 76 61 6c 75 65 20 4e 56 41 52  CHAR, value NVAR
0810: 43 48 41 52 20 29 3b 0a 0a 20 20 20 20 49 4e 53  CHAR );..    INS
0820: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 31  ERT INTO parent1
0830: 28 70 61 72 65 6e 74 31 6b 65 79 2c 63 68 69 6c  (parent1key,chil
0840: 64 31 6b 65 79 2c 63 68 69 6c 64 32 6b 65 79 29  d1key,child2key)
0850: 0a 20 20 20 20 20 20 20 56 41 4c 55 45 53 20 28  .       VALUES (
0860: 20 31 2c 20 27 43 31 2e 31 27 2c 20 27 43 32 2e   1, 'C1.1', 'C2.
0870: 31 27 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1' );.    INSERT
0880: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 28 20 63   INTO child1 ( c
0890: 68 69 6c 64 31 6b 65 79 2c 20 76 61 6c 75 65 20  hild1key, value 
08a0: 29 20 56 41 4c 55 45 53 20 28 20 27 43 31 2e 31  ) VALUES ( 'C1.1
08b0: 27 2c 20 27 56 61 6c 75 65 20 66 6f 72 20 43 31  ', 'Value for C1
08c0: 2e 31 27 20 29 3b 0a 20 20 20 20 49 4e 53 45 52  .1' );.    INSER
08d0: 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 28 20  T INTO child2 ( 
08e0: 63 68 69 6c 64 32 6b 65 79 2c 20 76 61 6c 75 65  child2key, value
08f0: 20 29 20 56 41 4c 55 45 53 20 28 20 27 43 32 2e   ) VALUES ( 'C2.
0900: 31 27 2c 20 27 56 61 6c 75 65 20 66 6f 72 20 43  1', 'Value for C
0910: 32 2e 31 27 20 29 3b 0a 0a 20 20 20 20 49 4e 53  2.1' );..    INS
0920: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 31  ERT INTO parent1
0930: 20 28 20 70 61 72 65 6e 74 31 6b 65 79 2c 20 63   ( parent1key, c
0940: 68 69 6c 64 31 6b 65 79 2c 20 63 68 69 6c 64 32  hild1key, child2
0950: 6b 65 79 20 29 0a 20 20 20 20 20 20 20 56 41 4c  key ).       VAL
0960: 55 45 53 20 28 20 32 2c 20 27 43 31 2e 32 27 2c  UES ( 2, 'C1.2',
0970: 20 27 43 32 2e 32 27 20 29 3b 0a 20 20 20 20 49   'C2.2' );.    I
0980: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
0990: 32 20 28 20 63 68 69 6c 64 32 6b 65 79 2c 20 76  2 ( child2key, v
09a0: 61 6c 75 65 20 29 20 56 41 4c 55 45 53 20 28 20  alue ) VALUES ( 
09b0: 27 43 32 2e 32 27 2c 20 27 56 61 6c 75 65 20 66  'C2.2', 'Value f
09c0: 6f 72 20 43 32 2e 32 27 20 29 3b 0a 0a 20 20 20  or C2.2' );..   
09d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
09e0: 65 6e 74 31 20 28 20 70 61 72 65 6e 74 31 6b 65  ent1 ( parent1ke
09f0: 79 2c 20 63 68 69 6c 64 31 6b 65 79 2c 20 63 68  y, child1key, ch
0a00: 69 6c 64 32 6b 65 79 20 29 0a 20 20 20 20 20 20  ild2key ).      
0a10: 20 56 41 4c 55 45 53 20 28 20 33 2c 20 27 43 31   VALUES ( 3, 'C1
0a20: 2e 33 27 2c 20 27 43 32 2e 33 27 20 29 3b 0a 20  .3', 'C2.3' );. 
0a30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
0a40: 68 69 6c 64 31 20 28 20 63 68 69 6c 64 31 6b 65  hild1 ( child1ke
0a50: 79 2c 20 76 61 6c 75 65 20 29 20 56 41 4c 55 45  y, value ) VALUE
0a60: 53 20 28 20 27 43 31 2e 33 27 2c 20 27 56 61 6c  S ( 'C1.3', 'Val
0a70: 75 65 20 66 6f 72 20 43 31 2e 33 27 20 29 3b 0a  ue for C1.3' );.
0a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0a90: 63 68 69 6c 64 32 20 28 20 63 68 69 6c 64 32 6b  child2 ( child2k
0aa0: 65 79 2c 20 76 61 6c 75 65 20 29 20 56 41 4c 55  ey, value ) VALU
0ab0: 45 53 20 28 20 27 43 32 2e 33 27 2c 20 27 56 61  ES ( 'C2.3', 'Va
0ac0: 6c 75 65 20 66 6f 72 20 43 32 2e 33 27 20 29 3b  lue for C2.3' );
0ad0: 0a 0a 20 20 20 20 53 45 4c 45 43 54 20 70 61 72  ..    SELECT par
0ae0: 65 6e 74 31 2e 70 61 72 65 6e 74 31 6b 65 79 2c  ent1.parent1key,
0af0: 20 63 68 69 6c 64 31 2e 76 61 6c 75 65 2c 20 63   child1.value, c
0b00: 68 69 6c 64 32 2e 76 61 6c 75 65 0a 20 20 20 20  hild2.value.    
0b10: 46 52 4f 4d 20 70 61 72 65 6e 74 31 0a 20 20 20  FROM parent1.   
0b20: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
0b30: 20 63 68 69 6c 64 31 20 4f 4e 20 63 68 69 6c 64   child1 ON child
0b40: 31 2e 63 68 69 6c 64 31 6b 65 79 20 3d 20 70 61  1.child1key = pa
0b50: 72 65 6e 74 31 2e 63 68 69 6c 64 31 6b 65 79 0a  rent1.child1key.
0b60: 20 20 20 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 63      INNER JOIN c
0b70: 68 69 6c 64 32 20 4f 4e 20 63 68 69 6c 64 32 2e  hild2 ON child2.
0b80: 63 68 69 6c 64 32 6b 65 79 20 3d 20 70 61 72 65  child2key = pare
0b90: 6e 74 31 2e 63 68 69 6c 64 32 6b 65 79 3b 0a 20  nt1.child2key;. 
0ba0: 20 7d 0a 7d 20 7b 31 20 7b 56 61 6c 75 65 20 66   }.} {1 {Value f
0bb0: 6f 72 20 43 31 2e 31 7d 20 7b 56 61 6c 75 65 20  or C1.1} {Value 
0bc0: 66 6f 72 20 43 32 2e 31 7d 20 32 20 7b 7d 20 7b  for C2.1} 2 {} {
0bd0: 56 61 6c 75 65 20 66 6f 72 20 43 32 2e 32 7d 20  Value for C2.2} 
0be0: 33 20 7b 56 61 6c 75 65 20 66 6f 72 20 43 31 2e  3 {Value for C1.
0bf0: 33 7d 20 7b 56 61 6c 75 65 20 66 6f 72 20 43 32  3} {Value for C2
0c00: 2e 33 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  .3}}..ifcapable 
0c10: 65 78 70 6c 61 69 6e 20 7b 0a 20 20 64 6f 5f 74  explain {.  do_t
0c20: 65 73 74 20 77 68 65 72 65 33 2d 31 2e 32 2e 31  est where3-1.2.1
0c30: 20 7b 0a 20 20 20 20 20 65 78 70 6c 61 69 6e 5f   {.     explain_
0c40: 6e 6f 5f 74 72 61 63 65 20 7b 0a 20 20 20 20 20  no_trace {.     
0c50: 20 20 53 45 4c 45 43 54 20 70 61 72 65 6e 74 31    SELECT parent1
0c60: 2e 70 61 72 65 6e 74 31 6b 65 79 2c 20 63 68 69  .parent1key, chi
0c70: 6c 64 31 2e 76 61 6c 75 65 2c 20 63 68 69 6c 64  ld1.value, child
0c80: 32 2e 76 61 6c 75 65 0a 20 20 20 20 20 20 20 46  2.value.       F
0c90: 52 4f 4d 20 70 61 72 65 6e 74 31 0a 20 20 20 20  ROM parent1.    
0ca0: 20 20 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f     LEFT OUTER JO
0cb0: 49 4e 20 63 68 69 6c 64 31 20 4f 4e 20 63 68 69  IN child1 ON chi
0cc0: 6c 64 31 2e 63 68 69 6c 64 31 6b 65 79 20 3d 20  ld1.child1key = 
0cd0: 70 61 72 65 6e 74 31 2e 63 68 69 6c 64 31 6b 65  parent1.child1ke
0ce0: 79 0a 20 20 20 20 20 20 20 49 4e 4e 45 52 20 4a  y.       INNER J
0cf0: 4f 49 4e 20 63 68 69 6c 64 32 20 4f 4e 20 63 68  OIN child2 ON ch
0d00: 69 6c 64 32 2e 63 68 69 6c 64 32 6b 65 79 20 3d  ild2.child2key =
0d10: 20 70 61 72 65 6e 74 31 2e 63 68 69 6c 64 32 6b   parent1.child2k
0d20: 65 79 3b 0a 20 20 20 20 20 7d 0a 20 20 7d 20 5b  ey;.     }.  } [
0d30: 65 78 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 63 65  explain_no_trace
0d40: 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54   {.       SELECT
0d50: 20 70 61 72 65 6e 74 31 2e 70 61 72 65 6e 74 31   parent1.parent1
0d60: 6b 65 79 2c 20 63 68 69 6c 64 31 2e 76 61 6c 75  key, child1.valu
0d70: 65 2c 20 63 68 69 6c 64 32 2e 76 61 6c 75 65 0a  e, child2.value.
0d80: 20 20 20 20 20 20 20 46 52 4f 4d 20 70 61 72 65         FROM pare
0d90: 6e 74 31 0a 20 20 20 20 20 20 20 4c 45 46 54 20  nt1.       LEFT 
0da0: 4f 55 54 45 52 20 4a 4f 49 4e 20 63 68 69 6c 64  OUTER JOIN child
0db0: 31 20 4f 4e 20 70 61 72 65 6e 74 31 2e 63 68 69  1 ON parent1.chi
0dc0: 6c 64 31 6b 65 79 20 3d 20 63 68 69 6c 64 31 2e  ld1key = child1.
0dd0: 63 68 69 6c 64 31 6b 65 79 20 0a 20 20 20 20 20  child1key .     
0de0: 20 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 63 68 69    INNER JOIN chi
0df0: 6c 64 32 20 4f 4e 20 63 68 69 6c 64 32 2e 63 68  ld2 ON child2.ch
0e00: 69 6c 64 32 6b 65 79 20 3d 20 70 61 72 65 6e 74  ild2key = parent
0e10: 31 2e 63 68 69 6c 64 32 6b 65 79 3b 0a 20 20 20  1.child2key;.   
0e20: 20 20 7d 5d 0a 7d 0a 0a 23 20 54 68 69 73 20 70    }].}..# This p
0e30: 72 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65  rocedure execute
0e40: 73 20 74 68 65 20 53 51 4c 2e 20 20 54 68 65 6e  s the SQL.  Then
0e50: 20 69 74 20 61 70 70 65 6e 64 73 20 0a 23 20 74   it appends .# t
0e60: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
0e70: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
0e80: 75 73 65 64 0a 23 0a 70 72 6f 63 20 71 75 65 72  used.#.proc quer
0e90: 79 70 6c 61 6e 20 7b 73 71 6c 7d 20 7b 0a 20 20  yplan {sql} {.  
0ea0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f 72  set ::sqlite_sor
0eb0: 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20  t_count 0.  set 
0ec0: 64 61 74 61 20 5b 65 78 65 63 73 71 6c 20 24 73  data [execsql $s
0ed0: 71 6c 5d 0a 20 20 73 65 74 20 65 71 70 20 5b 65  ql].  set eqp [e
0ee0: 78 65 63 73 71 6c 20 22 45 58 50 4c 41 49 4e 20  xecsql "EXPLAIN 
0ef0: 51 55 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 22  QUERY PLAN $sql"
0f00: 5d 0a 20 20 23 20 70 75 74 73 20 65 71 70 3d 24  ].  # puts eqp=$
0f10: 65 71 70 0a 20 20 66 6f 72 65 61 63 68 20 7b 61  eqp.  foreach {a
0f20: 20 62 20 63 20 78 7d 20 24 65 71 70 20 7b 0a 20   b c x} $eqp {. 
0f30: 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b     if {[regexp {
0f40: 20 54 41 42 4c 45 20 28 5c 77 2b 20 41 53 20 29   TABLE (\w+ AS )
0f50: 3f 28 5c 77 2b 29 20 55 53 49 4e 47 2e 2a 20 49  ?(\w+) USING.* I
0f60: 4e 44 45 58 20 28 5c 77 2b 29 5c 79 7d 20 5c 0a  NDEX (\w+)\y} \.
0f70: 20 20 20 20 20 20 20 20 24 78 20 61 6c 6c 20 61          $x all a
0f80: 73 20 74 61 62 20 69 64 78 5d 7d 20 7b 0a 20 20  s tab idx]} {.  
0f90: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 61 74 61      lappend data
0fa0: 20 24 74 61 62 20 24 69 64 78 0a 20 20 20 20 7d   $tab $idx.    }
0fb0: 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70   elseif {[regexp
0fc0: 20 7b 20 54 41 42 4c 45 20 28 5c 77 2b 20 41 53   { TABLE (\w+ AS
0fd0: 20 29 3f 28 5c 77 2b 29 5c 79 7d 20 24 78 20 61   )?(\w+)\y} $x a
0fe0: 6c 6c 20 61 73 20 74 61 62 5d 7d 20 7b 0a 20 20  ll as tab]} {.  
0ff0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 61 74 61      lappend data
1000: 20 24 74 61 62 20 2a 0a 20 20 20 20 7d 0a 20 20   $tab *.    }.  
1010: 7d 0a 20 20 72 65 74 75 72 6e 20 24 64 61 74 61  }.  return $data
1020: 20 20 20 0a 7d 0a 0a 0a 23 20 49 66 20 79 6f 75     .}...# If you
1030: 20 68 61 76 65 20 61 20 66 72 6f 6d 20 63 6c 61   have a from cla
1040: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  use of the form:
1050: 20 20 20 41 20 42 20 43 20 6c 65 66 74 20 6a 6f     A B C left jo
1060: 69 6e 20 44 0a 23 20 74 68 65 6e 20 6d 61 6b 65  in D.# then make
1070: 20 73 75 72 65 20 74 68 65 20 71 75 65 72 79 20   sure the query 
1080: 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
1090: 65 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  e to reorder the
10a0: 20 0a 23 20 41 20 42 20 43 20 70 61 72 74 20 61   .# A B C part a
10b0: 6e 79 77 61 79 20 69 74 20 77 61 6e 74 73 2e 20  nyway it wants. 
10c0: 0a 23 0a 23 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  .#.# Following t
10d0: 68 65 20 66 69 78 20 74 6f 20 74 69 63 6b 65 74  he fix to ticket
10e0: 20 23 31 36 35 32 2c 20 74 68 65 72 65 20 77 61   #1652, there wa
10f0: 73 20 61 20 74 69 6d 65 20 77 68 65 6e 0a 23 20  s a time when.# 
1100: 74 68 65 20 43 20 74 61 62 6c 65 20 77 6f 75 6c  the C table woul
1110: 64 20 6e 6f 74 20 72 65 6f 72 64 65 72 2e 20 20  d not reorder.  
1120: 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  So the following
1130: 20 72 65 6f 72 64 65 72 69 6e 67 73 0a 23 20 77   reorderings.# w
1140: 65 72 65 20 70 6f 73 73 69 62 6c 65 3a 0a 23 0a  ere possible:.#.
1150: 23 20 20 20 20 20 20 20 20 20 20 20 20 41 20 42  #            A B
1160: 20 43 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23   C left join D.#
1170: 20 20 20 20 20 20 20 20 20 20 20 20 42 20 41 20              B A 
1180: 43 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23 0a  C left join D.#.
1190: 23 20 42 75 74 20 74 68 65 73 65 20 72 65 6f 72  # But these reor
11a0: 64 65 72 73 20 77 65 72 65 20 6e 6f 74 20 61 6c  ders were not al
11b0: 6c 6f 77 65 64 0a 23 0a 23 20 20 20 20 20 20 20  lowed.#.#       
11c0: 20 20 20 20 20 43 20 41 20 42 20 6c 65 66 74 20       C A B left 
11d0: 6a 6f 69 6e 20 44 0a 23 20 20 20 20 20 20 20 20  join D.#        
11e0: 20 20 20 20 41 20 43 20 42 20 6c 65 66 74 20 6a      A C B left j
11f0: 6f 69 6e 20 44 0a 23 20 20 20 20 20 20 20 20 20  oin D.#         
1200: 20 20 20 43 20 42 20 41 20 6c 65 66 74 20 6a 6f     C B A left jo
1210: 69 6e 20 44 0a 23 20 20 20 20 20 20 20 20 20 20  in D.#          
1220: 20 20 42 20 43 20 41 20 6c 65 66 74 20 6a 6f 69    B C A left joi
1230: 6e 20 44 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c  n D.#.# The foll
1240: 6f 77 69 6e 67 20 74 65 73 74 73 20 61 72 65 20  owing tests are 
1250: 68 65 72 65 20 74 6f 20 76 65 72 69 66 79 20 74  here to verify t
1260: 68 61 74 20 74 68 65 20 6c 61 74 74 65 72 20 66  hat the latter f
1270: 6f 75 72 0a 23 20 72 65 6f 72 64 65 72 69 6e 67  our.# reordering
1280: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 61 67  s are allowed ag
1290: 61 69 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ain..#.do_test w
12a0: 68 65 72 65 33 2d 32 2e 31 20 7b 0a 20 20 65 78  here3-2.1 {.  ex
12b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
12c0: 54 45 20 54 41 42 4c 45 20 74 41 28 61 70 6b 20  TE TABLE tA(apk 
12d0: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
12e0: 6b 65 79 2c 20 61 78 29 3b 0a 20 20 20 20 43 52  key, ax);.    CR
12f0: 45 41 54 45 20 54 41 42 4c 45 20 74 42 28 62 70  EATE TABLE tB(bp
1300: 6b 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72  k integer primar
1310: 79 20 6b 65 79 2c 20 62 78 29 3b 0a 20 20 20 20  y key, bx);.    
1320: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 43 28  CREATE TABLE tC(
1330: 63 70 6b 20 69 6e 74 65 67 65 72 20 70 72 69 6d  cpk integer prim
1340: 61 72 79 20 6b 65 79 2c 20 63 78 29 3b 0a 20 20  ary key, cx);.  
1350: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1360: 44 28 64 70 6b 20 69 6e 74 65 67 65 72 20 70 72  D(dpk integer pr
1370: 69 6d 61 72 79 20 6b 65 79 2c 20 64 78 29 3b 0a  imary key, dx);.
1380: 20 20 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e 20    }.  queryplan 
1390: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
13a0: 52 4f 4d 20 74 41 2c 20 74 42 2c 20 74 43 20 4c  ROM tA, tB, tC L
13b0: 45 46 54 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 64  EFT JOIN tD ON d
13c0: 70 6b 3d 63 78 0a 20 20 20 20 20 57 48 45 52 45  pk=cx.     WHERE
13d0: 20 63 70 6b 3d 62 78 20 41 4e 44 20 62 70 6b 3d   cpk=bx AND bpk=
13e0: 61 78 0a 20 20 7d 0a 7d 20 7b 74 41 20 2a 20 74  ax.  }.} {tA * t
13f0: 42 20 2a 20 74 43 20 2a 20 74 44 20 2a 7d 0a 64  B * tC * tD *}.d
1400: 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 32 2e  o_test where3-2.
1410: 31 2e 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  1.1 {.  querypla
1420: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  n {.    SELECT *
1430: 20 46 52 4f 4d 20 74 41 2c 20 74 42 2c 20 74 43   FROM tA, tB, tC
1440: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 44 20 4f 4e   LEFT JOIN tD ON
1450: 20 63 78 3d 64 70 6b 0a 20 20 20 20 20 57 48 45   cx=dpk.     WHE
1460: 52 45 20 63 70 6b 3d 62 78 20 41 4e 44 20 62 70  RE cpk=bx AND bp
1470: 6b 3d 61 78 0a 20 20 7d 0a 7d 20 7b 74 41 20 2a  k=ax.  }.} {tA *
1480: 20 74 42 20 2a 20 74 43 20 2a 20 74 44 20 2a 7d   tB * tC * tD *}
1490: 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d  .do_test where3-
14a0: 32 2e 31 2e 32 20 7b 0a 20 20 71 75 65 72 79 70  2.1.2 {.  queryp
14b0: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
14c0: 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42 2c 20   * FROM tA, tB, 
14d0: 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74 44 20  tC LEFT JOIN tD 
14e0: 4f 4e 20 63 78 3d 64 70 6b 0a 20 20 20 20 20 57  ON cx=dpk.     W
14f0: 48 45 52 45 20 62 78 3d 63 70 6b 20 41 4e 44 20  HERE bx=cpk AND 
1500: 62 70 6b 3d 61 78 0a 20 20 7d 0a 7d 20 7b 74 41  bpk=ax.  }.} {tA
1510: 20 2a 20 74 42 20 2a 20 74 43 20 2a 20 74 44 20   * tB * tC * tD 
1520: 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  *}.do_test where
1530: 33 2d 32 2e 31 2e 33 20 7b 0a 20 20 71 75 65 72  3-2.1.3 {.  quer
1540: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1550: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
1560: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
1570: 44 20 4f 4e 20 63 78 3d 64 70 6b 0a 20 20 20 20  D ON cx=dpk.    
1580: 20 57 48 45 52 45 20 62 78 3d 63 70 6b 20 41 4e   WHERE bx=cpk AN
1590: 44 20 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b  D ax=bpk.  }.} {
15a0: 74 41 20 2a 20 74 42 20 2a 20 74 43 20 2a 20 74  tA * tB * tC * t
15b0: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
15c0: 72 65 33 2d 32 2e 31 2e 34 20 7b 0a 20 20 71 75  re3-2.1.4 {.  qu
15d0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
15e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20  LECT * FROM tA, 
15f0: 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e  tB, tC LEFT JOIN
1600: 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20   tD ON dpk=cx.  
1610: 20 20 20 57 48 45 52 45 20 62 78 3d 63 70 6b 20     WHERE bx=cpk 
1620: 41 4e 44 20 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d  AND ax=bpk.  }.}
1630: 20 7b 74 41 20 2a 20 74 42 20 2a 20 74 43 20 2a   {tA * tB * tC *
1640: 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77   tD *}.do_test w
1650: 68 65 72 65 33 2d 32 2e 31 2e 35 20 7b 0a 20 20  here3-2.1.5 {.  
1660: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1670: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
1680: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
1690: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
16a0: 20 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62       WHERE cpk=b
16b0: 78 20 41 4e 44 20 61 78 3d 62 70 6b 0a 20 20 7d  x AND ax=bpk.  }
16c0: 0a 7d 20 7b 74 41 20 2a 20 74 42 20 2a 20 74 43  .} {tA * tB * tC
16d0: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
16e0: 20 77 68 65 72 65 33 2d 32 2e 32 20 7b 0a 20 20   where3-2.2 {.  
16f0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1700: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
1710: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
1720: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
1730: 20 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62       WHERE cpk=b
1740: 78 20 41 4e 44 20 61 70 6b 3d 62 78 0a 20 20 7d  x AND apk=bx.  }
1750: 0a 7d 20 7b 74 42 20 2a 20 74 41 20 2a 20 74 43  .} {tB * tA * tC
1760: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
1770: 20 77 68 65 72 65 33 2d 32 2e 33 20 7b 0a 20 20   where3-2.3 {.  
1780: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1790: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
17a0: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
17b0: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
17c0: 20 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62       WHERE cpk=b
17d0: 78 20 41 4e 44 20 61 70 6b 3d 62 78 0a 20 20 7d  x AND apk=bx.  }
17e0: 0a 7d 20 7b 74 42 20 2a 20 74 41 20 2a 20 74 43  .} {tB * tA * tC
17f0: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
1800: 20 77 68 65 72 65 33 2d 32 2e 34 20 7b 0a 20 20   where3-2.4 {.  
1810: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1820: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
1830: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
1840: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
1850: 20 20 20 20 20 57 48 45 52 45 20 61 70 6b 3d 63       WHERE apk=c
1860: 78 20 41 4e 44 20 62 70 6b 3d 61 78 0a 20 20 7d  x AND bpk=ax.  }
1870: 0a 7d 20 7b 74 43 20 2a 20 74 41 20 2a 20 74 42  .} {tC * tA * tB
1880: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
1890: 20 77 68 65 72 65 33 2d 32 2e 35 20 7b 0a 20 20   where3-2.5 {.  
18a0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
18b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
18c0: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
18d0: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
18e0: 20 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 61       WHERE cpk=a
18f0: 78 20 41 4e 44 20 62 70 6b 3d 63 78 0a 20 20 7d  x AND bpk=cx.  }
1900: 0a 7d 20 7b 74 41 20 2a 20 74 43 20 2a 20 74 42  .} {tA * tC * tB
1910: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
1920: 20 77 68 65 72 65 33 2d 32 2e 36 20 7b 0a 20 20   where3-2.6 {.  
1930: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
1950: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
1960: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
1970: 20 20 20 20 20 57 48 45 52 45 20 62 70 6b 3d 63       WHERE bpk=c
1980: 78 20 41 4e 44 20 61 70 6b 3d 62 78 0a 20 20 7d  x AND apk=bx.  }
1990: 0a 7d 20 7b 74 43 20 2a 20 74 42 20 2a 20 74 41  .} {tC * tB * tA
19a0: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
19b0: 20 77 68 65 72 65 33 2d 32 2e 37 20 7b 0a 20 20   where3-2.7 {.  
19c0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
19d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41  SELECT * FROM tA
19e0: 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f  , tB, tC LEFT JO
19f0: 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a  IN tD ON dpk=cx.
1a00: 20 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62       WHERE cpk=b
1a10: 78 20 41 4e 44 20 61 70 6b 3d 63 78 0a 20 20 7d  x AND apk=cx.  }
1a20: 0a 7d 20 7b 74 42 20 2a 20 74 43 20 2a 20 74 41  .} {tB * tC * tA
1a30: 20 2a 20 74 44 20 2a 7d 0a 0a 23 20 54 69 63 6b   * tD *}..# Tick
1a40: 65 74 20 5b 31 33 66 30 33 33 63 38 36 35 66 38  et [13f033c865f8
1a50: 37 38 39 35 33 5d 0a 23 20 49 66 20 74 68 65 20  78953].# If the 
1a60: 6f 75 74 65 72 20 6c 6f 6f 70 20 6d 75 73 74 20  outer loop must 
1a70: 62 65 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  be a full table 
1a80: 73 63 61 6e 2c 20 64 6f 20 6e 6f 74 20 6c 65 74  scan, do not let
1a90: 20 41 4e 41 4c 59 5a 45 20 74 72 69 63 6b 0a 23   ANALYZE trick.#
1aa0: 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 69 6e 74   the planner int
1ab0: 6f 20 75 73 65 20 61 20 74 61 62 6c 65 20 66 6f  o use a table fo
1ac0: 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  r the outer loop
1ad0: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 69   that might be i
1ae0: 6e 64 65 78 61 62 6c 65 0a 23 20 69 66 20 68 65  ndexable.# if he
1af0: 6c 64 20 75 6e 74 69 6c 20 61 6e 20 69 6e 6e 65  ld until an inne
1b00: 72 20 6c 6f 6f 70 2e 0a 23 20 0a 64 6f 5f 65 78  r loop..# .do_ex
1b10: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
1b20: 33 2d 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  3-3.0 {.  CREATE
1b30: 20 54 41 42 4c 45 20 74 33 30 31 28 61 20 49 4e   TABLE t301(a IN
1b40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1b50: 59 2c 62 2c 63 29 3b 0a 20 20 43 52 45 41 54 45  Y,b,c);.  CREATE
1b60: 20 49 4e 44 45 58 20 74 33 30 31 63 20 4f 4e 20   INDEX t301c ON 
1b70: 74 33 30 31 28 63 29 3b 0a 20 20 49 4e 53 45 52  t301(c);.  INSER
1b80: 54 20 49 4e 54 4f 20 74 33 30 31 20 56 41 4c 55  T INTO t301 VALU
1b90: 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 49 4e 53  ES(1,2,3);.  INS
1ba0: 45 52 54 20 49 4e 54 4f 20 74 33 30 31 20 56 41  ERT INTO t301 VA
1bb0: 4c 55 45 53 28 32 2c 32 2c 33 29 3b 0a 20 20 43  LUES(2,2,3);.  C
1bc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 30 32  REATE TABLE t302
1bd0: 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54  (x, y);.  INSERT
1be0: 20 49 4e 54 4f 20 74 33 30 32 20 56 41 4c 55 45   INTO t302 VALUE
1bf0: 53 28 34 2c 35 29 3b 0a 20 20 41 4e 41 4c 59 5a  S(4,5);.  ANALYZ
1c00: 45 3b 0a 20 20 65 78 70 6c 61 69 6e 20 71 75 65  E;.  explain que
1c10: 72 79 20 70 6c 61 6e 20 53 45 4c 45 43 54 20 2a  ry plan SELECT *
1c20: 20 46 52 4f 4d 20 74 33 30 32 2c 20 74 33 30 31   FROM t302, t301
1c30: 20 57 48 45 52 45 20 74 33 30 32 2e 78 3d 35 20   WHERE t302.x=5 
1c40: 41 4e 44 20 74 33 30 31 2e 61 3d 74 33 30 32 2e  AND t301.a=t302.
1c50: 79 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  y;.} {.  0 0 0 {
1c60: 53 43 41 4e 20 54 41 42 4c 45 20 74 33 30 32 7d  SCAN TABLE t302}
1c70: 20 0a 20 20 30 20 31 20 31 20 7b 53 45 41 52 43   .  0 1 1 {SEARC
1c80: 48 20 54 41 42 4c 45 20 74 33 30 31 20 55 53 49  H TABLE t301 USI
1c90: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1ca0: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
1cb0: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
1cc0: 65 73 74 20 77 68 65 72 65 33 2d 33 2e 31 20 7b  est where3-3.1 {
1cd0: 0a 20 20 65 78 70 6c 61 69 6e 20 71 75 65 72 79  .  explain query
1ce0: 20 70 6c 61 6e 0a 20 20 53 45 4c 45 43 54 20 2a   plan.  SELECT *
1cf0: 20 46 52 4f 4d 20 74 33 30 31 2c 20 74 33 30 32   FROM t301, t302
1d00: 20 57 48 45 52 45 20 74 33 30 32 2e 78 3d 35 20   WHERE t302.x=5 
1d10: 41 4e 44 20 74 33 30 31 2e 61 3d 74 33 30 32 2e  AND t301.a=t302.
1d20: 79 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b  y;.} {.  0 0 1 {
1d30: 53 43 41 4e 20 54 41 42 4c 45 20 74 33 30 32 7d  SCAN TABLE t302}
1d40: 20 0a 20 20 30 20 31 20 30 20 7b 53 45 41 52 43   .  0 1 0 {SEARC
1d50: 48 20 54 41 42 4c 45 20 74 33 30 31 20 55 53 49  H TABLE t301 USI
1d60: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1d70: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
1d80: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
1d90: 65 73 74 20 77 68 65 72 65 33 2d 33 2e 32 20 7b  est where3-3.2 {
1da0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1db0: 20 74 33 30 31 20 57 48 45 52 45 20 63 3d 33 20   t301 WHERE c=3 
1dc0: 41 4e 44 20 61 20 49 53 20 4e 55 4c 4c 3b 0a 7d  AND a IS NULL;.}
1dd0: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
1de0: 65 73 74 20 77 68 65 72 65 33 2d 33 2e 33 20 7b  est where3-3.3 {
1df0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1e00: 20 74 33 30 31 20 57 48 45 52 45 20 63 3d 33 20   t301 WHERE c=3 
1e10: 41 4e 44 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c  AND a IS NOT NUL
1e20: 4c 3b 0a 7d 20 7b 31 20 32 20 33 20 32 20 32 20  L;.} {1 2 3 2 2 
1e30: 33 7d 0a 0a 69 66 20 30 20 7b 20 20 23 20 51 75  3}..if 0 {  # Qu
1e40: 65 72 79 20 70 6c 61 6e 6e 65 72 20 6e 6f 20 6c  ery planner no l
1e50: 6f 6e 67 65 72 20 64 6f 65 73 20 74 68 69 73 0a  onger does this.
1e60: 23 20 56 65 72 69 66 79 20 74 68 61 74 20 77 68  # Verify that wh
1e70: 65 6e 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  en there are mul
1e80: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  tiple tables in 
1e90: 61 20 6a 6f 69 6e 20 77 68 69 63 68 20 6d 75 73  a join which mus
1ea0: 74 20 62 65 0a 23 20 66 75 6c 6c 20 74 61 62 6c  t be.# full tabl
1eb0: 65 20 73 63 61 6e 73 20 74 68 61 74 20 74 68 65  e scans that the
1ec0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61   query planner a
1ed0: 74 74 65 6d 70 74 73 20 70 75 74 20 74 68 65 20  ttempts put the 
1ee0: 74 61 62 6c 65 20 77 69 74 68 0a 23 20 74 68 65  table with.# the
1ef0: 20 66 65 77 65 73 74 20 6e 75 6d 62 65 72 20 6f   fewest number o
1f00: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 61 73  f output rows as
1f10: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
1f20: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1f30: 73 74 20 77 68 65 72 65 33 2d 34 2e 30 20 7b 0a  st where3-4.0 {.
1f40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1f50: 34 30 30 28 61 20 49 4e 54 45 47 45 52 20 50 52  400(a INTEGER PR
1f60: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
1f70: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1f80: 20 74 34 30 31 28 70 20 49 4e 54 45 47 45 52 20   t401(p INTEGER 
1f90: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 71 2c 20  PRIMARY KEY, q, 
1fa0: 72 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  r);.  CREATE TAB
1fb0: 4c 45 20 74 34 30 32 28 78 20 49 4e 54 45 47 45  LE t402(x INTEGE
1fc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
1fd0: 2c 20 7a 29 3b 0a 20 20 45 58 50 4c 41 49 4e 20  , z);.  EXPLAIN 
1fe0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
1ff0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 30 30 2c  ECT * FROM t400,
2000: 20 74 34 30 31 2c 20 74 34 30 32 20 57 48 45 52   t401, t402 WHER
2010: 45 20 74 34 30 32 2e 7a 20 47 4c 4f 42 20 27 61  E t402.z GLOB 'a
2020: 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  bc*';.} {.  0 0 
2030: 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34  2 {SCAN TABLE t4
2040: 30 32 7d 20 0a 20 20 30 20 31 20 30 20 7b 53 43  02} .  0 1 0 {SC
2050: 41 4e 20 54 41 42 4c 45 20 74 34 30 30 7d 20 0a  AN TABLE t400} .
2060: 20 20 30 20 32 20 31 20 7b 53 43 41 4e 20 54 41    0 2 1 {SCAN TA
2070: 42 4c 45 20 74 34 30 31 7d 0a 7d 0a 64 6f 5f 65  BLE t401}.}.do_e
2080: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72  xecsql_test wher
2090: 65 33 2d 34 2e 31 20 7b 0a 20 20 45 58 50 4c 41  e3-4.1 {.  EXPLA
20a0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
20b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
20c0: 30 30 2c 20 74 34 30 31 2c 20 74 34 30 32 20 57  00, t401, t402 W
20d0: 48 45 52 45 20 74 34 30 31 2e 72 20 47 4c 4f 42  HERE t401.r GLOB
20e0: 20 27 61 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30   'abc*';.} {.  0
20f0: 20 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 1 {SCAN TABLE
2100: 20 74 34 30 31 7d 20 0a 20 20 30 20 31 20 30 20   t401} .  0 1 0 
2110: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30 30  {SCAN TABLE t400
2120: 7d 20 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e  } .  0 2 2 {SCAN
2130: 20 54 41 42 4c 45 20 74 34 30 32 7d 0a 7d 0a 64   TABLE t402}.}.d
2140: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
2150: 68 65 72 65 33 2d 34 2e 32 20 7b 0a 20 20 45 58  here3-4.2 {.  EX
2160: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2170: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2180: 20 74 34 30 30 2c 20 74 34 30 31 2c 20 74 34 30   t400, t401, t40
2190: 32 20 57 48 45 52 45 20 74 34 30 30 2e 63 20 47  2 WHERE t400.c G
21a0: 4c 4f 42 20 27 61 62 63 2a 27 3b 0a 7d 20 7b 0a  LOB 'abc*';.} {.
21b0: 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41    0 0 0 {SCAN TA
21c0: 42 4c 45 20 74 34 30 30 7d 20 0a 20 20 30 20 31  BLE t400} .  0 1
21d0: 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   1 {SCAN TABLE t
21e0: 34 30 31 7d 20 0a 20 20 30 20 32 20 32 20 7b 53  401} .  0 2 2 {S
21f0: 43 41 4e 20 54 41 42 4c 45 20 74 34 30 32 7d 0a  CAN TABLE t402}.
2200: 7d 0a 7d 20 3b 23 20 65 6e 64 69 66 0a 0a 23 20  }.} ;# endif..# 
2210: 56 65 72 69 66 79 20 74 68 61 74 20 61 20 70 65  Verify that a pe
2220: 72 66 6f 72 6d 61 6e 63 65 20 72 65 67 72 65 73  rformance regres
2230: 73 69 6f 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  sion encountered
2240: 20 62 79 20 66 69 72 65 66 6f 78 0a 23 20 68 61   by firefox.# ha
2250: 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a  s been fixed..#.
2260: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2270: 77 68 65 72 65 33 2d 35 2e 30 20 7b 0a 20 20 43  where3-5.0 {.  C
2280: 52 45 41 54 45 20 54 41 42 4c 45 20 61 61 61 20  REATE TABLE aaa 
2290: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
22a0: 41 52 59 20 4b 45 59 2c 20 74 79 70 65 20 49 4e  ARY KEY, type IN
22b0: 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  TEGER,.         
22c0: 20 20 20 20 20 20 20 20 20 20 20 66 6b 20 49 4e             fk IN
22d0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 4e 55  TEGER DEFAULT NU
22e0: 4c 4c 2c 20 70 61 72 65 6e 74 20 49 4e 54 45 47  LL, parent INTEG
22f0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
2300: 20 20 20 20 20 20 20 20 70 6f 73 69 74 69 6f 6e          position
2310: 20 49 4e 54 45 47 45 52 2c 20 74 69 74 6c 65 20   INTEGER, title 
2320: 4c 4f 4e 47 56 41 52 43 48 41 52 2c 0a 20 20 20  LONGVARCHAR,.   
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 6b 65 79 77 6f 72 64 5f 69 64 20 49 4e 54 45   keyword_id INTE
2350: 47 45 52 2c 20 66 6f 6c 64 65 72 5f 74 79 70 65  GER, folder_type
2360: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
2370: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 65 41             dateA
2380: 64 64 65 64 20 49 4e 54 45 47 45 52 2c 20 6c 61  dded INTEGER, la
2390: 73 74 4d 6f 64 69 66 69 65 64 20 49 4e 54 45 47  stModified INTEG
23a0: 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  ER);.  CREATE IN
23b0: 44 45 58 20 61 61 61 5f 31 31 31 20 4f 4e 20 61  DEX aaa_111 ON a
23c0: 61 61 20 28 66 6b 2c 20 74 79 70 65 29 3b 0a 20  aa (fk, type);. 
23d0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 61   CREATE INDEX aa
23e0: 61 5f 32 32 32 20 4f 4e 20 61 61 61 20 28 70 61  a_222 ON aaa (pa
23f0: 72 65 6e 74 2c 20 70 6f 73 69 74 69 6f 6e 29 3b  rent, position);
2400: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2410: 61 61 61 5f 33 33 33 20 4f 4e 20 61 61 61 20 28  aaa_333 ON aaa (
2420: 66 6b 2c 20 6c 61 73 74 4d 6f 64 69 66 69 65 64  fk, lastModified
2430: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
2440: 45 20 62 62 62 20 28 69 64 20 49 4e 54 45 47 45  E bbb (id INTEGE
2450: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
2460: 79 70 65 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  ype INTEGER,.   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 66 6b 20 49 4e 54 45 47 45 52 20 44 45 46 41   fk INTEGER DEFA
2490: 55 4c 54 20 4e 55 4c 4c 2c 20 70 61 72 65 6e 74  ULT NULL, parent
24a0: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
24c0: 73 69 74 69 6f 6e 20 49 4e 54 45 47 45 52 2c 20  sition INTEGER, 
24d0: 74 69 74 6c 65 20 4c 4f 4e 47 56 41 52 43 48 41  title LONGVARCHA
24e0: 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
24f0: 20 20 20 20 20 20 20 6b 65 79 77 6f 72 64 5f 69         keyword_i
2500: 64 20 49 4e 54 45 47 45 52 2c 20 66 6f 6c 64 65  d INTEGER, folde
2510: 72 5f 74 79 70 65 20 54 45 58 54 2c 0a 20 20 20  r_type TEXT,.   
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 64 61 74 65 41 64 64 65 64 20 49 4e 54 45 47   dateAdded INTEG
2540: 45 52 2c 20 6c 61 73 74 4d 6f 64 69 66 69 65 64  ER, lastModified
2550: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 43 52 45   INTEGER);.  CRE
2560: 41 54 45 20 49 4e 44 45 58 20 62 62 62 5f 31 31  ATE INDEX bbb_11
2570: 31 20 4f 4e 20 62 62 62 20 28 66 6b 2c 20 74 79  1 ON bbb (fk, ty
2580: 70 65 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  pe);.  CREATE IN
2590: 44 45 58 20 62 62 62 5f 32 32 32 20 4f 4e 20 62  DEX bbb_222 ON b
25a0: 62 62 20 28 70 61 72 65 6e 74 2c 20 70 6f 73 69  bb (parent, posi
25b0: 74 69 6f 6e 29 3b 0a 20 20 43 52 45 41 54 45 20  tion);.  CREATE 
25c0: 49 4e 44 45 58 20 62 62 62 5f 33 33 33 20 4f 4e  INDEX bbb_333 ON
25d0: 20 62 62 62 20 28 66 6b 2c 20 6c 61 73 74 4d 6f   bbb (fk, lastMo
25e0: 64 69 66 69 65 64 29 3b 0a 0a 20 20 45 58 50 4c  dified);..  EXPL
25f0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  AIN QUERY PLAN. 
2600: 20 20 53 45 4c 45 43 54 20 62 62 62 2e 74 69 74    SELECT bbb.tit
2610: 6c 65 20 41 53 20 74 61 67 5f 74 69 74 6c 65 20  le AS tag_title 
2620: 0a 20 20 20 20 20 46 52 4f 4d 20 61 61 61 20 4a  .     FROM aaa J
2630: 4f 49 4e 20 62 62 62 20 4f 4e 20 62 62 62 2e 69  OIN bbb ON bbb.i
2640: 64 20 3d 20 61 61 61 2e 70 61 72 65 6e 74 20 20  d = aaa.parent  
2650: 0a 20 20 20 20 57 48 45 52 45 20 61 61 61 2e 66  .    WHERE aaa.f
2660: 6b 20 3d 20 27 63 6f 6e 73 74 61 6e 74 27 0a 20  k = 'constant'. 
2670: 20 20 20 20 20 41 4e 44 20 4c 45 4e 47 54 48 28       AND LENGTH(
2680: 62 62 62 2e 74 69 74 6c 65 29 20 3e 20 30 0a 20  bbb.title) > 0. 
2690: 20 20 20 20 20 41 4e 44 20 62 62 62 2e 70 61 72       AND bbb.par
26a0: 65 6e 74 20 3d 20 34 0a 20 20 20 20 4f 52 44 45  ent = 4.    ORDE
26b0: 52 20 42 59 20 62 62 62 2e 74 69 74 6c 65 20 43  R BY bbb.title C
26c0: 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20 41 53  OLLATE NOCASE AS
26d0: 43 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  C;.} {.  0 0 0 {
26e0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 61 61 61  SEARCH TABLE aaa
26f0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 61 61 61   USING INDEX aaa
2700: 5f 33 33 33 20 28 66 6b 3d 3f 29 7d 20 0a 20 20  _333 (fk=?)} .  
2710: 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41  0 1 1 {SEARCH TA
2720: 42 4c 45 20 62 62 62 20 55 53 49 4e 47 20 49 4e  BLE bbb USING IN
2730: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2740: 59 20 28 72 6f 77 69 64 3d 3f 29 7d 20 0a 20 20  Y (rowid=?)} .  
2750: 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  0 0 0 {USE TEMP 
2760: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
2770: 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71   BY}.}.do_execsq
2780: 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 35 2e  l_test where3-5.
2790: 31 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  1 {.  EXPLAIN QU
27a0: 45 52 59 20 50 4c 41 4e 0a 20 20 20 53 45 4c 45  ERY PLAN.   SELE
27b0: 43 54 20 62 62 62 2e 74 69 74 6c 65 20 41 53 20  CT bbb.title AS 
27c0: 74 61 67 5f 74 69 74 6c 65 20 0a 20 20 20 20 20  tag_title .     
27d0: 46 52 4f 4d 20 61 61 61 20 4a 4f 49 4e 20 61 61  FROM aaa JOIN aa
27e0: 61 20 41 53 20 62 62 62 20 4f 4e 20 62 62 62 2e  a AS bbb ON bbb.
27f0: 69 64 20 3d 20 61 61 61 2e 70 61 72 65 6e 74 20  id = aaa.parent 
2800: 20 0a 20 20 20 20 57 48 45 52 45 20 61 61 61 2e   .    WHERE aaa.
2810: 66 6b 20 3d 20 27 63 6f 6e 73 74 61 6e 74 27 0a  fk = 'constant'.
2820: 20 20 20 20 20 20 41 4e 44 20 4c 45 4e 47 54 48        AND LENGTH
2830: 28 62 62 62 2e 74 69 74 6c 65 29 20 3e 20 30 0a  (bbb.title) > 0.
2840: 20 20 20 20 20 20 41 4e 44 20 62 62 62 2e 70 61        AND bbb.pa
2850: 72 65 6e 74 20 3d 20 34 0a 20 20 20 20 4f 52 44  rent = 4.    ORD
2860: 45 52 20 42 59 20 62 62 62 2e 74 69 74 6c 65 20  ER BY bbb.title 
2870: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20 41  COLLATE NOCASE A
2880: 53 43 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20  SC;.} {.  0 0 0 
2890: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 61 61  {SEARCH TABLE aa
28a0: 61 20 55 53 49 4e 47 20 49 4e 44 45 58 20 61 61  a USING INDEX aa
28b0: 61 5f 33 33 33 20 28 66 6b 3d 3f 29 7d 20 0a 20  a_333 (fk=?)} . 
28c0: 20 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 54   0 1 1 {SEARCH T
28d0: 41 42 4c 45 20 61 61 61 20 41 53 20 62 62 62 20  ABLE aaa AS bbb 
28e0: 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
28f0: 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
2900: 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 55  =?)} .  0 0 0 {U
2910: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
2920: 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 64  OR ORDER BY}.}.d
2930: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
2940: 68 65 72 65 33 2d 35 2e 32 20 7b 0a 20 20 45 58  here3-5.2 {.  EX
2950: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2960: 0a 20 20 20 53 45 4c 45 43 54 20 62 62 62 2e 74  .   SELECT bbb.t
2970: 69 74 6c 65 20 41 53 20 74 61 67 5f 74 69 74 6c  itle AS tag_titl
2980: 65 20 0a 20 20 20 20 20 46 52 4f 4d 20 62 62 62  e .     FROM bbb
2990: 20 4a 4f 49 4e 20 61 61 61 20 4f 4e 20 62 62 62   JOIN aaa ON bbb
29a0: 2e 69 64 20 3d 20 61 61 61 2e 70 61 72 65 6e 74  .id = aaa.parent
29b0: 20 20 0a 20 20 20 20 57 48 45 52 45 20 61 61 61    .    WHERE aaa
29c0: 2e 66 6b 20 3d 20 27 63 6f 6e 73 74 61 6e 74 27  .fk = 'constant'
29d0: 0a 20 20 20 20 20 20 41 4e 44 20 4c 45 4e 47 54  .      AND LENGT
29e0: 48 28 62 62 62 2e 74 69 74 6c 65 29 20 3e 20 30  H(bbb.title) > 0
29f0: 0a 20 20 20 20 20 20 41 4e 44 20 62 62 62 2e 70  .      AND bbb.p
2a00: 61 72 65 6e 74 20 3d 20 34 0a 20 20 20 20 4f 52  arent = 4.    OR
2a10: 44 45 52 20 42 59 20 62 62 62 2e 74 69 74 6c 65  DER BY bbb.title
2a20: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20   COLLATE NOCASE 
2a30: 41 53 43 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 31  ASC;.} {.  0 0 1
2a40: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 61   {SEARCH TABLE a
2a50: 61 61 20 55 53 49 4e 47 20 49 4e 44 45 58 20 61  aa USING INDEX a
2a60: 61 61 5f 33 33 33 20 28 66 6b 3d 3f 29 7d 20 0a  aa_333 (fk=?)} .
2a70: 20 20 30 20 31 20 30 20 7b 53 45 41 52 43 48 20    0 1 0 {SEARCH 
2a80: 54 41 42 4c 45 20 62 62 62 20 55 53 49 4e 47 20  TABLE bbb USING 
2a90: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2aa0: 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 20 0a  KEY (rowid=?)} .
2ab0: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
2ac0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
2ad0: 45 52 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78 65 63  ER BY}.}.do_exec
2ae0: 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d  sql_test where3-
2af0: 35 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  5.3 {.  EXPLAIN 
2b00: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 53 45  QUERY PLAN.   SE
2b10: 4c 45 43 54 20 62 62 62 2e 74 69 74 6c 65 20 41  LECT bbb.title A
2b20: 53 20 74 61 67 5f 74 69 74 6c 65 20 0a 20 20 20  S tag_title .   
2b30: 20 20 46 52 4f 4d 20 61 61 61 20 41 53 20 62 62    FROM aaa AS bb
2b40: 62 20 4a 4f 49 4e 20 61 61 61 20 4f 4e 20 62 62  b JOIN aaa ON bb
2b50: 62 2e 69 64 20 3d 20 61 61 61 2e 70 61 72 65 6e  b.id = aaa.paren
2b60: 74 20 20 0a 20 20 20 20 57 48 45 52 45 20 61 61  t  .    WHERE aa
2b70: 61 2e 66 6b 20 3d 20 27 63 6f 6e 73 74 61 6e 74  a.fk = 'constant
2b80: 27 0a 20 20 20 20 20 20 41 4e 44 20 4c 45 4e 47  '.      AND LENG
2b90: 54 48 28 62 62 62 2e 74 69 74 6c 65 29 20 3e 20  TH(bbb.title) > 
2ba0: 30 0a 20 20 20 20 20 20 41 4e 44 20 62 62 62 2e  0.      AND bbb.
2bb0: 70 61 72 65 6e 74 20 3d 20 34 0a 20 20 20 20 4f  parent = 4.    O
2bc0: 52 44 45 52 20 42 59 20 62 62 62 2e 74 69 74 6c  RDER BY bbb.titl
2bd0: 65 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  e COLLATE NOCASE
2be0: 20 41 53 43 3b 0a 7d 20 7b 0a 20 20 30 20 30 20   ASC;.} {.  0 0 
2bf0: 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  1 {SEARCH TABLE 
2c00: 61 61 61 20 55 53 49 4e 47 20 49 4e 44 45 58 20  aaa USING INDEX 
2c10: 61 61 61 5f 33 33 33 20 28 66 6b 3d 3f 29 7d 20  aaa_333 (fk=?)} 
2c20: 0a 20 20 30 20 31 20 30 20 7b 53 45 41 52 43 48  .  0 1 0 {SEARCH
2c30: 20 54 41 42 4c 45 20 61 61 61 20 41 53 20 62 62   TABLE aaa AS bb
2c40: 62 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  b USING INTEGER 
2c50: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
2c60: 69 64 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30 20  id=?)} .  0 0 0 
2c70: 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  {USE TEMP B-TREE
2c80: 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d   FOR ORDER BY}.}
2c90: 0a 0a 23 20 4e 61 6d 65 20 72 65 73 6f 6c 75 74  ..# Name resolut
2ca0: 69 6f 6e 20 77 69 74 68 20 4e 41 54 55 52 41 4c  ion with NATURAL
2cb0: 20 4a 4f 49 4e 20 61 6e 64 20 55 53 49 4e 47 0a   JOIN and USING.
2cc0: 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33  #.do_test where3
2cd0: 2d 36 2e 73 65 74 75 70 20 7b 0a 20 20 64 62 20  -6.setup {.  db 
2ce0: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
2cf0: 45 20 54 41 42 4c 45 20 74 36 77 28 61 2c 20 77  E TABLE t6w(a, w
2d00: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d10: 54 4f 20 74 36 77 20 56 41 4c 55 45 53 28 31 2c  TO t6w VALUES(1,
2d20: 20 27 77 2d 6f 6e 65 27 29 3b 0a 20 20 20 20 49   'w-one');.    I
2d30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 77 20 56  NSERT INTO t6w V
2d40: 41 4c 55 45 53 28 32 2c 20 27 77 2d 74 77 6f 27  ALUES(2, 'w-two'
2d50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d60: 54 4f 20 74 36 77 20 56 41 4c 55 45 53 28 39 2c  TO t6w VALUES(9,
2d70: 20 27 77 2d 6e 69 6e 65 27 29 3b 0a 20 20 20 20   'w-nine');.    
2d80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 78  CREATE TABLE t6x
2d90: 28 61 2c 20 78 29 3b 0a 20 20 20 20 49 4e 53 45  (a, x);.    INSE
2da0: 52 54 20 49 4e 54 4f 20 74 36 78 20 56 41 4c 55  RT INTO t6x VALU
2db0: 45 53 28 31 2c 20 27 78 2d 6f 6e 65 27 29 3b 0a  ES(1, 'x-one');.
2dc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2dd0: 74 36 78 20 56 41 4c 55 45 53 28 33 2c 20 27 78  t6x VALUES(3, 'x
2de0: 2d 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e  -three');.    IN
2df0: 53 45 52 54 20 49 4e 54 4f 20 74 36 78 20 56 41  SERT INTO t6x VA
2e00: 4c 55 45 53 28 39 2c 20 27 78 2d 6e 69 6e 65 27  LUES(9, 'x-nine'
2e10: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
2e20: 42 4c 45 20 74 36 79 28 61 2c 20 79 29 3b 0a 20  BLE t6y(a, y);. 
2e30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2e40: 36 79 20 56 41 4c 55 45 53 28 31 2c 20 27 79 2d  6y VALUES(1, 'y-
2e50: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
2e60: 54 20 49 4e 54 4f 20 74 36 79 20 56 41 4c 55 45  T INTO t6y VALUE
2e70: 53 28 34 2c 20 27 79 2d 66 6f 75 72 27 29 3b 0a  S(4, 'y-four');.
2e80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2e90: 74 36 79 20 56 41 4c 55 45 53 28 39 2c 20 27 79  t6y VALUES(9, 'y
2ea0: 2d 6e 69 6e 65 27 29 3b 0a 20 20 20 20 43 52 45  -nine');.    CRE
2eb0: 41 54 45 20 54 41 42 4c 45 20 74 36 7a 28 61 2c  ATE TABLE t6z(a,
2ec0: 20 7a 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   z);.    INSERT 
2ed0: 49 4e 54 4f 20 74 36 7a 20 56 41 4c 55 45 53 28  INTO t6z VALUES(
2ee0: 31 2c 20 27 7a 2d 6f 6e 65 27 29 3b 0a 20 20 20  1, 'z-one');.   
2ef0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 7a   INSERT INTO t6z
2f00: 20 56 41 4c 55 45 53 28 35 2c 20 27 7a 2d 66 69   VALUES(5, 'z-fi
2f10: 76 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ve');.    INSERT
2f20: 20 49 4e 54 4f 20 74 36 7a 20 56 41 4c 55 45 53   INTO t6z VALUES
2f30: 28 39 2c 20 27 7a 2d 6e 69 6e 65 27 29 3b 0a 20  (9, 'z-nine');. 
2f40: 20 7d 0a 7d 20 7b 7d 0a 73 65 74 20 63 6e 74 20   }.} {}.set cnt 
2f50: 30 0a 66 6f 72 65 61 63 68 20 70 72 65 64 69 63  0.foreach predic
2f60: 61 74 65 20 7b 0a 20 20 20 7b 7d 0a 20 20 20 7b  ate {.   {}.   {
2f70: 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20 20 7b  ORDER BY a}.   {
2f80: 4f 52 44 45 52 20 42 59 20 74 36 77 2e 61 7d 0a  ORDER BY t6w.a}.
2f90: 20 20 20 7b 57 48 45 52 45 20 61 3e 30 7d 0a 20     {WHERE a>0}. 
2fa0: 20 20 7b 57 48 45 52 45 20 74 36 79 2e 61 3e 30    {WHERE t6y.a>0
2fb0: 7d 0a 20 20 20 7b 57 48 45 52 45 20 61 3e 30 20  }.   {WHERE a>0 
2fc0: 4f 52 44 45 52 20 42 59 20 61 7d 0a 7d 20 7b 0a  ORDER BY a}.} {.
2fd0: 20 20 69 6e 63 72 20 63 6e 74 0a 20 20 64 6f 5f    incr cnt.  do_
2fe0: 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e 24 63  test where3-6.$c
2ff0: 6e 74 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 73  nt.1 {.    set s
3000: 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql "SELECT * FRO
3010: 4d 20 74 36 77 20 4e 41 54 55 52 41 4c 20 4a 4f  M t6w NATURAL JO
3020: 49 4e 20 74 36 78 20 4e 41 54 55 52 41 4c 20 4a  IN t6x NATURAL J
3030: 4f 49 4e 20 74 36 79 22 0a 20 20 20 20 61 70 70  OIN t6y".    app
3040: 65 6e 64 20 73 71 6c 20 22 20 4e 41 54 55 52 41  end sql " NATURA
3050: 4c 20 4a 4f 49 4e 20 74 36 7a 20 22 0a 20 20 20  L JOIN t6z ".   
3060: 20 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70   append sql $::p
3070: 72 65 64 69 63 61 74 65 0a 20 20 20 20 64 62 20  redicate.    db 
3080: 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31  eval $sql.  } {1
3090: 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f   w-one x-one y-o
30a0: 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e  ne z-one 9 w-nin
30b0: 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20  e x-nine y-nine 
30c0: 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73  z-nine}.  do_tes
30d0: 74 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e  t where3-6.$cnt.
30e0: 32 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20  2 {.    set sql 
30f0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
3100: 36 77 20 4a 4f 49 4e 20 74 36 78 20 55 53 49 4e  6w JOIN t6x USIN
3110: 47 28 61 29 20 4a 4f 49 4e 20 74 36 79 20 55 53  G(a) JOIN t6y US
3120: 49 4e 47 28 61 29 22 0a 20 20 20 20 61 70 70 65  ING(a)".    appe
3130: 6e 64 20 73 71 6c 20 22 20 4a 4f 49 4e 20 74 36  nd sql " JOIN t6
3140: 7a 20 55 53 49 4e 47 28 61 29 20 22 0a 20 20 20  z USING(a) ".   
3150: 20 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70   append sql $::p
3160: 72 65 64 69 63 61 74 65 0a 20 20 20 20 64 62 20  redicate.    db 
3170: 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31  eval $sql.  } {1
3180: 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f   w-one x-one y-o
3190: 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e  ne z-one 9 w-nin
31a0: 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20  e x-nine y-nine 
31b0: 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73  z-nine}.  do_tes
31c0: 74 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e  t where3-6.$cnt.
31d0: 33 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20  3 {.    set sql 
31e0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
31f0: 36 77 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  6w NATURAL JOIN 
3200: 74 36 78 20 4a 4f 49 4e 20 74 36 79 20 55 53 49  t6x JOIN t6y USI
3210: 4e 47 28 61 29 22 0a 20 20 20 20 61 70 70 65 6e  NG(a)".    appen
3220: 64 20 73 71 6c 20 22 20 4a 4f 49 4e 20 74 36 7a  d sql " JOIN t6z
3230: 20 55 53 49 4e 47 28 61 29 20 22 0a 20 20 20 20   USING(a) ".    
3240: 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72  append sql $::pr
3250: 65 64 69 63 61 74 65 0a 20 20 20 20 64 62 20 65  edicate.    db e
3260: 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20  val $sql.  } {1 
3270: 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e  w-one x-one y-on
3280: 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65  e z-one 9 w-nine
3290: 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a   x-nine y-nine z
32a0: 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74  -nine}.  do_test
32b0: 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e 34   where3-6.$cnt.4
32c0: 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22   {.    set sql "
32d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
32e0: 77 20 4a 4f 49 4e 20 74 36 78 20 55 53 49 4e 47  w JOIN t6x USING
32f0: 28 61 29 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e  (a) NATURAL JOIN
3300: 20 74 36 79 22 0a 20 20 20 20 61 70 70 65 6e 64   t6y".    append
3310: 20 73 71 6c 20 22 20 4a 4f 49 4e 20 74 36 7a 20   sql " JOIN t6z 
3320: 55 53 49 4e 47 28 61 29 20 22 0a 20 20 20 20 61  USING(a) ".    a
3330: 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65  ppend sql $::pre
3340: 64 69 63 61 74 65 0a 20 20 20 20 64 62 20 65 76  dicate.    db ev
3350: 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77  al $sql.  } {1 w
3360: 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65  -one x-one y-one
3370: 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20   z-one 9 w-nine 
3380: 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d  x-nine y-nine z-
3390: 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  nine}.  do_test 
33a0: 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e 35 20  where3-6.$cnt.5 
33b0: 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53  {.    set sql "S
33c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 77  ELECT * FROM t6w
33d0: 20 4a 4f 49 4e 20 74 36 78 20 55 53 49 4e 47 28   JOIN t6x USING(
33e0: 61 29 20 4a 4f 49 4e 20 74 36 79 20 55 53 49 4e  a) JOIN t6y USIN
33f0: 47 28 61 29 22 0a 20 20 20 20 61 70 70 65 6e 64  G(a)".    append
3400: 20 73 71 6c 20 22 20 4e 41 54 55 52 41 4c 20 4a   sql " NATURAL J
3410: 4f 49 4e 20 74 36 7a 20 22 0a 20 20 20 20 61 70  OIN t6z ".    ap
3420: 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64  pend sql $::pred
3430: 69 63 61 74 65 0a 20 20 20 20 64 62 20 65 76 61  icate.    db eva
3440: 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d  l $sql.  } {1 w-
3450: 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20  one x-one y-one 
3460: 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78  z-one 9 w-nine x
3470: 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e  -nine y-nine z-n
3480: 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ine}.  do_test w
3490: 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e 36 20 7b  here3-6.$cnt.6 {
34a0: 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45  .    set sql "SE
34b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20  LECT * FROM t6w 
34c0: 4a 4f 49 4e 20 74 36 78 20 55 53 49 4e 47 28 61  JOIN t6x USING(a
34d0: 29 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74  ) NATURAL JOIN t
34e0: 36 79 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73  6y".    append s
34f0: 71 6c 20 22 20 4e 41 54 55 52 41 4c 20 4a 4f 49  ql " NATURAL JOI
3500: 4e 20 74 36 7a 20 22 0a 20 20 20 20 61 70 70 65  N t6z ".    appe
3510: 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64 69 63  nd sql $::predic
3520: 61 74 65 0a 20 20 20 20 64 62 20 65 76 61 6c 20  ate.    db eval 
3530: 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e  $sql.  } {1 w-on
3540: 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d  e x-one y-one z-
3550: 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e  one 9 w-nine x-n
3560: 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e  ine y-nine z-nin
3570: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65  e}.  do_test whe
3580: 72 65 33 2d 36 2e 24 63 6e 74 2e 37 20 7b 0a 20  re3-6.$cnt.7 {. 
3590: 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45     set sql "SELE
35a0: 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4e 41  CT * FROM t6w NA
35b0: 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 78 20 4a  TURAL JOIN t6x J
35c0: 4f 49 4e 20 74 36 79 20 55 53 49 4e 47 28 61 29  OIN t6y USING(a)
35d0: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
35e0: 20 22 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20   " NATURAL JOIN 
35f0: 74 36 7a 20 22 0a 20 20 20 20 61 70 70 65 6e 64  t6z ".    append
3600: 20 73 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74   sql $::predicat
3610: 65 0a 20 20 20 20 64 62 20 65 76 61 6c 20 24 73  e.    db eval $s
3620: 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20  ql.  } {1 w-one 
3630: 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e  x-one y-one z-on
3640: 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e  e 9 w-nine x-nin
3650: 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d  e y-nine z-nine}
3660: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
3670: 33 2d 36 2e 24 63 6e 74 2e 38 20 7b 0a 20 20 20  3-6.$cnt.8 {.   
3680: 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54   set sql "SELECT
3690: 20 2a 20 46 52 4f 4d 20 74 36 77 20 4e 41 54 55   * FROM t6w NATU
36a0: 52 41 4c 20 4a 4f 49 4e 20 74 36 78 20 4e 41 54  RAL JOIN t6x NAT
36b0: 55 52 41 4c 20 4a 4f 49 4e 20 74 36 79 22 0a 20  URAL JOIN t6y". 
36c0: 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20     append sql " 
36d0: 4a 4f 49 4e 20 74 36 7a 20 55 53 49 4e 47 28 61  JOIN t6z USING(a
36e0: 29 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73  ) ".    append s
36f0: 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a  ql $::predicate.
3700: 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c      db eval $sql
3710: 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d  .  } {1 w-one x-
3720: 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20  one y-one z-one 
3730: 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20  9 w-nine x-nine 
3740: 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 7d  y-nine z-nine}.}
3750: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3760: 74 20 77 68 65 72 65 33 2d 37 2d 73 65 74 75 70  t where3-7-setup
3770: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
3780: 45 20 74 37 31 28 78 31 20 49 4e 54 45 47 45 52  E t71(x1 INTEGER
3790: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 31   PRIMARY KEY, y1
37a0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
37b0: 45 20 74 37 32 28 78 32 20 49 4e 54 45 47 45 52  E t72(x2 INTEGER
37c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 32   PRIMARY KEY, y2
37d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
37e0: 45 20 74 37 33 28 78 33 2c 20 79 33 29 3b 0a 20  E t73(x3, y3);. 
37f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
3800: 34 28 78 34 2c 20 79 34 29 3b 0a 20 20 49 4e 53  4(x4, y4);.  INS
3810: 45 52 54 20 49 4e 54 4f 20 74 37 31 20 56 41 4c  ERT INTO t71 VAL
3820: 55 45 53 28 31 32 33 2c 32 33 34 29 3b 0a 20 20  UES(123,234);.  
3830: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 32 20  INSERT INTO t72 
3840: 56 41 4c 55 45 53 28 32 33 34 2c 33 34 35 29 3b  VALUES(234,345);
3850: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3860: 37 33 20 56 41 4c 55 45 53 28 31 32 33 2c 32 33  73 VALUES(123,23
3870: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
3880: 4f 20 74 37 34 20 56 41 4c 55 45 53 28 32 33 34  O t74 VALUES(234
3890: 2c 33 34 35 29 3b 0a 20 20 49 4e 53 45 52 54 20  ,345);.  INSERT 
38a0: 49 4e 54 4f 20 74 37 34 20 56 41 4c 55 45 53 28  INTO t74 VALUES(
38b0: 32 33 34 2c 36 37 38 29 3b 0a 7d 20 7b 7d 0a 66  234,678);.} {}.f
38c0: 6f 72 65 61 63 68 20 64 69 73 61 62 6c 65 64 5f  oreach disabled_
38d0: 6f 70 74 20 7b 6e 6f 6e 65 20 6f 6d 69 74 2d 6e  opt {none omit-n
38e0: 6f 6f 70 2d 6a 6f 69 6e 20 61 6c 6c 7d 20 7b 0a  oop-join all} {.
38f0: 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
3900: 6f 6e 74 72 6f 6c 20 64 62 20 61 6c 6c 20 31 0a  ontrol db all 1.
3910: 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
3920: 6f 6e 74 72 6f 6c 20 64 62 20 24 64 69 73 61 62  ontrol db $disab
3930: 6c 65 64 5f 6f 70 74 20 30 0a 20 20 64 6f 5f 65  led_opt 0.  do_e
3940: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72  xecsql_test wher
3950: 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f  e3-7.$disabled_o
3960: 70 74 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45 43  pt.1 {.    SELEC
3970: 54 20 78 31 20 46 52 4f 4d 20 74 37 31 20 4c 45  T x1 FROM t71 LE
3980: 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e 20 78  FT JOIN t72 ON x
3990: 32 3d 79 31 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a  2=y1;.  } {123}.
39a0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
39b0: 74 20 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61  t where3-7.$disa
39c0: 62 6c 65 64 5f 6f 70 74 2e 32 20 7b 0a 20 20 20  bled_opt.2 {.   
39d0: 20 53 45 4c 45 43 54 20 78 31 20 46 52 4f 4d 20   SELECT x1 FROM 
39e0: 74 37 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37  t71 LEFT JOIN t7
39f0: 32 20 4f 4e 20 78 32 3d 79 31 20 57 48 45 52 45  2 ON x2=y1 WHERE
3a00: 20 79 32 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 7d   y2 IS NULL;.  }
3a10: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   {}.  do_execsql
3a20: 5f 74 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24  _test where3-7.$
3a30: 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e 33 20 7b  disabled_opt.3 {
3a40: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 31 20 46  .    SELECT x1 F
3a50: 52 4f 4d 20 74 37 31 20 4c 45 46 54 20 4a 4f 49  ROM t71 LEFT JOI
3a60: 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79 31 20 57  N t72 ON x2=y1 W
3a70: 48 45 52 45 20 79 32 20 49 53 20 4e 4f 54 20 4e  HERE y2 IS NOT N
3a80: 55 4c 4c 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20  ULL;.  } {123}. 
3a90: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
3aa0: 20 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61 62   where3-7.$disab
3ab0: 6c 65 64 5f 6f 70 74 2e 34 20 7b 0a 20 20 20 20  led_opt.4 {.    
3ac0: 53 45 4c 45 43 54 20 78 31 20 46 52 4f 4d 20 74  SELECT x1 FROM t
3ad0: 37 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32  71 LEFT JOIN t72
3ae0: 20 4f 4e 20 78 32 3d 79 31 20 41 4e 44 20 79 32   ON x2=y1 AND y2
3af0: 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 7d 20 7b 31   IS NULL;.  } {1
3b00: 32 33 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  23}.  do_execsql
3b10: 5f 74 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24  _test where3-7.$
3b20: 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e 35 20 7b  disabled_opt.5 {
3b30: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 31 20 46  .    SELECT x1 F
3b40: 52 4f 4d 20 74 37 31 20 4c 45 46 54 20 4a 4f 49  ROM t71 LEFT JOI
3b50: 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79 31 20 41  N t72 ON x2=y1 A
3b60: 4e 44 20 79 32 20 49 53 20 4e 4f 54 20 4e 55 4c  ND y2 IS NOT NUL
3b70: 4c 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64  L;.  } {123}.  d
3b80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
3b90: 68 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65  here3-7.$disable
3ba0: 64 5f 6f 70 74 2e 36 20 7b 0a 20 20 20 20 53 45  d_opt.6 {.    SE
3bb0: 4c 45 43 54 20 78 33 20 46 52 4f 4d 20 74 37 33  LECT x3 FROM t73
3bc0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f   LEFT JOIN t72 O
3bd0: 4e 20 78 32 3d 79 33 3b 0a 20 20 7d 20 7b 31 32  N x2=y3;.  } {12
3be0: 33 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  3}.  do_execsql_
3bf0: 74 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24 64  test where3-7.$d
3c00: 69 73 61 62 6c 65 64 5f 6f 70 74 2e 37 20 7b 0a  isabled_opt.7 {.
3c10: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
3c20: 4e 43 54 20 78 33 20 46 52 4f 4d 20 74 37 33 20  NCT x3 FROM t73 
3c30: 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e  LEFT JOIN t72 ON
3c40: 20 78 32 3d 79 33 3b 0a 20 20 7d 20 7b 31 32 33   x2=y3;.  } {123
3c50: 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.  do_execsql_t
3c60: 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24 64 69  est where3-7.$di
3c70: 73 61 62 6c 65 64 5f 6f 70 74 2e 38 20 7b 0a 20  sabled_opt.8 {. 
3c80: 20 20 20 53 45 4c 45 43 54 20 78 33 20 46 52 4f     SELECT x3 FRO
3c90: 4d 20 74 37 33 20 4c 45 46 54 20 4a 4f 49 4e 20  M t73 LEFT JOIN 
3ca0: 74 37 34 20 4f 4e 20 78 34 3d 79 33 3b 0a 20 20  t74 ON x4=y3;.  
3cb0: 7d 20 7b 31 32 33 20 31 32 33 7d 0a 20 20 64 6f  } {123 123}.  do
3cc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
3cd0: 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64  ere3-7.$disabled
3ce0: 5f 6f 70 74 2e 39 20 7b 0a 20 20 20 20 53 45 4c  _opt.9 {.    SEL
3cf0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 33 20  ECT DISTINCT x3 
3d00: 46 52 4f 4d 20 74 37 33 20 4c 45 46 54 20 4a 4f  FROM t73 LEFT JO
3d10: 49 4e 20 74 37 34 20 4f 4e 20 78 34 3d 79 33 3b  IN t74 ON x4=y3;
3d20: 0a 20 20 7d 20 7b 31 32 33 7d 0a 7d 0a 0a 0a 66  .  } {123}.}...f
3d30: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.