/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact f9d4a28dec81c6e9dc21b73518e024d73b5ebf57:


0000: 23 20 32 30 30 32 20 4d 61 79 20 32 34 0a 23 0a  # 2002 May 24.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a  SQLite library..
01a0: 23 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69 6d  #.# This file im
01b0: 70 6c 65 6d 65 6e 74 73 20 74 65 73 74 73 20 66  plements tests f
01c0: 6f 72 20 6a 6f 69 6e 73 2c 20 69 6e 63 6c 75 64  or joins, includ
01d0: 69 6e 67 20 6f 75 74 65 72 20 6a 6f 69 6e 73 2e  ing outer joins.
01e0: 0a 23 0a 23 20 24 49 64 3a 20 6a 6f 69 6e 2e 74  .#.# $Id: join.t
01f0: 65 73 74 2c 76 20 31 2e 32 37 20 32 30 30 39 2f  est,v 1.27 2009/
0200: 30 37 2f 30 31 20 31 36 3a 31 32 3a 30 38 20 64  07/01 16:12:08 d
0210: 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24  anielk1977 Exp $
0220: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0230: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0240: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0250: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0260: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 31  do_test join-1.1
0270: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0280: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0290: 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49  t1(a,b,c);.    I
02a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
02b0: 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20  LUES(1,2,3);.   
02c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
02d0: 56 41 4c 55 45 53 28 32 2c 33 2c 34 29 3b 0a 20  VALUES(2,3,4);. 
02e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
02f0: 31 20 56 41 4c 55 45 53 28 33 2c 34 2c 35 29 3b  1 VALUES(3,4,5);
0300: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0310: 4f 4d 20 74 31 3b 0a 20 20 7d 20 20 0a 7d 20 7b  OM t1;.  }  .} {
0320: 31 20 32 20 33 20 32 20 33 20 34 20 33 20 34 20  1 2 3 2 3 4 3 4 
0330: 35 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  5}.do_test join-
0340: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
0350: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0360: 4c 45 20 74 32 28 62 2c 63 2c 64 29 3b 0a 20 20  LE t2(b,c,d);.  
0370: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0380: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a   VALUES(1,2,3);.
0390: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
03a0: 74 32 20 56 41 4c 55 45 53 28 32 2c 33 2c 34 29  t2 VALUES(2,3,4)
03b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
03c0: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 34 2c  O t2 VALUES(3,4,
03d0: 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  5);.    SELECT *
03e0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 20 0a   FROM t2;.  }  .
03f0: 7d 20 7b 31 20 32 20 33 20 32 20 33 20 34 20 33  } {1 2 3 2 3 4 3
0400: 20 34 20 35 7d 0a 0a 23 20 41 20 46 52 4f 4d 20   4 5}..# A FROM 
0410: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
0420: 72 6d 3a 20 20 22 3c 74 61 62 6c 65 3e 2c 20 3c  rm:  "<table>, <
0430: 74 61 62 6c 65 3e 20 4f 4e 20 3c 65 78 70 72 3e  table> ON <expr>
0440: 22 20 69 73 20 6e 6f 74 0a 23 20 61 6c 6c 6f 77  " is not.# allow
0450: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
0460: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 2c   syntax diagram,
0470: 20 6e 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65   nor by any othe
0480: 72 20 53 51 4c 20 64 61 74 61 62 61 73 65 0a 23  r SQL database.#
0490: 20 65 6e 67 69 6e 65 20 74 68 61 74 20 77 65 20   engine that we 
04a0: 61 72 65 20 61 77 61 72 65 20 6f 66 2e 20 20 4e  are aware of.  N
04b0: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 68 69 73  evertheless, his
04c0: 74 6f 72 69 63 20 76 65 72 73 69 6f 6e 73 20 6f  toric versions o
04d0: 66 0a 23 20 53 51 4c 69 74 65 20 68 61 76 65 20  f.# SQLite have 
04e0: 61 6c 6c 6f 77 65 64 20 69 74 2e 20 20 57 65 20  allowed it.  We 
04f0: 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65  need to continue
0500: 20 74 6f 20 73 75 70 70 6f 72 74 20 69 74 20 6d   to support it m
0510: 6f 76 69 6e 67 0a 23 20 66 6f 72 77 61 72 64 20  oving.# forward 
0520: 74 6f 20 70 72 65 76 65 6e 74 20 62 72 65 61 6b  to prevent break
0530: 61 67 65 20 6f 66 20 6c 65 67 61 63 79 20 61 70  age of legacy ap
0540: 70 6c 69 63 61 74 69 6f 6e 73 2e 20 20 54 68 6f  plications.  Tho
0550: 75 67 68 2c 20 77 65 20 77 69 6c 6c 0a 23 20 6e  ugh, we will.# n
0560: 6f 74 20 61 64 76 65 72 74 69 73 65 20 69 74 20  ot advertise it 
0570: 61 73 20 62 65 69 6e 67 20 73 75 70 70 6f 72 74  as being support
0580: 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed..#.do_execsql
0590: 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 32 2e 31  _test join-1.2.1
05a0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 31 2e 72   {.  SELECT t1.r
05b0: 6f 77 69 64 2c 20 74 32 2e 72 6f 77 69 64 2c 20  owid, t2.rowid, 
05c0: 27 7c 27 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  '|' FROM t1, t2 
05d0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 3b 0a 7d 20  ON t1.a=t2.b;.} 
05e0: 7b 31 20 31 20 7c 20 32 20 32 20 7c 20 33 20 33  {1 1 | 2 2 | 3 3
05f0: 20 7c 7d 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69   |}..do_test joi
0600: 6e 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  n-1.3 {.  execsq
0610: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
0620: 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41  * FROM t1 NATURA
0630: 4c 20 4a 4f 49 4e 20 74 32 3b 0a 20 20 7d 0a 7d  L JOIN t2;.  }.}
0640: 20 7b 61 20 31 20 62 20 32 20 63 20 33 20 64 20   {a 1 b 2 c 3 d 
0650: 34 20 61 20 32 20 62 20 33 20 63 20 34 20 64 20  4 a 2 b 3 c 4 d 
0660: 35 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  5}.do_test join-
0670: 31 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1.3.1 {.  execsq
0680: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
0690: 2a 20 46 52 4f 4d 20 74 32 20 4e 41 54 55 52 41  * FROM t2 NATURA
06a0: 4c 20 4a 4f 49 4e 20 74 31 3b 0a 20 20 7d 0a 7d  L JOIN t1;.  }.}
06b0: 20 7b 62 20 32 20 63 20 33 20 64 20 34 20 61 20   {b 2 c 3 d 4 a 
06c0: 31 20 62 20 33 20 63 20 34 20 64 20 35 20 61 20  1 b 3 c 4 d 5 a 
06d0: 32 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  2}.do_test join-
06e0: 31 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1.3.2 {.  execsq
06f0: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
0700: 2a 20 46 52 4f 4d 20 74 32 20 41 53 20 78 20 4e  * FROM t2 AS x N
0710: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31 3b 0a  ATURAL JOIN t1;.
0720: 20 20 7d 0a 7d 20 7b 62 20 32 20 63 20 33 20 64    }.} {b 2 c 3 d
0730: 20 34 20 61 20 31 20 62 20 33 20 63 20 34 20 64   4 a 1 b 3 c 4 d
0740: 20 35 20 61 20 32 7d 0a 64 6f 5f 74 65 73 74 20   5 a 2}.do_test 
0750: 6a 6f 69 6e 2d 31 2e 33 2e 33 20 7b 0a 20 20 65  join-1.3.3 {.  e
0760: 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45  xecsql2 {.    SE
0770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4e  LECT * FROM t2 N
0780: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31 20 41  ATURAL JOIN t1 A
0790: 53 20 79 3b 0a 20 20 7d 0a 7d 20 7b 62 20 32 20  S y;.  }.} {b 2 
07a0: 63 20 33 20 64 20 34 20 61 20 31 20 62 20 33 20  c 3 d 4 a 1 b 3 
07b0: 63 20 34 20 64 20 35 20 61 20 32 7d 0a 64 6f 5f  c 4 d 5 a 2}.do_
07c0: 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 33 2e 34 20  test join-1.3.4 
07d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
07e0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
07f0: 74 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t1 NATURAL JOIN 
0800: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 7d 0a  t2;.  }.} {2 3}.
0810: 0a 23 20 74 69 63 6b 65 74 20 23 33 35 32 32 0a  .# ticket #3522.
0820: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 33  do_test join-1.3
0830: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .5 {.  execsql2 
0840: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 32 2e  {.    SELECT t2.
0850: 2a 20 46 52 4f 4d 20 74 32 20 4e 41 54 55 52 41  * FROM t2 NATURA
0860: 4c 20 4a 4f 49 4e 20 74 31 0a 20 20 7d 0a 7d 20  L JOIN t1.  }.} 
0870: 7b 62 20 32 20 63 20 33 20 64 20 34 20 62 20 33  {b 2 c 3 d 4 b 3
0880: 20 63 20 34 20 64 20 35 7d 0a 64 6f 5f 74 65 73   c 4 d 5}.do_tes
0890: 74 20 6a 6f 69 6e 2d 31 2e 33 2e 36 20 7b 0a 20  t join-1.3.6 {. 
08a0: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
08b0: 53 45 4c 45 43 54 20 78 79 7a 7a 79 2e 2a 20 46  SELECT xyzzy.* F
08c0: 52 4f 4d 20 74 32 20 41 53 20 78 79 7a 7a 79 20  ROM t2 AS xyzzy 
08d0: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31 0a  NATURAL JOIN t1.
08e0: 20 20 7d 0a 7d 20 7b 62 20 32 20 63 20 33 20 64    }.} {b 2 c 3 d
08f0: 20 34 20 62 20 33 20 63 20 34 20 64 20 35 7d 0a   4 b 3 c 4 d 5}.
0900: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 33  do_test join-1.3
0910: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .7 {.  execsql2 
0920: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e  {.    SELECT t1.
0930: 2a 20 46 52 4f 4d 20 74 32 20 4e 41 54 55 52 41  * FROM t2 NATURA
0940: 4c 20 4a 4f 49 4e 20 74 31 0a 20 20 7d 0a 7d 20  L JOIN t1.  }.} 
0950: 7b 61 20 31 20 62 20 32 20 63 20 33 20 61 20 32  {a 1 b 2 c 3 a 2
0960: 20 62 20 33 20 63 20 34 7d 0a 64 6f 5f 74 65 73   b 3 c 4}.do_tes
0970: 74 20 6a 6f 69 6e 2d 31 2e 33 2e 38 20 7b 0a 20  t join-1.3.8 {. 
0980: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
0990: 53 45 4c 45 43 54 20 78 79 7a 7a 79 2e 2a 20 46  SELECT xyzzy.* F
09a0: 52 4f 4d 20 74 32 20 4e 41 54 55 52 41 4c 20 4a  ROM t2 NATURAL J
09b0: 4f 49 4e 20 74 31 20 41 53 20 78 79 7a 7a 79 0a  OIN t1 AS xyzzy.
09c0: 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32 20 63    }.} {a 1 b 2 c
09d0: 20 33 20 61 20 32 20 62 20 33 20 63 20 34 7d 0a   3 a 2 b 3 c 4}.
09e0: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 33  do_test join-1.3
09f0: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .9 {.  execsql2 
0a00: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 61 61  {.    SELECT aaa
0a10: 2e 2a 2c 20 62 62 62 2e 2a 20 46 52 4f 4d 20 74  .*, bbb.* FROM t
0a20: 32 20 41 53 20 61 61 61 20 4e 41 54 55 52 41 4c  2 AS aaa NATURAL
0a30: 20 4a 4f 49 4e 20 74 31 20 41 53 20 62 62 62 0a   JOIN t1 AS bbb.
0a40: 20 20 7d 0a 7d 20 7b 62 20 32 20 63 20 33 20 64    }.} {b 2 c 3 d
0a50: 20 34 20 61 20 31 20 62 20 32 20 63 20 33 20 62   4 a 1 b 2 c 3 b
0a60: 20 33 20 63 20 34 20 64 20 35 20 61 20 32 20 62   3 c 4 d 5 a 2 b
0a70: 20 33 20 63 20 34 7d 0a 64 6f 5f 74 65 73 74 20   3 c 4}.do_test 
0a80: 6a 6f 69 6e 2d 31 2e 33 2e 31 30 20 7b 0a 20 20  join-1.3.10 {.  
0a90: 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53  execsql2 {.    S
0aa0: 45 4c 45 43 54 20 74 31 2e 2a 2c 20 74 32 2e 2a  ELECT t1.*, t2.*
0ab0: 20 46 52 4f 4d 20 74 32 20 4e 41 54 55 52 41 4c   FROM t2 NATURAL
0ac0: 20 4a 4f 49 4e 20 74 31 0a 20 20 7d 0a 7d 20 7b   JOIN t1.  }.} {
0ad0: 61 20 31 20 62 20 32 20 63 20 33 20 62 20 32 20  a 1 b 2 c 3 b 2 
0ae0: 63 20 33 20 64 20 34 20 61 20 32 20 62 20 33 20  c 3 d 4 a 2 b 3 
0af0: 63 20 34 20 62 20 33 20 63 20 34 20 64 20 35 7d  c 4 b 3 c 4 d 5}
0b00: 0a 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  ...do_test join-
0b10: 31 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1.4.1 {.  execsq
0b20: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
0b30: 2a 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45 52 20  * FROM t1 INNER 
0b40: 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 28 62 2c  JOIN t2 USING(b,
0b50: 63 29 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31 20 62  c);.  }.} {a 1 b
0b60: 20 32 20 63 20 33 20 64 20 34 20 61 20 32 20 62   2 c 3 d 4 a 2 b
0b70: 20 33 20 63 20 34 20 64 20 35 7d 0a 64 6f 5f 74   3 c 4 d 5}.do_t
0b80: 65 73 74 20 6a 6f 69 6e 2d 31 2e 34 2e 32 20 7b  est join-1.4.2 {
0b90: 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20  .  execsql2 {.  
0ba0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0bb0: 74 31 20 41 53 20 78 20 49 4e 4e 45 52 20 4a 4f  t1 AS x INNER JO
0bc0: 49 4e 20 74 32 20 55 53 49 4e 47 28 62 2c 63 29  IN t2 USING(b,c)
0bd0: 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32  ;.  }.} {a 1 b 2
0be0: 20 63 20 33 20 64 20 34 20 61 20 32 20 62 20 33   c 3 d 4 a 2 b 3
0bf0: 20 63 20 34 20 64 20 35 7d 0a 64 6f 5f 74 65 73   c 4 d 5}.do_tes
0c00: 74 20 6a 6f 69 6e 2d 31 2e 34 2e 33 20 7b 0a 20  t join-1.4.3 {. 
0c10: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
0c20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0c30: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 32 20 41   INNER JOIN t2 A
0c40: 53 20 79 20 55 53 49 4e 47 28 62 2c 63 29 3b 0a  S y USING(b,c);.
0c50: 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32 20 63    }.} {a 1 b 2 c
0c60: 20 33 20 64 20 34 20 61 20 32 20 62 20 33 20 63   3 d 4 a 2 b 3 c
0c70: 20 34 20 64 20 35 7d 0a 64 6f 5f 74 65 73 74 20   4 d 5}.do_test 
0c80: 6a 6f 69 6e 2d 31 2e 34 2e 34 20 7b 0a 20 20 65  join-1.4.4 {.  e
0c90: 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45  xecsql2 {.    SE
0ca0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 41  LECT * FROM t1 A
0cb0: 53 20 78 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74  S x INNER JOIN t
0cc0: 32 20 41 53 20 79 20 55 53 49 4e 47 28 62 2c 63  2 AS y USING(b,c
0cd0: 29 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20  );.  }.} {a 1 b 
0ce0: 32 20 63 20 33 20 64 20 34 20 61 20 32 20 62 20  2 c 3 d 4 a 2 b 
0cf0: 33 20 63 20 34 20 64 20 35 7d 0a 64 6f 5f 74 65  3 c 4 d 5}.do_te
0d00: 73 74 20 6a 6f 69 6e 2d 31 2e 34 2e 35 20 7b 0a  st join-1.4.5 {.
0d10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0d20: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31  SELECT b FROM t1
0d30: 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 28 62   JOIN t2 USING(b
0d40: 29 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 7d 0a 0a  );.  }.} {2 3}..
0d50: 23 20 54 69 63 6b 65 74 20 23 33 35 32 32 0a 64  # Ticket #3522.d
0d60: 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 34 2e  o_test join-1.4.
0d70: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b  6 {.  execsql2 {
0d80: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a  .    SELECT t1.*
0d90: 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 32   FROM t1 JOIN t2
0da0: 20 55 53 49 4e 47 28 62 29 3b 0a 20 20 7d 0a 7d   USING(b);.  }.}
0db0: 20 7b 61 20 31 20 62 20 32 20 63 20 33 20 61 20   {a 1 b 2 c 3 a 
0dc0: 32 20 62 20 33 20 63 20 34 7d 0a 64 6f 5f 74 65  2 b 3 c 4}.do_te
0dd0: 73 74 20 6a 6f 69 6e 2d 31 2e 34 2e 37 20 7b 0a  st join-1.4.7 {.
0de0: 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20    execsql2 {.   
0df0: 20 53 45 4c 45 43 54 20 74 32 2e 2a 20 46 52 4f   SELECT t2.* FRO
0e00: 4d 20 74 31 20 4a 4f 49 4e 20 74 32 20 55 53 49  M t1 JOIN t2 USI
0e10: 4e 47 28 62 29 3b 0a 20 20 7d 0a 7d 20 7b 62 20  NG(b);.  }.} {b 
0e20: 32 20 63 20 33 20 64 20 34 20 62 20 33 20 63 20  2 c 3 d 4 b 3 c 
0e30: 34 20 64 20 35 7d 0a 0a 64 6f 5f 74 65 73 74 20  4 d 5}..do_test 
0e40: 6a 6f 69 6e 2d 31 2e 35 20 7b 0a 20 20 65 78 65  join-1.5 {.  exe
0e50: 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45  csql2 {.    SELE
0e60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 4e  CT * FROM t1 INN
0e70: 45 52 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47  ER JOIN t2 USING
0e80: 28 62 29 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31 20  (b);.  }.} {a 1 
0e90: 62 20 32 20 63 20 33 20 63 20 33 20 64 20 34 20  b 2 c 3 c 3 d 4 
0ea0: 61 20 32 20 62 20 33 20 63 20 34 20 63 20 34 20  a 2 b 3 c 4 c 4 
0eb0: 64 20 35 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69  d 5}.do_test joi
0ec0: 6e 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  n-1.6 {.  execsq
0ed0: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
0ee0: 2a 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45 52 20  * FROM t1 INNER 
0ef0: 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 28 63 29  JOIN t2 USING(c)
0f00: 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32  ;.  }.} {a 1 b 2
0f10: 20 63 20 33 20 62 20 32 20 64 20 34 20 61 20 32   c 3 b 2 d 4 a 2
0f20: 20 62 20 33 20 63 20 34 20 62 20 33 20 64 20 35   b 3 c 4 b 3 d 5
0f30: 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31  }.do_test join-1
0f40: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .7 {.  execsql2 
0f50: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0f60: 52 4f 4d 20 74 31 20 49 4e 4e 45 52 20 4a 4f 49  ROM t1 INNER JOI
0f70: 4e 20 74 32 20 55 53 49 4e 47 28 63 2c 62 29 3b  N t2 USING(c,b);
0f80: 0a 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32 20  .  }.} {a 1 b 2 
0f90: 63 20 33 20 64 20 34 20 61 20 32 20 62 20 33 20  c 3 d 4 a 2 b 3 
0fa0: 63 20 34 20 64 20 35 7d 0a 0a 64 6f 5f 74 65 73  c 4 d 5}..do_tes
0fb0: 74 20 6a 6f 69 6e 2d 31 2e 38 20 7b 0a 20 20 65  t join-1.8 {.  e
0fc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0fd0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41  ECT * FROM t1 NA
0fe0: 54 55 52 41 4c 20 43 52 4f 53 53 20 4a 4f 49 4e  TURAL CROSS JOIN
0ff0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20   t2;.  }.} {1 2 
1000: 33 20 34 20 32 20 33 20 34 20 35 7d 0a 64 6f 5f  3 4 2 3 4 5}.do_
1010: 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 39 20 7b 0a  test join-1.9 {.
1020: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1030: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1040: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 20 55   CROSS JOIN t2 U
1050: 53 49 4e 47 28 62 2c 63 29 3b 0a 20 20 7d 0a 7d  SING(b,c);.  }.}
1060: 20 7b 31 20 32 20 33 20 34 20 32 20 33 20 34 20   {1 2 3 4 2 3 4 
1070: 35 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  5}.do_test join-
1080: 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.10 {.  execsql
1090: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
10a0: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
10b0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 32 3b 0a 20  INNER JOIN t2;. 
10c0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 32 20   }.} {1 2 3 4 2 
10d0: 33 20 34 20 35 7d 0a 64 6f 5f 74 65 73 74 20 6a  3 4 5}.do_test j
10e0: 6f 69 6e 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65  oin-1.11 {.  exe
10f0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1100: 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45  T * FROM t1 INNE
1110: 52 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 28  R JOIN t2 USING(
1120: 62 2c 63 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  b,c);.  }.} {1 2
1130: 20 33 20 34 20 32 20 33 20 34 20 35 7d 0a 64 6f   3 4 2 3 4 5}.do
1140: 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 31 32 20  _test join-1.12 
1150: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1160: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1170: 74 31 20 6e 61 74 75 72 61 6c 20 69 6e 6e 65 72  t1 natural inner
1180: 20 6a 6f 69 6e 20 74 32 3b 0a 20 20 7d 0a 7d 20   join t2;.  }.} 
1190: 7b 31 20 32 20 33 20 34 20 32 20 33 20 34 20 35  {1 2 3 4 2 3 4 5
11a0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62  }..ifcapable sub
11b0: 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73  query {.  do_tes
11c0: 74 20 6a 6f 69 6e 2d 31 2e 31 33 20 7b 0a 20 20  t join-1.13 {.  
11d0: 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20    execsql2 {.   
11e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
11f0: 20 74 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   t1 NATURAL JOIN
1200: 20 0a 20 20 20 20 20 20 20 20 28 53 45 4c 45 43   .        (SELEC
1210: 54 20 62 20 61 73 20 27 63 27 2c 20 63 20 61 73  T b as 'c', c as
1220: 20 27 64 27 2c 20 64 20 61 73 20 27 65 27 20 46   'd', d as 'e' F
1230: 52 4f 4d 20 74 32 29 20 61 73 20 74 33 0a 20 20  ROM t2) as t3.  
1240: 20 20 7d 0a 20 20 7d 20 7b 61 20 31 20 62 20 32    }.  } {a 1 b 2
1250: 20 63 20 33 20 64 20 34 20 65 20 35 7d 0a 20 20   c 3 d 4 e 5}.  
1260: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 31  do_test join-1.1
1270: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 32  4 {.    execsql2
1280: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1290: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 62  * FROM (SELECT b
12a0: 20 61 73 20 27 63 27 2c 20 63 20 61 73 20 27 64   as 'c', c as 'd
12b0: 27 2c 20 64 20 61 73 20 27 65 27 20 46 52 4f 4d  ', d as 'e' FROM
12c0: 20 74 32 29 20 61 73 20 27 74 78 27 0a 20 20 20   t2) as 'tx'.   
12d0: 20 20 20 20 20 20 20 4e 41 54 55 52 41 4c 20 4a         NATURAL J
12e0: 4f 49 4e 20 74 31 0a 20 20 20 20 7d 0a 20 20 7d  OIN t1.    }.  }
12f0: 20 7b 63 20 33 20 64 20 34 20 65 20 35 20 61 20   {c 3 d 4 e 5 a 
1300: 31 20 62 20 32 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  1 b 2}.}..do_tes
1310: 74 20 6a 6f 69 6e 2d 31 2e 31 35 20 7b 0a 20 20  t join-1.15 {.  
1320: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1330: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 63 2c  EATE TABLE t3(c,
1340: 64 2c 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  d,e);.    INSERT
1350: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
1360: 32 2c 33 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45  2,3,4);.    INSE
1370: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1380: 53 28 33 2c 34 2c 35 29 3b 0a 20 20 20 20 49 4e  S(3,4,5);.    IN
1390: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
13a0: 55 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20  UES(4,5,6);.    
13b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
13c0: 3b 0a 20 20 7d 20 20 0a 7d 20 7b 32 20 33 20 34  ;.  }  .} {2 3 4
13d0: 20 33 20 34 20 35 20 34 20 35 20 36 7d 0a 64 6f   3 4 5 4 5 6}.do
13e0: 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 31 36 20  _test join-1.16 
13f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1400: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1410: 74 31 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 20  t1 natural join 
1420: 74 32 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 20  t2 natural join 
1430: 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t3;.  }.} {1 2 3
1440: 20 34 20 35 20 32 20 33 20 34 20 35 20 36 7d 0a   4 5 2 3 4 5 6}.
1450: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 31  do_test join-1.1
1460: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b  7 {.  execsql2 {
1470: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1480: 4f 4d 20 74 31 20 6e 61 74 75 72 61 6c 20 6a 6f  OM t1 natural jo
1490: 69 6e 20 74 32 20 6e 61 74 75 72 61 6c 20 6a 6f  in t2 natural jo
14a0: 69 6e 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 61 20  in t3;.  }.} {a 
14b0: 31 20 62 20 32 20 63 20 33 20 64 20 34 20 65 20  1 b 2 c 3 d 4 e 
14c0: 35 20 61 20 32 20 62 20 33 20 63 20 34 20 64 20  5 a 2 b 3 c 4 d 
14d0: 35 20 65 20 36 7d 0a 64 6f 5f 74 65 73 74 20 6a  5 e 6}.do_test j
14e0: 6f 69 6e 2d 31 2e 31 38 20 7b 0a 20 20 65 78 65  oin-1.18 {.  exe
14f0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1500: 45 20 54 41 42 4c 45 20 74 34 28 64 2c 65 2c 66  E TABLE t4(d,e,f
1510: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1520: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 2c 33  TO t4 VALUES(2,3
1530: 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,4);.    INSERT 
1540: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33  INTO t4 VALUES(3
1550: 2c 34 2c 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,4,5);.    INSER
1560: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1570: 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20 53 45 4c  (4,5,6);.    SEL
1580: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20  ECT * FROM t4;. 
1590: 20 7d 20 20 0a 7d 20 7b 32 20 33 20 34 20 33 20   }  .} {2 3 4 3 
15a0: 34 20 35 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65  4 5 4 5 6}.do_te
15b0: 73 74 20 6a 6f 69 6e 2d 31 2e 31 39 2e 31 20 7b  st join-1.19.1 {
15c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
15d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15e0: 31 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 20 74  1 natural join t
15f0: 32 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 20 74  2 natural join t
1600: 34 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  4;.  }.} {1 2 3 
1610: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 6a  4 5 6}.do_test j
1620: 6f 69 6e 2d 31 2e 31 39 2e 32 20 7b 0a 20 20 65  oin-1.19.2 {.  e
1630: 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45  xecsql2 {.    SE
1640: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 6e  LECT * FROM t1 n
1650: 61 74 75 72 61 6c 20 6a 6f 69 6e 20 74 32 20 6e  atural join t2 n
1660: 61 74 75 72 61 6c 20 6a 6f 69 6e 20 74 34 3b 0a  atural join t4;.
1670: 20 20 7d 0a 7d 20 7b 61 20 31 20 62 20 32 20 63    }.} {a 1 b 2 c
1680: 20 33 20 64 20 34 20 65 20 35 20 66 20 36 7d 0a   3 d 4 e 5 f 6}.
1690: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 2e 32  do_test join-1.2
16a0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
16b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
16c0: 4d 20 74 31 20 6e 61 74 75 72 61 6c 20 6a 6f 69  M t1 natural joi
16d0: 6e 20 74 32 20 6e 61 74 75 72 61 6c 20 6a 6f 69  n t2 natural joi
16e0: 6e 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d  n t3 WHERE t1.a=
16f0: 31 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  1.  }.} {1 2 3 4
1700: 20 35 7d 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69   5}..do_test joi
1710: 6e 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  n-2.1 {.  execsq
1720: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
1730: 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c   FROM t1 NATURAL
1740: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 3b 0a 20   LEFT JOIN t2;. 
1750: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 32 20   }.} {1 2 3 4 2 
1760: 33 20 34 20 35 20 33 20 34 20 35 20 7b 7d 7d 0a  3 4 5 3 4 5 {}}.
1770: 0a 23 20 74 69 63 6b 65 74 20 23 33 35 32 32 0a  .# ticket #3522.
1780: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 32 2e 31  do_test join-2.1
1790: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .1 {.  execsql2 
17a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
17b0: 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 4c  ROM t1 NATURAL L
17c0: 45 46 54 20 4a 4f 49 4e 20 74 32 3b 0a 20 20 7d  EFT JOIN t2;.  }
17d0: 0a 7d 20 7b 61 20 31 20 62 20 32 20 63 20 33 20  .} {a 1 b 2 c 3 
17e0: 64 20 34 20 61 20 32 20 62 20 33 20 63 20 34 20  d 4 a 2 b 3 c 4 
17f0: 64 20 35 20 61 20 33 20 62 20 34 20 63 20 35 20  d 5 a 3 b 4 c 5 
1800: 64 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f  d {}}.do_test jo
1810: 69 6e 2d 32 2e 31 2e 32 20 7b 0a 20 20 65 78 65  in-2.1.2 {.  exe
1820: 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45  csql2 {.    SELE
1830: 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 20  CT t1.* FROM t1 
1840: 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49  NATURAL LEFT JOI
1850: 4e 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 61 20 31  N t2;.  }.} {a 1
1860: 20 62 20 32 20 63 20 33 20 61 20 32 20 62 20 33   b 2 c 3 a 2 b 3
1870: 20 63 20 34 20 61 20 33 20 62 20 34 20 63 20 35   c 4 a 3 b 4 c 5
1880: 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 32  }.do_test join-2
1890: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
18a0: 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  2 {.    SELECT t
18b0: 32 2e 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54 55  2.* FROM t1 NATU
18c0: 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32  RAL LEFT JOIN t2
18d0: 3b 0a 20 20 7d 0a 7d 20 7b 62 20 32 20 63 20 33  ;.  }.} {b 2 c 3
18e0: 20 64 20 34 20 62 20 33 20 63 20 34 20 64 20 35   d 4 b 3 c 4 d 5
18f0: 20 62 20 7b 7d 20 63 20 7b 7d 20 64 20 7b 7d 7d   b {} c {} d {}}
1900: 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 32  ..do_test join-2
1910: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
1920: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1930: 4f 4d 20 74 32 20 4e 41 54 55 52 41 4c 20 4c 45  OM t2 NATURAL LE
1940: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 31  FT OUTER JOIN t1
1950: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 7b  ;.  }.} {1 2 3 {
1960: 7d 20 32 20 33 20 34 20 31 20 33 20 34 20 35 20  } 2 3 4 1 3 4 5 
1970: 32 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  2}.do_test join-
1980: 32 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.3 {.  catchsql
1990: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
19a0: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
19b0: 52 49 47 48 54 20 4f 55 54 45 52 20 4a 4f 49 4e  RIGHT OUTER JOIN
19c0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 52   t2;.  }.} {1 {R
19d0: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
19e0: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
19f0: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1a00: 6f 72 74 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  orted}}.do_test 
1a10: 6a 6f 69 6e 2d 32 2e 34 20 7b 0a 20 20 65 78 65  join-2.4 {.  exe
1a20: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1a30: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1a40: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1a50: 3d 74 32 2e 64 0a 20 20 7d 0a 7d 20 7b 31 20 32  =t2.d.  }.} {1 2
1a60: 20 33 20 7b 7d 20 7b 7d 20 7b 7d 20 32 20 33 20   3 {} {} {} 2 3 
1a70: 34 20 7b 7d 20 7b 7d 20 7b 7d 20 33 20 34 20 35  4 {} {} {} 3 4 5
1a80: 20 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20   1 2 3}.do_test 
1a90: 6a 6f 69 6e 2d 32 2e 35 20 7b 0a 20 20 65 78 65  join-2.5 {.  exe
1aa0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1ab0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1ac0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1ad0: 3d 74 32 2e 64 20 57 48 45 52 45 20 74 31 2e 61  =t2.d WHERE t1.a
1ae0: 3e 31 0a 20 20 7d 0a 7d 20 7b 32 20 33 20 34 20  >1.  }.} {2 3 4 
1af0: 7b 7d 20 7b 7d 20 7b 7d 20 33 20 34 20 35 20 31  {} {} {} 3 4 5 1
1b00: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f   2 3}.do_test jo
1b10: 69 6e 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63 73  in-2.6 {.  execs
1b20: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1b30: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
1b40: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
1b50: 32 2e 64 20 57 48 45 52 45 20 74 32 2e 62 20 49  2.d WHERE t2.b I
1b60: 53 20 4e 55 4c 4c 20 4f 52 20 74 32 2e 62 3e 31  S NULL OR t2.b>1
1b70: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 7b 7d  .  }.} {1 2 3 {}
1b80: 20 7b 7d 20 7b 7d 20 32 20 33 20 34 20 7b 7d 20   {} {} 2 3 4 {} 
1b90: 7b 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  {} {}}..do_test 
1ba0: 6a 6f 69 6e 2d 33 2e 31 20 7b 0a 20 20 63 61 74  join-3.1 {.  cat
1bb0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1bc0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54  CT * FROM t1 NAT
1bd0: 55 52 41 4c 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  URAL JOIN t2 ON 
1be0: 74 31 2e 61 3d 74 32 2e 62 3b 0a 20 20 7d 0a 7d  t1.a=t2.b;.  }.}
1bf0: 20 7b 31 20 7b 61 20 4e 41 54 55 52 41 4c 20 6a   {1 {a NATURAL j
1c00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
1c10: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
1c20: 63 6c 61 75 73 65 7d 7d 0a 64 6f 5f 74 65 73 74  clause}}.do_test
1c30: 20 6a 6f 69 6e 2d 33 2e 32 20 7b 0a 20 20 63 61   join-3.2 {.  ca
1c40: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
1c50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41  ECT * FROM t1 NA
1c60: 54 55 52 41 4c 20 4a 4f 49 4e 20 74 32 20 55 53  TURAL JOIN t2 US
1c70: 49 4e 47 28 62 29 3b 0a 20 20 7d 0a 7d 20 7b 31  ING(b);.  }.} {1
1c80: 20 7b 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   {a NATURAL join
1c90: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e   may not have an
1ca0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1cb0: 75 73 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f  use}}.do_test jo
1cc0: 69 6e 2d 33 2e 33 20 7b 0a 20 20 63 61 74 63 68  in-3.3 {.  catch
1cd0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1ce0: 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20   * FROM t1 JOIN 
1cf0: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
1d00: 55 53 49 4e 47 28 62 29 3b 0a 20 20 7d 0a 7d 20  USING(b);.  }.} 
1d10: 7b 31 20 7b 63 61 6e 6e 6f 74 20 68 61 76 65 20  {1 {cannot have 
1d20: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1d30: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
1d40: 20 73 61 6d 65 20 6a 6f 69 6e 7d 7d 0a 64 6f 5f   same join}}.do_
1d50: 74 65 73 74 20 6a 6f 69 6e 2d 33 2e 34 2e 31 20  test join-3.4.1 
1d60: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1d70: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1d80: 20 74 31 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e   t1 JOIN t2 USIN
1d90: 47 28 61 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  G(a);.  }.} {1 {
1da0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
1db0: 67 20 63 6f 6c 75 6d 6e 20 61 20 2d 20 63 6f 6c  g column a - col
1dc0: 75 6d 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  umn not present 
1dd0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 7d 7d  in both tables}}
1de0: 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 33 2e  .do_test join-3.
1df0: 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  4.2 {.  catchsql
1e00: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1e10: 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 32 20  FROM t1 JOIN t2 
1e20: 55 53 49 4e 47 28 64 29 3b 0a 20 20 7d 0a 7d 20  USING(d);.  }.} 
1e30: 7b 31 20 7b 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  {1 {cannot join 
1e40: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 64 20 2d  using column d -
1e50: 20 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72 65 73   column not pres
1e60: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
1e70: 65 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69  es}}.do_test joi
1e80: 6e 2d 33 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  n-3.5 {.  catchs
1e90: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1ea0: 4f 4d 20 74 31 20 55 53 49 4e 47 28 61 29 20 7d  OM t1 USING(a) }
1eb0: 0a 7d 20 7b 31 20 7b 61 20 4a 4f 49 4e 20 63 6c  .} {1 {a JOIN cl
1ec0: 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1ed0: 20 62 65 66 6f 72 65 20 55 53 49 4e 47 7d 7d 0a   before USING}}.
1ee0: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 33 2e 36  do_test join-3.6
1ef0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1f00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1f10: 4d 20 74 31 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  M t1 JOIN t2 ON 
1f20: 74 33 2e 61 3d 74 32 2e 62 3b 0a 20 20 7d 0a 7d  t3.a=t2.b;.  }.}
1f30: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c   {1 {no such col
1f40: 75 6d 6e 3a 20 74 33 2e 61 7d 7d 0a 64 6f 5f 74  umn: t3.a}}.do_t
1f50: 65 73 74 20 6a 6f 69 6e 2d 33 2e 37 20 7b 0a 20  est join-3.7 {. 
1f60: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1f70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f80: 20 49 4e 4e 45 52 20 4f 55 54 45 52 20 4a 4f 49   INNER OUTER JOI
1f90: 4e 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  N t2;.  }.} {1 {
1fa0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1fb0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1fc0: 3a 20 49 4e 4e 45 52 20 4f 55 54 45 52 7d 7d 0a  : INNER OUTER}}.
1fd0: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 33 2e 38  do_test join-3.8
1fe0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1ff0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2000: 4d 20 74 31 20 49 4e 4e 45 52 20 4f 55 54 45 52  M t1 INNER OUTER
2010: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 3b 0a   CROSS JOIN t2;.
2020: 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77    }.} {1 {unknow
2030: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
2040: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 49 4e 4e 45   join type: INNE
2050: 52 20 4f 55 54 45 52 20 43 52 4f 53 53 7d 7d 0a  R OUTER CROSS}}.
2060: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 33 2e 39  do_test join-3.9
2070: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
2080: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2090: 4d 20 74 31 20 4f 55 54 45 52 20 4e 41 54 55 52  M t1 OUTER NATUR
20a0: 41 4c 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 32  AL INNER JOIN t2
20b0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 6b 6e  ;.  }.} {1 {unkn
20c0: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
20d0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 4f 55  ed join type: OU
20e0: 54 45 52 20 4e 41 54 55 52 41 4c 20 49 4e 4e 45  TER NATURAL INNE
20f0: 52 7d 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e  R}}.do_test join
2100: 2d 33 2e 31 30 20 7b 0a 20 20 63 61 74 63 68 73  -3.10 {.  catchs
2110: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2120: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 42  * FROM t1 LEFT B
2130: 4f 47 55 53 20 4a 4f 49 4e 20 74 32 3b 0a 20 20  OGUS JOIN t2;.  
2140: 7d 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20  }.} {1 {unknown 
2150: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
2160: 6f 69 6e 20 74 79 70 65 3a 20 4c 45 46 54 20 42  oin type: LEFT B
2170: 4f 47 55 53 7d 7d 0a 64 6f 5f 74 65 73 74 20 6a  OGUS}}.do_test j
2180: 6f 69 6e 2d 33 2e 31 31 20 7b 0a 20 20 63 61 74  oin-3.11 {.  cat
2190: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
21a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 4e  CT * FROM t1 INN
21b0: 45 52 20 42 4f 47 55 53 20 43 52 4f 53 53 20 4a  ER BOGUS CROSS J
21c0: 4f 49 4e 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  OIN t2;.  }.} {1
21d0: 20 7b 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   {unknown or uns
21e0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
21f0: 70 65 3a 20 49 4e 4e 45 52 20 42 4f 47 55 53 20  pe: INNER BOGUS 
2200: 43 52 4f 53 53 7d 7d 0a 64 6f 5f 74 65 73 74 20  CROSS}}.do_test 
2210: 6a 6f 69 6e 2d 33 2e 31 32 20 7b 0a 20 20 63 61  join-3.12 {.  ca
2220: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
2230: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41  ECT * FROM t1 NA
2240: 54 55 52 41 4c 20 41 57 4b 20 53 45 44 20 4a 4f  TURAL AWK SED JO
2250: 49 4e 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  IN t2;.  }.} {1 
2260: 7b 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  {unknown or unsu
2270: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
2280: 65 3a 20 4e 41 54 55 52 41 4c 20 41 57 4b 20 53  e: NATURAL AWK S
2290: 45 44 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f  ED}}..do_test jo
22a0: 69 6e 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  in-4.1 {.  execs
22b0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
22c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
22d0: 20 74 35 28 61 20 49 4e 54 45 47 45 52 20 50 52   t5(a INTEGER PR
22e0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
22f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
2300: 61 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  a INTEGER);.    
2310: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
2320: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
2330: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
2340: 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20  VALUES(NULL);.  
2350: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
2360: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2370: 36 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  6;.    INSERT IN
2380: 54 4f 20 74 36 20 53 45 4c 45 43 54 20 2a 20 46  TO t6 SELECT * F
2390: 52 4f 4d 20 74 36 3b 0a 20 20 20 20 49 4e 53 45  ROM t6;.    INSE
23a0: 52 54 20 49 4e 54 4f 20 74 36 20 53 45 4c 45 43  RT INTO t6 SELEC
23b0: 54 20 2a 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20  T * FROM t6;.   
23c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
23d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
23e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
23f0: 4f 20 74 36 20 53 45 4c 45 43 54 20 2a 20 46 52  O t6 SELECT * FR
2400: 4f 4d 20 74 36 3b 0a 20 20 20 20 49 4e 53 45 52  OM t6;.    INSER
2410: 54 20 49 4e 54 4f 20 74 36 20 53 45 4c 45 43 54  T INTO t6 SELECT
2420: 20 2a 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20   * FROM t6;.    
2430: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78  COMMIT;.  }.  ex
2440: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2450: 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 4e 41 54  CT * FROM t6 NAT
2460: 55 52 41 4c 20 4a 4f 49 4e 20 74 35 3b 0a 20 20  URAL JOIN t5;.  
2470: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6a  }.} {}.do_test j
2480: 6f 69 6e 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63  oin-4.2 {.  exec
2490: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
24a0: 20 2a 20 46 52 4f 4d 20 74 36 2c 20 74 35 20 57   * FROM t6, t5 W
24b0: 48 45 52 45 20 74 36 2e 61 3c 74 35 2e 61 3b 0a  HERE t6.a<t5.a;.
24c0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
24d0: 20 6a 6f 69 6e 2d 34 2e 33 20 7b 0a 20 20 65 78   join-4.3 {.  ex
24e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
24f0: 43 54 20 2a 20 46 52 4f 4d 20 74 36 2c 20 74 35  CT * FROM t6, t5
2500: 20 57 48 45 52 45 20 74 36 2e 61 3e 74 35 2e 61   WHERE t6.a>t5.a
2510: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
2520: 73 74 20 6a 6f 69 6e 2d 34 2e 34 20 7b 0a 20 20  st join-4.4 {.  
2530: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
2540: 44 41 54 45 20 74 36 20 53 45 54 20 61 3d 27 78  DATE t6 SET a='x
2550: 79 7a 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  yz';.    SELECT 
2560: 2a 20 46 52 4f 4d 20 74 36 20 4e 41 54 55 52 41  * FROM t6 NATURA
2570: 4c 20 4a 4f 49 4e 20 74 35 3b 0a 20 20 7d 0a 7d  L JOIN t5;.  }.}
2580: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e   {}.do_test join
2590: 2d 34 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.6 {.  execsql
25a0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
25b0: 46 52 4f 4d 20 74 36 2c 20 74 35 20 57 48 45 52  FROM t6, t5 WHER
25c0: 45 20 74 36 2e 61 3c 74 35 2e 61 3b 0a 20 20 7d  E t6.a<t5.a;.  }
25d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f  .} {}.do_test jo
25e0: 69 6e 2d 34 2e 37 20 7b 0a 20 20 65 78 65 63 73  in-4.7 {.  execs
25f0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2600: 2a 20 46 52 4f 4d 20 74 36 2c 20 74 35 20 57 48  * FROM t6, t5 WH
2610: 45 52 45 20 74 36 2e 61 3e 74 35 2e 61 3b 0a 20  ERE t6.a>t5.a;. 
2620: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
2630: 6a 6f 69 6e 2d 34 2e 38 20 7b 0a 20 20 65 78 65  join-4.8 {.  exe
2640: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
2650: 45 20 74 36 20 53 45 54 20 61 3d 31 3b 0a 20 20  E t6 SET a=1;.  
2660: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2670: 74 36 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t6 NATURAL JOIN 
2680: 74 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  t5;.  }.} {}.do_
2690: 74 65 73 74 20 6a 6f 69 6e 2d 34 2e 39 20 7b 0a  test join-4.9 {.
26a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
26b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
26c0: 2c 20 74 35 20 57 48 45 52 45 20 74 36 2e 61 3c  , t5 WHERE t6.a<
26d0: 74 35 2e 61 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  t5.a;.  }.} {}.d
26e0: 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 34 2e 31 30  o_test join-4.10
26f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2700: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2710: 20 74 36 2c 20 74 35 20 57 48 45 52 45 20 74 36   t6, t5 WHERE t6
2720: 2e 61 3e 74 35 2e 61 3b 0a 20 20 7d 0a 7d 20 7b  .a>t5.a;.  }.} {
2730: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  }..do_test join-
2740: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
2750: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2760: 20 63 72 65 61 74 65 20 74 61 62 6c 65 20 63 65   create table ce
2770: 6e 74 72 6f 73 20 28 69 64 20 69 6e 74 65 67 65  ntros (id intege
2780: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 63  r primary key, c
2790: 65 6e 74 72 6f 29 3b 0a 20 20 20 20 49 4e 53 45  entro);.    INSE
27a0: 52 54 20 49 4e 54 4f 20 63 65 6e 74 72 6f 73 20  RT INTO centros 
27b0: 56 41 4c 55 45 53 28 31 2c 27 78 78 78 27 29 3b  VALUES(1,'xxx');
27c0: 0a 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c  .    create tabl
27d0: 65 20 75 73 75 61 72 69 6f 73 20 28 69 64 20 69  e usuarios (id i
27e0: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
27f0: 65 79 2c 20 6e 6f 6d 62 72 65 2c 20 61 70 65 6c  ey, nombre, apel
2800: 6c 69 64 6f 73 2c 0a 20 20 20 20 69 64 63 65 6e  lidos,.    idcen
2810: 74 72 6f 20 69 6e 74 65 67 65 72 29 3b 0a 20 20  tro integer);.  
2820: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73    INSERT INTO us
2830: 75 61 72 69 6f 73 20 56 41 4c 55 45 53 28 31 2c  uarios VALUES(1,
2840: 27 61 27 2c 27 61 61 27 2c 31 29 3b 0a 20 20 20  'a','aa',1);.   
2850: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 75   INSERT INTO usu
2860: 61 72 69 6f 73 20 56 41 4c 55 45 53 28 32 2c 27  arios VALUES(2,'
2870: 62 27 2c 27 62 62 27 2c 31 29 3b 0a 20 20 20 20  b','bb',1);.    
2880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 75 61  INSERT INTO usua
2890: 72 69 6f 73 20 56 41 4c 55 45 53 28 33 2c 27 63  rios VALUES(3,'c
28a0: 27 2c 27 63 63 27 2c 4e 55 4c 4c 29 3b 0a 20 20  ','cc',NULL);.  
28b0: 20 20 63 72 65 61 74 65 20 69 6e 64 65 78 20 69    create index i
28c0: 64 63 65 6e 74 72 6f 20 6f 6e 20 75 73 75 61 72  dcentro on usuar
28d0: 69 6f 73 20 28 69 64 63 65 6e 74 72 6f 29 3b 0a  ios (idcentro);.
28e0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 73 65 6c      END;.    sel
28f0: 65 63 74 20 75 73 75 61 72 69 6f 73 2e 69 64 2c  ect usuarios.id,
2900: 20 75 73 75 61 72 69 6f 73 2e 6e 6f 6d 62 72 65   usuarios.nombre
2910: 2c 20 63 65 6e 74 72 6f 73 2e 63 65 6e 74 72 6f  , centros.centro
2920: 20 66 72 6f 6d 0a 20 20 20 20 75 73 75 61 72 69   from.    usuari
2930: 6f 73 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f  os left outer jo
2940: 69 6e 20 63 65 6e 74 72 6f 73 20 6f 6e 20 75 73  in centros on us
2950: 75 61 72 69 6f 73 2e 69 64 63 65 6e 74 72 6f 20  uarios.idcentro 
2960: 3d 20 63 65 6e 74 72 6f 73 2e 69 64 3b 0a 20 20  = centros.id;.  
2970: 7d 0a 7d 20 7b 31 20 61 20 78 78 78 20 32 20 62  }.} {1 a xxx 2 b
2980: 20 78 78 78 20 33 20 63 20 7b 7d 7d 0a 0a 23 20   xxx 3 c {}}..# 
2990: 41 20 74 65 73 74 20 66 6f 72 20 74 69 63 6b 65  A test for ticke
29a0: 74 20 23 32 34 37 2e 0a 23 0a 64 6f 5f 74 65 73  t #247..#.do_tes
29b0: 74 20 6a 6f 69 6e 2d 37 2e 31 20 7b 0a 20 20 65  t join-7.1 {.  e
29c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
29d0: 41 54 45 20 54 41 42 4c 45 20 74 37 20 28 78 2c  ATE TABLE t7 (x,
29e0: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
29f0: 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 20 28  INTO t7 VALUES (
2a00: 22 70 61 31 22 2c 20 31 29 3b 0a 20 20 20 20 49  "pa1", 1);.    I
2a10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41  NSERT INTO t7 VA
2a20: 4c 55 45 53 20 28 22 70 61 32 22 2c 20 4e 55 4c  LUES ("pa2", NUL
2a30: 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  L);.    INSERT I
2a40: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 20 28 22  NTO t7 VALUES ("
2a50: 70 61 33 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  pa3", NULL);.   
2a60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20   INSERT INTO t7 
2a70: 56 41 4c 55 45 53 20 28 22 70 61 34 22 2c 20 32  VALUES ("pa4", 2
2a80: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2a90: 54 4f 20 74 37 20 56 41 4c 55 45 53 20 28 22 70  TO t7 VALUES ("p
2aa0: 61 33 30 22 2c 20 31 33 31 29 3b 0a 20 20 20 20  a30", 131);.    
2ab0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
2ac0: 41 4c 55 45 53 20 28 22 70 61 33 31 22 2c 20 31  ALUES ("pa31", 1
2ad0: 33 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  30);.    INSERT 
2ae0: 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 20 28  INTO t7 VALUES (
2af0: 22 70 61 32 38 22 2c 20 4e 55 4c 4c 29 3b 0a 0a  "pa28", NULL);..
2b00: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2b10: 20 74 38 20 28 61 20 69 6e 74 65 67 65 72 20 70   t8 (a integer p
2b20: 72 69 6d 61 72 79 20 6b 65 79 2c 20 62 29 3b 0a  rimary key, b);.
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 74 38 20 56 41 4c 55 45 53 20 28 31 2c 20 22 70  t8 VALUES (1, "p
2b50: 61 31 22 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  a1");.    INSERT
2b60: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 20   INTO t8 VALUES 
2b70: 28 32 2c 20 22 70 61 34 22 29 3b 0a 20 20 20 20  (2, "pa4");.    
2b80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56  INSERT INTO t8 V
2b90: 41 4c 55 45 53 20 28 33 2c 20 4e 55 4c 4c 29 3b  ALUES (3, NULL);
2ba0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2bb0: 20 74 38 20 56 41 4c 55 45 53 20 28 34 2c 20 4e   t8 VALUES (4, N
2bc0: 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
2bd0: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 20   INTO t8 VALUES 
2be0: 28 31 33 30 2c 20 22 70 61 33 31 22 29 3b 0a 20  (130, "pa31");. 
2bf0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2c00: 38 20 56 41 4c 55 45 53 20 28 31 33 31 2c 20 22  8 VALUES (131, "
2c10: 70 61 33 30 22 29 3b 0a 0a 20 20 20 20 53 45 4c  pa30");..    SEL
2c20: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 74 38 2e  ECT coalesce(t8.
2c30: 61 2c 39 39 39 29 20 66 72 6f 6d 20 74 37 20 4c  a,999) from t7 L
2c40: 45 46 54 20 4a 4f 49 4e 20 74 38 20 6f 6e 20 79  EFT JOIN t8 on y
2c50: 3d 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 39 39 39  =a;.  }.} {1 999
2c60: 20 39 39 39 20 32 20 31 33 31 20 31 33 30 20 39   999 2 131 130 9
2c70: 39 39 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  99}..# Make sure
2c80: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 77 68 65   a left join whe
2c90: 72 65 20 74 68 65 20 72 69 67 68 74 20 74 61 62  re the right tab
2ca0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 76  le is really a v
2cb0: 69 65 77 20 74 68 61 74 0a 23 20 69 73 20 69 74  iew that.# is it
2cc0: 73 65 6c 66 20 61 20 6a 6f 69 6e 20 77 6f 72 6b  self a join work
2cd0: 73 20 72 69 67 68 74 2e 20 20 54 69 63 6b 65 74  s right.  Ticket
2ce0: 20 23 33 30 36 2e 0a 23 0a 69 66 63 61 70 61 62   #306..#.ifcapab
2cf0: 6c 65 20 76 69 65 77 20 7b 0a 64 6f 5f 74 65 73  le view {.do_tes
2d00: 74 20 6a 6f 69 6e 2d 38 2e 31 20 7b 0a 20 20 65  t join-8.1 {.  e
2d10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
2d20: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
2d30: 41 42 4c 45 20 74 39 28 61 20 49 4e 54 45 47 45  ABLE t9(a INTEGE
2d40: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
2d50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d60: 54 4f 20 74 39 20 56 41 4c 55 45 53 28 31 2c 31  TO t9 VALUES(1,1
2d70: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
2d80: 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28 32 2c  NTO t9 VALUES(2,
2d90: 32 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  22);.    CREATE 
2da0: 54 41 42 4c 45 20 74 31 30 28 78 20 49 4e 54 45  TABLE t10(x INTE
2db0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2dc0: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
2dd0: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
2de0: 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,2);.    INSERT
2df0: 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53   INTO t10 VALUES
2e00: 28 33 2c 33 29 3b 20 20 20 20 0a 20 20 20 20 43  (3,3);    .    C
2e10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28  REATE TABLE t11(
2e20: 70 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  p INTEGER PRIMAR
2e30: 59 20 4b 45 59 2c 20 71 29 3b 0a 20 20 20 20 49  Y KEY, q);.    I
2e40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56  NSERT INTO t11 V
2e50: 41 4c 55 45 53 28 32 2c 31 31 31 29 3b 0a 20 20  ALUES(2,111);.  
2e60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2e70: 31 20 56 41 4c 55 45 53 28 33 2c 33 33 33 29 3b  1 VALUES(3,333);
2e80: 20 20 20 20 0a 20 20 20 20 43 52 45 41 54 45 20      .    CREATE 
2e90: 56 49 45 57 20 76 31 30 5f 31 31 20 41 53 20 53  VIEW v10_11 AS S
2ea0: 45 4c 45 43 54 20 78 2c 20 71 20 46 52 4f 4d 20  ELECT x, q FROM 
2eb0: 74 31 30 2c 20 74 31 31 20 57 48 45 52 45 20 74  t10, t11 WHERE t
2ec0: 31 30 2e 79 3d 74 31 31 2e 70 3b 0a 20 20 20 20  10.y=t11.p;.    
2ed0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
2ee0: 43 54 20 2a 20 46 52 4f 4d 20 74 39 20 4c 45 46  CT * FROM t9 LEF
2ef0: 54 20 4a 4f 49 4e 20 76 31 30 5f 31 31 20 4f 4e  T JOIN v10_11 ON
2f00: 28 20 61 3d 78 20 29 3b 0a 20 20 7d 0a 7d 20 7b  ( a=x );.  }.} {
2f10: 31 20 31 31 20 31 20 31 31 31 20 32 20 32 32 20  1 11 1 111 2 22 
2f20: 7b 7d 20 7b 7d 7d 0a 69 66 63 61 70 61 62 6c 65  {} {}}.ifcapable
2f30: 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f   subquery {.  do
2f40: 5f 74 65 73 74 20 6a 6f 69 6e 2d 38 2e 32 20 7b  _test join-8.2 {
2f50: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2f70: 4f 4d 20 74 39 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t9 LEFT JOIN 
2f80: 28 53 45 4c 45 43 54 20 78 2c 20 71 20 46 52 4f  (SELECT x, q FRO
2f90: 4d 20 74 31 30 2c 20 74 31 31 20 57 48 45 52 45  M t10, t11 WHERE
2fa0: 20 74 31 30 2e 79 3d 74 31 31 2e 70 29 0a 20 20   t10.y=t11.p).  
2fb0: 20 20 20 20 20 20 20 20 20 4f 4e 28 20 61 3d 78           ON( a=x
2fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  );.    }.  } {1 
2fd0: 31 31 20 31 20 31 31 31 20 32 20 32 32 20 7b 7d  11 1 111 2 22 {}
2fe0: 20 7b 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 6a   {}}.}.do_test j
2ff0: 6f 69 6e 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63  oin-8.3 {.  exec
3000: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3010: 20 2a 20 46 52 4f 4d 20 76 31 30 5f 31 31 20 4c   * FROM v10_11 L
3020: 45 46 54 20 4a 4f 49 4e 20 74 39 20 4f 4e 28 20  EFT JOIN t9 ON( 
3030: 61 3d 78 20 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  a=x );.  }.} {1 
3040: 31 31 31 20 31 20 31 31 20 33 20 33 33 33 20 7b  111 1 11 3 333 {
3050: 7d 20 7b 7d 7d 0a 69 66 63 61 70 61 62 6c 65 20  } {}}.ifcapable 
3060: 73 75 62 71 75 65 72 79 20 7b 0a 20 20 23 20 43  subquery {.  # C
3070: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
3080: 6f 6e 73 20 69 6e 20 61 20 73 75 62 71 75 65 72  ons in a subquer
3090: 79 20 74 68 61 74 20 69 73 20 74 68 65 20 72 69  y that is the ri
30a0: 67 68 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  ght element of a
30b0: 0a 20 20 23 20 4c 45 46 54 20 4a 4f 49 4e 20 65  .  # LEFT JOIN e
30c0: 76 61 6c 75 61 74 65 20 74 6f 20 4e 55 4c 4c 20  valuate to NULL 
30d0: 66 6f 72 20 72 6f 77 73 20 77 68 65 72 65 20 74  for rows where t
30e0: 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 64 6f 65  he LEFT JOIN doe
30f0: 73 20 6e 6f 74 0a 20 20 23 20 6d 61 74 63 68 2e  s not.  # match.
3100: 20 20 54 69 63 6b 65 74 20 23 33 33 30 30 0a 20    Ticket #3300. 
3110: 20 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 38 2e   do_test join-8.
3120: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
3130: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3140: 20 46 52 4f 4d 20 74 39 20 4c 45 46 54 20 4a 4f   FROM t9 LEFT JO
3150: 49 4e 20 28 53 45 4c 45 43 54 20 34 34 2c 20 70  IN (SELECT 44, p
3160: 2c 20 71 20 46 52 4f 4d 20 74 31 31 29 20 41 53  , q FROM t11) AS
3170: 20 73 75 62 31 20 4f 4e 20 70 3d 61 0a 20 20 20   sub1 ON p=a.   
3180: 20 7d 0a 20 20 7d 20 7b 31 20 31 31 20 7b 7d 20   }.  } {1 11 {} 
3190: 7b 7d 20 7b 7d 20 32 20 32 32 20 34 34 20 32 20  {} {} 2 22 44 2 
31a0: 31 31 31 7d 0a 7d 0a 7d 20 3b 23 20 69 66 63 61  111}.}.} ;# ifca
31b0: 70 61 62 6c 65 20 76 69 65 77 0a 0a 23 20 54 69  pable view..# Ti
31c0: 63 6b 65 74 20 23 33 35 30 20 64 65 73 63 72 69  cket #350 descri
31d0: 62 65 73 20 61 20 73 63 65 6e 61 72 69 6f 20 77  bes a scenario w
31e0: 68 65 72 65 20 4c 45 46 54 20 4f 55 54 45 52 20  here LEFT OUTER 
31f0: 4a 4f 49 4e 20 64 6f 65 73 20 6e 6f 74 0a 23 20  JOIN does not.# 
3200: 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63 74  function correct
3210: 6c 79 20 69 66 20 74 68 65 20 72 69 67 68 74 20  ly if the right 
3220: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6a 6f 69  table in the joi
3230: 6e 20 69 73 20 72 65 61 6c 6c 79 0a 23 20 73 75  n is really.# su
3240: 62 71 75 65 72 79 2e 0a 23 0a 23 20 54 6f 20 74  bquery..#.# To t
3250: 65 73 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  est the problem,
3260: 20 77 65 20 67 65 6e 65 72 61 74 65 20 74 68 65   we generate the
3270: 20 73 61 6d 65 20 4c 45 46 54 20 4f 55 54 45 52   same LEFT OUTER
3280: 20 4a 4f 49 4e 20 69 6e 20 74 77 6f 0a 23 20 73   JOIN in two.# s
3290: 65 70 61 72 61 74 65 20 73 65 6c 65 63 74 73 20  eparate selects 
32a0: 62 75 74 20 77 69 74 68 20 6f 6e 20 75 73 69 6e  but with on usin
32b0: 67 20 61 20 73 75 62 71 75 65 72 79 20 61 6e 64  g a subquery and
32c0: 20 74 68 65 20 6f 74 68 65 72 20 63 61 6c 6c 69   the other calli
32d0: 6e 67 0a 23 20 74 68 65 20 74 61 62 6c 65 20 64  ng.# the table d
32e0: 69 72 65 63 74 6c 79 2e 20 20 54 68 65 6e 20 63  irectly.  Then c
32f0: 6f 6e 6e 65 63 74 20 74 68 65 20 74 77 6f 20 53  onnect the two S
3300: 45 4c 45 43 54 73 20 75 73 69 6e 67 20 61 6e 20  ELECTs using an 
3310: 45 58 43 45 50 54 2e 0a 23 20 42 6f 74 68 20 71  EXCEPT..# Both q
3320: 75 65 72 69 65 73 20 73 68 6f 75 6c 64 20 67 65  ueries should ge
3330: 6e 65 72 61 74 65 20 74 68 65 20 73 61 6d 65 20  nerate the same 
3340: 72 65 73 75 6c 74 73 20 73 6f 20 74 68 65 20 61  results so the a
3350: 6e 73 77 65 72 20 73 68 6f 75 6c 64 0a 23 20 62  nswer should.# b
3360: 65 20 61 6e 20 65 6d 70 74 79 20 73 65 74 2e 0a  e an empty set..
3370: 23 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70  #.ifcapable comp
3380: 6f 75 6e 64 20 7b 0a 64 6f 5f 74 65 73 74 20 6a  ound {.do_test j
3390: 6f 69 6e 2d 39 2e 31 20 7b 0a 20 20 65 78 65 63  oin-9.1 {.  exec
33a0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
33b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
33c0: 45 20 74 31 32 28 61 2c 62 29 3b 0a 20 20 20 20  E t12(a,b);.    
33d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 32 20  INSERT INTO t12 
33e0: 56 41 4c 55 45 53 28 31 2c 31 31 29 3b 0a 20 20  VALUES(1,11);.  
33f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3400: 32 20 56 41 4c 55 45 53 28 32 2c 32 32 29 3b 0a  2 VALUES(2,22);.
3410: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3420: 20 74 31 33 28 62 2c 63 29 3b 0a 20 20 20 20 49   t13(b,c);.    I
3430: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 33 20 56  NSERT INTO t13 V
3440: 41 4c 55 45 53 28 32 32 2c 32 32 32 29 3b 0a 20  ALUES(22,222);. 
3450: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
3460: 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 73   {}..ifcapable s
3470: 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74  ubquery {.  do_t
3480: 65 73 74 20 6a 6f 69 6e 2d 39 2e 31 2e 31 20 7b  est join-9.1.1 {
3490: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
34a0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
34b0: 4f 4d 20 74 31 32 20 4e 41 54 55 52 41 4c 20 4c  OM t12 NATURAL L
34c0: 45 46 54 20 4a 4f 49 4e 20 74 31 33 0a 20 20 20  EFT JOIN t13.   
34d0: 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 20 20     EXCEPT.      
34e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
34f0: 32 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a  2 NATURAL LEFT J
3500: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
3510: 4f 4d 20 74 31 33 20 57 48 45 52 45 20 62 3e 30  OM t13 WHERE b>0
3520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
3530: 7d 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65 77  }.ifcapable view
3540: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 6a 6f 69   {.  do_test joi
3550: 6e 2d 39 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  n-9.2 {.    exec
3560: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
3570: 54 45 20 56 49 45 57 20 76 31 33 20 41 53 20 53  TE VIEW v13 AS S
3580: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 33  ELECT * FROM t13
3590: 20 57 48 45 52 45 20 62 3e 30 3b 0a 20 20 20 20   WHERE b>0;.    
35a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
35b0: 74 31 32 20 4e 41 54 55 52 41 4c 20 4c 45 46 54  t12 NATURAL LEFT
35c0: 20 4a 4f 49 4e 20 74 31 33 0a 20 20 20 20 20 20   JOIN t13.      
35d0: 20 20 45 58 43 45 50 54 0a 20 20 20 20 20 20 20    EXCEPT.       
35e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
35f0: 31 32 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  12 NATURAL LEFT 
3600: 4a 4f 49 4e 20 76 31 33 3b 0a 20 20 20 20 7d 0a  JOIN v13;.    }.
3610: 20 20 7d 20 7b 7d 0a 7d 20 3b 23 20 69 66 63 61    } {}.} ;# ifca
3620: 70 61 62 6c 65 20 76 69 65 77 0a 7d 20 3b 23 20  pable view.} ;# 
3630: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
3640: 6e 64 0a 0a 69 66 63 61 70 61 62 6c 65 20 73 75  nd..ifcapable su
3650: 62 71 75 65 72 79 20 7b 0a 20 20 23 20 54 69 63  bquery {.  # Tic
3660: 6b 65 74 20 23 31 36 39 37 3a 20 20 4c 65 66 74  ket #1697:  Left
3670: 20 4a 6f 69 6e 20 57 48 45 52 45 20 63 6c 61 75   Join WHERE clau
3680: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 6f  se terms that co
3690: 6e 74 61 69 6e 20 61 6e 0a 20 20 23 20 61 67 67  ntain an.  # agg
36a0: 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
36b0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 6a  .  #.  do_test j
36c0: 6f 69 6e 2d 31 30 2e 31 20 7b 0a 20 20 20 20 65  oin-10.1 {.    e
36d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
36e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 31 28  REATE TABLE t21(
36f0: 61 2c 62 2c 63 29 3b 0a 20 20 20 20 20 20 43 52  a,b,c);.      CR
3700: 45 41 54 45 20 54 41 42 4c 45 20 74 32 32 28 70  EATE TABLE t22(p
3710: 2c 71 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  ,q);.      CREAT
3720: 45 20 49 4e 44 45 58 20 69 32 32 20 4f 4e 20 74  E INDEX i22 ON t
3730: 32 32 28 71 29 3b 0a 20 20 20 20 20 20 53 45 4c  22(q);.      SEL
3740: 45 43 54 20 61 20 46 52 4f 4d 20 74 32 31 20 4c  ECT a FROM t21 L
3750: 45 46 54 20 4a 4f 49 4e 20 74 32 32 20 4f 4e 20  EFT JOIN t22 ON 
3760: 62 3d 70 20 57 48 45 52 45 20 71 3d 0a 20 20 20  b=p WHERE q=.   
3770: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 6d 61        (SELECT ma
3780: 78 28 6d 2e 71 29 20 46 52 4f 4d 20 74 32 32 20  x(m.q) FROM t22 
3790: 6d 20 4a 4f 49 4e 20 74 32 31 20 6e 20 4f 4e 20  m JOIN t21 n ON 
37a0: 6e 2e 62 3d 6d 2e 70 20 57 48 45 52 45 20 6e 2e  n.b=m.p WHERE n.
37b0: 63 3d 31 29 3b 0a 20 20 20 20 7d 20 20 0a 20 20  c=1);.    }  .  
37c0: 7d 20 7b 7d 0a 0a 20 20 23 20 54 65 73 74 20 61  } {}..  # Test a
37d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 6e 20   LEFT JOIN when 
37e0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
37f0: 69 64 65 20 6f 66 20 68 74 65 20 6a 6f 69 6e 20  ide of hte join 
3800: 69 73 20 61 6e 20 65 6d 70 74 79 0a 20 20 23 20  is an empty.  # 
3810: 73 75 62 2d 71 75 65 72 79 2e 20 53 65 65 6d 73  sub-query. Seems
3820: 20 66 69 6e 65 2e 0a 20 20 23 0a 20 20 64 6f 5f   fine..  #.  do_
3830: 74 65 73 74 20 6a 6f 69 6e 2d 31 30 2e 32 20 7b  test join-10.2 {
3840: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3850: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
3860: 45 20 74 32 33 28 61 2c 20 62 2c 20 63 29 3b 0a  E t23(a, b, c);.
3870: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
3880: 4c 45 20 74 32 34 28 61 2c 20 62 2c 20 63 29 3b  LE t24(a, b, c);
3890: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
38a0: 54 4f 20 74 32 33 20 56 41 4c 55 45 53 28 31 2c  TO t23 VALUES(1,
38b0: 20 32 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20   2, 3);.    }.  
38c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
38d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
38e0: 74 32 33 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32  t23 LEFT JOIN t2
38f0: 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  4;.    }.  } {1 
3900: 32 20 33 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20  2 3 {} {} {}}.  
3910: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 30 2e  do_test join-10.
3920: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
3930: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3940: 20 46 52 4f 4d 20 74 32 33 20 4c 45 46 54 20 4a   FROM t23 LEFT J
3950: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
3960: 4f 4d 20 74 32 34 29 3b 0a 20 20 20 20 7d 0a 20  OM t24);.    }. 
3970: 20 7d 20 7b 31 20 32 20 33 20 7b 7d 20 7b 7d 20   } {1 2 3 {} {} 
3980: 7b 7d 7d 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61  {}}..} ;# ifcapa
3990: 62 6c 65 20 73 75 62 71 75 65 72 79 0a 0a 23 2d  ble subquery..#-
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
39f0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 61  ollowing tests a
3a00: 72 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  re to ensure tha
3a10: 74 20 62 75 67 20 62 37 33 66 62 30 62 64 36 34  t bug b73fb0bd64
3a20: 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f   is fixed..#.do_
3a30: 74 65 73 74 20 6a 6f 69 6e 2d 31 31 2e 31 20 7b  test join-11.1 {
3a40: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
3a50: 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
3a60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3a70: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
3a80: 4d 41 52 59 20 4b 45 59 2c 20 62 20 54 45 58 54  MARY KEY, b TEXT
3a90: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
3aa0: 42 4c 45 20 74 32 28 61 20 49 4e 54 45 47 45 52  BLE t2(a INTEGER
3ab0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
3ac0: 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53 45 52  TEXT);.    INSER
3ad0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3ae0: 28 31 2c 27 61 62 63 27 29 3b 0a 20 20 20 20 49  (1,'abc');.    I
3af0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3b00: 4c 55 45 53 28 32 2c 27 64 65 66 27 29 3b 0a 20  LUES(2,'def');. 
3b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3b20: 32 20 56 41 4c 55 45 53 28 31 2c 27 61 62 63 27  2 VALUES(1,'abc'
3b30: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3b40: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 27  TO t2 VALUES(2,'
3b50: 64 65 66 27 29 3b 0a 20 20 20 20 53 45 4c 45 43  def');.    SELEC
3b60: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54 55  T * FROM t1 NATU
3b70: 52 41 4c 20 4a 4f 49 4e 20 74 32 3b 0a 20 20 7d  RAL JOIN t2;.  }
3b80: 0a 7d 20 7b 31 20 61 62 63 20 32 20 64 65 66 7d  .} {1 abc 2 def}
3b90: 0a 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31  ..do_test join-1
3ba0: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
3bb0: 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  { SELECT a FROM 
3bc0: 74 31 20 4a 4f 49 4e 20 74 31 20 55 53 49 4e 47  t1 JOIN t1 USING
3bd0: 20 28 61 29 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f   (a)}.} {1 2}.do
3be0: 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 31 2e 33 20  _test join-11.3 
3bf0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
3c00: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4a  LECT a FROM t1 J
3c10: 4f 49 4e 20 74 31 20 41 53 20 74 32 20 55 53 49  OIN t1 AS t2 USI
3c20: 4e 47 20 28 61 29 7d 0a 7d 20 7b 31 20 32 7d 0a  NG (a)}.} {1 2}.
3c30: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 31 2e  do_test join-11.
3c40: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
3c50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3c60: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31   NATURAL JOIN t1
3c70: 20 41 53 20 74 32 7d 0a 7d 20 7b 31 20 61 62 63   AS t2}.} {1 abc
3c80: 20 32 20 64 65 66 7d 0a 64 6f 5f 74 65 73 74 20   2 def}.do_test 
3c90: 6a 6f 69 6e 2d 31 31 2e 34 20 7b 0a 20 20 65 78  join-11.4 {.  ex
3ca0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3cb0: 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c   FROM t1 NATURAL
3cc0: 20 4a 4f 49 4e 20 74 31 20 7d 0a 7d 20 7b 31 20   JOIN t1 }.} {1 
3cd0: 61 62 63 20 32 20 64 65 66 7d 0a 0a 64 6f 5f 74  abc 2 def}..do_t
3ce0: 65 73 74 20 6a 6f 69 6e 2d 31 31 2e 35 20 7b 0a  est join-11.5 {.
3cf0: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
3d00: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
3d10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3d20: 31 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  1(a COLLATE noca
3d30: 73 65 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  se, b);.    CREA
3d40: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
3d50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3d60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 4f 4e  TO t1 VALUES('ON
3d70: 45 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45  E', 1);.    INSE
3d80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3d90: 53 28 27 74 77 6f 27 2c 20 32 29 3b 0a 20 20 20  S('two', 2);.   
3da0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3db0: 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 31 29  VALUES('one', 1)
3dc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3dd0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 74 77 6f  O t2 VALUES('two
3de0: 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ', 2);.  }.} {}.
3df0: 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 31 2e  do_test join-11.
3e00: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  6 {.  execsql { 
3e10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3e20: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 32   NATURAL JOIN t2
3e30: 20 7d 0a 7d 20 7b 4f 4e 45 20 31 20 74 77 6f 20   }.} {ONE 1 two 
3e40: 32 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d  2}.do_test join-
3e50: 31 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.7 {.  execsql
3e60: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3e70: 20 74 32 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   t2 NATURAL JOIN
3e80: 20 74 31 20 7d 0a 7d 20 7b 74 77 6f 20 32 7d 0a   t1 }.} {two 2}.
3e90: 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 31  .do_test join-11
3ea0: 2e 38 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .8 {.  drop_all_
3eb0: 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
3ec0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
3ed0: 42 4c 45 20 74 31 28 61 2c 20 62 20 54 45 58 54  BLE t1(a, b TEXT
3ee0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
3ef0: 42 4c 45 20 74 32 28 62 20 49 4e 54 45 47 45 52  BLE t2(b INTEGER
3f00: 2c 20 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , a);.    INSERT
3f10: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3f20: 27 6f 6e 65 27 2c 20 27 31 2e 30 27 29 3b 0a 20  'one', '1.0');. 
3f30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3f40: 31 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20  1 VALUES('two', 
3f50: 27 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  '2');.    INSERT
3f60: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
3f70: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  1, 'one');.    I
3f80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
3f90: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
3fa0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
3fb0: 20 6a 6f 69 6e 2d 31 31 2e 39 20 7b 0a 20 20 65   join-11.9 {.  e
3fc0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
3fd0: 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41  * FROM t1 NATURA
3fe0: 4c 20 4a 4f 49 4e 20 74 32 20 7d 0a 7d 20 7b 6f  L JOIN t2 }.} {o
3ff0: 6e 65 20 31 2e 30 20 74 77 6f 20 32 7d 0a 64 6f  ne 1.0 two 2}.do
4000: 5f 74 65 73 74 20 6a 6f 69 6e 2d 31 31 2e 31 30  _test join-11.10
4010: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
4020: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
4030: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31 20  NATURAL JOIN t1 
4040: 7d 0a 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  }.} {1 one 2 two
4050: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
40a0: 54 65 73 74 20 74 68 61 74 20 61 74 20 6d 6f 73  Test that at mos
40b0: 74 20 36 34 20 74 61 62 6c 65 73 20 61 72 65 20  t 64 tables are 
40c0: 61 6c 6c 6f 77 65 64 20 69 6e 20 61 20 6a 6f 69  allowed in a joi
40d0: 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  n..#.do_execsql_
40e0: 74 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 31 20 7b  test join-12.1 {
40f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
4100: 74 31 34 28 78 29 3b 0a 20 20 49 4e 53 45 52 54  t14(x);.  INSERT
4110: 20 49 4e 54 4f 20 74 31 34 20 56 41 4c 55 45 53   INTO t14 VALUES
4120: 28 27 61 62 63 64 65 66 67 68 69 6a 27 29 3b 0a  ('abcdefghij');.
4130: 7d 0a 0a 70 72 6f 63 20 6a 6f 69 6e 74 65 73 74  }..proc jointest
4140: 20 7b 74 6e 20 6e 54 62 6c 20 72 65 73 7d 20 7b   {tn nTbl res} {
4150: 0a 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45  .  set sql "SELE
4160: 43 54 20 31 20 46 52 4f 4d 20 5b 73 74 72 69 6e  CT 1 FROM [strin
4170: 67 20 72 65 70 65 61 74 20 74 31 34 2c 20 5b 65  g repeat t14, [e
4180: 78 70 72 20 24 6e 54 62 6c 2d 31 5d 5d 20 74 31  xpr $nTbl-1]] t1
4190: 34 3b 22 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  4;".  uplevel [l
41a0: 69 73 74 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f  ist do_catchsql_
41b0: 74 65 73 74 20 24 74 6e 20 24 73 71 6c 20 24 72  test $tn $sql $r
41c0: 65 73 5d 0a 7d 0a 0a 6a 6f 69 6e 74 65 73 74 20  es].}..jointest 
41d0: 6a 6f 69 6e 2d 31 32 2e 32 20 33 30 20 7b 30 20  join-12.2 30 {0 
41e0: 31 7d 0a 6a 6f 69 6e 74 65 73 74 20 6a 6f 69 6e  1}.jointest join
41f0: 2d 31 32 2e 33 20 36 33 20 7b 30 20 31 7d 0a 6a  -12.3 63 {0 1}.j
4200: 6f 69 6e 74 65 73 74 20 6a 6f 69 6e 2d 31 32 2e  ointest join-12.
4210: 34 20 36 34 20 7b 30 20 31 7d 0a 6a 6f 69 6e 74  4 64 {0 1}.joint
4220: 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 35 20 36 35  est join-12.5 65
4230: 20 7b 31 20 7b 61 74 20 6d 6f 73 74 20 36 34 20   {1 {at most 64 
4240: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
4250: 7d 7d 0a 6a 6f 69 6e 74 65 73 74 20 6a 6f 69 6e  }}.jointest join
4260: 2d 31 32 2e 36 20 36 36 20 7b 31 20 7b 61 74 20  -12.6 66 {1 {at 
4270: 6d 6f 73 74 20 36 34 20 74 61 62 6c 65 73 20 69  most 64 tables i
4280: 6e 20 61 20 6a 6f 69 6e 7d 7d 0a 6a 6f 69 6e 74  n a join}}.joint
4290: 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 37 20 31 32  est join-12.7 12
42a0: 37 20 7b 31 20 7b 61 74 20 6d 6f 73 74 20 36 34  7 {1 {at most 64
42b0: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
42c0: 6e 7d 7d 0a 6a 6f 69 6e 74 65 73 74 20 6a 6f 69  n}}.jointest joi
42d0: 6e 2d 31 32 2e 38 20 31 32 38 20 7b 31 20 7b 61  n-12.8 128 {1 {a
42e0: 74 20 6d 6f 73 74 20 36 34 20 74 61 62 6c 65 73  t most 64 tables
42f0: 20 69 6e 20 61 20 6a 6f 69 6e 7d 7d 0a 6a 6f 69   in a join}}.joi
4300: 6e 74 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 39 20  ntest join-12.9 
4310: 31 30 30 30 20 7b 31 20 7b 61 74 20 6d 6f 73 74  1000 {1 {at most
4320: 20 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20   64 tables in a 
4330: 6a 6f 69 6e 7d 7d 0a 0a 23 20 49 66 20 53 51 4c  join}}..# If SQL
4340: 69 74 65 20 69 73 20 62 75 69 6c 74 20 77 69 74  ite is built wit
4350: 68 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  h SQLITE_MEMDEBU
4360: 47 2c 20 74 68 65 6e 20 74 68 65 20 68 75 67 65  G, then the huge
4370: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 61 6c 6c   number of reall
4380: 6f 63 28 29 0a 23 20 63 61 6c 6c 73 20 6d 61 64  oc().# calls mad
4390: 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e by the followi
43a0: 6e 67 20 74 65 73 74 20 63 61 73 65 73 20 61 72  ng test cases ar
43b0: 65 20 74 6f 6f 20 74 69 6d 65 20 63 6f 6e 73 75  e too time consu
43c0: 6d 69 6e 67 20 74 6f 20 72 75 6e 2e 0a 23 20 57  ming to run..# W
43d0: 69 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 4d 45  ithout SQLITE_ME
43e0: 4d 44 45 42 55 47 2c 20 72 65 61 6c 6c 6f 63 28  MDEBUG, realloc(
43f0: 29 20 69 73 20 66 61 73 74 20 65 6e 6f 75 67 68  ) is fast enough
4400: 20 74 68 61 74 20 74 68 65 73 65 20 61 72 65 20   that these are 
4410: 6e 6f 74 0a 23 20 61 20 70 72 6f 62 6c 65 6d 2e  not.# a problem.
4420: 0a 69 66 63 61 70 61 62 6c 65 20 70 72 61 67 6d  .ifcapable pragm
4430: 61 26 26 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  a&&compileoption
4440: 5f 64 69 61 67 73 20 7b 0a 20 20 69 66 20 7b 5b  _diags {.  if {[
4450: 6c 73 65 61 72 63 68 20 5b 64 62 20 65 76 61 6c  lsearch [db eval
4460: 20 7b 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65   {PRAGMA compile
4470: 5f 6f 70 74 69 6f 6e 73 7d 5d 20 4d 45 4d 44 45  _options}] MEMDE
4480: 42 55 47 5d 3c 30 7d 20 7b 0a 20 20 20 20 6a 6f  BUG]<0} {.    jo
4490: 69 6e 74 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 31  intest join-12.1
44a0: 30 20 36 35 35 33 34 20 7b 31 20 7b 61 74 20 6d  0 65534 {1 {at m
44b0: 6f 73 74 20 36 34 20 74 61 62 6c 65 73 20 69 6e  ost 64 tables in
44c0: 20 61 20 6a 6f 69 6e 7d 7d 0a 20 20 20 20 6a 6f   a join}}.    jo
44d0: 69 6e 74 65 73 74 20 6a 6f 69 6e 2d 31 32 2e 31  intest join-12.1
44e0: 31 20 36 35 35 33 35 20 7b 31 20 7b 74 6f 6f 20  1 65535 {1 {too 
44f0: 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
4500: 74 6f 20 22 74 31 34 22 3a 20 6d 61 78 20 36 35  to "t14": max 65
4510: 35 33 35 7d 7d 0a 20 20 20 20 6a 6f 69 6e 74 65  535}}.    jointe
4520: 73 74 20 6a 6f 69 6e 2d 31 32 2e 31 32 20 36 35  st join-12.12 65
4530: 35 33 36 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79  536 {1 {too many
4540: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 22   references to "
4550: 74 31 34 22 3a 20 6d 61 78 20 36 35 35 33 35 7d  t14": max 65535}
4560: 7d 0a 20 20 20 20 6a 6f 69 6e 74 65 73 74 20 6a  }.    jointest j
4570: 6f 69 6e 2d 31 32 2e 31 33 20 36 35 35 33 37 20  oin-12.13 65537 
4580: 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 72 65 66  {1 {too many ref
4590: 65 72 65 6e 63 65 73 20 74 6f 20 22 74 31 34 22  erences to "t14"
45a0: 3a 20 6d 61 78 20 36 35 35 33 35 7d 7d 0a 20 20  : max 65535}}.  
45b0: 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}...#---------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 0a 23 20 54 65 73 74 20 61 20 70 72 6f 62 6c 65  .# Test a proble
4610: 6d 20 77 69 74 68 20 72 65 6f 72 64 65 72 69 6e  m with reorderin
4620: 67 20 74 61 62 6c 65 73 20 66 6f 6c 6c 6f 77 69  g tables followi
4630: 6e 67 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  ng a LEFT JOIN..
4640: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
4650: 74 20 6a 6f 69 6e 2d 31 33 2e 30 20 7b 0a 20 20  t join-13.0 {.  
4660: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 61 28  CREATE TABLE aa(
4670: 61 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  a);.  CREATE TAB
4680: 4c 45 20 62 62 28 62 29 3b 0a 20 20 43 52 45 41  LE bb(b);.  CREA
4690: 54 45 20 54 41 42 4c 45 20 63 63 28 63 29 3b 0a  TE TABLE cc(c);.
46a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
46b0: 61 20 56 41 4c 55 45 53 28 34 35 29 3b 0a 20 20  a VALUES(45);.  
46c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
46d0: 41 4c 55 45 53 28 34 35 29 3b 0a 20 20 49 4e 53  ALUES(45);.  INS
46e0: 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55  ERT INTO cc VALU
46f0: 45 53 28 34 35 29 3b 0a 7d 0a 0a 64 6f 5f 65 78  ES(45);.}..do_ex
4700: 65 63 73 71 6c 5f 74 65 73 74 20 6a 6f 69 6e 2d  ecsql_test join-
4710: 31 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  13.1 {.  SELECT 
4720: 2a 20 46 52 4f 4d 20 61 61 20 4c 45 46 54 20 4a  * FROM aa LEFT J
4730: 4f 49 4e 20 62 62 2c 20 63 63 20 57 48 45 52 45  OIN bb, cc WHERE
4740: 20 63 63 2e 63 3d 61 61 2e 61 3b 0a 7d 20 7b 34   cc.c=aa.a;.} {4
4750: 35 20 7b 7d 20 34 35 20 34 35 20 7b 7d 20 34 35  5 {} 45 45 {} 45
4760: 7d 0a 0a 23 20 49 6e 20 74 68 65 20 66 6f 6c 6c  }..# In the foll
4770: 6f 77 69 6e 67 2c 20 74 68 65 20 6f 72 64 65 72  owing, the order
4780: 20 6f 66 20 5b 63 63 5d 20 61 6e 64 20 5b 62 62   of [cc] and [bb
4790: 5d 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 65 78  ] must not be ex
47a0: 63 68 61 6e 67 65 64 2c 20 65 76 65 6e 0a 23 20  changed, even.# 
47b0: 74 68 6f 75 67 68 20 74 68 69 73 20 77 6f 75 6c  though this woul
47c0: 64 20 62 65 20 68 65 6c 70 66 75 6c 20 69 66 20  d be helpful if 
47d0: 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 61  the query used a
47e0: 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e 2e 0a 64 6f  n inner join..do
47f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 6f  _execsql_test jo
4800: 69 6e 2d 31 33 2e 32 20 7b 0a 20 20 43 52 45 41  in-13.2 {.  CREA
4810: 54 45 20 49 4e 44 45 58 20 63 63 63 20 4f 4e 20  TE INDEX ccc ON 
4820: 63 63 28 63 29 3b 0a 20 20 53 45 4c 45 43 54 20  cc(c);.  SELECT 
4830: 2a 20 46 52 4f 4d 20 61 61 20 4c 45 46 54 20 4a  * FROM aa LEFT J
4840: 4f 49 4e 20 62 62 2c 20 63 63 20 57 48 45 52 45  OIN bb, cc WHERE
4850: 20 63 63 2e 63 3d 61 61 2e 61 3b 0a 7d 20 7b 34   cc.c=aa.a;.} {4
4860: 35 20 7b 7d 20 34 35 20 34 35 20 7b 7d 20 34 35  5 {} 45 45 {} 45
4870: 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.