/ Hex Artifact Content
Login

Artifact 86e72fc3b07de4fe11439aa419e37db3c49467e2:


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