/ Hex Artifact Content
Login

Artifact b64d5d248d008e1dc365f451c76090bde907e665:


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 39 20 32 30 30 38 2f 30 38 2f 30 34   1.29 2008/08/04
0230: 20 30 33 3a 35 31 3a 32 34 20 64 61 6e 69 65 6c   03:51:24 daniel
0240: 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74  k1977 Exp $..set
0250: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
0260: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
0270: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
0280: 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 4d 6f 73  ester.tcl..# Mos
0290: 74 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20  t tests in this 
02a0: 66 69 6c 65 20 64 65 70 65 6e 64 20 6f 6e 20 63  file depend on c
02b0: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 2e 20  ompound-select. 
02c0: 42 75 74 20 74 68 65 72 65 20 61 72 65 20 61 20  But there are a 
02d0: 63 6f 75 70 6c 65 0a 23 20 72 69 67 68 74 20 61  couple.# right a
02e0: 74 20 74 68 65 20 65 6e 64 20 74 68 61 74 20 74  t the end that t
02f0: 65 73 74 20 44 49 53 54 49 4e 43 54 2c 20 73 6f  est DISTINCT, so
0300: 20 77 65 20 63 61 6e 6e 6f 74 20 6f 6d 69 74 20   we cannot omit 
0310: 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 2e  the entire file.
0320: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d  .#.ifcapable com
0330: 70 6f 75 6e 64 20 7b 0a 0a 23 20 42 75 69 6c 64  pound {..# Build
0340: 20 73 6f 6d 65 20 74 65 73 74 20 64 61 74 61 0a   some test data.
0350: 23 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52  #.execsql {.  CR
0360: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 6e 20  EATE TABLE t1(n 
0370: 69 6e 74 2c 20 6c 6f 67 20 69 6e 74 29 3b 0a 20  int, log int);. 
0380: 20 42 45 47 49 4e 3b 0a 7d 0a 66 6f 72 20 7b 73   BEGIN;.}.for {s
0390: 65 74 20 69 20 31 7d 20 7b 24 69 3c 33 32 7d 20  et i 1} {$i<32} 
03a0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 66 6f 72  {incr i} {.  for
03b0: 20 7b 73 65 74 20 6a 20 30 7d 20 7b 28 31 3c 3c   {set j 0} {(1<<
03c0: 24 6a 29 3c 24 69 7d 20 7b 69 6e 63 72 20 6a 7d  $j)<$i} {incr j}
03d0: 20 7b 7d 0a 20 20 65 78 65 63 73 71 6c 20 22 49   {}.  execsql "I
03e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
03f0: 4c 55 45 53 28 24 69 2c 24 6a 29 22 0a 7d 0a 65  LUES($i,$j)".}.e
0400: 78 65 63 73 71 6c 20 7b 0a 20 20 43 4f 4d 4d 49  xecsql {.  COMMI
0410: 54 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65  T;.}..do_test se
0420: 6c 65 63 74 34 2d 31 2e 30 20 7b 0a 20 20 65 78  lect4-1.0 {.  ex
0430: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 44 49  ecsql {SELECT DI
0440: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
0450: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 7d  t1 ORDER BY log}
0460: 0a 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d  .} {0 1 2 3 4 5}
0470: 0a 0a 23 20 55 6e 69 6f 6e 20 41 6c 6c 20 6f 70  ..# Union All op
0480: 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74  erator.#.do_test
0490: 20 73 65 6c 65 63 74 34 2d 31 2e 31 61 20 7b 0a   select4-1.1a {.
04a0: 20 20 6c 73 6f 72 74 20 5b 65 78 65 63 73 71 6c    lsort [execsql
04b0: 20 7b 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   {SELECT DISTINC
04c0: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 7d 5d 0a  T log FROM t1}].
04d0: 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d 0a  } {0 1 2 3 4 5}.
04e0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
04f0: 31 2e 31 62 20 7b 0a 20 20 6c 73 6f 72 74 20 5b  1.1b {.  lsort [
0500: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0510: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
0520: 6c 6f 67 3d 33 7d 5d 0a 7d 20 7b 35 20 36 20 37  log=3}].} {5 6 7
0530: 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   8}.do_test sele
0540: 63 74 34 2d 31 2e 31 63 20 7b 0a 20 20 65 78 65  ct4-1.1c {.  exe
0550: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0560: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
0570: 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e  ROM t1.    UNION
0580: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
0590: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
05a0: 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20  log=3.    ORDER 
05b0: 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30  BY log;.  }.} {0
05c0: 20 31 20 32 20 33 20 34 20 35 20 35 20 36 20 37   1 2 3 4 5 5 6 7
05d0: 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   8}.do_test sele
05e0: 63 74 34 2d 31 2e 31 64 20 7b 0a 20 20 65 78 65  ct4-1.1d {.  exe
05f0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0600: 45 20 54 41 42 4c 45 20 74 32 20 41 53 0a 20 20  E TABLE t2 AS.  
0610: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
0620: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a  NCT log FROM t1.
0630: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
0640: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46        SELECT n F
0650: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
0660: 3d 33 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  =3.      ORDER B
0670: 59 20 6c 6f 67 3b 0a 20 20 20 20 53 45 4c 45 43  Y log;.    SELEC
0680: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
0690: 0a 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20  .} {0 1 2 3 4 5 
06a0: 35 20 36 20 37 20 38 7d 0a 65 78 65 63 73 71 6c  5 6 7 8}.execsql
06b0: 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d   {DROP TABLE t2}
06c0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
06d0: 2d 31 2e 31 65 20 7b 0a 20 20 65 78 65 63 73 71  -1.1e {.  execsq
06e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
06f0: 41 42 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20  ABLE t2 AS.     
0700: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0710: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
0720: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
0730: 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d     SELECT n FROM
0740: 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a   t1 WHERE log=3.
0750: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c        ORDER BY l
0760: 6f 67 20 44 45 53 43 3b 0a 20 20 20 20 53 45 4c  og DESC;.    SEL
0770: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
0780: 20 7d 0a 7d 20 7b 38 20 37 20 36 20 35 20 35 20   }.} {8 7 6 5 5 
0790: 34 20 33 20 32 20 31 20 30 7d 0a 65 78 65 63 73  4 3 2 1 0}.execs
07a0: 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74  ql {DROP TABLE t
07b0: 32 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  2}.do_test selec
07c0: 74 34 2d 31 2e 31 66 20 7b 0a 20 20 65 78 65 63  t4-1.1f {.  exec
07d0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
07e0: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
07f0: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
0800: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ALL.    SELECT n
0810: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
0820: 6f 67 3d 32 0a 20 20 7d 0a 7d 20 7b 30 20 31 20  og=2.  }.} {0 1 
0830: 32 20 33 20 34 20 35 20 33 20 34 7d 0a 64 6f 5f  2 3 4 5 3 4}.do_
0840: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e 31  test select4-1.1
0850: 67 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  g {.  execsql {.
0860: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0870: 20 74 32 20 41 53 20 0a 20 20 20 20 20 20 53 45   t2 AS .      SE
0880: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
0890: 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20  g FROM t1.      
08a0: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20  UNION ALL.      
08b0: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
08c0: 20 57 48 45 52 45 20 6c 6f 67 3d 32 3b 0a 20 20   WHERE log=2;.  
08d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
08e0: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32  t2;.  }.} {0 1 2
08f0: 20 33 20 34 20 35 20 33 20 34 7d 0a 65 78 65 63   3 4 5 3 4}.exec
0900: 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20  sql {DROP TABLE 
0910: 74 32 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75  t2}.ifcapable su
0920: 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65  bquery {.  do_te
0930: 73 74 20 73 65 6c 65 63 74 34 2d 31 2e 32 20 7b  st select4-1.2 {
0940: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
0950: 20 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20       SELECT log 
0960: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 20  FROM t1 WHERE n 
0970: 49 4e 20 0a 20 20 20 20 20 20 20 20 28 53 45 4c  IN .        (SEL
0980: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
0990: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
09a0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45  LL.         SELE
09b0: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
09c0: 52 45 20 6c 6f 67 3d 33 29 0a 20 20 20 20 20 20  RE log=3).      
09d0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20  ORDER BY log;.  
09e0: 20 20 7d 0a 20 20 7d 20 7b 30 20 31 20 32 20 32    }.  } {0 1 2 2
09f0: 20 33 20 33 20 33 20 33 7d 0a 7d 0a 64 6f 5f 74   3 3 3 3}.}.do_t
0a00: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e 33 20  est select4-1.3 
0a10: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
0a20: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
0a30: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0a40: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  log FROM t1 ORDE
0a50: 52 20 42 59 20 6c 6f 67 0a 20 20 20 20 55 4e 49  R BY log.    UNI
0a60: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43  ON ALL.    SELEC
0a70: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
0a80: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
0a90: 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d  R BY log;.  }} m
0aa0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
0ab0: 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f 52 44 45 52  $msg.} {1 {ORDER
0ac0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
0ad0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 55 4e 49  d come after UNI
0ae0: 4f 4e 20 41 4c 4c 20 6e 6f 74 20 62 65 66 6f 72  ON ALL not befor
0af0: 65 7d 7d 0a 0a 23 20 55 6e 69 6f 6e 20 6f 70 65  e}}..# Union ope
0b00: 72 61 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20  rator.#.do_test 
0b10: 73 65 6c 65 63 74 34 2d 32 2e 31 20 7b 0a 20 20  select4-2.1 {.  
0b20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
0b30: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
0b40: 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e  g FROM t1.    UN
0b50: 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ION.    SELECT n
0b60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
0b70: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
0b80: 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20  Y log;.  }.} {0 
0b90: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d  1 2 3 4 5 6 7 8}
0ba0: 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75  .ifcapable subqu
0bb0: 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ery {.  do_test 
0bc0: 73 65 6c 65 63 74 34 2d 32 2e 32 20 7b 0a 20 20  select4-2.2 {.  
0bd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0be0: 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f    SELECT log FRO
0bf0: 4d 20 74 31 20 57 48 45 52 45 20 6e 20 49 4e 20  M t1 WHERE n IN 
0c00: 0a 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54  .        (SELECT
0c10: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
0c20: 4f 4d 20 74 31 20 55 4e 49 4f 4e 0a 20 20 20 20  OM t1 UNION.    
0c30: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52       SELECT n FR
0c40: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
0c50: 33 29 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  3).      ORDER B
0c60: 59 20 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  Y log;.    }.  }
0c70: 20 7b 30 20 31 20 32 20 32 20 33 20 33 20 33 20   {0 1 2 2 3 3 3 
0c80: 33 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  3}.}.do_test sel
0c90: 65 63 74 34 2d 32 2e 33 20 7b 0a 20 20 73 65 74  ect4-2.3 {.  set
0ca0: 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73   v [catch {execs
0cb0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0cc0: 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f  DISTINCT log FRO
0cd0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f  M t1 ORDER BY lo
0ce0: 67 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  g.    UNION.    
0cf0: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
0d00: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
0d10: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
0d20: 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65   }} msg].  lappe
0d30: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
0d40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
0d50: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
0d60: 72 20 55 4e 49 4f 4e 20 6e 6f 74 20 62 65 66 6f  r UNION not befo
0d70: 72 65 7d 7d 0a 0a 23 20 45 78 63 65 70 74 20 6f  re}}..# Except o
0d80: 70 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 74 65 73  perator.#.do_tes
0d90: 74 20 73 65 6c 65 63 74 34 2d 33 2e 31 2e 31 20  t select4-3.1.1 
0da0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0db0: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
0dc0: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20  T log FROM t1.  
0dd0: 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c    EXCEPT.    SEL
0de0: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
0df0: 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52  ERE log=3.    OR
0e00: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a  DER BY log;.  }.
0e10: 7d 20 7b 30 20 31 20 32 20 33 20 34 7d 0a 64 6f  } {0 1 2 3 4}.do
0e20: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 33 2e  _test select4-3.
0e30: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
0e40: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0e50: 4c 45 20 74 32 20 41 53 20 0a 20 20 20 20 20 20  LE t2 AS .      
0e60: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0e70: 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  log FROM t1.    
0e80: 20 20 45 58 43 45 50 54 0a 20 20 20 20 20 20 53    EXCEPT.      S
0e90: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
0ea0: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
0eb0: 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a    ORDER BY log;.
0ec0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0ed0: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31  M t2;.  }.} {0 1
0ee0: 20 32 20 33 20 34 7d 0a 65 78 65 63 73 71 6c 20   2 3 4}.execsql 
0ef0: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a  {DROP TABLE t2}.
0f00: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
0f10: 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.1.3 {.  execsq
0f20: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0f30: 41 42 4c 45 20 74 32 20 41 53 20 0a 20 20 20 20  ABLE t2 AS .    
0f40: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
0f50: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20  T log FROM t1.  
0f60: 20 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 20      EXCEPT.     
0f70: 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74   SELECT n FROM t
0f80: 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20  1 WHERE log=3.  
0f90: 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67      ORDER BY log
0fa0: 20 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45 43   DESC;.    SELEC
0fb0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
0fc0: 0a 7d 20 7b 34 20 33 20 32 20 31 20 30 7d 0a 65  .} {4 3 2 1 0}.e
0fd0: 78 65 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42  xecsql {DROP TAB
0fe0: 4c 45 20 74 32 7d 0a 69 66 63 61 70 61 62 6c 65  LE t2}.ifcapable
0ff0: 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f   subquery {.  do
1000: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 33 2e  _test select4-3.
1010: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
1020: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6c  {.      SELECT l
1030: 6f 67 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  og FROM t1 WHERE
1040: 20 6e 20 49 4e 20 0a 20 20 20 20 20 20 20 20 28   n IN .        (
1050: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1060: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 45 58 43 45  log FROM t1 EXCE
1070: 50 54 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45  PT.         SELE
1080: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
1090: 52 45 20 6c 6f 67 3d 33 29 0a 20 20 20 20 20 20  RE log=3).      
10a0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20  ORDER BY log;.  
10b0: 20 20 7d 0a 20 20 7d 20 7b 30 20 31 20 32 20 32    }.  } {0 1 2 2
10c0: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  }.}.do_test sele
10d0: 63 74 34 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20  ct4-3.3 {.  set 
10e0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
10f0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
1100: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
1110: 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67   t1 ORDER BY log
1120: 0a 20 20 20 20 45 58 43 45 50 54 0a 20 20 20 20  .    EXCEPT.    
1130: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
1140: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
1150: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
1160: 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65   }} msg].  lappe
1170: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
1180: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1190: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
11a0: 72 20 45 58 43 45 50 54 20 6e 6f 74 20 62 65 66  r EXCEPT not bef
11b0: 6f 72 65 7d 7d 0a 0a 23 20 49 6e 74 65 72 73 65  ore}}..# Interse
11c0: 63 74 20 6f 70 65 72 61 74 6f 72 0a 23 0a 64 6f  ct operator.#.do
11d0: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e  _test select4-4.
11e0: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
11f0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
1200: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
1210: 31 0a 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a  1.    INTERSECT.
1220: 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f      SELECT n FRO
1230: 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33  M t1 WHERE log=3
1240: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f  .    ORDER BY lo
1250: 67 3b 0a 20 20 7d 0a 7d 20 7b 35 7d 0a 0a 64 6f  g;.  }.} {5}..do
1260: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e  _test select4-4.
1270: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
1280: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
1290: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
12a0: 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  1.    UNION ALL.
12b0: 20 20 20 20 53 45 4c 45 43 54 20 36 0a 20 20 20      SELECT 6.   
12c0: 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 53   INTERSECT.    S
12d0: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
12e0: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
12f0: 4f 52 44 45 52 20 42 59 20 74 31 2e 6c 6f 67 3b  ORDER BY t1.log;
1300: 0a 20 20 7d 0a 7d 20 7b 35 20 36 7d 0a 0a 64 6f  .  }.} {5 6}..do
1310: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e  _test select4-4.
1320: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
1330: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1340: 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20 20 53  LE t2 AS.      S
1350: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
1360: 6f 67 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e  og FROM t1 UNION
1370: 20 41 4c 4c 20 53 45 4c 45 43 54 20 36 0a 20 20   ALL SELECT 6.  
1380: 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20      INTERSECT.  
1390: 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f      SELECT n FRO
13a0: 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33  M t1 WHERE log=3
13b0: 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  .      ORDER BY 
13c0: 6c 6f 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  log;.    SELECT 
13d0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
13e0: 20 7b 35 20 36 7d 0a 65 78 65 63 73 71 6c 20 7b   {5 6}.execsql {
13f0: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 64  DROP TABLE t2}.d
1400: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 34  o_test select4-4
1410: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
1420: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
1430: 42 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20 20  BLE t2 AS.      
1440: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1450: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  log FROM t1 UNIO
1460: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 36 0a 20  N ALL SELECT 6. 
1470: 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20       INTERSECT. 
1480: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52       SELECT n FR
1490: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
14a0: 33 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59  3.      ORDER BY
14b0: 20 6c 6f 67 20 44 45 53 43 3b 0a 20 20 20 20 53   log DESC;.    S
14c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
14d0: 0a 20 20 7d 0a 7d 20 7b 36 20 35 7d 0a 65 78 65  .  }.} {6 5}.exe
14e0: 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45  csql {DROP TABLE
14f0: 20 74 32 7d 0a 69 66 63 61 70 61 62 6c 65 20 73   t2}.ifcapable s
1500: 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74  ubquery {.  do_t
1510: 65 73 74 20 73 65 6c 65 63 74 34 2d 34 2e 32 20  est select4-4.2 
1520: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1530: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67        SELECT log
1540: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e   FROM t1 WHERE n
1550: 20 49 4e 20 0a 20 20 20 20 20 20 20 20 28 53 45   IN .        (SE
1560: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
1570: 67 20 46 52 4f 4d 20 74 31 20 49 4e 54 45 52 53  g FROM t1 INTERS
1580: 45 43 54 0a 20 20 20 20 20 20 20 20 20 53 45 4c  ECT.         SEL
1590: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
15a0: 45 52 45 20 6c 6f 67 3d 33 29 0a 20 20 20 20 20  ERE log=3).     
15b0: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
15c0: 20 20 20 7d 0a 20 20 7d 20 7b 33 7d 0a 7d 0a 64     }.  } {3}.}.d
15d0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 34  o_test select4-4
15e0: 2e 33 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  .3 {.  set v [ca
15f0: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20  tch {execsql {. 
1600: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
1610: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f  CT log FROM t1 O
1620: 52 44 45 52 20 42 59 20 6c 6f 67 0a 20 20 20 20  RDER BY log.    
1630: 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 53 45  INTERSECT.    SE
1640: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
1650: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f  HERE log=3.    O
1660: 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d  RDER BY log;.  }
1670: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
1680: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f 52   v $msg.} {1 {OR
1690: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
16a0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
16b0: 49 4e 54 45 52 53 45 43 54 20 6e 6f 74 20 62 65  INTERSECT not be
16c0: 66 6f 72 65 7d 7d 0a 0a 23 20 56 61 72 69 6f 75  fore}}..# Variou
16d0: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
16e0: 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
16f0: 67 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52  g UNION or INTER
1700: 53 45 43 54 0a 23 0a 64 6f 5f 74 65 73 74 20 73  SECT.#.do_test s
1710: 65 6c 65 63 74 34 2d 35 2e 31 20 7b 0a 20 20 73  elect4-5.1 {.  s
1720: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65  et v [catch {exe
1730: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1740: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
1750: 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e  ROM t2.    UNION
1760: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
1770: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
1780: 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20  log=3.    ORDER 
1790: 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67  BY log;.  }} msg
17a0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
17b0: 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  sg.} {1 {no such
17c0: 20 74 61 62 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f   table: t2}}.do_
17d0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32  test select4-5.2
17e0: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
17f0: 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  h {execsql {.   
1800: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
1810: 20 6c 6f 67 20 41 53 20 22 78 79 7a 7a 79 22 20   log AS "xyzzy" 
1820: 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f  FROM t1.    UNIO
1830: 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54  N ALL.    SELECT
1840: 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   n FROM t1 WHERE
1850: 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52   log=3.    ORDER
1860: 20 42 59 20 78 79 7a 7a 79 3b 0a 20 20 7d 7d 20   BY xyzzy;.  }} 
1870: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
1880: 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 30 20 31 20   $msg.} {0 {0 1 
1890: 32 20 33 20 34 20 35 20 35 20 36 20 37 20 38 7d  2 3 4 5 5 6 7 8}
18a0: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
18b0: 34 2d 35 2e 32 62 20 7b 0a 20 20 73 65 74 20 76  4-5.2b {.  set v
18c0: 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c   [catch {execsql
18d0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
18e0: 53 54 49 4e 43 54 20 6c 6f 67 20 41 53 20 78 79  STINCT log AS xy
18f0: 7a 7a 79 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  zzy FROM t1.    
1900: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45  UNION ALL.    SE
1910: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
1920: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f  HERE log=3.    O
1930: 52 44 45 52 20 42 59 20 22 78 79 7a 7a 79 22 3b  RDER BY "xyzzy";
1940: 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70  .  }} msg].  lap
1950: 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30  pend v $msg.} {0
1960: 20 7b 30 20 31 20 32 20 33 20 34 20 35 20 35 20   {0 1 2 3 4 5 5 
1970: 36 20 37 20 38 7d 7d 0a 64 6f 5f 74 65 73 74 20  6 7 8}}.do_test 
1980: 73 65 6c 65 63 74 34 2d 35 2e 32 63 20 7b 0a 20  select4-5.2c {. 
1990: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65   set v [catch {e
19a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
19b0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
19c0: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49   FROM t1.    UNI
19d0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43  ON ALL.    SELEC
19e0: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
19f0: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1a00: 52 20 42 59 20 22 78 79 7a 7a 79 22 3b 0a 20 20  R BY "xyzzy";.  
1a10: 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  }} msg].  lappen
1a20: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 31  d v $msg.} {1 {1
1a30: 73 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  st ORDER BY term
1a40: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1a50: 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  any column in th
1a60: 65 20 72 65 73 75 6c 74 20 73 65 74 7d 7d 0a 64  e result set}}.d
1a70: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1a80: 2e 32 64 20 7b 0a 20 20 73 65 74 20 76 20 5b 63  .2d {.  set v [c
1a90: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a  atch {execsql {.
1aa0: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
1ab0: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a  NCT log FROM t1.
1ac0: 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20      INTERSECT.  
1ad0: 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20    SELECT n FROM 
1ae0: 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20  t1 WHERE log=3. 
1af0: 20 20 20 4f 52 44 45 52 20 42 59 20 22 78 79 7a     ORDER BY "xyz
1b00: 7a 79 22 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20  zy";.  }} msg]. 
1b10: 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a   lappend v $msg.
1b20: 7d 20 7b 31 20 7b 31 73 74 20 4f 52 44 45 52 20  } {1 {1st ORDER 
1b30: 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  BY term does not
1b40: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
1b50: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
1b60: 73 65 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65  set}}.do_test se
1b70: 6c 65 63 74 34 2d 35 2e 32 65 20 7b 0a 20 20 73  lect4-5.2e {.  s
1b80: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65  et v [catch {exe
1b90: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1ba0: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
1bb0: 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e  ROM t1.    UNION
1bc0: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
1bd0: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
1be0: 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20  log=3.    ORDER 
1bf0: 42 59 20 6e 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a  BY n;.  }} msg].
1c00: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1c10: 0a 7d 20 7b 30 20 7b 30 20 31 20 32 20 33 20 34  .} {0 {0 1 2 3 4
1c20: 20 35 20 35 20 36 20 37 20 38 7d 7d 0a 64 6f 5f   5 5 6 7 8}}.do_
1c30: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32  test select4-5.2
1c40: 66 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  f {.  catchsql {
1c50: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
1c60: 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31  INCT log FROM t1
1c70: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
1c80: 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d     SELECT n FROM
1c90: 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a   t1 WHERE log=3.
1ca0: 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67      ORDER BY log
1cb0: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 30 20 31 20  ;.  }.} {0 {0 1 
1cc0: 32 20 33 20 34 20 35 20 35 20 36 20 37 20 38 7d  2 3 4 5 5 6 7 8}
1cd0: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
1ce0: 34 2d 35 2e 32 67 20 7b 0a 20 20 63 61 74 63 68  4-5.2g {.  catch
1cf0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1d00: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
1d10: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
1d20: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  ALL.    SELECT n
1d30: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
1d40: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1d50: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 30  Y 1;.  }.} {0 {0
1d60: 20 31 20 32 20 33 20 34 20 35 20 35 20 36 20 37   1 2 3 4 5 5 6 7
1d70: 20 38 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c   8}}.do_test sel
1d80: 65 63 74 34 2d 35 2e 32 68 20 7b 0a 20 20 63 61  ect4-5.2h {.  ca
1d90: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
1da0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
1db0: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49   FROM t1.    UNI
1dc0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43  ON ALL.    SELEC
1dd0: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
1de0: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1df0: 52 20 42 59 20 32 3b 0a 20 20 7d 0a 7d 20 7b 31  R BY 2;.  }.} {1
1e00: 20 7b 31 73 74 20 4f 52 44 45 52 20 42 59 20 74   {1st ORDER BY t
1e10: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
1e20: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74   - should be bet
1e30: 77 65 65 6e 20 31 20 61 6e 64 20 31 7d 7d 0a 64  ween 1 and 1}}.d
1e40: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1e50: 2e 32 69 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .2i {.  catchsql
1e60: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
1e70: 53 54 49 4e 43 54 20 31 2c 20 6c 6f 67 20 46 52  STINCT 1, log FR
1e80: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
1e90: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 32  ALL.    SELECT 2
1ea0: 2c 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , n FROM t1 WHER
1eb0: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1ec0: 52 20 42 59 20 32 2c 20 31 3b 0a 20 20 7d 0a 7d  R BY 2, 1;.  }.}
1ed0: 20 7b 30 20 7b 31 20 30 20 31 20 31 20 31 20 32   {0 {1 0 1 1 1 2
1ee0: 20 31 20 33 20 31 20 34 20 31 20 35 20 32 20 35   1 3 1 4 1 5 2 5
1ef0: 20 32 20 36 20 32 20 37 20 32 20 38 7d 7d 0a 64   2 6 2 7 2 8}}.d
1f00: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1f10: 2e 32 6a 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .2j {.  catchsql
1f20: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
1f30: 53 54 49 4e 43 54 20 31 2c 20 6c 6f 67 20 46 52  STINCT 1, log FR
1f40: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
1f50: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 32  ALL.    SELECT 2
1f60: 2c 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , n FROM t1 WHER
1f70: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1f80: 52 20 42 59 20 31 2c 20 32 20 44 45 53 43 3b 0a  R BY 1, 2 DESC;.
1f90: 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 35 20 31 20    }.} {0 {1 5 1 
1fa0: 34 20 31 20 33 20 31 20 32 20 31 20 31 20 31 20  4 1 3 1 2 1 1 1 
1fb0: 30 20 32 20 38 20 32 20 37 20 32 20 36 20 32 20  0 2 8 2 7 2 6 2 
1fc0: 35 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  5}}.do_test sele
1fd0: 63 74 34 2d 35 2e 32 6b 20 7b 0a 20 20 63 61 74  ct4-5.2k {.  cat
1fe0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1ff0: 43 54 20 44 49 53 54 49 4e 43 54 20 31 2c 20 6c  CT DISTINCT 1, l
2000: 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55  og FROM t1.    U
2010: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c  NION ALL.    SEL
2020: 45 43 54 20 32 2c 20 6e 20 46 52 4f 4d 20 74 31  ECT 2, n FROM t1
2030: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
2040: 20 4f 52 44 45 52 20 42 59 20 6e 2c 20 31 3b 0a   ORDER BY n, 1;.
2050: 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 30 20 31 20    }.} {0 {1 0 1 
2060: 31 20 31 20 32 20 31 20 33 20 31 20 34 20 31 20  1 1 2 1 3 1 4 1 
2070: 35 20 32 20 35 20 32 20 36 20 32 20 37 20 32 20  5 2 5 2 6 2 7 2 
2080: 38 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  8}}.do_test sele
2090: 63 74 34 2d 35 2e 33 20 7b 0a 20 20 73 65 74 20  ct4-5.3 {.  set 
20a0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
20b0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
20c0: 49 53 54 49 4e 43 54 20 6c 6f 67 2c 20 6e 20 46  ISTINCT log, n F
20d0: 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e  ROM t1.    UNION
20e0: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
20f0: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
2100: 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20  log=3.    ORDER 
2110: 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67  BY log;.  }} msg
2120: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
2130: 73 67 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73  sg.} {1 {SELECTs
2140: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
2150: 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20   right of UNION 
2160: 41 4c 4c 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ALL do not have 
2170: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
2180: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
2190: 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  s}}.do_test sele
21a0: 63 74 34 2d 35 2e 34 20 7b 0a 20 20 73 65 74 20  ct4-5.4 {.  set 
21b0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
21c0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c  l {.    SELECT l
21d0: 6f 67 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  og FROM t1 WHERE
21e0: 20 6e 3d 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41   n=2.    UNION A
21f0: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f  LL.    SELECT lo
2200: 67 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  g FROM t1 WHERE 
2210: 6e 3d 33 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c  n=3.    UNION AL
2220: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67  L.    SELECT log
2230: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e   FROM t1 WHERE n
2240: 3d 34 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  =4.    UNION ALL
2250: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20  .    SELECT log 
2260: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d  FROM t1 WHERE n=
2270: 35 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c  5.    ORDER BY l
2280: 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20  og;.  }} msg].  
2290: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
22a0: 20 7b 30 20 7b 31 20 32 20 32 20 33 7d 7d 0a 0a   {0 {1 2 2 3}}..
22b0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
22c0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
22d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67  {.    SELECT log
22e0: 2c 20 63 6f 75 6e 74 28 2a 29 20 61 73 20 63 6e  , count(*) as cn
22f0: 74 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  t FROM t1 GROUP 
2300: 42 59 20 6c 6f 67 0a 20 20 20 20 55 4e 49 4f 4e  BY log.    UNION
2310: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 2c  .    SELECT log,
2320: 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   n FROM t1 WHERE
2330: 20 6e 3d 37 0a 20 20 20 20 4f 52 44 45 52 20 42   n=7.    ORDER B
2340: 59 20 63 6e 74 2c 20 6c 6f 67 3b 0a 20 20 7d 0a  Y cnt, log;.  }.
2350: 7d 20 7b 30 20 31 20 31 20 31 20 32 20 32 20 33  } {0 1 1 1 2 2 3
2360: 20 34 20 33 20 37 20 34 20 38 20 35 20 31 35 7d   4 3 7 4 8 5 15}
2370: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
2380: 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.2 {.  execsql
2390: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f   {.    SELECT lo
23a0: 67 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  g, count(*) FROM
23b0: 20 74 31 20 47 52 4f 55 50 20 42 59 20 6c 6f 67   t1 GROUP BY log
23c0: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53  .    UNION.    S
23d0: 45 4c 45 43 54 20 6c 6f 67 2c 20 6e 20 46 52 4f  ELECT log, n FRO
23e0: 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 37 0a 20  M t1 WHERE n=7. 
23f0: 20 20 20 4f 52 44 45 52 20 42 59 20 63 6f 75 6e     ORDER BY coun
2400: 74 28 2a 29 2c 20 6c 6f 67 3b 0a 20 20 7d 0a 7d  t(*), log;.  }.}
2410: 20 7b 30 20 31 20 31 20 31 20 32 20 32 20 33 20   {0 1 1 1 2 2 3 
2420: 34 20 33 20 37 20 34 20 38 20 35 20 31 35 7d 0a  4 3 7 4 8 5 15}.
2430: 0a 23 20 4e 55 4c 4c 73 20 61 72 65 20 69 6e 64  .# NULLs are ind
2440: 69 73 74 69 6e 63 74 20 66 6f 72 20 74 68 65 20  istinct for the 
2450: 55 4e 49 4f 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  UNION operator..
2460: 23 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  # Make sure the 
2470: 55 4e 49 4f 4e 20 6f 70 65 72 61 74 6f 72 20 72  UNION operator r
2480: 65 63 6f 67 6e 69 7a 65 73 20 74 68 69 73 0a 23  ecognizes this.#
2490: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
24a0: 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.3 {.  execsql
24b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 55   {.    SELECT NU
24c0: 4c 4c 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  LL UNION SELECT 
24d0: 4e 55 4c 4c 20 55 4e 49 4f 4e 0a 20 20 20 20 53  NULL UNION.    S
24e0: 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 53 45  ELECT 1 UNION SE
24f0: 4c 45 43 54 20 32 20 41 53 20 27 78 27 0a 20 20  LECT 2 AS 'x'.  
2500: 20 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 20 20    ORDER BY x;.  
2510: 7d 0a 7d 20 7b 7b 7d 20 31 20 32 7d 0a 64 6f 5f  }.} {{} 1 2}.do_
2520: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 33  test select4-6.3
2530: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2540: 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c  .    SELECT NULL
2550: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2560: 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 41 4c 4c  T NULL UNION ALL
2570: 0a 20 20 20 20 53 45 4c 45 43 54 20 31 20 55 4e  .    SELECT 1 UN
2580: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
2590: 20 41 53 20 27 78 27 0a 20 20 20 20 4f 52 44 45   AS 'x'.    ORDE
25a0: 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d 20 7b 7b  R BY x;.  }.} {{
25b0: 7d 20 7b 7d 20 31 20 32 7d 0a 0a 23 20 4d 61 6b  } {} 1 2}..# Mak
25c0: 65 20 73 75 72 65 20 74 68 65 20 44 49 53 54 49  e sure the DISTI
25d0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 74 72 65 61  NCT keyword trea
25e0: 74 73 20 4e 55 4c 4c 73 20 61 73 20 69 6e 64 69  ts NULLs as indi
25f0: 73 74 69 6e 63 74 2e 0a 23 0a 69 66 63 61 70 61  stinct..#.ifcapa
2600: 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b 0a 20  ble subquery {. 
2610: 20 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34   do_test select4
2620: 2d 36 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  -6.4 {.    execs
2630: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
2640: 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20 20 20  T * FROM (.     
2650: 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c      SELECT NULL,
2660: 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c   1 UNION ALL SEL
2670: 45 43 54 20 4e 55 4c 4c 2c 20 31 0a 20 20 20 20  ECT NULL, 1.    
2680: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b    );.    }.  } {
2690: 7b 7d 20 31 20 7b 7d 20 31 7d 0a 20 20 64 6f 5f  {} 1 {} 1}.  do_
26a0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 35  test select4-6.5
26b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
26c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  .      SELECT DI
26d0: 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20 28 0a  STINCT * FROM (.
26e0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
26f0: 4e 55 4c 4c 2c 20 31 20 55 4e 49 4f 4e 20 41 4c  NULL, 1 UNION AL
2700: 4c 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 31  L SELECT NULL, 1
2710: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2720: 20 20 7d 20 7b 7b 7d 20 31 7d 0a 20 20 64 6f 5f    } {{} 1}.  do_
2730: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 36  test select4-6.6
2740: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2750: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  .      SELECT DI
2760: 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20 28 0a  STINCT * FROM (.
2770: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
2780: 31 2c 32 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  1,2  UNION ALL S
2790: 45 4c 45 43 54 20 31 2c 32 0a 20 20 20 20 20 20  ELECT 1,2.      
27a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  );.    }.  } {1 
27b0: 32 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 64 69 73  2}.}..# Test dis
27c0: 74 69 6e 63 74 6e 65 73 73 20 6f 66 20 4e 55 4c  tinctness of NUL
27d0: 4c 20 69 6e 20 6f 74 68 65 72 20 77 61 79 73 2e  L in other ways.
27e0: 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  .#.do_test selec
27f0: 74 34 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73  t4-6.7 {.  execs
2800: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2810: 4e 55 4c 4c 20 45 58 43 45 50 54 20 53 45 4c 45  NULL EXCEPT SELE
2820: 43 54 20 4e 55 4c 4c 0a 20 20 7d 0a 7d 20 7b 7d  CT NULL.  }.} {}
2830: 0a 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 63  ...# Make sure c
2840: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
2850: 63 6f 72 72 65 63 74 20 77 68 65 6e 20 61 20 63  correct when a c
2860: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61  ompound select a
2870: 70 70 65 61 72 73 20 61 73 0a 23 20 61 6e 20 65  ppears as.# an e
2880: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
2890: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 23   WHERE clause..#
28a0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
28b0: 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.1 {.  execsql
28c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
28d0: 42 4c 45 20 74 32 20 41 53 20 53 45 4c 45 43 54  BLE t2 AS SELECT
28e0: 20 6c 6f 67 20 41 53 20 27 78 27 2c 20 63 6f 75   log AS 'x', cou
28f0: 6e 74 28 2a 29 20 41 53 20 27 79 27 20 46 52 4f  nt(*) AS 'y' FRO
2900: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 6c 6f  M t1 GROUP BY lo
2910: 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  g;.    SELECT * 
2920: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
2930: 20 78 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 31   x;.  }.} {0 1 1
2940: 20 31 20 32 20 32 20 33 20 34 20 34 20 38 20 35   1 2 2 3 4 4 8 5
2950: 20 31 35 7d 20 20 0a 69 66 63 61 70 61 62 6c 65   15}  .ifcapable
2960: 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f   subquery {.  do
2970: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 37 2e  _test select4-7.
2980: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 32  2 {.    execsql2
2990: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
29a0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
29b0: 6e 20 49 4e 20 28 53 45 4c 45 43 54 20 6e 20 46  n IN (SELECT n F
29c0: 52 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54  ROM t1 INTERSECT
29d0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
29e0: 32 29 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42  2).      ORDER B
29f0: 59 20 6e 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e  Y n.    }.  } {n
2a00: 20 31 20 6c 6f 67 20 30 20 6e 20 32 20 6c 6f 67   1 log 0 n 2 log
2a10: 20 31 20 6e 20 33 20 6c 6f 67 20 32 20 6e 20 34   1 n 3 log 2 n 4
2a20: 20 6c 6f 67 20 32 20 6e 20 35 20 6c 6f 67 20 33   log 2 n 5 log 3
2a30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 65 6c 65  }.  do_test sele
2a40: 63 74 34 2d 37 2e 33 20 7b 0a 20 20 20 20 65 78  ct4-7.3 {.    ex
2a50: 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 53  ecsql2 {.      S
2a60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2a70: 57 48 45 52 45 20 6e 20 49 4e 20 28 53 45 4c 45  WHERE n IN (SELE
2a80: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 45 58 43  CT n FROM t1 EXC
2a90: 45 50 54 20 53 45 4c 45 43 54 20 78 20 46 52 4f  EPT SELECT x FRO
2aa0: 4d 20 74 32 29 0a 20 20 20 20 20 20 4f 52 44 45  M t2).      ORDE
2ab0: 52 20 42 59 20 6e 20 4c 49 4d 49 54 20 32 0a 20  R BY n LIMIT 2. 
2ac0: 20 20 20 7d 0a 20 20 7d 20 7b 6e 20 36 20 6c 6f     }.  } {n 6 lo
2ad0: 67 20 33 20 6e 20 37 20 6c 6f 67 20 33 7d 0a 20  g 3 n 7 log 3}. 
2ae0: 20 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34   do_test select4
2af0: 2d 37 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  -7.4 {.    execs
2b00: 71 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  ql2 {.      SELE
2b10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2b20: 52 45 20 6e 20 49 4e 20 28 53 45 4c 45 43 54 20  RE n IN (SELECT 
2b30: 6e 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  n FROM t1 UNION 
2b40: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2b50: 29 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59  ).      ORDER BY
2b60: 20 6e 20 4c 49 4d 49 54 20 32 0a 20 20 20 20 7d   n LIMIT 2.    }
2b70: 0a 20 20 7d 20 7b 6e 20 31 20 6c 6f 67 20 30 20  .  } {n 1 log 0 
2b80: 6e 20 32 20 6c 6f 67 20 31 7d 0a 7d 20 3b 23 20  n 2 log 1}.} ;# 
2b90: 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65  ifcapable subque
2ba0: 72 79 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61 62  ry..} ;# ifcapab
2bb0: 6c 65 20 63 6f 6d 70 6f 75 6e 64 0a 0a 23 20 4d  le compound..# M
2bc0: 61 6b 65 20 73 75 72 65 20 44 49 53 54 49 4e 43  ake sure DISTINC
2bd0: 54 20 77 6f 72 6b 73 20 61 70 70 72 6f 70 72 69  T works appropri
2be0: 61 74 65 6c 79 20 6f 6e 20 54 45 58 54 20 61 6e  ately on TEXT an
2bf0: 64 20 4e 55 4d 45 52 49 43 20 63 6f 6c 75 6d 6e  d NUMERIC column
2c00: 73 2e 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  s..do_test selec
2c10: 74 34 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  t4-8.1 {.  execs
2c20: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
2c30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2c40: 20 74 33 28 61 20 74 65 78 74 2c 20 62 20 66 6c   t3(a text, b fl
2c50: 6f 61 74 2c 20 63 20 74 65 78 74 29 3b 0a 20 20  oat, c text);.  
2c60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2c70: 20 56 41 4c 55 45 53 28 31 2c 20 31 2e 31 2c 20   VALUES(1, 1.1, 
2c80: 27 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  '1.1');.    INSE
2c90: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
2ca0: 53 28 32 2c 20 31 2e 31 30 2c 20 27 31 2e 31 30  S(2, 1.10, '1.10
2cb0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2cc0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
2cd0: 20 31 2e 31 30 2c 20 27 31 2e 31 27 29 3b 0a 20   1.10, '1.1');. 
2ce0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2cf0: 33 20 56 41 4c 55 45 53 28 34 2c 20 31 2e 31 2c  3 VALUES(4, 1.1,
2d00: 20 27 31 2e 31 30 27 29 3b 0a 20 20 20 20 49 4e   '1.10');.    IN
2d10: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
2d20: 55 45 53 28 35 2c 20 31 2e 32 2c 20 27 31 2e 32  UES(5, 1.2, '1.2
2d30: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2d40: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 36 2c  NTO t3 VALUES(6,
2d50: 20 31 2e 33 2c 20 27 31 2e 33 27 29 3b 0a 20 20   1.3, '1.3');.  
2d60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
2d70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2d80: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 62 20  LECT DISTINCT b 
2d90: 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59  FROM t3 ORDER BY
2da0: 20 63 3b 0a 20 20 7d 0a 7d 20 7b 31 2e 31 20 31   c;.  }.} {1.1 1
2db0: 2e 32 20 31 2e 33 7d 0a 64 6f 5f 74 65 73 74 20  .2 1.3}.do_test 
2dc0: 73 65 6c 65 63 74 34 2d 38 2e 32 20 7b 0a 20 20  select4-8.2 {.  
2dd0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2de0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 20  LECT DISTINCT c 
2df0: 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59  FROM t3 ORDER BY
2e00: 20 63 3b 0a 20 20 7d 0a 7d 20 7b 31 2e 31 20 31   c;.  }.} {1.1 1
2e10: 2e 31 30 20 31 2e 32 20 31 2e 33 7d 0a 0a 23 20  .10 1.2 1.3}..# 
2e20: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 61  Make sure the na
2e30: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61  mes of columns a
2e40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
2e50: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 75 62  e right-most sub
2e60: 71 75 65 72 79 0a 23 20 72 69 67 68 74 20 69 6e  query.# right in
2e70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
2e80: 79 2e 20 20 54 69 63 6b 65 74 20 23 31 37 32 31  y.  Ticket #1721
2e90: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d  .#.ifcapable com
2ea0: 70 6f 75 6e 64 20 7b 0a 0a 64 6f 5f 74 65 73 74  pound {..do_test
2eb0: 20 73 65 6c 65 63 74 34 2d 39 2e 31 20 7b 0a 20   select4-9.1 {. 
2ec0: 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20   execsql2 {.    
2ed0: 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d  SELECT x, y FROM
2ee0: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
2ef0: 20 61 2c 20 62 20 46 52 4f 4d 20 74 33 20 4f 52   a, b FROM t3 OR
2f00: 44 45 52 20 42 59 20 78 20 4c 49 4d 49 54 20 31  DER BY x LIMIT 1
2f10: 0a 20 20 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d  .  }.} {x 0 y 1}
2f20: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
2f30: 2d 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -9.2 {.  execsql
2f40: 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  2 {.    SELECT x
2f50: 2c 20 79 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  , y FROM t2 UNIO
2f60: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 2c 20  N ALL SELECT a, 
2f70: 62 20 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20  b FROM t3 ORDER 
2f80: 42 59 20 78 20 4c 49 4d 49 54 20 31 0a 20 20 7d  BY x LIMIT 1.  }
2f90: 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 64 6f 5f  .} {x 0 y 1}.do_
2fa0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e 33  test select4-9.3
2fb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a   {.  execsql2 {.
2fc0: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 79 20      SELECT x, y 
2fd0: 46 52 4f 4d 20 74 32 20 45 58 43 45 50 54 20 53  FROM t2 EXCEPT S
2fe0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2ff0: 74 33 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49  t3 ORDER BY x LI
3000: 4d 49 54 20 31 0a 20 20 7d 0a 7d 20 7b 78 20 30  MIT 1.  }.} {x 0
3010: 20 79 20 31 7d 0a 64 6f 5f 74 65 73 74 20 73 65   y 1}.do_test se
3020: 6c 65 63 74 34 2d 39 2e 34 20 7b 0a 20 20 65 78  lect4-9.4 {.  ex
3030: 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c  ecsql2 {.    SEL
3040: 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 74 32  ECT x, y FROM t2
3050: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
3060: 54 20 30 20 41 53 20 61 2c 20 31 20 41 53 20 62  T 0 AS a, 1 AS b
3070: 3b 0a 20 20 7d 0a 7d 20 7b 78 20 30 20 79 20 31  ;.  }.} {x 0 y 1
3080: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
3090: 34 2d 39 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  4-9.5 {.  execsq
30a0: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
30b0: 30 20 41 53 20 78 2c 20 31 20 41 53 20 79 0a 20  0 AS x, 1 AS y. 
30c0: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c     UNION.    SEL
30d0: 45 43 54 20 32 20 41 53 20 70 2c 20 33 20 41 53  ECT 2 AS p, 3 AS
30e0: 20 71 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20   q.    UNION.   
30f0: 20 53 45 4c 45 43 54 20 34 20 41 53 20 61 2c 20   SELECT 4 AS a, 
3100: 35 20 41 53 20 62 0a 20 20 20 20 4f 52 44 45 52  5 AS b.    ORDER
3110: 20 42 59 20 78 20 4c 49 4d 49 54 20 31 0a 20 20   BY x LIMIT 1.  
3120: 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 0a 69  }.} {x 0 y 1}..i
3130: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72  fcapable subquer
3140: 79 20 7b 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  y {.do_test sele
3150: 63 74 34 2d 39 2e 36 20 7b 0a 20 20 65 78 65 63  ct4-9.6 {.  exec
3160: 73 71 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43  sql2 {.    SELEC
3170: 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20 20 20  T * FROM (.     
3180: 20 53 45 4c 45 43 54 20 30 20 41 53 20 78 2c 20   SELECT 0 AS x, 
3190: 31 20 41 53 20 79 0a 20 20 20 20 20 20 55 4e 49  1 AS y.      UNI
31a0: 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ON.      SELECT 
31b0: 32 20 41 53 20 70 2c 20 33 20 41 53 20 71 0a 20  2 AS p, 3 AS q. 
31c0: 20 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 20       UNION.     
31d0: 20 53 45 4c 45 43 54 20 34 20 41 53 20 61 2c 20   SELECT 4 AS a, 
31e0: 35 20 41 53 20 62 0a 20 20 20 20 29 20 4f 52 44  5 AS b.    ) ORD
31f0: 45 52 20 42 59 20 31 20 4c 49 4d 49 54 20 31 3b  ER BY 1 LIMIT 1;
3200: 0a 20 20 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d  .  }.} {x 0 y 1}
3210: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
3220: 2d 39 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -9.7 {.  execsql
3230: 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2 {.    SELECT *
3240: 20 46 52 4f 4d 20 28 0a 20 20 20 20 20 20 53 45   FROM (.      SE
3250: 4c 45 43 54 20 30 20 41 53 20 78 2c 20 31 20 41  LECT 0 AS x, 1 A
3260: 53 20 79 0a 20 20 20 20 20 20 55 4e 49 4f 4e 0a  S y.      UNION.
3270: 20 20 20 20 20 20 53 45 4c 45 43 54 20 32 20 41        SELECT 2 A
3280: 53 20 70 2c 20 33 20 41 53 20 71 0a 20 20 20 20  S p, 3 AS q.    
3290: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 53 45    UNION.      SE
32a0: 4c 45 43 54 20 34 20 41 53 20 61 2c 20 35 20 41  LECT 4 AS a, 5 A
32b0: 53 20 62 0a 20 20 20 20 29 20 4f 52 44 45 52 20  S b.    ) ORDER 
32c0: 42 59 20 78 20 4c 49 4d 49 54 20 31 3b 0a 20 20  BY x LIMIT 1;.  
32d0: 7d 0a 7d 20 7b 78 20 30 20 79 20 31 7d 0a 7d 20  }.} {x 0 y 1}.} 
32e0: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 73 75 62  ;# ifcapable sub
32f0: 71 75 65 72 79 0a 0a 64 6f 5f 74 65 73 74 20 73  query..do_test s
3300: 65 6c 65 63 74 34 2d 39 2e 38 20 7b 0a 20 20 65  elect4-9.8 {.  e
3310: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3320: 45 43 54 20 30 20 41 53 20 78 2c 20 31 20 41 53  ECT 0 AS x, 1 AS
3330: 20 79 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20   y.    UNION.   
3340: 20 53 45 4c 45 43 54 20 32 20 41 53 20 79 2c 20   SELECT 2 AS y, 
3350: 2d 33 20 41 53 20 78 0a 20 20 20 20 4f 52 44 45  -3 AS x.    ORDE
3360: 52 20 42 59 20 78 20 4c 49 4d 49 54 20 31 3b 0a  R BY x LIMIT 1;.
3370: 20 20 7d 0a 7d 20 7b 30 20 31 7d 0a 0a 64 6f 5f    }.} {0 1}..do_
3380: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e 39  test select4-9.9
3390: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  .1 {.  execsql2 
33a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 31 20 41  {.    SELECT 1 A
33b0: 53 20 61 2c 20 32 20 41 53 20 62 20 55 4e 49 4f  S a, 2 AS b UNIO
33c0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 33 20 41  N ALL SELECT 3 A
33d0: 53 20 62 2c 20 34 20 41 53 20 61 0a 20 20 7d 0a  S b, 4 AS a.  }.
33e0: 7d 20 7b 61 20 31 20 62 20 32 20 61 20 33 20 62  } {a 1 b 2 a 3 b
33f0: 20 34 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 73   4}..ifcapable s
3400: 75 62 71 75 65 72 79 20 7b 0a 64 6f 5f 74 65 73  ubquery {.do_tes
3410: 74 20 73 65 6c 65 63 74 34 2d 39 2e 39 2e 32 20  t select4-9.9.2 
3420: 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20  {.  execsql2 {. 
3430: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3440: 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 2c   (SELECT 1 AS a,
3450: 20 32 20 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c   2 AS b UNION AL
3460: 4c 20 53 45 4c 45 43 54 20 33 20 41 53 20 62 2c  L SELECT 3 AS b,
3470: 20 34 20 41 53 20 61 29 0a 20 20 20 20 20 57 48   4 AS a).     WH
3480: 45 52 45 20 62 3d 33 0a 20 20 7d 0a 7d 20 7b 7d  ERE b=3.  }.} {}
3490: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
34a0: 2d 39 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -9.10 {.  execsq
34b0: 6c 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  l2 {.    SELECT 
34c0: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31  * FROM (SELECT 1
34d0: 20 41 53 20 61 2c 20 32 20 41 53 20 62 20 55 4e   AS a, 2 AS b UN
34e0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 33  ION ALL SELECT 3
34f0: 20 41 53 20 62 2c 20 34 20 41 53 20 61 29 0a 20   AS b, 4 AS a). 
3500: 20 20 20 20 57 48 45 52 45 20 62 3d 32 0a 20 20      WHERE b=2.  
3510: 7d 0a 7d 20 7b 61 20 31 20 62 20 32 7d 0a 64 6f  }.} {a 1 b 2}.do
3520: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 39 2e  _test select4-9.
3530: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 32 20  11 {.  execsql2 
3540: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
3550: 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53  ROM (SELECT 1 AS
3560: 20 61 2c 20 32 20 41 53 20 62 20 55 4e 49 4f 4e   a, 2 AS b UNION
3570: 20 41 4c 4c 20 53 45 4c 45 43 54 20 33 20 41 53   ALL SELECT 3 AS
3580: 20 65 2c 20 34 20 41 53 20 62 29 0a 20 20 20 20   e, 4 AS b).    
3590: 20 57 48 45 52 45 20 62 3d 32 0a 20 20 7d 0a 7d   WHERE b=2.  }.}
35a0: 20 7b 61 20 31 20 62 20 32 7d 0a 64 6f 5f 74 65   {a 1 b 2}.do_te
35b0: 73 74 20 73 65 6c 65 63 74 34 2d 39 2e 31 32 20  st select4-9.12 
35c0: 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20  {.  execsql2 {. 
35d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
35e0: 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 2c   (SELECT 1 AS a,
35f0: 20 32 20 41 53 20 62 20 55 4e 49 4f 4e 20 41 4c   2 AS b UNION AL
3600: 4c 20 53 45 4c 45 43 54 20 33 20 41 53 20 65 2c  L SELECT 3 AS e,
3610: 20 34 20 41 53 20 62 29 0a 20 20 20 20 20 57 48   4 AS b).     WH
3620: 45 52 45 20 62 3e 30 0a 20 20 7d 0a 7d 20 7b 61  ERE b>0.  }.} {a
3630: 20 31 20 62 20 32 20 61 20 33 20 62 20 34 7d 0a   1 b 2 a 3 b 4}.
3640: 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 73  } ;# ifcapable s
3650: 75 62 71 75 65 72 79 0a 0a 23 20 54 72 79 20 63  ubquery..# Try c
3660: 6f 6d 62 69 6e 69 6e 67 20 44 49 53 54 49 4e 43  ombining DISTINC
3670: 54 2c 20 4c 49 4d 49 54 2c 20 61 6e 64 20 4f 46  T, LIMIT, and OF
3680: 46 53 45 54 2e 20 20 4d 61 6b 65 20 73 75 72 65  FSET.  Make sure
3690: 20 74 68 65 79 20 61 6c 6c 20 77 6f 72 6b 0a 23   they all work.#
36a0: 20 74 6f 67 65 74 68 65 72 2e 0a 23 0a 64 6f 5f   together..#.do_
36b0: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 30 2e  test select4-10.
36c0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
36d0: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
36e0: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20  NCT log FROM t1 
36f0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 0a 20 20 7d  ORDER BY log.  }
3700: 0a 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d  .} {0 1 2 3 4 5}
3710: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
3720: 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -10.2 {.  execsq
3730: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
3740: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
3750: 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67   t1 ORDER BY log
3760: 20 4c 49 4d 49 54 20 34 0a 20 20 7d 0a 7d 20 7b   LIMIT 4.  }.} {
3770: 30 20 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74  0 1 2 3}.do_test
3780: 20 73 65 6c 65 63 74 34 2d 31 30 2e 33 20 7b 0a   select4-10.3 {.
3790: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
37a0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
37b0: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  log FROM t1 ORDE
37c0: 52 20 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20 30  R BY log LIMIT 0
37d0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
37e0: 74 20 73 65 6c 65 63 74 34 2d 31 30 2e 34 20 7b  t select4-10.4 {
37f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3800: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
3810: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44   log FROM t1 ORD
3820: 45 52 20 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20  ER BY log LIMIT 
3830: 2d 31 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20  -1.  }.} {0 1 2 
3840: 33 20 34 20 35 7d 0a 64 6f 5f 74 65 73 74 20 73  3 4 5}.do_test s
3850: 65 6c 65 63 74 34 2d 31 30 2e 35 20 7b 0a 20 20  elect4-10.5 {.  
3860: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3870: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
3880: 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  g FROM t1 ORDER 
3890: 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20 2d 31 20  BY log LIMIT -1 
38a0: 4f 46 46 53 45 54 20 32 0a 20 20 7d 0a 7d 20 7b  OFFSET 2.  }.} {
38b0: 32 20 33 20 34 20 35 7d 0a 64 6f 5f 74 65 73 74  2 3 4 5}.do_test
38c0: 20 73 65 6c 65 63 74 34 2d 31 30 2e 36 20 7b 0a   select4-10.6 {.
38d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
38e0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
38f0: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  log FROM t1 ORDE
3900: 52 20 42 59 20 6c 6f 67 20 4c 49 4d 49 54 20 33  R BY log LIMIT 3
3910: 20 4f 46 46 53 45 54 20 32 0a 20 20 7d 0a 7d 20   OFFSET 2.  }.} 
3920: 7b 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20  {2 3 4}.do_test 
3930: 73 65 6c 65 63 74 34 2d 31 30 2e 37 20 7b 0a 20  select4-10.7 {. 
3940: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3950: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
3960: 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  og FROM t1 ORDER
3970: 20 42 59 20 2b 6c 6f 67 20 4c 49 4d 49 54 20 33   BY +log LIMIT 3
3980: 20 4f 46 46 53 45 54 20 32 30 0a 20 20 7d 0a 7d   OFFSET 20.  }.}
3990: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   {}.do_test sele
39a0: 63 74 34 2d 31 30 2e 38 20 7b 0a 20 20 65 78 65  ct4-10.8 {.  exe
39b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
39c0: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
39d0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
39e0: 6c 6f 67 20 4c 49 4d 49 54 20 30 20 4f 46 46 53  log LIMIT 0 OFFS
39f0: 45 54 20 33 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  ET 3.  }.} {}.do
3a00: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 30  _test select4-10
3a10: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
3a20: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
3a30: 49 4e 43 54 20 6d 61 78 28 6e 29 2c 20 6c 6f 67  INCT max(n), log
3a40: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
3a50: 59 20 2b 6c 6f 67 3b 20 2d 2d 20 4c 49 4d 49 54  Y +log; -- LIMIT
3a60: 20 32 20 4f 46 46 53 45 54 20 31 0a 20 20 7d 0a   2 OFFSET 1.  }.
3a70: 7d 20 7b 33 31 20 35 7d 0a 0a 23 20 4d 61 6b 65  } {31 5}..# Make
3a80: 20 73 75 72 65 20 63 6f 6d 70 6f 75 6e 64 20 53   sure compound S
3a90: 45 4c 45 43 54 73 20 77 69 74 68 20 77 69 6c 64  ELECTs with wild
3aa0: 6c 79 20 64 69 66 66 65 72 65 6e 74 20 6e 75 6d  ly different num
3ab0: 62 65 72 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  bers of columns.
3ac0: 23 20 64 6f 20 6e 6f 74 20 63 61 75 73 65 20 61  # do not cause a
3ad0: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 73 20  ssertion faults 
3ae0: 64 75 65 20 74 6f 20 72 65 67 69 73 74 65 72 20  due to register 
3af0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 73 75 65  allocation issue
3b00: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c  s..#.do_test sel
3b10: 65 63 74 34 2d 31 31 2e 31 20 7b 0a 20 20 63 61  ect4-11.1 {.  ca
3b20: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
3b30: 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  ECT x,x,x,x,x,x,
3b40: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,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 20  x,x,x,x,x,x,x,x 
3b70: 46 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f  FROM t2.    UNIO
3b80: 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  N.    SELECT x F
3b90: 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t2.  }.} {1 
3ba0: 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  {SELECTs to the 
3bb0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
3bc0: 66 20 55 4e 49 4f 4e 20 64 6f 20 6e 6f 74 20 68  f UNION do not h
3bd0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
3be0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
3bf0: 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20  lumns}}.do_test 
3c00: 73 65 6c 65 63 74 34 2d 31 31 2e 32 20 7b 0a 20  select4-11.2 {. 
3c10: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
3c20: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
3c30: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53  .    UNION.    S
3c40: 45 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c  ELECT x,x,x,x,x,
3c50: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20  x FROM t2.  }.} 
3c90: 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74  {1 {SELECTs to t
3ca0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
3cb0: 74 20 6f 66 20 55 4e 49 4f 4e 20 64 6f 20 6e 6f  t of UNION do no
3cc0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
3cd0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
3ce0: 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65   columns}}.do_te
3cf0: 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 33 20  st select4-11.3 
3d00: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
3d10: 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c     SELECT x,x,x,
3d20: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
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 20 46 52 4f 4d 20 74 32 0a 20 20  x,x,x FROM t2.  
3d60: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
3d70: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
3d80: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43  .  }.} {1 {SELEC
3d90: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
3da0: 6e 64 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f  nd right of UNIO
3db0: 4e 20 41 4c 4c 20 64 6f 20 6e 6f 74 20 68 61 76  N ALL do not hav
3dc0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
3dd0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
3de0: 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65  mns}}.do_test se
3df0: 6c 65 63 74 34 2d 31 31 2e 34 20 7b 0a 20 20 63  lect4-11.4 {.  c
3e00: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
3e10: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
3e20: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
3e30: 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c   SELECT x,x,x,x,
3e40: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a  x,x FROM t2.  }.
3e80: 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f  } {1 {SELECTs to
3e90: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
3ea0: 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  ght of UNION ALL
3eb0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
3ec0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
3ed0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d  result columns}}
3ee0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
3ef0: 2d 31 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  -11.5 {.  catchs
3f00: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3f10: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
3f20: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,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 20 46 52 4f 4d  x,x,x,x,x,x FROM
3f50: 20 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a 20   t2.    EXCEPT. 
3f60: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
3f70: 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45   t2.  }.} {1 {SE
3f80: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
3f90: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 45  t and right of E
3fa0: 58 43 45 50 54 20 64 6f 20 6e 6f 74 20 68 61 76  XCEPT do not hav
3fb0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
3fc0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
3fd0: 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65  mns}}.do_test se
3fe0: 6c 65 63 74 34 2d 31 31 2e 36 20 7b 0a 20 20 63  lect4-11.6 {.  c
3ff0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
4000: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
4010: 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45     EXCEPT.    SE
4020: 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c 78  LECT x,x,x,x,x,x
4030: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,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: 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b   FROM t2.  }.} {
4070: 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68  1 {SELECTs to th
4080: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
4090: 20 6f 66 20 45 58 43 45 50 54 20 64 6f 20 6e 6f   of EXCEPT do no
40a0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
40b0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
40c0: 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74 65   columns}}.do_te
40d0: 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 37 20  st select4-11.7 
40e0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
40f0: 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c     SELECT x,x,x,
4100: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
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 20 46 52 4f 4d 20 74 32 0a 20 20  x,x,x FROM t2.  
4140: 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20    INTERSECT.    
4150: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
4160: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43  .  }.} {1 {SELEC
4170: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
4180: 6e 64 20 72 69 67 68 74 20 6f 66 20 49 4e 54 45  nd right of INTE
4190: 52 53 45 43 54 20 64 6f 20 6e 6f 74 20 68 61 76  RSECT do not hav
41a0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
41b0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
41c0: 6d 6e 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65  mns}}.do_test se
41d0: 6c 65 63 74 34 2d 31 31 2e 38 20 7b 0a 20 20 63  lect4-11.8 {.  c
41e0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
41f0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
4200: 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20     INTERSECT.   
4210: 20 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c   SELECT x,x,x,x,
4220: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a  x,x FROM t2.  }.
4260: 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f  } {1 {SELECTs to
4270: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
4280: 67 68 74 20 6f 66 20 49 4e 54 45 52 53 45 43 54  ght of INTERSECT
4290: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
42a0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
42b0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d  result columns}}
42c0: 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  ..do_test select
42d0: 34 2d 31 31 2e 31 31 20 7b 0a 20 20 63 61 74 63  4-11.11 {.  catc
42e0: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
42f0: 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20  T x FROM t2.    
4300: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
4310: 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55   x FROM t2.    U
4320: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c  NION ALL.    SEL
4330: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20  ECT x FROM t2.  
4340: 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c    EXCEPT.    SEL
4350: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20  ECT x FROM t2.  
4360: 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20    INTERSECT.    
4370: 53 45 4c 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78  SELECT x,x,x,x,x
4380: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 7d  ,x,x FROM t2.  }
43c0: 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73 20 74  .} {1 {SELECTs t
43d0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
43e0: 69 67 68 74 20 6f 66 20 49 4e 54 45 52 53 45 43  ight of INTERSEC
43f0: 54 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  T do not have th
4400: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
4410: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d   result columns}
4420: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
4430: 34 2d 31 31 2e 31 32 20 7b 0a 20 20 63 61 74 63  4-11.12 {.  catc
4440: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
4450: 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20  T x FROM t2.    
4460: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
4470: 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55   x FROM t2.    U
4480: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c  NION ALL.    SEL
4490: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20  ECT x FROM t2.  
44a0: 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c    EXCEPT.    SEL
44b0: 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  ECT x,x,x,x,x,x,
44c0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 45 58  x FROM t2.    EX
4500: 43 45 50 54 0a 20 20 20 20 53 45 4c 45 43 54 20  CEPT.    SELECT 
4510: 78 20 46 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20  x FROM t2.  }.} 
4520: 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74  {1 {SELECTs to t
4530: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
4540: 74 20 6f 66 20 45 58 43 45 50 54 20 64 6f 20 6e  t of EXCEPT do n
4550: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
4560: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
4570: 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74  t columns}}.do_t
4580: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 31  est select4-11.1
4590: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
45a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
45b0: 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 0a  OM t2.    UNION.
45c0: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
45d0: 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41  M t2.    UNION A
45e0: 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c  LL.    SELECT x,
45f0: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,x,x,x,
4600: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,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 20 46 52 4f 4d  x,x,x,x,x,x FROM
4630: 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t2.    UNION AL
4640: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  L.    SELECT x F
4650: 52 4f 4d 20 74 32 0a 20 20 20 20 45 58 43 45 50  ROM t2.    EXCEP
4660: 54 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  T.    SELECT x F
4670: 52 4f 4d 20 74 32 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t2.  }.} {1 
4680: 7b 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  {SELECTs to the 
4690: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
46a0: 66 20 55 4e 49 4f 4e 20 41 4c 4c 20 64 6f 20 6e  f UNION ALL do n
46b0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
46c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
46d0: 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64 6f 5f 74  t columns}}.do_t
46e0: 65 73 74 20 73 65 6c 65 63 74 34 2d 31 31 2e 31  est select4-11.1
46f0: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
4700: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
4710: 4f 4d 20 74 32 0a 20 20 20 20 55 4e 49 4f 4e 0a  OM t2.    UNION.
4720: 20 20 20 20 53 45 4c 45 43 54 20 78 2c 78 2c 78      SELECT x,x,x
4730: 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78  ,x,x,x,x,x,x,x,x
4740: 2c 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 20 46 52 4f 4d 20 74 32  ,x,x,x,x FROM t2
4770: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53  .    UNION.    S
4780: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a  ELECT x FROM t2.
4790: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
47a0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
47b0: 74 32 0a 20 20 20 20 45 58 43 45 50 54 0a 20 20  t2.    EXCEPT.  
47c0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
47d0: 74 32 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c  t2.  }.} {1 {SEL
47e0: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
47f0: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 55 4e   and right of UN
4800: 49 4f 4e 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ION do not have 
4810: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
4820: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
4830: 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  s}}.do_test sele
4840: 63 74 34 2d 31 31 2e 31 35 20 7b 0a 20 20 63 61  ct4-11.15 {.  ca
4850: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
4860: 45 43 54 20 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  ECT x,x,x,x,x,x,
4870: 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c 78 2c  x,x,x,x,x,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 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55 4e  x FROM t2.    UN
48b0: 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 78  ION.    SELECT x
48c0: 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 49 4e 54   FROM t2.    INT
48d0: 45 52 53 45 43 54 0a 20 20 20 20 53 45 4c 45 43  ERSECT.    SELEC
48e0: 54 20 78 20 46 52 4f 4d 20 74 32 0a 20 20 20 20  T x FROM t2.    
48f0: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45  UNION ALL.    SE
4900: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
4910: 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 53 45     EXCEPT.    SE
4920: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 0a 20  LECT x FROM t2. 
4930: 20 7d 0a 7d 20 7b 31 20 7b 53 45 4c 45 43 54 73   }.} {1 {SELECTs
4940: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
4950: 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20   right of UNION 
4960: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
4970: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
4980: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a  esult columns}}.
4990: 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20  .} ;# ifcapable 
49a0: 63 6f 6d 70 6f 75 6e 64 0a 0a 66 69 6e 69 73 68  compound..finish
49b0: 5f 74 65 73 74 0a                                _test.