/ Hex Artifact Content
Login

Artifact d28c51f257e60be30f74308fa385ceeddfb54a6e:


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 43 52 45  ES(1,2,3);.  CRE
1ba0: 41 54 45 20 54 41 42 4c 45 20 74 33 30 32 28 78  ATE TABLE t302(x
1bb0: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
1bc0: 4e 54 4f 20 74 33 30 32 20 56 41 4c 55 45 53 28  NTO t302 VALUES(
1bd0: 34 2c 35 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b  4,5);.  ANALYZE;
1be0: 0a 20 20 65 78 70 6c 61 69 6e 20 71 75 65 72 79  .  explain query
1bf0: 20 70 6c 61 6e 20 53 45 4c 45 43 54 20 2a 20 46   plan SELECT * F
1c00: 52 4f 4d 20 74 33 30 32 2c 20 74 33 30 31 20 57  ROM t302, t301 W
1c10: 48 45 52 45 20 74 33 30 32 2e 78 3d 35 20 41 4e  HERE t302.x=5 AN
1c20: 44 20 74 33 30 31 2e 61 3d 74 33 30 32 2e 79 3b  D t301.a=t302.y;
1c30: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
1c40: 41 4e 20 54 41 42 4c 45 20 74 33 30 32 7d 20 0a  AN TABLE t302} .
1c50: 20 20 30 20 31 20 31 20 7b 53 45 41 52 43 48 20    0 1 1 {SEARCH 
1c60: 54 41 42 4c 45 20 74 33 30 31 20 55 53 49 4e 47  TABLE t301 USING
1c70: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1c80: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a   KEY (rowid=?)}.
1c90: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1ca0: 74 20 77 68 65 72 65 33 2d 33 2e 31 20 7b 0a 20  t where3-3.1 {. 
1cb0: 20 65 78 70 6c 61 69 6e 20 71 75 65 72 79 20 70   explain query p
1cc0: 6c 61 6e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  lan.  SELECT * F
1cd0: 52 4f 4d 20 74 33 30 31 2c 20 74 33 30 32 20 57  ROM t301, t302 W
1ce0: 48 45 52 45 20 74 33 30 32 2e 78 3d 35 20 41 4e  HERE t302.x=5 AN
1cf0: 44 20 74 33 30 31 2e 61 3d 74 33 30 32 2e 79 3b  D t301.a=t302.y;
1d00: 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 43  .} {.  0 0 1 {SC
1d10: 41 4e 20 54 41 42 4c 45 20 74 33 30 32 7d 20 0a  AN TABLE t302} .
1d20: 20 20 30 20 31 20 30 20 7b 53 45 41 52 43 48 20    0 1 0 {SEARCH 
1d30: 54 41 42 4c 45 20 74 33 30 31 20 55 53 49 4e 47  TABLE t301 USING
1d40: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1d50: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a   KEY (rowid=?)}.
1d60: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1d70: 74 20 77 68 65 72 65 33 2d 33 2e 32 20 7b 0a 20  t where3-3.2 {. 
1d80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1d90: 33 30 31 20 57 48 45 52 45 20 63 3d 33 20 41 4e  301 WHERE c=3 AN
1da0: 44 20 61 20 49 53 20 4e 55 4c 4c 3b 0a 7d 20 7b  D a IS NULL;.} {
1db0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1dc0: 74 20 77 68 65 72 65 33 2d 33 2e 33 20 7b 0a 20  t where3-3.3 {. 
1dd0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1de0: 33 30 31 20 57 48 45 52 45 20 63 3d 33 20 41 4e  301 WHERE c=3 AN
1df0: 44 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b  D a IS NOT NULL;
1e00: 0a 7d 20 7b 31 20 32 20 33 7d 0a 0a 69 66 20 30  .} {1 2 3}..if 0
1e10: 20 7b 20 20 23 20 51 75 65 72 79 20 70 6c 61 6e   {  # Query plan
1e20: 6e 65 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 64 6f  ner no longer do
1e30: 65 73 20 74 68 69 73 0a 23 20 56 65 72 69 66 79  es this.# Verify
1e40: 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 72 65   that when there
1e50: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 61   are multiple ta
1e60: 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 20 77  bles in a join w
1e70: 68 69 63 68 20 6d 75 73 74 20 62 65 0a 23 20 66  hich must be.# f
1e80: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 20  ull table scans 
1e90: 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
1ea0: 6c 61 6e 6e 65 72 20 61 74 74 65 6d 70 74 73 20  lanner attempts 
1eb0: 70 75 74 20 74 68 65 20 74 61 62 6c 65 20 77 69  put the table wi
1ec0: 74 68 0a 23 20 74 68 65 20 66 65 77 65 73 74 20  th.# the fewest 
1ed0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1ee0: 20 72 6f 77 73 20 61 73 20 74 68 65 20 6f 75 74   rows as the out
1ef0: 65 72 20 6c 6f 6f 70 2e 0a 23 0a 64 6f 5f 65 78  er loop..#.do_ex
1f00: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
1f10: 33 2d 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  3-4.0 {.  CREATE
1f20: 20 54 41 42 4c 45 20 74 34 30 30 28 61 20 49 4e   TABLE t400(a IN
1f30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1f40: 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41  Y, b, c);.  CREA
1f50: 54 45 20 54 41 42 4c 45 20 74 34 30 31 28 70 20  TE TABLE t401(p 
1f60: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1f70: 4b 45 59 2c 20 71 2c 20 72 29 3b 0a 20 20 43 52  KEY, q, r);.  CR
1f80: 45 41 54 45 20 54 41 42 4c 45 20 74 34 30 32 28  EATE TABLE t402(
1f90: 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  x INTEGER PRIMAR
1fa0: 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b 0a 20 20  Y KEY, y, z);.  
1fb0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1fc0: 41 4e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  AN.  SELECT * FR
1fd0: 4f 4d 20 74 34 30 30 2c 20 74 34 30 31 2c 20 74  OM t400, t401, t
1fe0: 34 30 32 20 57 48 45 52 45 20 74 34 30 32 2e 7a  402 WHERE t402.z
1ff0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 3b 0a 7d 20   GLOB 'abc*';.} 
2000: 7b 0a 20 20 30 20 30 20 32 20 7b 53 43 41 4e 20  {.  0 0 2 {SCAN 
2010: 54 41 42 4c 45 20 74 34 30 32 7d 20 0a 20 20 30  TABLE t402} .  0
2020: 20 31 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   1 0 {SCAN TABLE
2030: 20 74 34 30 30 7d 20 0a 20 20 30 20 32 20 31 20   t400} .  0 2 1 
2040: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30 31  {SCAN TABLE t401
2050: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
2060: 65 73 74 20 77 68 65 72 65 33 2d 34 2e 31 20 7b  est where3-4.1 {
2070: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
2080: 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 2a   PLAN.  SELECT *
2090: 20 46 52 4f 4d 20 74 34 30 30 2c 20 74 34 30 31   FROM t400, t401
20a0: 2c 20 74 34 30 32 20 57 48 45 52 45 20 74 34 30  , t402 WHERE t40
20b0: 31 2e 72 20 47 4c 4f 42 20 27 61 62 63 2a 27 3b  1.r GLOB 'abc*';
20c0: 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 43  .} {.  0 0 1 {SC
20d0: 41 4e 20 54 41 42 4c 45 20 74 34 30 31 7d 20 0a  AN TABLE t401} .
20e0: 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20 54 41    0 1 0 {SCAN TA
20f0: 42 4c 45 20 74 34 30 30 7d 20 0a 20 20 30 20 32  BLE t400} .  0 2
2100: 20 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   2 {SCAN TABLE t
2110: 34 30 32 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71  402}.}.do_execsq
2120: 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 34 2e  l_test where3-4.
2130: 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  2 {.  EXPLAIN QU
2140: 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43  ERY PLAN.  SELEC
2150: 54 20 2a 20 46 52 4f 4d 20 74 34 30 30 2c 20 74  T * FROM t400, t
2160: 34 30 31 2c 20 74 34 30 32 20 57 48 45 52 45 20  401, t402 WHERE 
2170: 74 34 30 30 2e 63 20 47 4c 4f 42 20 27 61 62 63  t400.c GLOB 'abc
2180: 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20  *';.} {.  0 0 0 
2190: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30 30  {SCAN TABLE t400
21a0: 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 43 41 4e  } .  0 1 1 {SCAN
21b0: 20 54 41 42 4c 45 20 74 34 30 31 7d 20 0a 20 20   TABLE t401} .  
21c0: 30 20 32 20 32 20 7b 53 43 41 4e 20 54 41 42 4c  0 2 2 {SCAN TABL
21d0: 45 20 74 34 30 32 7d 0a 7d 0a 7d 20 3b 23 20 65  E t402}.}.} ;# e
21e0: 6e 64 69 66 0a 0a 23 20 56 65 72 69 66 79 20 74  ndif..# Verify t
21f0: 68 61 74 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  hat a performanc
2200: 65 20 72 65 67 72 65 73 73 69 6f 6e 20 65 6e 63  e regression enc
2210: 6f 75 6e 74 65 72 65 64 20 62 79 20 66 69 72 65  ountered by fire
2220: 66 6f 78 0a 23 20 68 61 73 20 62 65 65 6e 20 66  fox.# has been f
2230: 69 78 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ixed..#.do_execs
2240: 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 35  ql_test where3-5
2250: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
2260: 42 4c 45 20 61 61 61 20 28 69 64 20 49 4e 54 45  BLE aaa (id INTE
2270: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2280: 20 74 79 70 65 20 49 4e 54 45 47 45 52 2c 0a 20   type INTEGER,. 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 66 6b 20 49 4e 54 45 47 45 52 20 44 45     fk INTEGER DE
22b0: 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 70 61 72 65  FAULT NULL, pare
22c0: 6e 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  nt INTEGER,.    
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 70 6f 73 69 74 69 6f 6e 20 49 4e 54 45 47 45 52  position INTEGER
22f0: 2c 20 74 69 74 6c 65 20 4c 4f 4e 47 56 41 52 43  , title LONGVARC
2300: 48 41 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  HAR,.           
2310: 20 20 20 20 20 20 20 20 20 6b 65 79 77 6f 72 64           keyword
2320: 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 66 6f 6c  _id INTEGER, fol
2330: 64 65 72 5f 74 79 70 65 20 54 45 58 54 2c 0a 20  der_type TEXT,. 
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 64 61 74 65 41 64 64 65 64 20 49 4e 54     dateAdded INT
2360: 45 47 45 52 2c 20 6c 61 73 74 4d 6f 64 69 66 69  EGER, lastModifi
2370: 65 64 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 43  ed INTEGER);.  C
2380: 52 45 41 54 45 20 49 4e 44 45 58 20 61 61 61 5f  REATE INDEX aaa_
2390: 31 31 31 20 4f 4e 20 61 61 61 20 28 66 6b 2c 20  111 ON aaa (fk, 
23a0: 74 79 70 65 29 3b 0a 20 20 43 52 45 41 54 45 20  type);.  CREATE 
23b0: 49 4e 44 45 58 20 61 61 61 5f 32 32 32 20 4f 4e  INDEX aaa_222 ON
23c0: 20 61 61 61 20 28 70 61 72 65 6e 74 2c 20 70 6f   aaa (parent, po
23d0: 73 69 74 69 6f 6e 29 3b 0a 20 20 43 52 45 41 54  sition);.  CREAT
23e0: 45 20 49 4e 44 45 58 20 61 61 61 5f 33 33 33 20  E INDEX aaa_333 
23f0: 4f 4e 20 61 61 61 20 28 66 6b 2c 20 6c 61 73 74  ON aaa (fk, last
2400: 4d 6f 64 69 66 69 65 64 29 3b 0a 20 20 43 52 45  Modified);.  CRE
2410: 41 54 45 20 54 41 42 4c 45 20 62 62 62 20 28 69  ATE TABLE bbb (i
2420: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
2430: 59 20 4b 45 59 2c 20 74 79 70 65 20 49 4e 54 45  Y KEY, type INTE
2440: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
2450: 20 20 20 20 20 20 20 20 20 66 6b 20 49 4e 54 45           fk INTE
2460: 47 45 52 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c  GER DEFAULT NULL
2470: 2c 20 70 61 72 65 6e 74 20 49 4e 54 45 47 45 52  , parent INTEGER
2480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2490: 20 20 20 20 20 20 70 6f 73 69 74 69 6f 6e 20 49        position I
24a0: 4e 54 45 47 45 52 2c 20 74 69 74 6c 65 20 4c 4f  NTEGER, title LO
24b0: 4e 47 56 41 52 43 48 41 52 2c 0a 20 20 20 20 20  NGVARCHAR,.     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
24d0: 65 79 77 6f 72 64 5f 69 64 20 49 4e 54 45 47 45  eyword_id INTEGE
24e0: 52 2c 20 66 6f 6c 64 65 72 5f 74 79 70 65 20 54  R, folder_type T
24f0: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
2500: 20 20 20 20 20 20 20 20 20 64 61 74 65 41 64 64           dateAdd
2510: 65 64 20 49 4e 54 45 47 45 52 2c 20 6c 61 73 74  ed INTEGER, last
2520: 4d 6f 64 69 66 69 65 64 20 49 4e 54 45 47 45 52  Modified INTEGER
2530: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
2540: 58 20 62 62 62 5f 31 31 31 20 4f 4e 20 62 62 62  X bbb_111 ON bbb
2550: 20 28 66 6b 2c 20 74 79 70 65 29 3b 0a 20 20 43   (fk, type);.  C
2560: 52 45 41 54 45 20 49 4e 44 45 58 20 62 62 62 5f  REATE INDEX bbb_
2570: 32 32 32 20 4f 4e 20 62 62 62 20 28 70 61 72 65  222 ON bbb (pare
2580: 6e 74 2c 20 70 6f 73 69 74 69 6f 6e 29 3b 0a 20  nt, position);. 
2590: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 62   CREATE INDEX bb
25a0: 62 5f 33 33 33 20 4f 4e 20 62 62 62 20 28 66 6b  b_333 ON bbb (fk
25b0: 2c 20 6c 61 73 74 4d 6f 64 69 66 69 65 64 29 3b  , lastModified);
25c0: 0a 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ..  EXPLAIN QUER
25d0: 59 20 50 4c 41 4e 0a 20 20 20 53 45 4c 45 43 54  Y PLAN.   SELECT
25e0: 20 62 62 62 2e 74 69 74 6c 65 20 41 53 20 74 61   bbb.title AS ta
25f0: 67 5f 74 69 74 6c 65 20 0a 20 20 20 20 20 46 52  g_title .     FR
2600: 4f 4d 20 61 61 61 20 4a 4f 49 4e 20 62 62 62 20  OM aaa JOIN bbb 
2610: 4f 4e 20 62 62 62 2e 69 64 20 3d 20 61 61 61 2e  ON bbb.id = aaa.
2620: 70 61 72 65 6e 74 20 20 0a 20 20 20 20 57 48 45  parent  .    WHE
2630: 52 45 20 61 61 61 2e 66 6b 20 3d 20 27 63 6f 6e  RE aaa.fk = 'con
2640: 73 74 61 6e 74 27 0a 20 20 20 20 20 20 41 4e 44  stant'.      AND
2650: 20 4c 45 4e 47 54 48 28 62 62 62 2e 74 69 74 6c   LENGTH(bbb.titl
2660: 65 29 20 3e 20 30 0a 20 20 20 20 20 20 41 4e 44  e) > 0.      AND
2670: 20 62 62 62 2e 70 61 72 65 6e 74 20 3d 20 34 0a   bbb.parent = 4.
2680: 20 20 20 20 4f 52 44 45 52 20 42 59 20 62 62 62      ORDER BY bbb
2690: 2e 74 69 74 6c 65 20 43 4f 4c 4c 41 54 45 20 4e  .title COLLATE N
26a0: 4f 43 41 53 45 20 41 53 43 3b 0a 7d 20 7b 0a 20  OCASE ASC;.} {. 
26b0: 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   0 0 0 {SEARCH T
26c0: 41 42 4c 45 20 61 61 61 20 55 53 49 4e 47 20 49  ABLE aaa USING I
26d0: 4e 44 45 58 20 61 61 61 5f 33 33 33 20 28 66 6b  NDEX aaa_333 (fk
26e0: 3d 3f 29 7d 20 0a 20 20 30 20 31 20 31 20 7b 53  =?)} .  0 1 1 {S
26f0: 45 41 52 43 48 20 54 41 42 4c 45 20 62 62 62 20  EARCH TABLE bbb 
2700: 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
2710: 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
2720: 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 55  =?)} .  0 0 0 {U
2730: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
2740: 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 64  OR ORDER BY}.}.d
2750: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
2760: 68 65 72 65 33 2d 35 2e 31 20 7b 0a 20 20 45 58  here3-5.1 {.  EX
2770: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2780: 0a 20 20 20 53 45 4c 45 43 54 20 62 62 62 2e 74  .   SELECT bbb.t
2790: 69 74 6c 65 20 41 53 20 74 61 67 5f 74 69 74 6c  itle AS tag_titl
27a0: 65 20 0a 20 20 20 20 20 46 52 4f 4d 20 61 61 61  e .     FROM aaa
27b0: 20 4a 4f 49 4e 20 61 61 61 20 41 53 20 62 62 62   JOIN aaa AS bbb
27c0: 20 4f 4e 20 62 62 62 2e 69 64 20 3d 20 61 61 61   ON bbb.id = aaa
27d0: 2e 70 61 72 65 6e 74 20 20 0a 20 20 20 20 57 48  .parent  .    WH
27e0: 45 52 45 20 61 61 61 2e 66 6b 20 3d 20 27 63 6f  ERE aaa.fk = 'co
27f0: 6e 73 74 61 6e 74 27 0a 20 20 20 20 20 20 41 4e  nstant'.      AN
2800: 44 20 4c 45 4e 47 54 48 28 62 62 62 2e 74 69 74  D LENGTH(bbb.tit
2810: 6c 65 29 20 3e 20 30 0a 20 20 20 20 20 20 41 4e  le) > 0.      AN
2820: 44 20 62 62 62 2e 70 61 72 65 6e 74 20 3d 20 34  D bbb.parent = 4
2830: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 62 62  .    ORDER BY bb
2840: 62 2e 74 69 74 6c 65 20 43 4f 4c 4c 41 54 45 20  b.title COLLATE 
2850: 4e 4f 43 41 53 45 20 41 53 43 3b 0a 7d 20 7b 0a  NOCASE ASC;.} {.
2860: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
2870: 54 41 42 4c 45 20 61 61 61 20 55 53 49 4e 47 20  TABLE aaa USING 
2880: 49 4e 44 45 58 20 61 61 61 5f 33 33 33 20 28 66  INDEX aaa_333 (f
2890: 6b 3d 3f 29 7d 20 0a 20 20 30 20 31 20 31 20 7b  k=?)} .  0 1 1 {
28a0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 61 61 61  SEARCH TABLE aaa
28b0: 20 41 53 20 62 62 62 20 55 53 49 4e 47 20 49 4e   AS bbb USING IN
28c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
28d0: 59 20 28 72 6f 77 69 64 3d 3f 29 7d 20 0a 20 20  Y (rowid=?)} .  
28e0: 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  0 0 0 {USE TEMP 
28f0: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
2900: 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71   BY}.}.do_execsq
2910: 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 35 2e  l_test where3-5.
2920: 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  2 {.  EXPLAIN QU
2930: 45 52 59 20 50 4c 41 4e 0a 20 20 20 53 45 4c 45  ERY PLAN.   SELE
2940: 43 54 20 62 62 62 2e 74 69 74 6c 65 20 41 53 20  CT bbb.title AS 
2950: 74 61 67 5f 74 69 74 6c 65 20 0a 20 20 20 20 20  tag_title .     
2960: 46 52 4f 4d 20 62 62 62 20 4a 4f 49 4e 20 61 61  FROM bbb JOIN aa
2970: 61 20 4f 4e 20 62 62 62 2e 69 64 20 3d 20 61 61  a ON bbb.id = aa
2980: 61 2e 70 61 72 65 6e 74 20 20 0a 20 20 20 20 57  a.parent  .    W
2990: 48 45 52 45 20 61 61 61 2e 66 6b 20 3d 20 27 63  HERE aaa.fk = 'c
29a0: 6f 6e 73 74 61 6e 74 27 0a 20 20 20 20 20 20 41  onstant'.      A
29b0: 4e 44 20 4c 45 4e 47 54 48 28 62 62 62 2e 74 69  ND LENGTH(bbb.ti
29c0: 74 6c 65 29 20 3e 20 30 0a 20 20 20 20 20 20 41  tle) > 0.      A
29d0: 4e 44 20 62 62 62 2e 70 61 72 65 6e 74 20 3d 20  ND bbb.parent = 
29e0: 34 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 62  4.    ORDER BY b
29f0: 62 62 2e 74 69 74 6c 65 20 43 4f 4c 4c 41 54 45  bb.title COLLATE
2a00: 20 4e 4f 43 41 53 45 20 41 53 43 3b 0a 7d 20 7b   NOCASE ASC;.} {
2a10: 0a 20 20 30 20 30 20 31 20 7b 53 45 41 52 43 48  .  0 0 1 {SEARCH
2a20: 20 54 41 42 4c 45 20 61 61 61 20 55 53 49 4e 47   TABLE aaa USING
2a30: 20 49 4e 44 45 58 20 61 61 61 5f 33 33 33 20 28   INDEX aaa_333 (
2a40: 66 6b 3d 3f 29 7d 20 0a 20 20 30 20 31 20 30 20  fk=?)} .  0 1 0 
2a50: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 62 62  {SEARCH TABLE bb
2a60: 62 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  b USING INTEGER 
2a70: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
2a80: 69 64 3d 3f 29 7d 20 0a 20 20 30 20 30 20 30 20  id=?)} .  0 0 0 
2a90: 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  {USE TEMP B-TREE
2aa0: 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d   FOR ORDER BY}.}
2ab0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2ac0: 20 77 68 65 72 65 33 2d 35 2e 33 20 7b 0a 20 20   where3-5.3 {.  
2ad0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2ae0: 41 4e 0a 20 20 20 53 45 4c 45 43 54 20 62 62 62  AN.   SELECT bbb
2af0: 2e 74 69 74 6c 65 20 41 53 20 74 61 67 5f 74 69  .title AS tag_ti
2b00: 74 6c 65 20 0a 20 20 20 20 20 46 52 4f 4d 20 61  tle .     FROM a
2b10: 61 61 20 41 53 20 62 62 62 20 4a 4f 49 4e 20 61  aa AS bbb JOIN a
2b20: 61 61 20 4f 4e 20 62 62 62 2e 69 64 20 3d 20 61  aa ON bbb.id = a
2b30: 61 61 2e 70 61 72 65 6e 74 20 20 0a 20 20 20 20  aa.parent  .    
2b40: 57 48 45 52 45 20 61 61 61 2e 66 6b 20 3d 20 27  WHERE aaa.fk = '
2b50: 63 6f 6e 73 74 61 6e 74 27 0a 20 20 20 20 20 20  constant'.      
2b60: 41 4e 44 20 4c 45 4e 47 54 48 28 62 62 62 2e 74  AND LENGTH(bbb.t
2b70: 69 74 6c 65 29 20 3e 20 30 0a 20 20 20 20 20 20  itle) > 0.      
2b80: 41 4e 44 20 62 62 62 2e 70 61 72 65 6e 74 20 3d  AND bbb.parent =
2b90: 20 34 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20   4.    ORDER BY 
2ba0: 62 62 62 2e 74 69 74 6c 65 20 43 4f 4c 4c 41 54  bbb.title COLLAT
2bb0: 45 20 4e 4f 43 41 53 45 20 41 53 43 3b 0a 7d 20  E NOCASE ASC;.} 
2bc0: 7b 0a 20 20 30 20 30 20 31 20 7b 53 45 41 52 43  {.  0 0 1 {SEARC
2bd0: 48 20 54 41 42 4c 45 20 61 61 61 20 55 53 49 4e  H TABLE aaa USIN
2be0: 47 20 49 4e 44 45 58 20 61 61 61 5f 33 33 33 20  G INDEX aaa_333 
2bf0: 28 66 6b 3d 3f 29 7d 20 0a 20 20 30 20 31 20 30  (fk=?)} .  0 1 0
2c00: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 61   {SEARCH TABLE a
2c10: 61 61 20 41 53 20 62 62 62 20 55 53 49 4e 47 20  aa AS bbb USING 
2c20: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2c30: 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 20 0a  KEY (rowid=?)} .
2c40: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
2c50: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
2c60: 45 52 20 42 59 7d 0a 7d 0a 0a 23 20 4e 61 6d 65  ER BY}.}..# Name
2c70: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 69 74 68   resolution with
2c80: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 61 6e   NATURAL JOIN an
2c90: 64 20 55 53 49 4e 47 0a 23 0a 64 6f 5f 74 65 73  d USING.#.do_tes
2ca0: 74 20 77 68 65 72 65 33 2d 36 2e 73 65 74 75 70  t where3-6.setup
2cb0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
2cc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2cd0: 74 36 77 28 61 2c 20 77 29 3b 0a 20 20 20 20 49  t6w(a, w);.    I
2ce0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 77 20 56  NSERT INTO t6w V
2cf0: 41 4c 55 45 53 28 31 2c 20 27 77 2d 6f 6e 65 27  ALUES(1, 'w-one'
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 32 2c  TO t6w VALUES(2,
2d20: 20 27 77 2d 74 77 6f 27 29 3b 0a 20 20 20 20 49   'w-two');.    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 39 2c 20 27 77 2d 6e 69 6e 65  ALUES(9, 'w-nine
2d50: 27 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ');.    CREATE T
2d60: 41 42 4c 45 20 74 36 78 28 61 2c 20 78 29 3b 0a  ABLE t6x(a, x);.
2d70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2d80: 74 36 78 20 56 41 4c 55 45 53 28 31 2c 20 27 78  t6x VALUES(1, 'x
2d90: 2d 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  -one');.    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 33 2c 20 27 78 2d 74 68 72 65 65 27 29  ES(3, 'x-three')
2dc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2dd0: 4f 20 74 36 78 20 56 41 4c 55 45 53 28 39 2c 20  O t6x VALUES(9, 
2de0: 27 78 2d 6e 69 6e 65 27 29 3b 0a 20 20 20 20 43  'x-nine');.    C
2df0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 79 28  REATE TABLE t6y(
2e00: 61 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, y);.    INSER
2e10: 54 20 49 4e 54 4f 20 74 36 79 20 56 41 4c 55 45  T INTO t6y VALUE
2e20: 53 28 31 2c 20 27 79 2d 6f 6e 65 27 29 3b 0a 20  S(1, 'y-one');. 
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 34 2c 20 27 79 2d  6y VALUES(4, 'y-
2e50: 66 6f 75 72 27 29 3b 0a 20 20 20 20 49 4e 53 45  four');.    INSE
2e60: 52 54 20 49 4e 54 4f 20 74 36 79 20 56 41 4c 55  RT INTO t6y VALU
2e70: 45 53 28 39 2c 20 27 79 2d 6e 69 6e 65 27 29 3b  ES(9, 'y-nine');
2e80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2e90: 45 20 74 36 7a 28 61 2c 20 7a 29 3b 0a 20 20 20  E t6z(a, z);.   
2ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 7a   INSERT INTO t6z
2eb0: 20 56 41 4c 55 45 53 28 31 2c 20 27 7a 2d 6f 6e   VALUES(1, 'z-on
2ec0: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
2ed0: 49 4e 54 4f 20 74 36 7a 20 56 41 4c 55 45 53 28  INTO t6z VALUES(
2ee0: 35 2c 20 27 7a 2d 66 69 76 65 27 29 3b 0a 20 20  5, 'z-five');.  
2ef0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
2f00: 7a 20 56 41 4c 55 45 53 28 39 2c 20 27 7a 2d 6e  z VALUES(9, 'z-n
2f10: 69 6e 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ine');.  }.} {}.
2f20: 73 65 74 20 63 6e 74 20 30 0a 66 6f 72 65 61 63  set cnt 0.foreac
2f30: 68 20 70 72 65 64 69 63 61 74 65 20 7b 0a 20 20  h predicate {.  
2f40: 20 7b 7d 0a 20 20 20 7b 4f 52 44 45 52 20 42 59   {}.   {ORDER BY
2f50: 20 61 7d 0a 20 20 20 7b 4f 52 44 45 52 20 42 59   a}.   {ORDER BY
2f60: 20 74 36 77 2e 61 7d 0a 20 20 20 7b 57 48 45 52   t6w.a}.   {WHER
2f70: 45 20 61 3e 30 7d 0a 20 20 20 7b 57 48 45 52 45  E a>0}.   {WHERE
2f80: 20 74 36 79 2e 61 3e 30 7d 0a 20 20 20 7b 57 48   t6y.a>0}.   {WH
2f90: 45 52 45 20 61 3e 30 20 4f 52 44 45 52 20 42 59  ERE a>0 ORDER BY
2fa0: 20 61 7d 0a 7d 20 7b 0a 20 20 69 6e 63 72 20 63   a}.} {.  incr c
2fb0: 6e 74 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65  nt.  do_test whe
2fc0: 72 65 33 2d 36 2e 24 63 6e 74 2e 31 20 7b 0a 20  re3-6.$cnt.1 {. 
2fd0: 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45     set sql "SELE
2fe0: 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4e 41  CT * FROM t6w NA
2ff0: 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 78 20 4e  TURAL JOIN t6x N
3000: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 79 22  ATURAL JOIN t6y"
3010: 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20  .    append sql 
3020: 22 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74  " NATURAL JOIN t
3030: 36 7a 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20  6z ".    append 
3040: 73 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65  sql $::predicate
3050: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71  .    db eval $sq
3060: 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78  l.  } {1 w-one x
3070: 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65  -one y-one z-one
3080: 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65   9 w-nine x-nine
3090: 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a   y-nine z-nine}.
30a0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33    do_test where3
30b0: 2d 36 2e 24 63 6e 74 2e 32 20 7b 0a 20 20 20 20  -6.$cnt.2 {.    
30c0: 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20  set sql "SELECT 
30d0: 2a 20 46 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20  * FROM t6w JOIN 
30e0: 74 36 78 20 55 53 49 4e 47 28 61 29 20 4a 4f 49  t6x USING(a) JOI
30f0: 4e 20 74 36 79 20 55 53 49 4e 47 28 61 29 22 0a  N t6y USING(a)".
3100: 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22      append sql "
3110: 20 4a 4f 49 4e 20 74 36 7a 20 55 53 49 4e 47 28   JOIN t6z USING(
3120: 61 29 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20  a) ".    append 
3130: 73 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65  sql $::predicate
3140: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71  .    db eval $sq
3150: 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78  l.  } {1 w-one x
3160: 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65  -one y-one z-one
3170: 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65   9 w-nine x-nine
3180: 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a   y-nine z-nine}.
3190: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33    do_test where3
31a0: 2d 36 2e 24 63 6e 74 2e 33 20 7b 0a 20 20 20 20  -6.$cnt.3 {.    
31b0: 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20  set sql "SELECT 
31c0: 2a 20 46 52 4f 4d 20 74 36 77 20 4e 41 54 55 52  * FROM t6w NATUR
31d0: 41 4c 20 4a 4f 49 4e 20 74 36 78 20 4a 4f 49 4e  AL JOIN t6x JOIN
31e0: 20 74 36 79 20 55 53 49 4e 47 28 61 29 22 0a 20   t6y USING(a)". 
31f0: 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20     append sql " 
3200: 4a 4f 49 4e 20 74 36 7a 20 55 53 49 4e 47 28 61  JOIN t6z USING(a
3210: 29 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73  ) ".    append s
3220: 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a  ql $::predicate.
3230: 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c      db eval $sql
3240: 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d  .  } {1 w-one x-
3250: 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20  one y-one z-one 
3260: 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20  9 w-nine x-nine 
3270: 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20  y-nine z-nine}. 
3280: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d   do_test where3-
3290: 36 2e 24 63 6e 74 2e 34 20 7b 0a 20 20 20 20 73  6.$cnt.4 {.    s
32a0: 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a  et sql "SELECT *
32b0: 20 46 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74   FROM t6w JOIN t
32c0: 36 78 20 55 53 49 4e 47 28 61 29 20 4e 41 54 55  6x USING(a) NATU
32d0: 52 41 4c 20 4a 4f 49 4e 20 74 36 79 22 0a 20 20  RAL JOIN t6y".  
32e0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4a    append sql " J
32f0: 4f 49 4e 20 74 36 7a 20 55 53 49 4e 47 28 61 29  OIN t6z USING(a)
3300: 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71   ".    append sq
3310: 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20  l $::predicate. 
3320: 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a     db eval $sql.
3330: 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f    } {1 w-one x-o
3340: 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39  ne y-one z-one 9
3350: 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79   w-nine x-nine y
3360: 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20  -nine z-nine}.  
3370: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36  do_test where3-6
3380: 2e 24 63 6e 74 2e 35 20 7b 0a 20 20 20 20 73 65  .$cnt.5 {.    se
3390: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20  t sql "SELECT * 
33a0: 46 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36  FROM t6w JOIN t6
33b0: 78 20 55 53 49 4e 47 28 61 29 20 4a 4f 49 4e 20  x USING(a) JOIN 
33c0: 74 36 79 20 55 53 49 4e 47 28 61 29 22 0a 20 20  t6y USING(a)".  
33d0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4e    append sql " N
33e0: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 7a 20  ATURAL JOIN t6z 
33f0: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
3400: 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20   $::predicate.  
3410: 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20    db eval $sql. 
3420: 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e   } {1 w-one x-on
3430: 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20  e y-one z-one 9 
3440: 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d  w-nine x-nine y-
3450: 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64  nine z-nine}.  d
3460: 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e  o_test where3-6.
3470: 24 63 6e 74 2e 36 20 7b 0a 20 20 20 20 73 65 74  $cnt.6 {.    set
3480: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46   sql "SELECT * F
3490: 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36 78  ROM t6w JOIN t6x
34a0: 20 55 53 49 4e 47 28 61 29 20 4e 41 54 55 52 41   USING(a) NATURA
34b0: 4c 20 4a 4f 49 4e 20 74 36 79 22 0a 20 20 20 20  L JOIN t6y".    
34c0: 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4e 41 54  append sql " NAT
34d0: 55 52 41 4c 20 4a 4f 49 4e 20 74 36 7a 20 22 0a  URAL JOIN t6z ".
34e0: 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 24      append sql $
34f0: 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20 20 20  ::predicate.    
3500: 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d  db eval $sql.  }
3510: 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20   {1 w-one x-one 
3520: 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d  y-one z-one 9 w-
3530: 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69  nine x-nine y-ni
3540: 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f  ne z-nine}.  do_
3550: 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e 24 63  test where3-6.$c
3560: 6e 74 2e 37 20 7b 0a 20 20 20 20 73 65 74 20 73  nt.7 {.    set s
3570: 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql "SELECT * FRO
3580: 4d 20 74 36 77 20 4e 41 54 55 52 41 4c 20 4a 4f  M t6w NATURAL JO
3590: 49 4e 20 74 36 78 20 4a 4f 49 4e 20 74 36 79 20  IN t6x JOIN t6y 
35a0: 55 53 49 4e 47 28 61 29 22 0a 20 20 20 20 61 70  USING(a)".    ap
35b0: 70 65 6e 64 20 73 71 6c 20 22 20 4e 41 54 55 52  pend sql " NATUR
35c0: 41 4c 20 4a 4f 49 4e 20 74 36 7a 20 22 0a 20 20  AL JOIN t6z ".  
35d0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a    append sql $::
35e0: 70 72 65 64 69 63 61 74 65 0a 20 20 20 20 64 62  predicate.    db
35f0: 20 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b   eval $sql.  } {
3600: 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d  1 w-one x-one y-
3610: 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69  one z-one 9 w-ni
3620: 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65  ne x-nine y-nine
3630: 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65   z-nine}.  do_te
3640: 73 74 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74  st where3-6.$cnt
3650: 2e 38 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c  .8 {.    set sql
3660: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
3670: 74 36 77 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e  t6w NATURAL JOIN
3680: 20 74 36 78 20 4e 41 54 55 52 41 4c 20 4a 4f 49   t6x NATURAL JOI
3690: 4e 20 74 36 79 22 0a 20 20 20 20 61 70 70 65 6e  N t6y".    appen
36a0: 64 20 73 71 6c 20 22 20 4a 4f 49 4e 20 74 36 7a  d sql " JOIN t6z
36b0: 20 55 53 49 4e 47 28 61 29 20 22 0a 20 20 20 20   USING(a) ".    
36c0: 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72  append sql $::pr
36d0: 65 64 69 63 61 74 65 0a 20 20 20 20 64 62 20 65  edicate.    db e
36e0: 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20  val $sql.  } {1 
36f0: 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e  w-one x-one y-on
3700: 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65  e z-one 9 w-nine
3710: 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a   x-nine y-nine z
3720: 2d 6e 69 6e 65 7d 0a 7d 0a 0a 64 6f 5f 65 78 65  -nine}.}..do_exe
3730: 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33  csql_test where3
3740: 2d 37 2d 73 65 74 75 70 20 7b 0a 20 20 43 52 45  -7-setup {.  CRE
3750: 41 54 45 20 54 41 42 4c 45 20 74 37 31 28 78 31  ATE TABLE t71(x1
3760: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3770: 20 4b 45 59 2c 20 79 31 29 3b 0a 20 20 43 52 45   KEY, y1);.  CRE
3780: 41 54 45 20 54 41 42 4c 45 20 74 37 32 28 78 32  ATE TABLE t72(x2
3790: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
37a0: 20 4b 45 59 2c 20 79 32 29 3b 0a 20 20 43 52 45   KEY, y2);.  CRE
37b0: 41 54 45 20 54 41 42 4c 45 20 74 37 33 28 78 33  ATE TABLE t73(x3
37c0: 2c 20 79 33 29 3b 0a 20 20 43 52 45 41 54 45 20  , y3);.  CREATE 
37d0: 54 41 42 4c 45 20 74 37 34 28 78 34 2c 20 79 34  TABLE t74(x4, y4
37e0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
37f0: 20 74 37 31 20 56 41 4c 55 45 53 28 31 32 33 2c   t71 VALUES(123,
3800: 32 33 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  234);.  INSERT I
3810: 4e 54 4f 20 74 37 32 20 56 41 4c 55 45 53 28 32  NTO t72 VALUES(2
3820: 33 34 2c 33 34 35 29 3b 0a 20 20 49 4e 53 45 52  34,345);.  INSER
3830: 54 20 49 4e 54 4f 20 74 37 33 20 56 41 4c 55 45  T INTO t73 VALUE
3840: 53 28 31 32 33 2c 32 33 34 29 3b 0a 20 20 49 4e  S(123,234);.  IN
3850: 53 45 52 54 20 49 4e 54 4f 20 74 37 34 20 56 41  SERT INTO t74 VA
3860: 4c 55 45 53 28 32 33 34 2c 33 34 35 29 3b 0a 20  LUES(234,345);. 
3870: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 34   INSERT INTO t74
3880: 20 56 41 4c 55 45 53 28 32 33 34 2c 36 37 38 29   VALUES(234,678)
3890: 3b 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 64  ;.} {}.foreach d
38a0: 69 73 61 62 6c 65 64 5f 6f 70 74 20 7b 6e 6f 6e  isabled_opt {non
38b0: 65 20 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e  e omit-noop-join
38c0: 20 61 6c 6c 7d 20 7b 0a 20 20 6f 70 74 69 6d 69   all} {.  optimi
38d0: 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64  zation_control d
38e0: 62 20 61 6c 6c 20 31 0a 20 20 6f 70 74 69 6d 69  b all 1.  optimi
38f0: 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64  zation_control d
3900: 62 20 24 64 69 73 61 62 6c 65 64 5f 6f 70 74 20  b $disabled_opt 
3910: 30 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  0.  do_execsql_t
3920: 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24 64 69  est where3-7.$di
3930: 73 61 62 6c 65 64 5f 6f 70 74 2e 31 20 7b 0a 20  sabled_opt.1 {. 
3940: 20 20 20 53 45 4c 45 43 54 20 78 31 20 46 52 4f     SELECT x1 FRO
3950: 4d 20 74 37 31 20 4c 45 46 54 20 4a 4f 49 4e 20  M t71 LEFT JOIN 
3960: 74 37 32 20 4f 4e 20 78 32 3d 79 31 3b 0a 20 20  t72 ON x2=y1;.  
3970: 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 65 78 65  } {123}.  do_exe
3980: 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33  csql_test where3
3990: 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f 70 74  -7.$disabled_opt
39a0: 2e 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .2 {.    SELECT 
39b0: 78 31 20 46 52 4f 4d 20 74 37 31 20 4c 45 46 54  x1 FROM t71 LEFT
39c0: 20 4a 4f 49 4e 20 74 37 32 20 4f 4e 20 78 32 3d   JOIN t72 ON x2=
39d0: 79 31 20 57 48 45 52 45 20 79 32 20 49 53 20 4e  y1 WHERE y2 IS N
39e0: 55 4c 4c 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  ULL;.  } {}.  do
39f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
3a00: 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64  ere3-7.$disabled
3a10: 5f 6f 70 74 2e 33 20 7b 0a 20 20 20 20 53 45 4c  _opt.3 {.    SEL
3a20: 45 43 54 20 78 31 20 46 52 4f 4d 20 74 37 31 20  ECT x1 FROM t71 
3a30: 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e  LEFT JOIN t72 ON
3a40: 20 78 32 3d 79 31 20 57 48 45 52 45 20 79 32 20   x2=y1 WHERE y2 
3a50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20 20 7d  IS NOT NULL;.  }
3a60: 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 65 78 65 63   {123}.  do_exec
3a70: 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d  sql_test where3-
3a80: 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e  7.$disabled_opt.
3a90: 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  4 {.    SELECT x
3aa0: 31 20 46 52 4f 4d 20 74 37 31 20 4c 45 46 54 20  1 FROM t71 LEFT 
3ab0: 4a 4f 49 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79  JOIN t72 ON x2=y
3ac0: 31 20 41 4e 44 20 79 32 20 49 53 20 4e 55 4c 4c  1 AND y2 IS NULL
3ad0: 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f  ;.  } {123}.  do
3ae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
3af0: 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64  ere3-7.$disabled
3b00: 5f 6f 70 74 2e 35 20 7b 0a 20 20 20 20 53 45 4c  _opt.5 {.    SEL
3b10: 45 43 54 20 78 31 20 46 52 4f 4d 20 74 37 31 20  ECT x1 FROM t71 
3b20: 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e  LEFT JOIN t72 ON
3b30: 20 78 32 3d 79 31 20 41 4e 44 20 79 32 20 49 53   x2=y1 AND y2 IS
3b40: 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20 20 7d 20 7b   NOT NULL;.  } {
3b50: 31 32 33 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  123}.  do_execsq
3b60: 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 37 2e  l_test where3-7.
3b70: 24 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e 36 20  $disabled_opt.6 
3b80: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 33 20  {.    SELECT x3 
3b90: 46 52 4f 4d 20 74 37 33 20 4c 45 46 54 20 4a 4f  FROM t73 LEFT JO
3ba0: 49 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79 33 3b  IN t72 ON x2=y3;
3bb0: 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f  .  } {123}.  do_
3bc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65  execsql_test whe
3bd0: 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f  re3-7.$disabled_
3be0: 6f 70 74 2e 37 20 7b 0a 20 20 20 20 53 45 4c 45  opt.7 {.    SELE
3bf0: 43 54 20 44 49 53 54 49 4e 43 54 20 78 33 20 46  CT DISTINCT x3 F
3c00: 52 4f 4d 20 74 37 33 20 4c 45 46 54 20 4a 4f 49  ROM t73 LEFT JOI
3c10: 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79 33 3b 0a  N t72 ON x2=y3;.
3c20: 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 65    } {123}.  do_e
3c30: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72  xecsql_test wher
3c40: 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f  e3-7.$disabled_o
3c50: 70 74 2e 38 20 7b 0a 20 20 20 20 53 45 4c 45 43  pt.8 {.    SELEC
3c60: 54 20 78 33 20 46 52 4f 4d 20 74 37 33 20 4c 45  T x3 FROM t73 LE
3c70: 46 54 20 4a 4f 49 4e 20 74 37 34 20 4f 4e 20 78  FT JOIN t74 ON x
3c80: 34 3d 79 33 3b 0a 20 20 7d 20 7b 31 32 33 20 31  4=y3;.  } {123 1
3c90: 32 33 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  23}.  do_execsql
3ca0: 5f 74 65 73 74 20 77 68 65 72 65 33 2d 37 2e 24  _test where3-7.$
3cb0: 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e 39 20 7b  disabled_opt.9 {
3cc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
3cd0: 49 4e 43 54 20 78 33 20 46 52 4f 4d 20 74 37 33  INCT x3 FROM t73
3ce0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37 34 20 4f   LEFT JOIN t74 O
3cf0: 4e 20 78 34 3d 79 33 3b 0a 20 20 7d 20 7b 31 32  N x4=y3;.  } {12
3d00: 33 7d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65  3}.}...finish_te
3d10: 73 74 0a                                         st.