/ Hex Artifact Content
Login

Artifact 54cdeb02157acc979de41530b804ae7b09552bf1:


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 26  capable explain&
05a0: 26 21 63 75 72 73 6f 72 68 69 6e 74 73 20 7b 0a  &!cursorhints {.
05b0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33    do_test where3
05c0: 2d 31 2e 31 2e 31 20 7b 0a 20 20 20 20 20 65 78  -1.1.1 {.     ex
05d0: 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 63 65 20 7b  plain_no_trace {
05e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
05f0: 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , t2 LEFT JOIN t
0600: 33 20 4f 4e 20 71 3d 78 0a 20 20 20 20 20 20 20  3 ON q=x.       
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 57 48 45 52 45 20 70 3d 32 20 41 4e 44 20 61   WHERE p=2 AND a
0630: 3d 71 7d 0a 20 20 7d 20 5b 65 78 70 6c 61 69 6e  =q}.  } [explain
0640: 5f 6e 6f 5f 74 72 61 63 65 20 7b 53 45 4c 45 43  _no_trace {SELEC
0650: 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
0660: 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 4f 4e 20  LEFT JOIN t3 ON 
0670: 78 3d 71 0a 20 20 20 20 20 20 20 20 20 20 20 20  x=q.            
0680: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
0690: 45 20 70 3d 32 20 41 4e 44 20 61 3d 71 7d 5d 0a  E p=2 AND a=q}].
06a0: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 31 38 33  }..# Ticket #183
06b0: 30 0a 23 0a 23 20 54 68 69 73 20 69 73 20 73 69  0.#.# This is si
06c0: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61 62 6f  milar to the abo
06d0: 76 65 20 62 75 74 20 77 69 74 68 20 74 68 65 20  ve but with the 
06e0: 4c 45 46 54 20 4a 4f 49 4e 20 6f 6e 20 74 68 65  LEFT JOIN on the
06f0: 0a 23 20 6f 74 68 65 72 20 73 69 64 65 2e 0a 23  .# other side..#
0700: 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d  .do_test where3-
0710: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
0720: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0730: 4c 45 20 70 61 72 65 6e 74 31 28 70 61 72 65 6e  LE parent1(paren
0740: 74 31 6b 65 79 2c 20 63 68 69 6c 64 31 6b 65 79  t1key, child1key
0750: 2c 20 43 68 69 6c 64 32 6b 65 79 2c 20 63 68 69  , Child2key, chi
0760: 6c 64 33 6b 65 79 29 3b 0a 20 20 20 20 43 52 45  ld3key);.    CRE
0770: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
0780: 20 28 20 63 68 69 6c 64 31 6b 65 79 20 4e 56 41   ( child1key NVA
0790: 52 43 48 41 52 2c 20 76 61 6c 75 65 20 4e 56 41  RCHAR, value NVA
07a0: 52 43 48 41 52 20 29 3b 0a 20 20 20 20 43 52 45  RCHAR );.    CRE
07b0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
07c0: 20 50 4b 49 44 58 43 68 69 6c 64 31 20 4f 4e 20   PKIDXChild1 ON 
07d0: 63 68 69 6c 64 31 20 28 20 63 68 69 6c 64 31 6b  child1 ( child1k
07e0: 65 79 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ey );.    CREATE
07f0: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 20 28 20   TABLE child2 ( 
0800: 63 68 69 6c 64 32 6b 65 79 20 4e 56 41 52 43 48  child2key NVARCH
0810: 41 52 2c 20 76 61 6c 75 65 20 4e 56 41 52 43 48  AR, value NVARCH
0820: 41 52 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  AR );..    INSER
0830: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 31 28 70  T INTO parent1(p
0840: 61 72 65 6e 74 31 6b 65 79 2c 63 68 69 6c 64 31  arent1key,child1
0850: 6b 65 79 2c 63 68 69 6c 64 32 6b 65 79 29 0a 20  key,child2key). 
0860: 20 20 20 20 20 20 56 41 4c 55 45 53 20 28 20 31        VALUES ( 1
0870: 2c 20 27 43 31 2e 31 27 2c 20 27 43 32 2e 31 27  , 'C1.1', 'C2.1'
0880: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
0890: 4e 54 4f 20 63 68 69 6c 64 31 20 28 20 63 68 69  NTO child1 ( chi
08a0: 6c 64 31 6b 65 79 2c 20 76 61 6c 75 65 20 29 20  ld1key, value ) 
08b0: 56 41 4c 55 45 53 20 28 20 27 43 31 2e 31 27 2c  VALUES ( 'C1.1',
08c0: 20 27 56 61 6c 75 65 20 66 6f 72 20 43 31 2e 31   'Value for C1.1
08d0: 27 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ' );.    INSERT 
08e0: 49 4e 54 4f 20 63 68 69 6c 64 32 20 28 20 63 68  INTO child2 ( ch
08f0: 69 6c 64 32 6b 65 79 2c 20 76 61 6c 75 65 20 29  ild2key, value )
0900: 20 56 41 4c 55 45 53 20 28 20 27 43 32 2e 31 27   VALUES ( 'C2.1'
0910: 2c 20 27 56 61 6c 75 65 20 66 6f 72 20 43 32 2e  , 'Value for C2.
0920: 31 27 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  1' );..    INSER
0930: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 31 20 28  T INTO parent1 (
0940: 20 70 61 72 65 6e 74 31 6b 65 79 2c 20 63 68 69   parent1key, chi
0950: 6c 64 31 6b 65 79 2c 20 63 68 69 6c 64 32 6b 65  ld1key, child2ke
0960: 79 20 29 0a 20 20 20 20 20 20 20 56 41 4c 55 45  y ).       VALUE
0970: 53 20 28 20 32 2c 20 27 43 31 2e 32 27 2c 20 27  S ( 2, 'C1.2', '
0980: 43 32 2e 32 27 20 29 3b 0a 20 20 20 20 49 4e 53  C2.2' );.    INS
0990: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
09a0: 28 20 63 68 69 6c 64 32 6b 65 79 2c 20 76 61 6c  ( child2key, val
09b0: 75 65 20 29 20 56 41 4c 55 45 53 20 28 20 27 43  ue ) VALUES ( 'C
09c0: 32 2e 32 27 2c 20 27 56 61 6c 75 65 20 66 6f 72  2.2', 'Value for
09d0: 20 43 32 2e 32 27 20 29 3b 0a 0a 20 20 20 20 49   C2.2' );..    I
09e0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
09f0: 74 31 20 28 20 70 61 72 65 6e 74 31 6b 65 79 2c  t1 ( parent1key,
0a00: 20 63 68 69 6c 64 31 6b 65 79 2c 20 63 68 69 6c   child1key, chil
0a10: 64 32 6b 65 79 20 29 0a 20 20 20 20 20 20 20 56  d2key ).       V
0a20: 41 4c 55 45 53 20 28 20 33 2c 20 27 43 31 2e 33  ALUES ( 3, 'C1.3
0a30: 27 2c 20 27 43 32 2e 33 27 20 29 3b 0a 20 20 20  ', 'C2.3' );.   
0a40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
0a50: 6c 64 31 20 28 20 63 68 69 6c 64 31 6b 65 79 2c  ld1 ( child1key,
0a60: 20 76 61 6c 75 65 20 29 20 56 41 4c 55 45 53 20   value ) VALUES 
0a70: 28 20 27 43 31 2e 33 27 2c 20 27 56 61 6c 75 65  ( 'C1.3', 'Value
0a80: 20 66 6f 72 20 43 31 2e 33 27 20 29 3b 0a 20 20   for C1.3' );.  
0a90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
0aa0: 69 6c 64 32 20 28 20 63 68 69 6c 64 32 6b 65 79  ild2 ( child2key
0ab0: 2c 20 76 61 6c 75 65 20 29 20 56 41 4c 55 45 53  , value ) VALUES
0ac0: 20 28 20 27 43 32 2e 33 27 2c 20 27 56 61 6c 75   ( 'C2.3', 'Valu
0ad0: 65 20 66 6f 72 20 43 32 2e 33 27 20 29 3b 0a 0a  e for C2.3' );..
0ae0: 20 20 20 20 53 45 4c 45 43 54 20 70 61 72 65 6e      SELECT paren
0af0: 74 31 2e 70 61 72 65 6e 74 31 6b 65 79 2c 20 63  t1.parent1key, c
0b00: 68 69 6c 64 31 2e 76 61 6c 75 65 2c 20 63 68 69  hild1.value, chi
0b10: 6c 64 32 2e 76 61 6c 75 65 0a 20 20 20 20 46 52  ld2.value.    FR
0b20: 4f 4d 20 70 61 72 65 6e 74 31 0a 20 20 20 20 4c  OM parent1.    L
0b30: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 63  EFT OUTER JOIN c
0b40: 68 69 6c 64 31 20 4f 4e 20 63 68 69 6c 64 31 2e  hild1 ON child1.
0b50: 63 68 69 6c 64 31 6b 65 79 20 3d 20 70 61 72 65  child1key = pare
0b60: 6e 74 31 2e 63 68 69 6c 64 31 6b 65 79 0a 20 20  nt1.child1key.  
0b70: 20 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 63 68 69    INNER JOIN chi
0b80: 6c 64 32 20 4f 4e 20 63 68 69 6c 64 32 2e 63 68  ld2 ON child2.ch
0b90: 69 6c 64 32 6b 65 79 20 3d 20 70 61 72 65 6e 74  ild2key = parent
0ba0: 31 2e 63 68 69 6c 64 32 6b 65 79 3b 0a 20 20 7d  1.child2key;.  }
0bb0: 0a 7d 20 7b 31 20 7b 56 61 6c 75 65 20 66 6f 72  .} {1 {Value for
0bc0: 20 43 31 2e 31 7d 20 7b 56 61 6c 75 65 20 66 6f   C1.1} {Value fo
0bd0: 72 20 43 32 2e 31 7d 20 32 20 7b 7d 20 7b 56 61  r C2.1} 2 {} {Va
0be0: 6c 75 65 20 66 6f 72 20 43 32 2e 32 7d 20 33 20  lue for C2.2} 3 
0bf0: 7b 56 61 6c 75 65 20 66 6f 72 20 43 31 2e 33 7d  {Value for C1.3}
0c00: 20 7b 56 61 6c 75 65 20 66 6f 72 20 43 32 2e 33   {Value for C2.3
0c10: 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 65 78  }}..ifcapable ex
0c20: 70 6c 61 69 6e 26 26 21 63 75 72 73 6f 72 68 69  plain&&!cursorhi
0c30: 6e 74 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  nts {.  do_test 
0c40: 77 68 65 72 65 33 2d 31 2e 32 2e 31 20 7b 0a 20  where3-1.2.1 {. 
0c50: 20 20 20 20 65 78 70 6c 61 69 6e 5f 6e 6f 5f 74      explain_no_t
0c60: 72 61 63 65 20 7b 0a 20 20 20 20 20 20 20 53 45  race {.       SE
0c70: 4c 45 43 54 20 70 61 72 65 6e 74 31 2e 70 61 72  LECT parent1.par
0c80: 65 6e 74 31 6b 65 79 2c 20 63 68 69 6c 64 31 2e  ent1key, child1.
0c90: 76 61 6c 75 65 2c 20 63 68 69 6c 64 32 2e 76 61  value, child2.va
0ca0: 6c 75 65 0a 20 20 20 20 20 20 20 46 52 4f 4d 20  lue.       FROM 
0cb0: 70 61 72 65 6e 74 31 0a 20 20 20 20 20 20 20 4c  parent1.       L
0cc0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 63  EFT OUTER JOIN c
0cd0: 68 69 6c 64 31 20 4f 4e 20 63 68 69 6c 64 31 2e  hild1 ON child1.
0ce0: 63 68 69 6c 64 31 6b 65 79 20 3d 20 70 61 72 65  child1key = pare
0cf0: 6e 74 31 2e 63 68 69 6c 64 31 6b 65 79 0a 20 20  nt1.child1key.  
0d00: 20 20 20 20 20 49 4e 4e 45 52 20 4a 4f 49 4e 20       INNER JOIN 
0d10: 63 68 69 6c 64 32 20 4f 4e 20 63 68 69 6c 64 32  child2 ON child2
0d20: 2e 63 68 69 6c 64 32 6b 65 79 20 3d 20 70 61 72  .child2key = par
0d30: 65 6e 74 31 2e 63 68 69 6c 64 32 6b 65 79 3b 0a  ent1.child2key;.
0d40: 20 20 20 20 20 7d 0a 20 20 7d 20 5b 65 78 70 6c       }.  } [expl
0d50: 61 69 6e 5f 6e 6f 5f 74 72 61 63 65 20 7b 0a 20  ain_no_trace {. 
0d60: 20 20 20 20 20 20 53 45 4c 45 43 54 20 70 61 72        SELECT par
0d70: 65 6e 74 31 2e 70 61 72 65 6e 74 31 6b 65 79 2c  ent1.parent1key,
0d80: 20 63 68 69 6c 64 31 2e 76 61 6c 75 65 2c 20 63   child1.value, c
0d90: 68 69 6c 64 32 2e 76 61 6c 75 65 0a 20 20 20 20  hild2.value.    
0da0: 20 20 20 46 52 4f 4d 20 70 61 72 65 6e 74 31 0a     FROM parent1.
0db0: 20 20 20 20 20 20 20 4c 45 46 54 20 4f 55 54 45         LEFT OUTE
0dc0: 52 20 4a 4f 49 4e 20 63 68 69 6c 64 31 20 4f 4e  R JOIN child1 ON
0dd0: 20 70 61 72 65 6e 74 31 2e 63 68 69 6c 64 31 6b   parent1.child1k
0de0: 65 79 20 3d 20 63 68 69 6c 64 31 2e 63 68 69 6c  ey = child1.chil
0df0: 64 31 6b 65 79 20 0a 20 20 20 20 20 20 20 49 4e  d1key .       IN
0e00: 4e 45 52 20 4a 4f 49 4e 20 63 68 69 6c 64 32 20  NER JOIN child2 
0e10: 4f 4e 20 63 68 69 6c 64 32 2e 63 68 69 6c 64 32  ON child2.child2
0e20: 6b 65 79 20 3d 20 70 61 72 65 6e 74 31 2e 63 68  key = parent1.ch
0e30: 69 6c 64 32 6b 65 79 3b 0a 20 20 20 20 20 7d 5d  ild2key;.     }]
0e40: 0a 7d 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 65  .}..# This proce
0e50: 64 75 72 65 20 65 78 65 63 75 74 65 73 20 74 68  dure executes th
0e60: 65 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74 20  e SQL.  Then it 
0e70: 61 70 70 65 6e 64 73 20 0a 23 20 74 68 65 20 6e  appends .# the n
0e80: 61 6d 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ames of the tabl
0e90: 65 20 61 6e 64 20 69 6e 64 65 78 20 75 73 65 64  e and index used
0ea0: 0a 23 0a 70 72 6f 63 20 71 75 65 72 79 70 6c 61  .#.proc querypla
0eb0: 6e 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  n {sql} {.  set 
0ec0: 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f  ::sqlite_sort_co
0ed0: 75 6e 74 20 30 0a 20 20 73 65 74 20 64 61 74 61  unt 0.  set data
0ee0: 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d 0a   [execsql $sql].
0ef0: 20 20 73 65 74 20 65 71 70 20 5b 65 78 65 63 73    set eqp [execs
0f00: 71 6c 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  ql "EXPLAIN QUER
0f10: 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 0a 20 20  Y PLAN $sql"].  
0f20: 23 20 70 75 74 73 20 65 71 70 3d 24 65 71 70 0a  # puts eqp=$eqp.
0f30: 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63    foreach {a b c
0f40: 20 78 7d 20 24 65 71 70 20 7b 0a 20 20 20 20 69   x} $eqp {.    i
0f50: 66 20 7b 5b 72 65 67 65 78 70 20 7b 20 54 41 42  f {[regexp { TAB
0f60: 4c 45 20 28 5c 77 2b 20 41 53 20 29 3f 28 5c 77  LE (\w+ AS )?(\w
0f70: 2b 29 20 55 53 49 4e 47 2e 2a 20 49 4e 44 45 58  +) USING.* INDEX
0f80: 20 28 5c 77 2b 29 5c 79 7d 20 5c 0a 20 20 20 20   (\w+)\y} \.    
0f90: 20 20 20 20 24 78 20 61 6c 6c 20 61 73 20 74 61      $x all as ta
0fa0: 62 20 69 64 78 5d 7d 20 7b 0a 20 20 20 20 20 20  b idx]} {.      
0fb0: 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 74 61  lappend data $ta
0fc0: 62 20 24 69 64 78 0a 20 20 20 20 7d 20 65 6c 73  b $idx.    } els
0fd0: 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 20 54  eif {[regexp { T
0fe0: 41 42 4c 45 20 28 5c 77 2b 20 41 53 20 29 3f 28  ABLE (\w+ AS )?(
0ff0: 5c 77 2b 29 5c 79 7d 20 24 78 20 61 6c 6c 20 61  \w+)\y} $x all a
1000: 73 20 74 61 62 5d 7d 20 7b 0a 20 20 20 20 20 20  s tab]} {.      
1010: 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 74 61  lappend data $ta
1020: 62 20 2a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b *.    }.  }.  
1030: 72 65 74 75 72 6e 20 24 64 61 74 61 20 20 20 0a  return $data   .
1040: 7d 0a 0a 0a 23 20 49 66 20 79 6f 75 20 68 61 76  }...# If you hav
1050: 65 20 61 20 66 72 6f 6d 20 63 6c 61 75 73 65 20  e a from clause 
1060: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 41  of the form:   A
1070: 20 42 20 43 20 6c 65 66 74 20 6a 6f 69 6e 20 44   B C left join D
1080: 0a 23 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  .# then make sur
1090: 65 20 74 68 65 20 71 75 65 72 79 20 6f 70 74 69  e the query opti
10a0: 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
10b0: 20 72 65 6f 72 64 65 72 20 74 68 65 20 0a 23 20   reorder the .# 
10c0: 41 20 42 20 43 20 70 61 72 74 20 61 6e 79 77 61  A B C part anywa
10d0: 79 20 69 74 20 77 61 6e 74 73 2e 20 0a 23 0a 23  y it wants. .#.#
10e0: 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66   Following the f
10f0: 69 78 20 74 6f 20 74 69 63 6b 65 74 20 23 31 36  ix to ticket #16
1100: 35 32 2c 20 74 68 65 72 65 20 77 61 73 20 61 20  52, there was a 
1110: 74 69 6d 65 20 77 68 65 6e 0a 23 20 74 68 65 20  time when.# the 
1120: 43 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 6e 6f  C table would no
1130: 74 20 72 65 6f 72 64 65 72 2e 20 20 53 6f 20 74  t reorder.  So t
1140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 6f  he following reo
1150: 72 64 65 72 69 6e 67 73 0a 23 20 77 65 72 65 20  rderings.# were 
1160: 70 6f 73 73 69 62 6c 65 3a 0a 23 0a 23 20 20 20  possible:.#.#   
1170: 20 20 20 20 20 20 20 20 20 41 20 42 20 43 20 6c           A B C l
1180: 65 66 74 20 6a 6f 69 6e 20 44 0a 23 20 20 20 20  eft join D.#    
1190: 20 20 20 20 20 20 20 20 42 20 41 20 43 20 6c 65          B A C le
11a0: 66 74 20 6a 6f 69 6e 20 44 0a 23 0a 23 20 42 75  ft join D.#.# Bu
11b0: 74 20 74 68 65 73 65 20 72 65 6f 72 64 65 72 73  t these reorders
11c0: 20 77 65 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   were not allowe
11d0: 64 0a 23 0a 23 20 20 20 20 20 20 20 20 20 20 20  d.#.#           
11e0: 20 43 20 41 20 42 20 6c 65 66 74 20 6a 6f 69 6e   C A B left join
11f0: 20 44 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   D.#            
1200: 41 20 43 20 42 20 6c 65 66 74 20 6a 6f 69 6e 20  A C B left join 
1210: 44 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 43  D.#            C
1220: 20 42 20 41 20 6c 65 66 74 20 6a 6f 69 6e 20 44   B A left join D
1230: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 42 20  .#            B 
1240: 43 20 41 20 6c 65 66 74 20 6a 6f 69 6e 20 44 0a  C A left join D.
1250: 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  #.# The followin
1260: 67 20 74 65 73 74 73 20 61 72 65 20 68 65 72 65  g tests are here
1270: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1280: 74 68 65 20 6c 61 74 74 65 72 20 66 6f 75 72 0a  the latter four.
1290: 23 20 72 65 6f 72 64 65 72 69 6e 67 73 20 61 72  # reorderings ar
12a0: 65 20 61 6c 6c 6f 77 65 64 20 61 67 61 69 6e 2e  e allowed again.
12b0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .#.do_test where
12c0: 33 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3-2.1 {.  execsq
12d0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
12e0: 41 42 4c 45 20 74 41 28 61 70 6b 20 69 6e 74 65  ABLE tA(apk inte
12f0: 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c  ger primary key,
1300: 20 61 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45   ax);.    CREATE
1310: 20 54 41 42 4c 45 20 74 42 28 62 70 6b 20 69 6e   TABLE tB(bpk in
1320: 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
1330: 79 2c 20 62 78 29 3b 0a 20 20 20 20 43 52 45 41  y, bx);.    CREA
1340: 54 45 20 54 41 42 4c 45 20 74 43 28 63 70 6b 20  TE TABLE tC(cpk 
1350: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
1360: 6b 65 79 2c 20 63 78 29 3b 0a 20 20 20 20 43 52  key, cx);.    CR
1370: 45 41 54 45 20 54 41 42 4c 45 20 74 44 28 64 70  EATE TABLE tD(dp
1380: 6b 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72  k integer primar
1390: 79 20 6b 65 79 2c 20 64 78 29 3b 0a 20 20 7d 0a  y key, dx);.  }.
13a0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
13b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13c0: 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46 54 20  tA, tB, tC LEFT 
13d0: 4a 4f 49 4e 20 74 44 20 4f 4e 20 64 70 6b 3d 63  JOIN tD ON dpk=c
13e0: 78 0a 20 20 20 20 20 57 48 45 52 45 20 63 70 6b  x.     WHERE cpk
13f0: 3d 62 78 20 41 4e 44 20 62 70 6b 3d 61 78 0a 20  =bx AND bpk=ax. 
1400: 20 7d 0a 7d 20 7b 74 41 20 2a 20 74 42 20 2a 20   }.} {tA * tB * 
1410: 74 43 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f 74 65  tC * tD *}.do_te
1420: 73 74 20 77 68 65 72 65 33 2d 32 2e 31 2e 31 20  st where3-2.1.1 
1430: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1440: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1450: 4d 20 74 41 2c 20 74 42 2c 20 74 43 20 4c 45 46  M tA, tB, tC LEF
1460: 54 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 63 78 3d  T JOIN tD ON cx=
1470: 64 70 6b 0a 20 20 20 20 20 57 48 45 52 45 20 63  dpk.     WHERE c
1480: 70 6b 3d 62 78 20 41 4e 44 20 62 70 6b 3d 61 78  pk=bx AND bpk=ax
1490: 0a 20 20 7d 0a 7d 20 7b 74 41 20 2a 20 74 42 20  .  }.} {tA * tB 
14a0: 2a 20 74 43 20 2a 20 74 44 20 2a 7d 0a 64 6f 5f  * tC * tD *}.do_
14b0: 74 65 73 74 20 77 68 65 72 65 33 2d 32 2e 31 2e  test where3-2.1.
14c0: 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  2 {.  queryplan 
14d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
14e0: 52 4f 4d 20 74 41 2c 20 74 42 2c 20 74 43 20 4c  ROM tA, tB, tC L
14f0: 45 46 54 20 4a 4f 49 4e 20 74 44 20 4f 4e 20 63  EFT JOIN tD ON c
1500: 78 3d 64 70 6b 0a 20 20 20 20 20 57 48 45 52 45  x=dpk.     WHERE
1510: 20 62 78 3d 63 70 6b 20 41 4e 44 20 62 70 6b 3d   bx=cpk AND bpk=
1520: 61 78 0a 20 20 7d 0a 7d 20 7b 74 41 20 2a 20 74  ax.  }.} {tA * t
1530: 42 20 2a 20 74 43 20 2a 20 74 44 20 2a 7d 0a 64  B * tC * tD *}.d
1540: 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 32 2e  o_test where3-2.
1550: 31 2e 33 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  1.3 {.  querypla
1560: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  n {.    SELECT *
1570: 20 46 52 4f 4d 20 74 41 2c 20 74 42 2c 20 74 43   FROM tA, tB, tC
1580: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 44 20 4f 4e   LEFT JOIN tD ON
1590: 20 63 78 3d 64 70 6b 0a 20 20 20 20 20 57 48 45   cx=dpk.     WHE
15a0: 52 45 20 62 78 3d 63 70 6b 20 41 4e 44 20 61 78  RE bx=cpk AND ax
15b0: 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b 74 41 20 2a  =bpk.  }.} {tA *
15c0: 20 74 42 20 2a 20 74 43 20 2a 20 74 44 20 2a 7d   tB * tC * tD *}
15d0: 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d  .do_test where3-
15e0: 32 2e 31 2e 34 20 7b 0a 20 20 71 75 65 72 79 70  2.1.4 {.  queryp
15f0: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
1600: 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42 2c 20   * FROM tA, tB, 
1610: 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74 44 20  tC LEFT JOIN tD 
1620: 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20 20 57  ON dpk=cx.     W
1630: 48 45 52 45 20 62 78 3d 63 70 6b 20 41 4e 44 20  HERE bx=cpk AND 
1640: 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b 74 41  ax=bpk.  }.} {tA
1650: 20 2a 20 74 42 20 2a 20 74 43 20 2a 20 74 44 20   * tB * tC * tD 
1660: 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  *}.do_test where
1670: 33 2d 32 2e 31 2e 35 20 7b 0a 20 20 71 75 65 72  3-2.1.5 {.  quer
1680: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1690: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
16a0: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
16b0: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
16c0: 20 57 48 45 52 45 20 63 70 6b 3d 62 78 20 41 4e   WHERE cpk=bx AN
16d0: 44 20 61 78 3d 62 70 6b 0a 20 20 7d 0a 7d 20 7b  D ax=bpk.  }.} {
16e0: 74 41 20 2a 20 74 42 20 2a 20 74 43 20 2a 20 74  tA * tB * tC * t
16f0: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
1700: 72 65 33 2d 32 2e 32 20 7b 0a 20 20 71 75 65 72  re3-2.2 {.  quer
1710: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1720: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
1730: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
1740: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
1750: 20 57 48 45 52 45 20 63 70 6b 3d 62 78 20 41 4e   WHERE cpk=bx AN
1760: 44 20 61 70 6b 3d 62 78 0a 20 20 7d 0a 7d 20 7b  D apk=bx.  }.} {
1770: 74 42 20 2a 20 74 41 20 2a 20 74 43 20 2a 20 74  tB * tA * tC * t
1780: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
1790: 72 65 33 2d 32 2e 33 20 7b 0a 20 20 71 75 65 72  re3-2.3 {.  quer
17a0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
17b0: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
17c0: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
17d0: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
17e0: 20 57 48 45 52 45 20 63 70 6b 3d 62 78 20 41 4e   WHERE cpk=bx AN
17f0: 44 20 61 70 6b 3d 62 78 0a 20 20 7d 0a 7d 20 7b  D apk=bx.  }.} {
1800: 74 42 20 2a 20 74 41 20 2a 20 74 43 20 2a 20 74  tB * tA * tC * t
1810: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
1820: 72 65 33 2d 32 2e 34 20 7b 0a 20 20 71 75 65 72  re3-2.4 {.  quer
1830: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1840: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
1850: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
1860: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
1870: 20 57 48 45 52 45 20 61 70 6b 3d 63 78 20 41 4e   WHERE apk=cx AN
1880: 44 20 62 70 6b 3d 61 78 0a 20 20 7d 0a 7d 20 7b  D bpk=ax.  }.} {
1890: 74 43 20 2a 20 74 41 20 2a 20 74 42 20 2a 20 74  tC * tA * tB * t
18a0: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
18b0: 72 65 33 2d 32 2e 35 20 7b 0a 20 20 71 75 65 72  re3-2.5 {.  quer
18c0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
18d0: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
18e0: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
18f0: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
1900: 20 57 48 45 52 45 20 63 70 6b 3d 61 78 20 41 4e   WHERE cpk=ax AN
1910: 44 20 62 70 6b 3d 63 78 0a 20 20 7d 0a 7d 20 7b  D bpk=cx.  }.} {
1920: 74 41 20 2a 20 74 43 20 2a 20 74 42 20 2a 20 74  tA * tC * tB * t
1930: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
1940: 72 65 33 2d 32 2e 36 20 7b 0a 20 20 71 75 65 72  re3-2.6 {.  quer
1950: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1960: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
1970: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
1980: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
1990: 20 57 48 45 52 45 20 62 70 6b 3d 63 78 20 41 4e   WHERE bpk=cx AN
19a0: 44 20 61 70 6b 3d 62 78 0a 20 20 7d 0a 7d 20 7b  D apk=bx.  }.} {
19b0: 74 43 20 2a 20 74 42 20 2a 20 74 41 20 2a 20 74  tC * tB * tA * t
19c0: 44 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  D *}.do_test whe
19d0: 72 65 33 2d 32 2e 37 20 7b 0a 20 20 71 75 65 72  re3-2.7 {.  quer
19e0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
19f0: 43 54 20 2a 20 46 52 4f 4d 20 74 41 2c 20 74 42  CT * FROM tA, tB
1a00: 2c 20 74 43 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , tC LEFT JOIN t
1a10: 44 20 4f 4e 20 64 70 6b 3d 63 78 0a 20 20 20 20  D ON dpk=cx.    
1a20: 20 57 48 45 52 45 20 63 70 6b 3d 62 78 20 41 4e   WHERE cpk=bx AN
1a30: 44 20 61 70 6b 3d 63 78 0a 20 20 7d 0a 7d 20 7b  D apk=cx.  }.} {
1a40: 74 42 20 2a 20 74 43 20 2a 20 74 41 20 2a 20 74  tB * tC * tA * t
1a50: 44 20 2a 7d 0a 0a 23 20 54 69 63 6b 65 74 20 5b  D *}..# Ticket [
1a60: 31 33 66 30 33 33 63 38 36 35 66 38 37 38 39 35  13f033c865f87895
1a70: 33 5d 0a 23 20 49 66 20 74 68 65 20 6f 75 74 65  3].# If the oute
1a80: 72 20 6c 6f 6f 70 20 6d 75 73 74 20 62 65 20 61  r loop must be a
1a90: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
1aa0: 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 41 4e 41  , do not let ANA
1ab0: 4c 59 5a 45 20 74 72 69 63 6b 0a 23 20 74 68 65  LYZE trick.# the
1ac0: 20 70 6c 61 6e 6e 65 72 20 69 6e 74 6f 20 75 73   planner into us
1ad0: 65 20 61 20 74 61 62 6c 65 20 66 6f 72 20 74 68  e a table for th
1ae0: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 74 68 61  e outer loop tha
1af0: 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65 78  t might be index
1b00: 61 62 6c 65 0a 23 20 69 66 20 68 65 6c 64 20 75  able.# if held u
1b10: 6e 74 69 6c 20 61 6e 20 69 6e 6e 65 72 20 6c 6f  ntil an inner lo
1b20: 6f 70 2e 0a 23 20 0a 64 6f 5f 65 78 65 63 73 71  op..# .do_execsq
1b30: 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 33 2e  l_test where3-3.
1b40: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
1b50: 4c 45 20 74 33 30 31 28 61 20 49 4e 54 45 47 45  LE t301(a INTEGE
1b60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 62 2c  R PRIMARY KEY,b,
1b70: 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  c);.  CREATE IND
1b80: 45 58 20 74 33 30 31 63 20 4f 4e 20 74 33 30 31  EX t301c ON t301
1b90: 28 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (c);.  INSERT IN
1ba0: 54 4f 20 74 33 30 31 20 56 41 4c 55 45 53 28 31  TO t301 VALUES(1
1bb0: 2c 32 2c 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  ,2,3);.  INSERT 
1bc0: 49 4e 54 4f 20 74 33 30 31 20 56 41 4c 55 45 53  INTO t301 VALUES
1bd0: 28 32 2c 32 2c 33 29 3b 0a 20 20 43 52 45 41 54  (2,2,3);.  CREAT
1be0: 45 20 54 41 42 4c 45 20 74 33 30 32 28 78 2c 20  E TABLE t302(x, 
1bf0: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
1c00: 4f 20 74 33 30 32 20 56 41 4c 55 45 53 28 34 2c  O t302 VALUES(4,
1c10: 35 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20  5);.  ANALYZE;. 
1c20: 20 65 78 70 6c 61 69 6e 20 71 75 65 72 79 20 70   explain query p
1c30: 6c 61 6e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  lan SELECT * FRO
1c40: 4d 20 74 33 30 32 2c 20 74 33 30 31 20 57 48 45  M t302, t301 WHE
1c50: 52 45 20 74 33 30 32 2e 78 3d 35 20 41 4e 44 20  RE t302.x=5 AND 
1c60: 74 33 30 31 2e 61 3d 74 33 30 32 2e 79 3b 0a 7d  t301.a=t302.y;.}
1c70: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
1c80: 20 54 41 42 4c 45 20 74 33 30 32 7d 20 0a 20 20   TABLE t302} .  
1c90: 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41  0 1 1 {SEARCH TA
1ca0: 42 4c 45 20 74 33 30 31 20 55 53 49 4e 47 20 49  BLE t301 USING I
1cb0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1cc0: 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a 7d 0a  EY (rowid=?)}.}.
1cd0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1ce0: 77 68 65 72 65 33 2d 33 2e 31 20 7b 0a 20 20 65  where3-3.1 {.  e
1cf0: 78 70 6c 61 69 6e 20 71 75 65 72 79 20 70 6c 61  xplain query pla
1d00: 6e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  n.  SELECT * FRO
1d10: 4d 20 74 33 30 31 2c 20 74 33 30 32 20 57 48 45  M t301, t302 WHE
1d20: 52 45 20 74 33 30 32 2e 78 3d 35 20 41 4e 44 20  RE t302.x=5 AND 
1d30: 74 33 30 31 2e 61 3d 74 33 30 32 2e 79 3b 0a 7d  t301.a=t302.y;.}
1d40: 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 43 41 4e   {.  0 0 1 {SCAN
1d50: 20 54 41 42 4c 45 20 74 33 30 32 7d 20 0a 20 20   TABLE t302} .  
1d60: 30 20 31 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 1 0 {SEARCH TA
1d70: 42 4c 45 20 74 33 30 31 20 55 53 49 4e 47 20 49  BLE t301 USING I
1d80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1d90: 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a 7d 0a  EY (rowid=?)}.}.
1da0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1db0: 77 68 65 72 65 33 2d 33 2e 32 20 7b 0a 20 20 53  where3-3.2 {.  S
1dc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 30  ELECT * FROM t30
1dd0: 31 20 57 48 45 52 45 20 63 3d 33 20 41 4e 44 20  1 WHERE c=3 AND 
1de0: 61 20 49 53 20 4e 55 4c 4c 3b 0a 7d 20 7b 7d 0a  a IS NULL;.} {}.
1df0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1e00: 77 68 65 72 65 33 2d 33 2e 33 20 7b 0a 20 20 53  where3-3.3 {.  S
1e10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 30  ELECT * FROM t30
1e20: 31 20 57 48 45 52 45 20 63 3d 33 20 41 4e 44 20  1 WHERE c=3 AND 
1e30: 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 7d  a IS NOT NULL;.}
1e40: 20 7b 31 20 32 20 33 20 32 20 32 20 33 7d 0a 0a   {1 2 3 2 2 3}..
1e50: 69 66 20 30 20 7b 20 20 23 20 51 75 65 72 79 20  if 0 {  # Query 
1e60: 70 6c 61 6e 6e 65 72 20 6e 6f 20 6c 6f 6e 67 65  planner no longe
1e70: 72 20 64 6f 65 73 20 74 68 69 73 0a 23 20 56 65  r does this.# Ve
1e80: 72 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 74  rify that when t
1e90: 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c  here are multipl
1ea0: 65 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  e tables in a jo
1eb0: 69 6e 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  in which must be
1ec0: 0a 23 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  .# full table sc
1ed0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 71 75 65  ans that the que
1ee0: 72 79 20 70 6c 61 6e 6e 65 72 20 61 74 74 65 6d  ry planner attem
1ef0: 70 74 73 20 70 75 74 20 74 68 65 20 74 61 62 6c  pts put the tabl
1f00: 65 20 77 69 74 68 0a 23 20 74 68 65 20 66 65 77  e with.# the few
1f10: 65 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  est number of ou
1f20: 74 70 75 74 20 72 6f 77 73 20 61 73 20 74 68 65  tput rows as the
1f30: 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 23 0a 64   outer loop..#.d
1f40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77  o_execsql_test w
1f50: 68 65 72 65 33 2d 34 2e 30 20 7b 0a 20 20 43 52  here3-4.0 {.  CR
1f60: 45 41 54 45 20 54 41 42 4c 45 20 74 34 30 30 28  EATE TABLE t400(
1f70: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
1f80: 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20  Y KEY, b, c);.  
1f90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 30  CREATE TABLE t40
1fa0: 31 28 70 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(p INTEGER PRIM
1fb0: 41 52 59 20 4b 45 59 2c 20 71 2c 20 72 29 3b 0a  ARY KEY, q, r);.
1fc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1fd0: 34 30 32 28 78 20 49 4e 54 45 47 45 52 20 50 52  402(x INTEGER PR
1fe0: 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29  IMARY KEY, y, z)
1ff0: 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ;.  EXPLAIN QUER
2000: 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20  Y PLAN.  SELECT 
2010: 2a 20 46 52 4f 4d 20 74 34 30 30 2c 20 74 34 30  * FROM t400, t40
2020: 31 2c 20 74 34 30 32 20 57 48 45 52 45 20 74 34  1, t402 WHERE t4
2030: 30 32 2e 7a 20 47 4c 4f 42 20 27 61 62 63 2a 27  02.z GLOB 'abc*'
2040: 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 32 20 7b 53  ;.} {.  0 0 2 {S
2050: 43 41 4e 20 54 41 42 4c 45 20 74 34 30 32 7d 20  CAN TABLE t402} 
2060: 0a 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20 54  .  0 1 0 {SCAN T
2070: 41 42 4c 45 20 74 34 30 30 7d 20 0a 20 20 30 20  ABLE t400} .  0 
2080: 32 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  2 1 {SCAN TABLE 
2090: 74 34 30 31 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73  t401}.}.do_execs
20a0: 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 34  ql_test where3-4
20b0: 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51  .1 {.  EXPLAIN Q
20c0: 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45  UERY PLAN.  SELE
20d0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 30 30 2c 20  CT * FROM t400, 
20e0: 74 34 30 31 2c 20 74 34 30 32 20 57 48 45 52 45  t401, t402 WHERE
20f0: 20 74 34 30 31 2e 72 20 47 4c 4f 42 20 27 61 62   t401.r GLOB 'ab
2100: 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 31  c*';.} {.  0 0 1
2110: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30   {SCAN TABLE t40
2120: 31 7d 20 0a 20 20 30 20 31 20 30 20 7b 53 43 41  1} .  0 1 0 {SCA
2130: 4e 20 54 41 42 4c 45 20 74 34 30 30 7d 20 0a 20  N TABLE t400} . 
2140: 20 30 20 32 20 32 20 7b 53 43 41 4e 20 54 41 42   0 2 2 {SCAN TAB
2150: 4c 45 20 74 34 30 32 7d 0a 7d 0a 64 6f 5f 65 78  LE t402}.}.do_ex
2160: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
2170: 33 2d 34 2e 32 20 7b 0a 20 20 45 58 50 4c 41 49  3-4.2 {.  EXPLAI
2180: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53  N QUERY PLAN.  S
2190: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 30  ELECT * FROM t40
21a0: 30 2c 20 74 34 30 31 2c 20 74 34 30 32 20 57 48  0, t401, t402 WH
21b0: 45 52 45 20 74 34 30 30 2e 63 20 47 4c 4f 42 20  ERE t400.c GLOB 
21c0: 27 61 62 63 2a 27 3b 0a 7d 20 7b 0a 20 20 30 20  'abc*';.} {.  0 
21d0: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
21e0: 74 34 30 30 7d 20 0a 20 20 30 20 31 20 31 20 7b  t400} .  0 1 1 {
21f0: 53 43 41 4e 20 54 41 42 4c 45 20 74 34 30 31 7d  SCAN TABLE t401}
2200: 20 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e 20   .  0 2 2 {SCAN 
2210: 54 41 42 4c 45 20 74 34 30 32 7d 0a 7d 0a 7d 20  TABLE t402}.}.} 
2220: 3b 23 20 65 6e 64 69 66 0a 0a 23 20 56 65 72 69  ;# endif..# Veri
2230: 66 79 20 74 68 61 74 20 61 20 70 65 72 66 6f 72  fy that a perfor
2240: 6d 61 6e 63 65 20 72 65 67 72 65 73 73 69 6f 6e  mance regression
2250: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 62 79 20   encountered by 
2260: 66 69 72 65 66 6f 78 0a 23 20 68 61 73 20 62 65  firefox.# has be
2270: 65 6e 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 65  en fixed..#.do_e
2280: 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72  xecsql_test wher
2290: 65 33 2d 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  e3-5.0 {.  CREAT
22a0: 45 20 54 41 42 4c 45 20 61 61 61 20 28 69 64 20  E TABLE aaa (id 
22b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
22c0: 4b 45 59 2c 20 74 79 70 65 20 49 4e 54 45 47 45  KEY, type INTEGE
22d0: 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
22e0: 20 20 20 20 20 20 20 66 6b 20 49 4e 54 45 47 45         fk INTEGE
22f0: 52 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c 20  R DEFAULT NULL, 
2300: 70 61 72 65 6e 74 20 49 4e 54 45 47 45 52 2c 0a  parent INTEGER,.
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 70 6f 73 69 74 69 6f 6e 20 49 4e 54      position INT
2330: 45 47 45 52 2c 20 74 69 74 6c 65 20 4c 4f 4e 47  EGER, title LONG
2340: 56 41 52 43 48 41 52 2c 0a 20 20 20 20 20 20 20  VARCHAR,.       
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
2360: 77 6f 72 64 5f 69 64 20 49 4e 54 45 47 45 52 2c  word_id INTEGER,
2370: 20 66 6f 6c 64 65 72 5f 74 79 70 65 20 54 45 58   folder_type TEX
2380: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
2390: 20 20 20 20 20 20 20 64 61 74 65 41 64 64 65 64         dateAdded
23a0: 20 49 4e 54 45 47 45 52 2c 20 6c 61 73 74 4d 6f   INTEGER, lastMo
23b0: 64 69 66 69 65 64 20 49 4e 54 45 47 45 52 29 3b  dified INTEGER);
23c0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
23d0: 61 61 61 5f 31 31 31 20 4f 4e 20 61 61 61 20 28  aaa_111 ON aaa (
23e0: 66 6b 2c 20 74 79 70 65 29 3b 0a 20 20 43 52 45  fk, type);.  CRE
23f0: 41 54 45 20 49 4e 44 45 58 20 61 61 61 5f 32 32  ATE INDEX aaa_22
2400: 32 20 4f 4e 20 61 61 61 20 28 70 61 72 65 6e 74  2 ON aaa (parent
2410: 2c 20 70 6f 73 69 74 69 6f 6e 29 3b 0a 20 20 43  , position);.  C
2420: 52 45 41 54 45 20 49 4e 44 45 58 20 61 61 61 5f  REATE INDEX aaa_
2430: 33 33 33 20 4f 4e 20 61 61 61 20 28 66 6b 2c 20  333 ON aaa (fk, 
2440: 6c 61 73 74 4d 6f 64 69 66 69 65 64 29 3b 0a 20  lastModified);. 
2450: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62   CREATE TABLE bb
2460: 62 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  b (id INTEGER PR
2470: 49 4d 41 52 59 20 4b 45 59 2c 20 74 79 70 65 20  IMARY KEY, type 
2480: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20  INTEGER,.       
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6b 20               fk 
24a0: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
24b0: 4e 55 4c 4c 2c 20 70 61 72 65 6e 74 20 49 4e 54  NULL, parent INT
24c0: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
24d0: 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 74 69            positi
24e0: 6f 6e 20 49 4e 54 45 47 45 52 2c 20 74 69 74 6c  on INTEGER, titl
24f0: 65 20 4c 4f 4e 47 56 41 52 43 48 41 52 2c 0a 20  e LONGVARCHAR,. 
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 6b 65 79 77 6f 72 64 5f 69 64 20 49 4e     keyword_id IN
2520: 54 45 47 45 52 2c 20 66 6f 6c 64 65 72 5f 74 79  TEGER, folder_ty
2530: 70 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  pe TEXT,.       
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
2550: 65 41 64 64 65 64 20 49 4e 54 45 47 45 52 2c 20  eAdded INTEGER, 
2560: 6c 61 73 74 4d 6f 64 69 66 69 65 64 20 49 4e 54  lastModified INT
2570: 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20  EGER);.  CREATE 
2580: 49 4e 44 45 58 20 62 62 62 5f 31 31 31 20 4f 4e  INDEX bbb_111 ON
2590: 20 62 62 62 20 28 66 6b 2c 20 74 79 70 65 29 3b   bbb (fk, type);
25a0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
25b0: 62 62 62 5f 32 32 32 20 4f 4e 20 62 62 62 20 28  bbb_222 ON bbb (
25c0: 70 61 72 65 6e 74 2c 20 70 6f 73 69 74 69 6f 6e  parent, position
25d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
25e0: 58 20 62 62 62 5f 33 33 33 20 4f 4e 20 62 62 62  X bbb_333 ON bbb
25f0: 20 28 66 6b 2c 20 6c 61 73 74 4d 6f 64 69 66 69   (fk, lastModifi
2600: 65 64 29 3b 0a 0a 20 20 45 58 50 4c 41 49 4e 20  ed);..  EXPLAIN 
2610: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 53 45  QUERY PLAN.   SE
2620: 4c 45 43 54 20 62 62 62 2e 74 69 74 6c 65 20 41  LECT bbb.title A
2630: 53 20 74 61 67 5f 74 69 74 6c 65 20 0a 20 20 20  S tag_title .   
2640: 20 20 46 52 4f 4d 20 61 61 61 20 4a 4f 49 4e 20    FROM aaa JOIN 
2650: 62 62 62 20 4f 4e 20 62 62 62 2e 69 64 20 3d 20  bbb ON bbb.id = 
2660: 61 61 61 2e 70 61 72 65 6e 74 20 20 0a 20 20 20  aaa.parent  .   
2670: 20 57 48 45 52 45 20 61 61 61 2e 66 6b 20 3d 20   WHERE aaa.fk = 
2680: 27 63 6f 6e 73 74 61 6e 74 27 0a 20 20 20 20 20  'constant'.     
2690: 20 41 4e 44 20 4c 45 4e 47 54 48 28 62 62 62 2e   AND LENGTH(bbb.
26a0: 74 69 74 6c 65 29 20 3e 20 30 0a 20 20 20 20 20  title) > 0.     
26b0: 20 41 4e 44 20 62 62 62 2e 70 61 72 65 6e 74 20   AND bbb.parent 
26c0: 3d 20 34 0a 20 20 20 20 4f 52 44 45 52 20 42 59  = 4.    ORDER BY
26d0: 20 62 62 62 2e 74 69 74 6c 65 20 43 4f 4c 4c 41   bbb.title COLLA
26e0: 54 45 20 4e 4f 43 41 53 45 20 41 53 43 3b 0a 7d  TE NOCASE ASC;.}
26f0: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52   {.  0 0 0 {SEAR
2700: 43 48 20 54 41 42 4c 45 20 61 61 61 20 55 53 49  CH TABLE aaa USI
2710: 4e 47 20 49 4e 44 45 58 20 61 61 61 5f 33 33 33  NG INDEX aaa_333
2720: 20 28 66 6b 3d 3f 29 7d 20 0a 20 20 30 20 31 20   (fk=?)} .  0 1 
2730: 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  1 {SEARCH TABLE 
2740: 62 62 62 20 55 53 49 4e 47 20 49 4e 54 45 47 45  bbb USING INTEGE
2750: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
2760: 6f 77 69 64 3d 3f 29 7d 20 0a 20 20 30 20 30 20  owid=?)} .  0 0 
2770: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
2780: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
2790: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
27a0: 73 74 20 77 68 65 72 65 33 2d 35 2e 31 20 7b 0a  st where3-5.1 {.
27b0: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
27c0: 50 4c 41 4e 0a 20 20 20 53 45 4c 45 43 54 20 62  PLAN.   SELECT b
27d0: 62 62 2e 74 69 74 6c 65 20 41 53 20 74 61 67 5f  bb.title AS tag_
27e0: 74 69 74 6c 65 20 0a 20 20 20 20 20 46 52 4f 4d  title .     FROM
27f0: 20 61 61 61 20 4a 4f 49 4e 20 61 61 61 20 41 53   aaa JOIN aaa AS
2800: 20 62 62 62 20 4f 4e 20 62 62 62 2e 69 64 20 3d   bbb ON bbb.id =
2810: 20 61 61 61 2e 70 61 72 65 6e 74 20 20 0a 20 20   aaa.parent  .  
2820: 20 20 57 48 45 52 45 20 61 61 61 2e 66 6b 20 3d    WHERE aaa.fk =
2830: 20 27 63 6f 6e 73 74 61 6e 74 27 0a 20 20 20 20   'constant'.    
2840: 20 20 41 4e 44 20 4c 45 4e 47 54 48 28 62 62 62    AND LENGTH(bbb
2850: 2e 74 69 74 6c 65 29 20 3e 20 30 0a 20 20 20 20  .title) > 0.    
2860: 20 20 41 4e 44 20 62 62 62 2e 70 61 72 65 6e 74    AND bbb.parent
2870: 20 3d 20 34 0a 20 20 20 20 4f 52 44 45 52 20 42   = 4.    ORDER B
2880: 59 20 62 62 62 2e 74 69 74 6c 65 20 43 4f 4c 4c  Y bbb.title COLL
2890: 41 54 45 20 4e 4f 43 41 53 45 20 41 53 43 3b 0a  ATE NOCASE ASC;.
28a0: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41  } {.  0 0 0 {SEA
28b0: 52 43 48 20 54 41 42 4c 45 20 61 61 61 20 55 53  RCH TABLE aaa US
28c0: 49 4e 47 20 49 4e 44 45 58 20 61 61 61 5f 33 33  ING INDEX aaa_33
28d0: 33 20 28 66 6b 3d 3f 29 7d 20 0a 20 20 30 20 31  3 (fk=?)} .  0 1
28e0: 20 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   1 {SEARCH TABLE
28f0: 20 61 61 61 20 41 53 20 62 62 62 20 55 53 49 4e   aaa AS bbb USIN
2900: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
2910: 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d  Y KEY (rowid=?)}
2920: 20 0a 20 20 30 20 30 20 30 20 7b 55 53 45 20 54   .  0 0 0 {USE T
2930: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
2940: 52 44 45 52 20 42 59 7d 0a 7d 0a 64 6f 5f 65 78  RDER BY}.}.do_ex
2950: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
2960: 33 2d 35 2e 32 20 7b 0a 20 20 45 58 50 4c 41 49  3-5.2 {.  EXPLAI
2970: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20  N QUERY PLAN.   
2980: 53 45 4c 45 43 54 20 62 62 62 2e 74 69 74 6c 65  SELECT bbb.title
2990: 20 41 53 20 74 61 67 5f 74 69 74 6c 65 20 0a 20   AS tag_title . 
29a0: 20 20 20 20 46 52 4f 4d 20 62 62 62 20 4a 4f 49      FROM bbb JOI
29b0: 4e 20 61 61 61 20 4f 4e 20 62 62 62 2e 69 64 20  N aaa ON bbb.id 
29c0: 3d 20 61 61 61 2e 70 61 72 65 6e 74 20 20 0a 20  = aaa.parent  . 
29d0: 20 20 20 57 48 45 52 45 20 61 61 61 2e 66 6b 20     WHERE aaa.fk 
29e0: 3d 20 27 63 6f 6e 73 74 61 6e 74 27 0a 20 20 20  = 'constant'.   
29f0: 20 20 20 41 4e 44 20 4c 45 4e 47 54 48 28 62 62     AND LENGTH(bb
2a00: 62 2e 74 69 74 6c 65 29 20 3e 20 30 0a 20 20 20  b.title) > 0.   
2a10: 20 20 20 41 4e 44 20 62 62 62 2e 70 61 72 65 6e     AND bbb.paren
2a20: 74 20 3d 20 34 0a 20 20 20 20 4f 52 44 45 52 20  t = 4.    ORDER 
2a30: 42 59 20 62 62 62 2e 74 69 74 6c 65 20 43 4f 4c  BY bbb.title COL
2a40: 4c 41 54 45 20 4e 4f 43 41 53 45 20 41 53 43 3b  LATE NOCASE ASC;
2a50: 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 45  .} {.  0 0 1 {SE
2a60: 41 52 43 48 20 54 41 42 4c 45 20 61 61 61 20 55  ARCH TABLE aaa U
2a70: 53 49 4e 47 20 49 4e 44 45 58 20 61 61 61 5f 33  SING INDEX aaa_3
2a80: 33 33 20 28 66 6b 3d 3f 29 7d 20 0a 20 20 30 20  33 (fk=?)} .  0 
2a90: 31 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  1 0 {SEARCH TABL
2aa0: 45 20 62 62 62 20 55 53 49 4e 47 20 49 4e 54 45  E bbb USING INTE
2ab0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
2ac0: 28 72 6f 77 69 64 3d 3f 29 7d 20 0a 20 20 30 20  (rowid=?)} .  0 
2ad0: 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d  0 0 {USE TEMP B-
2ae0: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
2af0: 59 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  Y}.}.do_execsql_
2b00: 74 65 73 74 20 77 68 65 72 65 33 2d 35 2e 33 20  test where3-5.3 
2b10: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
2b20: 59 20 50 4c 41 4e 0a 20 20 20 53 45 4c 45 43 54  Y PLAN.   SELECT
2b30: 20 62 62 62 2e 74 69 74 6c 65 20 41 53 20 74 61   bbb.title AS ta
2b40: 67 5f 74 69 74 6c 65 20 0a 20 20 20 20 20 46 52  g_title .     FR
2b50: 4f 4d 20 61 61 61 20 41 53 20 62 62 62 20 4a 4f  OM aaa AS bbb JO
2b60: 49 4e 20 61 61 61 20 4f 4e 20 62 62 62 2e 69 64  IN aaa ON bbb.id
2b70: 20 3d 20 61 61 61 2e 70 61 72 65 6e 74 20 20 0a   = aaa.parent  .
2b80: 20 20 20 20 57 48 45 52 45 20 61 61 61 2e 66 6b      WHERE aaa.fk
2b90: 20 3d 20 27 63 6f 6e 73 74 61 6e 74 27 0a 20 20   = 'constant'.  
2ba0: 20 20 20 20 41 4e 44 20 4c 45 4e 47 54 48 28 62      AND LENGTH(b
2bb0: 62 62 2e 74 69 74 6c 65 29 20 3e 20 30 0a 20 20  bb.title) > 0.  
2bc0: 20 20 20 20 41 4e 44 20 62 62 62 2e 70 61 72 65      AND bbb.pare
2bd0: 6e 74 20 3d 20 34 0a 20 20 20 20 4f 52 44 45 52  nt = 4.    ORDER
2be0: 20 42 59 20 62 62 62 2e 74 69 74 6c 65 20 43 4f   BY bbb.title CO
2bf0: 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20 41 53 43  LLATE NOCASE ASC
2c00: 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53  ;.} {.  0 0 1 {S
2c10: 45 41 52 43 48 20 54 41 42 4c 45 20 61 61 61 20  EARCH TABLE aaa 
2c20: 55 53 49 4e 47 20 49 4e 44 45 58 20 61 61 61 5f  USING INDEX aaa_
2c30: 33 33 33 20 28 66 6b 3d 3f 29 7d 20 0a 20 20 30  333 (fk=?)} .  0
2c40: 20 31 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   1 0 {SEARCH TAB
2c50: 4c 45 20 61 61 61 20 41 53 20 62 62 62 20 55 53  LE aaa AS bbb US
2c60: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
2c70: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
2c80: 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 55 53 45  )} .  0 0 0 {USE
2c90: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
2ca0: 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 0a 23 20   ORDER BY}.}..# 
2cb0: 4e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  Name resolution 
2cc0: 77 69 74 68 20 4e 41 54 55 52 41 4c 20 4a 4f 49  with NATURAL JOI
2cd0: 4e 20 61 6e 64 20 55 53 49 4e 47 0a 23 0a 64 6f  N and USING.#.do
2ce0: 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e 73  _test where3-6.s
2cf0: 65 74 75 70 20 7b 0a 20 20 64 62 20 65 76 61 6c  etup {.  db eval
2d00: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
2d10: 42 4c 45 20 74 36 77 28 61 2c 20 77 29 3b 0a 20  BLE t6w(a, w);. 
2d20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2d30: 36 77 20 56 41 4c 55 45 53 28 31 2c 20 27 77 2d  6w VALUES(1, 'w-
2d40: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
2d50: 54 20 49 4e 54 4f 20 74 36 77 20 56 41 4c 55 45  T INTO t6w VALUE
2d60: 53 28 32 2c 20 27 77 2d 74 77 6f 27 29 3b 0a 20  S(2, 'w-two');. 
2d70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2d80: 36 77 20 56 41 4c 55 45 53 28 39 2c 20 27 77 2d  6w VALUES(9, 'w-
2d90: 6e 69 6e 65 27 29 3b 0a 20 20 20 20 43 52 45 41  nine');.    CREA
2da0: 54 45 20 54 41 42 4c 45 20 74 36 78 28 61 2c 20  TE TABLE t6x(a, 
2db0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
2dc0: 4e 54 4f 20 74 36 78 20 56 41 4c 55 45 53 28 31  NTO t6x VALUES(1
2dd0: 2c 20 27 78 2d 6f 6e 65 27 29 3b 0a 20 20 20 20  , 'x-one');.    
2de0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 78 20  INSERT INTO t6x 
2df0: 56 41 4c 55 45 53 28 33 2c 20 27 78 2d 74 68 72  VALUES(3, 'x-thr
2e00: 65 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ee');.    INSERT
2e10: 20 49 4e 54 4f 20 74 36 78 20 56 41 4c 55 45 53   INTO t6x VALUES
2e20: 28 39 2c 20 27 78 2d 6e 69 6e 65 27 29 3b 0a 20  (9, 'x-nine');. 
2e30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2e40: 74 36 79 28 61 2c 20 79 29 3b 0a 20 20 20 20 49  t6y(a, y);.    I
2e50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 79 20 56  NSERT INTO t6y V
2e60: 41 4c 55 45 53 28 31 2c 20 27 79 2d 6f 6e 65 27  ALUES(1, 'y-one'
2e70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2e80: 54 4f 20 74 36 79 20 56 41 4c 55 45 53 28 34 2c  TO t6y VALUES(4,
2e90: 20 27 79 2d 66 6f 75 72 27 29 3b 0a 20 20 20 20   'y-four');.    
2ea0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 79 20  INSERT INTO t6y 
2eb0: 56 41 4c 55 45 53 28 39 2c 20 27 79 2d 6e 69 6e  VALUES(9, 'y-nin
2ec0: 65 27 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  e');.    CREATE 
2ed0: 54 41 42 4c 45 20 74 36 7a 28 61 2c 20 7a 29 3b  TABLE t6z(a, z);
2ee0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2ef0: 20 74 36 7a 20 56 41 4c 55 45 53 28 31 2c 20 27   t6z VALUES(1, '
2f00: 7a 2d 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53  z-one');.    INS
2f10: 45 52 54 20 49 4e 54 4f 20 74 36 7a 20 56 41 4c  ERT INTO t6z VAL
2f20: 55 45 53 28 35 2c 20 27 7a 2d 66 69 76 65 27 29  UES(5, 'z-five')
2f30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2f40: 4f 20 74 36 7a 20 56 41 4c 55 45 53 28 39 2c 20  O t6z VALUES(9, 
2f50: 27 7a 2d 6e 69 6e 65 27 29 3b 0a 20 20 7d 0a 7d  'z-nine');.  }.}
2f60: 20 7b 7d 0a 73 65 74 20 63 6e 74 20 30 0a 66 6f   {}.set cnt 0.fo
2f70: 72 65 61 63 68 20 70 72 65 64 69 63 61 74 65 20  reach predicate 
2f80: 7b 0a 20 20 20 7b 7d 0a 20 20 20 7b 4f 52 44 45  {.   {}.   {ORDE
2f90: 52 20 42 59 20 61 7d 0a 20 20 20 7b 4f 52 44 45  R BY a}.   {ORDE
2fa0: 52 20 42 59 20 74 36 77 2e 61 7d 0a 20 20 20 7b  R BY t6w.a}.   {
2fb0: 57 48 45 52 45 20 61 3e 30 7d 0a 20 20 20 7b 57  WHERE a>0}.   {W
2fc0: 48 45 52 45 20 74 36 79 2e 61 3e 30 7d 0a 20 20  HERE t6y.a>0}.  
2fd0: 20 7b 57 48 45 52 45 20 61 3e 30 20 4f 52 44 45   {WHERE a>0 ORDE
2fe0: 52 20 42 59 20 61 7d 0a 7d 20 7b 0a 20 20 69 6e  R BY a}.} {.  in
2ff0: 63 72 20 63 6e 74 0a 20 20 64 6f 5f 74 65 73 74  cr cnt.  do_test
3000: 20 77 68 65 72 65 33 2d 36 2e 24 63 6e 74 2e 31   where3-6.$cnt.1
3010: 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22   {.    set sql "
3020: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
3030: 77 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74  w NATURAL JOIN t
3040: 36 78 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  6x NATURAL JOIN 
3050: 74 36 79 22 0a 20 20 20 20 61 70 70 65 6e 64 20  t6y".    append 
3060: 73 71 6c 20 22 20 4e 41 54 55 52 41 4c 20 4a 4f  sql " NATURAL JO
3070: 49 4e 20 74 36 7a 20 22 0a 20 20 20 20 61 70 70  IN t6z ".    app
3080: 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64 69  end sql $::predi
3090: 63 61 74 65 0a 20 20 20 20 64 62 20 65 76 61 6c  cate.    db eval
30a0: 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f   $sql.  } {1 w-o
30b0: 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a  ne x-one y-one z
30c0: 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d  -one 9 w-nine x-
30d0: 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69  nine y-nine z-ni
30e0: 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68  ne}.  do_test wh
30f0: 65 72 65 33 2d 36 2e 24 63 6e 74 2e 32 20 7b 0a  ere3-6.$cnt.2 {.
3100: 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c      set sql "SEL
3110: 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4a  ECT * FROM t6w J
3120: 4f 49 4e 20 74 36 78 20 55 53 49 4e 47 28 61 29  OIN t6x USING(a)
3130: 20 4a 4f 49 4e 20 74 36 79 20 55 53 49 4e 47 28   JOIN t6y USING(
3140: 61 29 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73  a)".    append s
3150: 71 6c 20 22 20 4a 4f 49 4e 20 74 36 7a 20 55 53  ql " JOIN t6z US
3160: 49 4e 47 28 61 29 20 22 0a 20 20 20 20 61 70 70  ING(a) ".    app
3170: 65 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64 69  end sql $::predi
3180: 63 61 74 65 0a 20 20 20 20 64 62 20 65 76 61 6c  cate.    db eval
3190: 20 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f   $sql.  } {1 w-o
31a0: 6e 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a  ne x-one y-one z
31b0: 2d 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d  -one 9 w-nine x-
31c0: 6e 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69  nine y-nine z-ni
31d0: 6e 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68  ne}.  do_test wh
31e0: 65 72 65 33 2d 36 2e 24 63 6e 74 2e 33 20 7b 0a  ere3-6.$cnt.3 {.
31f0: 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c      set sql "SEL
3200: 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4e  ECT * FROM t6w N
3210: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 78 20  ATURAL JOIN t6x 
3220: 4a 4f 49 4e 20 74 36 79 20 55 53 49 4e 47 28 61  JOIN t6y USING(a
3230: 29 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71  )".    append sq
3240: 6c 20 22 20 4a 4f 49 4e 20 74 36 7a 20 55 53 49  l " JOIN t6z USI
3250: 4e 47 28 61 29 20 22 0a 20 20 20 20 61 70 70 65  NG(a) ".    appe
3260: 6e 64 20 73 71 6c 20 24 3a 3a 70 72 65 64 69 63  nd sql $::predic
3270: 61 74 65 0a 20 20 20 20 64 62 20 65 76 61 6c 20  ate.    db eval 
3280: 24 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e  $sql.  } {1 w-on
3290: 65 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d  e x-one y-one z-
32a0: 6f 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e  one 9 w-nine x-n
32b0: 69 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e  ine y-nine z-nin
32c0: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65  e}.  do_test whe
32d0: 72 65 33 2d 36 2e 24 63 6e 74 2e 34 20 7b 0a 20  re3-6.$cnt.4 {. 
32e0: 20 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45     set sql "SELE
32f0: 43 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4a 4f  CT * FROM t6w JO
3300: 49 4e 20 74 36 78 20 55 53 49 4e 47 28 61 29 20  IN t6x USING(a) 
3310: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 79  NATURAL JOIN t6y
3320: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
3330: 20 22 20 4a 4f 49 4e 20 74 36 7a 20 55 53 49 4e   " JOIN t6z USIN
3340: 47 28 61 29 20 22 0a 20 20 20 20 61 70 70 65 6e  G(a) ".    appen
3350: 64 20 73 71 6c 20 24 3a 3a 70 72 65 64 69 63 61  d sql $::predica
3360: 74 65 0a 20 20 20 20 64 62 20 65 76 61 6c 20 24  te.    db eval $
3370: 73 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65  sql.  } {1 w-one
3380: 20 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f   x-one y-one z-o
3390: 6e 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69  ne 9 w-nine x-ni
33a0: 6e 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65  ne y-nine z-nine
33b0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  }.  do_test wher
33c0: 65 33 2d 36 2e 24 63 6e 74 2e 35 20 7b 0a 20 20  e3-6.$cnt.5 {.  
33d0: 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43    set sql "SELEC
33e0: 54 20 2a 20 46 52 4f 4d 20 74 36 77 20 4a 4f 49  T * FROM t6w JOI
33f0: 4e 20 74 36 78 20 55 53 49 4e 47 28 61 29 20 4a  N t6x USING(a) J
3400: 4f 49 4e 20 74 36 79 20 55 53 49 4e 47 28 61 29  OIN t6y USING(a)
3410: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
3420: 20 22 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20   " NATURAL JOIN 
3430: 74 36 7a 20 22 0a 20 20 20 20 61 70 70 65 6e 64  t6z ".    append
3440: 20 73 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74   sql $::predicat
3450: 65 0a 20 20 20 20 64 62 20 65 76 61 6c 20 24 73  e.    db eval $s
3460: 71 6c 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20  ql.  } {1 w-one 
3470: 78 2d 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e  x-one y-one z-on
3480: 65 20 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e  e 9 w-nine x-nin
3490: 65 20 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d  e y-nine z-nine}
34a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
34b0: 33 2d 36 2e 24 63 6e 74 2e 36 20 7b 0a 20 20 20  3-6.$cnt.6 {.   
34c0: 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54   set sql "SELECT
34d0: 20 2a 20 46 52 4f 4d 20 74 36 77 20 4a 4f 49 4e   * FROM t6w JOIN
34e0: 20 74 36 78 20 55 53 49 4e 47 28 61 29 20 4e 41   t6x USING(a) NA
34f0: 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 79 22 0a  TURAL JOIN t6y".
3500: 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22      append sql "
3510: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36   NATURAL JOIN t6
3520: 7a 20 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73  z ".    append s
3530: 71 6c 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a  ql $::predicate.
3540: 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c      db eval $sql
3550: 0a 20 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d  .  } {1 w-one x-
3560: 6f 6e 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20  one y-one z-one 
3570: 39 20 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20  9 w-nine x-nine 
3580: 79 2d 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20  y-nine z-nine}. 
3590: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d   do_test where3-
35a0: 36 2e 24 63 6e 74 2e 37 20 7b 0a 20 20 20 20 73  6.$cnt.7 {.    s
35b0: 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a  et sql "SELECT *
35c0: 20 46 52 4f 4d 20 74 36 77 20 4e 41 54 55 52 41   FROM t6w NATURA
35d0: 4c 20 4a 4f 49 4e 20 74 36 78 20 4a 4f 49 4e 20  L JOIN t6x JOIN 
35e0: 74 36 79 20 55 53 49 4e 47 28 61 29 22 0a 20 20  t6y USING(a)".  
35f0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4e    append sql " N
3600: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 36 7a 20  ATURAL JOIN t6z 
3610: 22 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c  ".    append sql
3620: 20 24 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20   $::predicate.  
3630: 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20    db eval $sql. 
3640: 20 7d 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e   } {1 w-one x-on
3650: 65 20 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20  e y-one z-one 9 
3660: 77 2d 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d  w-nine x-nine y-
3670: 6e 69 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 20 20 64  nine z-nine}.  d
3680: 6f 5f 74 65 73 74 20 77 68 65 72 65 33 2d 36 2e  o_test where3-6.
3690: 24 63 6e 74 2e 38 20 7b 0a 20 20 20 20 73 65 74  $cnt.8 {.    set
36a0: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46   sql "SELECT * F
36b0: 52 4f 4d 20 74 36 77 20 4e 41 54 55 52 41 4c 20  ROM t6w NATURAL 
36c0: 4a 4f 49 4e 20 74 36 78 20 4e 41 54 55 52 41 4c  JOIN t6x NATURAL
36d0: 20 4a 4f 49 4e 20 74 36 79 22 0a 20 20 20 20 61   JOIN t6y".    a
36e0: 70 70 65 6e 64 20 73 71 6c 20 22 20 4a 4f 49 4e  ppend sql " JOIN
36f0: 20 74 36 7a 20 55 53 49 4e 47 28 61 29 20 22 0a   t6z USING(a) ".
3700: 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 24      append sql $
3710: 3a 3a 70 72 65 64 69 63 61 74 65 0a 20 20 20 20  ::predicate.    
3720: 64 62 20 65 76 61 6c 20 24 73 71 6c 0a 20 20 7d  db eval $sql.  }
3730: 20 7b 31 20 77 2d 6f 6e 65 20 78 2d 6f 6e 65 20   {1 w-one x-one 
3740: 79 2d 6f 6e 65 20 7a 2d 6f 6e 65 20 39 20 77 2d  y-one z-one 9 w-
3750: 6e 69 6e 65 20 78 2d 6e 69 6e 65 20 79 2d 6e 69  nine x-nine y-ni
3760: 6e 65 20 7a 2d 6e 69 6e 65 7d 0a 7d 0a 0a 64 6f  ne z-nine}.}..do
3770: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
3780: 65 72 65 33 2d 37 2d 73 65 74 75 70 20 7b 0a 20  ere3-7-setup {. 
3790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
37a0: 31 28 78 31 20 49 4e 54 45 47 45 52 20 50 52 49  1(x1 INTEGER PRI
37b0: 4d 41 52 59 20 4b 45 59 2c 20 79 31 29 3b 0a 20  MARY KEY, y1);. 
37c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
37d0: 32 28 78 32 20 49 4e 54 45 47 45 52 20 50 52 49  2(x2 INTEGER PRI
37e0: 4d 41 52 59 20 4b 45 59 2c 20 79 32 29 3b 0a 20  MARY KEY, y2);. 
37f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
3800: 33 28 78 33 2c 20 79 33 29 3b 0a 20 20 43 52 45  3(x3, y3);.  CRE
3810: 41 54 45 20 54 41 42 4c 45 20 74 37 34 28 78 34  ATE TABLE t74(x4
3820: 2c 20 79 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  , y4);.  INSERT 
3830: 49 4e 54 4f 20 74 37 31 20 56 41 4c 55 45 53 28  INTO t71 VALUES(
3840: 31 32 33 2c 32 33 34 29 3b 0a 20 20 49 4e 53 45  123,234);.  INSE
3850: 52 54 20 49 4e 54 4f 20 74 37 32 20 56 41 4c 55  RT INTO t72 VALU
3860: 45 53 28 32 33 34 2c 33 34 35 29 3b 0a 20 20 49  ES(234,345);.  I
3870: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 33 20 56  NSERT INTO t73 V
3880: 41 4c 55 45 53 28 31 32 33 2c 32 33 34 29 3b 0a  ALUES(123,234);.
3890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
38a0: 34 20 56 41 4c 55 45 53 28 32 33 34 2c 33 34 35  4 VALUES(234,345
38b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
38c0: 20 74 37 34 20 56 41 4c 55 45 53 28 32 33 34 2c   t74 VALUES(234,
38d0: 36 37 38 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 65 61  678);.} {}.forea
38e0: 63 68 20 64 69 73 61 62 6c 65 64 5f 6f 70 74 20  ch disabled_opt 
38f0: 7b 6e 6f 6e 65 20 6f 6d 69 74 2d 6e 6f 6f 70 2d  {none omit-noop-
3900: 6a 6f 69 6e 20 61 6c 6c 7d 20 7b 0a 20 20 6f 70  join all} {.  op
3910: 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
3920: 6f 6c 20 64 62 20 61 6c 6c 20 31 0a 20 20 6f 70  ol db all 1.  op
3930: 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
3940: 6f 6c 20 64 62 20 24 64 69 73 61 62 6c 65 64 5f  ol db $disabled_
3950: 6f 70 74 20 30 0a 20 20 64 6f 5f 65 78 65 63 73  opt 0.  do_execs
3960: 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33 2d 37  ql_test where3-7
3970: 2e 24 64 69 73 61 62 6c 65 64 5f 6f 70 74 2e 31  .$disabled_opt.1
3980: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 31   {.    SELECT x1
3990: 20 46 52 4f 4d 20 74 37 31 20 4c 45 46 54 20 4a   FROM t71 LEFT J
39a0: 4f 49 4e 20 74 37 32 20 4f 4e 20 78 32 3d 79 31  OIN t72 ON x2=y1
39b0: 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f  ;.  } {123}.  do
39c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
39d0: 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64  ere3-7.$disabled
39e0: 5f 6f 70 74 2e 32 20 7b 0a 20 20 20 20 53 45 4c  _opt.2 {.    SEL
39f0: 45 43 54 20 78 31 20 46 52 4f 4d 20 74 37 31 20  ECT x1 FROM t71 
3a00: 4c 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e  LEFT JOIN t72 ON
3a10: 20 78 32 3d 79 31 20 57 48 45 52 45 20 79 32 20   x2=y1 WHERE y2 
3a20: 49 53 20 4e 55 4c 4c 3b 0a 20 20 7d 20 7b 7d 0a  IS NULL;.  } {}.
3a30: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
3a40: 74 20 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61  t where3-7.$disa
3a50: 62 6c 65 64 5f 6f 70 74 2e 33 20 7b 0a 20 20 20  bled_opt.3 {.   
3a60: 20 53 45 4c 45 43 54 20 78 31 20 46 52 4f 4d 20   SELECT x1 FROM 
3a70: 74 37 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37  t71 LEFT JOIN t7
3a80: 32 20 4f 4e 20 78 32 3d 79 31 20 57 48 45 52 45  2 ON x2=y1 WHERE
3a90: 20 79 32 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b   y2 IS NOT NULL;
3aa0: 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f  .  } {123}.  do_
3ab0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65  execsql_test whe
3ac0: 72 65 33 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f  re3-7.$disabled_
3ad0: 6f 70 74 2e 34 20 7b 0a 20 20 20 20 53 45 4c 45  opt.4 {.    SELE
3ae0: 43 54 20 78 31 20 46 52 4f 4d 20 74 37 31 20 4c  CT x1 FROM t71 L
3af0: 45 46 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e 20  EFT JOIN t72 ON 
3b00: 78 32 3d 79 31 20 41 4e 44 20 79 32 20 49 53 20  x2=y1 AND y2 IS 
3b10: 4e 55 4c 4c 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a  NULL;.  } {123}.
3b20: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
3b30: 74 20 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61  t where3-7.$disa
3b40: 62 6c 65 64 5f 6f 70 74 2e 35 20 7b 0a 20 20 20  bled_opt.5 {.   
3b50: 20 53 45 4c 45 43 54 20 78 31 20 46 52 4f 4d 20   SELECT x1 FROM 
3b60: 74 37 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37  t71 LEFT JOIN t7
3b70: 32 20 4f 4e 20 78 32 3d 79 31 20 41 4e 44 20 79  2 ON x2=y1 AND y
3b80: 32 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20  2 IS NOT NULL;. 
3b90: 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 65 78   } {123}.  do_ex
3ba0: 65 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65  ecsql_test where
3bb0: 33 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f 70  3-7.$disabled_op
3bc0: 74 2e 36 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  t.6 {.    SELECT
3bd0: 20 78 33 20 46 52 4f 4d 20 74 37 33 20 4c 45 46   x3 FROM t73 LEF
3be0: 54 20 4a 4f 49 4e 20 74 37 32 20 4f 4e 20 78 32  T JOIN t72 ON x2
3bf0: 3d 79 33 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20  =y3;.  } {123}. 
3c00: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
3c10: 20 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61 62   where3-7.$disab
3c20: 6c 65 64 5f 6f 70 74 2e 37 20 7b 0a 20 20 20 20  led_opt.7 {.    
3c30: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
3c40: 78 33 20 46 52 4f 4d 20 74 37 33 20 4c 45 46 54  x3 FROM t73 LEFT
3c50: 20 4a 4f 49 4e 20 74 37 32 20 4f 4e 20 78 32 3d   JOIN t72 ON x2=
3c60: 79 33 3b 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20  y3;.  } {123}.  
3c70: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3c80: 77 68 65 72 65 33 2d 37 2e 24 64 69 73 61 62 6c  where3-7.$disabl
3c90: 65 64 5f 6f 70 74 2e 38 20 7b 0a 20 20 20 20 53  ed_opt.8 {.    S
3ca0: 45 4c 45 43 54 20 78 33 20 46 52 4f 4d 20 74 37  ELECT x3 FROM t7
3cb0: 33 20 4c 45 46 54 20 4a 4f 49 4e 20 74 37 34 20  3 LEFT JOIN t74 
3cc0: 4f 4e 20 78 34 3d 79 33 3b 0a 20 20 7d 20 7b 31  ON x4=y3;.  } {1
3cd0: 32 33 20 31 32 33 7d 0a 20 20 64 6f 5f 65 78 65  23 123}.  do_exe
3ce0: 63 73 71 6c 5f 74 65 73 74 20 77 68 65 72 65 33  csql_test where3
3cf0: 2d 37 2e 24 64 69 73 61 62 6c 65 64 5f 6f 70 74  -7.$disabled_opt
3d00: 2e 39 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .9 {.    SELECT 
3d10: 44 49 53 54 49 4e 43 54 20 78 33 20 46 52 4f 4d  DISTINCT x3 FROM
3d20: 20 74 37 33 20 4c 45 46 54 20 4a 4f 49 4e 20 74   t73 LEFT JOIN t
3d30: 37 34 20 4f 4e 20 78 34 3d 79 33 3b 0a 20 20 7d  74 ON x4=y3;.  }
3d40: 20 7b 31 32 33 7d 0a 7d 0a 0a 0a 66 69 6e 69 73   {123}.}...finis
3d50: 68 5f 74 65 73 74 0a                             h_test.