/ Hex Artifact Content
Login

Artifact e76bd10a56988f15726c097a5d5a7966fe82d3b2:


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 53 45 4c 45 43  is testing SELEC
01d0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
01e0: 74 20 63 6f 6e 74 61 69 6e 0a 23 20 73 75 62 71  t contain.# subq
01f0: 75 65 72 69 65 73 20 69 6e 20 74 68 65 69 72 20  ueries in their 
0200: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 23 0a 23  FROM clause..#.#
0210: 20 24 49 64 3a 20 73 65 6c 65 63 74 36 2e 74 65   $Id: select6.te
0220: 73 74 2c 76 20 31 2e 32 39 20 32 30 30 39 2f 30  st,v 1.29 2009/0
0230: 31 2f 30 39 20 30 31 3a 31 32 3a 32 38 20 64 72  1/09 01:12:28 dr
0240: 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73  h Exp $..set tes
0250: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0260: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0270: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0280: 72 2e 74 63 6c 0a 0a 23 20 4f 6d 69 74 20 74 68  r.tcl..# Omit th
0290: 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66  is whole file if
02a0: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20   the library is 
02b0: 62 75 69 6c 64 20 77 69 74 68 6f 75 74 20 73 75  build without su
02c0: 62 71 75 65 72 79 20 73 75 70 70 6f 72 74 2e 0a  bquery support..
02d0: 69 66 63 61 70 61 62 6c 65 20 21 73 75 62 71 75  ifcapable !subqu
02e0: 65 72 79 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  ery {.  finish_t
02f0: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 73  est.  return.}.s
0300: 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20  et ::testprefix 
0310: 73 65 6c 65 63 74 36 0a 0a 64 6f 5f 74 65 73 74  select6..do_test
0320: 20 73 65 6c 65 63 74 36 2d 31 2e 30 20 7b 0a 20   select6-1.0 {. 
0330: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0340: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
0350: 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
0360: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0370: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31 29 3b   t1 VALUES(1,1);
0380: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0390: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 32 29 3b   t1 VALUES(2,2);
03a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
03b0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 32 29 3b   t1 VALUES(3,2);
03c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
03d0: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 33 29 3b   t1 VALUES(4,3);
03e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
03f0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 33 29 3b   t1 VALUES(5,3);
0400: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0410: 20 74 31 20 56 41 4c 55 45 53 28 36 2c 33 29 3b   t1 VALUES(6,3);
0420: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0430: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 33 29 3b   t1 VALUES(7,3);
0440: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0450: 20 74 31 20 56 41 4c 55 45 53 28 38 2c 34 29 3b   t1 VALUES(8,4);
0460: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0470: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 34 29 3b   t1 VALUES(9,4);
0480: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0490: 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 34 29   t1 VALUES(10,4)
04a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 34  O t1 VALUES(11,4
04c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
04d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 32 2c  TO t1 VALUES(12,
04e0: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
04f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33  NTO t1 VALUES(13
0500: 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,4);.    INSERT 
0510: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0520: 34 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  4,4);.    INSERT
0530: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0540: 31 35 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  15,4);.    INSER
0550: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0560: 28 31 36 2c 35 29 3b 0a 20 20 20 20 49 4e 53 45  (16,5);.    INSE
0570: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0580: 53 28 31 37 2c 35 29 3b 0a 20 20 20 20 49 4e 53  S(17,5);.    INS
0590: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
05a0: 45 53 28 31 38 2c 35 29 3b 0a 20 20 20 20 49 4e  ES(18,5);.    IN
05b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
05c0: 55 45 53 28 31 39 2c 35 29 3b 0a 20 20 20 20 49  UES(19,5);.    I
05d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
05e0: 4c 55 45 53 28 32 30 2c 35 29 3b 0a 20 20 20 20  LUES(20,5);.    
05f0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
0600: 43 54 20 44 49 53 54 49 4e 43 54 20 79 20 46 52  CT DISTINCT y FR
0610: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 79  OM t1 ORDER BY y
0620: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  ;.  }.} {1 2 3 4
0630: 20 35 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c   5}..do_test sel
0640: 65 63 74 36 2d 31 2e 31 20 7b 0a 20 20 65 78 65  ect6-1.1 {.  exe
0650: 63 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20  csql2 {SELECT * 
0660: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2c 20  FROM (SELECT x, 
0670: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
0680: 78 3c 32 29 7d 0a 7d 20 7b 78 20 31 20 79 20 31  x<2)}.} {x 1 y 1
0690: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
06a0: 36 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  6-1.2 {.  execsq
06b0: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
06c0: 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
06d0: 79 20 46 52 4f 4d 20 74 31 29 7d 0a 7d 20 7b 32  y FROM t1)}.} {2
06e0: 30 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  0}.do_test selec
06f0: 74 36 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  t6-1.3 {.  execs
0700: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ql {SELECT count
0710: 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
0720: 20 44 49 53 54 49 4e 43 54 20 79 20 46 52 4f 4d   DISTINCT y FROM
0730: 20 74 31 29 7d 0a 7d 20 7b 35 7d 0a 64 6f 5f 74   t1)}.} {5}.do_t
0740: 65 73 74 20 73 65 6c 65 63 74 36 2d 31 2e 34 20  est select6-1.4 
0750: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0760: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
0770: 4d 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e  M (SELECT DISTIN
0780: 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
0790: 54 20 79 20 46 52 4f 4d 20 74 31 29 29 7d 0a 7d  T y FROM t1))}.}
07a0: 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c   {5}.do_test sel
07b0: 65 63 74 36 2d 31 2e 35 20 7b 0a 20 20 65 78 65  ect6-1.5 {.  exe
07c0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  csql {SELECT cou
07d0: 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45  nt(*) FROM (SELE
07e0: 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
07f0: 54 20 44 49 53 54 49 4e 43 54 20 79 20 46 52 4f  T DISTINCT y FRO
0800: 4d 20 74 31 29 29 7d 0a 7d 20 7b 35 7d 0a 0a 64  M t1))}.} {5}..d
0810: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 31  o_test select6-1
0820: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0830: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 0a 20  .    SELECT * . 
0840: 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
0850: 63 6f 75 6e 74 28 2a 29 2c 79 20 46 52 4f 4d 20  count(*),y FROM 
0860: 74 31 20 47 52 4f 55 50 20 42 59 20 79 29 20 41  t1 GROUP BY y) A
0870: 53 20 61 2c 0a 20 20 20 20 20 20 20 20 20 28 53  S a,.         (S
0880: 45 4c 45 43 54 20 6d 61 78 28 78 29 2c 79 20 46  ELECT max(x),y F
0890: 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
08a0: 79 29 20 61 73 20 62 0a 20 20 20 20 57 48 45 52  y) as b.    WHER
08b0: 45 20 61 2e 79 3d 62 2e 79 20 4f 52 44 45 52 20  E a.y=b.y ORDER 
08c0: 42 59 20 61 2e 79 0a 20 20 7d 0a 7d 20 7b 31 20  BY a.y.  }.} {1 
08d0: 31 20 31 20 31 20 32 20 32 20 33 20 32 20 34 20  1 1 1 2 2 3 2 4 
08e0: 33 20 37 20 33 20 38 20 34 20 31 35 20 34 20 35  3 7 3 8 4 15 4 5
08f0: 20 35 20 32 30 20 35 7d 0a 64 6f 5f 74 65 73 74   5 20 5}.do_test
0900: 20 73 65 6c 65 63 74 36 2d 31 2e 37 20 7b 0a 20   select6-1.7 {. 
0910: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0920: 45 4c 45 43 54 20 61 2e 79 2c 20 61 2e 5b 63 6f  ELECT a.y, a.[co
0930: 75 6e 74 28 2a 29 5d 2c 20 5b 6d 61 78 28 78 29  unt(*)], [max(x)
0940: 5d 2c 20 5b 63 6f 75 6e 74 28 2a 29 5d 0a 20 20  ], [count(*)].  
0950: 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63    FROM (SELECT c
0960: 6f 75 6e 74 28 2a 29 2c 79 20 46 52 4f 4d 20 74  ount(*),y FROM t
0970: 31 20 47 52 4f 55 50 20 42 59 20 79 29 20 41 53  1 GROUP BY y) AS
0980: 20 61 2c 0a 20 20 20 20 20 20 20 20 20 28 53 45   a,.         (SE
0990: 4c 45 43 54 20 6d 61 78 28 78 29 2c 79 20 46 52  LECT max(x),y FR
09a0: 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
09b0: 29 20 61 73 20 62 0a 20 20 20 20 57 48 45 52 45  ) as b.    WHERE
09c0: 20 61 2e 79 3d 62 2e 79 20 4f 52 44 45 52 20 42   a.y=b.y ORDER B
09d0: 59 20 61 2e 79 0a 20 20 7d 0a 7d 20 7b 31 20 31  Y a.y.  }.} {1 1
09e0: 20 31 20 31 20 32 20 32 20 33 20 32 20 33 20 34   1 1 2 2 3 2 3 4
09f0: 20 37 20 34 20 34 20 38 20 31 35 20 38 20 35 20   7 4 4 8 15 8 5 
0a00: 35 20 32 30 20 35 7d 0a 64 6f 5f 74 65 73 74 20  5 20 5}.do_test 
0a10: 73 65 6c 65 63 74 36 2d 31 2e 38 20 7b 0a 20 20  select6-1.8 {.  
0a20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
0a30: 4c 45 43 54 20 71 2c 20 70 2c 20 72 0a 20 20 20  LECT q, p, r.   
0a40: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
0a50: 75 6e 74 28 2a 29 20 61 73 20 70 20 2c 20 79 20  unt(*) as p , y 
0a60: 61 73 20 71 20 46 52 4f 4d 20 74 31 20 47 52 4f  as q FROM t1 GRO
0a70: 55 50 20 42 59 20 79 29 20 41 53 20 61 2c 0a 20  UP BY y) AS a,. 
0a80: 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20          (SELECT 
0a90: 6d 61 78 28 78 29 20 61 73 20 72 2c 20 79 20 61  max(x) as r, y a
0aa0: 73 20 73 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  s s FROM t1 GROU
0ab0: 50 20 42 59 20 79 29 20 61 73 20 62 0a 20 20 20  P BY y) as b.   
0ac0: 20 57 48 45 52 45 20 71 3d 73 20 4f 52 44 45 52   WHERE q=s ORDER
0ad0: 20 42 59 20 73 0a 20 20 7d 0a 7d 20 7b 31 20 31   BY s.  }.} {1 1
0ae0: 20 31 20 32 20 32 20 33 20 33 20 34 20 37 20 34   1 2 2 3 3 4 7 4
0af0: 20 38 20 31 35 20 35 20 35 20 32 30 7d 0a 64 6f   8 15 5 5 20}.do
0b00: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 31 2e  _test select6-1.
0b10: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  9 {.  execsql {.
0b20: 20 20 20 20 53 45 4c 45 43 54 20 71 2c 20 70 2c      SELECT q, p,
0b30: 20 72 2c 20 62 2e 5b 6d 69 6e 28 78 29 2b 79 5d   r, b.[min(x)+y]
0b40: 0a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43  .    FROM (SELEC
0b50: 54 20 63 6f 75 6e 74 28 2a 29 20 61 73 20 70 20  T count(*) as p 
0b60: 2c 20 79 20 61 73 20 71 20 46 52 4f 4d 20 74 31  , y as q FROM t1
0b70: 20 47 52 4f 55 50 20 42 59 20 79 29 20 41 53 20   GROUP BY y) AS 
0b80: 61 2c 0a 20 20 20 20 20 20 20 20 20 28 53 45 4c  a,.         (SEL
0b90: 45 43 54 20 6d 61 78 28 78 29 20 61 73 20 72 2c  ECT max(x) as r,
0ba0: 20 79 20 61 73 20 73 2c 20 6d 69 6e 28 78 29 2b   y as s, min(x)+
0bb0: 79 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  y FROM t1 GROUP 
0bc0: 42 59 20 79 29 20 61 73 20 62 0a 20 20 20 20 57  BY y) as b.    W
0bd0: 48 45 52 45 20 71 3d 73 20 4f 52 44 45 52 20 42  HERE q=s ORDER B
0be0: 59 20 73 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 31  Y s.  }.} {1 1 1
0bf0: 20 32 20 32 20 32 20 33 20 34 20 33 20 34 20 37   2 2 2 3 4 3 4 7
0c00: 20 37 20 34 20 38 20 31 35 20 31 32 20 35 20 35   7 4 8 15 12 5 5
0c10: 20 32 30 20 32 31 7d 0a 0a 64 6f 5f 74 65 73 74   20 21}..do_test
0c20: 20 73 65 6c 65 63 74 36 2d 32 2e 30 20 7b 0a 20   select6-2.0 {. 
0c30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
0c40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
0c50: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0c60: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e   KEY, b);.    IN
0c70: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
0c80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
0c90: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
0ca0: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 4f 52 44  CT b FROM t2 ORD
0cb0: 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b  ER BY b;.  }.} {
0cc0: 31 20 32 20 33 20 34 20 35 7d 0a 64 6f 5f 74 65  1 2 3 4 5}.do_te
0cd0: 73 74 20 73 65 6c 65 63 74 36 2d 32 2e 31 20 7b  st select6-2.1 {
0ce0: 0a 20 20 65 78 65 63 73 71 6c 32 20 7b 53 45 4c  .  execsql2 {SEL
0cf0: 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
0d00: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32 20  CT a, b FROM t2 
0d10: 57 48 45 52 45 20 61 3c 32 29 7d 0a 7d 20 7b 61  WHERE a<2)}.} {a
0d20: 20 31 20 62 20 31 7d 0a 64 6f 5f 74 65 73 74 20   1 b 1}.do_test 
0d30: 73 65 6c 65 63 74 36 2d 32 2e 32 20 7b 0a 20 20  select6-2.2 {.  
0d40: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0d50: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53  count(*) FROM (S
0d60: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 29  ELECT b FROM t2)
0d70: 7d 0a 7d 20 7b 32 30 7d 0a 64 6f 5f 74 65 73 74  }.} {20}.do_test
0d80: 20 73 65 6c 65 63 74 36 2d 32 2e 33 20 7b 0a 20   select6-2.3 {. 
0d90: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
0da0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
0db0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0dc0: 62 20 46 52 4f 4d 20 74 32 29 7d 0a 7d 20 7b 35  b FROM t2)}.} {5
0dd0: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
0de0: 36 2d 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  6-2.4 {.  execsq
0df0: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
0e00: 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
0e10: 44 49 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20  DISTINCT * FROM 
0e20: 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74  (SELECT b FROM t
0e30: 32 29 29 7d 0a 7d 20 7b 35 7d 0a 64 6f 5f 74 65  2))}.} {5}.do_te
0e40: 73 74 20 73 65 6c 65 63 74 36 2d 32 2e 35 20 7b  st select6-2.5 {
0e50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0e60: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0e70: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
0e80: 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  (SELECT DISTINCT
0e90: 20 62 20 46 52 4f 4d 20 74 32 29 29 7d 0a 7d 20   b FROM t2))}.} 
0ea0: 7b 35 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c  {5}..do_test sel
0eb0: 65 63 74 36 2d 32 2e 36 20 7b 0a 20 20 65 78 65  ect6-2.6 {.  exe
0ec0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0ed0: 54 20 2a 20 0a 20 20 20 20 46 52 4f 4d 20 28 53  T * .    FROM (S
0ee0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 62  ELECT count(*),b
0ef0: 20 46 52 4f 4d 20 74 32 20 47 52 4f 55 50 20 42   FROM t2 GROUP B
0f00: 59 20 62 29 20 41 53 20 61 2c 0a 20 20 20 20 20  Y b) AS a,.     
0f10: 20 20 20 20 28 53 45 4c 45 43 54 20 6d 61 78 28      (SELECT max(
0f20: 61 29 2c 62 20 46 52 4f 4d 20 74 32 20 47 52 4f  a),b FROM t2 GRO
0f30: 55 50 20 42 59 20 62 29 20 61 73 20 62 0a 20 20  UP BY b) as b.  
0f40: 20 20 57 48 45 52 45 20 61 2e 62 3d 62 2e 62 20    WHERE a.b=b.b 
0f50: 4f 52 44 45 52 20 42 59 20 61 2e 62 0a 20 20 7d  ORDER BY a.b.  }
0f60: 0a 7d 20 7b 31 20 31 20 31 20 31 20 32 20 32 20  .} {1 1 1 1 2 2 
0f70: 33 20 32 20 34 20 33 20 37 20 33 20 38 20 34 20  3 2 4 3 7 3 8 4 
0f80: 31 35 20 34 20 35 20 35 20 32 30 20 35 7d 0a 64  15 4 5 5 20 5}.d
0f90: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 32  o_test select6-2
0fa0: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
0fb0: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2e 62 2c  .    SELECT a.b,
0fc0: 20 61 2e 5b 63 6f 75 6e 74 28 2a 29 5d 2c 20 5b   a.[count(*)], [
0fd0: 6d 61 78 28 61 29 5d 2c 20 5b 63 6f 75 6e 74 28  max(a)], [count(
0fe0: 2a 29 5d 0a 20 20 20 20 46 52 4f 4d 20 28 53 45  *)].    FROM (SE
0ff0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 62 20  LECT count(*),b 
1000: 46 52 4f 4d 20 74 32 20 47 52 4f 55 50 20 42 59  FROM t2 GROUP BY
1010: 20 62 29 20 41 53 20 61 2c 0a 20 20 20 20 20 20   b) AS a,.      
1020: 20 20 20 28 53 45 4c 45 43 54 20 6d 61 78 28 61     (SELECT max(a
1030: 29 2c 62 20 46 52 4f 4d 20 74 32 20 47 52 4f 55  ),b FROM t2 GROU
1040: 50 20 42 59 20 62 29 20 61 73 20 62 0a 20 20 20  P BY b) as b.   
1050: 20 57 48 45 52 45 20 61 2e 62 3d 62 2e 62 20 4f   WHERE a.b=b.b O
1060: 52 44 45 52 20 42 59 20 61 2e 62 0a 20 20 7d 0a  RDER BY a.b.  }.
1070: 7d 20 7b 31 20 31 20 31 20 31 20 32 20 32 20 33  } {1 1 1 1 2 2 3
1080: 20 32 20 33 20 34 20 37 20 34 20 34 20 38 20 31   2 3 4 7 4 4 8 1
1090: 35 20 38 20 35 20 35 20 32 30 20 35 7d 0a 64 6f  5 8 5 5 20 5}.do
10a0: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 32 2e  _test select6-2.
10b0: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  8 {.  execsql {.
10c0: 20 20 20 20 53 45 4c 45 43 54 20 71 2c 20 70 2c      SELECT q, p,
10d0: 20 72 0a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c   r.    FROM (SEL
10e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 61 73 20  ECT count(*) as 
10f0: 70 20 2c 20 62 20 61 73 20 71 20 46 52 4f 4d 20  p , b as q FROM 
1100: 74 32 20 47 52 4f 55 50 20 42 59 20 62 29 20 41  t2 GROUP BY b) A
1110: 53 20 61 2c 0a 20 20 20 20 20 20 20 20 20 28 53  S a,.         (S
1120: 45 4c 45 43 54 20 6d 61 78 28 61 29 20 61 73 20  ELECT max(a) as 
1130: 72 2c 20 62 20 61 73 20 73 20 46 52 4f 4d 20 74  r, b as s FROM t
1140: 32 20 47 52 4f 55 50 20 42 59 20 62 29 20 61 73  2 GROUP BY b) as
1150: 20 62 0a 20 20 20 20 57 48 45 52 45 20 71 3d 73   b.    WHERE q=s
1160: 20 4f 52 44 45 52 20 42 59 20 73 0a 20 20 7d 0a   ORDER BY s.  }.
1170: 7d 20 7b 31 20 31 20 31 20 32 20 32 20 33 20 33  } {1 1 1 2 2 3 3
1180: 20 34 20 37 20 34 20 38 20 31 35 20 35 20 35 20   4 7 4 8 15 5 5 
1190: 32 30 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  20}.do_test sele
11a0: 63 74 36 2d 32 2e 39 20 7b 0a 20 20 65 78 65 63  ct6-2.9 {.  exec
11b0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
11c0: 20 61 2e 71 2c 20 61 2e 70 2c 20 62 2e 72 0a 20   a.q, a.p, b.r. 
11d0: 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
11e0: 63 6f 75 6e 74 28 2a 29 20 61 73 20 70 20 2c 20  count(*) as p , 
11f0: 62 20 61 73 20 71 20 46 52 4f 4d 20 74 32 20 47  b as q FROM t2 G
1200: 52 4f 55 50 20 42 59 20 71 29 20 41 53 20 61 2c  ROUP BY q) AS a,
1210: 0a 20 20 20 20 20 20 20 20 20 28 53 45 4c 45 43  .         (SELEC
1220: 54 20 6d 61 78 28 61 29 20 61 73 20 72 2c 20 62  T max(a) as r, b
1230: 20 61 73 20 73 20 46 52 4f 4d 20 74 32 20 47 52   as s FROM t2 GR
1240: 4f 55 50 20 42 59 20 73 29 20 61 73 20 62 0a 20  OUP BY s) as b. 
1250: 20 20 20 57 48 45 52 45 20 61 2e 71 3d 62 2e 73     WHERE a.q=b.s
1260: 20 4f 52 44 45 52 20 42 59 20 61 2e 71 0a 20 20   ORDER BY a.q.  
1270: 7d 0a 7d 20 7b 31 20 31 20 31 20 32 20 32 20 33  }.} {1 1 1 2 2 3
1280: 20 33 20 34 20 37 20 34 20 38 20 31 35 20 35 20   3 4 7 4 8 15 5 
1290: 35 20 32 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 73  5 20}..do_test s
12a0: 65 6c 65 63 74 36 2d 33 2e 31 20 7b 0a 20 20 65  elect6-3.1 {.  e
12b0: 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53 45  xecsql2 {.    SE
12c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
12d0: 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
12e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
12f0: 52 45 20 78 3d 33 29 29 3b 0a 20 20 7d 0a 7d 20  RE x=3));.  }.} 
1300: 7b 78 20 33 20 79 20 32 7d 0a 64 6f 5f 74 65 73  {x 3 y 2}.do_tes
1310: 74 20 73 65 6c 65 63 74 36 2d 33 2e 32 20 7b 0a  t select6-3.2 {.
1320: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1330: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 0a 20 20  SELECT * FROM.  
1340: 20 20 20 20 28 53 45 4c 45 43 54 20 61 2e 71 2c      (SELECT a.q,
1350: 20 61 2e 70 2c 20 62 2e 72 0a 20 20 20 20 20 20   a.p, b.r.      
1360: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
1370: 75 6e 74 28 2a 29 20 61 73 20 70 20 2c 20 62 20  unt(*) as p , b 
1380: 61 73 20 71 20 46 52 4f 4d 20 74 32 20 47 52 4f  as q FROM t2 GRO
1390: 55 50 20 42 59 20 71 29 20 41 53 20 61 2c 0a 20  UP BY q) AS a,. 
13a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 45 4c 45             (SELE
13b0: 43 54 20 6d 61 78 28 61 29 20 61 73 20 72 2c 20  CT max(a) as r, 
13c0: 62 20 61 73 20 73 20 46 52 4f 4d 20 74 32 20 47  b as s FROM t2 G
13d0: 52 4f 55 50 20 42 59 20 73 29 20 61 73 20 62 0a  ROUP BY s) as b.
13e0: 20 20 20 20 20 20 20 57 48 45 52 45 20 61 2e 71         WHERE a.q
13f0: 3d 62 2e 73 20 4f 52 44 45 52 20 42 59 20 61 2e  =b.s ORDER BY a.
1400: 71 29 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  q).    ORDER BY 
1410: 22 61 2e 71 22 0a 20 20 7d 0a 7d 20 7b 31 20 31  "a.q".  }.} {1 1
1420: 20 31 20 32 20 32 20 33 20 33 20 34 20 37 20 34   1 2 2 3 3 4 7 4
1430: 20 38 20 31 35 20 35 20 35 20 32 30 7d 0a 64 6f   8 15 5 5 20}.do
1440: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 33 2e  _test select6-3.
1450: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
1460: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 61      SELECT a,b,a
1470: 2b 62 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  +b FROM (SELECT 
1480: 61 76 67 28 78 29 20 61 73 20 27 61 27 2c 20 61  avg(x) as 'a', a
1490: 76 67 28 79 29 20 61 73 20 27 62 27 20 46 52 4f  vg(y) as 'b' FRO
14a0: 4d 20 74 31 29 0a 20 20 7d 0a 7d 20 7b 31 30 2e  M t1).  }.} {10.
14b0: 35 20 33 2e 37 20 31 34 2e 32 7d 0a 64 6f 5f 74  5 3.7 14.2}.do_t
14c0: 65 73 74 20 73 65 6c 65 63 74 36 2d 33 2e 34 20  est select6-3.4 
14d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
14e0: 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 2b 62    SELECT a,b,a+b
14f0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 76   FROM (SELECT av
1500: 67 28 78 29 20 61 73 20 27 61 27 2c 20 61 76 67  g(x) as 'a', avg
1510: 28 79 29 20 61 73 20 27 62 27 20 46 52 4f 4d 20  (y) as 'b' FROM 
1520: 74 31 20 57 48 45 52 45 20 79 3d 34 29 0a 20 20  t1 WHERE y=4).  
1530: 7d 0a 7d 20 7b 31 31 2e 35 20 34 2e 30 20 31 35  }.} {11.5 4.0 15
1540: 2e 35 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  .5}.do_test sele
1550: 63 74 36 2d 33 2e 35 20 7b 0a 20 20 65 78 65 63  ct6-3.5 {.  exec
1560: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1570: 20 78 2c 79 2c 78 2b 79 20 46 52 4f 4d 20 28 53   x,y,x+y FROM (S
1580: 45 4c 45 43 54 20 61 76 67 28 61 29 20 61 73 20  ELECT avg(a) as 
1590: 27 78 27 2c 20 61 76 67 28 62 29 20 61 73 20 27  'x', avg(b) as '
15a0: 79 27 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  y' FROM t2 WHERE
15b0: 20 61 3d 34 29 0a 20 20 7d 0a 7d 20 7b 34 2e 30   a=4).  }.} {4.0
15c0: 20 33 2e 30 20 37 2e 30 7d 0a 64 6f 5f 74 65 73   3.0 7.0}.do_tes
15d0: 74 20 73 65 6c 65 63 74 36 2d 33 2e 36 20 7b 0a  t select6-3.6 {.
15e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15f0: 53 45 4c 45 43 54 20 61 2c 62 2c 61 2b 62 20 46  SELECT a,b,a+b F
1600: 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 76 67 28  ROM (SELECT avg(
1610: 78 29 20 61 73 20 27 61 27 2c 20 61 76 67 28 79  x) as 'a', avg(y
1620: 29 20 61 73 20 27 62 27 20 46 52 4f 4d 20 74 31  ) as 'b' FROM t1
1630: 29 0a 20 20 20 20 57 48 45 52 45 20 61 3e 31 30  ).    WHERE a>10
1640: 0a 20 20 7d 0a 7d 20 7b 31 30 2e 35 20 33 2e 37  .  }.} {10.5 3.7
1650: 20 31 34 2e 32 7d 0a 64 6f 5f 74 65 73 74 20 73   14.2}.do_test s
1660: 65 6c 65 63 74 36 2d 33 2e 37 20 7b 0a 20 20 65  elect6-3.7 {.  e
1670: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1680: 45 43 54 20 61 2c 62 2c 61 2b 62 20 46 52 4f 4d  ECT a,b,a+b FROM
1690: 20 28 53 45 4c 45 43 54 20 61 76 67 28 78 29 20   (SELECT avg(x) 
16a0: 61 73 20 27 61 27 2c 20 61 76 67 28 79 29 20 61  as 'a', avg(y) a
16b0: 73 20 27 62 27 20 46 52 4f 4d 20 74 31 29 0a 20  s 'b' FROM t1). 
16c0: 20 20 20 57 48 45 52 45 20 61 3c 31 30 0a 20 20     WHERE a<10.  
16d0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73  }.} {}.do_test s
16e0: 65 6c 65 63 74 36 2d 33 2e 38 20 7b 0a 20 20 65  elect6-3.8 {.  e
16f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1700: 45 43 54 20 61 2c 62 2c 61 2b 62 20 46 52 4f 4d  ECT a,b,a+b FROM
1710: 20 28 53 45 4c 45 43 54 20 61 76 67 28 78 29 20   (SELECT avg(x) 
1720: 61 73 20 27 61 27 2c 20 61 76 67 28 79 29 20 61  as 'a', avg(y) a
1730: 73 20 27 62 27 20 46 52 4f 4d 20 74 31 20 57 48  s 'b' FROM t1 WH
1740: 45 52 45 20 79 3d 34 29 0a 20 20 20 20 57 48 45  ERE y=4).    WHE
1750: 52 45 20 61 3e 31 30 0a 20 20 7d 0a 7d 20 7b 31  RE a>10.  }.} {1
1760: 31 2e 35 20 34 2e 30 20 31 35 2e 35 7d 0a 64 6f  1.5 4.0 15.5}.do
1770: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 33 2e  _test select6-3.
1780: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  9 {.  execsql {.
1790: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 61      SELECT a,b,a
17a0: 2b 62 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  +b FROM (SELECT 
17b0: 61 76 67 28 78 29 20 61 73 20 27 61 27 2c 20 61  avg(x) as 'a', a
17c0: 76 67 28 79 29 20 61 73 20 27 62 27 20 46 52 4f  vg(y) as 'b' FRO
17d0: 4d 20 74 31 20 57 48 45 52 45 20 79 3d 34 29 0a  M t1 WHERE y=4).
17e0: 20 20 20 20 57 48 45 52 45 20 61 3c 31 30 0a 20      WHERE a<10. 
17f0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1800: 73 65 6c 65 63 74 36 2d 33 2e 31 30 20 7b 0a 20  select6-3.10 {. 
1810: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
1820: 45 4c 45 43 54 20 61 2c 62 2c 61 2b 62 20 46 52  ELECT a,b,a+b FR
1830: 4f 4d 20 28 53 45 4c 45 43 54 20 61 76 67 28 78  OM (SELECT avg(x
1840: 29 20 61 73 20 27 61 27 2c 20 79 20 61 73 20 27  ) as 'a', y as '
1850: 62 27 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50  b' FROM t1 GROUP
1860: 20 42 59 20 62 29 0a 20 20 20 20 4f 52 44 45 52   BY b).    ORDER
1870: 20 42 59 20 61 0a 20 20 7d 0a 7d 20 7b 31 2e 30   BY a.  }.} {1.0
1880: 20 31 20 32 2e 30 20 32 2e 35 20 32 20 34 2e 35   1 2.0 2.5 2 4.5
1890: 20 35 2e 35 20 33 20 38 2e 35 20 31 31 2e 35 20   5.5 3 8.5 11.5 
18a0: 34 20 31 35 2e 35 20 31 38 2e 30 20 35 20 32 33  4 15.5 18.0 5 23
18b0: 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  .0}.do_test sele
18c0: 63 74 36 2d 33 2e 31 31 20 7b 0a 20 20 65 78 65  ct6-3.11 {.  exe
18d0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
18e0: 54 20 61 2c 62 2c 61 2b 62 20 46 52 4f 4d 20 0a  T a,b,a+b FROM .
18f0: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 61         (SELECT a
1900: 76 67 28 78 29 20 61 73 20 27 61 27 2c 20 79 20  vg(x) as 'a', y 
1910: 61 73 20 27 62 27 20 46 52 4f 4d 20 74 31 20 47  as 'b' FROM t1 G
1920: 52 4f 55 50 20 42 59 20 62 29 0a 20 20 20 20 57  ROUP BY b).    W
1930: 48 45 52 45 20 62 3c 34 20 4f 52 44 45 52 20 42  HERE b<4 ORDER B
1940: 59 20 61 0a 20 20 7d 0a 7d 20 7b 31 2e 30 20 31  Y a.  }.} {1.0 1
1950: 20 32 2e 30 20 32 2e 35 20 32 20 34 2e 35 20 35   2.0 2.5 2 4.5 5
1960: 2e 35 20 33 20 38 2e 35 7d 0a 64 6f 5f 74 65 73  .5 3 8.5}.do_tes
1970: 74 20 73 65 6c 65 63 74 36 2d 33 2e 31 32 20 7b  t select6-3.12 {
1980: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1990: 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 2b 62 20   SELECT a,b,a+b 
19a0: 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45  FROM .       (SE
19b0: 4c 45 43 54 20 61 76 67 28 78 29 20 61 73 20 27  LECT avg(x) as '
19c0: 61 27 2c 20 79 20 61 73 20 27 62 27 20 46 52 4f  a', y as 'b' FRO
19d0: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 62 20  M t1 GROUP BY b 
19e0: 48 41 56 49 4e 47 20 61 3e 31 29 0a 20 20 20 20  HAVING a>1).    
19f0: 57 48 45 52 45 20 62 3c 34 20 4f 52 44 45 52 20  WHERE b<4 ORDER 
1a00: 42 59 20 61 0a 20 20 7d 0a 7d 20 7b 32 2e 35 20  BY a.  }.} {2.5 
1a10: 32 20 34 2e 35 20 35 2e 35 20 33 20 38 2e 35 7d  2 4.5 5.5 3 8.5}
1a20: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36  .do_test select6
1a30: 2d 33 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  -3.13 {.  execsq
1a40: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
1a50: 2c 62 2c 61 2b 62 20 46 52 4f 4d 20 0a 20 20 20  ,b,a+b FROM .   
1a60: 20 20 20 20 28 53 45 4c 45 43 54 20 61 76 67 28      (SELECT avg(
1a70: 78 29 20 61 73 20 27 61 27 2c 20 79 20 61 73 20  x) as 'a', y as 
1a80: 27 62 27 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  'b' FROM t1 GROU
1a90: 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 61 3e  P BY b HAVING a>
1aa0: 31 29 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  1).    ORDER BY 
1ab0: 61 0a 20 20 7d 0a 7d 20 7b 32 2e 35 20 32 20 34  a.  }.} {2.5 2 4
1ac0: 2e 35 20 35 2e 35 20 33 20 38 2e 35 20 31 31 2e  .5 5.5 3 8.5 11.
1ad0: 35 20 34 20 31 35 2e 35 20 31 38 2e 30 20 35 20  5 4 15.5 18.0 5 
1ae0: 32 33 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 73 65  23.0}.do_test se
1af0: 6c 65 63 74 36 2d 33 2e 31 34 20 7b 0a 20 20 65  lect6-3.14 {.  e
1b00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1b10: 45 43 54 20 5b 63 6f 75 6e 74 28 2a 29 5d 2c 79  ECT [count(*)],y
1b20: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
1b30: 75 6e 74 28 2a 29 2c 20 79 20 46 52 4f 4d 20 74  unt(*), y FROM t
1b40: 31 20 47 52 4f 55 50 20 42 59 20 79 29 0a 20 20  1 GROUP BY y).  
1b50: 20 20 4f 52 44 45 52 20 42 59 20 5b 63 6f 75 6e    ORDER BY [coun
1b60: 74 28 2a 29 5d 0a 20 20 7d 0a 7d 20 7b 31 20 31  t(*)].  }.} {1 1
1b70: 20 32 20 32 20 34 20 33 20 35 20 35 20 38 20 34   2 2 4 3 5 5 8 4
1b80: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
1b90: 36 2d 33 2e 31 35 20 7b 0a 20 20 65 78 65 63 73  6-3.15 {.  execs
1ba0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1bb0: 5b 63 6f 75 6e 74 28 2a 29 5d 2c 79 20 46 52 4f  [count(*)],y FRO
1bc0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  M (SELECT count(
1bd0: 2a 29 2c 20 79 20 46 52 4f 4d 20 74 31 20 47 52  *), y FROM t1 GR
1be0: 4f 55 50 20 42 59 20 79 29 0a 20 20 20 20 4f 52  OUP BY y).    OR
1bf0: 44 45 52 20 42 59 20 79 0a 20 20 7d 0a 7d 20 7b  DER BY y.  }.} {
1c00: 31 20 31 20 32 20 32 20 34 20 33 20 38 20 34 20  1 1 2 2 4 3 8 4 
1c10: 35 20 35 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65  5 5}..do_test se
1c20: 6c 65 63 74 36 2d 34 2e 31 20 7b 0a 20 20 65 78  lect6-4.1 {.  ex
1c30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
1c40: 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20 0a 20  CT a,b,c FROM . 
1c50: 20 20 20 20 20 28 53 45 4c 45 43 54 20 78 20 41       (SELECT x A
1c60: 53 20 27 61 27 2c 20 79 20 41 53 20 27 62 27 2c  S 'a', y AS 'b',
1c70: 20 78 2b 79 20 41 53 20 27 63 27 20 46 52 4f 4d   x+y AS 'c' FROM
1c80: 20 74 31 20 57 48 45 52 45 20 79 3d 34 29 0a 20   t1 WHERE y=4). 
1c90: 20 20 20 57 48 45 52 45 20 61 3c 31 30 20 4f 52     WHERE a<10 OR
1ca0: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
1cb0: 7b 38 20 34 20 31 32 20 39 20 34 20 31 33 7d 0a  {8 4 12 9 4 13}.
1cc0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
1cd0: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
1ce0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 79 20 46  {.    SELECT y F
1cf0: 52 4f 4d 20 28 53 45 4c 45 43 54 20 44 49 53 54  ROM (SELECT DIST
1d00: 49 4e 43 54 20 79 20 46 52 4f 4d 20 74 31 29 20  INCT y FROM t1) 
1d10: 57 48 45 52 45 20 79 3c 35 20 4f 52 44 45 52 20  WHERE y<5 ORDER 
1d20: 42 59 20 79 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  BY y.  }.} {1 2 
1d30: 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  3 4}.do_test sel
1d40: 65 63 74 36 2d 34 2e 33 20 7b 0a 20 20 65 78 65  ect6-4.3 {.  exe
1d50: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1d60: 54 20 44 49 53 54 49 4e 43 54 20 79 20 46 52 4f  T DISTINCT y FRO
1d70: 4d 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  M (SELECT y FROM
1d80: 20 74 31 29 20 57 48 45 52 45 20 79 3c 35 20 4f   t1) WHERE y<5 O
1d90: 52 44 45 52 20 42 59 20 79 0a 20 20 7d 0a 7d 20  RDER BY y.  }.} 
1da0: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
1db0: 74 20 73 65 6c 65 63 74 36 2d 34 2e 34 20 7b 0a  t select6-4.4 {.
1dc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1dd0: 53 45 4c 45 43 54 20 61 76 67 28 79 29 20 46 52  SELECT avg(y) FR
1de0: 4f 4d 20 28 53 45 4c 45 43 54 20 44 49 53 54 49  OM (SELECT DISTI
1df0: 4e 43 54 20 79 20 46 52 4f 4d 20 74 31 29 20 57  NCT y FROM t1) W
1e00: 48 45 52 45 20 79 3c 35 20 4f 52 44 45 52 20 42  HERE y<5 ORDER B
1e10: 59 20 79 0a 20 20 7d 0a 7d 20 7b 32 2e 35 7d 0a  Y y.  }.} {2.5}.
1e20: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
1e30: 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.5 {.  execsql 
1e40: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 76 67  {.    SELECT avg
1e50: 28 79 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (y) FROM (SELECT
1e60: 20 44 49 53 54 49 4e 43 54 20 79 20 46 52 4f 4d   DISTINCT y FROM
1e70: 20 74 31 20 57 48 45 52 45 20 79 3c 35 29 20 4f   t1 WHERE y<5) O
1e80: 52 44 45 52 20 42 59 20 79 0a 20 20 7d 0a 7d 20  RDER BY y.  }.} 
1e90: 7b 32 2e 35 7d 0a 0a 64 6f 5f 74 65 73 74 20 73  {2.5}..do_test s
1ea0: 65 6c 65 63 74 36 2d 35 2e 31 20 7b 0a 20 20 65  elect6-5.1 {.  e
1eb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1ec0: 45 43 54 20 61 2c 78 2c 62 20 46 52 4f 4d 0a 20  ECT a,x,b FROM. 
1ed0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 78 2b 33       (SELECT x+3
1ee0: 20 41 53 20 27 61 27 2c 20 78 20 46 52 4f 4d 20   AS 'a', x FROM 
1ef0: 74 31 20 57 48 45 52 45 20 79 3d 33 29 20 41 53  t1 WHERE y=3) AS
1f00: 20 27 70 27 2c 0a 20 20 20 20 20 20 28 53 45 4c   'p',.      (SEL
1f10: 45 43 54 20 78 20 41 53 20 27 62 27 20 46 52 4f  ECT x AS 'b' FRO
1f20: 4d 20 74 31 20 57 48 45 52 45 20 79 3d 34 29 20  M t1 WHERE y=4) 
1f30: 41 53 20 27 71 27 0a 20 20 20 20 57 48 45 52 45  AS 'q'.    WHERE
1f40: 20 61 3d 62 0a 20 20 20 20 4f 52 44 45 52 20 42   a=b.    ORDER B
1f50: 59 20 61 0a 20 20 7d 0a 7d 20 7b 38 20 35 20 38  Y a.  }.} {8 5 8
1f60: 20 39 20 36 20 39 20 31 30 20 37 20 31 30 7d 0a   9 6 9 10 7 10}.
1f70: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
1f80: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
1f90: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 78  {.    SELECT a,x
1fa0: 2c 62 20 46 52 4f 4d 0a 20 20 20 20 20 20 28 53  ,b FROM.      (S
1fb0: 45 4c 45 43 54 20 78 2b 33 20 41 53 20 27 61 27  ELECT x+3 AS 'a'
1fc0: 2c 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , x FROM t1 WHER
1fd0: 45 20 79 3d 33 29 2c 0a 20 20 20 20 20 20 28 53  E y=3),.      (S
1fe0: 45 4c 45 43 54 20 78 20 41 53 20 27 62 27 20 46  ELECT x AS 'b' F
1ff0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 79 3d 34  ROM t1 WHERE y=4
2000: 29 0a 20 20 20 20 57 48 45 52 45 20 61 3d 62 0a  ).    WHERE a=b.
2010: 20 20 20 20 4f 52 44 45 52 20 42 59 20 61 0a 20      ORDER BY a. 
2020: 20 7d 0a 7d 20 7b 38 20 35 20 38 20 39 20 36 20   }.} {8 5 8 9 6 
2030: 39 20 31 30 20 37 20 31 30 7d 0a 0a 23 20 54 65  9 10 7 10}..# Te
2040: 73 74 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20  sts of compound 
2050: 73 75 62 2d 73 65 6c 65 63 74 73 0a 23 0a 64 6f  sub-selects.#.do
2060: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 36 2e  _test select6-6.
2070: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2080: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2090: 74 31 20 57 48 45 52 45 20 78 3e 34 3b 0a 20 20  t1 WHERE x>4;.  
20a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20b0: 74 31 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20  t1.  }.} {1 1 2 
20c0: 32 20 33 20 32 20 34 20 33 7d 0a 69 66 63 61 70  2 3 2 4 3}.ifcap
20d0: 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a  able compound {.
20e0: 20 20 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74    do_test select
20f0: 36 2d 36 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  6-6.2 {.    exec
2100: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
2110: 43 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20 20  CT * FROM (.    
2120: 20 20 20 20 53 45 4c 45 43 54 20 78 20 41 53 20      SELECT x AS 
2130: 27 61 27 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  'a' FROM t1 UNIO
2140: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31  N ALL SELECT x+1
2150: 30 20 41 53 20 27 61 27 20 46 52 4f 4d 20 74 31  0 AS 'a' FROM t1
2160: 0a 20 20 20 20 20 20 29 20 4f 52 44 45 52 20 42  .      ) ORDER B
2170: 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  Y a;.    }.  } {
2180: 31 20 32 20 33 20 34 20 31 31 20 31 32 20 31 33  1 2 3 4 11 12 13
2190: 20 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73   14}.  do_test s
21a0: 65 6c 65 63 74 36 2d 36 2e 33 20 7b 0a 20 20 20  elect6-6.3 {.   
21b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
21c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
21d0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
21e0: 78 20 41 53 20 27 61 27 20 46 52 4f 4d 20 74 31  x AS 'a' FROM t1
21f0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2200: 54 20 78 2b 31 20 41 53 20 27 61 27 20 46 52 4f  T x+1 AS 'a' FRO
2210: 4d 20 74 31 0a 20 20 20 20 20 20 29 20 4f 52 44  M t1.      ) ORD
2220: 45 52 20 42 59 20 61 3b 0a 20 20 20 20 7d 0a 20  ER BY a;.    }. 
2230: 20 7d 20 7b 31 20 32 20 32 20 33 20 33 20 34 20   } {1 2 2 3 3 4 
2240: 34 20 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  4 5}.  do_test s
2250: 65 6c 65 63 74 36 2d 36 2e 34 20 7b 0a 20 20 20  elect6-6.4 {.   
2260: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2270: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
2280: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
2290: 78 20 41 53 20 27 61 27 20 46 52 4f 4d 20 74 31  x AS 'a' FROM t1
22a0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 78 2b   UNION SELECT x+
22b0: 31 20 41 53 20 27 61 27 20 46 52 4f 4d 20 74 31  1 AS 'a' FROM t1
22c0: 0a 20 20 20 20 20 20 29 20 4f 52 44 45 52 20 42  .      ) ORDER B
22d0: 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  Y a;.    }.  } {
22e0: 31 20 32 20 33 20 34 20 35 7d 0a 20 20 64 6f 5f  1 2 3 4 5}.  do_
22f0: 74 65 73 74 20 73 65 6c 65 63 74 36 2d 36 2e 35  test select6-6.5
2300: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2310: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
2320: 46 52 4f 4d 20 28 0a 20 20 20 20 20 20 20 20 53  FROM (.        S
2330: 45 4c 45 43 54 20 78 20 41 53 20 27 61 27 20 46  ELECT x AS 'a' F
2340: 52 4f 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54  ROM t1 INTERSECT
2350: 20 53 45 4c 45 43 54 20 78 2b 31 20 41 53 20 27   SELECT x+1 AS '
2360: 61 27 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20  a' FROM t1.     
2370: 20 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20   ) ORDER BY a;. 
2380: 20 20 20 7d 0a 20 20 7d 20 7b 32 20 33 20 34 7d     }.  } {2 3 4}
2390: 0a 20 20 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  .  do_test selec
23a0: 74 36 2d 36 2e 36 20 7b 0a 20 20 20 20 65 78 65  t6-6.6 {.    exe
23b0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
23c0: 45 43 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20  ECT * FROM (.   
23d0: 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 41 53       SELECT x AS
23e0: 20 27 61 27 20 46 52 4f 4d 20 74 31 20 45 58 43   'a' FROM t1 EXC
23f0: 45 50 54 20 53 45 4c 45 43 54 20 78 2a 32 20 41  EPT SELECT x*2 A
2400: 53 20 27 61 27 20 46 52 4f 4d 20 74 31 0a 20 20  S 'a' FROM t1.  
2410: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 61      ) ORDER BY a
2420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 33  ;.    }.  } {1 3
2430: 7d 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65  }.} ;# ifcapable
2440: 20 63 6f 6d 70 6f 75 6e 64 0a 0a 23 20 53 75 62   compound..# Sub
2450: 73 65 6c 65 63 74 73 20 77 69 74 68 20 6e 6f 20  selects with no 
2460: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 23 0a 64 6f  FROM clause.#.do
2470: 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 37 2e  _test select6-7.
2480: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
2490: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
24a0: 4d 20 28 53 45 4c 45 43 54 20 31 29 0a 20 20 7d  M (SELECT 1).  }
24b0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 73  .} {1}.do_test s
24c0: 65 6c 65 63 74 36 2d 37 2e 32 20 7b 0a 20 20 65  elect6-7.2 {.  e
24d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
24e0: 45 43 54 20 63 2c 62 2c 61 2c 2a 20 46 52 4f 4d  ECT c,b,a,* FROM
24f0: 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 27 61   (SELECT 1 AS 'a
2500: 27 2c 20 32 20 41 53 20 27 62 27 2c 20 27 61 62  ', 2 AS 'b', 'ab
2510: 63 27 20 41 53 20 27 63 27 29 0a 20 20 7d 0a 7d  c' AS 'c').  }.}
2520: 20 7b 61 62 63 20 32 20 31 20 31 20 32 20 61 62   {abc 2 1 1 2 ab
2530: 63 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  c}.do_test selec
2540: 74 36 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  t6-7.3 {.  execs
2550: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2560: 63 2c 62 2c 61 2c 2a 20 46 52 4f 4d 20 28 53 45  c,b,a,* FROM (SE
2570: 4c 45 43 54 20 31 20 41 53 20 27 61 27 2c 20 32  LECT 1 AS 'a', 2
2580: 20 41 53 20 27 62 27 2c 20 27 61 62 63 27 20 41   AS 'b', 'abc' A
2590: 53 20 27 63 27 20 57 48 45 52 45 20 30 29 0a 20  S 'c' WHERE 0). 
25a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
25b0: 73 65 6c 65 63 74 36 2d 37 2e 34 20 7b 0a 20 20  select6-7.4 {.  
25c0: 65 78 65 63 73 71 6c 32 20 7b 0a 20 20 20 20 53  execsql2 {.    S
25d0: 45 4c 45 43 54 20 63 2c 62 2c 61 2c 2a 20 46 52  ELECT c,b,a,* FR
25e0: 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  OM (SELECT 1 AS 
25f0: 27 61 27 2c 20 32 20 41 53 20 27 62 27 2c 20 27  'a', 2 AS 'b', '
2600: 61 62 63 27 20 41 53 20 27 63 27 20 57 48 45 52  abc' AS 'c' WHER
2610: 45 20 31 29 0a 20 20 7d 0a 7d 20 7b 63 20 61 62  E 1).  }.} {c ab
2620: 63 20 62 20 32 20 61 20 31 20 61 20 31 20 62 20  c b 2 a 1 a 1 b 
2630: 32 20 63 20 61 62 63 7d 0a 0a 23 20 54 68 65 20  2 c abc}..# The 
2640: 72 65 6d 61 69 6e 69 6e 67 20 74 65 73 74 73 20  remaining tests 
2650: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 64 65 70  in this file dep
2660: 65 6e 64 20 6f 6e 20 74 68 65 20 45 58 50 4c 41  end on the EXPLA
2670: 49 4e 20 6b 65 79 77 6f 72 64 2e 0a 23 20 53 6b  IN keyword..# Sk
2680: 69 70 20 74 68 65 73 65 20 74 65 73 74 73 20 69  ip these tests i
2690: 66 20 45 58 50 4c 41 49 4e 20 69 73 20 64 69 73  f EXPLAIN is dis
26a0: 61 62 6c 65 64 20 69 6e 20 74 68 65 20 63 75 72  abled in the cur
26b0: 72 65 6e 74 20 62 75 69 6c 64 2e 0a 23 0a 69 66  rent build..#.if
26c0: 63 61 70 61 62 6c 65 20 7b 21 65 78 70 6c 61 69  capable {!explai
26d0: 6e 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  n} {.  finish_te
26e0: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  st.  return.}..#
26f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2700: 72 6f 63 65 64 75 72 65 20 63 6f 6d 70 69 6c 65  rocedure compile
2710: 73 20 74 68 65 20 53 51 4c 20 67 69 76 65 6e 20  s the SQL given 
2720: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 61  as an argument a
2730: 6e 64 20 72 65 74 75 72 6e 73 0a 23 20 54 52 55  nd returns.# TRU
2740: 45 20 69 66 20 74 68 61 74 20 53 51 4c 20 75 73  E if that SQL us
2750: 65 73 20 61 6e 79 20 74 72 61 6e 73 69 65 6e 74  es any transient
2760: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 74 75   tables and retu
2770: 72 6e 73 20 46 41 4c 53 45 20 69 66 20 6e 6f 0a  rns FALSE if no.
2780: 23 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  # transient tabl
2790: 65 73 20 61 72 65 20 75 73 65 64 2e 20 20 54 68  es are used.  Th
27a0: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  is is used to ma
27b0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
27c0: 0a 23 20 73 71 6c 69 74 65 46 6c 61 74 74 65 6e  .# sqliteFlatten
27d0: 53 75 62 71 75 65 72 79 28 29 20 72 6f 75 74 69  Subquery() routi
27e0: 6e 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 69  ne in select.c i
27f0: 73 20 64 6f 69 6e 67 20 69 74 73 20 6a 6f 62 2e  s doing its job.
2800: 0a 23 0a 70 72 6f 63 20 69 73 5f 66 6c 61 74 20  .#.proc is_flat 
2810: 7b 73 71 6c 7d 20 7b 0a 20 20 72 65 74 75 72 6e  {sql} {.  return
2820: 20 5b 65 78 70 72 20 30 3e 5b 6c 73 65 61 72 63   [expr 0>[lsearc
2830: 68 20 5b 65 78 65 63 73 71 6c 20 22 45 58 50 4c  h [execsql "EXPL
2840: 41 49 4e 20 24 73 71 6c 22 5d 20 4f 70 65 6e 45  AIN $sql"] OpenE
2850: 70 68 65 6d 65 72 61 6c 5d 5d 0a 7d 0a 0a 23 20  phemeral]].}..# 
2860: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
2870: 6c 61 74 74 65 6e 65 72 20 77 6f 72 6b 73 20 63  lattener works c
2880: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 64 65 65  orrectly for dee
2890: 70 6c 79 20 6e 65 73 74 65 64 20 73 75 62 71 75  ply nested subqu
28a0: 65 72 69 65 73 0a 23 20 69 6e 76 6f 6c 76 69 6e  eries.# involvin
28b0: 67 20 6a 6f 69 6e 73 2e 0a 23 0a 64 6f 5f 74 65  g joins..#.do_te
28c0: 73 74 20 73 65 6c 65 63 74 36 2d 38 2e 31 20 7b  st select6-8.1 {
28d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
28e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
28f0: 54 45 20 54 41 42 4c 45 20 74 33 28 70 2c 71 29  TE TABLE t3(p,q)
2900: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2910: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 31 31  O t3 VALUES(1,11
2920: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2930: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 32 2c 32  TO t3 VALUES(2,2
2940: 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  2);.    CREATE T
2950: 41 42 4c 45 20 74 34 28 71 2c 72 29 3b 0a 20 20  ABLE t4(q,r);.  
2960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
2970: 20 56 41 4c 55 45 53 28 31 31 2c 31 31 31 29 3b   VALUES(11,111);
2980: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2990: 20 74 34 20 56 41 4c 55 45 53 28 32 32 2c 32 32   t4 VALUES(22,22
29a0: 32 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  2);.    COMMIT;.
29b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
29c0: 4d 20 74 33 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M t3 NATURAL JOI
29d0: 4e 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31  N t4;.  }.} {1 1
29e0: 31 20 31 31 31 20 32 20 32 32 20 32 32 32 7d 0a  1 111 2 22 222}.
29f0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
2a00: 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.2 {.  execsql 
2a10: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 79 2c 20  {.    SELECT y, 
2a20: 70 2c 20 71 2c 20 72 20 46 52 4f 4d 0a 20 20 20  p, q, r FROM.   
2a30: 20 20 20 20 28 53 45 4c 45 43 54 20 74 31 2e 79      (SELECT t1.y
2a40: 20 41 53 20 79 2c 20 74 32 2e 62 20 41 53 20 62   AS y, t2.b AS b
2a50: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2a60: 52 45 20 74 31 2e 78 3d 74 32 2e 61 29 20 41 53  RE t1.x=t2.a) AS
2a70: 20 6d 2c 0a 20 20 20 20 20 20 20 28 53 45 4c 45   m,.       (SELE
2a80: 43 54 20 74 33 2e 70 20 41 53 20 70 2c 20 74 33  CT t3.p AS p, t3
2a90: 2e 71 20 41 53 20 71 2c 20 74 34 2e 72 20 41 53  .q AS q, t4.r AS
2aa0: 20 72 20 46 52 4f 4d 20 74 33 20 4e 41 54 55 52   r FROM t3 NATUR
2ab0: 41 4c 20 4a 4f 49 4e 20 74 34 29 20 61 73 20 6e  AL JOIN t4) as n
2ac0: 0a 20 20 20 20 57 48 45 52 45 20 20 79 3d 70 0a  .    WHERE  y=p.
2ad0: 20 20 7d 0a 7d 20 7b 31 20 31 20 31 31 20 31 31    }.} {1 1 11 11
2ae0: 31 20 32 20 32 20 32 32 20 32 32 32 20 32 20 32  1 2 2 22 222 2 2
2af0: 20 32 32 20 32 32 32 7d 0a 23 20 49 66 20 76 69   22 222}.# If vi
2b00: 65 77 20 73 75 70 70 6f 72 74 20 69 73 20 6f 6d  ew support is om
2b10: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62  itted from the b
2b20: 75 69 6c 64 2c 20 74 68 65 6e 20 73 6f 20 69 73  uild, then so is
2b30: 20 74 68 65 20 71 75 65 72 79 20 0a 23 20 22 66   the query .# "f
2b40: 6c 61 74 74 65 6e 65 72 22 2e 20 53 6f 20 6f 6d  lattener". So om
2b50: 69 74 20 74 68 69 73 20 74 65 73 74 20 61 6e 64  it this test and
2b60: 20 74 65 73 74 20 73 65 6c 65 63 74 36 2d 38 2e   test select6-8.
2b70: 36 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  6 in that case..
2b80: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20 7b  ifcapable view {
2b90: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36  .do_test select6
2ba0: 2d 38 2e 33 20 7b 0a 20 20 69 73 5f 66 6c 61 74  -8.3 {.  is_flat
2bb0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 79 2c   {.    SELECT y,
2bc0: 20 70 2c 20 71 2c 20 72 20 46 52 4f 4d 0a 20 20   p, q, r FROM.  
2bd0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 74 31 2e       (SELECT t1.
2be0: 79 20 41 53 20 79 2c 20 74 32 2e 62 20 41 53 20  y AS y, t2.b AS 
2bf0: 62 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  b FROM t1, t2 WH
2c00: 45 52 45 20 74 31 2e 78 3d 74 32 2e 61 29 20 41  ERE t1.x=t2.a) A
2c10: 53 20 6d 2c 0a 20 20 20 20 20 20 20 28 53 45 4c  S m,.       (SEL
2c20: 45 43 54 20 74 33 2e 70 20 41 53 20 70 2c 20 74  ECT t3.p AS p, t
2c30: 33 2e 71 20 41 53 20 71 2c 20 74 34 2e 72 20 41  3.q AS q, t4.r A
2c40: 53 20 72 20 46 52 4f 4d 20 74 33 20 4e 41 54 55  S r FROM t3 NATU
2c50: 52 41 4c 20 4a 4f 49 4e 20 74 34 29 20 61 73 20  RAL JOIN t4) as 
2c60: 6e 0a 20 20 20 20 57 48 45 52 45 20 20 79 3d 70  n.    WHERE  y=p
2c70: 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 7d 20 3b 23 20  .  }.} {1}.} ;# 
2c80: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 0a 64  ifcapable view.d
2c90: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 38  o_test select6-8
2ca0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
2cb0: 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  .    SELECT DIST
2cc0: 49 4e 43 54 20 79 2c 20 70 2c 20 71 2c 20 72 20  INCT y, p, q, r 
2cd0: 46 52 4f 4d 0a 20 20 20 20 20 20 20 28 53 45 4c  FROM.       (SEL
2ce0: 45 43 54 20 74 31 2e 79 20 41 53 20 79 2c 20 74  ECT t1.y AS y, t
2cf0: 32 2e 62 20 41 53 20 62 20 46 52 4f 4d 20 74 31  2.b AS b FROM t1
2d00: 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 78 3d  , t2 WHERE t1.x=
2d10: 74 32 2e 61 29 20 41 53 20 6d 2c 0a 20 20 20 20  t2.a) AS m,.    
2d20: 20 20 20 28 53 45 4c 45 43 54 20 74 33 2e 70 20     (SELECT t3.p 
2d30: 41 53 20 70 2c 20 74 33 2e 71 20 41 53 20 71 2c  AS p, t3.q AS q,
2d40: 20 74 34 2e 72 20 41 53 20 72 20 46 52 4f 4d 20   t4.r AS r FROM 
2d50: 74 33 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t3 NATURAL JOIN 
2d60: 74 34 29 20 61 73 20 6e 0a 20 20 20 20 57 48 45  t4) as n.    WHE
2d70: 52 45 20 20 79 3d 70 0a 20 20 7d 0a 7d 20 7b 31  RE  y=p.  }.} {1
2d80: 20 31 20 31 31 20 31 31 31 20 32 20 32 20 32 32   1 11 111 2 2 22
2d90: 20 32 32 32 7d 0a 64 6f 5f 74 65 73 74 20 73 65   222}.do_test se
2da0: 6c 65 63 74 36 2d 38 2e 35 20 7b 0a 20 20 65 78  lect6-8.5 {.  ex
2db0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2dc0: 43 54 20 2a 20 46 52 4f 4d 20 0a 20 20 20 20 20  CT * FROM .     
2dd0: 20 28 53 45 4c 45 43 54 20 79 2c 20 70 2c 20 71   (SELECT y, p, q
2de0: 2c 20 72 20 46 52 4f 4d 0a 20 20 20 20 20 20 20  , r FROM.       
2df0: 20 20 28 53 45 4c 45 43 54 20 74 31 2e 79 20 41    (SELECT t1.y A
2e00: 53 20 79 2c 20 74 32 2e 62 20 41 53 20 62 20 46  S y, t2.b AS b F
2e10: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
2e20: 20 74 31 2e 78 3d 74 32 2e 61 29 20 41 53 20 6d   t1.x=t2.a) AS m
2e30: 2c 0a 20 20 20 20 20 20 20 20 20 28 53 45 4c 45  ,.         (SELE
2e40: 43 54 20 74 33 2e 70 20 41 53 20 70 2c 20 74 33  CT t3.p AS p, t3
2e50: 2e 71 20 41 53 20 71 2c 20 74 34 2e 72 20 41 53  .q AS q, t4.r AS
2e60: 20 72 20 46 52 4f 4d 20 74 33 20 4e 41 54 55 52   r FROM t3 NATUR
2e70: 41 4c 20 4a 4f 49 4e 20 74 34 29 20 61 73 20 6e  AL JOIN t4) as n
2e80: 0a 20 20 20 20 20 20 57 48 45 52 45 20 20 79 3d  .      WHERE  y=
2e90: 70 29 20 41 53 20 65 2c 0a 20 20 20 20 20 20 28  p) AS e,.      (
2ea0: 53 45 4c 45 43 54 20 72 20 41 53 20 7a 20 46 52  SELECT r AS z FR
2eb0: 4f 4d 20 74 34 20 57 48 45 52 45 20 71 3d 31 31  OM t4 WHERE q=11
2ec0: 29 20 41 53 20 66 0a 20 20 20 20 57 48 45 52 45  ) AS f.    WHERE
2ed0: 20 65 2e 72 3d 66 2e 7a 0a 20 20 7d 0a 7d 20 7b   e.r=f.z.  }.} {
2ee0: 31 20 31 20 31 31 20 31 31 31 20 31 31 31 7d 0a  1 1 11 111 111}.
2ef0: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20 7b  ifcapable view {
2f00: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36  .do_test select6
2f10: 2d 38 2e 36 20 7b 0a 20 20 69 73 5f 66 6c 61 74  -8.6 {.  is_flat
2f20: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2f30: 46 52 4f 4d 20 0a 20 20 20 20 20 20 28 53 45 4c  FROM .      (SEL
2f40: 45 43 54 20 79 2c 20 70 2c 20 71 2c 20 72 20 46  ECT y, p, q, r F
2f50: 52 4f 4d 0a 20 20 20 20 20 20 20 20 20 28 53 45  ROM.         (SE
2f60: 4c 45 43 54 20 74 31 2e 79 20 41 53 20 79 2c 20  LECT t1.y AS y, 
2f70: 74 32 2e 62 20 41 53 20 62 20 46 52 4f 4d 20 74  t2.b AS b FROM t
2f80: 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 78  1, t2 WHERE t1.x
2f90: 3d 74 32 2e 61 29 20 41 53 20 6d 2c 0a 20 20 20  =t2.a) AS m,.   
2fa0: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 74 33        (SELECT t3
2fb0: 2e 70 20 41 53 20 70 2c 20 74 33 2e 71 20 41 53  .p AS p, t3.q AS
2fc0: 20 71 2c 20 74 34 2e 72 20 41 53 20 72 20 46 52   q, t4.r AS r FR
2fd0: 4f 4d 20 74 33 20 4e 41 54 55 52 41 4c 20 4a 4f  OM t3 NATURAL JO
2fe0: 49 4e 20 74 34 29 20 61 73 20 6e 0a 20 20 20 20  IN t4) as n.    
2ff0: 20 20 57 48 45 52 45 20 20 79 3d 70 29 20 41 53    WHERE  y=p) AS
3000: 20 65 2c 0a 20 20 20 20 20 20 28 53 45 4c 45 43   e,.      (SELEC
3010: 54 20 72 20 41 53 20 7a 20 46 52 4f 4d 20 74 34  T r AS z FROM t4
3020: 20 57 48 45 52 45 20 71 3d 31 31 29 20 41 53 20   WHERE q=11) AS 
3030: 66 0a 20 20 20 20 57 48 45 52 45 20 65 2e 72 3d  f.    WHERE e.r=
3040: 66 2e 7a 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 7d 20  f.z.  }.} {1}.} 
3050: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 76 69 65  ;# ifcapable vie
3060: 77 0a 0a 23 20 54 69 63 6b 65 74 20 23 31 36 33  w..# Ticket #163
3070: 34 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  4.#.do_test sele
3080: 63 74 36 2d 39 2e 31 20 7b 0a 20 20 65 78 65 63  ct6-9.1 {.  exec
3090: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
30a0: 20 61 2e 78 2c 20 62 2e 78 20 46 52 4f 4d 20 74   a.x, b.x FROM t
30b0: 31 20 41 53 20 61 2c 20 28 53 45 4c 45 43 54 20  1 AS a, (SELECT 
30c0: 78 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  x FROM t1 LIMIT 
30d0: 32 29 20 41 53 20 62 0a 20 20 20 20 20 4f 52 44  2) AS b.     ORD
30e0: 45 52 20 42 59 20 31 2c 20 32 0a 20 20 7d 0a 7d  ER BY 1, 2.  }.}
30f0: 20 7b 31 20 31 20 31 20 32 20 32 20 31 20 32 20   {1 1 1 2 2 1 2 
3100: 32 20 33 20 31 20 33 20 32 20 34 20 31 20 34 20  2 3 1 3 2 4 1 4 
3110: 32 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63  2}.do_test selec
3120: 74 36 2d 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  t6-9.2 {.  execs
3130: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3140: 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
3150: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 32   FROM t1 LIMIT 2
3160: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  );.  }.} {1 2}.d
3170: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 39  o_test select6-9
3180: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3190: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
31a0: 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
31b0: 4d 20 74 31 20 4c 49 4d 49 54 20 32 20 4f 46 46  M t1 LIMIT 2 OFF
31c0: 53 45 54 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 32  SET 1);.  }.} {2
31d0: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65   3}.do_test sele
31e0: 63 74 36 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63  ct6-9.4 {.  exec
31f0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3200: 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
3210: 78 20 46 52 4f 4d 20 74 31 29 20 4c 49 4d 49 54  x FROM t1) LIMIT
3220: 20 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a   2;.  }.} {1 2}.
3230: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
3240: 39 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.5 {.  execsql 
3250: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
3260: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
3270: 4f 4d 20 74 31 29 20 4c 49 4d 49 54 20 32 20 4f  OM t1) LIMIT 2 O
3280: 46 46 53 45 54 20 31 3b 0a 20 20 7d 0a 7d 20 7b  FFSET 1;.  }.} {
3290: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  2 3}.do_test sel
32a0: 65 63 74 36 2d 39 2e 36 20 7b 0a 20 20 65 78 65  ect6-9.6 {.  exe
32b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
32c0: 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
32d0: 20 78 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54   x FROM t1 LIMIT
32e0: 20 32 29 20 4c 49 4d 49 54 20 33 3b 0a 20 20 7d   2) LIMIT 3;.  }
32f0: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
3300: 20 73 65 6c 65 63 74 36 2d 39 2e 37 20 7b 0a 20   select6-9.7 {. 
3310: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3320: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
3330: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 4c  LECT x FROM t1 L
3340: 49 4d 49 54 20 2d 31 29 20 4c 49 4d 49 54 20 33  IMIT -1) LIMIT 3
3350: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a  ;.  }.} {1 2 3}.
3360: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d  do_test select6-
3370: 39 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.8 {.  execsql 
3380: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
3390: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
33a0: 4f 4d 20 74 31 20 4c 49 4d 49 54 20 2d 31 29 3b  OM t1 LIMIT -1);
33b0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  .  }.} {1 2 3 4}
33c0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36  .do_test select6
33d0: 2d 39 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  -9.9 {.  execsql
33e0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
33f0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
3400: 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 2d 31 20  ROM t1 LIMIT -1 
3410: 4f 46 46 53 45 54 20 31 29 3b 0a 20 20 7d 0a 7d  OFFSET 1);.  }.}
3420: 20 7b 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74   {2 3 4}.do_test
3430: 20 73 65 6c 65 63 74 36 2d 39 2e 31 30 20 7b 0a   select6-9.10 {.
3440: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3450: 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d  SELECT x, y FROM
3460: 20 28 53 45 4c 45 43 54 20 78 2c 20 28 53 45 4c   (SELECT x, (SEL
3470: 45 43 54 20 31 30 2b 78 29 20 79 20 46 52 4f 4d  ECT 10+x) y FROM
3480: 20 74 31 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46   t1 LIMIT -1 OFF
3490: 53 45 54 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 32  SET 1);.  }.} {2
34a0: 20 31 32 20 33 20 31 33 20 34 20 31 34 7d 0a 64   12 3 13 4 14}.d
34b0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 36 2d 39  o_test select6-9
34c0: 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .11 {.  execsql 
34d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20  {.    SELECT x, 
34e0: 79 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  y FROM (SELECT x
34f0: 2c 20 28 53 45 4c 45 43 54 20 31 30 29 2b 78 20  , (SELECT 10)+x 
3500: 79 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20  y FROM t1 LIMIT 
3510: 2d 31 20 4f 46 46 53 45 54 20 31 29 3b 0a 20 20  -1 OFFSET 1);.  
3520: 7d 0a 7d 20 7b 32 20 31 32 20 33 20 31 33 20 34  }.} {2 12 3 13 4
3530: 20 31 34 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   14}...#--------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
3590: 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 73 75 62   a UNION ALL sub
35a0: 2d 71 75 65 72 79 20 74 68 61 74 20 77 6f 75 6c  -query that woul
35b0: 64 20 6f 74 68 65 72 77 69 73 65 20 62 65 20 65  d otherwise be e
35c0: 6c 69 67 69 62 6c 65 20 66 6f 72 0a 23 20 66 6c  ligible for.# fl
35d0: 61 74 74 65 6e 69 6e 67 20 63 6f 6e 73 69 73 74  attening consist
35e0: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
35f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3600: 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61  ts that do not a
3610: 6c 6c 20 0a 23 20 72 65 74 75 72 6e 20 74 68 65  ll .# return the
3620: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
3630: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20  result columns, 
3640: 74 68 65 20 65 72 72 6f 72 20 69 73 20 64 65 74  the error is det
3650: 65 63 74 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63  ected..#.do_exec
3660: 73 71 6c 5f 74 65 73 74 20 31 30 2e 31 20 7b 0a  sql_test 10.1 {.
3670: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3680: 28 69 2c 6a 2c 6b 29 3b 0a 20 20 43 52 45 41 54  (i,j,k);.  CREAT
3690: 45 20 54 41 42 4c 45 20 6a 28 6c 2c 6d 29 3b 0a  E TABLE j(l,m);.
36a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
36b0: 28 6f 29 3b 0a 7d 0a 0a 73 65 74 20 65 72 72 20  (o);.}..set err 
36c0: 5b 6c 69 73 74 20 31 20 7b 53 45 4c 45 43 54 73  [list 1 {SELECTs
36d0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
36e0: 20 72 69 67 68 74 20 6f 66 20 55 4e 49 4f 4e 20   right of UNION 
36f0: 41 4c 4c 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ALL do not have 
3700: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
3710: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3720: 73 7d 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s}]..do_execsql_
3730: 74 65 73 74 20 31 30 2e 32 20 7b 0a 20 20 53 45  test 10.2 {.  SE
3740: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
3750: 45 43 54 20 2a 20 46 52 4f 4d 20 74 29 2c 20 6a  ECT * FROM t), j
3760: 3b 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  ;.}.do_catchsql_
3770: 74 65 73 74 20 31 30 2e 33 20 7b 0a 20 20 53 45  test 10.3 {.  SE
3780: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 20 55 4e  LECT * FROM t UN
3790: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
37a0: 20 46 52 4f 4d 20 6a 0a 7d 20 24 65 72 72 0a 64   FROM j.} $err.d
37b0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
37c0: 31 30 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  10.4 {.  SELECT 
37d0: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 69  * FROM (SELECT i
37e0: 20 46 52 4f 4d 20 74 20 55 4e 49 4f 4e 20 41 4c   FROM t UNION AL
37f0: 4c 20 53 45 4c 45 43 54 20 6c 2c 20 6d 20 46 52  L SELECT l, m FR
3800: 4f 4d 20 6a 29 0a 7d 20 24 65 72 72 0a 64 6f 5f  OM j).} $err.do_
3810: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 30  catchsql_test 10
3820: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
3830: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6a 20 46  FROM (SELECT j F
3840: 52 4f 4d 20 74 20 55 4e 49 4f 4e 20 41 4c 4c 20  ROM t UNION ALL 
3850: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 29  SELECT * FROM j)
3860: 0a 7d 20 24 65 72 72 0a 64 6f 5f 63 61 74 63 68  .} $err.do_catch
3870: 73 71 6c 5f 74 65 73 74 20 31 30 2e 36 20 7b 0a  sql_test 10.6 {.
3880: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3890: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
38a0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
38b0: 54 20 2a 20 46 52 4f 4d 20 6a 29 0a 7d 20 24 65  T * FROM j).} $e
38c0: 72 72 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  rr.do_catchsql_t
38d0: 65 73 74 20 31 30 2e 37 20 7b 0a 20 20 53 45 4c  est 10.7 {.  SEL
38e0: 45 43 54 20 2a 20 46 52 4f 4d 20 28 0a 20 20 20  ECT * FROM (.   
38f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3900: 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 20 20 20 20   UNION ALL .    
3910: 53 45 4c 45 43 54 20 6c 2c 6d 2c 6c 20 46 52 4f  SELECT l,m,l FRO
3920: 4d 20 6a 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20  M j UNION ALL.  
3930: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3940: 6b 0a 20 20 29 0a 7d 20 24 65 72 72 0a 64 6f 5f  k.  ).} $err.do_
3950: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 30  catchsql_test 10
3960: 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .8 {.  SELECT * 
3970: 46 52 4f 4d 20 28 0a 20 20 20 20 53 45 4c 45 43  FROM (.    SELEC
3980: 54 20 2a 20 46 52 4f 4d 20 6b 20 55 4e 49 4f 4e  T * FROM k UNION
3990: 20 41 4c 4c 0a 20 20 20 20 53 45 4c 45 43 54 20   ALL.    SELECT 
39a0: 2a 20 46 52 4f 4d 20 74 20 55 4e 49 4f 4e 20 41  * FROM t UNION A
39b0: 4c 4c 20 0a 20 20 20 20 53 45 4c 45 43 54 20 6c  LL .    SELECT l
39c0: 2c 6d 2c 6c 20 46 52 4f 4d 20 6a 20 0a 20 20 29  ,m,l FROM j .  )
39d0: 0a 7d 20 24 65 72 72 0a 0a 0a 66 69 6e 69 73 68  .} $err...finish
39e0: 5f 74 65 73 74 0a                                _test.