/ Hex Artifact Content
Login

Artifact 667e75642102c97a00bf9b23d3cb267db321d006:


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 3a 3a 73 71 6c 69 74 65 5f 71 75 65 72  he ::sqlite_quer
0e70: 79 5f 70 6c 61 6e 20 76 61 72 69 61 62 6c 65 2e  y_plan variable.
0e80: 0a 23 0a 70 72 6f 63 20 71 75 65 72 79 70 6c 61  .#.proc querypla
0e90: 6e 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  n {sql} {.  set 
0ea0: 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f  ::sqlite_sort_co
0eb0: 75 6e 74 20 30 0a 20 20 73 65 74 20 64 61 74 61  unt 0.  set data
0ec0: 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d 0a   [execsql $sql].
0ed0: 20 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74    return [concat
0ee0: 20 24 64 61 74 61 20 24 3a 3a 73 71 6c 69 74 65   $data $::sqlite
0ef0: 5f 71 75 65 72 79 5f 70 6c 61 6e 5d 0a 7d 0a 0a  _query_plan].}..
0f00: 0a 23 20 49 66 20 79 6f 75 20 68 61 76 65 20 61  .# If you have a
0f10: 20 66 72 6f 6d 20 63 6c 61 75 73 65 20 6f 66 20   from clause of 
0f20: 74 68 65 20 66 6f 72 6d 3a 20 20 20 41 20 42 20  the form:   A B 
0f30: 43 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23 20  C left join D.# 
0f40: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
0f50: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
0f60: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 72 65  er is able to re
0f70: 6f 72 64 65 72 20 74 68 65 20 0a 23 20 41 20 42  order the .# A B
0f80: 20 43 20 70 61 72 74 20 61 6e 79 77 61 79 20 69   C part anyway i
0f90: 74 20 77 61 6e 74 73 2e 20 0a 23 0a 23 20 46 6f  t wants. .#.# Fo
0fa0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 78 20  llowing the fix 
0fb0: 74 6f 20 74 69 63 6b 65 74 20 23 31 36 35 32 2c  to ticket #1652,
0fc0: 20 74 68 65 72 65 20 77 61 73 20 61 20 74 69 6d   there was a tim
0fd0: 65 20 77 68 65 6e 0a 23 20 74 68 65 20 43 20 74  e when.# the C t
0fe0: 61 62 6c 65 20 77 6f 75 6c 64 20 6e 6f 74 20 72  able would not r
0ff0: 65 6f 72 64 65 72 2e 20 20 53 6f 20 74 68 65 20  eorder.  So the 
1000: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 6f 72 64 65  following reorde
1010: 72 69 6e 67 73 0a 23 20 77 65 72 65 20 70 6f 73  rings.# were pos
1020: 73 69 62 6c 65 3a 0a 23 0a 23 20 20 20 20 20 20  sible:.#.#      
1030: 20 20 20 20 20 20 41 20 42 20 43 20 6c 65 66 74        A B C left
1040: 20 6a 6f 69 6e 20 44 0a 23 20 20 20 20 20 20 20   join D.#       
1050: 20 20 20 20 20 42 20 41 20 43 20 6c 65 66 74 20       B A C left 
1060: 6a 6f 69 6e 20 44 0a 23 0a 23 20 42 75 74 20 74  join D.#.# But t
1070: 68 65 73 65 20 72 65 6f 72 64 65 72 73 20 77 65  hese reorders we
1080: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 23  re not allowed.#
1090: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 43 20  .#            C 
10a0: 41 20 42 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a  A B left join D.
10b0: 23 20 20 20 20 20 20 20 20 20 20 20 20 41 20 43  #            A C
10c0: 20 42 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23   B left join D.#
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 20 42 20              C B 
10e0: 41 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23 20  A left join D.# 
10f0: 20 20 20 20 20 20 20 20 20 20 20 42 20 43 20 41             B C A
1100: 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a 23 0a 23   left join D.#.#
1110: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1120: 65 73 74 73 20 61 72 65 20 68 65 72 65 20 74 6f  ests are here to
1130: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1140: 20 6c 61 74 74 65 72 20 66 6f 75 72 0a 23 20 72   latter four.# r
1150: 65 6f 72 64 65 72 69 6e 67 73 20 61 72 65 20 61  eorderings are a
1160: 6c 6c 6f 77 65 64 20 61 67 61 69 6e 2e 0a 23 0a  llowed again..#.
1170: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 32  do_test where3-2
1180: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1190: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11a0: 45 20 74 41 28 61 70 6b 20 69 6e 74 65 67 65 72  E tA(apk integer
11b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 61 78   primary key, ax
11c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
11d0: 42 4c 45 20 74 42 28 62 70 6b 20 69 6e 74 65 67  BLE tB(bpk integ
11e0: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  er primary key, 
11f0: 62 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  bx);.    CREATE 
1200: 54 41 42 4c 45 20 74 43 28 63 70 6b 20 69 6e 74  TABLE tC(cpk int
1210: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
1220: 2c 20 63 78 29 3b 0a 20 20 20 20 43 52 45 41 54  , cx);.    CREAT
1230: 45 20 54 41 42 4c 45 20 74 44 28 64 70 6b 20 69  E TABLE tD(dpk i
1240: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
1250: 65 79 2c 20 64 78 29 3b 0a 20 20 7d 0a 20 20 71  ey, dx);.  }.  q
1260: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1270: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c  ELECT * FROM tA,
1280: 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49   tB, tC LEFT JOI
1290: 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20  N tD ON dpk=cx. 
12a0: 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62 78      WHERE cpk=bx
12b0: 20 41 4e 44 20 62 70 6b 3d 61 78 0a 20 20 7d 0a   AND bpk=ax.  }.
12c0: 7d 20 7b 74 41 20 7b 7d 20 74 42 20 2a 20 74 43  } {tA {} tB * tC
12d0: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
12e0: 20 77 68 65 72 65 33 2d 32 2e 31 2e 31 20 7b 0a   where3-2.1.1 {.
12f0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1300: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1310: 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20  tA, tB, tC LEFT 
1320: 4a 4f 49 4e 20 74 44 20 4f 4e 20 63 78 3d 64 70  JOIN tD ON cx=dp
1330: 6b 0a 20 20 20 20 20 57 48 45 52 45 20 63 70 6b  k.     WHERE cpk
1340: 3d 62 78 20 41 4e 44 20 62 70 6b 3d 61 78 0a 20  =bx AND bpk=ax. 
1350: 20 7d 0a 7d 20 7b 74 41 20 7b 7d 20 74 42 20 2a   }.} {tA {} tB *
1360: 20 74 43 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74   tC * tD *}.do_t
1370: 65 73 74 20 77 68 65 72 65 33 2d 32 2e 31 2e 32  est where3-2.1.2
1380: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
1390: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
13a0: 4f 4d 20 74 41 2c 20 74 42 2c 20 74 43 20 4c 45  OM tA, tB, tC LE
13b0: 46 54 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 63 78  FT JOIN tD ON cx
13c0: 3d 64 70 6b 0a 20 20 20 20 20 57 48 45 52 45 20  =dpk.     WHERE 
13d0: 62 78 3d 63 70 6b 20 41 4e 44 20 62 70 6b 3d 61  bx=cpk AND bpk=a
13e0: 78 0a 20 20 7d 0a 7d 20 7b 74 41 20 7b 7d 20 74  x.  }.} {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 33 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  1.3 {.  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 62 78 3d 63 70 6b 20 41 4e 44 20 61 78  RE bx=cpk AND ax
1470: 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b 74 41 20 7b  =bpk.  }.} {tA {
1480: 7d 20 74 42 20 2a 20 74 43 20 2a 20 74 44 20 2a  } tB * tC * tD *
1490: 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33  }.do_test where3
14a0: 2d 32 2e 31 2e 34 20 7b 0a 20 20 71 75 65 72 79  -2.1.4 {.  query
14b0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
14c0: 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42 2c  T * FROM tA, tB,
14d0: 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74 44   tC LEFT JOIN tD
14e0: 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20 20   ON dpk=cx.     
14f0: 57 48 45 52 45 20 62 78 3d 63 70 6b 20 41 4e 44  WHERE bx=cpk AND
1500: 20 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b 74   ax=bpk.  }.} {t
1510: 41 20 7b 7d 20 74 42 20 2a 20 74 43 20 2a 20 74  A {} tB * tC * t
1520: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
1530: 72 65 33 2d 32 2e 31 2e 35 20 7b 0a 20 20 71 75  re3-2.1.5 {.  qu
1540: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1550: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20  LECT * FROM tA, 
1560: 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e  tB, tC LEFT JOIN
1570: 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20   tD ON dpk=cx.  
1580: 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62 78 20     WHERE cpk=bx 
1590: 41 4e 44 20 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d  AND ax=bpk.  }.}
15a0: 20 7b 74 41 20 7b 7d 20 74 42 20 2a 20 74 43 20   {tA {} tB * tC 
15b0: 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20  * tD *}.do_test 
15c0: 77 68 65 72 65 33 2d 32 2e 32 20 7b 0a 20 20 71  where3-2.2 {.  q
15d0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
15e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c  ELECT * FROM tA,
15f0: 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49   tB, tC LEFT JOI
1600: 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20  N tD ON dpk=cx. 
1610: 20 20 20 20 57 48 45 52 45 20 63 70 6b 3d 62 78      WHERE cpk=bx
1620: 20 41 4e 44 20 61 70 6b 3d 62 78 0a 20 20 7d 0a   AND apk=bx.  }.
1630: 7d 20 7b 74 42 20 7b 7d 20 74 41 20 2a 20 74 43  } {tB {} tA * tC
1640: 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73 74   * tD *}.do_test
1650: 20 77 68 65 72 65 33 2d 32 2e 33 20 7b 0a 20 20   where3-2.3 {.  
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 70 6b 3d 62 78 0a 20 20 7d  x AND apk=bx.  }
16c0: 0a 7d 20 7b 74 42 20 7b 7d 20 74 41 20 2a 20 74  .} {tB {} tA * t
16d0: 43 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65 73  C * tD *}.do_tes
16e0: 74 20 77 68 65 72 65 33 2d 32 2e 34 20 7b 0a 20  t where3-2.4 {. 
16f0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1700: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1710: 41 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20 4a  A, tB, tC LEFT J
1720: 4f 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63 78  OIN tD ON dpk=cx
1730: 0a 20 20 20 20 20 57 48 45 52 45 20 61 70 6b 3d  .     WHERE apk=
1740: 63 78 20 41 4e 44 20 62 70 6b 3d 61 78 0a 20 20  cx AND bpk=ax.  
1750: 7d 0a 7d 20 7b 74 43 20 7b 7d 20 74 41 20 2a 20  }.} {tC {} tA * 
1760: 74 42 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65  tB * tD *}.do_te
1770: 73 74 20 77 68 65 72 65 33 2d 32 2e 35 20 7b 0a  st where3-2.5 {.
1780: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1790: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17a0: 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20  tA, tB, tC LEFT 
17b0: 4a 4f 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63  JOIN tD ON dpk=c
17c0: 78 0a 20 20 20 20 20 57 48 45 52 45 20 63 70 6b  x.     WHERE cpk
17d0: 3d 61 78 20 41 4e 44 20 62 70 6b 3d 63 78 0a 20  =ax AND bpk=cx. 
17e0: 20 7d 0a 7d 20 7b 74 41 20 7b 7d 20 74 43 20 2a   }.} {tA {} tC *
17f0: 20 74 42 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74   tB * tD *}.do_t
1800: 65 73 74 20 77 68 65 72 65 33 2d 32 2e 36 20 7b  est where3-2.6 {
1810: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1820: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1830: 20 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46 54   tA, tB, tC LEFT
1840: 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d   JOIN tD ON dpk=
1850: 63 78 0a 20 20 20 20 20 57 48 45 52 45 20 62 70  cx.     WHERE bp
1860: 6b 3d 63 78 20 41 4e 44 20 61 70 6b 3d 62 78 0a  k=cx AND apk=bx.
1870: 20 20 7d 0a 7d 20 7b 74 43 20 7b 7d 20 74 42 20    }.} {tC {} tB 
1880: 2a 20 74 41 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f  * tA * tD *}.do_
1890: 74 65 73 74 20 77 68 65 72 65 33 2d 32 2e 37 20  test where3-2.7 
18a0: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
18b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
18c0: 4d 20 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46  M tA, tB, tC LEF
18d0: 54 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 64 70 6b  T JOIN tD ON dpk
18e0: 3d 63 78 0a 20 20 20 20 20 57 48 45 52 45 20 63  =cx.     WHERE c
18f0: 70 6b 3d 62 78 20 41 4e 44 20 61 70 6b 3d 63 78  pk=bx AND apk=cx
1900: 0a 20 20 7d 0a 7d 20 7b 74 42 20 7b 7d 20 74 43  .  }.} {tB {} tC
1910: 20 2a 20 74 41 20 2a 20 74 44 20 2a 7d 0a 0a 23   * tA * tD *}..#
1920: 20 54 69 63 6b 65 74 20 5b 31 33 66 30 33 33 63   Ticket [13f033c
1930: 38 36 35 66 38 37 38 39 35 33 5d 0a 23 20 49 66  865f878953].# If
1940: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
1950: 6d 75 73 74 20 62 65 20 61 20 66 75 6c 6c 20 74  must be a full t
1960: 61 62 6c 65 20 73 63 61 6e 2c 20 64 6f 20 6e 6f  able scan, do no
1970: 74 20 6c 65 74 20 41 4e 41 4c 59 5a 45 20 74 72  t let ANALYZE tr
1980: 69 63 6b 0a 23 20 74 68 65 20 70 6c 61 6e 6e 65  ick.# the planne
1990: 72 20 69 6e 74 6f 20 75 73 65 20 61 20 74 61 62  r into use a tab
19a0: 6c 65 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  le for the outer
19b0: 20 6c 6f 6f 70 20 74 68 61 74 20 6d 69 67 68 74   loop that might
19c0: 20 62 65 20 69 6e 64 65 78 61 62 6c 65 0a 23 20   be indexable.# 
19d0: 69 66 20 68 65 6c 64 20 75 6e 74 69 6c 20 61 6e  if held until an
19e0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 23 20 0a   inner loop..# .
19f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1a00: 77 68 65 72 65 33 2d 33 2e 30 20 7b 0a 20 20 43  where3-3.0 {.  C
1a10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 30 31  REATE TABLE t301
1a20: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
1a30: 52 59 20 4b 45 59 2c 62 2c 63 29 3b 0a 20 20 43  RY KEY,b,c);.  C
1a40: 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 30 31  REATE INDEX t301
1a50: 63 20 4f 4e 20 74 33 30 31 28 63 29 3b 0a 20 20  c ON t301(c);.  
1a60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 30 31  INSERT INTO t301
1a70: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a   VALUES(1,2,3);.
1a80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1a90: 33 30 32 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53  302(x, y);.  INS
1aa0: 45 52 54 20 49 4e 54 4f 20 74 33 30 32 20 56 41  ERT INTO t302 VA
1ab0: 4c 55 45 53 28 34 2c 35 29 3b 0a 20 20 41 4e 41  LUES(4,5);.  ANA
1ac0: 4c 59 5a 45 3b 0a 20 20 65 78 70 6c 61 69 6e 20  LYZE;.  explain 
1ad0: 71 75 65 72 79 20 70 6c 61 6e 20 53 45 4c 45 43  query plan SELEC
1ae0: 54 20 2a 20 46 52 4f 4d 20 74 33 30 32 2c 20 74  T * FROM t302, t
1af0: 33 30 31 20 57 48 45 52 45 20 74 33 30 32 2e 78  301 WHERE t302.x
1b00: 3d 35 20 41 4e 44 20 74 33 30 31 2e 61 3d 74 33  =5 AND t301.a=t3
1b10: 30 32 2e 79 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  02.y;.} {.  0 0 
1b20: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33  0 {SCAN TABLE t3
1b30: 30 32 20 28 7e 31 20 72 6f 77 73 29 7d 20 0a 20  02 (~1 rows)} . 
1b40: 20 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 54   0 1 1 {SEARCH T
1b50: 41 42 4c 45 20 74 33 30 31 20 55 53 49 4e 47 20  ABLE t301 USING 
1b60: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1b70: 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 20 28 7e  KEY (rowid=?) (~
1b80: 31 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 65 78  1 rows)}.}.do_ex
1b90: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
1ba0: 33 2d 33 2e 31 20 7b 0a 20 20 65 78 70 6c 61 69  3-3.1 {.  explai
1bb0: 6e 20 71 75 65 72 79 20 70 6c 61 6e 0a 20 20 53  n query plan.  S
1bc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 30  ELECT * FROM t30
1bd0: 31 2c 20 74 33 30 32 20 57 48 45 52 45 20 74 33  1, t302 WHERE t3
1be0: 30 32 2e 78 3d 35 20 41 4e 44 20 74 33 30 31 2e  02.x=5 AND t301.
1bf0: 61 3d 74 33 30 32 2e 79 3b 0a 7d 20 7b 0a 20 20  a=t302.y;.} {.  
1c00: 30 20 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 1 {SCAN TABL
1c10: 45 20 74 33 30 32 20 28 7e 31 20 72 6f 77 73 29  E t302 (~1 rows)
1c20: 7d 20 0a 20 20 30 20 31 20 30 20 7b 53 45 41 52  } .  0 1 0 {SEAR
1c30: 43 48 20 54 41 42 4c 45 20 74 33 30 31 20 55 53  CH TABLE t301 US
1c40: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1c50: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
1c60: 29 20 28 7e 31 20 72 6f 77 73 29 7d 0a 7d 0a 0a  ) (~1 rows)}.}..
1c70: 23 20 56 65 72 69 66 79 20 74 68 61 74 20 77 68  # Verify that wh
1c80: 65 6e 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  en there are mul
1c90: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  tiple tables in 
1ca0: 61 20 6a 6f 69 6e 20 77 68 69 63 68 20 6d 75 73  a join which mus
1cb0: 74 20 62 65 0a 23 20 66 75 6c 6c 20 74 61 62 6c  t be.# full tabl
1cc0: 65 20 73 63 61 6e 73 20 74 68 61 74 20 74 68 65  e scans that the
1cd0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61   query planner a
1ce0: 74 74 65 6d 70 74 73 20 70 75 74 20 74 68 65 20  ttempts put the 
1cf0: 74 61 62 6c 65 20 77 69 74 68 0a 23 20 74 68 65  table with.# the
1d00: 20 66 65 77 65 73 74 20 6e 75 6d 62 65 72 20 6f   fewest number o
1d10: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 61 73  f output rows as
1d20: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
1d30: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1d40: 73 74 20 77 68 65 72 65 33 2d 34 2e 30 20 7b 0a  st where3-4.0 {.
1d50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1d60: 34 30 30 28 61 20 49 4e 54 45 47 45 52 20 50 52  400(a INTEGER PR
1d70: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
1d80: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1d90: 20 74 34 30 31 28 70 20 49 4e 54 45 47 45 52 20   t401(p INTEGER 
1da0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 71 2c 20  PRIMARY KEY, q, 
1db0: 72 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  r);.  CREATE TAB
1dc0: 4c 45 20 74 34 30 32 28 78 20 49 4e 54 45 47 45  LE t402(x INTEGE
1dd0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
1de0: 2c 20 7a 29 3b 0a 20 20 45 58 50 4c 41 49 4e 20  , z);.  EXPLAIN 
1df0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
1e00: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 30 30 2c  ECT * FROM t400,
1e10: 20 74 34 30 31 2c 20 74 34 30 32 20 57 48 45 52   t401, t402 WHER
1e20: 45 20 74 34 30 32 2e 7a 20 47 4c 4f 42 20 27 61  E t402.z GLOB 'a
1e30: 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  bc*';.} {.  0 0 
1e40: 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34  2 {SCAN TABLE t4
1e50: 30 32 20 28 7e 35 30 30 30 30 30 20 72 6f 77 73  02 (~500000 rows
1e60: 29 7d 20 0a 20 20 30 20 31 20 30 20 7b 53 43 41  )} .  0 1 0 {SCA
1e70: 4e 20 54 41 42 4c 45 20 74 34 30 30 20 28 7e 31  N TABLE t400 (~1
1e80: 30 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a 20  000000 rows)} . 
1e90: 20 30 20 32 20 31 20 7b 53 43 41 4e 20 54 41 42   0 2 1 {SCAN TAB
1ea0: 4c 45 20 74 34 30 31 20 28 7e 31 30 30 30 30 30  LE t401 (~100000
1eb0: 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 65 78  0 rows)}.}.do_ex
1ec0: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
1ed0: 33 2d 34 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49  3-4.1 {.  EXPLAI
1ee0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53  N QUERY PLAN.  S
1ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 30  ELECT * FROM t40
1f00: 30 2c 20 74 34 30 31 2c 20 74 34 30 32 20 57 48  0, t401, t402 WH
1f10: 45 52 45 20 74 34 30 31 2e 72 20 47 4c 4f 42 20  ERE t401.r GLOB 
1f20: 27 61 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20  'abc*';.} {.  0 
1f30: 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 1 {SCAN TABLE 
1f40: 74 34 30 31 20 28 7e 35 30 30 30 30 30 20 72 6f  t401 (~500000 ro
1f50: 77 73 29 7d 20 0a 20 20 30 20 31 20 30 20 7b 53  ws)} .  0 1 0 {S
1f60: 43 41 4e 20 54 41 42 4c 45 20 74 34 30 30 20 28  CAN TABLE t400 (
1f70: 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d 20  ~1000000 rows)} 
1f80: 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e 20 54  .  0 2 2 {SCAN T
1f90: 41 42 4c 45 20 74 34 30 32 20 28 7e 31 30 30 30  ABLE t402 (~1000
1fa0: 30 30 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f 5f  000 rows)}.}.do_
1fb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65  execsql_test whe
1fc0: 72 65 33 2d 34 2e 32 20 7b 0a 20 20 45 58 50 4c  re3-4.2 {.  EXPL
1fd0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  AIN QUERY PLAN. 
1fe0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1ff0: 34 30 30 2c 20 74 34 30 31 2c 20 74 34 30 32 20  400, t401, t402 
2000: 57 48 45 52 45 20 74 34 30 30 2e 63 20 47 4c 4f  WHERE t400.c GLO
2010: 42 20 27 61 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20  B 'abc*';.} {.  
2020: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
2030: 45 20 74 34 30 30 20 28 7e 35 30 30 30 30 30 20  E t400 (~500000 
2040: 72 6f 77 73 29 7d 20 0a 20 20 30 20 31 20 31 20  rows)} .  0 1 1 
2050: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30 31  {SCAN TABLE t401
2060: 20 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29   (~1000000 rows)
2070: 7d 20 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e  } .  0 2 2 {SCAN
2080: 20 54 41 42 4c 45 20 74 34 30 32 20 28 7e 31 30   TABLE t402 (~10
2090: 30 30 30 30 30 20 72 6f 77 73 29 7d 0a 7d 0a 0a  00000 rows)}.}..
20a0: 23 20 56 65 72 69 66 79 20 74 68 61 74 20 61 20  # Verify that a 
20b0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 67 72  performance regr
20c0: 65 73 73 69 6f 6e 20 65 6e 63 6f 75 6e 74 65 72  ession encounter
20d0: 65 64 20 62 79 20 66 69 72 65 66 6f 78 0a 23 20  ed by firefox.# 
20e0: 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a  has been fixed..
20f0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
2100: 74 20 77 68 65 72 65 33 2d 35 2e 30 20 7b 0a 20  t where3-5.0 {. 
2110: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 61   CREATE TABLE aa
2120: 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  a (id INTEGER PR
2130: 49 4d 41 52 59 20 4b 45 59 2c 20 74 79 70 65 20  IMARY KEY, type 
2140: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20  INTEGER,.       
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6b 20               fk 
2160: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
2170: 4e 55 4c 4c 2c 20 70 61 72 65 6e 74 20 49 4e 54  NULL, parent INT
2180: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
2190: 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 74 69            positi
21a0: 6f 6e 20 49 4e 54 45 47 45 52 2c 20 74 69 74 6c  on INTEGER, titl
21b0: 65 20 4c 4f 4e 47 56 41 52 43 48 41 52 2c 0a 20  e LONGVARCHAR,. 
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 6b 65 79 77 6f 72 64 5f 69 64 20 49 4e     keyword_id IN
21e0: 54 45 47 45 52 2c 20 66 6f 6c 64 65 72 5f 74 79  TEGER, folder_ty
21f0: 70 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  pe TEXT,.       
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
2210: 65 41 64 64 65 64 20 49 4e 54 45 47 45 52 2c 20  eAdded INTEGER, 
2220: 6c 61 73 74 4d 6f 64 69 66 69 65 64 20 49 4e 54  lastModified INT
2230: 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20  EGER);.  CREATE 
2240: 49 4e 44 45 58 20 61 61 61 5f 31 31 31 20 4f 4e  INDEX aaa_111 ON
2250: 20 61 61 61 20 28 66 6b 2c 20 74 79 70 65 29 3b   aaa (fk, type);
2260: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2270: 61 61 61 5f 32 32 32 20 4f 4e 20 61 61 61 20 28  aaa_222 ON aaa (
2280: 70 61 72 65 6e 74 2c 20 70 6f 73 69 74 69 6f 6e  parent, position
2290: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
22a0: 58 20 61 61 61 5f 33 33 33 20 4f 4e 20 61 61 61  X aaa_333 ON aaa
22b0: 20 28 66 6b 2c 20 6c 61 73 74 4d 6f 64 69 66 69   (fk, lastModifi
22c0: 65 64 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ed);.  CREATE TA
22d0: 42 4c 45 20 62 62 62 20 28 69 64 20 49 4e 54 45  BLE bbb (id INTE
22e0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
22f0: 20 74 79 70 65 20 49 4e 54 45 47 45 52 2c 0a 20   type INTEGER,. 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 66 6b 20 49 4e 54 45 47 45 52 20 44 45     fk INTEGER DE
2320: 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 70 61 72 65  FAULT NULL, pare
2330: 6e 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  nt INTEGER,.    
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 70 6f 73 69 74 69 6f 6e 20 49 4e 54 45 47 45 52  position INTEGER
2360: 2c 20 74 69 74 6c 65 20 4c 4f 4e 47 56 41 52 43  , title LONGVARC
2370: 48 41 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  HAR,.           
2380: 20 20 20 20 20 20 20 20 20 6b 65 79 77 6f 72 64           keyword
2390: 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 66 6f 6c  _id INTEGER, fol
23a0: 64 65 72 5f 74 79 70 65 20 54 45 58 54 2c 0a 20  der_type TEXT,. 
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 64 61 74 65 41 64 64 65 64 20 49 4e 54     dateAdded INT
23d0: 45 47 45 52 2c 20 6c 61 73 74 4d 6f 64 69 66 69  EGER, lastModifi
23e0: 65 64 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 43  ed INTEGER);.  C
23f0: 52 45 41 54 45 20 49 4e 44 45 58 20 62 62 62 5f  REATE INDEX bbb_
2400: 31 31 31 20 4f 4e 20 62 62 62 20 28 66 6b 2c 20  111 ON bbb (fk, 
2410: 74 79 70 65 29 3b 0a 20 20 43 52 45 41 54 45 20  type);.  CREATE 
2420: 49 4e 44 45 58 20 62 62 62 5f 32 32 32 20 4f 4e  INDEX bbb_222 ON
2430: 20 62 62 62 20 28 70 61 72 65 6e 74 2c 20 70 6f   bbb (parent, po
2440: 73 69 74 69 6f 6e 29 3b 0a 20 20 43 52 45 41 54  sition);.  CREAT
2450: 45 20 49 4e 44 45 58 20 62 62 62 5f 33 33 33 20  E INDEX bbb_333 
2460: 4f 4e 20 62 62 62 20 28 66 6b 2c 20 6c 61 73 74  ON bbb (fk, last
2470: 4d 6f 64 69 66 69 65 64 29 3b 0a 0a 20 20 45 58  Modified);..  EX
2480: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2490: 0a 20 20 20 53 45 4c 45 43 54 20 62 62 62 2e 74  .   SELECT bbb.t
24a0: 69 74 6c 65 20 41 53 20 74 61 67 5f 74 69 74 6c  itle AS tag_titl
24b0: 65 20 0a 20 20 20 20 20 46 52 4f 4d 20 61 61 61  e .     FROM aaa
24c0: 20 4a 4f 49 4e 20 62 62 62 20 4f 4e 20 62 62 62   JOIN bbb ON bbb
24d0: 2e 69 64 20 3d 20 61 61 61 2e 70 61 72 65 6e 74  .id = aaa.parent
24e0: 20 20 0a 20 20 20 20 57 48 45 52 45 20 61 61 61    .    WHERE aaa
24f0: 2e 66 6b 20 3d 20 27 63 6f 6e 73 74 61 6e 74 27  .fk = 'constant'
2500: 0a 20 20 20 20 20 20 41 4e 44 20 4c 45 4e 47 54  .      AND LENGT
2510: 48 28 62 62 62 2e 74 69 74 6c 65 29 20 3e 20 30  H(bbb.title) > 0
2520: 0a 20 20 20 20 20 20 41 4e 44 20 62 62 62 2e 70  .      AND bbb.p
2530: 61 72 65 6e 74 20 3d 20 34 0a 20 20 20 20 4f 52  arent = 4.    OR
2540: 44 45 52 20 42 59 20 62 62 62 2e 74 69 74 6c 65  DER BY bbb.title
2550: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20   COLLATE NOCASE 
2560: 41 53 43 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30  ASC;.} {.  0 0 0
2570: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 61   {SEARCH TABLE a
2580: 61 61 20 55 53 49 4e 47 20 49 4e 44 45 58 20 61  aa USING INDEX a
2590: 61 61 5f 33 33 33 20 28 66 6b 3d 3f 29 20 28 7e  aa_333 (fk=?) (~
25a0: 31 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 31  10 rows)} .  0 1
25b0: 20 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   1 {SEARCH TABLE
25c0: 20 62 62 62 20 55 53 49 4e 47 20 49 4e 54 45 47   bbb USING INTEG
25d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28  ER PRIMARY KEY (
25e0: 72 6f 77 69 64 3d 3f 29 20 28 7e 31 20 72 6f 77  rowid=?) (~1 row
25f0: 73 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 55 53  s)} .  0 0 0 {US
2600: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
2610: 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 64 6f  R ORDER BY}.}.do
2620: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
2630: 65 72 65 33 2d 35 2e 31 20 7b 0a 20 20 45 58 50  ere3-5.1 {.  EXP
2640: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
2650: 20 20 20 53 45 4c 45 43 54 20 62 62 62 2e 74 69     SELECT bbb.ti
2660: 74 6c 65 20 41 53 20 74 61 67 5f 74 69 74 6c 65  tle AS tag_title
2670: 20 0a 20 20 20 20 20 46 52 4f 4d 20 61 61 61 20   .     FROM aaa 
2680: 4a 4f 49 4e 20 61 61 61 20 41 53 20 62 62 62 20  JOIN aaa AS bbb 
2690: 4f 4e 20 62 62 62 2e 69 64 20 3d 20 61 61 61 2e  ON bbb.id = aaa.
26a0: 70 61 72 65 6e 74 20 20 0a 20 20 20 20 57 48 45  parent  .    WHE
26b0: 52 45 20 61 61 61 2e 66 6b 20 3d 20 27 63 6f 6e  RE aaa.fk = 'con
26c0: 73 74 61 6e 74 27 0a 20 20 20 20 20 20 41 4e 44  stant'.      AND
26d0: 20 4c 45 4e 47 54 48 28 62 62 62 2e 74 69 74 6c   LENGTH(bbb.titl
26e0: 65 29 20 3e 20 30 0a 20 20 20 20 20 20 41 4e 44  e) > 0.      AND
26f0: 20 62 62 62 2e 70 61 72 65 6e 74 20 3d 20 34 0a   bbb.parent = 4.
2700: 20 20 20 20 4f 52 44 45 52 20 42 59 20 62 62 62      ORDER BY bbb
2710: 2e 74 69 74 6c 65 20 43 4f 4c 4c 41 54 45 20 4e  .title COLLATE N
2720: 4f 43 41 53 45 20 41 53 43 3b 0a 7d 20 7b 0a 20  OCASE ASC;.} {. 
2730: 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   0 0 0 {SEARCH T
2740: 41 42 4c 45 20 61 61 61 20 55 53 49 4e 47 20 49  ABLE aaa USING I
2750: 4e 44 45 58 20 61 61 61 5f 33 33 33 20 28 66 6b  NDEX aaa_333 (fk
2760: 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d 20  =?) (~10 rows)} 
2770: 0a 20 20 30 20 31 20 31 20 7b 53 45 41 52 43 48  .  0 1 1 {SEARCH
2780: 20 54 41 42 4c 45 20 61 61 61 20 41 53 20 62 62   TABLE aaa AS bb
2790: 62 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  b USING INTEGER 
27a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
27b0: 69 64 3d 3f 29 20 28 7e 31 20 72 6f 77 73 29 7d  id=?) (~1 rows)}
27c0: 20 0a 20 20 30 20 30 20 30 20 7b 55 53 45 20 54   .  0 0 0 {USE T
27d0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
27e0: 52 44 45 52 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78  RDER BY}.}.do_ex
27f0: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
2800: 33 2d 35 2e 32 20 7b 0a 20 20 45 58 50 4c 41 49  3-5.2 {.  EXPLAI
2810: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20  N QUERY PLAN.   
2820: 53 45 4c 45 43 54 20 62 62 62 2e 74 69 74 6c 65  SELECT bbb.title
2830: 20 41 53 20 74 61 67 5f 74 69 74 6c 65 20 0a 20   AS tag_title . 
2840: 20 20 20 20 46 52 4f 4d 20 62 62 62 20 4a 4f 49      FROM bbb JOI
2850: 4e 20 61 61 61 20 4f 4e 20 62 62 62 2e 69 64 20  N aaa ON bbb.id 
2860: 3d 20 61 61 61 2e 70 61 72 65 6e 74 20 20 0a 20  = aaa.parent  . 
2870: 20 20 20 57 48 45 52 45 20 61 61 61 2e 66 6b 20     WHERE aaa.fk 
2880: 3d 20 27 63 6f 6e 73 74 61 6e 74 27 0a 20 20 20  = 'constant'.   
2890: 20 20 20 41 4e 44 20 4c 45 4e 47 54 48 28 62 62     AND LENGTH(bb
28a0: 62 2e 74 69 74 6c 65 29 20 3e 20 30 0a 20 20 20  b.title) > 0.   
28b0: 20 20 20 41 4e 44 20 62 62 62 2e 70 61 72 65 6e     AND bbb.paren
28c0: 74 20 3d 20 34 0a 20 20 20 20 4f 52 44 45 52 20  t = 4.    ORDER 
28d0: 42 59 20 62 62 62 2e 74 69 74 6c 65 20 43 4f 4c  BY bbb.title COL
28e0: 4c 41 54 45 20 4e 4f 43 41 53 45 20 41 53 43 3b  LATE NOCASE ASC;
28f0: 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 45  .} {.  0 0 1 {SE
2900: 41 52 43 48 20 54 41 42 4c 45 20 61 61 61 20 55  ARCH TABLE aaa U
2910: 53 49 4e 47 20 49 4e 44 45 58 20 61 61 61 5f 33  SING INDEX aaa_3
2920: 33 33 20 28 66 6b 3d 3f 29 20 28 7e 31 30 20 72  33 (fk=?) (~10 r
2930: 6f 77 73 29 7d 20 0a 20 20 30 20 31 20 30 20 7b  ows)} .  0 1 0 {
2940: 53 45 41 52 43 48 20 54 41 42 4c 45 20 62 62 62  SEARCH TABLE bbb
2950: 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
2960: 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69  RIMARY KEY (rowi
2970: 64 3d 3f 29 20 28 7e 31 20 72 6f 77 73 29 7d 20  d=?) (~1 rows)} 
2980: 0a 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45  .  0 0 0 {USE TE
2990: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52  MP B-TREE FOR OR
29a0: 44 45 52 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78 65  DER BY}.}.do_exe
29b0: 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33  csql_test where3
29c0: 2d 35 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49 4e  -5.3 {.  EXPLAIN
29d0: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 53   QUERY PLAN.   S
29e0: 45 4c 45 43 54 20 62 62 62 2e 74 69 74 6c 65 20  ELECT bbb.title 
29f0: 41 53 20 74 61 67 5f 74 69 74 6c 65 20 0a 20 20  AS tag_title .  
2a00: 20 20 20 46 52 4f 4d 20 61 61 61 20 41 53 20 62     FROM aaa AS b
2a10: 62 62 20 4a 4f 49 4e 20 61 61 61 20 4f 4e 20 62  bb JOIN aaa ON b
2a20: 62 62 2e 69 64 20 3d 20 61 61 61 2e 70 61 72 65  bb.id = aaa.pare
2a30: 6e 74 20 20 0a 20 20 20 20 57 48 45 52 45 20 61  nt  .    WHERE a
2a40: 61 61 2e 66 6b 20 3d 20 27 63 6f 6e 73 74 61 6e  aa.fk = 'constan
2a50: 74 27 0a 20 20 20 20 20 20 41 4e 44 20 4c 45 4e  t'.      AND LEN
2a60: 47 54 48 28 62 62 62 2e 74 69 74 6c 65 29 20 3e  GTH(bbb.title) >
2a70: 20 30 0a 20 20 20 20 20 20 41 4e 44 20 62 62 62   0.      AND bbb
2a80: 2e 70 61 72 65 6e 74 20 3d 20 34 0a 20 20 20 20  .parent = 4.    
2a90: 4f 52 44 45 52 20 42 59 20 62 62 62 2e 74 69 74  ORDER BY bbb.tit
2aa0: 6c 65 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53  le COLLATE NOCAS
2ab0: 45 20 41 53 43 3b 0a 7d 20 7b 0a 20 20 30 20 30  E ASC;.} {.  0 0
2ac0: 20 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   1 {SEARCH TABLE
2ad0: 20 61 61 61 20 55 53 49 4e 47 20 49 4e 44 45 58   aaa USING INDEX
2ae0: 20 61 61 61 5f 33 33 33 20 28 66 6b 3d 3f 29 20   aaa_333 (fk=?) 
2af0: 28 7e 31 30 20 72 6f 77 73 29 7d 20 0a 20 20 30  (~10 rows)} .  0
2b00: 20 31 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   1 0 {SEARCH TAB
2b10: 4c 45 20 61 61 61 20 41 53 20 62 62 62 20 55 53  LE aaa AS bbb US
2b20: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
2b30: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
2b40: 29 20 28 7e 31 20 72 6f 77 73 29 7d 20 0a 20 20  ) (~1 rows)} .  
2b50: 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  0 0 0 {USE TEMP 
2b60: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
2b70: 20 42 59 7d 0a 7d 0a 0a 23 20 4e 61 6d 65 20 72   BY}.}..# Name r
2b80: 65 73 6f 6c 75 74 69 6f 6e 20 77 69 74 68 20 4e  esolution with N
2b90: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 61 6e 64 20  ATURAL JOIN and 
2ba0: 55 53 49 4e 47 0a 23 0a 64 6f 5f 74 65 73 74 20  USING.#.do_test 
2bb0: 77 68 65 72 65 33 2d 36 2e 73 65 74 75 70 20 7b  where3-6.setup {
2bc0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
2bd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
2be0: 77 28 61 2c 20 77 29 3b 0a 20 20 20 20 49 4e 53  w(a, w);.    INS
2bf0: 45 52 54 20 49 4e 54 4f 20 74 36 77 20 56 41 4c  ERT INTO t6w VAL
2c00: 55 45 53 28 31 2c 20 27 77 2d 6f 6e 65 27 29 3b  UES(1, 'w-one');
2c10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2c20: 20 74 36 77 20 56 41 4c 55 45 53 28 32 2c 20 27   t6w VALUES(2, '
2c30: 77 2d 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53  w-two');.    INS
2c40: 45 52 54 20 49 4e 54 4f 20 74 36 77 20 56 41 4c  ERT INTO t6w VAL
2c50: 55 45 53 28 39 2c 20 27 77 2d 6e 69 6e 65 27 29  UES(9, 'w-nine')
2c60: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2c70: 4c 45 20 74 36 78 28 61 2c 20 78 29 3b 0a 20 20  LE t6x(a, x);.  
2c80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
2c90: 78 20 56 41 4c 55 45 53 28 31 2c 20 27 78 2d 6f  x VALUES(1, 'x-o
2ca0: 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ne');.    INSERT
2cb0: 20 49 4e 54 4f 20 74 36 78 20 56 41 4c 55 45 53   INTO t6x VALUES
2cc0: 28 33 2c 20 27 78 2d 74 68 72 65 65 27 29 3b 0a  (3, 'x-three');.
2cd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ce0: 74 36 78 20 56 41 4c 55 45 53 28 39 2c 20 27 78  t6x VALUES(9, 'x
2cf0: 2d 6e 69 6e 65 27 29 3b 0a 20 20 20 20 43 52 45  -nine');.    CRE
2d00: 41 54 45 20 54 41 42 4c 45 20 74 36 79 28 61 2c  ATE TABLE t6y(a,
2d10: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
2d20: 49 4e 54 4f 20 74 36 79 20 56 41 4c 55 45 53 28  INTO t6y VALUES(
2d30: 31 2c 20 27 79 2d 6f 6e 65 27 29 3b 0a 20 20 20  1, 'y-one');.   
2d40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 79   INSERT INTO t6y
2d50: 20 56 41 4c 55 45 53 28 34 2c 20 27 79 2d 66 6f   VALUES(4, 'y-fo
2d60: 75 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ur');.    INSERT
2d70: 20 49 4e 54 4f 20 74 36 79 20 56 41 4c 55 45 53   INTO t6y VALUES
2d80: 28 39 2c 20 27 79 2d 6e 69 6e 65 27 29 3b 0a 20  (9, 'y-nine');. 
2d90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2da0: 74 36 7a 28 61 2c 20 7a 29 3b 0a 20 20 20 20 49  t6z(a, z);.    I
2db0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 7a 20 56  NSERT INTO t6z V
2dc0: 41 4c 55 45 53 28 31 2c 20 27 7a 2d 6f 6e 65 27  ALUES(1, 'z-one'
2dd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2de0: 54 4f 20 74 36 7a 20 56 41 4c 55 45 53 28 35 2c  TO t6z VALUES(5,
2df0: 20 27 7a 2d 66 69 76 65 27 29 3b 0a 20 20 20 20   'z-five');.    
2e00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 7a 20  INSERT INTO t6z 
2e10: 56 41 4c 55 45 53 28 39 2c 20 27 7a 2d 6e 69 6e  VALUES(9, 'z-nin
2e20: 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 73 65  e');.  }.} {}.se
2e30: 74 20 63 6e 74 20 30 0a 66 6f 72 65 61 63 68 20  t cnt 0.foreach 
2e40: 70 72 65 64 69 63 61 74 65 20 7b 0a 20 20 20 7b  predicate {.   {
2e50: 7d 0a 20 20 20 7b 4f 52 44 45 52 20 42 59 20 61  }.   {ORDER BY a
2e60: 7d 0a 20 20 20 7b 4f 52 44 45 52 20 42 59 20 74  }.   {ORDER BY t
2e70: 36 77 2e 61 7d 0a 20 20 20 7b 57 48 45 52 45 20  6w.a}.   {WHERE 
2e80: 61 3e 30 7d 0a 20 20 20 7b 57 48 45 52 45 20 74  a>0}.   {WHERE t
2e90: 36 79 2e 61 3e 30 7d 0a 20 20 20 7b 57 48 45 52  6y.a>0}.   {WHER
2ea0: 45 20 61 3e 30 20 4f 52 44 45 52 20 42 59 20 61  E a>0 ORDER BY a
2eb0: 7d 0a 7d 20 7b 0a 20 20 69 6e 63 72 20 63 6e 74  }.} {.  incr cnt
2ec0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
2ed0: 33 2d 36 2e 24 63 6e 74 2e 31 20 7b 0a 20 20 20  3-6.$cnt.1 {.   
2ee0: 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54   set sql "SELECT
2ef0: 20 2a 20 46 52 4f 4d 20 74 36 77 20 4e 41 54 55   * FROM t6w NATU
2f00: 52 41 4c 20 4a 4f 49 4e 20 74 36 78 20 4e 41 54  RAL JOIN t6x NAT
2f10: 55 52 41 4c 20 4a 4f 49 4e 20 74 36 79 22 0a 20  URAL JOIN t6y". 
2f20: 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20     append sql " 
2f30: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 7a  NATURAL JOIN t6z
2f40: 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71   ".    append sq
2f50: 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20  l $::predicate. 
2f60: 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a     db eval $sql.
2f70: 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f    } {1 w-one x-o
2f80: 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39  ne y-one z-one 9
2f90: 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79   w-nine x-nine y
2fa0: 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20  -nine z-nine}.  
2fb0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36  do_test where3-6
2fc0: 2e 24 63 6e 74 2e 32 20 7b 0a 20 20 20 20 73 65  .$cnt.2 {.    se
2fd0: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20  t sql "SELECT * 
2fe0: 46 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36  FROM t6w JOIN t6
2ff0: 78 20 55 53 49 4e 47 28 61 29 20 4a 4f 49 4e 20  x USING(a) JOIN 
3000: 74 36 79 20 55 53 49 4e 47 28 61 29 22 0a 20 20  t6y USING(a)".  
3010: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4a    append sql " J
3020: 4f 49 4e 20 74 36 7a 20 55 53 49 4e 47 28 61 29  OIN t6z USING(a)
3030: 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71   ".    append sq
3040: 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20  l $::predicate. 
3050: 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a     db eval $sql.
3060: 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f    } {1 w-one x-o
3070: 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39  ne y-one z-one 9
3080: 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79   w-nine x-nine y
3090: 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20  -nine z-nine}.  
30a0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36  do_test where3-6
30b0: 2e 24 63 6e 74 2e 33 20 7b 0a 20 20 20 20 73 65  .$cnt.3 {.    se
30c0: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20  t sql "SELECT * 
30d0: 46 52 4f 4d 20 74 36 77 20 4e 41 54 55 52 41 4c  FROM t6w NATURAL
30e0: 20 4a 4f 49 4e 20 74 36 78 20 4a 4f 49 4e 20 74   JOIN t6x JOIN t
30f0: 36 79 20 55 53 49 4e 47 28 61 29 22 0a 20 20 20  6y USING(a)".   
3100: 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4a 4f   append sql " JO
3110: 49 4e 20 74 36 7a 20 55 53 49 4e 47 28 61 29 20  IN t6z USING(a) 
3120: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
3130: 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20   $::predicate.  
3140: 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20    db eval $sql. 
3150: 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e   } {1 w-one x-on
3160: 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20  e y-one z-one 9 
3170: 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d  w-nine x-nine y-
3180: 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64  nine z-nine}.  d
3190: 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e  o_test where3-6.
31a0: 24 63 6e 74 2e 34 20 7b 0a 20 20 20 20 73 65 74  $cnt.4 {.    set
31b0: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46   sql "SELECT * F
31c0: 52 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36 78  ROM t6w JOIN t6x
31d0: 20 55 53 49 4e 47 28 61 29 20 4e 41 54 55 52 41   USING(a) NATURA
31e0: 4c 20 4a 4f 49 4e 20 74 36 79 22 0a 20 20 20 20  L JOIN t6y".    
31f0: 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4a 4f 49  append sql " JOI
3200: 4e 20 74 36 7a 20 55 53 49 4e 47 28 61 29 20 22  N t6z USING(a) "
3210: 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20  .    append sql 
3220: 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20 20  $::predicate.   
3230: 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20 20   db eval $sql.  
3240: 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65  } {1 w-one x-one
3250: 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77   y-one z-one 9 w
3260: 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e  -nine x-nine y-n
3270: 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f  ine z-nine}.  do
3280: 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e 24  _test where3-6.$
3290: 63 6e 74 2e 35 20 7b 0a 20 20 20 20 73 65 74 20  cnt.5 {.    set 
32a0: 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  sql "SELECT * FR
32b0: 4f 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36 78 20  OM t6w JOIN t6x 
32c0: 55 53 49 4e 47 28 61 29 20 4a 4f 49 4e 20 74 36  USING(a) JOIN t6
32d0: 79 20 55 53 49 4e 47 28 61 29 22 0a 20 20 20 20  y USING(a)".    
32e0: 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4e 41 54  append sql " NAT
32f0: 55 52 41 4c 20 4a 4f 49 4e 20 74 36 7a 20 22 0a  URAL JOIN t6z ".
3300: 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 24      append sql $
3310: 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20 20 20  ::predicate.    
3320: 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d  db eval $sql.  }
3330: 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20   {1 w-one x-one 
3340: 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d  y-one z-one 9 w-
3350: 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69  nine x-nine y-ni
3360: 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f  ne z-nine}.  do_
3370: 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e 24 63  test where3-6.$c
3380: 6e 74 2e 36 20 7b 0a 20 20 20 20 73 65 74 20 73  nt.6 {.    set s
3390: 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql "SELECT * FRO
33a0: 4d 20 74 36 77 20 4a 4f 49 4e 20 74 36 78 20 55  M t6w JOIN t6x U
33b0: 53 49 4e 47 28 61 29 20 4e 41 54 55 52 41 4c 20  SING(a) NATURAL 
33c0: 4a 4f 49 4e 20 74 36 79 22 0a 20 20 20 20 61 70  JOIN t6y".    ap
33d0: 70 65 6e 64 20 73 71 6c 20 22 20 4e 41 54 55 52  pend sql " NATUR
33e0: 41 4c 20 4a 4f 49 4e 20 74 36 7a 20 22 0a 20 20  AL JOIN t6z ".  
33f0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a    append sql $::
3400: 70 72 65 64 69 63 61 74 65 0a 20 20 20 20 64 62  predicate.    db
3410: 20 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b   eval $sql.  } {
3420: 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d  1 w-one x-one y-
3430: 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69  one z-one 9 w-ni
3440: 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65  ne x-nine y-nine
3450: 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65   z-nine}.  do_te
3460: 73 74 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74  st where3-6.$cnt
3470: 2e 37 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c  .7 {.    set sql
3480: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
3490: 74 36 77 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e  t6w NATURAL JOIN
34a0: 20 74 36 78 20 4a 4f 49 4e 20 74 36 79 20 55 53   t6x JOIN t6y US
34b0: 49 4e 47 28 61 29 22 0a 20 20 20 20 61 70 70 65  ING(a)".    appe
34c0: 6e 64 20 73 71 6c 20 22 20 4e 41 54 55 52 41 4c  nd sql " NATURAL
34d0: 20 4a 4f 49 4e 20 74 36 7a 20 22 0a 20 20 20 20   JOIN t6z ".    
34e0: 61 70 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72  append sql $::pr
34f0: 65 64 69 63 61 74 65 0a 20 20 20 20 64 62 20 65  edicate.    db e
3500: 76 61 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20  val $sql.  } {1 
3510: 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e  w-one x-one y-on
3520: 65 20 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65  e z-one 9 w-nine
3530: 20 78 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a   x-nine y-nine z
3540: 2d 6e 69 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74  -nine}.  do_test
3550: 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e 38   where3-6.$cnt.8
3560: 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22   {.    set sql "
3570: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
3580: 77 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74  w NATURAL JOIN t
3590: 36 78 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  6x NATURAL JOIN 
35a0: 74 36 79 22 0a 20 20 20 20 61 70 70 65 6e 64 20  t6y".    append 
35b0: 73 71 6c 20 22 20 4a 4f 49 4e 20 74 36 7a 20 55  sql " JOIN t6z U
35c0: 53 49 4e 47 28 61 29 20 22 0a 20 20 20 20 61 70  SING(a) ".    ap
35d0: 70 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64  pend sql $::pred
35e0: 69 63 61 74 65 0a 20 20 20 20 64 62 20 65 76 61  icate.    db eva
35f0: 6c 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d  l $sql.  } {1 w-
3600: 6f 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20  one x-one y-one 
3610: 7a 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78  z-one 9 w-nine x
3620: 2d 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e  -nine y-nine z-n
3630: 69 6e 65 7d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f  ine}.}...finish_
3640: 74 65 73 74 0a                                   test.