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

Artifact f5ea0fd3b0a441c8e439706339dcd17cec63a896a755c04a30bfd442ecce1190:


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 0a 73 65 74 20 74 65 73 74 64 69 72 20  .#..set testdir 
01f0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
0200: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
0210: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
0220: 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20  .set testprefix 
0230: 6a 6f 69 6e 32 0a 0a 64 6f 5f 74 65 73 74 20 6a  join2..do_test j
0240: 6f 69 6e 32 2d 31 2e 31 20 7b 0a 20 20 65 78 65  oin2-1.1 {.  exe
0250: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0260: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 3b  E TABLE t1(a,b);
0270: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0280: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31 31 29   t1 VALUES(1,11)
0290: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
02a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 32 32  O t1 VALUES(2,22
02b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
02c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 33  TO t1 VALUES(3,3
02d0: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  3);.    SELECT *
02e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 20 0a   FROM t1;.  }  .
02f0: 7d 20 7b 31 20 31 31 20 32 20 32 32 20 33 20 33  } {1 11 2 22 3 3
0300: 33 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 32  3}.do_test join2
0310: 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.2 {.  execsql
0320: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0330: 42 4c 45 20 74 32 28 62 2c 63 29 3b 0a 20 20 20  BLE t2(b,c);.   
0340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0350: 56 41 4c 55 45 53 28 31 31 2c 31 31 31 29 3b 0a  VALUES(11,111);.
0360: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0370: 74 32 20 56 41 4c 55 45 53 28 33 33 2c 33 33 33  t2 VALUES(33,333
0380: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0390: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 34 2c  TO t2 VALUES(44,
03a0: 34 34 34 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  444);.    SELECT
03b0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20   * FROM t2;.  } 
03c0: 20 0a 7d 20 7b 31 31 20 31 31 31 20 33 33 20 33   .} {11 111 33 3
03d0: 33 33 20 34 34 20 34 34 34 7d 3b 0a 64 6f 5f 74  33 44 444};.do_t
03e0: 65 73 74 20 6a 6f 69 6e 32 2d 31 2e 33 20 7b 0a  est join2-1.3 {.
03f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0400: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
0410: 63 2c 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  c,d);.    INSERT
0420: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
0430: 31 31 31 2c 31 31 31 31 29 3b 0a 20 20 20 20 49  111,1111);.    I
0440: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0450: 4c 55 45 53 28 34 34 34 2c 34 34 34 34 29 3b 0a  LUES(444,4444);.
0460: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0470: 74 33 20 56 41 4c 55 45 53 28 35 35 35 2c 35 35  t3 VALUES(555,55
0480: 35 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  55);.    SELECT 
0490: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 20 20  * FROM t3;.  }  
04a0: 0a 7d 20 7b 31 31 31 20 31 31 31 31 20 34 34 34  .} {111 1111 444
04b0: 20 34 34 34 34 20 35 35 35 20 35 35 35 35 7d 0a   4444 555 5555}.
04c0: 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 32 2d 31  .do_test join2-1
04d0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
04e0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
04f0: 4f 4d 0a 20 20 20 20 20 20 74 31 20 4e 41 54 55  OM.      t1 NATU
0500: 52 41 4c 20 4a 4f 49 4e 20 74 32 20 4e 41 54 55  RAL JOIN t2 NATU
0510: 52 41 4c 20 4a 4f 49 4e 20 74 33 0a 20 20 7d 0a  RAL JOIN t3.  }.
0520: 7d 20 7b 31 20 31 31 20 31 31 31 20 31 31 31 31  } {1 11 111 1111
0530: 7d 0a 64 6f 5f 74 65 73 74 20 6a 6f 69 6e 32 2d  }.do_test join2-
0540: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
0550: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0560: 52 4f 4d 0a 20 20 20 20 20 20 74 31 20 4e 41 54  ROM.      t1 NAT
0570: 55 52 41 4c 20 4a 4f 49 4e 20 74 32 20 4e 41 54  URAL JOIN t2 NAT
0580: 55 52 41 4c 20 4c 45 46 54 20 4f 55 54 45 52 20  URAL LEFT OUTER 
0590: 4a 4f 49 4e 20 74 33 0a 20 20 7d 0a 7d 20 7b 31  JOIN t3.  }.} {1
05a0: 20 31 31 20 31 31 31 20 31 31 31 31 20 33 20 33   11 111 1111 3 3
05b0: 33 20 33 33 33 20 7b 7d 7d 0a 64 6f 5f 74 65 73  3 333 {}}.do_tes
05c0: 74 20 6a 6f 69 6e 32 2d 31 2e 36 20 7b 0a 20 20  t join2-1.6 {.  
05d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
05e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 0a 20 20 20 20  LECT * FROM.    
05f0: 20 20 74 31 20 4e 41 54 55 52 41 4c 20 4c 45 46    t1 NATURAL LEF
0600: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 20  T OUTER JOIN t2 
0610: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 33 0a  NATURAL JOIN t3.
0620: 20 20 7d 0a 7d 20 7b 31 20 31 31 20 31 31 31 20    }.} {1 11 111 
0630: 31 31 31 31 7d 0a 69 66 63 61 70 61 62 6c 65 20  1111}.ifcapable 
0640: 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f  subquery {.  do_
0650: 74 65 73 74 20 6a 6f 69 6e 32 2d 31 2e 37 20 7b  test join2-1.7 {
0660: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
0670: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
0680: 4f 4d 0a 20 20 20 20 20 20 20 20 74 31 20 4e 41  OM.        t1 NA
0690: 54 55 52 41 4c 20 4c 45 46 54 20 4f 55 54 45 52  TURAL LEFT OUTER
06a0: 20 4a 4f 49 4e 20 28 74 32 20 4e 41 54 55 52 41   JOIN (t2 NATURA
06b0: 4c 20 4a 4f 49 4e 20 74 33 29 0a 20 20 20 20 7d  L JOIN t3).    }
06c0: 0a 20 20 7d 20 7b 31 20 31 31 20 31 31 31 20 31  .  } {1 11 111 1
06d0: 31 31 31 20 32 20 32 32 20 7b 7d 20 7b 7d 20 33  111 2 22 {} {} 3
06e0: 20 33 33 20 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 2d   33 {} {}}.}..#-
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
0740: 20 74 68 61 74 20 74 69 63 6b 65 74 20 5b 32 35   that ticket [25
0750: 65 33 33 35 66 38 30 32 64 64 63 5d 20 68 61 73  e335f802ddc] has
0760: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
0770: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 0a  It should be an.
0780: 23 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  # error for the 
0790: 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
07a0: 45 46 54 20 4a 4f 49 4e 20 74 6f 20 72 65 66 65  EFT JOIN to refe
07b0: 72 20 74 6f 20 61 20 74 61 62 6c 65 20 74 6f 20  r to a table to 
07c0: 69 74 73 20 72 69 67 68 74 2e 0a 23 0a 64 6f 5f  its right..#.do_
07d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 30  execsql_test 2.0
07e0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
07f0: 45 20 61 61 28 61 29 3b 0a 20 20 43 52 45 41 54  E aa(a);.  CREAT
0800: 45 20 54 41 42 4c 45 20 62 62 28 62 29 3b 0a 20  E TABLE bb(b);. 
0810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 63   CREATE TABLE cc
0820: 28 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (c);.  INSERT IN
0830: 54 4f 20 61 61 20 56 41 4c 55 45 53 28 27 6f 6e  TO aa VALUES('on
0840: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
0850: 54 4f 20 62 62 20 56 41 4c 55 45 53 28 27 6f 6e  TO bb VALUES('on
0860: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
0870: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27 6f 6e  TO cc VALUES('on
0880: 65 27 29 3b 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68  e');.}..do_catch
0890: 73 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20  sql_test 2.1 {. 
08a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
08b0: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 63 20 4f  a LEFT JOIN cc O
08c0: 4e 20 28 61 3d 62 29 20 4a 4f 49 4e 20 62 62 20  N (a=b) JOIN bb 
08d0: 4f 4e 20 28 62 3d 63 6f 61 6c 65 73 63 65 28 63  ON (b=coalesce(c
08e0: 2c 31 29 29 3b 0a 7d 20 7b 31 20 7b 4f 4e 20 63  ,1));.} {1 {ON c
08f0: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 73  lause references
0900: 20 74 61 62 6c 65 73 20 74 6f 20 69 74 73 20 72   tables to its r
0910: 69 67 68 74 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  ight}}.do_catchs
0920: 71 6c 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20  ql_test 2.2 {.  
0930: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 61  SELECT * FROM aa
0940: 20 4a 4f 49 4e 20 63 63 20 4f 4e 20 28 61 3d 62   JOIN cc ON (a=b
0950: 29 20 4a 4f 49 4e 20 62 62 20 4f 4e 20 28 62 3d  ) JOIN bb ON (b=
0960: 63 29 3b 0a 7d 20 7b 30 20 7b 6f 6e 65 20 6f 6e  c);.} {0 {one on
0970: 65 20 6f 6e 65 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  e one}}..#------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
09d0: 61 20 70 72 6f 62 6c 65 6d 20 63 61 75 73 69 6e  a problem causin
09e0: 67 20 77 68 65 72 65 2e 63 20 74 6f 20 6f 76 65  g where.c to ove
09f0: 72 6c 6f 6f 6b 20 6f 70 70 6f 72 74 75 6e 69 74  rlook opportunit
0a00: 69 65 73 20 74 6f 0a 23 20 6f 6d 69 74 20 75 6e  ies to.# omit un
0a10: 6e 65 63 65 73 73 61 72 79 20 74 61 62 6c 65 73  necessary tables
0a20: 20 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49   from a LEFT JOI
0a30: 4e 20 77 68 65 6e 20 55 4e 49 51 55 45 2c 20 4e  N when UNIQUE, N
0a40: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 20 0a  OT NULL column .
0a50: 23 20 74 68 61 74 20 6d 61 6b 65 73 20 74 68 69  # that makes thi
0a60: 73 20 70 6f 73 73 69 62 6c 65 20 68 61 70 70 65  s possible happe
0a70: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 6c 65 66  ns to be the lef
0a80: 74 6d 6f 73 74 20 69 6e 20 69 74 73 20 74 61 62  tmost in its tab
0a90: 6c 65 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  le..#.reset_db.d
0aa0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
0ab0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
0ac0: 42 4c 45 20 74 31 28 6b 31 20 49 4e 54 45 47 45  BLE t1(k1 INTEGE
0ad0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6b  R PRIMARY KEY, k
0ae0: 32 2c 20 6b 33 29 3b 0a 20 20 43 52 45 41 54 45  2, k3);.  CREATE
0af0: 20 54 41 42 4c 45 20 74 32 28 6b 32 20 49 4e 54   TABLE t2(k2 INT
0b00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0b10: 2c 20 76 32 29 3b 0a 0a 20 20 2d 2d 20 50 72 69  , v2);..  -- Pri
0b20: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 62 6c  or to this probl
0b30: 65 6d 20 62 65 69 6e 67 20 66 69 78 65 64 2c 20  em being fixed, 
0b40: 74 61 62 6c 65 20 74 33 5f 32 20 77 6f 75 6c 64  table t3_2 would
0b50: 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   be omitted from
0b60: 0a 20 20 2d 2d 20 74 68 65 20 6a 6f 69 6e 20 71  .  -- the join q
0b70: 75 65 72 69 65 73 20 62 65 6c 6f 77 2c 20 62 75  ueries below, bu
0b80: 74 20 69 66 20 74 33 5f 31 20 77 65 72 65 20 75  t if t3_1 were u
0b90: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
0ba0: 20 69 74 20 77 6f 75 6c 64 0a 20 20 2d 2d 20 6e   it would.  -- n
0bb0: 6f 74 2e 0a 20 20 43 52 45 41 54 45 20 54 41 42  ot..  CREATE TAB
0bc0: 4c 45 20 74 33 5f 31 28 6b 33 20 50 52 49 4d 41  LE t3_1(k3 PRIMA
0bd0: 52 59 20 4b 45 59 2c 20 76 33 29 20 57 49 54 48  RY KEY, v3) WITH
0be0: 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43 52 45  OUT ROWID;.  CRE
0bf0: 41 54 45 20 54 41 42 4c 45 20 74 33 5f 32 28 76  ATE TABLE t3_2(v
0c00: 33 2c 20 6b 33 20 50 52 49 4d 41 52 59 20 4b 45  3, k3 PRIMARY KE
0c10: 59 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  Y) WITHOUT ROWID
0c20: 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74  ;.}..do_eqp_test
0c30: 20 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20   3.1 {.  SELECT 
0c40: 76 32 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20  v2 FROM t1 LEFT 
0c50: 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28 6b  JOIN t2 USING (k
0c60: 32 29 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 5f  2) LEFT JOIN t3_
0c70: 31 20 55 53 49 4e 47 20 28 6b 33 29 3b 0a 7d 20  1 USING (k3);.} 
0c80: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
0c90: 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 30 20 31  TABLE t1} .  0 1
0ca0: 20 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   1 {SEARCH TABLE
0cb0: 20 74 32 20 55 53 49 4e 47 20 49 4e 54 45 47 45   t2 USING INTEGE
0cc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
0cd0: 6f 77 69 64 3d 3f 29 7d 0a 7d 0a 0a 64 6f 5f 65  owid=?)}.}..do_e
0ce0: 71 70 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20  qp_test 3.2 {.  
0cf0: 53 45 4c 45 43 54 20 76 32 20 46 52 4f 4d 20 74  SELECT v2 FROM t
0d00: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 55  1 LEFT JOIN t2 U
0d10: 53 49 4e 47 20 28 6b 32 29 20 4c 45 46 54 20 4a  SING (k2) LEFT J
0d20: 4f 49 4e 20 74 33 5f 32 20 55 53 49 4e 47 20 28  OIN t3_2 USING (
0d30: 6b 33 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30  k3);.} {.  0 0 0
0d40: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
0d50: 20 0a 20 20 30 20 31 20 31 20 7b 53 45 41 52 43   .  0 1 1 {SEARC
0d60: 48 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47  H TABLE t2 USING
0d70: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0d80: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a   KEY (rowid=?)}.
0d90: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0de0: 54 65 73 74 20 74 68 61 74 20 74 61 62 6c 65 73  Test that tables
0df0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
0e00: 72 69 67 68 74 6d 6f 73 74 20 63 61 6e 20 62 65  rightmost can be
0e10: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 0a   omitted from a.
0e20: 23 20 4c 45 46 54 20 4a 4f 49 4e 20 71 75 65 72  # LEFT JOIN quer
0e30: 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  y..#.do_execsql_
0e40: 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 43 52 45  test 4.0 {.  CRE
0e50: 41 54 45 20 54 41 42 4c 45 20 63 31 28 6b 20 49  ATE TABLE c1(k I
0e60: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0e70: 45 59 2c 20 76 31 29 3b 0a 20 20 43 52 45 41 54  EY, v1);.  CREAT
0e80: 45 20 54 41 42 4c 45 20 63 32 28 6b 20 49 4e 54  E TABLE c2(k INT
0e90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0ea0: 2c 20 76 32 29 3b 0a 20 20 43 52 45 41 54 45 20  , v2);.  CREATE 
0eb0: 54 41 42 4c 45 20 63 33 28 6b 20 49 4e 54 45 47  TABLE c3(k INTEG
0ec0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
0ed0: 76 33 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49  v3);..  INSERT I
0ee0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c  NTO c1 VALUES(1,
0ef0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
0f00: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 2c 20  TO c2 VALUES(2, 
0f10: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
0f20: 4f 20 63 33 20 56 41 4c 55 45 53 28 33 2c 20 27  O c3 VALUES(3, '
0f30: 76 33 27 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  v3');..  INSERT 
0f40: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31  INTO c1 VALUES(1
0f50: 31 31 2c 20 31 31 31 32 29 3b 0a 20 20 49 4e 53  11, 1112);.  INS
0f60: 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55  ERT INTO c2 VALU
0f70: 45 53 28 31 31 32 2c 20 31 31 31 33 29 3b 0a 20  ES(112, 1113);. 
0f80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
0f90: 56 41 4c 55 45 53 28 31 31 33 2c 20 27 76 31 31  VALUES(113, 'v11
0fa0: 31 33 27 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73  13');.}.do_execs
0fb0: 71 6c 5f 74 65 73 74 20 34 2e 31 2e 31 20 7b 0a  ql_test 4.1.1 {.
0fc0: 20 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33 20    SELECT v1, v3 
0fd0: 46 52 4f 4d 20 63 31 20 4c 45 46 54 20 4a 4f 49  FROM c1 LEFT JOI
0fe0: 4e 20 63 32 20 4f 4e 20 28 63 32 2e 6b 3d 76 31  N c2 ON (c2.k=v1
0ff0: 29 20 4c 45 46 54 20 4a 4f 49 4e 20 63 33 20 4f  ) LEFT JOIN c3 O
1000: 4e 20 28 63 33 2e 6b 3d 76 32 29 3b 0a 7d 20 7b  N (c3.k=v2);.} {
1010: 32 20 76 33 20 31 31 31 32 20 7b 7d 7d 0a 64 6f  2 v3 1112 {}}.do
1020: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
1030: 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 76  1.2 {.  SELECT v
1040: 31 2c 20 76 33 20 46 52 4f 4d 20 63 31 20 4c 45  1, v3 FROM c1 LE
1050: 46 54 20 4a 4f 49 4e 20 63 32 20 4f 4e 20 28 63  FT JOIN c2 ON (c
1060: 32 2e 6b 3d 76 31 29 20 4c 45 46 54 20 4a 4f 49  2.k=v1) LEFT JOI
1070: 4e 20 63 33 20 4f 4e 20 28 63 33 2e 6b 3d 76 31  N c3 ON (c3.k=v1
1080: 2b 31 29 3b 0a 7d 20 7b 32 20 76 33 20 31 31 31  +1);.} {2 v3 111
1090: 32 20 7b 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  2 {}}..do_execsq
10a0: 6c 5f 74 65 73 74 20 34 2e 31 2e 33 20 7b 0a 20  l_test 4.1.3 {. 
10b0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
10c0: 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 63 31 20   v1, v3 FROM c1 
10d0: 4c 45 46 54 20 4a 4f 49 4e 20 63 32 20 4c 45 46  LEFT JOIN c2 LEF
10e0: 54 20 4a 4f 49 4e 20 63 33 20 4f 4e 20 28 63 33  T JOIN c3 ON (c3
10f0: 2e 6b 3d 76 31 2b 31 29 3b 0a 7d 20 7b 32 20 76  .k=v1+1);.} {2 v
1100: 33 20 31 31 31 32 20 7b 7d 7d 0a 0a 64 6f 5f 65  3 1112 {}}..do_e
1110: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e  xecsql_test 4.1.
1120: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 76 31 2c  4 {.  SELECT v1,
1130: 20 76 33 20 46 52 4f 4d 20 63 31 20 4c 45 46 54   v3 FROM c1 LEFT
1140: 20 4a 4f 49 4e 20 63 32 20 4c 45 46 54 20 4a 4f   JOIN c2 LEFT JO
1150: 49 4e 20 63 33 20 4f 4e 20 28 63 33 2e 6b 3d 76  IN c3 ON (c3.k=v
1160: 31 2b 31 29 3b 0a 7d 20 7b 32 20 76 33 20 32 20  1+1);.} {2 v3 2 
1170: 76 33 20 31 31 31 32 20 7b 7d 20 31 31 31 32 20  v3 1112 {} 1112 
1180: 7b 7d 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74  {}}..do_eqp_test
1190: 20 34 2e 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43   4.1.5 {.  SELEC
11a0: 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 63 31  T v1, v3 FROM c1
11b0: 20 4c 45 46 54 20 4a 4f 49 4e 20 63 32 20 4f 4e   LEFT JOIN c2 ON
11c0: 20 28 63 32 2e 6b 3d 76 31 29 20 4c 45 46 54 20   (c2.k=v1) LEFT 
11d0: 4a 4f 49 4e 20 63 33 20 4f 4e 20 28 63 33 2e 6b  JOIN c3 ON (c3.k
11e0: 3d 76 32 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  =v2);.} {.  0 0 
11f0: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 63 31  0 {SCAN TABLE c1
1200: 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 45 41 52  } .  0 1 1 {SEAR
1210: 43 48 20 54 41 42 4c 45 20 63 32 20 55 53 49 4e  CH TABLE c2 USIN
1220: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1230: 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d  Y KEY (rowid=?)}
1240: 0a 20 20 30 20 32 20 32 20 7b 53 45 41 52 43 48  .  0 2 2 {SEARCH
1250: 20 54 41 42 4c 45 20 63 33 20 55 53 49 4e 47 20   TABLE c3 USING 
1260: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1270: 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a 7d  KEY (rowid=?)}.}
1280: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 31  .do_eqp_test 4.1
1290: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 76 31  .6 {.  SELECT v1
12a0: 2c 20 76 33 20 46 52 4f 4d 20 63 31 20 4c 45 46  , v3 FROM c1 LEF
12b0: 54 20 4a 4f 49 4e 20 63 32 20 4f 4e 20 28 63 32  T JOIN c2 ON (c2
12c0: 2e 6b 3d 76 31 29 20 4c 45 46 54 20 4a 4f 49 4e  .k=v1) LEFT JOIN
12d0: 20 63 33 20 4f 4e 20 28 63 33 2e 6b 3d 76 31 2b   c3 ON (c3.k=v1+
12e0: 31 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20  1);.} {.  0 0 0 
12f0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 63 31 7d 20  {SCAN TABLE c1} 
1300: 0a 20 20 30 20 31 20 32 20 7b 53 45 41 52 43 48  .  0 1 2 {SEARCH
1310: 20 54 41 42 4c 45 20 63 33 20 55 53 49 4e 47 20   TABLE c3 USING 
1320: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1330: 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a 7d  KEY (rowid=?)}.}
1340: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1350: 74 20 34 2e 32 2e 30 20 7b 0a 20 20 44 52 4f 50  t 4.2.0 {.  DROP
1360: 20 54 41 42 4c 45 20 63 31 3b 0a 20 20 44 52 4f   TABLE c1;.  DRO
1370: 50 20 54 41 42 4c 45 20 63 32 3b 0a 20 20 44 52  P TABLE c2;.  DR
1380: 4f 50 20 54 41 42 4c 45 20 63 33 3b 0a 20 20 43  OP TABLE c3;.  C
1390: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 6b  REATE TABLE c1(k
13a0: 20 55 4e 49 51 55 45 2c 20 76 31 29 3b 0a 20 20   UNIQUE, v1);.  
13b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
13c0: 6b 20 55 4e 49 51 55 45 2c 20 76 32 29 3b 0a 20  k UNIQUE, v2);. 
13d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33   CREATE TABLE c3
13e0: 28 6b 20 55 4e 49 51 55 45 2c 20 76 33 29 3b 0a  (k UNIQUE, v3);.
13f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
1400: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
1410: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32    INSERT INTO c2
1420: 20 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20   VALUES(2, 3);. 
1430: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
1440: 56 41 4c 55 45 53 28 33 2c 20 27 76 33 27 29 3b  VALUES(3, 'v3');
1450: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
1460: 63 31 20 56 41 4c 55 45 53 28 31 31 31 2c 20 31  c1 VALUES(111, 1
1470: 31 31 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  112);.  INSERT I
1480: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 31  NTO c2 VALUES(11
1490: 32 2c 20 31 31 31 33 29 3b 0a 20 20 49 4e 53 45  2, 1113);.  INSE
14a0: 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
14b0: 53 28 31 31 33 2c 20 27 76 31 31 31 33 27 29 3b  S(113, 'v1113');
14c0: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
14d0: 73 74 20 34 2e 32 2e 31 20 7b 0a 20 20 53 45 4c  st 4.2.1 {.  SEL
14e0: 45 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20  ECT v1, v3 FROM 
14f0: 63 31 20 4c 45 46 54 20 4a 4f 49 4e 20 63 32 20  c1 LEFT JOIN c2 
1500: 4f 4e 20 28 63 32 2e 6b 3d 76 31 29 20 4c 45 46  ON (c2.k=v1) LEF
1510: 54 20 4a 4f 49 4e 20 63 33 20 4f 4e 20 28 63 33  T JOIN c3 ON (c3
1520: 2e 6b 3d 76 32 29 3b 0a 7d 20 7b 32 20 76 33 20  .k=v2);.} {2 v3 
1530: 31 31 31 32 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63  1112 {}}.do_exec
1540: 73 71 6c 5f 74 65 73 74 20 34 2e 32 2e 32 20 7b  sql_test 4.2.2 {
1550: 0a 20 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33  .  SELECT v1, v3
1560: 20 46 52 4f 4d 20 63 31 20 4c 45 46 54 20 4a 4f   FROM c1 LEFT JO
1570: 49 4e 20 63 32 20 4f 4e 20 28 63 32 2e 6b 3d 76  IN c2 ON (c2.k=v
1580: 31 29 20 4c 45 46 54 20 4a 4f 49 4e 20 63 33 20  1) LEFT JOIN c3 
1590: 4f 4e 20 28 63 33 2e 6b 3d 76 31 2b 31 29 3b 0a  ON (c3.k=v1+1);.
15a0: 7d 20 7b 32 20 76 33 20 31 31 31 32 20 7b 7d 7d  } {2 v3 1112 {}}
15b0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
15c0: 74 20 34 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45  t 4.2.3 {.  SELE
15d0: 43 54 20 44 49 53 54 49 4e 43 54 20 76 31 2c 20  CT DISTINCT v1, 
15e0: 76 33 20 46 52 4f 4d 20 63 31 20 4c 45 46 54 20  v3 FROM c1 LEFT 
15f0: 4a 4f 49 4e 20 63 32 20 4c 45 46 54 20 4a 4f 49  JOIN c2 LEFT JOI
1600: 4e 20 63 33 20 4f 4e 20 28 63 33 2e 6b 3d 76 31  N c3 ON (c3.k=v1
1610: 2b 31 29 3b 0a 7d 20 7b 32 20 76 33 20 31 31 31  +1);.} {2 v3 111
1620: 32 20 7b 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  2 {}}..do_execsq
1630: 6c 5f 74 65 73 74 20 34 2e 32 2e 34 20 7b 0a 20  l_test 4.2.4 {. 
1640: 20 53 45 4c 45 43 54 20 76 31 2c 20 76 33 20 46   SELECT v1, v3 F
1650: 52 4f 4d 20 63 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM c1 LEFT JOIN
1660: 20 63 32 20 4c 45 46 54 20 4a 4f 49 4e 20 63 33   c2 LEFT JOIN c3
1670: 20 4f 4e 20 28 63 33 2e 6b 3d 76 31 2b 31 29 3b   ON (c3.k=v1+1);
1680: 0a 7d 20 7b 32 20 76 33 20 32 20 76 33 20 31 31  .} {2 v3 2 v3 11
1690: 31 32 20 7b 7d 20 31 31 31 32 20 7b 7d 7d 0a 0a  12 {} 1112 {}}..
16a0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 32 2e  do_eqp_test 4.2.
16b0: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 76 31 2c  5 {.  SELECT v1,
16c0: 20 76 33 20 46 52 4f 4d 20 63 31 20 4c 45 46 54   v3 FROM c1 LEFT
16d0: 20 4a 4f 49 4e 20 63 32 20 4f 4e 20 28 63 32 2e   JOIN c2 ON (c2.
16e0: 6b 3d 76 31 29 20 4c 45 46 54 20 4a 4f 49 4e 20  k=v1) LEFT JOIN 
16f0: 63 33 20 4f 4e 20 28 63 33 2e 6b 3d 76 32 29 3b  c3 ON (c3.k=v2);
1700: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
1710: 41 4e 20 54 41 42 4c 45 20 63 31 7d 20 0a 20 20  AN TABLE c1} .  
1720: 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41  0 1 1 {SEARCH TA
1730: 42 4c 45 20 63 32 20 55 53 49 4e 47 20 49 4e 44  BLE c2 USING IND
1740: 45 58 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  EX sqlite_autoin
1750: 64 65 78 5f 63 32 5f 31 20 28 6b 3d 3f 29 7d 0a  dex_c2_1 (k=?)}.
1760: 20 20 30 20 32 20 32 20 7b 53 45 41 52 43 48 20    0 2 2 {SEARCH 
1770: 54 41 42 4c 45 20 63 33 20 55 53 49 4e 47 20 49  TABLE c3 USING I
1780: 4e 44 45 58 20 73 71 6c 69 74 65 5f 61 75 74 6f  NDEX sqlite_auto
1790: 69 6e 64 65 78 5f 63 33 5f 31 20 28 6b 3d 3f 29  index_c3_1 (k=?)
17a0: 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  }.}.do_eqp_test 
17b0: 34 2e 32 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  4.2.6 {.  SELECT
17c0: 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 63 31 20   v1, v3 FROM c1 
17d0: 4c 45 46 54 20 4a 4f 49 4e 20 63 32 20 4f 4e 20  LEFT JOIN c2 ON 
17e0: 28 63 32 2e 6b 3d 76 31 29 20 4c 45 46 54 20 4a  (c2.k=v1) LEFT J
17f0: 4f 49 4e 20 63 33 20 4f 4e 20 28 63 33 2e 6b 3d  OIN c3 ON (c3.k=
1800: 76 31 2b 31 29 3b 0a 7d 20 7b 0a 20 20 30 20 30  v1+1);.} {.  0 0
1810: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 63   0 {SCAN TABLE c
1820: 31 7d 20 0a 20 20 30 20 31 20 32 20 7b 53 45 41  1} .  0 1 2 {SEA
1830: 52 43 48 20 54 41 42 4c 45 20 63 33 20 55 53 49  RCH TABLE c3 USI
1840: 4e 47 20 49 4e 44 45 58 20 73 71 6c 69 74 65 5f  NG INDEX sqlite_
1850: 61 75 74 6f 69 6e 64 65 78 5f 63 33 5f 31 20 28  autoindex_c3_1 (
1860: 6b 3d 3f 29 7d 0a 7d 0a 0a 23 20 32 30 31 37 2d  k=?)}.}..# 2017-
1870: 31 31 2d 32 33 20 28 54 68 61 6e 6b 73 67 69 76  11-23 (Thanksgiv
1880: 69 6e 67 20 64 61 79 29 0a 23 20 4f 53 53 46 75  ing day).# OSSFu
1890: 7a 7a 20 66 6f 75 6e 64 20 61 6e 20 61 73 73 65  zz found an asse
18a0: 72 74 69 6f 6e 20 66 61 75 6c 74 20 69 6e 20 74  rtion fault in t
18b0: 68 65 20 6e 65 77 20 4c 45 46 54 20 4a 4f 49 4e  he new LEFT JOIN
18c0: 20 65 6c 69 6d 69 6e 61 74 6f 72 20 63 6f 64 65   eliminator code
18d0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
18e0: 65 73 74 20 34 2e 33 2e 30 20 7b 0a 20 20 44 52  est 4.3.0 {.  DR
18f0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
1900: 54 53 20 74 31 3b 0a 20 20 44 52 4f 50 20 54 41  TS t1;.  DROP TA
1910: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32  BLE IF EXISTS t2
1920: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1930: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
1940: 59 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  Y) WITHOUT ROWID
1950: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1960: 20 74 32 28 78 29 3b 0a 20 20 53 45 4c 45 43 54   t2(x);.  SELECT
1970: 20 61 2e 78 0a 20 20 20 20 46 52 4f 4d 20 74 31   a.x.    FROM t1
1980: 20 41 53 20 61 0a 20 20 20 20 4c 45 46 54 20 4a   AS a.    LEFT J
1990: 4f 49 4e 20 74 31 20 41 53 20 62 20 4f 4e 20 28  OIN t1 AS b ON (
19a0: 61 2e 78 3d 62 2e 78 29 0a 20 20 20 20 4c 45 46  a.x=b.x).    LEF
19b0: 54 20 4a 4f 49 4e 20 74 32 20 41 53 20 63 20 4f  T JOIN t2 AS c O
19c0: 4e 20 28 61 2e 78 3d 63 2e 78 29 3b 0a 7d 20 7b  N (a.x=c.x);.} {
19d0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
19e0: 74 20 34 2e 33 2e 31 20 7b 0a 20 20 57 49 54 48  t 4.3.1 {.  WITH
19f0: 20 52 45 43 55 52 53 49 56 45 20 63 28 78 29 20   RECURSIVE c(x) 
1a00: 41 53 20 28 56 41 4c 55 45 53 28 31 29 20 55 4e  AS (VALUES(1) UN
1a10: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78  ION ALL SELECT x
1a20: 2b 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20  +1 FROM c WHERE 
1a30: 78 3c 31 30 29 0a 20 20 20 20 49 4e 53 45 52 54  x<10).    INSERT
1a40: 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45   INTO t1(x) SELE
1a50: 43 54 20 78 20 46 52 4f 4d 20 63 3b 0a 20 20 49  CT x FROM c;.  I
1a60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 78 29  NSERT INTO t2(x)
1a70: 20 53 45 4c 45 43 54 20 78 2b 39 20 46 52 4f 4d   SELECT x+9 FROM
1a80: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 61 2e   t1;.  SELECT a.
1a90: 78 2c 20 63 2e 78 0a 20 20 20 20 46 52 4f 4d 20  x, c.x.    FROM 
1aa0: 74 31 20 41 53 20 61 0a 20 20 20 20 4c 45 46 54  t1 AS a.    LEFT
1ab0: 20 4a 4f 49 4e 20 74 31 20 41 53 20 62 20 4f 4e   JOIN t1 AS b ON
1ac0: 20 28 61 2e 78 3d 62 2e 78 29 0a 20 20 20 20 4c   (a.x=b.x).    L
1ad0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 41 53 20 63  EFT JOIN t2 AS c
1ae0: 20 4f 4e 20 28 61 2e 78 3d 63 2e 78 29 3b 0a 7d   ON (a.x=c.x);.}
1af0: 20 7b 31 20 7b 7d 20 32 20 7b 7d 20 33 20 7b 7d   {1 {} 2 {} 3 {}
1b00: 20 34 20 7b 7d 20 35 20 7b 7d 20 36 20 7b 7d 20   4 {} 5 {} 6 {} 
1b10: 37 20 7b 7d 20 38 20 7b 7d 20 39 20 7b 7d 20 31  7 {} 8 {} 9 {} 1
1b20: 30 20 31 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  0 10}..do_execsq
1b30: 6c 5f 74 65 73 74 20 35 2e 30 20 7b 0a 20 20 43  l_test 5.0 {.  C
1b40: 52 45 41 54 45 20 54 41 42 4c 45 20 73 31 20 28  REATE TABLE s1 (
1b50: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
1b60: 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45  Y KEY);.  CREATE
1b70: 20 54 41 42 4c 45 20 73 32 20 28 61 20 49 4e 54   TABLE s2 (a INT
1b80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1b90: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
1ba0: 45 20 73 33 20 28 61 20 49 4e 54 45 47 45 52 29  E s3 (a INTEGER)
1bb0: 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55  ;.  CREATE UNIQU
1bc0: 45 20 49 4e 44 45 58 20 6e 64 78 20 6f 6e 20 73  E INDEX ndx on s
1bd0: 33 28 61 29 3b 0a 7d 0a 64 6f 5f 65 71 70 5f 74  3(a);.}.do_eqp_t
1be0: 65 73 74 20 35 2e 31 20 7b 0a 20 20 53 45 4c 45  est 5.1 {.  SELE
1bf0: 43 54 20 73 31 2e 61 20 46 52 4f 4d 20 73 31 20  CT s1.a FROM s1 
1c00: 6c 65 66 74 20 6a 6f 69 6e 20 73 32 20 75 73 69  left join s2 usi
1c10: 6e 67 20 28 61 29 3b 0a 7d 20 7b 0a 20 20 30 20  ng (a);.} {.  0 
1c20: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
1c30: 73 31 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  s1}.}.do_eqp_tes
1c40: 74 20 35 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 5.2 {.  SELECT
1c50: 20 73 31 2e 61 20 46 52 4f 4d 20 73 31 20 6c 65   s1.a FROM s1 le
1c60: 66 74 20 6a 6f 69 6e 20 73 33 20 75 73 69 6e 67  ft join s3 using
1c70: 20 28 61 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20   (a);.} {.  0 0 
1c80: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 73 31  0 {SCAN TABLE s1
1c90: 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }.}..do_execsql_
1ca0: 74 65 73 74 20 36 2e 30 20 7b 0a 20 20 43 52 45  test 6.0 {.  CRE
1cb0: 41 54 45 20 54 41 42 4c 45 20 75 31 28 61 20 49  ATE TABLE u1(a I
1cc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1cd0: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45  EY, b, c);.  CRE
1ce0: 41 54 45 20 54 41 42 4c 45 20 75 32 28 61 20 49  ATE TABLE u2(a I
1cf0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1d00: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45  EY, b, c);.  CRE
1d10: 41 54 45 20 49 4e 44 45 58 20 75 31 61 62 20 4f  ATE INDEX u1ab O
1d20: 4e 20 75 31 28 62 2c 20 63 29 3b 0a 7d 0a 64 6f  N u1(b, c);.}.do
1d30: 5f 65 71 70 5f 74 65 73 74 20 36 2e 31 20 7b 0a  _eqp_test 6.1 {.
1d40: 20 20 53 45 4c 45 43 54 20 75 32 2e 2a 20 46 52    SELECT u2.* FR
1d50: 4f 4d 20 75 32 20 4c 45 46 54 20 4a 4f 49 4e 20  OM u2 LEFT JOIN 
1d60: 75 31 20 4f 4e 28 20 75 31 2e 61 3d 75 32 2e 61  u1 ON( u1.a=u2.a
1d70: 20 41 4e 44 20 75 31 2e 62 3d 75 32 2e 62 20 41   AND u1.b=u2.b A
1d80: 4e 44 20 75 31 2e 63 3d 75 32 2e 63 20 29 3b 0a  ND u1.c=u2.c );.
1d90: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41  } {.  0 0 0 {SCA
1da0: 4e 20 54 41 42 4c 45 20 75 32 7d 0a 7d 0a 0a 64  N TABLE u2}.}..d
1db0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
1dc0: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 6f 5f 65  db :memory:.do_e
1dd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 30 20  xecsql_test 7.0 
1de0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1df0: 20 74 31 28 61 2c 62 29 3b 20 20 49 4e 53 45 52   t1(a,b);  INSER
1e00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1e10: 28 31 2c 32 29 2c 28 33 2c 34 29 2c 28 35 2c 36  (1,2),(3,4),(5,6
1e20: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
1e30: 45 20 74 32 28 63 2c 64 29 3b 20 20 49 4e 53 45  E t2(c,d);  INSE
1e40: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1e50: 53 28 32 2c 34 29 2c 28 33 2c 36 29 3b 0a 20 20  S(2,4),(3,6);.  
1e60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
1e70: 78 29 3b 20 20 20 20 49 4e 53 45 52 54 20 49 4e  x);    INSERT IN
1e80: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 39 29 3b  TO t3 VALUES(9);
1e90: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74  .  CREATE VIEW t
1ea0: 65 73 74 20 41 53 0a 20 20 20 20 53 45 4c 45 43  est AS.    SELEC
1eb0: 54 20 2a 2c 20 27 78 27 0a 20 20 20 20 20 20 46  T *, 'x'.      F
1ec0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1ed0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1ee0: 74 32 2c 20 74 33 29 20 4f 4e 20 28 63 3d 62 20  t2, t3) ON (c=b 
1ef0: 41 4e 44 20 78 3d 39 29 0a 20 20 20 20 20 20 57  AND x=9).      W
1f00: 48 45 52 45 20 63 20 49 53 20 4e 55 4c 4c 3b 0a  HERE c IS NULL;.
1f10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f20: 74 65 73 74 3b 0a 7d 20 7b 33 20 34 20 7b 7d 20  test;.} {3 4 {} 
1f30: 7b 7d 20 7b 7d 20 78 20 35 20 36 20 7b 7d 20 7b  {} {} x 5 6 {} {
1f40: 7d 20 7b 7d 20 78 7d 0a 0a 0a 66 69 6e 69 73 68  } {} x}...finish
1f50: 5f 74 65 73 74 0a                                _test.