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

Artifact 0618c9377013840194b7901e6224d841cd3e7193:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 55 4e 49 4f 4e  is testing UNION
01d0: 2c 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20  , INTERSECT and 
01e0: 45 58 43 45 50 54 20 6f 70 65 72 61 74 6f 72 73  EXCEPT operators
01f0: 0a 23 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  .# in SELECT sta
0200: 74 65 6d 65 6e 74 73 2e 0a 23 0a 23 20 24 49 64  tements..#.# $Id
0210: 3a 20 73 65 6c 65 63 74 34 2e 74 65 73 74 2c 76  : select4.test,v
0220: 20 31 2e 32 38 20 32 30 30 38 2f 30 36 2f 32 35   1.28 2008/06/25
0230: 20 30 38 3a 30 32 3a 34 34 20 6d 69 68 61 69 6c   08:02:44 mihail
0240: 69 6d 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65  im Exp $..set te
0250: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0260: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0270: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0280: 65 72 2e 74 63 6c 0a 0a 23 20 4d 6f 73 74 20 74  er.tcl..# Most t
0290: 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
02a0: 65 20 64 65 70 65 6e 64 20 6f 6e 20 63 6f 6d 70  e depend on comp
02b0: 6f 75 6e 64 2d 73 65 6c 65 63 74 2e 20 42 75 74  ound-select. But
02c0: 20 74 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   there are a cou
02d0: 70 6c 65 0a 23 20 72 69 67 68 74 20 61 74 20 74  ple.# right at t
02e0: 68 65 20 65 6e 64 20 74 68 61 74 20 74 65 73 74  he end that test
02f0: 20 44 49 53 54 49 4e 43 54 2c 20 73 6f 20 77 65   DISTINCT, so we
0300: 20 63 61 6e 6e 6f 74 20 6f 6d 69 74 20 74 68 65   cannot omit the
0310: 20 65 6e 74 69 72 65 20 66 69 6c 65 2e 0a 23 0a   entire file..#.
0320: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
0330: 6e 64 20 7b 0a 0a 23 20 42 75 69 6c 64 20 73 6f  nd {..# Build so
0340: 6d 65 20 74 65 73 74 20 64 61 74 61 0a 23 0a 65  me test data.#.e
0350: 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54  xecsql {.  CREAT
0360: 45 20 54 41 42 4c 45 20 74 31 28 6e 20 69 6e 74  E TABLE t1(n int
0370: 2c 20 6c 6f 67 20 69 6e 74 29 3b 0a 20 20 42 45  , log int);.  BE
0380: 47 49 4e 3b 0a 7d 0a 66 6f 72 20 7b 73 65 74 20  GIN;.}.for {set 
0390: 69 20 31 7d 20 7b 24 69 3c 33 32 7d 20 7b 69 6e  i 1} {$i<32} {in
03a0: 63 72 20 69 7d 20 7b 0a 20 20 66 6f 72 20 7b 73  cr i} {.  for {s
03b0: 65 74 20 6a 20 30 7d 20 7b 28 31 3c 3c 24 6a 29  et j 0} {(1<<$j)
03c0: 3c 24 69 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 7d  <$i} {incr j} {}
03d0: 0a 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45  .  execsql "INSE
03e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
03f0: 53 28 24 69 2c 24 6a 29 22 0a 7d 0a 65 78 65 63  S($i,$j)".}.exec
0400: 73 71 6c 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  sql {.  COMMIT;.
0410: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  }..do_test selec
0420: 74 34 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73  t4-1.0 {.  execs
0430: 71 6c 20 7b 53 45 4c 45 43 54 20 44 49 53 54 49  ql {SELECT DISTI
0440: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20  NCT log FROM t1 
0450: 4f 52 44 45 52 20 42 59 20 6c 6f 67 7d 0a 7d 20  ORDER BY log}.} 
0460: 7b 30 20 31 20 32 20 33 20 34 20 35 7d 0a 0a 23  {0 1 2 3 4 5}..#
0470: 20 55 6e 69 6f 6e 20 41 6c 6c 20 6f 70 65 72 61   Union All opera
0480: 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65  tor.#.do_test se
0490: 6c 65 63 74 34 2d 31 2e 31 61 20 7b 0a 20 20 6c  lect4-1.1a {.  l
04a0: 73 6f 72 74 20 5b 65 78 65 63 73 71 6c 20 7b 53  sort [execsql {S
04b0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
04c0: 6f 67 20 46 52 4f 4d 20 74 31 7d 5d 0a 7d 20 7b  og FROM t1}].} {
04d0: 30 20 31 20 32 20 33 20 34 20 35 7d 0a 64 6f 5f  0 1 2 3 4 5}.do_
04e0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e 31  test select4-1.1
04f0: 62 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 65 78 65  b {.  lsort [exe
0500: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20 46  csql {SELECT n F
0510: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
0520: 3d 33 7d 5d 0a 7d 20 7b 35 20 36 20 37 20 38 7d  =3}].} {5 6 7 8}
0530: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
0540: 2d 31 2e 31 63 20 7b 0a 20 20 65 78 65 63 73 71  -1.1c {.  execsq
0550: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
0560: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
0570: 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t1.    UNION AL
0580: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46  L.    SELECT n F
0590: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
05a0: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
05b0: 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20  log;.  }.} {0 1 
05c0: 32 20 33 20 34 20 35 20 35 20 36 20 37 20 38 7d  2 3 4 5 5 6 7 8}
05d0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
05e0: 2d 31 2e 31 64 20 7b 0a 20 20 65 78 65 63 73 71  -1.1d {.  execsq
05f0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0600: 41 42 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20  ABLE t2 AS.     
0610: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0620: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
0630: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
0640: 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d     SELECT n FROM
0650: 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a   t1 WHERE log=3.
0660: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c        ORDER BY l
0670: 6f 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  og;.    SELECT *
0680: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
0690: 7b 30 20 31 20 32 20 33 20 34 20 35 20 35 20 36  {0 1 2 3 4 5 5 6
06a0: 20 37 20 38 7d 0a 65 78 65 63 73 71 6c 20 7b 44   7 8}.execsql {D
06b0: 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 64 6f  ROP TABLE t2}.do
06c0: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e  _test select4-1.
06d0: 31 65 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  1e {.  execsql {
06e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
06f0: 45 20 74 32 20 41 53 0a 20 20 20 20 20 20 53 45  E t2 AS.      SE
0700: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
0710: 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20  g FROM t1.      
0720: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20  UNION ALL.      
0730: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
0740: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
0750: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20     ORDER BY log 
0760: 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45 43 54  DESC;.    SELECT
0770: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
0780: 7d 20 7b 38 20 37 20 36 20 35 20 35 20 34 20 33  } {8 7 6 5 5 4 3
0790: 20 32 20 31 20 30 7d 0a 65 78 65 63 73 71 6c 20   2 1 0}.execsql 
07a0: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a  {DROP TABLE t2}.
07b0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
07c0: 31 2e 31 66 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.1f {.  execsql
07d0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
07e0: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
07f0: 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  t1.    UNION ALL
0800: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52  .    SELECT n FR
0810: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
0820: 32 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33  2.  }.} {0 1 2 3
0830: 20 34 20 35 20 33 20 34 7d 0a 64 6f 5f 74 65 73   4 5 3 4}.do_tes
0840: 74 20 73 65 6c 65 63 74 34 2d 31 2e 31 67 20 7b  t select4-1.1g {
0850: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0860: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
0870: 20 41 53 20 0a 20 20 20 20 20 20 53 45 4c 45 43   AS .      SELEC
0880: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
0890: 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 55 4e 49  ROM t1.      UNI
08a0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
08b0: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
08c0: 45 52 45 20 6c 6f 67 3d 32 3b 0a 20 20 20 20 53  ERE log=2;.    S
08d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
08e0: 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33 20  .  }.} {0 1 2 3 
08f0: 34 20 35 20 33 20 34 7d 0a 65 78 65 63 73 71 6c  4 5 3 4}.execsql
0900: 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d   {DROP TABLE t2}
0910: 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75  .ifcapable subqu
0920: 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ery {.  do_test 
0930: 73 65 6c 65 63 74 34 2d 31 2e 32 20 7b 0a 20 20  select4-1.2 {.  
0940: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0950: 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f    SELECT log FRO
0960: 4d 20 74 31 20 57 48 45 52 45 20 6e 20 49 4e 20  M t1 WHERE n IN 
0970: 0a 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54  .        (SELECT
0980: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
0990: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 0a  OM t1 UNION ALL.
09a0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
09b0: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
09c0: 6c 6f 67 3d 33 29 0a 20 20 20 20 20 20 4f 52 44  log=3).      ORD
09d0: 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 20 20 7d  ER BY log;.    }
09e0: 0a 20 20 7d 20 7b 30 20 31 20 32 20 32 20 33 20  .  } {0 1 2 2 3 
09f0: 33 20 33 20 33 7d 0a 7d 0a 64 6f 5f 74 65 73 74  3 3 3}.}.do_test
0a00: 20 73 65 6c 65 63 74 34 2d 31 2e 33 20 7b 0a 20   select4-1.3 {. 
0a10: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65   set v [catch {e
0a20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0a30: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
0a40: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0a50: 59 20 6c 6f 67 0a 20 20 20 20 55 4e 49 4f 4e 20  Y log.    UNION 
0a60: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ALL.    SELECT n
0a70: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
0a80: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
0a90: 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d  Y log;.  }} msg]
0aa0: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
0ab0: 67 0a 7d 20 7b 31 20 7b 4f 52 44 45 52 20 42 59  g.} {1 {ORDER BY
0ac0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
0ad0: 6f 6d 65 20 61 66 74 65 72 20 55 4e 49 4f 4e 20  ome after UNION 
0ae0: 41 4c 4c 20 6e 6f 74 20 62 65 66 6f 72 65 7d 7d  ALL not before}}
0af0: 0a 0a 23 20 55 6e 69 6f 6e 20 6f 70 65 72 61 74  ..# Union operat
0b00: 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c  or.#.do_test sel
0b10: 65 63 74 34 2d 32 2e 31 20 7b 0a 20 20 65 78 65  ect4-2.1 {.  exe
0b20: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0b30: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
0b40: 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e  ROM t1.    UNION
0b50: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52  .    SELECT n FR
0b60: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
0b70: 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c  3.    ORDER BY l
0b80: 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32  og;.  }.} {0 1 2
0b90: 20 33 20 34 20 35 20 36 20 37 20 38 7d 0a 69 66   3 4 5 6 7 8}.if
0ba0: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
0bb0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 65 6c   {.  do_test sel
0bc0: 65 63 74 34 2d 32 2e 32 20 7b 0a 20 20 20 20 65  ect4-2.2 {.    e
0bd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
0be0: 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  ELECT log FROM t
0bf0: 31 20 57 48 45 52 45 20 6e 20 49 4e 20 0a 20 20  1 WHERE n IN .  
0c00: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 44 49        (SELECT DI
0c10: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
0c20: 74 31 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 20  t1 UNION.       
0c30: 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20    SELECT n FROM 
0c40: 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 29 0a  t1 WHERE log=3).
0c50: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c        ORDER BY l
0c60: 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  og;.    }.  } {0
0c70: 20 31 20 32 20 32 20 33 20 33 20 33 20 33 7d 0a   1 2 2 3 3 3 3}.
0c80: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
0c90: 34 2d 32 2e 33 20 7b 0a 20 20 73 65 74 20 76 20  4-2.3 {.  set v 
0ca0: 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20  [catch {execsql 
0cb0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
0cc0: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
0cd0: 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 0a 20  1 ORDER BY log. 
0ce0: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c     UNION.    SEL
0cf0: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
0d00: 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52  ERE log=3.    OR
0d10: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d  DER BY log;.  }}
0d20: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
0d30: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f 52 44  v $msg.} {1 {ORD
0d40: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
0d50: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 55  uld come after U
0d60: 4e 49 4f 4e 20 6e 6f 74 20 62 65 66 6f 72 65 7d  NION not before}
0d70: 7d 0a 0a 23 20 45 78 63 65 70 74 20 6f 70 65 72  }..# Except oper
0d80: 61 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 73  ator.#.do_test s
0d90: 65 6c 65 63 74 34 2d 33 2e 31 2e 31 20 7b 0a 20  elect4-3.1.1 {. 
0da0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0db0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
0dc0: 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 45  og FROM t1.    E
0dd0: 58 43 45 50 54 0a 20 20 20 20 53 45 4c 45 43 54  XCEPT.    SELECT
0de0: 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   n FROM t1 WHERE
0df0: 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52   log=3.    ORDER
0e00: 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b   BY log;.  }.} {
0e10: 30 20 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65  0 1 2 3 4}.do_te
0e20: 73 74 20 73 65 6c 65 63 74 34 2d 33 2e 31 2e 32  st select4-3.1.2
0e30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0e40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0e50: 74 32 20 41 53 20 0a 20 20 20 20 20 20 53 45 4c  t2 AS .      SEL
0e60: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
0e70: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 45   FROM t1.      E
0e80: 58 43 45 50 54 0a 20 20 20 20 20 20 53 45 4c 45  XCEPT.      SELE
0e90: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
0ea0: 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 20 20 4f  RE log=3.      O
0eb0: 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 20  RDER BY log;.   
0ec0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0ed0: 32 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20  2;.  }.} {0 1 2 
0ee0: 33 20 34 7d 0a 65 78 65 63 73 71 6c 20 7b 44 52  3 4}.execsql {DR
0ef0: 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 64 6f 5f  OP TABLE t2}.do_
0f00: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 33 2e 31  test select4-3.1
0f10: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0f20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0f30: 45 20 74 32 20 41 53 20 0a 20 20 20 20 20 20 53  E t2 AS .      S
0f40: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
0f50: 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20  og FROM t1.     
0f60: 20 45 58 43 45 50 54 0a 20 20 20 20 20 20 53 45   EXCEPT.      SE
0f70: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
0f80: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 20  HERE log=3.     
0f90: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 44 45   ORDER BY log DE
0fa0: 53 43 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  SC;.    SELECT *
0fb0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
0fc0: 7b 34 20 33 20 32 20 31 20 30 7d 0a 65 78 65 63  {4 3 2 1 0}.exec
0fd0: 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20  sql {DROP TABLE 
0fe0: 74 32 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75  t2}.ifcapable su
0ff0: 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65  bquery {.  do_te
1000: 73 74 20 73 65 6c 65 63 74 34 2d 33 2e 32 20 7b  st select4-3.2 {
1010: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
1020: 20 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20       SELECT log 
1030: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 20  FROM t1 WHERE n 
1040: 49 4e 20 0a 20 20 20 20 20 20 20 20 28 53 45 4c  IN .        (SEL
1050: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
1060: 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 0a   FROM t1 EXCEPT.
1070: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
1080: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
1090: 6c 6f 67 3d 33 29 0a 20 20 20 20 20 20 4f 52 44  log=3).      ORD
10a0: 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 20 20 7d  ER BY log;.    }
10b0: 0a 20 20 7d 20 7b 30 20 31 20 32 20 32 7d 0a 7d  .  } {0 1 2 2}.}
10c0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
10d0: 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 76 20 5b  -3.3 {.  set v [
10e0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
10f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
1100: 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31  INCT log FROM t1
1110: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 0a 20 20   ORDER BY log.  
1120: 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c    EXCEPT.    SEL
1130: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
1140: 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52  ERE log=3.    OR
1150: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d  DER BY log;.  }}
1160: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
1170: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f 52 44  v $msg.} {1 {ORD
1180: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
1190: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 45  uld come after E
11a0: 58 43 45 50 54 20 6e 6f 74 20 62 65 66 6f 72 65  XCEPT not before
11b0: 7d 7d 0a 0a 23 20 49 6e 74 65 72 73 65 63 74 20  }}..# Intersect 
11c0: 6f 70 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 74 65  operator.#.do_te
11d0: 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e 31  st select4-4.1.1
11e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11f0: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
1200: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20  CT log FROM t1. 
1210: 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20     INTERSECT.   
1220: 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74   SELECT n FROM t
1230: 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20  1 WHERE log=3.  
1240: 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a    ORDER BY log;.
1250: 20 20 7d 0a 7d 20 7b 35 7d 0a 0a 64 6f 5f 74 65    }.} {5}..do_te
1260: 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e 32  st select4-4.1.2
1270: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1280: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
1290: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20  CT log FROM t1. 
12a0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
12b0: 20 53 45 4c 45 43 54 20 36 0a 20 20 20 20 49 4e   SELECT 6.    IN
12c0: 54 45 52 53 45 43 54 0a 20 20 20 20 53 45 4c 45  TERSECT.    SELE
12d0: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
12e0: 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44  RE log=3.    ORD
12f0: 45 52 20 42 59 20 74 31 2e 6c 6f 67 3b 0a 20 20  ER BY t1.log;.  
1300: 7d 0a 7d 20 7b 35 20 36 7d 0a 0a 64 6f 5f 74 65  }.} {5 6}..do_te
1310: 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e 33  st select4-4.1.3
1320: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1330: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1340: 74 32 20 41 53 0a 20 20 20 20 20 20 53 45 4c 45  t2 AS.      SELE
1350: 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20  CT DISTINCT log 
1360: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c  FROM t1 UNION AL
1370: 4c 20 53 45 4c 45 43 54 20 36 0a 20 20 20 20 20  L SELECT 6.     
1380: 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 20   INTERSECT.     
1390: 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74   SELECT n FROM t
13a0: 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20  1 WHERE log=3.  
13b0: 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67      ORDER BY log
13c0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
13d0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 35  ROM t2;.  }.} {5
13e0: 20 36 7d 0a 65 78 65 63 73 71 6c 20 7b 44 52 4f   6}.execsql {DRO
13f0: 50 20 54 41 42 4c 45 20 74 32 7d 0a 64 6f 5f 74  P TABLE t2}.do_t
1400: 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e  est select4-4.1.
1410: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
1420: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1430: 20 74 32 20 41 53 0a 20 20 20 20 20 20 53 45 4c   t2 AS.      SEL
1440: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
1450: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
1460: 4c 4c 20 53 45 4c 45 43 54 20 36 0a 20 20 20 20  LL SELECT 6.    
1470: 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20    INTERSECT.    
1480: 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20    SELECT n FROM 
1490: 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20  t1 WHERE log=3. 
14a0: 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f       ORDER BY lo
14b0: 67 20 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45  g DESC;.    SELE
14c0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
14d0: 7d 0a 7d 20 7b 36 20 35 7d 0a 65 78 65 63 73 71  }.} {6 5}.execsq
14e0: 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32  l {DROP TABLE t2
14f0: 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71  }.ifcapable subq
1500: 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74  uery {.  do_test
1510: 20 73 65 6c 65 63 74 34 2d 34 2e 32 20 7b 0a 20   select4-4.2 {. 
1520: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1530: 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52     SELECT log FR
1540: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 20 49 4e  OM t1 WHERE n IN
1550: 20 0a 20 20 20 20 20 20 20 20 28 53 45 4c 45 43   .        (SELEC
1560: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
1570: 52 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54  ROM t1 INTERSECT
1580: 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  .         SELECT
1590: 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   n FROM t1 WHERE
15a0: 20 6c 6f 67 3d 33 29 0a 20 20 20 20 20 20 4f 52   log=3).      OR
15b0: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 20 20  DER BY log;.    
15c0: 7d 0a 20 20 7d 20 7b 33 7d 0a 7d 0a 64 6f 5f 74  }.  } {3}.}.do_t
15d0: 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 33 20  est select4-4.3 
15e0: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
15f0: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
1600: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1610: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  log FROM t1 ORDE
1620: 52 20 42 59 20 6c 6f 67 0a 20 20 20 20 49 4e 54  R BY log.    INT
1630: 45 52 53 45 43 54 0a 20 20 20 20 53 45 4c 45 43  ERSECT.    SELEC
1640: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
1650: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1660: 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d  R BY log;.  }} m
1670: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
1680: 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f 52 44 45 52  $msg.} {1 {ORDER
1690: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
16a0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 49 4e 54  d come after INT
16b0: 45 52 53 45 43 54 20 6e 6f 74 20 62 65 66 6f 72  ERSECT not befor
16c0: 65 7d 7d 0a 0a 23 20 56 61 72 69 6f 75 73 20 65  e}}..# Various e
16d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68  rror messages wh
16e0: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 55  ile processing U
16f0: 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53 45 43  NION or INTERSEC
1700: 54 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  T.#.do_test sele
1710: 63 74 34 2d 35 2e 31 20 7b 0a 20 20 73 65 74 20  ct4-5.1 {.  set 
1720: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
1730: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
1740: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
1750: 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t2.    UNION AL
1760: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46  L.    SELECT n F
1770: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
1780: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
1790: 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20  log;.  }} msg]. 
17a0: 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a   lappend v $msg.
17b0: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
17c0: 62 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f 74 65 73  ble: t2}}.do_tes
17d0: 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 20 7b 0a  t select4-5.2 {.
17e0: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
17f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1800: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
1810: 67 20 41 53 20 22 78 79 7a 7a 79 22 20 46 52 4f  g AS "xyzzy" FRO
1820: 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41  M t1.    UNION A
1830: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20  LL.    SELECT n 
1840: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f  FROM t1 WHERE lo
1850: 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59  g=3.    ORDER BY
1860: 20 78 79 7a 7a 79 3b 0a 20 20 7d 7d 20 6d 73 67   xyzzy;.  }} msg
1870: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
1880: 73 67 0a 7d 20 7b 30 20 7b 30 20 31 20 32 20 33  sg.} {0 {0 1 2 3
1890: 20 34 20 35 20 35 20 36 20 37 20 38 7d 7d 0a 64   4 5 5 6 7 8}}.d
18a0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
18b0: 2e 32 62 20 7b 0a 20 20 73 65 74 20 76 20 5b 63  .2b {.  set v [c
18c0: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a  atch {execsql {.
18d0: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
18e0: 4e 43 54 20 6c 6f 67 20 41 53 20 78 79 7a 7a 79  NCT log AS xyzzy
18f0: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49   FROM t1.    UNI
1900: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43  ON ALL.    SELEC
1910: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
1920: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1930: 52 20 42 59 20 22 78 79 7a 7a 79 22 3b 0a 20 20  R BY "xyzzy";.  
1940: 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  }} msg].  lappen
1950: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 30  d v $msg.} {0 {0
1960: 20 31 20 32 20 33 20 34 20 35 20 35 20 36 20 37   1 2 3 4 5 5 6 7
1970: 20 38 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c   8}}.do_test sel
1980: 65 63 74 34 2d 35 2e 32 63 20 7b 0a 20 20 73 65  ect4-5.2c {.  se
1990: 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63  t v [catch {exec
19a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
19b0: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
19c0: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
19d0: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ALL.    SELECT n
19e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
19f0: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1a00: 59 20 22 78 79 7a 7a 79 22 3b 0a 20 20 7d 7d 20  Y "xyzzy";.  }} 
1a10: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
1a20: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 31 73 74 20   $msg.} {1 {1st 
1a30: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f  ORDER BY term do
1a40: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
1a50: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
1a60: 65 73 75 6c 74 20 73 65 74 7d 7d 0a 64 6f 5f 74  esult set}}.do_t
1a70: 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 64  est select4-5.2d
1a80: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
1a90: 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  h {execsql {.   
1aa0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
1ab0: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
1ac0: 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 53   INTERSECT.    S
1ad0: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
1ae0: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
1af0: 4f 52 44 45 52 20 42 59 20 22 78 79 7a 7a 79 22  ORDER BY "xyzzy"
1b00: 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61  ;.  }} msg].  la
1b10: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
1b20: 31 20 7b 31 73 74 20 4f 52 44 45 52 20 42 59 20  1 {1st ORDER BY 
1b30: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  term does not ma
1b40: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69  tch any column i
1b50: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1b60: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  }}.do_test selec
1b70: 74 34 2d 35 2e 32 65 20 7b 0a 20 20 73 65 74 20  t4-5.2e {.  set 
1b80: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
1b90: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
1ba0: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
1bb0: 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t1.    UNION AL
1bc0: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46  L.    SELECT n F
1bd0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
1be0: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
1bf0: 6e 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c  n;.  }} msg].  l
1c00: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
1c10: 7b 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 20  {0 {0 1 2 3 4 5 
1c20: 35 20 36 20 37 20 38 7d 7d 0a 64 6f 5f 74 65 73  5 6 7 8}}.do_tes
1c30: 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 66 20 7b  t select4-5.2f {
1c40: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1c50: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1c60: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20  T log FROM t1.  
1c70: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
1c80: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
1c90: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
1ca0: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
1cb0: 20 7d 0a 7d 20 7b 30 20 7b 30 20 31 20 32 20 33   }.} {0 {0 1 2 3
1cc0: 20 34 20 35 20 35 20 36 20 37 20 38 7d 7d 0a 64   4 5 5 6 7 8}}.d
1cd0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1ce0: 2e 32 67 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .2g {.  catchsql
1cf0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
1d00: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
1d10: 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  t1.    UNION ALL
1d20: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52  .    SELECT n FR
1d30: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
1d40: 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  3.    ORDER BY 1
1d50: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 30 20 31 20  ;.  }.} {0 {0 1 
1d60: 32 20 33 20 34 20 35 20 35 20 36 20 37 20 38 7d  2 3 4 5 5 6 7 8}
1d70: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
1d80: 34 2d 35 2e 32 68 20 7b 0a 20 20 63 61 74 63 68  4-5.2h {.  catch
1d90: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1da0: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
1db0: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
1dc0: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ALL.    SELECT n
1dd0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
1de0: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1df0: 59 20 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 31  Y 2;.  }.} {1 {1
1e00: 73 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  st ORDER BY term
1e10: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
1e20: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
1e30: 6e 20 31 20 61 6e 64 20 31 7d 7d 0a 64 6f 5f 74  n 1 and 1}}.do_t
1e40: 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 69  est select4-5.2i
1e50: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1e60: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
1e70: 4e 43 54 20 31 2c 20 6c 6f 67 20 46 52 4f 4d 20  NCT 1, log FROM 
1e80: 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  t1.    UNION ALL
1e90: 0a 20 20 20 20 53 45 4c 45 43 54 20 32 2c 20 6e  .    SELECT 2, n
1ea0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
1eb0: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1ec0: 59 20 32 2c 20 31 3b 0a 20 20 7d 0a 7d 20 7b 30  Y 2, 1;.  }.} {0
1ed0: 20 7b 31 20 30 20 31 20 31 20 31 20 32 20 31 20   {1 0 1 1 1 2 1 
1ee0: 33 20 31 20 34 20 31 20 35 20 32 20 35 20 32 20  3 1 4 1 5 2 5 2 
1ef0: 36 20 32 20 37 20 32 20 38 7d 7d 0a 64 6f 5f 74  6 2 7 2 8}}.do_t
1f00: 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 6a  est select4-5.2j
1f10: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1f20: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
1f30: 4e 43 54 20 31 2c 20 6c 6f 67 20 46 52 4f 4d 20  NCT 1, log FROM 
1f40: 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  t1.    UNION ALL
1f50: 0a 20 20 20 20 53 45 4c 45 43 54 20 32 2c 20 6e  .    SELECT 2, n
1f60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
1f70: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1f80: 59 20 31 2c 20 32 20 44 45 53 43 3b 0a 20 20 7d  Y 1, 2 DESC;.  }
1f90: 0a 7d 20 7b 30 20 7b 31 20 35 20 31 20 34 20 31  .} {0 {1 5 1 4 1
1fa0: 20 33 20 31 20 32 20 31 20 31 20 31 20 30 20 32   3 1 2 1 1 1 0 2
1fb0: 20 38 20 32 20 37 20 32 20 36 20 32 20 35 7d 7d   8 2 7 2 6 2 5}}
1fc0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
1fd0: 2d 35 2e 32 6b 20 7b 0a 20 20 63 61 74 63 68 73  -5.2k {.  catchs
1fe0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1ff0: 44 49 53 54 49 4e 43 54 20 31 2c 20 6c 6f 67 20  DISTINCT 1, log 
2000: 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f  FROM t1.    UNIO
2010: 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54  N ALL.    SELECT
2020: 20 32 2c 20 6e 20 46 52 4f 4d 20 74 31 20 57 48   2, n FROM t1 WH
2030: 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52  ERE log=3.    OR
2040: 44 45 52 20 42 59 20 6e 2c 20 31 3b 0a 20 20 7d  DER BY n, 1;.  }
2050: 0a 7d 20 7b 30 20 7b 31 20 30 20 31 20 31 20 31  .} {0 {1 0 1 1 1
2060: 20 32 20 31 20 33 20 31 20 34 20 31 20 35 20 32   2 1 3 1 4 1 5 2
2070: 20 35 20 32 20 36 20 32 20 37 20 32 20 38 7d 7d   5 2 6 2 7 2 8}}
2080: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
2090: 2d 35 2e 33 20 7b 0a 20 20 73 65 74 20 76 20 5b  -5.3 {.  set v [
20a0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
20b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
20c0: 49 4e 43 54 20 6c 6f 67 2c 20 6e 20 46 52 4f 4d  INCT log, n FROM
20d0: 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t1.    UNION AL
20e0: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46  L.    SELECT n F
20f0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
2100: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
2110: 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20  log;.  }} msg]. 
2120: 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a   lappend v $msg.
2130: 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f  } {1 {SELECTs to
2140: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
2150: 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  ght of UNION ALL
2160: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
2170: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
2180: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d  result columns}}
2190: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
21a0: 2d 35 2e 34 20 7b 0a 20 20 73 65 74 20 76 20 5b  -5.4 {.  set v [
21b0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
21c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20  .    SELECT log 
21d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d  FROM t1 WHERE n=
21e0: 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  2.    UNION ALL.
21f0: 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46      SELECT log F
2200: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 33  ROM t1 WHERE n=3
2210: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
2220: 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52     SELECT log FR
2230: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 34 0a  OM t1 WHERE n=4.
2240: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
2250: 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f    SELECT log FRO
2260: 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 35 0a 20  M t1 WHERE n=5. 
2270: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b     ORDER BY log;
2280: 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70  .  }} msg].  lap
2290: 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30  pend v $msg.} {0
22a0: 20 7b 31 20 32 20 32 20 33 7d 7d 0a 0a 64 6f 5f   {1 2 2 3}}..do_
22b0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 31  test select4-6.1
22c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
22d0: 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 2c 20 63     SELECT log, c
22e0: 6f 75 6e 74 28 2a 29 20 61 73 20 63 6e 74 20 46  ount(*) as cnt F
22f0: 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
2300: 6c 6f 67 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  log.    UNION.  
2310: 20 20 53 45 4c 45 43 54 20 6c 6f 67 2c 20 6e 20    SELECT log, n 
2320: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d  FROM t1 WHERE n=
2330: 37 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 63  7.    ORDER BY c
2340: 6e 74 2c 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b  nt, log;.  }.} {
2350: 30 20 31 20 31 20 31 20 32 20 32 20 33 20 34 20  0 1 1 1 2 2 3 4 
2360: 33 20 37 20 34 20 38 20 35 20 31 35 7d 0a 64 6f  3 7 4 8 5 15}.do
2370: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e  _test select4-6.
2380: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
2390: 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 2c 20      SELECT log, 
23a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
23b0: 20 47 52 4f 55 50 20 42 59 20 6c 6f 67 0a 20 20   GROUP BY log.  
23c0: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45    UNION.    SELE
23d0: 43 54 20 6c 6f 67 2c 20 6e 20 46 52 4f 4d 20 74  CT log, n FROM t
23e0: 31 20 57 48 45 52 45 20 6e 3d 37 0a 20 20 20 20  1 WHERE n=7.    
23f0: 4f 52 44 45 52 20 42 59 20 63 6f 75 6e 74 28 2a  ORDER BY count(*
2400: 29 2c 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30  ), log;.  }.} {0
2410: 20 31 20 31 20 31 20 32 20 32 20 33 20 34 20 33   1 1 1 2 2 3 4 3
2420: 20 37 20 34 20 38 20 35 20 31 35 7d 0a 0a 23 20   7 4 8 5 15}..# 
2430: 4e 55 4c 4c 73 20 61 72 65 20 69 6e 64 69 73 74  NULLs are indist
2440: 69 6e 63 74 20 66 6f 72 20 74 68 65 20 55 4e 49  inct for the UNI
2450: 4f 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 4d  ON operator..# M
2460: 61 6b 65 20 73 75 72 65 20 74 68 65 20 55 4e 49  ake sure the UNI
2470: 4f 4e 20 6f 70 65 72 61 74 6f 72 20 72 65 63 6f  ON operator reco
2480: 67 6e 69 7a 65 73 20 74 68 69 73 0a 23 0a 64 6f  gnizes this.#.do
2490: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e  _test select4-6.
24a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
24b0: 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20      SELECT NULL 
24c0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 4e 55 4c  UNION SELECT NUL
24d0: 4c 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45  L UNION.    SELE
24e0: 43 54 20 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  CT 1 UNION SELEC
24f0: 54 20 32 20 41 53 20 27 78 27 0a 20 20 20 20 4f  T 2 AS 'x'.    O
2500: 52 44 45 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d  RDER BY x;.  }.}
2510: 20 7b 7b 7d 20 31 20 32 7d 0a 64 6f 5f 74 65 73   {{} 1 2}.do_tes
2520: 74 20 73 65 6c 65 63 74 34 2d 36 2e 33 2e 31 20  t select4-6.3.1 
2530: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2540: 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e    SELECT NULL UN
2550: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 4e  ION ALL SELECT N
2560: 55 4c 4c 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20  ULL UNION ALL.  
2570: 20 20 53 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e    SELECT 1 UNION
2580: 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 20 41 53   ALL SELECT 2 AS
2590: 20 27 78 27 0a 20 20 20 20 4f 52 44 45 52 20 42   'x'.    ORDER B
25a0: 59 20 78 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b  Y x;.  }.} {{} {
25b0: 7d 20 31 20 32 7d 0a 0a 23 20 4d 61 6b 65 20 73  } 1 2}..# Make s
25c0: 75 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ure the DISTINCT
25d0: 20 6b 65 79 77 6f 72 64 20 74 72 65 61 74 73 20   keyword treats 
25e0: 4e 55 4c 4c 73 20 61 73 20 69 6e 64 69 73 74 69  NULLs as indisti
25f0: 6e 63 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  nct..#.ifcapable
2600: 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f   subquery {.  do
2610: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e  _test select4-6.
2620: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
2630: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
2640: 20 46 52 4f 4d 20 28 0a 20 20 20 20 20 20 20 20   FROM (.        
2650: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 31 20   SELECT NULL, 1 
2660: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
2670: 20 4e 55 4c 4c 2c 20 31 0a 20 20 20 20 20 20 29   NULL, 1.      )
2680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7b 7d 20  ;.    }.  } {{} 
2690: 31 20 7b 7d 20 31 7d 0a 20 20 64 6f 5f 74 65 73  1 {} 1}.  do_tes
26a0: 74 20 73 65 6c 65 63 74 34 2d 36 2e 35 20 7b 0a  t select4-6.5 {.
26b0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
26c0: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
26d0: 4e 43 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20  NCT * FROM (.   
26e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c        SELECT NUL
26f0: 4c 2c 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  L, 1 UNION ALL S
2700: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 31 0a 20 20  ELECT NULL, 1.  
2710: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
2720: 20 7b 7b 7d 20 31 7d 0a 20 20 64 6f 5f 74 65 73   {{} 1}.  do_tes
2730: 74 20 73 65 6c 65 63 74 34 2d 36 2e 36 20 7b 0a  t select4-6.6 {.
2740: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2750: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
2760: 4e 43 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20  NCT * FROM (.   
2770: 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 2c 32        SELECT 1,2
2780: 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45    UNION ALL SELE
2790: 43 54 20 31 2c 32 0a 20 20 20 20 20 20 29 3b 0a  CT 1,2.      );.
27a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a      }.  } {1 2}.
27b0: 7d 0a 0a 23 20 54 65 73 74 20 64 69 73 74 69 6e  }..# Test distin
27c0: 63 74 6e 65 73 73 20 6f 66 20 4e 55 4c 4c 20 69  ctness of NULL i
27d0: 6e 20 6f 74 68 65 72 20 77 61 79 73 2e 0a 23 0a  n other ways..#.
27e0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
27f0: 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.7 {.  execsql 
2800: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c  {.    SELECT NUL
2810: 4c 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  L EXCEPT SELECT 
2820: 4e 55 4c 4c 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a  NULL.  }.} {}...
2830: 23 20 4d 61 6b 65 20 73 75 72 65 20 63 6f 6c 75  # Make sure colu
2840: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 72  mn names are cor
2850: 72 65 63 74 20 77 68 65 6e 20 61 20 63 6f 6d 70  rect when a comp
2860: 6f 75 6e 64 20 73 65 6c 65 63 74 20 61 70 70 65  ound select appe
2870: 61 72 73 20 61 73 0a 23 20 61 6e 20 65 78 70 72  ars as.# an expr
2880: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 57 48  ession in the WH
2890: 45 52 45 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f  ERE clause..#.do
28a0: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 37 2e  _test select4-7.
28b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
28c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
28d0: 20 74 32 20 41 53 20 53 45 4c 45 43 54 20 6c 6f   t2 AS SELECT lo
28e0: 67 20 41 53 20 27 78 27 2c 20 63 6f 75 6e 74 28  g AS 'x', count(
28f0: 2a 29 20 41 53 20 27 79 27 20 46 52 4f 4d 20 74  *) AS 'y' FROM t
2900: 31 20 47 52 4f 55 50 20 42 59 20 6c 6f 67 3b 0a  1 GROUP BY log;.
2910: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2920: 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 78 3b  M t2 ORDER BY x;
2930: 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 31 20 31 20  .  }.} {0 1 1 1 
2940: 32 20 32 20 33 20 34 20 34 20 38 20 35 20 31 35  2 2 3 4 4 8 5 15
2950: 7d 20 20 0a 69 66 63 61 70 61 62 6c 65 20 73 75  }  .ifcapable su
2960: 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65  bquery {.  do_te
2970: 73 74 20 73 65 6c 65 63 74 34 2d 37 2e 32 20 7b  st select4-7.2 {
2980: 0a 20 20 20 20 65 78 65 63 73 71 6c 32 20 7b 0a  .    execsql2 {.
2990: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
29a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 20 49  ROM t1 WHERE n I
29b0: 4e 20 28 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d  N (SELECT n FROM
29c0: 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   t1 INTERSECT SE
29d0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 29 0a  LECT x FROM t2).
29e0: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e        ORDER BY n
29f0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 20 31 20  .    }.  } {n 1 
2a00: 6c 6f 67 20 30 20 6e 20 32 20 6c 6f 67 20 31 20  log 0 n 2 log 1 
2a10: 6e 20 33 20 6c 6f 67 20 32 20 6e 20 34 20 6c 6f  n 3 log 2 n 4 lo
2a20: 67 20 32 20 6e 20 35 20 6c 6f 67 20 33 7d 0a 20  g 2 n 5 log 3}. 
2a30: 20 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34   do_test select4
2a40: 2d 37 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  -7.3 {.    execs
2a50: 71 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  ql2 {.      SELE
2a60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2a70: 52 45 20 6e 20 49 4e 20 28 53 45 4c 45 43 54 20  RE n IN (SELECT 
2a80: 6e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  n FROM t1 EXCEPT
2a90: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
2aa0: 32 29 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  2).      ORDER B
2ab0: 59 20 6e 20 4c 49 4d 49 54 20 32 0a 20 20 20 20  Y n LIMIT 2.    
2ac0: 7d 0a 20 20 7d 20 7b 6e 20 36 20 6c 6f 67 20 33  }.  } {n 6 log 3
2ad0: 20 6e 20 37 20 6c 6f 67 20 33 7d 0a 20 20 64 6f   n 7 log 3}.  do
2ae0: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 37 2e  _test select4-7.
2af0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 32  4 {.    execsql2
2b00: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2b10: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
2b20: 6e 20 49 4e 20 28 53 45 4c 45 43 54 20 6e 20 46  n IN (SELECT n F
2b30: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
2b40: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 29 0a 20  ECT x FROM t2). 
2b50: 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e 20       ORDER BY n 
2b60: 4c 49 4d 49 54 20 32 0a 20 20 20 20 7d 0a 20 20  LIMIT 2.    }.  
2b70: 7d 20 7b 6e 20 31 20 6c 6f 67 20 30 20 6e 20 32  } {n 1 log 0 n 2
2b80: 20 6c 6f 67 20 31 7d 0a 7d 20 3b 23 20 69 66 63   log 1}.} ;# ifc
2b90: 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 0a  apable subquery.
2ba0: 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20  .} ;# ifcapable 
2bb0: 63 6f 6d 70 6f 75 6e 64 0a 0a 23 20 4d 61 6b 65  compound..# Make
2bc0: 20 73 75 72 65 20 44 49 53 54 49 4e 43 54 20 77   sure DISTINCT w
2bd0: 6f 72 6b 73 20 61 70 70 72 6f 70 72 69 61 74 65  orks appropriate
2be0: 6c 79 20 6f 6e 20 54 45 58 54 20 61 6e 64 20 4e  ly on TEXT and N
2bf0: 55 4d 45 52 49 43 20 63 6f 6c 75 6d 6e 73 2e 0a  UMERIC columns..
2c00: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
2c10: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
2c20: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2c30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
2c40: 28 61 20 74 65 78 74 2c 20 62 20 66 6c 6f 61 74  (a text, b float
2c50: 2c 20 63 20 74 65 78 74 29 3b 0a 20 20 20 20 49  , c text);.    I
2c60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2c70: 4c 55 45 53 28 31 2c 20 31 2e 31 2c 20 27 31 2e  LUES(1, 1.1, '1.
2c80: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
2c90: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 32  INTO t3 VALUES(2
2ca0: 2c 20 31 2e 31 30 2c 20 27 31 2e 31 30 27 29 3b  , 1.10, '1.10');
2cb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2cc0: 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20 31 2e   t3 VALUES(3, 1.
2cd0: 31 30 2c 20 27 31 2e 31 27 29 3b 0a 20 20 20 20  10, '1.1');.    
2ce0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2cf0: 41 4c 55 45 53 28 34 2c 20 31 2e 31 2c 20 27 31  ALUES(4, 1.1, '1
2d00: 2e 31 30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  .10');.    INSER
2d10: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
2d20: 28 35 2c 20 31 2e 32 2c 20 27 31 2e 32 27 29 3b  (5, 1.2, '1.2');
2d30: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2d40: 20 74 33 20 56 41 4c 55 45 53 28 36 2c 20 31 2e   t3 VALUES(6, 1.
2d50: 33 2c 20 27 31 2e 33 27 29 3b 0a 20 20 20 20 43  3, '1.3');.    C
2d60: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 65  OMMIT;.  }.  exe
2d70: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2d80: 54 20 44 49 53 54 49 4e 43 54 20 62 20 46 52 4f  T DISTINCT b FRO
2d90: 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20 63 3b  M t3 ORDER BY c;
2da0: 0a 20 20 7d 0a 7d 20 7b 31 2e 31 20 31 2e 32 20  .  }.} {1.1 1.2 
2db0: 31 2e 33 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  1.3}.do_test sel
2dc0: 65 63 74 34 2d 38 2e 32 20 7b 0a 20 20 65 78 65  ect4-8.2 {.  exe
2dd0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2de0: 54 20 44 49 53 54 49 4e 43 54 20 63 20 46 52 4f  T DISTINCT c FRO
2df0: 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20 63 3b  M t3 ORDER BY c;
2e00: 0a 20 20 7d 0a 7d 20 7b 31 2e 31 20 31 2e 31 30  .  }.} {1.1 1.10
2e10: 20 31 2e 32 20 31 2e 33 7d 0a 0a 23 20 4d 61 6b   1.2 1.3}..# Mak
2e20: 65 20 73 75 72 65 20 74 68 65 20 6e 61 6d 65 73  e sure the names
2e30: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   of columns are 
2e40: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 72  taken from the r
2e50: 69 67 68 74 2d 6d 6f 73 74 20 73 75 62 71 75 65  ight-most subque
2e60: 72 79 0a 23 20 72 69 67 68 74 20 69 6e 20 61 20  ry.# right in a 
2e70: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
2e80: 20 54 69 63 6b 65 74 20 23 31 37 32 31 0a 23 0a   Ticket #1721.#.
2e90: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
2ea0: 6e 64 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 73 65  nd {..do_test se
2eb0: 6c 65 63 74 34 2d 39 2e 31 20 7b 0a 20 20 65 78  lect4-9.1 {.  ex
2ec0: 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c  ecsql2 {.    SEL
2ed0: 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 74 32  ECT x, y FROM t2
2ee0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2c   UNION SELECT a,
2ef0: 20 62 20 46 52 4f 4d 20 74 33 20 4f 52 44 45 52   b FROM t3 ORDER
2f00: 20 42 59 20 78 20 4c 49 4d 49 54 20 31 0a 20 20   BY x LIMIT 1.  
2f10: 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 64 6f  }.} {x 0 y 1}.do
2f20: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e  _test select4-9.
2f30: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b  2 {.  execsql2 {
2f40: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 79  .    SELECT x, y
2f50: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 41   FROM t2 UNION A
2f60: 4c 4c 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46  LL SELECT a, b F
2f70: 52 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20  ROM t3 ORDER BY 
2f80: 78 20 4c 49 4d 49 54 20 31 0a 20 20 7d 0a 7d 20  x LIMIT 1.  }.} 
2f90: 7b 78 20 30 20 79 20 31 7d 0a 64 6f 5f 74 65 73  {x 0 y 1}.do_tes
2fa0: 74 20 73 65 6c 65 63 74 34 2d 39 2e 33 20 7b 0a  t select4-9.3 {.
2fb0: 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20    execsql2 {.   
2fc0: 20 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f   SELECT x, y FRO
2fd0: 4d 20 74 32 20 45 58 43 45 50 54 20 53 45 4c 45  M t2 EXCEPT SELE
2fe0: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 33 20  CT a, b FROM t3 
2ff0: 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54  ORDER BY x LIMIT
3000: 20 31 0a 20 20 7d 0a 7d 20 7b 78 20 30 20 79 20   1.  }.} {x 0 y 
3010: 31 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  1}.do_test selec
3020: 74 34 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  t4-9.4 {.  execs
3030: 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  ql2 {.    SELECT
3040: 20 78 2c 20 79 20 46 52 4f 4d 20 74 32 20 49 4e   x, y FROM t2 IN
3050: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 30  TERSECT SELECT 0
3060: 20 41 53 20 61 2c 20 31 20 41 53 20 62 3b 0a 20   AS a, 1 AS b;. 
3070: 20 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 64   }.} {x 0 y 1}.d
3080: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39  o_test select4-9
3090: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .5 {.  execsql2 
30a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 30 20 41  {.    SELECT 0 A
30b0: 53 20 78 2c 20 31 20 41 53 20 79 0a 20 20 20 20  S x, 1 AS y.    
30c0: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
30d0: 20 32 20 41 53 20 70 2c 20 33 20 41 53 20 71 0a   2 AS p, 3 AS q.
30e0: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
30f0: 4c 45 43 54 20 34 20 41 53 20 61 2c 20 35 20 41  LECT 4 AS a, 5 A
3100: 53 20 62 0a 20 20 20 20 4f 52 44 45 52 20 42 59  S b.    ORDER BY
3110: 20 78 20 4c 49 4d 49 54 20 31 0a 20 20 7d 0a 7d   x LIMIT 1.  }.}
3120: 20 7b 78 20 30 20 79 20 31 7d 0a 0a 69 66 63 61   {x 0 y 1}..ifca
3130: 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b  pable subquery {
3140: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
3150: 2d 39 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -9.6 {.  execsql
3160: 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2 {.    SELECT *
3170: 20 46 52 4f 4d 20 28 0a 20 20 20 20 20 20 53 45   FROM (.      SE
3180: 4c 45 43 54 20 30 20 41 53 20 78 2c 20 31 20 41  LECT 0 AS x, 1 A
3190: 53 20 79 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a  S y.      UNION.
31a0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 32 20 41        SELECT 2 A
31b0: 53 20 70 2c 20 33 20 41 53 20 71 0a 20 20 20 20  S p, 3 AS q.    
31c0: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 53 45    UNION.      SE
31d0: 4c 45 43 54 20 34 20 41 53 20 61 2c 20 35 20 41  LECT 4 AS a, 5 A
31e0: 53 20 62 0a 20 20 20 20 29 20 4f 52 44 45 52 20  S b.    ) ORDER 
31f0: 42 59 20 31 20 4c 49 4d 49 54 20 31 3b 0a 20 20  BY 1 LIMIT 1;.  
3200: 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 64 6f  }.} {x 0 y 1}.do
3210: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e  _test select4-9.
3220: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b  7 {.  execsql2 {
3230: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
3240: 4f 4d 20 28 0a 20 20 20 20 20 20 53 45 4c 45 43  OM (.      SELEC
3250: 54 20 30 20 41 53 20 78 2c 20 31 20 41 53 20 79  T 0 AS x, 1 AS y
3260: 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  .      UNION.   
3270: 20 20 20 53 45 4c 45 43 54 20 32 20 41 53 20 70     SELECT 2 AS p
3280: 2c 20 33 20 41 53 20 71 0a 20 20 20 20 20 20 55  , 3 AS q.      U
3290: 4e 49 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43  NION.      SELEC
32a0: 54 20 34 20 41 53 20 61 2c 20 35 20 41 53 20 62  T 4 AS a, 5 AS b
32b0: 0a 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20  .    ) ORDER BY 
32c0: 78 20 4c 49 4d 49 54 20 31 3b 0a 20 20 7d 0a 7d  x LIMIT 1;.  }.}
32d0: 20 7b 78 20 30 20 79 20 31 7d 0a 7d 20 3b 23 20   {x 0 y 1}.} ;# 
32e0: 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65  ifcapable subque
32f0: 72 79 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  ry..do_test sele
3300: 63 74 34 2d 39 2e 38 20 7b 0a 20 20 65 78 65 63  ct4-9.8 {.  exec
3310: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3320: 20 30 20 41 53 20 78 2c 20 31 20 41 53 20 79 0a   0 AS x, 1 AS y.
3330: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
3340: 4c 45 43 54 20 32 20 41 53 20 79 2c 20 2d 33 20  LECT 2 AS y, -3 
3350: 41 53 20 78 0a 20 20 20 20 4f 52 44 45 52 20 42  AS x.    ORDER B
3360: 59 20 78 20 4c 49 4d 49 54 20 31 3b 0a 20 20 7d  Y x LIMIT 1;.  }
3370: 0a 7d 20 7b 30 20 31 7d 0a 0a 64 6f 5f 74 65 73  .} {0 1}..do_tes
3380: 74 20 73 65 6c 65 63 74 34 2d 39 2e 39 2e 31 20  t select4-9.9.1 
3390: 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20  {.  execsql2 {. 
33a0: 20 20 20 53 45 4c 45 43 54 20 31 20 41 53 20 61     SELECT 1 AS a
33b0: 2c 20 32 20 41 53 20 62 20 55 4e 49 4f 4e 20 41  , 2 AS b UNION A
33c0: 4c 4c 20 53 45 4c 45 43 54 20 33 20 41 53 20 62  LL SELECT 3 AS b
33d0: 2c 20 34 20 41 53 20 61 0a 20 20 7d 0a 7d 20 7b  , 4 AS a.  }.} {
33e0: 61 20 31 20 62 20 32 20 61 20 33 20 62 20 34 7d  a 1 b 2 a 3 b 4}
33f0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71  ..ifcapable subq
3400: 75 65 72 79 20 7b 0a 64 6f 5f 74 65 73 74 20 73  uery {.do_test s
3410: 65 6c 65 63 74 34 2d 39 2e 39 2e 32 20 7b 0a 20  elect4-9.9.2 {. 
3420: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
3430: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
3440: 45 4c 45 43 54 20 31 20 41 53 20 61 2c 20 32 20  ELECT 1 AS a, 2 
3450: 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  AS b UNION ALL S
3460: 45 4c 45 43 54 20 33 20 41 53 20 62 2c 20 34 20  ELECT 3 AS b, 4 
3470: 41 53 20 61 29 0a 20 20 20 20 20 57 48 45 52 45  AS a).     WHERE
3480: 20 62 3d 33 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   b=3.  }.} {}.do
3490: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e  _test select4-9.
34a0: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  10 {.  execsql2 
34b0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
34c0: 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53  ROM (SELECT 1 AS
34d0: 20 61 2c 20 32 20 41 53 20 62 20 55 4e 49 4f 4e   a, 2 AS b UNION
34e0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 33 20 41 53   ALL SELECT 3 AS
34f0: 20 62 2c 20 34 20 41 53 20 61 29 0a 20 20 20 20   b, 4 AS a).    
3500: 20 57 48 45 52 45 20 62 3d 32 0a 20 20 7d 0a 7d   WHERE b=2.  }.}
3510: 20 7b 61 20 31 20 62 20 32 7d 0a 64 6f 5f 74 65   {a 1 b 2}.do_te
3520: 73 74 20 73 65 6c 65 63 74 34 2d 39 2e 31 31 20  st select4-9.11 
3530: 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20  {.  execsql2 {. 
3540: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3550: 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 2c   (SELECT 1 AS a,
3560: 20 32 20 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c   2 AS b UNION AL
3570: 4c 20 53 45 4c 45 43 54 20 33 20 41 53 20 65 2c  L SELECT 3 AS e,
3580: 20 34 20 41 53 20 62 29 0a 20 20 20 20 20 57 48   4 AS b).     WH
3590: 45 52 45 20 62 3d 32 0a 20 20 7d 0a 7d 20 7b 61  ERE b=2.  }.} {a
35a0: 20 31 20 62 20 32 7d 0a 64 6f 5f 74 65 73 74 20   1 b 2}.do_test 
35b0: 73 65 6c 65 63 74 34 2d 39 2e 31 32 20 7b 0a 20  select4-9.12 {. 
35c0: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
35d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
35e0: 45 4c 45 43 54 20 31 20 41 53 20 61 2c 20 32 20  ELECT 1 AS a, 2 
35f0: 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  AS b UNION ALL S
3600: 45 4c 45 43 54 20 33 20 41 53 20 65 2c 20 34 20  ELECT 3 AS e, 4 
3610: 41 53 20 62 29 0a 20 20 20 20 20 57 48 45 52 45  AS b).     WHERE
3620: 20 62 3e 30 0a 20 20 7d 0a 7d 20 7b 61 20 31 20   b>0.  }.} {a 1 
3630: 62 20 32 20 61 20 33 20 62 20 34 7d 0a 7d 20 3b  b 2 a 3 b 4}.} ;
3640: 23 20 69 66 63 61 70 61 62 6c 65 20 73 75 62 71  # ifcapable subq
3650: 75 65 72 79 0a 0a 7d 20 3b 23 20 69 66 63 61 70  uery..} ;# ifcap
3660: 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 0a 0a 23  able compound..#
3670: 20 54 72 79 20 63 6f 6d 62 69 6e 69 6e 67 20 44   Try combining D
3680: 49 53 54 49 4e 43 54 2c 20 4c 49 4d 49 54 2c 20  ISTINCT, LIMIT, 
3690: 61 6e 64 20 4f 46 46 53 45 54 2e 20 20 4d 61 6b  and OFFSET.  Mak
36a0: 65 20 73 75 72 65 20 74 68 65 79 20 61 6c 6c 20  e sure they all 
36b0: 77 6f 72 6b 0a 23 20 74 6f 67 65 74 68 65 72 2e  work.# together.
36c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  .#.do_test selec
36d0: 74 34 2d 31 30 2e 31 20 7b 0a 20 20 65 78 65 63  t4-10.1 {.  exec
36e0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
36f0: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
3700: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c  OM t1 ORDER BY l
3710: 6f 67 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20  og.  }.} {0 1 2 
3720: 33 20 34 20 35 7d 0a 64 6f 5f 74 65 73 74 20 73  3 4 5}.do_test s
3730: 65 6c 65 63 74 34 2d 31 30 2e 32 20 7b 0a 20 20  elect4-10.2 {.  
3740: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3750: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
3760: 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  g FROM t1 ORDER 
3770: 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20 34 0a 20  BY log LIMIT 4. 
3780: 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33 7d 0a 64   }.} {0 1 2 3}.d
3790: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31  o_test select4-1
37a0: 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.3 {.  execsql 
37b0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
37c0: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
37d0: 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 4c  1 ORDER BY log L
37e0: 49 4d 49 54 20 30 0a 20 20 7d 0a 7d 20 7b 7d 0a  IMIT 0.  }.} {}.
37f0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
3800: 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  10.4 {.  execsql
3810: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
3820: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
3830: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20  t1 ORDER BY log 
3840: 4c 49 4d 49 54 20 2d 31 0a 20 20 7d 0a 7d 20 7b  LIMIT -1.  }.} {
3850: 30 20 31 20 32 20 33 20 34 20 35 7d 0a 64 6f 5f  0 1 2 3 4 5}.do_
3860: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 30 2e  test select4-10.
3870: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
3880: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
3890: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20  NCT log FROM t1 
38a0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 4c 49 4d  ORDER BY log LIM
38b0: 49 54 20 2d 31 20 4f 46 46 53 45 54 20 32 0a 20  IT -1 OFFSET 2. 
38c0: 20 7d 0a 7d 20 7b 32 20 33 20 34 20 35 7d 0a 64   }.} {2 3 4 5}.d
38d0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31  o_test select4-1
38e0: 30 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.6 {.  execsql 
38f0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
3900: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
3910: 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 4c  1 ORDER BY log L
3920: 49 4d 49 54 20 33 20 4f 46 46 53 45 54 20 32 0a  IMIT 3 OFFSET 2.
3930: 20 20 7d 0a 7d 20 7b 32 20 33 20 34 7d 0a 64 6f    }.} {2 3 4}.do
3940: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 30  _test select4-10
3950: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
3960: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
3970: 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31  INCT log FROM t1
3980: 20 4f 52 44 45 52 20 42 59 20 2b 6c 6f 67 20 4c   ORDER BY +log L
3990: 49 4d 49 54 20 33 20 4f 46 46 53 45 54 20 32 30  IMIT 3 OFFSET 20
39a0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
39b0: 74 20 73 65 6c 65 63 74 34 2d 31 30 2e 38 20 7b  t select4-10.8 {
39c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
39d0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
39e0: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44   log FROM t1 ORD
39f0: 45 52 20 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20  ER BY log LIMIT 
3a00: 30 20 4f 46 46 53 45 54 20 33 0a 20 20 7d 0a 7d  0 OFFSET 3.  }.}
3a10: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   {}.do_test sele
3a20: 63 74 34 2d 31 30 2e 39 20 7b 0a 20 20 65 78 65  ct4-10.9 {.  exe
3a30: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3a40: 54 20 44 49 53 54 49 4e 43 54 20 6d 61 78 28 6e  T DISTINCT max(n
3a50: 29 2c 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f  ), log FROM t1 O
3a60: 52 44 45 52 20 42 59 20 2b 6c 6f 67 3b 20 2d 2d  RDER BY +log; --
3a70: 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54 20   LIMIT 2 OFFSET 
3a80: 31 0a 20 20 7d 0a 7d 20 7b 33 31 20 35 7d 0a 0a  1.  }.} {31 5}..
3a90: 23 20 4d 61 6b 65 20 73 75 72 65 20 63 6f 6d 70  # Make sure comp
3aa0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 77 69 74  ound SELECTs wit
3ab0: 68 20 77 69 6c 64 6c 79 20 64 69 66 66 65 72 65  h wildly differe
3ac0: 6e 74 20 6e 75 6d 62 65 72 73 20 6f 66 20 63 6f  nt numbers of co
3ad0: 6c 75 6d 6e 73 0a 23 20 64 6f 20 6e 6f 74 20 63  lumns.# do not c
3ae0: 61 75 73 65 20 61 73 73 65 72 74 69 6f 6e 20 66  ause assertion f
3af0: 61 75 6c 74 73 20 64 75 65 20 74 6f 20 72 65 67  aults due to reg
3b00: 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  ister allocation
3b10: 20 69 73 73 75 65 73 2e 0a 23 0a 64 6f 5f 74 65   issues..#.do_te
3b20: 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 31 20  st select4-11.1 
3b30: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
3b40: 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c     SELECT x,x,x,
3b50: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3b60: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3b70: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3b80: 78 2c 78 2c 78 20 46 52 4f 4d 20 74 32 0a 20 20  x,x,x FROM t2.  
3b90: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45    UNION.    SELE
3ba0: 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 7d  CT x FROM t2.  }
3bb0: 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74  .} {1 {SELECTs t
3bc0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
3bd0: 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20 64 6f  ight of UNION do
3be0: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
3bf0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
3c00: 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f  ult columns}}.do
3c10: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31  _test select4-11
3c20: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
3c30: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
3c40: 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e  ROM t2.    UNION
3c50: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c  .    SELECT x,x,
3c60: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3c70: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3c80: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3c90: 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74 32 0a  x,x,x,x FROM t2.
3ca0: 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54    }.} {1 {SELECT
3cb0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
3cc0: 64 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e  d right of UNION
3cd0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
3ce0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
3cf0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d  result columns}}
3d00: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
3d10: 2d 31 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -11.3 {.  catchs
3d20: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3d30: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3d40: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3d50: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3d60: 78 2c 78 2c 78 2c 78 2c 78 2c 78 20 46 52 4f 4d  x,x,x,x,x,x FROM
3d70: 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t2.    UNION AL
3d80: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  L.    SELECT x F
3d90: 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t2.  }.} {1 
3da0: 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  {SELECTs to the 
3db0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
3dc0: 66 20 55 4e 49 4f 4e 20 41 4c 4c 20 64 6f 20 6e  f UNION ALL do n
3dd0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
3de0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
3df0: 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74  t columns}}.do_t
3e00: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 34  est select4-11.4
3e10: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
3e20: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
3e30: 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41  M t2.    UNION A
3e40: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c  LL.    SELECT x,
3e50: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3e60: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3e70: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3e80: 78 2c 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74  x,x,x,x,x FROM t
3e90: 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45  2.  }.} {1 {SELE
3ea0: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
3eb0: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 55 4e 49  and right of UNI
3ec0: 4f 4e 20 41 4c 4c 20 64 6f 20 6e 6f 74 20 68 61  ON ALL do not ha
3ed0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
3ee0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
3ef0: 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73  umns}}.do_test s
3f00: 65 6c 65 63 74 34 2d 31 31 2e 35 20 7b 0a 20 20  elect4-11.5 {.  
3f10: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
3f20: 45 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c  ELECT x,x,x,x,x,
3f30: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3f40: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3f50: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3f60: 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 45 58  x FROM t2.    EX
3f70: 43 45 50 54 0a 20 20 20 20 53 45 4c 45 43 54 20  CEPT.    SELECT 
3f80: 78 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20  x FROM t2.  }.} 
3f90: 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74  {1 {SELECTs to t
3fa0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
3fb0: 74 20 6f 66 20 45 58 43 45 50 54 20 64 6f 20 6e  t of EXCEPT do n
3fc0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
3fd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
3fe0: 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74  t columns}}.do_t
3ff0: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 36  est select4-11.6
4000: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
4010: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
4020: 4d 20 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a  M t2.    EXCEPT.
4030: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78      SELECT x,x,x
4040: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4050: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4060: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4070: 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74 32 0a 20  ,x,x,x FROM t2. 
4080: 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73   }.} {1 {SELECTs
4090: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
40a0: 20 72 69 67 68 74 20 6f 66 20 45 58 43 45 50 54   right of EXCEPT
40b0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
40c0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
40d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d  result columns}}
40e0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
40f0: 2d 31 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  -11.7 {.  catchs
4100: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
4110: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4120: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4130: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4140: 78 2c 78 2c 78 2c 78 2c 78 2c 78 20 46 52 4f 4d  x,x,x,x,x,x FROM
4150: 20 74 32 0a 20 20 20 20 49 4e 54 45 52 53 45 43   t2.    INTERSEC
4160: 54 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  T.    SELECT x F
4170: 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t2.  }.} {1 
4180: 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  {SELECTs to the 
4190: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
41a0: 66 20 49 4e 54 45 52 53 45 43 54 20 64 6f 20 6e  f INTERSECT do n
41b0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
41c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
41d0: 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74  t columns}}.do_t
41e0: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 38  est select4-11.8
41f0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
4200: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
4210: 4d 20 74 32 0a 20 20 20 20 49 4e 54 45 52 53 45  M t2.    INTERSE
4220: 43 54 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c  CT.    SELECT x,
4230: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4240: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4250: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4260: 78 2c 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74  x,x,x,x,x FROM t
4270: 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45  2.  }.} {1 {SELE
4280: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
4290: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 49 4e 54  and right of INT
42a0: 45 52 53 45 43 54 20 64 6f 20 6e 6f 74 20 68 61  ERSECT do not ha
42b0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
42c0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
42d0: 75 6d 6e 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  umns}}..do_test 
42e0: 73 65 6c 65 63 74 34 2d 31 31 2e 31 31 20 7b 0a  select4-11.11 {.
42f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
4300: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
4310: 32 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  2.    UNION.    
4320: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
4330: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
4340: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
4350: 20 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a 20   t2.    EXCEPT. 
4360: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
4370: 20 74 32 0a 20 20 20 20 49 4e 54 45 52 53 45 43   t2.    INTERSEC
4380: 54 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 78  T.    SELECT x,x
4390: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
43a0: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
43b0: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
43c0: 2c 78 2c 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20  ,x,x,x,x,x FROM 
43d0: 74 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c  t2.  }.} {1 {SEL
43e0: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
43f0: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 49 4e   and right of IN
4400: 54 45 52 53 45 43 54 20 64 6f 20 6e 6f 74 20 68  TERSECT do not h
4410: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
4420: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4430: 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20  lumns}}.do_test 
4440: 73 65 6c 65 63 74 34 2d 31 31 2e 31 32 20 7b 0a  select4-11.12 {.
4450: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
4460: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
4470: 32 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  2.    UNION.    
4480: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
4490: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
44a0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
44b0: 20 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a 20   t2.    EXCEPT. 
44c0: 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c     SELECT x,x,x,
44d0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
44e0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
44f0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4500: 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74 32 0a  x,x,x,x FROM t2.
4510: 20 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 53      EXCEPT.    S
4520: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a  ELECT x FROM t2.
4530: 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54    }.} {1 {SELECT
4540: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
4550: 64 20 72 69 67 68 74 20 6f 66 20 45 58 43 45 50  d right of EXCEP
4560: 54 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  T do not have th
4570: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
4580: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d   result columns}
4590: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
45a0: 34 2d 31 31 2e 31 33 20 7b 0a 20 20 63 61 74 63  4-11.13 {.  catc
45b0: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
45c0: 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20  T x FROM t2.    
45d0: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
45e0: 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55   x FROM t2.    U
45f0: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c  NION ALL.    SEL
4600: 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  ECT x,x,x,x,x,x,
4610: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4620: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4630: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4640: 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e  x FROM t2.    UN
4650: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45  ION ALL.    SELE
4660: 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20  CT x FROM t2.   
4670: 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c 45   EXCEPT.    SELE
4680: 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 7d  CT x FROM t2.  }
4690: 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74  .} {1 {SELECTs t
46a0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
46b0: 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20 41 4c  ight of UNION AL
46c0: 4c 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  L do not have th
46d0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
46e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d   result columns}
46f0: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
4700: 34 2d 31 31 2e 31 34 20 7b 0a 20 20 63 61 74 63  4-11.14 {.  catc
4710: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
4720: 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20  T x FROM t2.    
4730: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
4740: 20 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78   x,x,x,x,x,x,x,x
4750: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4760: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4770: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 20 46  ,x,x,x,x,x,x,x F
4780: 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e  ROM t2.    UNION
4790: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
47a0: 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t2.    UNION 
47b0: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78  ALL.    SELECT x
47c0: 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 45 58 43   FROM t2.    EXC
47d0: 45 50 54 0a 20 20 20 20 53 45 4c 45 43 54 20 78  EPT.    SELECT x
47e0: 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b   FROM t2.  }.} {
47f0: 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68  1 {SELECTs to th
4800: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
4810: 20 6f 66 20 55 4e 49 4f 4e 20 64 6f 20 6e 6f 74   of UNION do not
4820: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
4830: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
4840: 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73  columns}}.do_tes
4850: 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 31 35 20  t select4-11.15 
4860: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
4870: 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c     SELECT x,x,x,
4880: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4890: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
48a0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
48b0: 78 2c 78 2c 78 2c 78 20 46 52 4f 4d 20 74 32 0a  x,x,x,x FROM t2.
48c0: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
48d0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
48e0: 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20     INTERSECT.   
48f0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
4900: 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  2.    UNION ALL.
4910: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
4920: 4d 20 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a  M t2.    EXCEPT.
4930: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
4940: 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53  M t2.  }.} {1 {S
4950: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
4960: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
4970: 55 4e 49 4f 4e 20 64 6f 20 6e 6f 74 20 68 61 76  UNION do not hav
4980: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
4990: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
49a0: 6d 6e 73 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  mns}}..finish_te
49b0: 73 74 0a                                         st.