/ Hex Artifact Content
Login

Artifact e7e9a32fa745246cb99fadbeb63af4843a17925b:


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 31 33 20 32 30 30 33 2f 30 32 2f 30 32   1.13 2003/02/02
0230: 20 31 32 3a 34 31 3a 32 37 20 64 72 68 20 45 78   12:41:27 drh Ex
0240: 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72  p $..set testdir
0250: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0260: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0270: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0280: 6c 0a 0a 23 20 42 75 69 6c 64 20 73 6f 6d 65 20  l..# Build some 
0290: 74 65 73 74 20 64 61 74 61 0a 23 0a 73 65 74 20  test data.#.set 
02a0: 66 64 20 5b 6f 70 65 6e 20 64 61 74 61 31 2e 74  fd [open data1.t
02b0: 78 74 20 77 5d 0a 66 6f 72 20 7b 73 65 74 20 69  xt w].for {set i
02c0: 20 31 7d 20 7b 24 69 3c 33 32 7d 20 7b 69 6e 63   1} {$i<32} {inc
02d0: 72 20 69 7d 20 7b 0a 20 20 66 6f 72 20 7b 73 65  r i} {.  for {se
02e0: 74 20 6a 20 30 7d 20 7b 70 6f 77 28 32 2c 24 6a  t j 0} {pow(2,$j
02f0: 29 3c 24 69 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b  )<$i} {incr j} {
0300: 7d 0a 20 20 70 75 74 73 20 24 66 64 20 22 24 69  }.  puts $fd "$i
0310: 5c 74 24 6a 22 0a 7d 0a 63 6c 6f 73 65 20 24 66  \t$j".}.close $f
0320: 64 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52  d.execsql {.  CR
0330: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 6e 20  EATE TABLE t1(n 
0340: 69 6e 74 2c 20 6c 6f 67 20 69 6e 74 29 3b 0a 20  int, log int);. 
0350: 20 43 4f 50 59 20 74 31 20 46 52 4f 4d 20 27 64   COPY t1 FROM 'd
0360: 61 74 61 31 2e 74 78 74 27 0a 7d 0a 66 69 6c 65  ata1.txt'.}.file
0370: 20 64 65 6c 65 74 65 20 64 61 74 61 31 2e 74 78   delete data1.tx
0380: 74 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  t..do_test selec
0390: 74 34 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73  t4-1.0 {.  execs
03a0: 71 6c 20 7b 53 45 4c 45 43 54 20 44 49 53 54 49  ql {SELECT DISTI
03b0: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20  NCT log FROM t1 
03c0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 7d 0a 7d 20  ORDER BY log}.} 
03d0: 7b 30 20 31 20 32 20 33 20 34 20 35 7d 0a 0a 23  {0 1 2 3 4 5}..#
03e0: 20 55 6e 69 6f 6e 20 41 6c 6c 20 6f 70 65 72 61   Union All opera
03f0: 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65  tor.#.do_test se
0400: 6c 65 63 74 34 2d 31 2e 31 61 20 7b 0a 20 20 6c  lect4-1.1a {.  l
0410: 73 6f 72 74 20 5b 65 78 65 63 73 71 6c 20 7b 53  sort [execsql {S
0420: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
0430: 6f 67 20 46 52 4f 4d 20 74 31 7d 5d 0a 7d 20 7b  og FROM t1}].} {
0440: 30 20 31 20 32 20 33 20 34 20 35 7d 0a 64 6f 5f  0 1 2 3 4 5}.do_
0450: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e 31  test select4-1.1
0460: 62 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 65 78 65  b {.  lsort [exe
0470: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20 46  csql {SELECT n F
0480: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
0490: 3d 33 7d 5d 0a 7d 20 7b 35 20 36 20 37 20 38 7d  =3}].} {5 6 7 8}
04a0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
04b0: 2d 31 2e 31 63 20 7b 0a 20 20 65 78 65 63 73 71  -1.1c {.  execsq
04c0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
04d0: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
04e0: 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c   t1.    UNION AL
04f0: 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46  L.    SELECT n F
0500: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
0510: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
0520: 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20  log;.  }.} {0 1 
0530: 32 20 33 20 34 20 35 20 35 20 36 20 37 20 38 7d  2 3 4 5 5 6 7 8}
0540: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
0550: 2d 31 2e 31 64 20 7b 0a 20 20 65 78 65 63 73 71  -1.1d {.  execsq
0560: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0570: 41 42 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20  ABLE t2 AS.     
0580: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0590: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
05a0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
05b0: 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d     SELECT n FROM
05c0: 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a   t1 WHERE log=3.
05d0: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c        ORDER BY l
05e0: 6f 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  og;.    SELECT *
05f0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
0600: 7b 30 20 31 20 32 20 33 20 34 20 35 20 35 20 36  {0 1 2 3 4 5 5 6
0610: 20 37 20 38 7d 0a 65 78 65 63 73 71 6c 20 7b 44   7 8}.execsql {D
0620: 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 64 6f  ROP TABLE t2}.do
0630: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 31 2e  _test select4-1.
0640: 31 65 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  1e {.  execsql {
0650: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0660: 45 20 74 32 20 41 53 0a 20 20 20 20 20 20 53 45  E t2 AS.      SE
0670: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
0680: 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20  g FROM t1.      
0690: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20  UNION ALL.      
06a0: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
06b0: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
06c0: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20     ORDER BY log 
06d0: 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45 43 54  DESC;.    SELECT
06e0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
06f0: 7d 20 7b 38 20 37 20 36 20 35 20 35 20 34 20 33  } {8 7 6 5 5 4 3
0700: 20 32 20 31 20 30 7d 0a 65 78 65 63 73 71 6c 20   2 1 0}.execsql 
0710: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a  {DROP TABLE t2}.
0720: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
0730: 31 2e 31 66 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.1f {.  execsql
0740: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
0750: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
0760: 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  t1.    UNION ALL
0770: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52  .    SELECT n FR
0780: 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d  OM t1 WHERE log=
0790: 32 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33  2.  }.} {0 1 2 3
07a0: 20 34 20 35 20 33 20 34 7d 0a 64 6f 5f 74 65 73   4 5 3 4}.do_tes
07b0: 74 20 73 65 6c 65 63 74 34 2d 31 2e 31 67 20 7b  t select4-1.1g {
07c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
07d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
07e0: 20 41 53 20 0a 20 20 20 20 20 20 53 45 4c 45 43   AS .      SELEC
07f0: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
0800: 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 55 4e 49  ROM t1.      UNI
0810: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
0820: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
0830: 45 52 45 20 6c 6f 67 3d 32 3b 0a 20 20 20 20 53  ERE log=2;.    S
0840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
0850: 0a 20 20 7d 0a 7d 20 7b 30 20 31 20 32 20 33 20  .  }.} {0 1 2 3 
0860: 34 20 35 20 33 20 34 7d 0a 65 78 65 63 73 71 6c  4 5 3 4}.execsql
0870: 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d   {DROP TABLE t2}
0880: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
0890: 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.2 {.  execsql
08a0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f   {.    SELECT lo
08b0: 67 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  g FROM t1 WHERE 
08c0: 6e 20 49 4e 20 0a 20 20 20 20 20 20 28 53 45 4c  n IN .      (SEL
08d0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
08e0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
08f0: 4c 4c 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54  LL.       SELECT
0900: 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   n FROM t1 WHERE
0910: 20 6c 6f 67 3d 33 29 0a 20 20 20 20 4f 52 44 45   log=3).    ORDE
0920: 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20  R BY log;.  }.} 
0930: 7b 30 20 31 20 32 20 32 20 33 20 33 20 33 20 33  {0 1 2 2 3 3 3 3
0940: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
0950: 34 2d 31 2e 33 20 7b 0a 20 20 73 65 74 20 76 20  4-1.3 {.  set v 
0960: 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20  [catch {execsql 
0970: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  {.    SELECT DIS
0980: 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74  TINCT log FROM t
0990: 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 0a 20  1 ORDER BY log. 
09a0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
09b0: 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74   SELECT n FROM t
09c0: 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20  1 WHERE log=3.  
09d0: 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a    ORDER BY log;.
09e0: 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70    }} msg].  lapp
09f0: 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20  end v $msg.} {1 
0a00: 7b 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  {ORDER BY clause
0a10: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
0a20: 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 6e 6f 74  er UNION ALL not
0a30: 20 62 65 66 6f 72 65 7d 7d 0a 0a 23 20 55 6e 69   before}}..# Uni
0a40: 6f 6e 20 6f 70 65 72 61 74 6f 72 0a 23 0a 64 6f  on operator.#.do
0a50: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 32 2e  _test select4-2.
0a60: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0a70: 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
0a80: 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a  NCT log FROM t1.
0a90: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
0aa0: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
0ab0: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f  HERE log=3.    O
0ac0: 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d  RDER BY log;.  }
0ad0: 0a 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35 20  .} {0 1 2 3 4 5 
0ae0: 36 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73  6 7 8}.do_test s
0af0: 65 6c 65 63 74 34 2d 32 2e 32 20 7b 0a 20 20 65  elect4-2.2 {.  e
0b00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0b10: 45 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20  ECT log FROM t1 
0b20: 57 48 45 52 45 20 6e 20 49 4e 20 0a 20 20 20 20  WHERE n IN .    
0b30: 20 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e    (SELECT DISTIN
0b40: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 55  CT log FROM t1 U
0b50: 4e 49 4f 4e 0a 20 20 20 20 20 20 20 53 45 4c 45  NION.       SELE
0b60: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
0b70: 52 45 20 6c 6f 67 3d 33 29 0a 20 20 20 20 4f 52  RE log=3).    OR
0b80: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a  DER BY log;.  }.
0b90: 7d 20 7b 30 20 31 20 32 20 32 20 33 20 33 20 33  } {0 1 2 2 3 3 3
0ba0: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   3}.do_test sele
0bb0: 63 74 34 2d 32 2e 33 20 7b 0a 20 20 73 65 74 20  ct4-2.3 {.  set 
0bc0: 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71  v [catch {execsq
0bd0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44  l {.    SELECT D
0be0: 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d  ISTINCT log FROM
0bf0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67   t1 ORDER BY log
0c00: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53  .    UNION.    S
0c10: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
0c20: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
0c30: 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20  ORDER BY log;.  
0c40: 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  }} msg].  lappen
0c50: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 4f  d v $msg.} {1 {O
0c60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
0c70: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
0c80: 20 55 4e 49 4f 4e 20 6e 6f 74 20 62 65 66 6f 72   UNION not befor
0c90: 65 7d 7d 0a 0a 23 20 45 78 63 65 70 74 20 6f 70  e}}..# Except op
0ca0: 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74  erator.#.do_test
0cb0: 20 73 65 6c 65 63 74 34 2d 33 2e 31 2e 31 20 7b   select4-3.1.1 {
0cc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0cd0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0ce0: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
0cf0: 20 45 58 43 45 50 54 0a 20 20 20 20 53 45 4c 45   EXCEPT.    SELE
0d00: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
0d10: 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44  RE log=3.    ORD
0d20: 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d  ER BY log;.  }.}
0d30: 20 7b 30 20 31 20 32 20 33 20 34 7d 0a 64 6f 5f   {0 1 2 3 4}.do_
0d40: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 33 2e 31  test select4-3.1
0d50: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0d60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0d70: 45 20 74 32 20 41 53 20 0a 20 20 20 20 20 20 53  E t2 AS .      S
0d80: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
0d90: 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20  og FROM t1.     
0da0: 20 45 58 43 45 50 54 0a 20 20 20 20 20 20 53 45   EXCEPT.      SE
0db0: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
0dc0: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 20  HERE log=3.     
0dd0: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
0de0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0df0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 20   t2;.  }.} {0 1 
0e00: 32 20 33 20 34 7d 0a 65 78 65 63 73 71 6c 20 7b  2 3 4}.execsql {
0e10: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 64  DROP TABLE t2}.d
0e20: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 33  o_test select4-3
0e30: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
0e40: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0e50: 42 4c 45 20 74 32 20 41 53 20 0a 20 20 20 20 20  BLE t2 AS .     
0e60: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0e70: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
0e80: 20 20 20 45 58 43 45 50 54 0a 20 20 20 20 20 20     EXCEPT.      
0e90: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
0ea0: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
0eb0: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20     ORDER BY log 
0ec0: 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45 43 54  DESC;.    SELECT
0ed0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
0ee0: 7d 20 7b 34 20 33 20 32 20 31 20 30 7d 0a 65 78  } {4 3 2 1 0}.ex
0ef0: 65 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c  ecsql {DROP TABL
0f00: 45 20 74 32 7d 0a 64 6f 5f 74 65 73 74 20 73 65  E t2}.do_test se
0f10: 6c 65 63 74 34 2d 33 2e 32 20 7b 0a 20 20 65 78  lect4-3.2 {.  ex
0f20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0f30: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 57  CT log FROM t1 W
0f40: 48 45 52 45 20 6e 20 49 4e 20 0a 20 20 20 20 20  HERE n IN .     
0f50: 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   (SELECT DISTINC
0f60: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 20 45 58  T log FROM t1 EX
0f70: 43 45 50 54 0a 20 20 20 20 20 20 20 53 45 4c 45  CEPT.       SELE
0f80: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
0f90: 52 45 20 6c 6f 67 3d 33 29 0a 20 20 20 20 4f 52  RE log=3).    OR
0fa0: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a  DER BY log;.  }.
0fb0: 7d 20 7b 30 20 31 20 32 20 32 7d 0a 64 6f 5f 74  } {0 1 2 2}.do_t
0fc0: 65 73 74 20 73 65 6c 65 63 74 34 2d 33 2e 33 20  est select4-3.3 
0fd0: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
0fe0: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
0ff0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1000: 6c 6f 67 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  log FROM t1 ORDE
1010: 52 20 42 59 20 6c 6f 67 0a 20 20 20 20 45 58 43  R BY log.    EXC
1020: 45 50 54 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  EPT.    SELECT n
1030: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c   FROM t1 WHERE l
1040: 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42  og=3.    ORDER B
1050: 59 20 6c 6f 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d  Y log;.  }} msg]
1060: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
1070: 67 0a 7d 20 7b 31 20 7b 4f 52 44 45 52 20 42 59  g.} {1 {ORDER BY
1080: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
1090: 6f 6d 65 20 61 66 74 65 72 20 45 58 43 45 50 54  ome after EXCEPT
10a0: 20 6e 6f 74 20 62 65 66 6f 72 65 7d 7d 0a 0a 23   not before}}..#
10b0: 20 49 6e 74 65 72 73 65 63 74 20 6f 70 65 72 61   Intersect opera
10c0: 74 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65  tor.#.do_test se
10d0: 6c 65 63 74 34 2d 34 2e 31 2e 31 20 7b 0a 20 20  lect4-4.1.1 {.  
10e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
10f0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f  LECT DISTINCT lo
1100: 67 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 49 4e  g FROM t1.    IN
1110: 54 45 52 53 45 43 54 0a 20 20 20 20 53 45 4c 45  TERSECT.    SELE
1120: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45  CT n FROM t1 WHE
1130: 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44  RE log=3.    ORD
1140: 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d  ER BY log;.  }.}
1150: 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c   {5}.do_test sel
1160: 65 63 74 34 2d 34 2e 31 2e 32 20 7b 0a 20 20 65  ect4-4.1.2 {.  e
1170: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1180: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
1190: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
11a0: 4c 4c 20 53 45 4c 45 43 54 20 36 0a 20 20 20 20  LL SELECT 6.    
11b0: 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 53 45  INTERSECT.    SE
11c0: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
11d0: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f  HERE log=3.    O
11e0: 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d  RDER BY log;.  }
11f0: 0a 7d 20 7b 35 20 36 7d 0a 64 6f 5f 74 65 73 74  .} {5 6}.do_test
1200: 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e 33 20 7b   select4-4.1.3 {
1210: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1220: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1230: 20 41 53 0a 20 20 20 20 20 20 53 45 4c 45 43 54   AS.      SELECT
1240: 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46 52   DISTINCT log FR
1250: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
1260: 53 45 4c 45 43 54 20 36 0a 20 20 20 20 20 20 49  SELECT 6.      I
1270: 4e 54 45 52 53 45 43 54 0a 20 20 20 20 20 20 53  NTERSECT.      S
1280: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
1290: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
12a0: 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a    ORDER BY log;.
12b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12c0: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 35 20 36  M t2;.  }.} {5 6
12d0: 7d 0a 65 78 65 63 73 71 6c 20 7b 44 52 4f 50 20  }.execsql {DROP 
12e0: 54 41 42 4c 45 20 74 32 7d 0a 64 6f 5f 74 65 73  TABLE t2}.do_tes
12f0: 74 20 73 65 6c 65 63 74 34 2d 34 2e 31 2e 34 20  t select4-4.1.4 
1300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1310: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1320: 32 20 41 53 0a 20 20 20 20 20 20 53 45 4c 45 43  2 AS.      SELEC
1330: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 46  T DISTINCT log F
1340: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
1350: 20 53 45 4c 45 43 54 20 36 0a 20 20 20 20 20 20   SELECT 6.      
1360: 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20 20 20  INTERSECT.      
1370: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
1380: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
1390: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 20     ORDER BY log 
13a0: 44 45 53 43 3b 0a 20 20 20 20 53 45 4c 45 43 54  DESC;.    SELECT
13b0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
13c0: 7d 20 7b 36 20 35 7d 0a 65 78 65 63 73 71 6c 20  } {6 5}.execsql 
13d0: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a  {DROP TABLE t2}.
13e0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d  do_test select4-
13f0: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
1400: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 6f 67  {.    SELECT log
1410: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e   FROM t1 WHERE n
1420: 20 49 4e 20 0a 20 20 20 20 20 20 28 53 45 4c 45   IN .      (SELE
1430: 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20  CT DISTINCT log 
1440: 46 52 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43  FROM t1 INTERSEC
1450: 54 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  T.       SELECT 
1460: 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  n FROM t1 WHERE 
1470: 6c 6f 67 3d 33 29 0a 20 20 20 20 4f 52 44 45 52  log=3).    ORDER
1480: 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b   BY log;.  }.} {
1490: 33 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  3}.do_test selec
14a0: 74 34 2d 34 2e 33 20 7b 0a 20 20 73 65 74 20 76  t4-4.3 {.  set v
14b0: 20 5b 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c   [catch {execsql
14c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
14d0: 53 54 49 4e 43 54 20 6c 6f 67 20 46 52 4f 4d 20  STINCT log FROM 
14e0: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 0a  t1 ORDER BY log.
14f0: 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20      INTERSECT.  
1500: 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20    SELECT n FROM 
1510: 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20  t1 WHERE log=3. 
1520: 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b     ORDER BY log;
1530: 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70  .  }} msg].  lap
1540: 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31  pend v $msg.} {1
1550: 20 7b 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73   {ORDER BY claus
1560: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
1570: 74 65 72 20 49 4e 54 45 52 53 45 43 54 20 6e 6f  ter INTERSECT no
1580: 74 20 62 65 66 6f 72 65 7d 7d 0a 0a 23 20 56 61  t before}}..# Va
1590: 72 69 6f 75 73 20 65 72 72 6f 72 20 6d 65 73 73  rious error mess
15a0: 61 67 65 73 20 77 68 69 6c 65 20 70 72 6f 63 65  ages while proce
15b0: 73 73 69 6e 67 20 55 4e 49 4f 4e 20 6f 72 20 49  ssing UNION or I
15c0: 4e 54 45 52 53 45 43 54 0a 23 0a 64 6f 5f 74 65  NTERSECT.#.do_te
15d0: 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 31 20 7b  st select4-5.1 {
15e0: 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20  .  set v [catch 
15f0: 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53  {execsql {.    S
1600: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c  ELECT DISTINCT l
1610: 6f 67 20 46 52 4f 4d 20 74 32 0a 20 20 20 20 55  og FROM t2.    U
1620: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c  NION ALL.    SEL
1630: 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48  ECT n FROM t1 WH
1640: 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52  ERE log=3.    OR
1650: 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 7d  DER BY log;.  }}
1660: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
1670: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20  v $msg.} {1 {no 
1680: 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32 7d 7d  such table: t2}}
1690: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
16a0: 2d 35 2e 32 20 7b 0a 20 20 73 65 74 20 76 20 5b  -5.2 {.  set v [
16b0: 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b  catch {execsql {
16c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
16d0: 49 4e 43 54 20 6c 6f 67 20 41 53 20 22 78 79 7a  INCT log AS "xyz
16e0: 7a 79 22 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  zy" FROM t1.    
16f0: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45  UNION ALL.    SE
1700: 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 57  LECT n FROM t1 W
1710: 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f  HERE log=3.    O
1720: 52 44 45 52 20 42 59 20 78 79 7a 7a 79 3b 0a 20  RDER BY xyzzy;. 
1730: 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65   }} msg].  lappe
1740: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b  nd v $msg.} {0 {
1750: 30 20 31 20 32 20 33 20 34 20 35 20 35 20 36 20  0 1 2 3 4 5 5 6 
1760: 37 20 38 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65  7 8}}.do_test se
1770: 6c 65 63 74 34 2d 35 2e 32 62 20 7b 0a 20 20 73  lect4-5.2b {.  s
1780: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65  et v [catch {exe
1790: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
17a0: 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67 20 41  T DISTINCT log A
17b0: 53 20 78 79 7a 7a 79 20 46 52 4f 4d 20 74 31 0a  S xyzzy FROM t1.
17c0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
17d0: 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20    SELECT n FROM 
17e0: 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20  t1 WHERE log=3. 
17f0: 20 20 20 4f 52 44 45 52 20 42 59 20 27 78 79 7a     ORDER BY 'xyz
1800: 7a 79 27 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20  zy';.  }} msg]. 
1810: 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a   lappend v $msg.
1820: 7d 20 7b 30 20 7b 30 20 31 20 32 20 33 20 34 20  } {0 {0 1 2 3 4 
1830: 35 20 35 20 36 20 37 20 38 7d 7d 0a 64 6f 5f 74  5 5 6 7 8}}.do_t
1840: 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 63  est select4-5.2c
1850: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
1860: 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  h {execsql {.   
1870: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
1880: 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20 20   log FROM t1.   
1890: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53   UNION ALL.    S
18a0: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
18b0: 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20 20  WHERE log=3.    
18c0: 4f 52 44 45 52 20 42 59 20 27 78 79 7a 7a 79 27  ORDER BY 'xyzzy'
18d0: 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61  ;.  }} msg].  la
18e0: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
18f0: 31 20 7b 4f 52 44 45 52 20 42 59 20 74 65 72 6d  1 {ORDER BY term
1900: 20 6e 75 6d 62 65 72 20 31 20 64 6f 65 73 20 6e   number 1 does n
1910: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
1920: 75 6c 74 20 63 6f 6c 75 6d 6e 7d 7d 0a 64 6f 5f  ult column}}.do_
1930: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e 32  test select4-5.2
1940: 64 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  d {.  set v [cat
1950: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20  ch {execsql {.  
1960: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1970: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20  T log FROM t1.  
1980: 20 20 49 4e 54 45 52 53 45 43 54 0a 20 20 20 20    INTERSECT.    
1990: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
19a0: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
19b0: 20 4f 52 44 45 52 20 42 59 20 27 78 79 7a 7a 79   ORDER BY 'xyzzy
19c0: 27 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c  ';.  }} msg].  l
19d0: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
19e0: 7b 31 20 7b 4f 52 44 45 52 20 42 59 20 74 65 72  {1 {ORDER BY ter
19f0: 6d 20 6e 75 6d 62 65 72 20 31 20 64 6f 65 73 20  m number 1 does 
1a00: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
1a10: 73 75 6c 74 20 63 6f 6c 75 6d 6e 7d 7d 0a 64 6f  sult column}}.do
1a20: 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35 2e  _test select4-5.
1a30: 32 65 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  2e {.  set v [ca
1a40: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20  tch {execsql {. 
1a50: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
1a60: 43 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20  CT log FROM t1. 
1a70: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
1a80: 20 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74   SELECT n FROM t
1a90: 31 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20  1 WHERE log=3.  
1aa0: 20 20 4f 52 44 45 52 20 42 59 20 6e 3b 0a 20 20    ORDER BY n;.  
1ab0: 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  }} msg].  lappen
1ac0: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 30  d v $msg.} {0 {0
1ad0: 20 31 20 32 20 33 20 34 20 35 20 35 20 36 20 37   1 2 3 4 5 5 6 7
1ae0: 20 38 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c   8}}.do_test sel
1af0: 65 63 74 34 2d 35 2e 32 66 20 7b 0a 20 20 63 61  ect4-5.2f {.  ca
1b00: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
1b10: 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 6f 67  ECT DISTINCT log
1b20: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49   FROM t1.    UNI
1b30: 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43  ON ALL.    SELEC
1b40: 54 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T n FROM t1 WHER
1b50: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1b60: 52 20 42 59 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20  R BY log;.  }.} 
1b70: 7b 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 20  {0 {0 1 2 3 4 5 
1b80: 35 20 36 20 37 20 38 7d 7d 0a 64 6f 5f 74 65 73  5 6 7 8}}.do_tes
1b90: 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 67 20 7b  t select4-5.2g {
1ba0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1bb0: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1bc0: 54 20 6c 6f 67 20 46 52 4f 4d 20 74 31 0a 20 20  T log FROM t1.  
1bd0: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
1be0: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
1bf0: 20 57 48 45 52 45 20 6c 6f 67 3d 33 0a 20 20 20   WHERE log=3.   
1c00: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
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: 68 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  h {.  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 32 3b 0a      ORDER BY 2;.
1cb0: 20 20 7d 0a 7d 20 7b 31 20 7b 4f 52 44 45 52 20    }.} {1 {ORDER 
1cc0: 42 59 20 70 6f 73 69 74 69 6f 6e 20 32 20 73 68  BY position 2 sh
1cd0: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
1ce0: 31 20 61 6e 64 20 31 7d 7d 0a 64 6f 5f 74 65 73  1 and 1}}.do_tes
1cf0: 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 69 20 7b  t select4-5.2i {
1d00: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1d10: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1d20: 54 20 31 2c 20 6c 6f 67 20 46 52 4f 4d 20 74 31  T 1, log FROM t1
1d30: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
1d40: 20 20 20 53 45 4c 45 43 54 20 32 2c 20 6e 20 46     SELECT 2, n F
1d50: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
1d60: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
1d70: 32 2c 20 31 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b  2, 1;.  }.} {0 {
1d80: 31 20 30 20 31 20 31 20 31 20 32 20 31 20 33 20  1 0 1 1 1 2 1 3 
1d90: 31 20 34 20 31 20 35 20 32 20 35 20 32 20 36 20  1 4 1 5 2 5 2 6 
1da0: 32 20 37 20 32 20 38 7d 7d 0a 64 6f 5f 74 65 73  2 7 2 8}}.do_tes
1db0: 74 20 73 65 6c 65 63 74 34 2d 35 2e 32 6a 20 7b  t select4-5.2j {
1dc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1dd0: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1de0: 54 20 31 2c 20 6c 6f 67 20 46 52 4f 4d 20 74 31  T 1, log FROM t1
1df0: 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  .    UNION ALL. 
1e00: 20 20 20 53 45 4c 45 43 54 20 32 2c 20 6e 20 46     SELECT 2, n F
1e10: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67  ROM t1 WHERE log
1e20: 3d 33 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  =3.    ORDER BY 
1e30: 31 2c 20 32 20 44 45 53 43 3b 0a 20 20 7d 0a 7d  1, 2 DESC;.  }.}
1e40: 20 7b 30 20 7b 31 20 35 20 31 20 34 20 31 20 33   {0 {1 5 1 4 1 3
1e50: 20 31 20 32 20 31 20 31 20 31 20 30 20 32 20 38   1 2 1 1 1 0 2 8
1e60: 20 32 20 37 20 32 20 36 20 32 20 35 7d 7d 0a 64   2 7 2 6 2 5}}.d
1e70: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1e80: 2e 32 6b 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .2k {.  catchsql
1e90: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
1ea0: 53 54 49 4e 43 54 20 31 2c 20 6c 6f 67 20 46 52  STINCT 1, log FR
1eb0: 4f 4d 20 74 31 0a 20 20 20 20 55 4e 49 4f 4e 20  OM t1.    UNION 
1ec0: 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20 32  ALL.    SELECT 2
1ed0: 2c 20 6e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , n FROM t1 WHER
1ee0: 45 20 6c 6f 67 3d 33 0a 20 20 20 20 4f 52 44 45  E log=3.    ORDE
1ef0: 52 20 42 59 20 6e 2c 20 31 3b 0a 20 20 7d 0a 7d  R BY n, 1;.  }.}
1f00: 20 7b 30 20 7b 31 20 30 20 31 20 31 20 31 20 32   {0 {1 0 1 1 1 2
1f10: 20 31 20 33 20 31 20 34 20 31 20 35 20 32 20 35   1 3 1 4 1 5 2 5
1f20: 20 32 20 36 20 32 20 37 20 32 20 38 7d 7d 0a 64   2 6 2 7 2 8}}.d
1f30: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
1f40: 2e 33 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  .3 {.  set v [ca
1f50: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20  tch {execsql {. 
1f60: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
1f70: 43 54 20 6c 6f 67 2c 20 6e 20 46 52 4f 4d 20 74  CT log, n FROM t
1f80: 31 0a 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  1.    UNION ALL.
1f90: 20 20 20 20 53 45 4c 45 43 54 20 6e 20 46 52 4f      SELECT n FRO
1fa0: 4d 20 74 31 20 57 48 45 52 45 20 6c 6f 67 3d 33  M t1 WHERE log=3
1fb0: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 6f  .    ORDER BY lo
1fc0: 67 3b 0a 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c  g;.  }} msg].  l
1fd0: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
1fe0: 7b 31 20 7b 53 45 4c 45 43 54 73 20 74 6f 20 74  {1 {SELECTs to t
1ff0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
2000: 74 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 20 64  t of UNION ALL d
2010: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
2020: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
2030: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 7d 7d 0a 64  sult columns}}.d
2040: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34 2d 35  o_test select4-5
2050: 2e 34 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  .4 {.  set v [ca
2060: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20  tch {execsql {. 
2070: 20 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52     SELECT log FR
2080: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 32 0a  OM t1 WHERE n=2.
2090: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
20a0: 20 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f    SELECT log FRO
20b0: 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 33 0a 20  M t1 WHERE n=3. 
20c0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
20d0: 20 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f 4d   SELECT log FROM
20e0: 20 74 31 20 57 48 45 52 45 20 6e 3d 34 0a 20 20   t1 WHERE n=4.  
20f0: 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20    UNION ALL.    
2100: 53 45 4c 45 43 54 20 6c 6f 67 20 46 52 4f 4d 20  SELECT log FROM 
2110: 74 31 20 57 48 45 52 45 20 6e 3d 35 0a 20 20 20  t1 WHERE n=5.   
2120: 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 3b 0a 20   ORDER BY log;. 
2130: 20 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65   }} msg].  lappe
2140: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 30 20 7b  nd v $msg.} {0 {
2150: 31 20 32 20 32 20 33 7d 7d 0a 0a 64 6f 5f 74 65  1 2 2 3}}..do_te
2160: 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 31 20 7b  st select4-6.1 {
2170: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2180: 20 53 45 4c 45 43 54 20 6c 6f 67 2c 20 63 6f 75   SELECT log, cou
2190: 6e 74 28 2a 29 20 61 73 20 63 6e 74 20 46 52 4f  nt(*) as cnt FRO
21a0: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 6c 6f  M t1 GROUP BY lo
21b0: 67 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  g.    UNION.    
21c0: 53 45 4c 45 43 54 20 6c 6f 67 2c 20 6e 20 46 52  SELECT log, n FR
21d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 3d 37 0a  OM t1 WHERE n=7.
21e0: 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6e 74      ORDER BY cnt
21f0: 2c 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20  , log;.  }.} {0 
2200: 31 20 31 20 31 20 32 20 32 20 33 20 34 20 33 20  1 1 1 2 2 3 4 3 
2210: 37 20 34 20 38 20 35 20 31 35 7d 0a 64 6f 5f 74  7 4 8 5 15}.do_t
2220: 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 32 20  est select4-6.2 
2230: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2240: 20 20 53 45 4c 45 43 54 20 6c 6f 67 2c 20 63 6f    SELECT log, co
2250: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 47  unt(*) FROM t1 G
2260: 52 4f 55 50 20 42 59 20 6c 6f 67 0a 20 20 20 20  ROUP BY log.    
2270: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
2280: 20 6c 6f 67 2c 20 6e 20 46 52 4f 4d 20 74 31 20   log, n FROM t1 
2290: 57 48 45 52 45 20 6e 3d 37 0a 20 20 20 20 4f 52  WHERE n=7.    OR
22a0: 44 45 52 20 42 59 20 63 6f 75 6e 74 28 2a 29 2c  DER BY count(*),
22b0: 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31   log;.  }.} {0 1
22c0: 20 31 20 31 20 32 20 32 20 33 20 34 20 33 20 37   1 1 2 2 3 4 3 7
22d0: 20 34 20 38 20 35 20 31 35 7d 0a 0a 23 20 4e 55   4 8 5 15}..# NU
22e0: 4c 4c 73 20 61 72 65 20 69 6e 64 69 73 74 69 6e  LLs are indistin
22f0: 63 74 20 66 6f 72 20 74 68 65 20 55 4e 49 4f 4e  ct for the UNION
2300: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 4d 61 6b   operator..# Mak
2310: 65 20 73 75 72 65 20 74 68 65 20 55 4e 49 4f 4e  e sure the UNION
2320: 20 6f 70 65 72 61 74 6f 72 20 72 65 63 6f 67 6e   operator recogn
2330: 69 7a 65 73 20 74 68 69 73 0a 23 0a 64 6f 5f 74  izes this.#.do_t
2340: 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 33 20  est select4-6.3 
2350: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2360: 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e    SELECT NULL UN
2370: 49 4f 4e 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  ION SELECT NULL 
2380: 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45 43 54  UNION.    SELECT
2390: 20 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20   1 UNION SELECT 
23a0: 32 20 41 53 20 27 78 27 0a 20 20 20 20 4f 52 44  2 AS 'x'.    ORD
23b0: 45 52 20 42 59 20 78 3b 0a 20 20 7d 0a 7d 20 7b  ER BY x;.  }.} {
23c0: 7b 7d 20 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  {} 1 2}.do_test 
23d0: 73 65 6c 65 63 74 34 2d 36 2e 33 2e 31 20 7b 0a  select4-6.3.1 {.
23e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
23f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f  SELECT NULL UNIO
2400: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 4e 55 4c  N ALL SELECT NUL
2410: 4c 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20  L UNION ALL.    
2420: 53 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41  SELECT 1 UNION A
2430: 4c 4c 20 53 45 4c 45 43 54 20 32 20 41 53 20 27  LL SELECT 2 AS '
2440: 78 27 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  x'.    ORDER BY 
2450: 78 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20  x;.  }.} {{} {} 
2460: 31 20 32 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72  1 2}..# Make sur
2470: 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
2480: 65 79 77 6f 72 64 20 74 72 65 61 74 73 20 4e 55  eyword treats NU
2490: 4c 4c 73 20 61 73 20 69 6e 64 69 73 74 69 6e 63  LLs as indistinc
24a0: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c  t..#.do_test sel
24b0: 65 63 74 34 2d 36 2e 34 20 7b 0a 20 20 65 78 65  ect4-6.4 {.  exe
24c0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
24d0: 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20 20 20  T * FROM (.     
24e0: 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 31    SELECT NULL, 1
24f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2500: 54 20 4e 55 4c 4c 2c 20 31 0a 20 20 20 20 29 3b  T NULL, 1.    );
2510: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 31 20 7b 7d 20  .  }.} {{} 1 {} 
2520: 31 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  1}.do_test selec
2530: 74 34 2d 36 2e 35 20 7b 0a 20 20 65 78 65 63 73  t4-6.5 {.  execs
2540: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2550: 44 49 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20  DISTINCT * FROM 
2560: 28 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  (.       SELECT 
2570: 4e 55 4c 4c 2c 20 31 20 55 4e 49 4f 4e 20 41 4c  NULL, 1 UNION AL
2580: 4c 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 31  L SELECT NULL, 1
2590: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7b  .    );.  }.} {{
25a0: 7d 20 31 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  } 1}.do_test sel
25b0: 65 63 74 34 2d 36 2e 36 20 7b 0a 20 20 65 78 65  ect4-6.6 {.  exe
25c0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
25d0: 54 20 44 49 53 54 49 4e 43 54 20 2a 20 46 52 4f  T DISTINCT * FRO
25e0: 4d 20 28 0a 20 20 20 20 20 20 20 53 45 4c 45 43  M (.       SELEC
25f0: 54 20 31 2c 32 20 20 55 4e 49 4f 4e 20 41 4c 4c  T 1,2  UNION ALL
2600: 20 53 45 4c 45 43 54 20 31 2c 32 0a 20 20 20 20   SELECT 1,2.    
2610: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 0a  );.  }.} {1 2}..
2620: 23 20 54 65 73 74 20 64 69 73 74 69 6e 63 74 6e  # Test distinctn
2630: 65 73 73 20 6f 66 20 4e 55 4c 4c 20 69 6e 20 6f  ess of NULL in o
2640: 74 68 65 72 20 77 61 79 73 2e 0a 23 0a 64 6f 5f  ther ways..#.do_
2650: 74 65 73 74 20 73 65 6c 65 63 74 34 2d 36 2e 37  test select4-6.7
2660: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2670: 20 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 45     SELECT NULL E
2680: 58 43 45 50 54 20 53 45 4c 45 43 54 20 4e 55 4c  XCEPT SELECT NUL
2690: 4c 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 20 4d  L.  }.} {}...# M
26a0: 61 6b 65 20 73 75 72 65 20 63 6f 6c 75 6d 6e 20  ake sure column 
26b0: 6e 61 6d 65 73 20 61 72 65 20 63 6f 72 72 65 63  names are correc
26c0: 74 20 77 68 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  t when a compoun
26d0: 64 20 73 65 6c 65 63 74 20 61 70 70 65 61 72 73  d select appears
26e0: 20 61 73 0a 23 20 61 6e 20 65 78 70 72 65 73 73   as.# an express
26f0: 69 6f 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45  ion in the WHERE
2700: 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 74 65   clause..#.do_te
2710: 73 74 20 73 65 6c 65 63 74 34 2d 37 2e 31 20 7b  st select4-7.1 {
2720: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
2740: 20 41 53 20 53 45 4c 45 43 54 20 6c 6f 67 20 41   AS SELECT log A
2750: 53 20 27 78 27 2c 20 63 6f 75 6e 74 28 2a 29 20  S 'x', count(*) 
2760: 41 53 20 27 79 27 20 46 52 4f 4d 20 74 31 20 47  AS 'y' FROM t1 G
2770: 52 4f 55 50 20 42 59 20 6c 6f 67 3b 0a 20 20 20  ROUP BY log;.   
2780: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2790: 32 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 20 20  2 ORDER BY x;.  
27a0: 7d 0a 7d 20 7b 30 20 31 20 31 20 31 20 32 20 32  }.} {0 1 1 1 2 2
27b0: 20 33 20 34 20 34 20 38 20 35 20 31 35 7d 20 20   3 4 4 8 5 15}  
27c0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 34  .do_test select4
27d0: 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.2 {.  execsql
27e0: 32 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2 {.    SELECT *
27f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e   FROM t1 WHERE n
2800: 20 49 4e 20 28 53 45 4c 45 43 54 20 6e 20 46 52   IN (SELECT n FR
2810: 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54 20  OM t1 INTERSECT 
2820: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2830: 29 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 6e  ).    ORDER BY n
2840: 0a 20 20 7d 0a 7d 20 7b 6e 20 31 20 6c 6f 67 20  .  }.} {n 1 log 
2850: 30 20 6e 20 32 20 6c 6f 67 20 31 20 6e 20 33 20  0 n 2 log 1 n 3 
2860: 6c 6f 67 20 32 20 6e 20 34 20 6c 6f 67 20 32 20  log 2 n 4 log 2 
2870: 6e 20 35 20 6c 6f 67 20 33 7d 0a 64 6f 5f 74 65  n 5 log 3}.do_te
2880: 73 74 20 73 65 6c 65 63 74 34 2d 37 2e 33 20 7b  st select4-7.3 {
2890: 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20 20  .  execsql2 {.  
28a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
28b0: 74 31 20 57 48 45 52 45 20 6e 20 49 4e 20 28 53  t1 WHERE n IN (S
28c0: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
28d0: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 78 20  EXCEPT SELECT x 
28e0: 46 52 4f 4d 20 74 32 29 0a 20 20 20 20 4f 52 44  FROM t2).    ORD
28f0: 45 52 20 42 59 20 6e 20 4c 49 4d 49 54 20 32 0a  ER BY n LIMIT 2.
2900: 20 20 7d 0a 7d 20 7b 6e 20 36 20 6c 6f 67 20 33    }.} {n 6 log 3
2910: 20 6e 20 37 20 6c 6f 67 20 33 7d 0a 64 6f 5f 74   n 7 log 3}.do_t
2920: 65 73 74 20 73 65 6c 65 63 74 34 2d 37 2e 34 20  est select4-7.4 
2930: 7b 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 0a 20  {.  execsql2 {. 
2940: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2950: 20 74 31 20 57 48 45 52 45 20 6e 20 49 4e 20 28   t1 WHERE n IN (
2960: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
2970: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 78 20   UNION SELECT x 
2980: 46 52 4f 4d 20 74 32 29 0a 20 20 20 20 4f 52 44  FROM t2).    ORD
2990: 45 52 20 42 59 20 6e 20 4c 49 4d 49 54 20 32 0a  ER BY n LIMIT 2.
29a0: 20 20 7d 0a 7d 20 7b 6e 20 31 20 6c 6f 67 20 30    }.} {n 1 log 0
29b0: 20 6e 20 32 20 6c 6f 67 20 31 7d 0a 0a 23 20 4d   n 2 log 1}..# M
29c0: 61 6b 65 20 73 75 72 65 20 44 49 53 54 49 4e 43  ake sure DISTINC
29d0: 54 20 77 6f 72 6b 73 20 61 70 70 72 6f 70 72 69  T works appropri
29e0: 61 74 65 6c 79 20 6f 6e 20 54 45 58 54 20 61 6e  ately on TEXT an
29f0: 64 20 4e 55 4d 45 52 49 43 20 63 6f 6c 75 6d 6e  d NUMERIC column
2a00: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c  s..#.do_test sel
2a10: 65 63 74 34 2d 38 2e 31 20 7b 0a 20 20 65 78 65  ect4-8.1 {.  exe
2a20: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
2a30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2a40: 4c 45 20 74 33 28 61 20 74 65 78 74 2c 20 62 20  LE t3(a text, b 
2a50: 66 6c 6f 61 74 2c 20 63 20 74 65 78 74 29 3b 0a  float, c text);.
2a60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a70: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 31 2e 31  t3 VALUES(1, 1.1
2a80: 2c 20 27 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e  , '1.1');.    IN
2a90: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
2aa0: 55 45 53 28 32 2c 20 31 2e 31 30 2c 20 27 31 2e  UES(2, 1.10, '1.
2ab0: 31 30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  10');.    INSERT
2ac0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
2ad0: 33 2c 20 31 2e 31 30 2c 20 27 31 2e 31 27 29 3b  3, 1.10, '1.1');
2ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2af0: 20 74 33 20 56 41 4c 55 45 53 28 34 2c 20 31 2e   t3 VALUES(4, 1.
2b00: 31 2c 20 27 31 2e 31 30 27 29 3b 0a 20 20 20 20  1, '1.10');.    
2b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2b20: 41 4c 55 45 53 28 35 2c 20 31 2e 32 2c 20 27 31  ALUES(5, 1.2, '1
2b30: 2e 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .2');.    INSERT
2b40: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
2b50: 36 2c 20 31 2e 33 2c 20 27 31 2e 33 27 29 3b 0a  6, 1.3, '1.3');.
2b60: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
2b70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2b80: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2b90: 62 20 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20  b FROM t3 ORDER 
2ba0: 42 59 20 63 3b 0a 20 20 7d 0a 7d 20 7b 31 2e 31  BY c;.  }.} {1.1
2bb0: 20 31 2e 32 20 31 2e 33 7d 0a 64 6f 5f 74 65 73   1.2 1.3}.do_tes
2bc0: 74 20 73 65 6c 65 63 74 34 2d 38 2e 32 20 7b 0a  t select4-8.2 {.
2bd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2be0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2bf0: 63 20 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20  c FROM t3 ORDER 
2c00: 42 59 20 63 3b 0a 20 20 7d 0a 7d 20 7b 31 2e 31  BY c;.  }.} {1.1
2c10: 20 31 2e 31 30 20 31 2e 32 20 31 2e 33 7d 0a 0a   1.10 1.2 1.3}..
2c20: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.