/ Hex Artifact Content
Login

Artifact f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 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 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 73 65 6c 65  .# the lang_sele
01c0: 63 74 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74  ct.html document
01d0: 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a   are correct..#.
01e0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
01f0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0200: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0210: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 69  ir/tester.tcl..i
0220: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0230: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0240: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64  st.  return.}..d
0250: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
0260: 5f 73 65 6c 65 63 74 2d 31 2e 30 20 7b 0a 20 20  _select-1.0 {.  
0270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0280: 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  a, b);.  INSERT 
0290: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
02a0: 61 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e  a', 'one');.  IN
02b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
02c0: 55 45 53 28 27 62 27 2c 20 27 74 77 6f 27 29 3b  UES('b', 'two');
02d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
02e0: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 74  1 VALUES('c', 't
02f0: 68 72 65 65 27 29 3b 0a 0a 20 20 43 52 45 41 54  hree');..  CREAT
0300: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
0310: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0320: 74 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t2 VALUES('a', '
0330: 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  I');.  INSERT IN
0340: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62 27  TO t2 VALUES('b'
0350: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
0360: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0370: 28 27 63 27 2c 20 27 49 49 49 27 29 3b 0a 0a 20  ('c', 'III');.. 
0380: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
0390: 28 61 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54  (a, c);.  INSERT
03a0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
03b0: 27 61 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  'a', 1);.  INSER
03c0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
03d0: 28 27 62 27 2c 20 32 29 3b 0a 0a 20 20 43 52 45  ('b', 2);..  CRE
03e0: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20  ATE TABLE t4(a, 
03f0: 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  c);.  INSERT INT
0400: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 27 2c  O t4 VALUES('a',
0410: 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54   NULL);.  INSERT
0420: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
0430: 27 62 27 2c 20 32 29 3b 0a 7d 20 7b 7d 0a 73 65  'b', 2);.} {}.se
0440: 74 20 74 31 5f 63 72 6f 73 73 5f 74 32 20 5b 6c  t t1_cross_t2 [l
0450: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
0460: 20 20 20 5c 0a 20 20 20 61 20 6f 6e 65 20 20 20     \.   a one   
0470: 61 20 49 20 20 20 20 20 20 61 20 6f 6e 65 20 20  a I      a one  
0480: 20 62 20 49 49 20 20 20 20 20 5c 0a 20 20 20 61   b II     \.   a
0490: 20 6f 6e 65 20 20 20 63 20 49 49 49 20 20 20 20   one   c III    
04a0: 62 20 74 77 6f 20 20 20 61 20 49 20 20 20 20 20  b two   a I     
04b0: 20 5c 0a 20 20 20 62 20 74 77 6f 20 20 20 62 20   \.   b two   b 
04c0: 49 49 20 20 20 20 20 62 20 74 77 6f 20 20 20 63  II     b two   c
04d0: 20 49 49 49 20 20 20 20 5c 0a 20 20 20 63 20 74   III    \.   c t
04e0: 68 72 65 65 20 61 20 49 20 20 20 20 20 20 63 20  hree a I      c 
04f0: 74 68 72 65 65 20 62 20 49 49 20 20 20 20 20 5c  three b II     \
0500: 0a 20 20 20 63 20 74 68 72 65 65 20 63 20 49 49  .   c three c II
0510: 49 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  I               
0520: 20 20 20 20 20 20 5c 0a 5d 0a 73 65 74 20 74 31        \.].set t1
0530: 5f 63 72 6f 73 73 5f 74 31 20 5b 6c 69 73 74 20  _cross_t1 [list 
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0550: 20 5c 0a 20 20 20 61 20 6f 6e 65 20 20 20 61 20   \.   a one   a 
0560: 6f 6e 65 20 20 20 20 20 20 61 20 6f 6e 65 20 20  one      a one  
0570: 20 62 20 74 77 6f 20 20 20 20 5c 0a 20 20 20 61   b two    \.   a
0580: 20 6f 6e 65 20 20 20 63 20 74 68 72 65 65 20 20   one   c three  
0590: 20 20 62 20 74 77 6f 20 20 20 61 20 6f 6e 65 20    b two   a one 
05a0: 20 20 20 5c 0a 20 20 20 62 20 74 77 6f 20 20 20     \.   b two   
05b0: 62 20 74 77 6f 20 20 20 20 20 20 62 20 74 77 6f  b two      b two
05c0: 20 20 20 63 20 74 68 72 65 65 20 20 5c 0a 20 20     c three  \.  
05d0: 20 63 20 74 68 72 65 65 20 61 20 6f 6e 65 20 20   c three a one  
05e0: 20 20 20 20 63 20 74 68 72 65 65 20 62 20 74 77      c three b tw
05f0: 6f 20 20 20 20 5c 0a 20 20 20 63 20 74 68 72 65  o    \.   c thre
0600: 65 20 63 20 74 68 72 65 65 20 20 20 20 20 20 20  e c three       
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0620: 5d 0a 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 20  ]...# This proc 
0630: 69 73 20 61 20 73 70 65 63 69 61 6c 69 7a 65 64  is a specialized
0640: 20 76 65 72 73 69 6f 6e 20 6f 66 20 5b 64 6f 5f   version of [do_
0650: 65 78 65 63 73 71 6c 5f 74 65 73 74 5d 2e 0a 23  execsql_test]..#
0660: 0a 23 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  .# The second ar
0670: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 70  gument to this p
0680: 72 6f 63 20 6d 75 73 74 20 62 65 20 61 20 53 45  roc must be a SE
0690: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
06a0: 68 61 74 20 0a 23 20 66 65 61 74 75 72 65 73 20  hat .# features 
06b0: 61 20 63 72 6f 73 73 20 6a 6f 69 6e 20 6f 66 20  a cross join of 
06c0: 73 6f 6d 65 20 74 69 6d 65 2e 20 49 6e 73 74 65  some time. Inste
06d0: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  ad of the usual 
06e0: 22 2c 22 2c 20 0a 23 20 22 43 52 4f 53 53 20 4a  ",", .# "CROSS J
06f0: 4f 49 4e 22 20 6f 72 20 22 49 4e 4e 45 52 20 4a  OIN" or "INNER J
0700: 4f 49 4e 22 20 6a 6f 69 6e 2d 6f 70 2c 20 74 68  OIN" join-op, th
0710: 65 20 73 74 72 69 6e 67 20 25 4a 4f 49 4e 25 20  e string %JOIN% 
0720: 6d 75 73 74 20 62 65 20 0a 23 20 73 75 62 73 74  must be .# subst
0730: 69 74 75 74 65 64 2e 0a 23 0a 23 20 54 68 69 73  ituted..#.# This
0740: 20 74 65 73 74 20 72 75 6e 73 20 74 68 65 20 53   test runs the S
0750: 45 4c 45 43 54 20 74 68 72 65 65 20 74 69 6d 65  ELECT three time
0760: 73 20 2d 20 6f 6e 63 65 20 77 69 74 68 3a 0a 23  s - once with:.#
0770: 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e 25 2f  .#   * s/%JOIN%/
0780: 2c 2f 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e  ,/.#   * s/%JOIN
0790: 25 2f 4a 4f 49 4e 2f 0a 23 20 20 20 2a 20 73 2f  %/JOIN/.#   * s/
07a0: 25 4a 4f 49 4e 25 2f 49 4e 4e 45 52 20 4a 4f 49  %JOIN%/INNER JOI
07b0: 4e 2f 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e  N/.#   * s/%JOIN
07c0: 25 2f 43 52 4f 53 53 20 4a 4f 49 4e 2f 0a 23 0a  %/CROSS JOIN/.#.
07d0: 23 20 61 6e 64 20 63 68 65 63 6b 73 20 74 68 61  # and checks tha
07e0: 74 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  t each time the 
07f0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
0800: 45 4c 45 43 54 20 61 72 65 20 24 72 65 73 2e 0a  ELECT are $res..
0810: 23 0a 70 72 6f 63 20 64 6f 5f 6a 6f 69 6e 5f 74  #.proc do_join_t
0820: 65 73 74 20 7b 74 6e 20 73 65 6c 65 63 74 20 72  est {tn select r
0830: 65 73 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20  es} {.  foreach 
0840: 7b 74 6e 32 20 6a 6f 69 6e 6f 70 7d 20 5b 6c 69  {tn2 joinop} [li
0850: 73 74 20 20 20 20 31 20 2c 20 20 20 20 32 20 22  st    1 ,    2 "
0860: 43 52 4f 53 53 20 4a 4f 49 4e 22 20 20 20 20 33  CROSS JOIN"    3
0870: 20 22 49 4e 4e 45 52 20 4a 4f 49 4e 22 5d 20 7b   "INNER JOIN"] {
0880: 0a 20 20 20 20 73 65 74 20 53 20 5b 73 74 72 69  .    set S [stri
0890: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 4a 4f  ng map [list %JO
08a0: 49 4e 25 20 24 6a 6f 69 6e 6f 70 5d 20 24 73 65  IN% $joinop] $se
08b0: 6c 65 63 74 5d 0a 20 20 20 20 75 70 6c 65 76 65  lect].    upleve
08c0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
08d0: 74 20 24 74 6e 2e 24 74 6e 32 20 5b 6c 69 73 74  t $tn.$tn2 [list
08e0: 20 24 53 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d   $S] [list $res]
08f0: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
0950: 6e 67 20 74 65 73 74 73 20 63 68 65 63 6b 20 74  ng tests check t
0960: 68 61 74 20 61 6c 6c 20 70 61 74 68 73 20 6f 6e  hat all paths on
0970: 20 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67   the syntax diag
0980: 72 61 6d 73 20 6f 6e 0a 23 20 74 68 65 20 6c 61  rams on.# the la
0990: 6e 67 5f 73 65 6c 65 63 74 2e 68 74 6d 6c 20 70  ng_select.html p
09a0: 61 67 65 20 6d 61 79 20 62 65 20 74 61 6b 65 6e  age may be taken
09b0: 2e 0a 23 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20  ..#.# -- syntax 
09c0: 64 69 61 67 72 61 6d 20 6a 6f 69 6e 2d 63 6f 6e  diagram join-con
09d0: 73 74 72 61 69 6e 74 0a 23 0a 64 6f 5f 6a 6f 69  straint.#.do_joi
09e0: 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  n_test e_select-
09f0: 30 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  0.1.1 {.  SELECT
0a00: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0a10: 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28  1 %JOIN% t2 ON (
0a20: 74 31 2e 61 3d 74 32 2e 61 29 0a 7d 20 7b 33 7d  t1.a=t2.a).} {3}
0a30: 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f  .do_join_test e_
0a40: 73 65 6c 65 63 74 2d 30 2e 31 2e 32 20 7b 0a 20  select-0.1.2 {. 
0a50: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
0a60: 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20   FROM t1 %JOIN% 
0a70: 74 32 20 55 53 49 4e 47 20 28 61 29 0a 7d 20 7b  t2 USING (a).} {
0a80: 33 7d 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20  3}.do_join_test 
0a90: 65 5f 73 65 6c 65 63 74 2d 30 2e 31 2e 33 20 7b  e_select-0.1.3 {
0aa0: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
0ab0: 2a 29 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e  *) FROM t1 %JOIN
0ac0: 25 20 74 32 0a 7d 20 7b 39 7d 0a 64 6f 5f 63 61  % t2.} {9}.do_ca
0ad0: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  tchsql_test e_se
0ae0: 6c 65 63 74 2d 30 2e 31 2e 34 20 7b 0a 20 20 53  lect-0.1.4 {.  S
0af0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0b00: 52 4f 4d 20 74 31 2c 20 74 32 20 4f 4e 20 28 74  ROM t1, t2 ON (t
0b10: 31 2e 61 3d 74 32 2e 61 29 20 55 53 49 4e 47 20  1.a=t2.a) USING 
0b20: 28 61 29 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74  (a).} {1 {cannot
0b30: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
0b40: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
0b50: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
0b60: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
0b70: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 30 2e 31  est e_select-0.1
0b80: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  .5 {.  SELECT co
0b90: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 2c 20  unt(*) FROM t1, 
0ba0: 74 32 20 55 53 49 4e 47 20 28 61 29 20 4f 4e 20  t2 USING (a) ON 
0bb0: 28 74 31 2e 61 3d 74 32 2e 61 29 0a 7d 20 7b 31  (t1.a=t2.a).} {1
0bc0: 20 7b 6e 65 61 72 20 22 4f 4e 22 3a 20 73 79 6e   {near "ON": syn
0bd0: 74 61 78 20 65 72 72 6f 72 7d 7d 0a 0a 23 20 2d  tax error}}..# -
0be0: 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d  - syntax diagram
0bf0: 20 73 65 6c 65 63 74 2d 63 6f 72 65 0a 23 0a 23   select-core.#.#
0c00: 20 20 20 30 3a 20 53 45 4c 45 43 54 20 2e 2e 2e     0: SELECT ...
0c10: 0a 23 20 20 20 31 3a 20 53 45 4c 45 43 54 20 44  .#   1: SELECT D
0c20: 49 53 54 49 4e 43 54 20 2e 2e 2e 0a 23 20 20 20  ISTINCT ....#   
0c30: 32 3a 20 53 45 4c 45 43 54 20 41 4c 4c 20 2e 2e  2: SELECT ALL ..
0c40: 2e 0a 23 0a 23 20 20 20 30 3a 20 4e 6f 20 46 52  ..#.#   0: No FR
0c50: 4f 4d 20 63 6c 61 75 73 65 0a 23 20 20 20 31 3a  OM clause.#   1:
0c60: 20 48 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   Has FROM clause
0c70: 0a 23 0a 23 20 20 20 30 3a 20 4e 6f 20 57 48 45  .#.#   0: No WHE
0c80: 52 45 20 63 6c 61 75 73 65 0a 23 20 20 20 31 3a  RE clause.#   1:
0c90: 20 48 61 73 20 57 48 45 52 45 20 63 6c 61 75 73   Has WHERE claus
0ca0: 65 0a 23 0a 23 20 20 20 30 3a 20 4e 6f 20 47 52  e.#.#   0: No GR
0cb0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 23 20  OUP BY clause.# 
0cc0: 20 20 31 3a 20 48 61 73 20 47 52 4f 55 50 20 42    1: Has GROUP B
0cd0: 59 20 63 6c 61 75 73 65 0a 23 20 20 20 32 3a 20  Y clause.#   2: 
0ce0: 48 61 73 20 47 52 4f 55 50 20 42 59 20 61 6e 64  Has GROUP BY and
0cf0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 0a   HAVING clauses.
0d00: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
0d10: 73 20 65 5f 73 65 6c 65 63 74 2d 30 2e 32 20 7b  s e_select-0.2 {
0d20: 0a 20 20 30 30 30 30 2e 31 20 20 22 53 45 4c 45  .  0000.1  "SELE
0d30: 43 54 20 31 2c 20 32 2c 20 33 20 22 20 7b 31 20  CT 1, 2, 3 " {1 
0d40: 32 20 33 7d 0a 20 20 31 30 30 30 2e 31 20 20 22  2 3}.  1000.1  "
0d50: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0d60: 31 2c 20 32 2c 20 33 20 22 20 7b 31 20 32 20 33  1, 2, 3 " {1 2 3
0d70: 7d 0a 20 20 32 30 30 30 2e 31 20 20 22 53 45 4c  }.  2000.1  "SEL
0d80: 45 43 54 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20  ECT ALL 1, 2, 3 
0d90: 22 20 7b 31 20 32 20 33 7d 0a 20 20 0a 20 20 30  " {1 2 3}.  .  0
0da0: 31 30 30 2e 31 20 20 22 53 45 4c 45 43 54 20 61  100.1  "SELECT a
0db0: 2c 20 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74  , b, a||b FROM t
0dc0: 31 20 22 20 7b 0a 20 20 20 20 61 20 6f 6e 65 20  1 " {.    a one 
0dd0: 61 6f 6e 65 20 62 20 74 77 6f 20 62 74 77 6f 20  aone b two btwo 
0de0: 63 20 74 68 72 65 65 20 63 74 68 72 65 65 0a 20  c three cthree. 
0df0: 20 7d 0a 20 20 31 31 30 30 2e 31 20 20 22 53 45   }.  1100.1  "SE
0e00: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c  LECT DISTINCT a,
0e10: 20 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31   b, a||b FROM t1
0e20: 20 22 20 7b 0a 20 20 20 20 61 20 6f 6e 65 20 61   " {.    a one a
0e30: 6f 6e 65 20 62 20 74 77 6f 20 62 74 77 6f 20 63  one b two btwo c
0e40: 20 74 68 72 65 65 20 63 74 68 72 65 65 0a 20 20   three cthree.  
0e50: 7d 0a 20 20 31 32 30 30 2e 31 20 20 22 53 45 4c  }.  1200.1  "SEL
0e60: 45 43 54 20 41 4c 4c 20 61 2c 20 62 2c 20 61 7c  ECT ALL a, b, a|
0e70: 7c 62 20 46 52 4f 4d 20 74 31 20 22 20 7b 0a 20  |b FROM t1 " {. 
0e80: 20 20 20 61 20 6f 6e 65 20 61 6f 6e 65 20 62 20     a one aone b 
0e90: 74 77 6f 20 62 74 77 6f 20 63 20 74 68 72 65 65  two btwo c three
0ea0: 20 63 74 68 72 65 65 0a 20 20 7d 0a 0a 20 20 30   cthree.  }..  0
0eb0: 30 31 30 2e 31 20 20 22 53 45 4c 45 43 54 20 31  010.1  "SELECT 1
0ec0: 2c 20 32 2c 20 33 20 57 48 45 52 45 20 31 20 22  , 2, 3 WHERE 1 "
0ed0: 20 7b 31 20 32 20 33 7d 0a 20 20 30 30 31 30 2e   {1 2 3}.  0010.
0ee0: 32 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c  2  "SELECT 1, 2,
0ef0: 20 33 20 57 48 45 52 45 20 30 20 22 20 7b 7d 0a   3 WHERE 0 " {}.
0f00: 20 20 30 30 31 30 2e 33 20 20 22 53 45 4c 45 43    0010.3  "SELEC
0f10: 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20  T 1, 2, 3 WHERE 
0f20: 4e 55 4c 4c 20 22 20 7b 7d 0a 0a 20 20 31 30 31  NULL " {}..  101
0f30: 30 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  0.1  "SELECT DIS
0f40: 54 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 57 48  TINCT 1, 2, 3 WH
0f50: 45 52 45 20 31 20 22 20 7b 31 20 32 20 33 7d 0a  ERE 1 " {1 2 3}.
0f60: 0a 20 20 32 30 31 30 2e 31 20 20 22 53 45 4c 45  .  2010.1  "SELE
0f70: 43 54 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57  CT ALL 1, 2, 3 W
0f80: 48 45 52 45 20 31 20 22 20 7b 31 20 32 20 33 7d  HERE 1 " {1 2 3}
0f90: 0a 0a 20 20 30 31 31 30 2e 31 20 20 22 53 45 4c  ..  0110.1  "SEL
0fa0: 45 43 54 20 61 2c 20 62 2c 20 61 7c 7c 62 20 46  ECT a, b, a||b F
0fb0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 21 3d  ROM t1 WHERE a!=
0fc0: 27 78 27 20 22 20 7b 0a 20 20 20 20 61 20 6f 6e  'x' " {.    a on
0fd0: 65 20 61 6f 6e 65 20 62 20 74 77 6f 20 62 74 77  e aone b two btw
0fe0: 6f 20 63 20 74 68 72 65 65 20 63 74 68 72 65 65  o c three cthree
0ff0: 0a 20 20 7d 0a 20 20 30 31 31 30 2e 32 20 20 22  .  }.  0110.2  "
1000: 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 61 7c 7c  SELECT a, b, a||
1010: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
1020: 61 3d 3d 27 78 27 22 20 7b 7d 0a 0a 20 20 31 31  a=='x'" {}..  11
1030: 31 30 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49  10.1  "SELECT DI
1040: 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 61 7c 7c  STINCT a, b, a||
1050: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
1060: 61 21 3d 27 78 27 20 22 20 7b 0a 20 20 20 20 61  a!='x' " {.    a
1070: 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74 77 6f 20   one aone b two 
1080: 62 74 77 6f 20 63 20 74 68 72 65 65 20 63 74 68  btwo c three cth
1090: 72 65 65 0a 20 20 7d 0a 0a 20 20 32 31 31 30 2e  ree.  }..  2110.
10a0: 30 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 61  0  "SELECT ALL a
10b0: 2c 20 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74  , b, a||b FROM t
10c0: 31 20 57 48 45 52 45 20 61 3d 3d 27 78 27 22 20  1 WHERE a=='x'" 
10d0: 7b 7d 0a 0a 20 20 30 30 30 31 2e 31 20 20 22 53  {}..  0001.1  "S
10e0: 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 20 47 52  ELECT 1, 2, 3 GR
10f0: 4f 55 50 20 42 59 20 32 22 20 7b 31 20 32 20 33  OUP BY 2" {1 2 3
1100: 7d 0a 20 20 30 30 30 32 2e 31 20 20 22 53 45 4c  }.  0002.1  "SEL
1110: 45 43 54 20 31 2c 20 32 2c 20 33 20 47 52 4f 55  ECT 1, 2, 3 GROU
1120: 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f  P BY 2 HAVING co
1130: 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20 32 20 33  unt(*)=1" {1 2 3
1140: 7d 0a 20 20 30 30 30 32 2e 32 20 20 22 53 45 4c  }.  0002.2  "SEL
1150: 45 43 54 20 31 2c 20 32 2c 20 33 20 47 52 4f 55  ECT 1, 2, 3 GROU
1160: 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f  P BY 2 HAVING co
1170: 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20 20  unt(*)>1" {}..  
1180: 31 30 30 31 2e 31 20 20 22 53 45 4c 45 43 54 20  1001.1  "SELECT 
1190: 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c 20 33  DISTINCT 1, 2, 3
11a0: 20 47 52 4f 55 50 20 42 59 20 32 22 20 7b 31 20   GROUP BY 2" {1 
11b0: 32 20 33 7d 0a 20 20 31 30 30 32 2e 31 20 20 22  2 3}.  1002.1  "
11c0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
11d0: 31 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59  1, 2, 3 GROUP BY
11e0: 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28   2 HAVING count(
11f0: 2a 29 3d 31 22 20 7b 31 20 32 20 33 7d 0a 20 20  *)=1" {1 2 3}.  
1200: 31 30 30 32 2e 32 20 20 22 53 45 4c 45 43 54 20  1002.2  "SELECT 
1210: 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c 20 33  DISTINCT 1, 2, 3
1220: 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56 49   GROUP BY 2 HAVI
1230: 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20 7b  NG count(*)>1" {
1240: 7d 0a 0a 20 20 32 30 30 31 2e 31 20 20 22 53 45  }..  2001.1  "SE
1250: 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32 2c 20 33  LECT ALL 1, 2, 3
1260: 20 47 52 4f 55 50 20 42 59 20 32 22 20 7b 31 20   GROUP BY 2" {1 
1270: 32 20 33 7d 0a 20 20 32 30 30 32 2e 31 20 20 22  2 3}.  2002.1  "
1280: 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32 2c  SELECT ALL 1, 2,
1290: 20 33 20 47 52 4f 55 50 20 42 59 20 32 20 48 41   3 GROUP BY 2 HA
12a0: 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22  VING count(*)=1"
12b0: 20 7b 31 20 32 20 33 7d 0a 20 20 32 30 30 32 2e   {1 2 3}.  2002.
12c0: 32 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31  2  "SELECT ALL 1
12d0: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
12e0: 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  2 HAVING count(*
12f0: 29 3e 31 22 20 7b 7d 0a 0a 20 20 30 31 30 31 2e  )>1" {}..  0101.
1300: 31 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  1  "SELECT count
1310: 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d  (*), max(a) FROM
1320: 20 74 31 20 47 52 4f 55 50 20 42 59 20 62 22 20   t1 GROUP BY b" 
1330: 7b 31 20 61 20 31 20 63 20 31 20 62 7d 0a 20 20  {1 a 1 c 1 b}.  
1340: 30 31 30 32 2e 31 20 20 22 53 45 4c 45 43 54 20  0102.1  "SELECT 
1350: 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29  count(*), max(a)
1360: 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
1370: 59 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  Y b HAVING count
1380: 28 2a 29 3d 31 22 20 7b 0a 20 20 20 20 31 20 61  (*)=1" {.    1 a
1390: 20 31 20 63 20 31 20 62 0a 20 20 7d 0a 20 20 30   1 c 1 b.  }.  0
13a0: 31 30 32 2e 32 20 20 22 53 45 4c 45 43 54 20 63  102.2  "SELECT c
13b0: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
13c0: 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
13d0: 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28   b HAVING count(
13e0: 2a 29 3d 32 22 20 7b 7d 0a 0a 20 20 31 31 30 31  *)=2" {}..  1101
13f0: 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54  .1  "SELECT DIST
1400: 49 4e 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  INCT count(*), m
1410: 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47 52  ax(a) FROM t1 GR
1420: 4f 55 50 20 42 59 20 62 22 20 7b 31 20 61 20 31  OUP BY b" {1 a 1
1430: 20 63 20 31 20 62 7d 0a 20 20 31 31 30 32 2e 31   c 1 b}.  1102.1
1440: 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e    "SELECT DISTIN
1450: 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78  CT count(*), max
1460: 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20  (a) FROM t1 .   
1470: 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42 59          GROUP BY
1480: 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28   b HAVING count(
1490: 2a 29 3d 31 22 20 7b 0a 20 20 20 20 31 20 61 20  *)=1" {.    1 a 
14a0: 31 20 63 20 31 20 62 0a 20 20 7d 0a 20 20 31 31  1 c 1 b.  }.  11
14b0: 30 32 2e 32 20 20 22 53 45 4c 45 43 54 20 44 49  02.2  "SELECT DI
14c0: 53 54 49 4e 43 54 20 63 6f 75 6e 74 28 2a 29 2c  STINCT count(*),
14d0: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
14e0: 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55  .           GROU
14f0: 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 6f  P BY b HAVING co
1500: 75 6e 74 28 2a 29 3d 32 22 20 7b 7d 0a 0a 20 20  unt(*)=2" {}..  
1510: 32 31 30 31 2e 31 20 20 22 53 45 4c 45 43 54 20  2101.1  "SELECT 
1520: 41 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  ALL count(*), ma
1530: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47 52 4f  x(a) FROM t1 GRO
1540: 55 50 20 42 59 20 62 22 20 7b 31 20 61 20 31 20  UP BY b" {1 a 1 
1550: 63 20 31 20 62 7d 0a 20 20 32 31 30 32 2e 31 20  c 1 b}.  2102.1 
1560: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 63 6f 75   "SELECT ALL cou
1570: 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52  nt(*), max(a) FR
1580: 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20 20  OM t1 .         
1590: 20 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56    GROUP BY b HAV
15a0: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20  ING count(*)=1" 
15b0: 7b 0a 20 20 20 20 31 20 61 20 31 20 63 20 31 20  {.    1 a 1 c 1 
15c0: 62 0a 20 20 7d 0a 20 20 32 31 30 32 2e 32 20 20  b.  }.  2102.2  
15d0: 22 53 45 4c 45 43 54 20 41 4c 4c 20 63 6f 75 6e  "SELECT ALL coun
15e0: 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f  t(*), max(a) FRO
15f0: 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20 20 20  M t1 .          
1600: 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
1610: 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b  NG count(*)=2" {
1620: 7d 0a 0a 20 20 30 30 31 31 2e 31 20 20 22 53 45  }..  0011.1  "SE
1630: 4c 45 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45  LECT 1, 2, 3 WHE
1640: 52 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 22  RE 1 GROUP BY 2"
1650: 20 7b 31 20 32 20 33 7d 0a 20 20 30 30 31 32 2e   {1 2 3}.  0012.
1660: 31 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c  1  "SELECT 1, 2,
1670: 20 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50   3 WHERE 0 GROUP
1680: 20 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75   BY 2 HAVING cou
1690: 6e 74 28 2a 29 3d 31 22 20 7b 7d 0a 20 20 30 30  nt(*)=1" {}.  00
16a0: 31 32 2e 32 20 20 22 53 45 4c 45 43 54 20 31 2c  12.2  "SELECT 1,
16b0: 20 32 2c 20 33 20 57 48 45 52 45 20 30 20 47 52   2, 3 WHERE 0 GR
16c0: 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20  OUP BY 2 HAVING 
16d0: 63 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a  count(*)>1" {}..
16e0: 20 20 31 30 31 31 2e 31 20 20 22 53 45 4c 45 43    1011.1  "SELEC
16f0: 54 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c  T DISTINCT 1, 2,
1700: 20 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50   3 WHERE 0 GROUP
1710: 20 42 59 20 32 22 20 7b 7d 0a 20 20 31 30 31 32   BY 2" {}.  1012
1720: 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54  .1  "SELECT DIST
1730: 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45  INCT 1, 2, 3 WHE
1740: 52 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 20  RE 1 GROUP BY 2 
1750: 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d  HAVING count(*)=
1760: 31 22 20 0a 20 20 20 20 20 20 20 20 20 20 7b 31  1" .          {1
1770: 20 32 20 33 7d 0a 20 20 31 30 31 32 2e 32 20 20   2 3}.  1012.2  
1780: 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
1790: 20 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20 4e   1, 2, 3 WHERE N
17a0: 55 4c 4c 20 47 52 4f 55 50 20 42 59 20 32 20 48  ULL GROUP BY 2 H
17b0: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31  AVING count(*)>1
17c0: 22 20 7b 7d 0a 0a 20 20 32 30 31 31 2e 31 20 20  " {}..  2011.1  
17d0: 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32  "SELECT ALL 1, 2
17e0: 2c 20 33 20 57 48 45 52 45 20 31 20 47 52 4f 55  , 3 WHERE 1 GROU
17f0: 50 20 42 59 20 32 22 20 7b 31 20 32 20 33 7d 0a  P BY 2" {1 2 3}.
1800: 20 20 32 30 31 32 2e 31 20 20 22 53 45 4c 45 43    2012.1  "SELEC
1810: 54 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57 48  T ALL 1, 2, 3 WH
1820: 45 52 45 20 30 20 47 52 4f 55 50 20 42 59 20 32  ERE 0 GROUP BY 2
1830: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
1840: 3d 31 22 20 7b 7d 0a 20 20 32 30 31 32 2e 32 20  =1" {}.  2012.2 
1850: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20   "SELECT ALL 1, 
1860: 32 2c 20 33 20 57 48 45 52 45 20 27 61 62 63 27  2, 3 WHERE 'abc'
1870: 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56 49   GROUP BY 2 HAVI
1880: 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20 7b  NG count(*)>1" {
1890: 7d 0a 0a 20 20 30 31 31 31 2e 31 20 20 22 53 45  }..  0111.1  "SE
18a0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
18b0: 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48  ax(a) FROM t1 WH
18c0: 45 52 45 20 61 3d 27 61 27 20 47 52 4f 55 50 20  ERE a='a' GROUP 
18d0: 42 59 20 62 22 20 7b 31 20 61 7d 0a 20 20 30 31  BY b" {1 a}.  01
18e0: 31 32 2e 31 20 20 22 53 45 4c 45 43 54 20 63 6f  12.1  "SELECT co
18f0: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
1900: 52 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20  ROM t1 .        
1910: 20 20 20 57 48 45 52 45 20 61 3d 27 63 27 20 47     WHERE a='c' G
1920: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1930: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20   count(*)=1" {1 
1940: 63 7d 0a 20 20 30 31 31 32 2e 32 20 20 22 53 45  c}.  0112.2  "SE
1950: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
1960: 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20  ax(a) FROM t1 . 
1970: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
1980: 30 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  0 GROUP BY b HAV
1990: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20  ING count(*)=2" 
19a0: 7b 7d 0a 20 20 31 31 31 31 2e 31 20 20 22 53 45  {}.  1111.1  "SE
19b0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f  LECT DISTINCT co
19c0: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
19d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c 27  ROM t1 WHERE a<'
19e0: 63 27 20 47 52 4f 55 50 20 42 59 20 62 22 20 0a  c' GROUP BY b" .
19f0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 61 20 31            {1 a 1
1a00: 20 62 7d 0a 20 20 31 31 31 32 2e 31 20 20 22 53   b}.  1112.1  "S
1a10: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63  ELECT DISTINCT c
1a20: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
1a30: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
1a40: 27 61 27 0a 20 20 20 20 20 20 20 20 20 20 20 47  'a'.           G
1a50: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1a60: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
1a70: 20 20 20 31 20 63 20 31 20 62 0a 20 20 7d 0a 20     1 c 1 b.  }. 
1a80: 20 31 31 31 32 2e 32 20 20 22 53 45 4c 45 43 54   1112.2  "SELECT
1a90: 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28   DISTINCT count(
1aa0: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
1ab0: 74 31 20 57 48 45 52 45 20 30 0a 20 20 20 20 20  t1 WHERE 0.     
1ac0: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
1ad0: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
1ae0: 3d 32 22 20 7b 7d 0a 0a 20 20 32 31 31 31 2e 31  =2" {}..  2111.1
1af0: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 63 6f    "SELECT ALL co
1b00: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
1b10: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e 27  ROM t1 WHERE b>'
1b20: 6f 6e 65 27 20 47 52 4f 55 50 20 42 59 20 62 22  one' GROUP BY b"
1b30: 20 0a 20 20 20 20 20 20 20 20 20 20 7b 31 20 63   .          {1 c
1b40: 20 31 20 62 7d 0a 20 20 32 31 31 32 2e 31 20 20   1 b}.  2112.1  
1b50: 22 53 45 4c 45 43 54 20 41 4c 4c 20 63 6f 75 6e  "SELECT ALL coun
1b60: 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f  t(*), max(a) FRO
1b70: 4d 20 74 31 20 57 48 45 52 45 20 61 21 3d 27 62  M t1 WHERE a!='b
1b80: 27 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f  '.           GRO
1b90: 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
1ba0: 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20 20 20  ount(*)=1" {.   
1bb0: 20 31 20 61 20 31 20 63 0a 20 20 7d 0a 20 20 32   1 a 1 c.  }.  2
1bc0: 31 31 32 2e 32 20 20 22 53 45 4c 45 43 54 20 41  112.2  "SELECT A
1bd0: 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78  LL count(*), max
1be0: 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20  (a) FROM t1 .   
1bf0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 30 20          WHERE 0 
1c00: 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
1c10: 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 7d  G count(*)=2" {}
1c20: 0a 7d 0a 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78  .}...# -- syntax
1c30: 20 64 69 61 67 72 61 6d 20 72 65 73 75 6c 74 2d   diagram result-
1c40: 63 6f 6c 75 6d 6e 0a 23 0a 64 6f 5f 73 65 6c 65  column.#.do_sele
1c50: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
1c60: 74 2d 30 2e 33 20 7b 0a 20 20 31 20 20 22 53 45  t-0.3 {.  1  "SE
1c70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20  LECT * FROM t1" 
1c80: 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74  {a one b two c t
1c90: 68 72 65 65 7d 0a 20 20 32 20 20 22 53 45 4c 45  hree}.  2  "SELE
1ca0: 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 22  CT t1.* FROM t1"
1cb0: 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20   {a one b two c 
1cc0: 74 68 72 65 65 7d 0a 20 20 33 20 20 22 53 45 4c  three}.  3  "SEL
1cd0: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1ce0: 46 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62  FROM t1" {xax xb
1cf0: 78 20 78 63 78 7d 0a 20 20 34 20 20 22 53 45 4c  x xcx}.  4  "SEL
1d00: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1d10: 61 6c 69 61 73 20 46 52 4f 4d 20 74 31 22 20 7b  alias FROM t1" {
1d20: 78 61 78 20 78 62 78 20 78 63 78 7d 0a 20 20 35  xax xbx xcx}.  5
1d30: 20 20 22 53 45 4c 45 43 54 20 27 78 27 7c 7c 61    "SELECT 'x'||a
1d40: 7c 7c 27 78 27 20 41 53 20 61 6c 69 61 73 20 46  ||'x' AS alias F
1d50: 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62 78  ROM t1" {xax xbx
1d60: 20 78 63 78 7d 0a 7d 0a 0a 23 20 2d 2d 20 73 79   xcx}.}..# -- sy
1d70: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6a 6f 69  ntax diagram joi
1d80: 6e 2d 73 6f 75 72 63 65 0a 23 0a 23 20 2d 2d 20  n-source.#.# -- 
1d90: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6a  syntax diagram j
1da0: 6f 69 6e 2d 6f 70 0a 23 0a 64 6f 5f 73 65 6c 65  oin-op.#.do_sele
1db0: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
1dc0: 74 2d 30 2e 34 20 7b 0a 20 20 31 20 20 22 53 45  t-0.4 {.  1  "SE
1dd0: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
1de0: 4f 4d 20 74 31 22 20 7b 31 20 32 20 33 7d 0a 20  OM t1" {1 2 3}. 
1df0: 20 32 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72   2  "SELECT t1.r
1e00: 6f 77 69 64 20 46 52 4f 4d 20 74 31 2c 74 32 22  owid FROM t1,t2"
1e10: 20 7b 31 20 31 20 31 20 32 20 32 20 32 20 33 20   {1 1 1 2 2 2 3 
1e20: 33 20 33 7d 0a 20 20 33 20 20 22 53 45 4c 45 43  3 3}.  3  "SELEC
1e30: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1e40: 74 31 2c 74 32 2c 74 33 22 20 7b 31 20 31 20 31  t1,t2,t3" {1 1 1
1e50: 20 31 20 31 20 31 20 32 20 32 20 32 20 32 20 32   1 1 1 2 2 2 2 2
1e60: 20 32 20 33 20 33 20 33 20 33 20 33 20 33 7d 0a   2 3 3 3 3 3 3}.
1e70: 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20 74 31  .  4  "SELECT t1
1e80: 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 22 20  .rowid FROM t1" 
1e90: 7b 31 20 32 20 33 7d 0a 20 20 35 20 20 22 53 45  {1 2 3}.  5  "SE
1ea0: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
1eb0: 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 32 22 20 7b  OM t1 JOIN t2" {
1ec0: 31 20 31 20 31 20 32 20 32 20 32 20 33 20 33 20  1 1 1 2 2 2 3 3 
1ed0: 33 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20  3}.  6  "SELECT 
1ee0: 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  t1.rowid FROM t1
1ef0: 20 4a 4f 49 4e 20 74 32 20 4a 4f 49 4e 20 74 33   JOIN t2 JOIN t3
1f00: 22 20 0a 20 20 20 20 20 7b 31 20 31 20 31 20 31  " .     {1 1 1 1
1f10: 20 31 20 31 20 32 20 32 20 32 20 32 20 32 20 32   1 1 2 2 2 2 2 2
1f20: 20 33 20 33 20 33 20 33 20 33 20 33 7d 0a 0a 20   3 3 3 3 3 3}.. 
1f30: 20 37 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72   7  "SELECT t1.r
1f40: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 4e 41 54  owid FROM t1 NAT
1f50: 55 52 41 4c 20 4a 4f 49 4e 20 74 33 22 20 7b 31  URAL JOIN t3" {1
1f60: 20 32 7d 0a 20 20 38 20 20 22 53 45 4c 45 43 54   2}.  8  "SELECT
1f70: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
1f80: 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4f  1 NATURAL LEFT O
1f90: 55 54 45 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31  UTER JOIN t3" {1
1fa0: 20 32 20 33 7d 0a 20 20 39 20 20 22 53 45 4c 45   2 3}.  9  "SELE
1fb0: 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d  CT t1.rowid FROM
1fc0: 20 74 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54   t1 NATURAL LEFT
1fd0: 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20 32 20 33   JOIN t3" {1 2 3
1fe0: 7d 0a 20 20 31 30 20 22 53 45 4c 45 43 54 20 74  }.  10 "SELECT t
1ff0: 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  1.rowid FROM t1 
2000: 4e 41 54 55 52 41 4c 20 49 4e 4e 45 52 20 4a 4f  NATURAL INNER JO
2010: 49 4e 20 74 33 22 20 7b 31 20 32 7d 0a 20 20 31  IN t3" {1 2}.  1
2020: 31 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77  1 "SELECT t1.row
2030: 69 64 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52  id FROM t1 NATUR
2040: 41 4c 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 33  AL CROSS JOIN t3
2050: 22 20 7b 31 20 32 7d 0a 0a 20 20 31 32 20 22 53  " {1 2}..  12 "S
2060: 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46  ELECT t1.rowid F
2070: 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 33 22 20  ROM t1 JOIN t3" 
2080: 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20  {1 1 2 2 3 3}.  
2090: 31 33 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  13 "SELECT t1.ro
20a0: 77 69 64 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  wid FROM t1 LEFT
20b0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 33 22 20   OUTER JOIN t3" 
20c0: 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20  {1 1 2 2 3 3}.  
20d0: 31 34 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  14 "SELECT t1.ro
20e0: 77 69 64 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  wid FROM t1 LEFT
20f0: 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20 31 20 32   JOIN t3" {1 1 2
2100: 20 32 20 33 20 33 7d 0a 20 20 31 35 20 22 53 45   2 3 3}.  15 "SE
2110: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
2120: 4f 4d 20 74 31 20 49 4e 4e 45 52 20 4a 4f 49 4e  OM t1 INNER JOIN
2130: 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33 20   t3" {1 1 2 2 3 
2140: 33 7d 0a 20 20 31 36 20 22 53 45 4c 45 43 54 20  3}.  16 "SELECT 
2150: 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  t1.rowid FROM t1
2160: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 33 22 20   CROSS JOIN t3" 
2170: 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 7d 0a  {1 1 2 2 3 3}.}.
2180: 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61  .# -- syntax dia
2190: 67 72 61 6d 20 63 6f 6d 70 6f 75 6e 64 2d 6f 70  gram compound-op
21a0: 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 73 65 6c 65  erator.#.do_sele
21b0: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
21c0: 74 2d 30 2e 35 20 7b 0a 20 20 31 20 20 22 53 45  t-0.5 {.  1  "SE
21d0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
21e0: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
21f0: 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f 4d  ECT rowid+2 FROM
2200: 20 74 34 22 20 7b 31 20 32 20 33 20 33 20 34 7d   t4" {1 2 3 3 4}
2210: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 72 6f  .  2  "SELECT ro
2220: 77 69 64 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  wid FROM t1 UNIO
2230: 4e 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  N     SELECT row
2240: 69 64 2b 32 20 46 52 4f 4d 20 74 34 22 20 7b 31  id+2 FROM t4" {1
2250: 20 32 20 33 20 34 7d 0a 20 20 33 20 20 22 53 45   2 3 4}.  3  "SE
2260: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
2270: 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  t1 INTERSECT SEL
2280: 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f 4d  ECT rowid+2 FROM
2290: 20 74 34 22 20 7b 33 7d 0a 20 20 34 20 20 22 53   t4" {3}.  4  "S
22a0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
22b0: 20 74 31 20 45 58 43 45 50 54 20 20 20 20 53 45   t1 EXCEPT    SE
22c0: 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f  LECT rowid+2 FRO
22d0: 4d 20 74 34 22 20 7b 31 20 32 7d 0a 7d 0a 0a 23  M t4" {1 2}.}..#
22e0: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
22f0: 61 6d 20 6f 72 64 65 72 69 6e 67 2d 74 65 72 6d  am ordering-term
2300: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
2310: 74 73 20 65 5f 73 65 6c 65 63 74 2d 30 2e 36 20  ts e_select-0.6 
2320: 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 62  {.  1  "SELECT b
2330: 7c 7c 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  ||a FROM t1 ORDE
2340: 52 20 42 59 20 62 7c 7c 61 22 20 20 20 20 20 20  R BY b||a"      
2350: 20 20 20 20 20 20 20 20 20 20 20 20 7b 6f 6e 65              {one
2360: 61 20 74 68 72 65 65 63 20 74 77 6f 62 7d 0a 20  a threec twob}. 
2370: 20 32 20 20 22 53 45 4c 45 43 54 20 62 7c 7c 61   2  "SELECT b||a
2380: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
2390: 59 20 28 62 7c 7c 61 29 20 43 4f 4c 4c 41 54 45  Y (b||a) COLLATE
23a0: 20 6e 6f 63 61 73 65 22 20 7b 6f 6e 65 61 20 74   nocase" {onea t
23b0: 68 72 65 65 63 20 74 77 6f 62 7d 0a 20 20 33 20  hreec twob}.  3 
23c0: 20 22 53 45 4c 45 43 54 20 62 7c 7c 61 20 46 52   "SELECT b||a FR
23d0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 28  OM t1 ORDER BY (
23e0: 62 7c 7c 61 29 20 41 53 43 22 20 20 20 20 20 20  b||a) ASC"      
23f0: 20 20 20 20 20 20 7b 6f 6e 65 61 20 74 68 72 65        {onea thre
2400: 65 63 20 74 77 6f 62 7d 0a 20 20 34 20 20 22 53  ec twob}.  4  "S
2410: 45 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f 4d 20  ELECT b||a FROM 
2420: 74 31 20 4f 52 44 45 52 20 42 59 20 28 62 7c 7c  t1 ORDER BY (b||
2430: 61 29 20 44 45 53 43 22 20 20 20 20 20 20 20 20  a) DESC"        
2440: 20 20 20 7b 74 77 6f 62 20 74 68 72 65 65 63 20     {twob threec 
2450: 6f 6e 65 61 7d 0a 7d 0a 0a 23 20 2d 2d 20 73 79  onea}.}..# -- sy
2460: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 73 65 6c  ntax diagram sel
2470: 65 63 74 2d 73 74 6d 74 0a 23 0a 64 6f 5f 73 65  ect-stmt.#.do_se
2480: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
2490: 65 63 74 2d 30 2e 37 20 7b 0a 20 20 31 20 20 22  ect-0.7 {.  1  "
24a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24b0: 22 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63  " {a one b two c
24c0: 20 74 68 72 65 65 7d 0a 20 20 32 20 20 22 53 45   three}.  2  "SE
24d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f  LECT * FROM t1 O
24e0: 52 44 45 52 20 42 59 20 62 22 20 7b 61 20 6f 6e  RDER BY b" {a on
24f0: 65 20 63 20 74 68 72 65 65 20 62 20 74 77 6f 7d  e c three b two}
2500: 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20 2a 20  .  3  "SELECT * 
2510: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
2520: 20 62 2c 20 61 22 20 7b 61 20 6f 6e 65 20 63 20   b, a" {a one c 
2530: 74 68 72 65 65 20 62 20 74 77 6f 7d 0a 0a 20 20  three b two}..  
2540: 34 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  4  "SELECT * FRO
2550: 4d 20 74 31 20 4c 49 4d 49 54 20 31 30 22 20 7b  M t1 LIMIT 10" {
2560: 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68  a one b two c th
2570: 72 65 65 7d 0a 20 20 35 20 20 22 53 45 4c 45 43  ree}.  5  "SELEC
2580: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  T * FROM t1 LIMI
2590: 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 7b  T 10 OFFSET 5" {
25a0: 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 2a  }.  6  "SELECT *
25b0: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
25c0: 30 2c 20 35 22 20 7b 7d 0a 0a 20 20 37 20 20 22  0, 5" {}..  7  "
25d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
25e0: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
25f0: 54 20 31 30 22 20 7b 61 20 6f 6e 65 20 62 20 74  T 10" {a one b t
2600: 77 6f 20 63 20 74 68 72 65 65 7d 0a 20 20 38 20  wo c three}.  8 
2610: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2620: 74 31 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49  t1 ORDER BY b LI
2630: 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22  MIT 10 OFFSET 5"
2640: 20 7b 7d 0a 20 20 39 20 20 22 53 45 4c 45 43 54   {}.  9  "SELECT
2650: 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   * FROM t1 ORDER
2660: 20 42 59 20 61 2c 62 20 4c 49 4d 49 54 20 31 30   BY a,b LIMIT 10
2670: 2c 20 35 22 20 7b 7d 0a 0a 20 20 31 30 20 20 22  , 5" {}..  10  "
2680: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2690: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
26a0: 20 61 20 46 52 4f 4d 20 74 31 22 20 0a 20 20 20   a FROM t1" .   
26b0: 20 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63    {a one b two c
26c0: 20 74 68 72 65 65 20 6f 6e 65 20 61 20 74 68 72   three one a thr
26d0: 65 65 20 63 20 74 77 6f 20 62 7d 0a 20 20 31 31  ee c two b}.  11
26e0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
26f0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
2700: 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 4f 52   b, a FROM t1 OR
2710: 44 45 52 20 42 59 20 62 22 20 0a 20 20 20 20 20  DER BY b" .     
2720: 7b 6f 6e 65 20 61 20 74 77 6f 20 62 20 74 68 72  {one a two b thr
2730: 65 65 20 63 20 61 20 6f 6e 65 20 63 20 74 68 72  ee c a one c thr
2740: 65 65 20 62 20 74 77 6f 7d 0a 20 20 31 32 20 20  ee b two}.  12  
2750: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2760: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
2770: 2c 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  , a FROM t1 ORDE
2780: 52 20 42 59 20 62 2c 20 61 22 20 0a 20 20 20 20  R BY b, a" .    
2790: 20 7b 6f 6e 65 20 61 20 74 77 6f 20 62 20 74 68   {one a two b th
27a0: 72 65 65 20 63 20 61 20 6f 6e 65 20 63 20 74 68  ree c a one c th
27b0: 72 65 65 20 62 20 74 77 6f 7d 0a 20 20 31 33 20  ree b two}.  13 
27c0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
27d0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
27e0: 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 4c 49 4d  b, a FROM t1 LIM
27f0: 49 54 20 31 30 22 20 0a 20 20 20 20 20 7b 61 20  IT 10" .     {a 
2800: 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72 65  one b two c thre
2810: 65 20 6f 6e 65 20 61 20 74 68 72 65 65 20 63 20  e one a three c 
2820: 74 77 6f 20 62 7d 0a 20 20 31 34 20 20 22 53 45  two b}.  14  "SE
2830: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55  LECT * FROM t1 U
2840: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20 61  NION SELECT b, a
2850: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31   FROM t1 LIMIT 1
2860: 30 20 4f 46 46 53 45 54 20 35 22 20 0a 20 20 20  0 OFFSET 5" .   
2870: 20 20 7b 74 77 6f 20 62 7d 0a 20 20 31 35 20 20    {two b}.  15  
2880: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2890: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
28a0: 2c 20 61 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  , a FROM t1 LIMI
28b0: 54 20 31 30 2c 20 35 22 20 0a 20 20 20 20 20 7b  T 10, 5" .     {
28c0: 7d 0a 20 20 31 36 20 20 22 53 45 4c 45 43 54 20  }.  16  "SELECT 
28d0: 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  * FROM t1 UNION 
28e0: 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d  SELECT b, a FROM
28f0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   t1 ORDER BY a L
2900: 49 4d 49 54 20 31 30 22 20 0a 20 20 20 20 20 7b  IMIT 10" .     {
2910: 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68  a one b two c th
2920: 72 65 65 20 6f 6e 65 20 61 20 74 68 72 65 65 20  ree one a three 
2930: 63 20 74 77 6f 20 62 7d 0a 20 20 31 37 20 20 22  c two b}.  17  "
2940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2950: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
2960: 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   a FROM t1 ORDER
2970: 20 42 59 20 62 20 4c 49 4d 49 54 20 31 30 20 4f   BY b LIMIT 10 O
2980: 46 46 53 45 54 20 35 22 20 0a 20 20 20 20 20 7b  FFSET 5" .     {
2990: 62 20 74 77 6f 7d 0a 20 20 31 38 20 20 22 53 45  b two}.  18  "SE
29a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55  LECT * FROM t1 U
29b0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20 61  NION SELECT b, a
29c0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
29d0: 59 20 61 2c 62 20 4c 49 4d 49 54 20 31 30 2c 20  Y a,b LIMIT 10, 
29e0: 35 22 20 0a 20 20 20 20 20 7b 7d 0a 7d 0a 0a 23  5" .     {}.}..#
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
2a40: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
2a50: 66 6f 63 75 73 20 6f 6e 20 46 52 4f 4d 20 63 6c  focus on FROM cl
2a60: 61 75 73 65 20 28 6a 6f 69 6e 29 20 70 72 6f 63  ause (join) proc
2a70: 65 73 73 69 6e 67 2e 0a 23 0a 0a 23 20 45 56 49  essing..#..# EVI
2a80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 30 37  DENCE-OF: R-1607
2a90: 34 2d 35 34 31 39 36 20 49 66 20 74 68 65 20 46  4-54196 If the F
2aa0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6d  ROM clause is om
2ab0: 69 74 74 65 64 20 66 72 6f 6d 20 61 20 73 69 6d  itted from a sim
2ac0: 70 6c 65 0a 23 20 53 45 4c 45 43 54 20 73 74 61  ple.# SELECT sta
2ad0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  tement, then the
2ae0: 20 69 6e 70 75 74 20 64 61 74 61 20 69 73 20 69   input data is i
2af0: 6d 70 6c 69 63 69 74 6c 79 20 61 20 73 69 6e 67  mplicitly a sing
2b00: 6c 65 20 72 6f 77 20 7a 65 72 6f 0a 23 20 63 6f  le row zero.# co
2b10: 6c 75 6d 6e 73 20 77 69 64 65 0a 23 0a 64 6f 5f  lumns wide.#.do_
2b20: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
2b30: 65 6c 65 63 74 2d 31 2e 31 20 7b 0a 20 20 31 20  elect-1.1 {.  1 
2b40: 22 53 45 4c 45 43 54 20 27 61 62 63 27 22 20 20  "SELECT 'abc'"  
2b50: 20 20 20 20 20 20 20 20 20 20 7b 61 62 63 7d 0a            {abc}.
2b60: 20 20 32 20 22 53 45 4c 45 43 54 20 27 61 62 63    2 "SELECT 'abc
2b70: 27 20 57 48 45 52 45 20 4e 55 4c 4c 22 20 7b 7d  ' WHERE NULL" {}
2b80: 0a 20 20 33 20 22 53 45 4c 45 43 54 20 4e 55 4c  .  3 "SELECT NUL
2b90: 4c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  L"             {
2ba0: 7b 7d 7d 0a 20 20 34 20 22 53 45 4c 45 43 54 20  {}}.  4 "SELECT 
2bb0: 63 6f 75 6e 74 28 2a 29 22 20 20 20 20 20 20 20  count(*)"       
2bc0: 20 20 7b 31 7d 0a 20 20 35 20 22 53 45 4c 45 43    {1}.  5 "SELEC
2bd0: 54 20 63 6f 75 6e 74 28 2a 29 20 57 48 45 52 45  T count(*) WHERE
2be0: 20 30 22 20 7b 30 7d 0a 20 20 36 20 22 53 45 4c   0" {0}.  6 "SEL
2bf0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 57 48 45  ECT count(*) WHE
2c00: 52 45 20 31 22 20 7b 31 7d 0a 7d 0a 0a 23 20 45  RE 1" {1}.}..# E
2c10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35  VIDENCE-OF: R-45
2c20: 34 32 34 2d 30 37 33 35 32 20 49 66 20 74 68 65  424-07352 If the
2c30: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
2c40: 67 6c 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  gle table or sub
2c50: 71 75 65 72 79 0a 23 20 69 6e 20 74 68 65 20 46  query.# in the F
2c60: 52 4f 4d 20 63 6c 61 75 73 65 2c 20 74 68 65 6e  ROM clause, then
2c70: 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61 20   the input data 
2c80: 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  used by the SELE
2c90: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 23 20 69  CT statement.# i
2ca0: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
2cb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
2cc0: 65 2e 0a 23 0a 23 20 20 20 54 68 65 20 72 65 73  e..#.#   The res
2cd0: 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
2ce0: 43 54 20 71 75 65 72 69 65 73 20 73 75 67 67 65  CT queries sugge
2cf0: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
2d00: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
2d10: 65 0a 23 20 20 20 63 6f 6e 74 65 6e 74 73 20 6f  e.#   contents o
2d20: 66 20 74 68 65 20 74 61 62 6c 65 20 27 78 78 27  f the table 'xx'
2d30: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
2d40: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 32  est e_select-1.2
2d50: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
2d60: 42 4c 45 20 78 78 28 78 2c 20 79 29 3b 0a 20 20  BLE xx(x, y);.  
2d70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20 56  INSERT INTO xx V
2d80: 41 4c 55 45 53 28 27 49 69 4a 6c 73 49 50 65 70  ALUES('IiJlsIPep
2d90: 4d 75 41 68 55 27 2c 20 58 27 31 30 42 30 30 42  MuAhU', X'10B00B
2da0: 38 39 37 41 31 35 42 41 41 30 32 45 33 46 39 38  897A15BAA02E3F98
2db0: 44 43 45 38 46 32 27 29 3b 0a 20 20 49 4e 53 45  DCE8F2');.  INSE
2dc0: 52 54 20 49 4e 54 4f 20 78 78 20 56 41 4c 55 45  RT INTO xx VALUE
2dd0: 53 28 4e 55 4c 4c 2c 20 2d 31 36 2e 38 37 29 3b  S(NULL, -16.87);
2de0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
2df0: 78 20 56 41 4c 55 45 53 28 2d 31 37 2e 38 39 2c  x VALUES(-17.89,
2e00: 20 27 6c 69 6e 67 75 69 73 74 69 63 61 6c 6c 79   'linguistically
2e10: 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65  ');.} {}.do_sele
2e20: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
2e30: 74 2d 31 2e 32 20 7b 0a 20 20 31 20 20 22 53 45  t-1.2 {.  1  "SE
2e40: 4c 45 43 54 20 71 75 6f 74 65 28 78 29 2c 20 71  LECT quote(x), q
2e50: 75 6f 74 65 28 79 29 20 46 52 4f 4d 20 78 78 22  uote(y) FROM xx"
2e60: 20 7b 0a 20 20 20 20 20 27 49 69 4a 6c 73 49 50   {.     'IiJlsIP
2e70: 65 70 4d 75 41 68 55 27 20 58 27 31 30 42 30 30  epMuAhU' X'10B00
2e80: 42 38 39 37 41 31 35 42 41 41 30 32 45 33 46 39  B897A15BAA02E3F9
2e90: 38 44 43 45 38 46 32 27 20 0a 20 20 20 20 20 4e  8DCE8F2' .     N
2ea0: 55 4c 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  ULL             
2eb0: 2d 31 36 2e 38 37 20 20 20 20 20 20 20 20 20 20  -16.87          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 0a 20 20 20 20 20 2d 31 37 2e 38 39 20 20 20 20  .     -17.89    
2ee0: 20 20 20 20 20 20 20 27 6c 69 6e 67 75 69 73 74         'linguist
2ef0: 69 63 61 6c 6c 79 27 20 20 20 20 20 20 20 20 20  ically'         
2f00: 20 20 20 20 20 20 20 0a 20 20 7d 0a 0a 20 20 32         .  }..  2
2f10: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
2f20: 2a 29 2c 20 63 6f 75 6e 74 28 78 29 2c 20 63 6f  *), count(x), co
2f30: 75 6e 74 28 79 29 20 46 52 4f 4d 20 78 78 22 20  unt(y) FROM xx" 
2f40: 7b 33 20 32 20 33 7d 0a 20 20 33 20 20 22 53 45  {3 2 3}.  3  "SE
2f50: 4c 45 43 54 20 73 75 6d 28 78 29 2c 20 73 75 6d  LECT sum(x), sum
2f60: 28 79 29 20 46 52 4f 4d 20 78 78 22 20 20 20 20  (y) FROM xx"    
2f70: 20 20 20 20 20 20 20 20 20 20 20 7b 2d 31 37 2e             {-17.
2f80: 38 39 20 2d 31 36 2e 38 37 7d 0a 7d 0a 0a 23 20  89 -16.87}.}..# 
2f90: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2fa0: 38 33 35 35 2d 30 39 38 30 34 20 49 66 20 74 68  8355-09804 If th
2fb0: 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
2fc0: 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
2fd0: 62 71 75 65 72 79 0a 23 20 69 6e 20 46 52 4f 4d  bquery.# in FROM
2fe0: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
2ff0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c   contents of all
3000: 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 73   tables and/or s
3010: 75 62 71 75 65 72 69 65 73 20 61 72 65 0a 23 20  ubqueries are.# 
3020: 6a 6f 69 6e 65 64 20 69 6e 74 6f 20 61 20 73 69  joined into a si
3030: 6e 67 6c 65 20 64 61 74 61 73 65 74 20 66 6f 72  ngle dataset for
3040: 20 74 68 65 20 73 69 6d 70 6c 65 20 53 45 4c 45   the simple SELE
3050: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 0a  CT statement to.
3060: 23 20 6f 70 65 72 61 74 65 20 6f 6e 2e 0a 23 0a  # operate on..#.
3070: 23 20 20 20 54 68 65 72 65 20 61 72 65 20 6d 6f  #   There are mo
3080: 72 65 20 64 65 74 61 69 6c 65 64 20 74 65 73 74  re detailed test
3090: 73 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  s for subsequent
30a0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 68   requirements th
30b0: 61 74 20 61 64 64 20 0a 23 20 20 20 6d 6f 72 65  at add .#   more
30c0: 20 64 65 74 61 69 6c 20 74 6f 20 74 68 69 73 20   detail to this 
30d0: 69 64 65 61 2e 20 57 65 20 6a 75 73 74 20 61 64  idea. We just ad
30e0: 64 20 61 20 73 69 6e 67 6c 65 20 74 65 73 74 20  d a single test 
30f0: 74 68 61 74 20 73 68 6f 77 73 20 74 68 61 74 0a  that shows that.
3100: 23 20 20 20 64 61 74 61 20 69 73 20 63 6f 6d 69  #   data is comi
3110: 6e 67 20 66 72 6f 6d 20 65 61 63 68 20 6f 66 20  ng from each of 
3120: 74 68 65 20 74 68 72 65 65 20 74 61 62 6c 65 73  the three tables
3130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 46   following the F
3140: 52 4f 4d 20 63 6c 61 75 73 65 0a 23 20 20 20 68  ROM clause.#   h
3150: 65 72 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ere to show that
3160: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
3170: 76 61 67 75 65 20 61 73 20 69 74 20 69 73 2c 20  vague as it is, 
3180: 69 73 20 6e 6f 74 20 69 6e 63 6f 72 72 65 63 74  is not incorrect
3190: 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
31a0: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 33  sts e_select-1.3
31b0: 20 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 2a   {.  1 "SELECT *
31c0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
31d0: 22 20 7b 0a 20 20 20 20 20 20 61 20 6f 6e 65 20  " {.      a one 
31e0: 61 20 49 20 61 20 31 20 61 20 6f 6e 65 20 61 20  a I a 1 a one a 
31f0: 49 20 62 20 32 20 61 20 6f 6e 65 20 62 20 49 49  I b 2 a one b II
3200: 20 61 20 31 20 0a 20 20 20 20 20 20 61 20 6f 6e   a 1 .      a on
3210: 65 20 62 20 49 49 20 62 20 32 20 61 20 6f 6e 65  e b II b 2 a one
3220: 20 63 20 49 49 49 20 61 20 31 20 61 20 6f 6e 65   c III a 1 a one
3230: 20 63 20 49 49 49 20 62 20 32 20 0a 20 20 20 20   c III b 2 .    
3240: 20 20 62 20 74 77 6f 20 61 20 49 20 61 20 31 20    b two a I a 1 
3250: 62 20 74 77 6f 20 61 20 49 20 62 20 32 20 62 20  b two a I b 2 b 
3260: 74 77 6f 20 62 20 49 49 20 61 20 31 20 0a 20 20  two b II a 1 .  
3270: 20 20 20 20 62 20 74 77 6f 20 62 20 49 49 20 62      b two b II b
3280: 20 32 20 62 20 74 77 6f 20 63 20 49 49 49 20 61   2 b two c III a
3290: 20 31 20 62 20 74 77 6f 20 63 20 49 49 49 20 62   1 b two c III b
32a0: 20 32 20 0a 20 20 20 20 20 20 63 20 74 68 72 65   2 .      c thre
32b0: 65 20 61 20 49 20 61 20 31 20 63 20 74 68 72 65  e a I a 1 c thre
32c0: 65 20 61 20 49 20 62 20 32 20 63 20 74 68 72 65  e a I b 2 c thre
32d0: 65 20 62 20 49 49 20 61 20 31 20 0a 20 20 20 20  e b II a 1 .    
32e0: 20 20 63 20 74 68 72 65 65 20 62 20 49 49 20 62    c three b II b
32f0: 20 32 20 63 20 74 68 72 65 65 20 63 20 49 49 49   2 c three c III
3300: 20 61 20 31 20 63 20 74 68 72 65 65 20 63 20 49   a 1 c three c I
3310: 49 49 20 62 20 32 0a 20 20 7d 0a 7d 0a 0a 23 0a  II b 2.  }.}..#.
3320: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
3330: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
3340: 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 2a 20   e_select-1.4.* 
3350: 2d 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  - test that the 
3360: 64 65 73 63 72 69 70 74 69 6f 6e 0a 23 20 6f 66  description.# of
3370: 20 63 61 72 74 65 73 69 61 6e 20 6a 6f 69 6e 73   cartesian joins
3380: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 64   in the SELECT d
3390: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ocumentation is 
33a0: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
33b0: 53 51 4c 69 74 65 2e 0a 23 20 49 6e 20 64 6f 69  SQLite..# In doi
33c0: 6e 67 20 73 6f 2c 20 77 65 20 74 65 73 74 20 74  ng so, we test t
33d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
33e0: 65 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ee requirements 
33f0: 61 73 20 61 20 73 69 64 65 2d 65 66 66 65 63 74  as a side-effect
3400: 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  :.#.# EVIDENCE-O
3410: 46 3a 20 52 2d 34 39 38 37 32 2d 30 33 31 39 32  F: R-49872-03192
3420: 20 49 66 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 65   If the join-ope
3430: 72 61 74 6f 72 20 69 73 20 22 43 52 4f 53 53 20  rator is "CROSS 
3440: 4a 4f 49 4e 22 2c 0a 23 20 22 49 4e 4e 45 52 20  JOIN",.# "INNER 
3450: 4a 4f 49 4e 22 2c 20 22 4a 4f 49 4e 22 20 6f 72  JOIN", "JOIN" or
3460: 20 61 20 63 6f 6d 6d 61 20 28 22 2c 22 29 20 61   a comma (",") a
3470: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  nd there is no O
3480: 4e 20 6f 72 20 55 53 49 4e 47 0a 23 20 63 6c 61  N or USING.# cla
3490: 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  use, then the re
34a0: 73 75 6c 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  sult of the join
34b0: 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 63   is simply the c
34c0: 61 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74  artesian product
34d0: 20 6f 66 0a 23 20 74 68 65 20 6c 65 66 74 20 61   of.# the left a
34e0: 6e 64 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61  nd right-hand da
34f0: 74 61 73 65 74 73 2e 0a 23 0a 23 20 20 20 20 54  tasets..#.#    T
3500: 68 65 20 74 65 73 74 73 20 61 72 65 20 62 75 69  he tests are bui
3510: 6c 74 20 6f 6e 20 74 68 69 73 20 61 73 73 65 72  lt on this asser
3520: 74 69 6f 6e 2e 20 52 65 61 6c 6c 79 2c 20 74 68  tion. Really, th
3530: 65 79 20 74 65 73 74 20 74 68 61 74 20 74 68 65  ey test that the
3540: 20 6f 75 74 70 75 74 0a 23 20 20 20 20 6f 66 20   output.#    of 
3550: 61 20 43 52 4f 53 53 20 4a 4f 49 4e 2c 20 4a 4f  a CROSS JOIN, JO
3560: 49 4e 2c 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 6f  IN, INNER JOIN o
3570: 72 20 22 2c 22 20 6a 6f 69 6e 20 6d 61 74 63 68  r "," join match
3580: 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
3590: 72 65 73 75 6c 74 0a 23 20 20 20 20 6f 66 20 63  result.#    of c
35a0: 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
35b0: 61 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74  artesian product
35c0: 20 6f 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64   of the left and
35d0: 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61 74 61   right-hand data
35e0: 73 65 74 73 2e 20 0a 23 0a 23 20 45 56 49 44 45  sets. .#.# EVIDE
35f0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 32 35 36 2d  NCE-OF: R-46256-
3600: 35 37 32 34 33 20 54 68 65 72 65 20 69 73 20 6e  57243 There is n
3610: 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  o difference bet
3620: 77 65 65 6e 20 74 68 65 20 22 49 4e 4e 45 52 0a  ween the "INNER.
3630: 23 20 4a 4f 49 4e 22 2c 20 22 4a 4f 49 4e 22 20  # JOIN", "JOIN" 
3640: 61 6e 64 20 22 2c 22 20 6a 6f 69 6e 20 6f 70 65  and "," join ope
3650: 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44  rators..#.# EVID
3660: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 37 31  ENCE-OF: R-25071
3670: 2d 32 31 32 30 32 20 54 68 65 20 22 43 52 4f 53  -21202 The "CROS
3680: 53 20 4a 4f 49 4e 22 20 6a 6f 69 6e 20 6f 70 65  S JOIN" join ope
3690: 72 61 74 6f 72 20 70 72 6f 64 75 63 65 73 20 74  rator produces t
36a0: 68 65 0a 23 20 73 61 6d 65 20 72 65 73 75 6c 74  he.# same result
36b0: 20 61 73 20 74 68 65 20 22 49 4e 4e 45 52 20 4a   as the "INNER J
36c0: 4f 49 4e 22 2c 20 22 4a 4f 49 4e 22 20 61 6e 64  OIN", "JOIN" and
36d0: 20 22 2c 22 20 6f 70 65 72 61 74 6f 72 73 0a 23   "," operators.#
36e0: 0a 23 20 20 20 20 41 6c 6c 20 74 65 73 74 73 20  .#    All tests 
36f0: 61 72 65 20 72 75 6e 20 34 20 74 69 6d 65 73 2c  are run 4 times,
3700: 20 77 69 74 68 20 74 68 65 20 6f 6e 6c 79 20 64   with the only d
3710: 69 66 66 65 72 65 6e 63 65 20 69 6e 20 65 61 63  ifference in eac
3720: 68 20 72 75 6e 20 62 65 69 6e 67 0a 23 20 20 20  h run being.#   
3730: 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 34 20   which of the 4 
3740: 65 71 75 69 76 61 6c 65 6e 74 20 63 61 72 74 65  equivalent carte
3750: 73 69 61 6e 20 70 72 6f 64 75 63 74 20 6a 6f 69  sian product joi
3760: 6e 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  n operators are 
3770: 75 73 65 64 2e 0a 23 20 20 20 20 53 69 6e 63 65  used..#    Since
3780: 20 74 68 65 20 6f 75 74 70 75 74 20 64 61 74 61   the output data
3790: 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
37a0: 61 6c 6c 20 63 61 73 65 73 2c 20 77 65 20 63 6f  all cases, we co
37b0: 6e 73 69 64 65 72 20 74 68 61 74 20 74 68 69 73  nsider that this
37c0: 0a 23 20 20 20 20 71 75 61 6c 69 66 69 65 73 20  .#    qualifies 
37d0: 61 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 74  as testing the t
37e0: 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62  wo statements ab
37f0: 6f 76 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ove..#.do_execsq
3800: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
3810: 31 2e 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  1.4.0 {.  CREATE
3820: 20 54 41 42 4c 45 20 78 31 28 61 2c 20 62 29 3b   TABLE x1(a, b);
3830: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
3840: 78 32 28 63 2c 20 64 2c 20 65 29 3b 0a 20 20 43  x2(c, d, e);.  C
3850: 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 66  REATE TABLE x3(f
3860: 2c 20 67 2c 20 68 2c 20 69 29 3b 0a 0a 20 20 2d  , g, h, i);..  -
3870: 2d 20 78 31 3a 20 33 20 72 6f 77 73 2c 20 32 20  - x1: 3 rows, 2 
3880: 63 6f 6c 75 6d 6e 73 0a 20 20 49 4e 53 45 52 54  columns.  INSERT
3890: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
38a0: 32 34 2c 20 27 63 6f 6e 76 65 72 67 69 6e 67 27  24, 'converging'
38b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
38c0: 20 78 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   x1 VALUES(NULL,
38d0: 20 58 27 43 42 37 31 27 29 3b 0a 20 20 49 4e 53   X'CB71');.  INS
38e0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
38f0: 45 53 28 27 62 6c 6f 6e 64 73 27 2c 20 27 70 72  ES('blonds', 'pr
3900: 6f 70 72 69 65 74 61 72 79 27 29 3b 0a 0a 20 20  oprietary');..  
3910: 2d 2d 20 78 32 3a 20 32 20 72 6f 77 73 2c 20 33  -- x2: 2 rows, 3
3920: 20 63 6f 6c 75 6d 6e 73 0a 20 20 49 4e 53 45 52   columns.  INSER
3930: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
3940: 28 2d 36 30 2e 30 36 2c 20 4e 55 4c 4c 2c 20 4e  (-60.06, NULL, N
3950: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
3960: 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 2d 35  NTO x2 VALUES(-5
3970: 38 2c 20 4e 55 4c 4c 2c 20 31 2e 32 31 29 3b 0a  8, NULL, 1.21);.
3980: 0a 20 20 2d 2d 20 78 33 3a 20 35 20 72 6f 77 73  .  -- x3: 5 rows
3990: 2c 20 34 20 63 6f 6c 75 6d 6e 73 0a 20 20 49 4e  , 4 columns.  IN
39a0: 53 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c  SERT INTO x3 VAL
39b0: 55 45 53 28 2d 33 39 2e 32 34 2c 20 4e 55 4c 4c  UES(-39.24, NULL
39c0: 2c 20 27 65 6e 63 6f 6d 70 61 73 73 27 2c 20 2d  , 'encompass', -
39d0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
39e0: 4f 20 78 33 20 56 41 4c 55 45 53 28 27 70 72 65  O x3 VALUES('pre
39f0: 73 65 6e 74 69 6e 67 27 2c 20 35 31 2c 20 27 72  senting', 51, 'r
3a00: 65 66 6f 72 6d 61 74 69 6f 6e 27 2c 20 27 64 69  eformation', 'di
3a10: 67 6e 69 66 69 65 64 27 29 3b 0a 20 20 49 4e 53  gnified');.  INS
3a20: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
3a30: 45 53 28 27 63 6f 6e 64 75 63 74 69 6e 67 27 2c  ES('conducting',
3a40: 20 2d 38 37 2e 32 34 2c 20 33 37 2e 35 36 2c 20   -87.24, 37.56, 
3a50: 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20  NULL);.  INSERT 
3a60: 49 4e 54 4f 20 78 33 20 56 41 4c 55 45 53 28 27  INTO x3 VALUES('
3a70: 63 6f 6c 64 65 73 74 27 2c 20 2d 39 36 2c 20 27  coldest', -96, '
3a80: 64 72 61 6d 61 74 69 73 74 73 27 2c 20 38 32 2e  dramatists', 82.
3a90: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
3aa0: 4f 20 78 33 20 56 41 4c 55 45 53 28 27 61 6c 65  O x3 VALUES('ale
3ab0: 72 74 69 6e 67 27 2c 20 4e 55 4c 4c 2c 20 2d 39  rting', NULL, -9
3ac0: 33 2e 37 39 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b  3.79, NULL);.} {
3ad0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
3ae0: 3a 20 52 2d 35 39 30 38 39 2d 32 35 38 32 38 20  : R-59089-25828 
3af0: 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  The columns of t
3b00: 68 65 20 63 61 72 74 65 73 69 61 6e 20 70 72 6f  he cartesian pro
3b10: 64 75 63 74 0a 23 20 64 61 74 61 73 65 74 20 61  duct.# dataset a
3b20: 72 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 61 6c  re, in order, al
3b30: 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  l the columns of
3b40: 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 64   the left-hand d
3b50: 61 74 61 73 65 74 0a 23 20 66 6f 6c 6c 6f 77 65  ataset.# followe
3b60: 64 20 62 79 20 61 6c 6c 20 74 68 65 20 63 6f 6c  d by all the col
3b70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 69 67 68  umns of the righ
3b80: 74 2d 68 61 6e 64 20 64 61 74 61 73 65 74 2e 0a  t-hand dataset..
3b90: 23 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65  #.do_join_test e
3ba0: 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 31 20  _select-1.4.1.1 
3bb0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3bc0: 4d 20 78 31 20 25 4a 4f 49 4e 25 20 78 32 20 4c  M x1 %JOIN% x2 L
3bd0: 49 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74  IMIT 1.} [concat
3be0: 20 7b 32 34 20 63 6f 6e 76 65 72 67 69 6e 67 7d   {24 converging}
3bf0: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 5d   {-60.06 {} {}}]
3c00: 0a 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65  ..do_join_test e
3c10: 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 32 20  _select-1.4.1.2 
3c20: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3c30: 4d 20 78 32 20 25 4a 4f 49 4e 25 20 78 31 20 4c  M x2 %JOIN% x1 L
3c40: 49 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74  IMIT 1.} [concat
3c50: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 20   {-60.06 {} {}} 
3c60: 7b 32 34 20 63 6f 6e 76 65 72 67 69 6e 67 7d 5d  {24 converging}]
3c70: 0a 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65  ..do_join_test e
3c80: 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 33 20  _select-1.4.1.3 
3c90: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3ca0: 4d 20 78 33 20 25 4a 4f 49 4e 25 20 78 32 20 4c  M x3 %JOIN% x2 L
3cb0: 49 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74  IMIT 1.} [concat
3cc0: 20 7b 2d 33 39 2e 32 34 20 7b 7d 20 65 6e 63 6f   {-39.24 {} enco
3cd0: 6d 70 61 73 73 20 2d 31 7d 20 7b 2d 36 30 2e 30  mpass -1} {-60.0
3ce0: 36 20 7b 7d 20 7b 7d 7d 5d 0a 0a 64 6f 5f 6a 6f  6 {} {}}]..do_jo
3cf0: 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  in_test e_select
3d00: 2d 31 2e 34 2e 31 2e 34 20 7b 0a 20 20 53 45 4c  -1.4.1.4 {.  SEL
3d10: 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 25 4a  ECT * FROM x2 %J
3d20: 4f 49 4e 25 20 78 33 20 4c 49 4d 49 54 20 31 0a  OIN% x3 LIMIT 1.
3d30: 7d 20 5b 63 6f 6e 63 61 74 20 7b 2d 36 30 2e 30  } [concat {-60.0
3d40: 36 20 7b 7d 20 7b 7d 7d 20 7b 2d 33 39 2e 32 34  6 {} {}} {-39.24
3d50: 20 7b 7d 20 65 6e 63 6f 6d 70 61 73 73 20 2d 31   {} encompass -1
3d60: 7d 5d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  }]..# EVIDENCE-O
3d70: 46 3a 20 52 2d 34 34 34 31 34 2d 35 34 37 31 30  F: R-44414-54710
3d80: 20 54 68 65 72 65 20 69 73 20 61 20 72 6f 77 20   There is a row 
3d90: 69 6e 20 74 68 65 20 63 61 72 74 65 73 69 61 6e  in the cartesian
3da0: 20 70 72 6f 64 75 63 74 0a 23 20 64 61 74 61 73   product.# datas
3db0: 65 74 20 66 6f 72 6d 65 64 20 62 79 20 63 6f 6d  et formed by com
3dc0: 62 69 6e 69 6e 67 20 65 61 63 68 20 75 6e 69 71  bining each uniq
3dd0: 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ue combination o
3de0: 66 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 68 65  f a row from the
3df0: 0a 23 20 6c 65 66 74 2d 68 61 6e 64 20 61 6e 64  .# left-hand and
3e00: 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61 74 61   right-hand data
3e10: 73 65 74 73 2e 0a 23 0a 64 6f 5f 6a 6f 69 6e 5f  sets..#.do_join_
3e20: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e  test e_select-1.
3e30: 34 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  4.2.1 {.  SELECT
3e40: 20 2a 20 46 52 4f 4d 20 78 32 20 25 4a 4f 49 4e   * FROM x2 %JOIN
3e50: 25 20 78 33 20 4f 52 44 45 52 20 42 59 20 2b 63  % x3 ORDER BY +c
3e60: 2c 20 2b 66 0a 7d 20 5b 6c 69 73 74 20 2d 36 30  , +f.} [list -60
3e70: 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20 20 20 2d  .06 {} {}      -
3e80: 33 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d 70 61  39.24 {} encompa
3e90: 73 73 20 2d 31 20 20 20 20 20 20 20 20 20 20 20  ss -1           
3ea0: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
3eb0: 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20  -60.06 {} {}    
3ec0: 20 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39    alerting {} -9
3ed0: 33 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20  3.79 {}         
3ee0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
3ef0: 20 20 20 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 20     -60.06 {} {} 
3f00: 20 20 20 20 20 63 6f 6c 64 65 73 74 20 2d 39 36       coldest -96
3f10: 20 64 72 61 6d 61 74 69 73 74 73 20 38 32 2e 33   dramatists 82.3
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3f30: 20 20 20 20 20 20 2d 36 30 2e 30 36 20 7b 7d 20        -60.06 {} 
3f40: 7b 7d 20 20 20 20 20 20 63 6f 6e 64 75 63 74 69  {}      conducti
3f50: 6e 67 20 2d 38 37 2e 32 34 20 33 37 2e 35 36 20  ng -87.24 37.56 
3f60: 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  {}             \
3f70: 0a 20 20 20 20 20 20 20 20 2d 36 30 2e 30 36 20  .        -60.06 
3f80: 7b 7d 20 7b 7d 20 20 20 20 20 20 70 72 65 73 65  {} {}      prese
3f90: 6e 74 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61  nting 51 reforma
3fa0: 74 69 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20  tion dignified  
3fb0: 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 35 38 20    \.        -58 
3fc0: 7b 7d 20 31 2e 32 31 20 20 20 20 20 20 20 2d 33  {} 1.21       -3
3fd0: 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d 70 61 73  9.24 {} encompas
3fe0: 73 20 2d 31 20 20 20 20 20 20 20 20 20 20 20 20  s -1            
3ff0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d       \.        -
4000: 35 38 20 7b 7d 20 31 2e 32 31 20 20 20 20 20 20  58 {} 1.21      
4010: 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39 33   alerting {} -93
4020: 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .79 {}          
4030: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
4040: 20 20 2d 35 38 20 7b 7d 20 31 2e 32 31 20 20 20    -58 {} 1.21   
4050: 20 20 20 20 63 6f 6c 64 65 73 74 20 2d 39 36 20      coldest -96 
4060: 64 72 61 6d 61 74 69 73 74 73 20 38 32 2e 33 20  dramatists 82.3 
4070: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
4080: 20 20 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32 31       -58 {} 1.21
4090: 20 20 20 20 20 20 20 63 6f 6e 64 75 63 74 69 6e         conductin
40a0: 67 20 2d 38 37 2e 32 34 20 33 37 2e 35 36 20 7b  g -87.24 37.56 {
40b0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  }             \.
40c0: 20 20 20 20 20 20 20 20 2d 35 38 20 7b 7d 20 31          -58 {} 1
40d0: 2e 32 31 20 20 20 20 20 20 20 70 72 65 73 65 6e  .21       presen
40e0: 74 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74  ting 51 reformat
40f0: 69 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20  ion dignified   
4100: 20 5c 0a 5d 0a 23 20 54 4f 44 4f 3a 20 43 6f 6d   \.].# TODO: Com
4110: 65 20 62 61 63 6b 20 61 6e 64 20 61 64 64 20 61  e back and add a
4120: 20 66 65 77 20 6d 6f 72 65 20 6c 69 6b 65 20 74   few more like t
4130: 68 65 20 61 62 6f 76 65 2e 0a 0a 23 20 45 56 49  he above...# EVI
4140: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 34 33  DENCE-OF: R-1843
4150: 39 2d 33 38 35 34 38 20 49 6e 20 6f 74 68 65 72  9-38548 In other
4160: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 6c   words, if the l
4170: 65 66 74 2d 68 61 6e 64 20 64 61 74 61 73 65 74  eft-hand dataset
4180: 0a 23 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 4e  .# consists of N
4190: 6c 65 66 74 20 72 6f 77 73 20 6f 66 20 4d 6c 65  left rows of Mle
41a0: 66 74 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64 20  ft columns, and 
41b0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 64  the right-hand d
41c0: 61 74 61 73 65 74 20 6f 66 0a 23 20 4e 72 69 67  ataset of.# Nrig
41d0: 68 74 20 72 6f 77 73 20 6f 66 20 4d 72 69 67 68  ht rows of Mrigh
41e0: 74 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  t columns, then 
41f0: 74 68 65 20 63 61 72 74 65 73 69 61 6e 20 70 72  the cartesian pr
4200: 6f 64 75 63 74 20 69 73 20 61 20 64 61 74 61 73  oduct is a datas
4210: 65 74 0a 23 20 6f 66 20 4e 6c 65 66 74 26 74 69  et.# of Nleft&ti
4220: 6d 65 73 3b 4e 72 69 67 68 74 20 72 6f 77 73 2c  mes;Nright rows,
4230: 20 65 61 63 68 20 63 6f 6e 74 61 69 6e 69 6e 67   each containing
4240: 20 4d 6c 65 66 74 2b 4d 72 69 67 68 74 20 63 6f   Mleft+Mright co
4250: 6c 75 6d 6e 73 2e 0a 23 0a 23 20 78 31 2c 20 78  lumns..#.# x1, x
4260: 32 20 20 20 20 28 4e 6c 68 73 3d 33 2c 20 4e 72  2    (Nlhs=3, Nr
4270: 68 73 3d 32 29 20 20 20 28 4d 6c 68 73 3d 32 2c  hs=2)   (Mlhs=2,
4280: 20 4d 72 68 73 3d 33 29 0a 64 6f 5f 6a 6f 69 6e   Mrhs=3).do_join
4290: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
42a0: 2e 34 2e 33 2e 31 20 7b 20 0a 20 20 53 45 4c 45  .4.3.1 { .  SELE
42b0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
42c0: 20 78 31 20 25 4a 4f 49 4e 25 20 78 32 20 0a 7d   x1 %JOIN% x2 .}
42d0: 20 5b 65 78 70 72 20 33 2a 32 5d 0a 64 6f 5f 74   [expr 3*2].do_t
42e0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  est e_select-1.4
42f0: 2e 33 2e 32 20 7b 20 0a 20 20 65 78 70 72 20 7b  .3.2 { .  expr {
4300: 5b 6c 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71  [llength [execsq
4310: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
4320: 20 78 31 2c 20 78 32 7d 5d 5d 20 2f 20 36 7d 0a   x1, x2}]] / 6}.
4330: 7d 20 5b 65 78 70 72 20 32 2b 33 5d 0a 0a 23 20  } [expr 2+3]..# 
4340: 78 32 2c 20 78 33 20 20 20 20 28 4e 6c 68 73 3d  x2, x3    (Nlhs=
4350: 32 2c 20 4e 72 68 73 3d 35 29 20 20 20 28 4d 6c  2, Nrhs=5)   (Ml
4360: 68 73 3d 33 2c 20 4d 72 68 73 3d 34 29 0a 64 6f  hs=3, Mrhs=4).do
4370: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
4380: 65 63 74 2d 31 2e 34 2e 33 2e 33 20 7b 20 0a 20  ect-1.4.3.3 { . 
4390: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
43a0: 20 46 52 4f 4d 20 78 32 20 25 4a 4f 49 4e 25 20   FROM x2 %JOIN% 
43b0: 78 33 20 0a 7d 20 5b 65 78 70 72 20 32 2a 35 5d  x3 .} [expr 2*5]
43c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  .do_test e_selec
43d0: 74 2d 31 2e 34 2e 33 2e 34 20 7b 20 0a 20 20 65  t-1.4.3.4 { .  e
43e0: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65  xpr {[llength [e
43f0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
4400: 20 46 52 4f 4d 20 78 32 20 4a 4f 49 4e 20 78 33   FROM x2 JOIN x3
4410: 7d 5d 5d 20 2f 20 31 30 7d 0a 7d 20 5b 65 78 70  }]] / 10}.} [exp
4420: 72 20 33 2b 34 5d 0a 0a 23 20 78 33 2c 20 78 31  r 3+4]..# x3, x1
4430: 20 20 20 20 28 4e 6c 68 73 3d 35 2c 20 4e 72 68      (Nlhs=5, Nrh
4440: 73 3d 33 29 20 20 20 28 4d 6c 68 73 3d 34 2c 20  s=3)   (Mlhs=4, 
4450: 4d 72 68 73 3d 32 29 0a 64 6f 5f 6a 6f 69 6e 5f  Mrhs=2).do_join_
4460: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e  test e_select-1.
4470: 34 2e 33 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43  4.3.5 { .  SELEC
4480: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
4490: 78 33 20 25 4a 4f 49 4e 25 20 78 31 20 0a 7d 20  x3 %JOIN% x1 .} 
44a0: 5b 65 78 70 72 20 35 2a 33 5d 0a 64 6f 5f 74 65  [expr 5*3].do_te
44b0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e  st e_select-1.4.
44c0: 33 2e 36 20 7b 20 0a 20 20 65 78 70 72 20 7b 5b  3.6 { .  expr {[
44d0: 6c 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71 6c  llength [execsql
44e0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
44f0: 78 33 20 43 52 4f 53 53 20 4a 4f 49 4e 20 78 31  x3 CROSS JOIN x1
4500: 7d 5d 5d 20 2f 20 31 35 7d 0a 7d 20 5b 65 78 70  }]] / 15}.} [exp
4510: 72 20 34 2b 32 5d 0a 0a 23 20 78 33 2c 20 78 33  r 4+2]..# x3, x3
4520: 20 20 20 20 28 4e 6c 68 73 3d 35 2c 20 4e 72 68      (Nlhs=5, Nrh
4530: 73 3d 35 29 20 20 20 28 4d 6c 68 73 3d 34 2c 20  s=5)   (Mlhs=4, 
4540: 4d 72 68 73 3d 34 29 0a 64 6f 5f 6a 6f 69 6e 5f  Mrhs=4).do_join_
4550: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e  test e_select-1.
4560: 34 2e 33 2e 37 20 7b 20 0a 20 20 53 45 4c 45 43  4.3.7 { .  SELEC
4570: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
4580: 78 33 20 25 4a 4f 49 4e 25 20 78 33 20 0a 7d 20  x3 %JOIN% x3 .} 
4590: 5b 65 78 70 72 20 35 2a 35 5d 0a 64 6f 5f 74 65  [expr 5*5].do_te
45a0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e  st e_select-1.4.
45b0: 33 2e 38 20 7b 20 0a 20 20 65 78 70 72 20 7b 5b  3.8 { .  expr {[
45c0: 6c 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71 6c  llength [execsql
45d0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
45e0: 78 33 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 78 33  x3 INNER JOIN x3
45f0: 20 41 53 20 78 34 7d 5d 5d 20 2f 20 32 35 7d 0a   AS x4}]] / 25}.
4600: 7d 20 5b 65 78 70 72 20 34 2b 34 5d 0a 0a 23 20  } [expr 4+4]..# 
4610: 53 6f 6d 65 20 65 78 74 72 61 20 63 61 72 74 65  Some extra carte
4620: 73 69 61 6e 20 70 72 6f 64 75 63 74 20 74 65 73  sian product tes
4630: 74 73 20 75 73 69 6e 67 20 74 61 62 6c 65 73 20  ts using tables 
4640: 74 31 20 61 6e 64 20 74 32 2e 0a 23 0a 64 6f 5f  t1 and t2..#.do_
4650: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
4660: 65 6c 65 63 74 2d 31 2e 34 2e 34 2e 31 20 7b 20  elect-1.4.4.1 { 
4670: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4680: 2c 20 74 32 20 7d 20 24 74 31 5f 63 72 6f 73 73  , t2 } $t1_cross
4690: 5f 74 32 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  _t2.do_execsql_t
46a0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  est e_select-1.4
46b0: 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  .4.2 { SELECT * 
46c0: 46 52 4f 4d 20 74 31 20 41 53 20 78 2c 20 74 31  FROM t1 AS x, t1
46d0: 20 41 53 20 79 7d 20 24 74 31 5f 63 72 6f 73 73   AS y} $t1_cross
46e0: 5f 74 31 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  _t1..do_select_t
46f0: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e  ests e_select-1.
4700: 34 2e 35 20 5b 6c 69 73 74 20 20 20 20 20 20 20  4.5 [list       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4730: 20 20 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    1 { SELECT * F
4740: 52 4f 4d 20 74 31 20 43 52 4f 53 53 20 4a 4f 49  ROM t1 CROSS JOI
4750: 4e 20 74 32 20 7d 20 20 20 20 20 20 20 20 20 20  N t2 }          
4760: 20 24 74 31 5f 63 72 6f 73 73 5f 74 32 20 20 20   $t1_cross_t2   
4770: 20 20 20 20 20 5c 0a 20 20 20 20 32 20 7b 20 53       \.    2 { S
4780: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4790: 41 53 20 79 20 43 52 4f 53 53 20 4a 4f 49 4e 20  AS y CROSS JOIN 
47a0: 74 31 20 41 53 20 78 20 7d 20 24 74 31 5f 63 72  t1 AS x } $t1_cr
47b0: 6f 73 73 5f 74 31 20 20 20 20 20 20 20 20 5c 0a  oss_t1        \.
47c0: 20 20 20 20 33 20 7b 20 53 45 4c 45 43 54 20 2a      3 { SELECT *
47d0: 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45 52 20 4a   FROM t1 INNER J
47e0: 4f 49 4e 20 74 32 20 7d 20 20 20 20 20 20 20 20  OIN t2 }        
47f0: 20 20 20 24 74 31 5f 63 72 6f 73 73 5f 74 32 20     $t1_cross_t2 
4800: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 34 20 7b         \.    4 {
4810: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4820: 31 20 41 53 20 79 20 49 4e 4e 45 52 20 4a 4f 49  1 AS y INNER JOI
4830: 4e 20 74 31 20 41 53 20 78 20 7d 20 24 74 31 5f  N t1 AS x } $t1_
4840: 63 72 6f 73 73 5f 74 31 20 20 20 20 20 20 20 20  cross_t1        
4850: 5c 0a 5d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  \.]..# EVIDENCE-
4860: 4f 46 3a 20 52 2d 33 38 34 36 35 2d 30 33 36 31  OF: R-38465-0361
4870: 36 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  6 If there is an
4880: 20 4f 4e 20 63 6c 61 75 73 65 20 74 68 65 6e 20   ON clause then 
4890: 74 68 65 20 4f 4e 0a 23 20 65 78 70 72 65 73 73  the ON.# express
48a0: 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
48b0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
48c0: 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20 70   the cartesian p
48d0: 72 6f 64 75 63 74 20 61 73 20 61 0a 23 20 62 6f  roduct as a.# bo
48e0: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
48f0: 2e 20 4f 6e 6c 79 20 72 6f 77 73 20 66 6f 72 20  . Only rows for 
4900: 77 68 69 63 68 20 74 68 65 20 65 78 70 72 65 73  which the expres
4910: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
4920: 6f 0a 23 20 74 72 75 65 20 61 72 65 20 69 6e 63  o.# true are inc
4930: 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  luded from the d
4940: 61 74 61 73 65 74 2e 0a 23 0a 66 6f 72 65 61 63  ataset..#.foreac
4950: 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65 73  h {tn select res
4960: 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  } [list         
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 20 5c 0a 20 20 20 20 31 20 7b 20 53       \.    1 { S
49a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
49b0: 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 31 29  %JOIN% t2 ON (1)
49c0: 20 7d 20 20 20 20 20 20 20 24 74 31 5f 63 72 6f   }       $t1_cro
49d0: 73 73 5f 74 32 20 20 20 20 20 20 20 20 20 20 20  ss_t2           
49e0: 20 20 5c 0a 20 20 20 20 32 20 7b 20 53 45 4c 45    \.    2 { SELE
49f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f  CT * FROM t1 %JO
4a00: 49 4e 25 20 74 32 20 4f 4e 20 28 30 29 20 7d 20  IN% t2 ON (0) } 
4a10: 20 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20        [list]    
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4a30: 0a 20 20 20 20 33 20 7b 20 53 45 4c 45 43 54 20  .    3 { SELECT 
4a40: 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25  * FROM t1 %JOIN%
4a50: 20 74 32 20 4f 4e 20 28 4e 55 4c 4c 29 20 7d 20   t2 ON (NULL) } 
4a60: 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20 20     [list]       
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4a80: 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    4 { SELECT * F
4a90: 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32  ROM t1 %JOIN% t2
4aa0: 20 4f 4e 20 28 27 61 62 63 27 29 20 7d 20 20 20   ON ('abc') }   
4ab0: 5b 6c 69 73 74 5d 20 20 20 20 20 20 20 20 20 20  [list]          
4ac0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 35           \.    5
4ad0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
4ae0: 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e   t1 %JOIN% t2 ON
4af0: 20 28 27 31 61 62 27 29 20 7d 20 20 20 24 74 31   ('1ab') }   $t1
4b00: 5f 63 72 6f 73 73 5f 74 32 20 20 20 20 20 20 20  _cross_t2       
4b10: 20 20 20 20 20 20 5c 0a 20 20 20 20 36 20 7b 20        \.    6 { 
4b20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4b30: 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 30   %JOIN% t2 ON (0
4b40: 2e 39 29 20 7d 20 20 20 20 20 24 74 31 5f 63 72  .9) }     $t1_cr
4b50: 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20 20 20  oss_t2          
4b60: 20 20 20 5c 0a 20 20 20 20 37 20 7b 20 53 45 4c     \.    7 { SEL
4b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a  ECT * FROM t1 %J
4b80: 4f 49 4e 25 20 74 32 20 4f 4e 20 28 27 30 2e 39  OIN% t2 ON ('0.9
4b90: 27 29 20 7d 20 20 20 24 74 31 5f 63 72 6f 73 73  ') }   $t1_cross
4ba0: 5f 74 32 20 20 20 20 20 20 20 20 20 20 20 20 20  _t2             
4bb0: 5c 0a 20 20 20 20 38 20 7b 20 53 45 4c 45 43 54  \.    8 { SELECT
4bc0: 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e   * FROM t1 %JOIN
4bd0: 25 20 74 32 20 4f 4e 20 28 30 2e 30 29 20 7d 20  % t2 ON (0.0) } 
4be0: 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20      [list]      
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
4c50: 39 20 7b 20 53 45 4c 45 43 54 20 74 31 2e 62 2c  9 { SELECT t1.b,
4c60: 20 74 32 2e 62 20 46 52 4f 4d 20 74 31 20 25 4a   t2.b FROM t1 %J
4c70: 4f 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e 61  OIN% t2 ON (t1.a
4c80: 20 3d 20 74 32 2e 61 29 20 7d 20 20 20 20 20 20   = t2.a) }      
4c90: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b         \.      {
4ca0: 6f 6e 65 20 49 20 74 77 6f 20 49 49 20 74 68 72  one I two II thr
4cb0: 65 65 20 49 49 49 7d 20 20 20 20 20 20 20 20 20  ee III}         
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 5c 0a 20 20 20 31 30 20 7b 20 53 45      \.   10 { SE
4cf0: 4c 45 43 54 20 74 31 2e 62 2c 20 74 32 2e 62 20  LECT t1.b, t2.b 
4d00: 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74  FROM t1 %JOIN% t
4d10: 32 20 4f 4e 20 28 74 31 2e 61 20 3d 20 27 61 27  2 ON (t1.a = 'a'
4d20: 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
4d30: 20 5c 0a 20 20 20 20 20 20 7b 6f 6e 65 20 49 20   \.      {one I 
4d40: 6f 6e 65 20 49 49 20 6f 6e 65 20 49 49 49 7d 20  one II one III} 
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4d80: 20 20 20 31 31 20 7b 20 53 45 4c 45 43 54 20 74     11 { SELECT t
4d90: 31 2e 62 2c 20 74 32 2e 62 20 0a 20 20 20 20 20  1.b, t2.b .     
4da0: 20 20 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e     FROM t1 %JOIN
4db0: 25 20 74 32 20 4f 4e 20 28 43 41 53 45 20 57 48  % t2 ON (CASE WH
4dc0: 45 4e 20 74 31 2e 61 20 3d 20 27 61 27 20 54 48  EN t1.a = 'a' TH
4dd0: 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 31 20 45  EN NULL ELSE 1 E
4de0: 4e 44 29 20 7d 20 5c 0a 20 20 20 20 20 20 7b 74  ND) } \.      {t
4df0: 77 6f 20 49 20 74 77 6f 20 49 49 20 74 77 6f 20  wo I two II two 
4e00: 49 49 49 20 74 68 72 65 65 20 49 20 74 68 72 65  III three I thre
4e10: 65 20 49 49 20 74 68 72 65 65 20 49 49 49 7d 20  e II three III} 
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 6a 6f     \.] {.  do_jo
4e40: 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  in_test e_select
4e50: 2d 31 2e 33 2e 24 74 6e 20 24 73 65 6c 65 63 74  -1.3.$tn $select
4e60: 20 24 72 65 73 0a 7d 0a 0a 23 20 45 56 49 44 45   $res.}..# EVIDE
4e70: 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 33 33 2d  NCE-OF: R-49933-
4e80: 30 35 31 33 37 20 49 66 20 74 68 65 72 65 20 69  05137 If there i
4e90: 73 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  s a USING clause
4ea0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 20 74 68   then each of th
4eb0: 65 0a 23 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  e.# column names
4ec0: 20 73 70 65 63 69 66 69 65 64 20 6d 75 73 74 20   specified must 
4ed0: 65 78 69 73 74 20 69 6e 20 74 68 65 20 64 61 74  exist in the dat
4ee0: 61 73 65 74 73 20 74 6f 20 62 6f 74 68 20 74 68  asets to both th
4ef0: 65 20 6c 65 66 74 20 61 6e 64 0a 23 20 72 69 67  e left and.# rig
4f00: 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2d 6f  ht of the join-o
4f10: 70 65 72 61 74 6f 72 2e 0a 23 0a 64 6f 5f 73 65  perator..#.do_se
4f20: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
4f30: 65 63 74 2d 31 2e 34 20 2d 65 72 72 6f 72 20 7b  ect-1.4 -error {
4f40: 0a 20 20 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  .  cannot join u
4f50: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4f60: 20 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72 65 73   column not pres
4f70: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
4f80: 65 73 0a 7d 20 7b 0a 20 20 31 20 7b 20 53 45 4c  es.} {.  1 { SEL
4f90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
4fa0: 33 20 55 53 49 4e 47 20 28 62 29 20 7d 20 20 20  3 USING (b) }   
4fb0: 22 62 22 0a 20 20 32 20 7b 20 53 45 4c 45 43 54  "b".  2 { SELECT
4fc0: 20 2a 20 46 52 4f 4d 20 74 33 2c 20 74 31 20 55   * FROM t3, t1 U
4fd0: 53 49 4e 47 20 28 63 29 20 7d 20 20 20 22 63 22  SING (c) }   "c"
4fe0: 0a 20 20 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  .  3 { SELECT * 
4ff0: 46 52 4f 4d 20 74 33 2c 20 28 53 45 4c 45 43 54  FROM t3, (SELECT
5000: 20 61 20 41 53 20 62 2c 20 62 20 41 53 20 63 20   a AS b, b AS c 
5010: 46 52 4f 4d 20 74 31 29 20 55 53 49 4e 47 20 28  FROM t1) USING (
5020: 61 29 20 7d 20 20 20 22 61 22 0a 7d 20 0a 0a 23  a) }   "a".} ..#
5030: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5040: 32 32 37 37 36 2d 35 32 38 33 30 20 46 6f 72 20  22776-52830 For 
5050: 65 61 63 68 20 70 61 69 72 20 6f 66 20 6e 61 6d  each pair of nam
5060: 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 0a  ed columns, the.
5070: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 22 6c 68  # expression "lh
5080: 73 2e 58 20 3d 20 72 68 73 2e 58 22 20 69 73 20  s.X = rhs.X" is 
5090: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
50a0: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 63 61  ch row of the ca
50b0: 72 74 65 73 69 61 6e 0a 23 20 70 72 6f 64 75 63  rtesian.# produc
50c0: 74 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 65  t as a boolean e
50d0: 78 70 72 65 73 73 69 6f 6e 2e 20 4f 6e 6c 79 20  xpression. Only 
50e0: 72 6f 77 73 20 66 6f 72 20 77 68 69 63 68 20 61  rows for which a
50f0: 6c 6c 20 73 75 63 68 0a 23 20 65 78 70 72 65 73  ll such.# expres
5100: 73 69 6f 6e 73 20 65 76 61 6c 75 61 74 65 73 20  sions evaluates 
5110: 74 6f 20 74 72 75 65 20 61 72 65 20 69 6e 63 6c  to true are incl
5120: 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  uded from the re
5130: 73 75 6c 74 20 73 65 74 2e 0a 23 0a 64 6f 5f 73  sult set..#.do_s
5140: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
5150: 6c 65 63 74 2d 31 2e 35 20 7b 0a 20 20 31 20 7b  lect-1.5 {.  1 {
5160: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5170: 31 2c 20 74 33 20 55 53 49 4e 47 20 28 61 29 20  1, t3 USING (a) 
5180: 20 20 7d 20 20 7b 61 20 6f 6e 65 20 31 20 62 20    }  {a one 1 b 
5190: 74 77 6f 20 32 7d 0a 20 20 32 20 7b 20 53 45 4c  two 2}.  2 { SEL
51a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c 20 74  ECT * FROM t3, t
51b0: 34 20 55 53 49 4e 47 20 28 61 2c 63 29 20 7d 20  4 USING (a,c) } 
51c0: 20 7b 62 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49   {b 2}.} ..# EVI
51d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 30 34  DENCE-OF: R-5404
51e0: 36 2d 34 38 36 30 30 20 57 68 65 6e 20 63 6f 6d  6-48600 When com
51f0: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 20 61 73  paring values as
5200: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 0a 23   a result of a.#
5210: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74   USING clause, t
5220: 68 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65 73 20  he normal rules 
5230: 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 66 66  for handling aff
5240: 69 6e 69 74 69 65 73 2c 20 63 6f 6c 6c 61 74 69  inities, collati
5250: 6f 6e 0a 23 20 73 65 71 75 65 6e 63 65 73 20 61  on.# sequences a
5260: 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69  nd NULL values i
5270: 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 70  n comparisons ap
5280: 70 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ply..#.# EVIDENC
5290: 45 2d 4f 46 3a 20 52 2d 33 38 34 32 32 2d 30 34  E-OF: R-38422-04
52a0: 34 30 32 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66  402 The column f
52b0: 72 6f 6d 20 74 68 65 20 64 61 74 61 73 65 74 20  rom the dataset 
52c0: 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d 68 61  on the.# left-ha
52d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 6a  nd side of the j
52e0: 6f 69 6e 2d 6f 70 65 72 61 74 6f 72 20 69 73 20  oin-operator is 
52f0: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
5300: 20 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d 68   on the.# left-h
5310: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
5320: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
5330: 74 6f 72 20 28 3d 29 20 66 6f 72 20 74 68 65 20  tor (=) for the 
5340: 70 75 72 70 6f 73 65 73 20 6f 66 0a 23 20 63 6f  purposes of.# co
5350: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5360: 20 61 6e 64 20 61 66 66 69 6e 69 74 79 20 70 72   and affinity pr
5370: 65 63 65 64 65 6e 63 65 2e 0a 23 0a 64 6f 5f 65  ecedence..#.do_e
5380: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
5390: 6c 65 63 74 2d 31 2e 36 2e 30 20 7b 0a 20 20 43  lect-1.6.0 {.  C
53a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
53b0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c   COLLATE nocase,
53c0: 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   b COLLATE binar
53d0: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
53e0: 4f 20 74 35 20 56 41 4c 55 45 53 28 27 41 41 27  O t5 VALUES('AA'
53f0: 2c 20 27 63 63 27 29 3b 0a 20 20 49 4e 53 45 52  , 'cc');.  INSER
5400: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
5410: 28 27 42 42 27 2c 20 27 64 64 27 29 3b 0a 20 20  ('BB', 'dd');.  
5420: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
5430: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ALUES(NULL, NULL
5440: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
5450: 45 20 74 36 28 61 20 43 4f 4c 4c 41 54 45 20 62  E t6(a COLLATE b
5460: 69 6e 61 72 79 2c 20 62 20 43 4f 4c 4c 41 54 45  inary, b COLLATE
5470: 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e 53 45   nocase);.  INSE
5480: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
5490: 53 28 27 61 61 27 2c 20 27 63 63 27 29 3b 0a 20  S('aa', 'cc');. 
54a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
54b0: 56 41 4c 55 45 53 28 27 62 62 27 2c 20 27 44 44  VALUES('bb', 'DD
54c0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
54d0: 4f 20 74 36 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t6 VALUES(NULL
54e0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 7d 0a 66 6f  , NULL);.} {}.fo
54f0: 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74  reach {tn select
5500: 20 72 65 73 7d 20 7b 0a 20 20 31 20 7b 20 53 45   res} {.  1 { SE
5510: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 25  LECT * FROM t5 %
5520: 4a 4f 49 4e 25 20 74 36 20 55 53 49 4e 47 20 28  JOIN% t6 USING (
5530: 61 29 20 7d 20 7b 41 41 20 63 63 20 63 63 20 42  a) } {AA cc cc B
5540: 42 20 64 64 20 44 44 7d 0a 20 20 32 20 7b 20 53  B dd DD}.  2 { S
5550: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20  ELECT * FROM t6 
5560: 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47 20  %JOIN% t5 USING 
5570: 28 61 29 20 7d 20 7b 7d 0a 20 20 33 20 7b 20 53  (a) } {}.  3 { S
5580: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
5590: 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20 6e  LECT a COLLATE n
55a0: 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d 20 74 36  ocase, b FROM t6
55b0: 29 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e  ) %JOIN% t5 USIN
55c0: 47 20 28 61 29 20 7d 20 0a 20 20 20 20 7b 61 61  G (a) } .    {aa
55d0: 20 63 63 20 63 63 20 62 62 20 44 44 20 64 64 7d   cc cc bb DD dd}
55e0: 0a 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20  .  4 { SELECT * 
55f0: 46 52 4f 4d 20 74 35 20 25 4a 4f 49 4e 25 20 74  FROM t5 %JOIN% t
5600: 36 20 55 53 49 4e 47 20 28 61 2c 62 29 20 7d 20  6 USING (a,b) } 
5610: 7b 41 41 20 63 63 7d 0a 20 20 35 20 7b 20 53 45  {AA cc}.  5 { SE
5620: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 25  LECT * FROM t6 %
5630: 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47 20 28  JOIN% t5 USING (
5640: 61 2c 62 29 20 7d 20 7b 7d 0a 7d 20 7b 0a 20 20  a,b) } {}.} {.  
5650: 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73  do_join_test e_s
5660: 65 6c 65 63 74 2d 31 2e 36 2e 24 74 6e 20 24 73  elect-1.6.$tn $s
5670: 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a 23 20  elect $res.}..# 
5680: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5690: 37 30 34 37 2d 31 30 34 36 31 20 46 6f 72 20 65  7047-10461 For e
56a0: 61 63 68 20 70 61 69 72 20 6f 66 20 63 6f 6c 75  ach pair of colu
56b0: 6d 6e 73 20 69 64 65 6e 74 69 66 69 65 64 20 62  mns identified b
56c0: 79 20 61 0a 23 20 55 53 49 4e 47 20 63 6c 61 75  y a.# USING clau
56d0: 73 65 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  se, the column f
56e0: 72 6f 6d 20 74 68 65 20 72 69 67 68 74 2d 68 61  rom the right-ha
56f0: 6e 64 20 64 61 74 61 73 65 74 20 69 73 20 6f 6d  nd dataset is om
5700: 69 74 74 65 64 20 66 72 6f 6d 0a 23 20 74 68 65  itted from.# the
5710: 20 6a 6f 69 6e 65 64 20 64 61 74 61 73 65 74 2e   joined dataset.
5720: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
5730: 3a 20 52 2d 35 36 31 33 32 2d 31 35 37 30 30 20  : R-56132-15700 
5740: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
5750: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
5760: 65 65 6e 20 61 20 55 53 49 4e 47 0a 23 20 63 6c  een a USING.# cl
5770: 61 75 73 65 20 61 6e 64 20 69 74 73 20 65 71 75  ause and its equ
5780: 69 76 61 6c 65 6e 74 20 4f 4e 20 63 6f 6e 73 74  ivalent ON const
5790: 72 61 69 6e 74 2e 0a 23 0a 66 6f 72 65 61 63 68  raint..#.foreach
57a0: 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65 73 7d   {tn select res}
57b0: 20 7b 0a 20 20 31 61 20 7b 20 53 45 4c 45 43 54   {.  1a { SELECT
57c0: 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e   * FROM t1 %JOIN
57d0: 25 20 74 32 20 55 53 49 4e 47 20 28 61 29 20 20  % t2 USING (a)  
57e0: 20 20 20 20 7d 20 0a 20 20 20 20 20 7b 61 20 6f      } .     {a o
57f0: 6e 65 20 49 20 62 20 74 77 6f 20 49 49 20 63 20  ne I b two II c 
5800: 74 68 72 65 65 20 49 49 49 7d 0a 20 20 31 62 20  three III}.  1b 
5810: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5820: 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20  t1 %JOIN% t2 ON 
5830: 28 74 31 2e 61 3d 74 32 2e 61 29 20 7d 0a 20 20  (t1.a=t2.a) }.  
5840: 20 20 20 7b 61 20 6f 6e 65 20 61 20 49 20 62 20     {a one a I b 
5850: 74 77 6f 20 62 20 49 49 20 63 20 74 68 72 65 65  two b II c three
5860: 20 63 20 49 49 49 7d 0a 0a 20 20 32 61 20 7b 20   c III}..  2a { 
5870: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
5880: 20 25 4a 4f 49 4e 25 20 74 34 20 55 53 49 4e 47   %JOIN% t4 USING
5890: 20 28 61 29 20 20 20 20 20 20 7d 20 20 0a 20 20   (a)      }  .  
58a0: 20 20 20 7b 61 20 31 20 7b 7d 20 62 20 32 20 32     {a 1 {} b 2 2
58b0: 7d 0a 20 20 32 62 20 7b 20 53 45 4c 45 43 54 20  }.  2b { SELECT 
58c0: 2a 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49 4e 25  * FROM t3 %JOIN%
58d0: 20 74 34 20 4f 4e 20 28 74 33 2e 61 3d 74 34 2e   t4 ON (t3.a=t4.
58e0: 61 29 20 7d 20 0a 20 20 20 20 20 7b 61 20 31 20  a) } .     {a 1 
58f0: 61 20 7b 7d 20 62 20 32 20 62 20 32 7d 0a 0a 20  a {} b 2 b 2}.. 
5900: 20 33 61 20 7b 20 53 45 4c 45 43 54 20 2a 20 46   3a { SELECT * F
5910: 52 4f 4d 20 74 33 20 25 4a 4f 49 4e 25 20 74 34  ROM t3 %JOIN% t4
5920: 20 55 53 49 4e 47 20 28 61 2c 63 29 20 20 20 20   USING (a,c)    
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
5940: 7b 62 20 32 7d 0a 20 20 33 62 20 7b 20 53 45 4c  {b 2}.  3b { SEL
5950: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 25 4a  ECT * FROM t3 %J
5960: 4f 49 4e 25 20 74 34 20 4f 4e 20 28 74 33 2e 61  OIN% t4 ON (t3.a
5970: 3d 74 34 2e 61 20 41 4e 44 20 74 33 2e 63 3d 74  =t4.a AND t3.c=t
5980: 34 2e 63 29 20 7d 20 7b 62 20 32 20 62 20 32 7d  4.c) } {b 2 b 2}
5990: 0a 0a 20 20 34 61 20 7b 20 53 45 4c 45 43 54 20  ..  4a { SELECT 
59a0: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
59b0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c   COLLATE nocase,
59c0: 20 62 20 46 52 4f 4d 20 74 36 29 20 41 53 20 78   b FROM t6) AS x
59d0: 20 0a 20 20 20 20 20 20 20 25 4a 4f 49 4e 25 20   .       %JOIN% 
59e0: 74 35 20 55 53 49 4e 47 20 28 61 29 20 7d 20 0a  t5 USING (a) } .
59f0: 20 20 20 20 20 7b 61 61 20 63 63 20 63 63 20 62       {aa cc cc b
5a00: 62 20 44 44 20 64 64 7d 0a 20 20 34 62 20 7b 20  b DD dd}.  4b { 
5a10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
5a20: 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20  ELECT a COLLATE 
5a30: 6e 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d 20 74  nocase, b FROM t
5a40: 36 29 20 41 53 20 78 0a 20 20 20 20 20 20 20 25  6) AS x.       %
5a50: 4a 4f 49 4e 25 20 74 35 20 4f 4e 20 28 78 2e 61  JOIN% t5 ON (x.a
5a60: 3d 74 35 2e 61 29 20 7d 20 0a 20 20 20 20 20 7b  =t5.a) } .     {
5a70: 61 61 20 63 63 20 41 41 20 63 63 20 62 62 20 44  aa cc AA cc bb D
5a80: 44 20 42 42 20 64 64 7d 0a 7d 20 7b 0a 20 20 64  D BB dd}.} {.  d
5a90: 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65  o_join_test e_se
5aa0: 6c 65 63 74 2d 31 2e 37 2e 24 74 6e 20 24 73 65  lect-1.7.$tn $se
5ab0: 6c 65 63 74 20 24 72 65 73 0a 7d 0a 23 20 45 56  lect $res.}.# EV
5ac0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 35  IDENCE-OF: R-425
5ad0: 33 31 2d 35 32 38 37 34 20 49 66 20 74 68 65 20  31-52874 If the 
5ae0: 6a 6f 69 6e 2d 6f 70 65 72 61 74 6f 72 20 69 73  join-operator is
5af0: 20 61 20 22 4c 45 46 54 20 4a 4f 49 4e 22 20 6f   a "LEFT JOIN" o
5b00: 72 0a 23 20 22 4c 45 46 54 20 4f 55 54 45 52 20  r.# "LEFT OUTER 
5b10: 4a 4f 49 4e 22 2c 20 74 68 65 6e 20 61 66 74 65  JOIN", then afte
5b20: 72 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  r the ON or USIN
5b30: 47 20 66 69 6c 74 65 72 69 6e 67 20 63 6c 61 75  G filtering clau
5b40: 73 65 73 20 68 61 76 65 0a 23 20 62 65 65 6e 20  ses have.# been 
5b50: 61 70 70 6c 69 65 64 2c 20 61 6e 20 65 78 74 72  applied, an extr
5b60: 61 20 72 6f 77 20 69 73 20 61 64 64 65 64 20 74  a row is added t
5b70: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  o the output for
5b80: 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
5b90: 0a 23 20 6f 72 69 67 69 6e 61 6c 20 6c 65 66 74  .# original left
5ba0: 2d 68 61 6e 64 20 69 6e 70 75 74 20 64 61 74 61  -hand input data
5bb0: 73 65 74 20 74 68 61 74 20 63 6f 72 72 65 73 70  set that corresp
5bc0: 6f 6e 64 73 20 74 6f 20 6e 6f 20 72 6f 77 73 20  onds to no rows 
5bd0: 61 74 20 61 6c 6c 20 69 6e 0a 23 20 74 68 65 20  at all in.# the 
5be0: 63 6f 6d 70 6f 73 69 74 65 20 64 61 74 61 73 65  composite datase
5bf0: 74 20 28 69 66 20 61 6e 79 29 2e 0a 23 0a 64 6f  t (if any)..#.do
5c00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5c10: 73 65 6c 65 63 74 2d 31 2e 38 2e 30 20 7b 0a 20  select-1.8.0 {. 
5c20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
5c30: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45  (a, b, c);.  CRE
5c40: 41 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20  ATE TABLE t8(a, 
5c50: 64 2c 20 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54  d, e);..  INSERT
5c60: 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28   INTO t7 VALUES(
5c70: 27 78 27 2c 20 27 65 78 27 2c 20 20 32 34 29 3b  'x', 'ex',  24);
5c80: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
5c90: 37 20 56 41 4c 55 45 53 28 27 79 27 2c 20 27 77  7 VALUES('y', 'w
5ca0: 68 79 27 2c 20 32 35 29 3b 0a 0a 20 20 49 4e 53  hy', 25);..  INS
5cb0: 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55  ERT INTO t8 VALU
5cc0: 45 53 28 27 78 27 2c 20 27 61 62 63 27 2c 20 32  ES('x', 'abc', 2
5cd0: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
5ce0: 4f 20 74 38 20 56 41 4c 55 45 53 28 27 7a 27 2c  O t8 VALUES('z',
5cf0: 20 27 67 68 69 27 2c 20 32 36 29 3b 0a 7d 20 7b   'ghi', 26);.} {
5d00: 7d 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  }..do_select_tes
5d10: 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 38 20  ts e_select-1.8 
5d20: 7b 0a 20 20 31 61 20 22 53 45 4c 45 43 54 20 63  {.  1a "SELECT c
5d30: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 37 20  ount(*) FROM t7 
5d40: 4a 4f 49 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61  JOIN t8 ON (t7.a
5d50: 3d 74 38 2e 61 29 22 20 7b 31 7d 0a 20 20 31 62  =t8.a)" {1}.  1b
5d60: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
5d70: 29 20 46 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a  ) FROM t7 LEFT J
5d80: 4f 49 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d  OIN t8 ON (t7.a=
5d90: 74 38 2e 61 29 22 20 7b 32 7d 0a 20 20 32 61 20  t8.a)" {2}.  2a 
5da0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
5db0: 20 46 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38   FROM t7 JOIN t8
5dc0: 20 55 53 49 4e 47 20 28 61 29 22 20 7b 31 7d 0a   USING (a)" {1}.
5dd0: 20 20 32 62 20 22 53 45 4c 45 43 54 20 63 6f 75    2b "SELECT cou
5de0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 37 20 4c 45  nt(*) FROM t7 LE
5df0: 46 54 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47  FT JOIN t8 USING
5e00: 20 28 61 29 22 20 7b 32 7d 0a 7d 0a 0a 0a 23 20   (a)" {2}.}...# 
5e10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
5e20: 35 36 30 37 2d 35 32 39 38 38 20 54 68 65 20 61  5607-52988 The a
5e30: 64 64 65 64 20 72 6f 77 73 20 63 6f 6e 74 61 69  dded rows contai
5e40: 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e  n NULL values in
5e50: 20 74 68 65 0a 23 20 63 6f 6c 75 6d 6e 73 20 74   the.# columns t
5e60: 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c  hat would normal
5e70: 6c 79 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65  ly contain value
5e80: 73 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  s copied from th
5e90: 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 23 20 69  e right-hand.# i
5ea0: 6e 70 75 74 20 64 61 74 61 73 65 74 2e 0a 23 0a  nput dataset..#.
5eb0: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
5ec0: 65 5f 73 65 6c 65 63 74 2d 31 2e 39 20 7b 0a 20  e_select-1.9 {. 
5ed0: 20 31 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52   1a "SELECT * FR
5ee0: 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 4f 4e  OM t7 JOIN t8 ON
5ef0: 20 28 74 37 2e 61 3d 74 38 2e 61 29 22 20 7b 78   (t7.a=t8.a)" {x
5f00: 20 65 78 20 32 34 20 78 20 61 62 63 20 32 34 7d   ex 24 x abc 24}
5f10: 0a 20 20 31 62 20 22 53 45 4c 45 43 54 20 2a 20  .  1b "SELECT * 
5f20: 46 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49  FROM t7 LEFT JOI
5f30: 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38  N t8 ON (t7.a=t8
5f40: 2e 61 29 22 20 0a 20 20 20 20 20 7b 78 20 65 78  .a)" .     {x ex
5f50: 20 32 34 20 78 20 61 62 63 20 32 34 20 79 20 77   24 x abc 24 y w
5f60: 68 79 20 32 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a  hy 25 {} {} {}}.
5f70: 20 20 32 61 20 22 53 45 4c 45 43 54 20 2a 20 46    2a "SELECT * F
5f80: 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 55  ROM t7 JOIN t8 U
5f90: 53 49 4e 47 20 28 61 29 22 20 7b 78 20 65 78 20  SING (a)" {x ex 
5fa0: 32 34 20 61 62 63 20 32 34 7d 0a 20 20 32 62 20  24 abc 24}.  2b 
5fb0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
5fc0: 37 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38 20 55  7 LEFT JOIN t8 U
5fd0: 53 49 4e 47 20 28 61 29 22 20 7b 78 20 65 78 20  SING (a)" {x ex 
5fe0: 32 34 20 61 62 63 20 32 34 20 79 20 77 68 79 20  24 abc 24 y why 
5ff0: 32 35 20 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 20 45  25 {} {}}.}..# E
6000: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
6010: 39 33 32 2d 35 35 39 34 32 20 49 66 20 74 68 65  932-55942 If the
6020: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6030: 20 69 73 20 69 6e 20 74 68 65 0a 23 20 6a 6f 69   is in the.# joi
6040: 6e 2d 6f 70 65 72 61 74 6f 72 20 74 68 65 6e 20  n-operator then 
6050: 61 6e 20 69 6d 70 6c 69 63 69 74 20 55 53 49 4e  an implicit USIN
6060: 47 20 63 6c 61 75 73 65 20 69 73 20 61 64 64 65  G clause is adde
6070: 64 20 74 6f 20 74 68 65 0a 23 20 6a 6f 69 6e 2d  d to the.# join-
6080: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 54 68 65  constraints. The
6090: 20 69 6d 70 6c 69 63 69 74 20 55 53 49 4e 47 20   implicit USING 
60a0: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
60b0: 65 61 63 68 20 6f 66 20 74 68 65 0a 23 20 63 6f  each of the.# co
60c0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 61 74 20  lumn names that 
60d0: 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 74  appear in both t
60e0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
60f0: 74 2d 68 61 6e 64 20 69 6e 70 75 74 0a 23 20 64  t-hand input.# d
6100: 61 74 61 73 65 74 73 2e 0a 23 0a 64 6f 5f 73 65  atasets..#.do_se
6110: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
6120: 65 63 74 2d 31 2d 31 30 20 7b 0a 20 20 31 61 20  ect-1-10 {.  1a 
6130: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6140: 37 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20  7 JOIN t8 USING 
6150: 28 61 29 22 20 20 20 20 20 20 20 20 7b 78 20 65  (a)"        {x e
6160: 78 20 32 34 20 61 62 63 20 32 34 7d 0a 20 20 31  x 24 abc 24}.  1
6170: 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  b "SELECT * FROM
6180: 20 74 37 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   t7 NATURAL JOIN
6190: 20 74 38 22 20 20 20 20 20 20 20 20 20 20 7b 78   t8"          {x
61a0: 20 65 78 20 32 34 20 61 62 63 20 32 34 7d 0a 0a   ex 24 abc 24}..
61b0: 20 20 32 61 20 22 53 45 4c 45 43 54 20 2a 20 46    2a "SELECT * F
61c0: 52 4f 4d 20 74 38 20 4a 4f 49 4e 20 74 37 20 55  ROM t8 JOIN t7 U
61d0: 53 49 4e 47 20 28 61 29 22 20 20 20 20 20 20 20  SING (a)"       
61e0: 20 7b 78 20 61 62 63 20 32 34 20 65 78 20 32 34   {x abc 24 ex 24
61f0: 7d 0a 20 20 32 62 20 22 53 45 4c 45 43 54 20 2a  }.  2b "SELECT *
6200: 20 46 52 4f 4d 20 74 38 20 4e 41 54 55 52 41 4c   FROM t8 NATURAL
6210: 20 4a 4f 49 4e 20 74 37 22 20 20 20 20 20 20 20   JOIN t7"       
6220: 20 20 20 7b 78 20 61 62 63 20 32 34 20 65 78 20     {x abc 24 ex 
6230: 32 34 7d 0a 0a 20 20 33 61 20 22 53 45 4c 45 43  24}..  3a "SELEC
6240: 54 20 2a 20 46 52 4f 4d 20 74 37 20 4c 45 46 54  T * FROM t7 LEFT
6250: 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20 28   JOIN t8 USING (
6260: 61 29 22 20 20 20 7b 78 20 65 78 20 32 34 20 61  a)"   {x ex 24 a
6270: 62 63 20 32 34 20 79 20 77 68 79 20 32 35 20 7b  bc 24 y why 25 {
6280: 7d 20 7b 7d 7d 0a 20 20 33 62 20 22 53 45 4c 45  } {}}.  3b "SELE
6290: 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 4e 41 54  CT * FROM t7 NAT
62a0: 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74  URAL LEFT JOIN t
62b0: 38 22 20 20 20 20 20 7b 78 20 65 78 20 32 34 20  8"     {x ex 24 
62c0: 61 62 63 20 32 34 20 79 20 77 68 79 20 32 35 20  abc 24 y why 25 
62d0: 7b 7d 20 7b 7d 7d 0a 0a 20 20 34 61 20 22 53 45  {} {}}..  4a "SE
62e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4c  LECT * FROM t8 L
62f0: 45 46 54 20 4a 4f 49 4e 20 74 37 20 55 53 49 4e  EFT JOIN t7 USIN
6300: 47 20 28 61 29 22 20 20 20 7b 78 20 61 62 63 20  G (a)"   {x abc 
6310: 32 34 20 65 78 20 32 34 20 7a 20 67 68 69 20 32  24 ex 24 z ghi 2
6320: 36 20 7b 7d 20 7b 7d 7d 0a 20 20 34 62 20 22 53  6 {} {}}.  4b "S
6330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20  ELECT * FROM t8 
6340: 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49  NATURAL LEFT JOI
6350: 4e 20 74 37 22 20 20 20 20 20 7b 78 20 61 62 63  N t7"     {x abc
6360: 20 32 34 20 65 78 20 32 34 20 7a 20 67 68 69 20   24 ex 24 z ghi 
6370: 32 36 20 7b 7d 20 7b 7d 7d 0a 0a 20 20 35 61 20  26 {} {}}..  5a 
6380: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6390: 33 20 4a 4f 49 4e 20 74 34 20 55 53 49 4e 47 20  3 JOIN t4 USING 
63a0: 28 61 2c 63 29 22 20 20 20 20 20 20 7b 62 20 32  (a,c)"      {b 2
63b0: 7d 0a 20 20 35 62 20 22 53 45 4c 45 43 54 20 2a  }.  5b "SELECT *
63c0: 20 46 52 4f 4d 20 74 33 20 4e 41 54 55 52 41 4c   FROM t3 NATURAL
63d0: 20 4a 4f 49 4e 20 74 34 22 20 20 20 20 20 20 20   JOIN t4"       
63e0: 20 20 20 7b 62 20 32 7d 0a 0a 20 20 36 61 20 22     {b 2}..  6a "
63f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
6400: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 34 20 55 53   LEFT JOIN t4 US
6410: 49 4e 47 20 28 61 2c 63 29 22 20 7b 61 20 31 20  ING (a,c)" {a 1 
6420: 62 20 32 7d 0a 20 20 36 62 20 22 53 45 4c 45 43  b 2}.  6b "SELEC
6430: 54 20 2a 20 46 52 4f 4d 20 74 33 20 4e 41 54 55  T * FROM t3 NATU
6440: 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 34  RAL LEFT JOIN t4
6450: 22 20 20 20 20 20 7b 61 20 31 20 62 20 32 7d 0a  "     {a 1 b 2}.
6460: 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
6470: 46 3a 20 52 2d 34 39 35 36 36 2d 30 31 35 37 30  F: R-49566-01570
6480: 20 49 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64   If the left and
6490: 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70 75   right-hand inpu
64a0: 74 20 64 61 74 61 73 65 74 73 0a 23 20 66 65 61  t datasets.# fea
64b0: 74 75 72 65 20 6e 6f 20 63 6f 6d 6d 6f 6e 20 63  ture no common c
64c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2c 20 74 68 65  olumn names, the
64d0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
64e0: 79 77 6f 72 64 20 68 61 73 20 6e 6f 20 65 66 66  yword has no eff
64f0: 65 63 74 0a 23 20 6f 6e 20 74 68 65 20 72 65 73  ect.# on the res
6500: 75 6c 74 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ults of the join
6510: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
6520: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 31  est e_select-1.1
6530: 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.0 {.  CREATE T
6540: 41 42 4c 45 20 74 31 30 28 78 2c 20 79 29 3b 0a  ABLE t10(x, y);.
6550: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6560: 30 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72 75  0 VALUES(1, 'tru
6570: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
6580: 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 30 2c  TO t10 VALUES(0,
6590: 20 27 66 61 6c 73 65 27 29 3b 0a 7d 20 7b 7d 0a   'false');.} {}.
65a0: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
65b0: 65 5f 73 65 6c 65 63 74 2d 31 2d 31 31 20 7b 0a  e_select-1-11 {.
65c0: 20 20 31 61 20 22 53 45 4c 45 43 54 20 61 2c 20    1a "SELECT a, 
65d0: 78 20 46 52 4f 4d 20 74 31 20 43 52 4f 53 53 20  x FROM t1 CROSS 
65e0: 4a 4f 49 4e 20 74 31 30 22 20 7b 61 20 31 20 61  JOIN t10" {a 1 a
65f0: 20 30 20 62 20 31 20 62 20 30 20 63 20 31 20 63   0 b 1 b 0 c 1 c
6600: 20 30 7d 0a 20 20 31 62 20 22 53 45 4c 45 43 54   0}.  1b "SELECT
6610: 20 61 2c 20 78 20 46 52 4f 4d 20 74 31 20 4e 41   a, x FROM t1 NA
6620: 54 55 52 41 4c 20 43 52 4f 53 53 20 4a 4f 49 4e  TURAL CROSS JOIN
6630: 20 74 31 30 22 20 7b 61 20 31 20 61 20 30 20 62   t10" {a 1 a 0 b
6640: 20 31 20 62 20 30 20 63 20 31 20 63 20 30 7d 0a   1 b 0 c 1 c 0}.
6650: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
6660: 3a 20 52 2d 33 39 36 32 35 2d 35 39 31 33 33 20  : R-39625-59133 
6670: 41 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c  A USING or ON cl
6680: 61 75 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  ause may not be 
6690: 61 64 64 65 64 20 74 6f 20 61 0a 23 20 6a 6f 69  added to a.# joi
66a0: 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  n that specifies
66b0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
66c0: 77 6f 72 64 2e 0a 23 0a 66 6f 72 65 61 63 68 20  word..#.foreach 
66d0: 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20 7b  {tn sql} {.  1 {
66e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
66f0: 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f   NATURAL LEFT JO
6700: 49 4e 20 74 32 20 55 53 49 4e 47 20 28 61 29 7d  IN t2 USING (a)}
6710: 0a 20 20 32 20 7b 53 45 4c 45 43 54 20 2a 20 46  .  2 {SELECT * F
6720: 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 4c  ROM t1 NATURAL L
6730: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 28  EFT JOIN t2 ON (
6740: 74 31 2e 61 3d 74 32 2e 61 29 7d 0a 20 20 33 20  t1.a=t2.a)}.  3 
6750: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
6760: 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a  1 NATURAL LEFT J
6770: 4f 49 4e 20 74 32 20 4f 4e 20 28 34 35 29 7d 0a  OIN t2 ON (45)}.
6780: 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  } {.  do_catchsq
6790: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
67a0: 31 2e 31 32 2e 24 74 6e 20 22 0a 20 20 20 20 24  1.12.$tn ".    $
67b0: 73 71 6c 0a 20 20 22 20 7b 31 20 7b 61 20 4e 41  sql.  " {1 {a NA
67c0: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
67d0: 6f 74 20 68 61 76 65 20 61 6e 20 4f 4e 20 6f 72  ot have an ON or
67e0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 7d 7d 0a   USING clause}}.
67f0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
6840: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
6850: 66 20 74 65 73 74 73 20 2d 20 65 5f 73 65 6c 65  f tests - e_sele
6860: 63 74 2d 33 2e 2a 20 2d 20 63 6f 6e 63 65 6e 74  ct-3.* - concent
6870: 72 61 74 65 20 6f 6e 20 76 65 72 69 66 79 69 6e  rate on verifyin
6880: 67 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20  g .# statements 
6890: 6d 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 57  made regarding W
68a0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
68b0: 65 73 73 69 6e 67 2e 0a 23 0a 64 72 6f 70 5f 61  essing..#.drop_a
68c0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65  ll_tables.do_exe
68d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
68e0: 63 74 2d 33 2e 30 20 7b 0a 20 20 43 52 45 41 54  ct-3.0 {.  CREAT
68f0: 45 20 54 41 42 4c 45 20 78 31 28 6b 2c 20 78 2c  E TABLE x1(k, x,
6900: 20 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54   y, z);.  INSERT
6910: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
6920: 31 2c 20 27 72 65 6c 69 6e 71 75 69 73 68 65 64  1, 'relinquished
6930: 27 2c 20 27 61 70 68 61 73 69 61 27 2c 20 37 38  ', 'aphasia', 78
6940: 2e 34 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  .43);.  INSERT I
6950: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 32 2c  NTO x1 VALUES(2,
6960: 20 58 27 41 38 45 38 44 36 36 46 27 2c 20 20 20   X'A8E8D66F',   
6970: 20 58 27 30 37 43 46 27 2c 20 20 20 2d 38 31 29   X'07CF',   -81)
6980: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6990: 78 31 20 56 41 4c 55 45 53 28 33 2c 20 2d 32 32  x1 VALUES(3, -22
69a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 32 37  ,            -27
69b0: 2e 35 37 2c 20 20 20 20 4e 55 4c 4c 29 3b 0a 20  .57,    NULL);. 
69c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
69d0: 56 41 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 2c 20  VALUES(4, NULL, 
69e0: 20 20 20 20 20 20 20 20 20 20 27 62 79 67 6f 6e            'bygon
69f0: 65 27 2c 20 20 27 70 69 63 6b 79 27 29 3b 0a 20  e',  'picky');. 
6a00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
6a10: 56 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 2c 20  VALUES(5, NULL, 
6a20: 20 20 20 20 20 20 20 20 20 20 39 36 2e 32 38 2c            96.28,
6a30: 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e       NULL);.  IN
6a40: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
6a50: 55 45 53 28 36 2c 20 30 2c 20 20 20 20 20 20 20  UES(6, 0,       
6a60: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
6a70: 20 20 32 29 3b 0a 0a 20 20 43 52 45 41 54 45 20    2);..  CREATE 
6a80: 54 41 42 4c 45 20 78 32 28 6b 2c 20 78 2c 20 79  TABLE x2(k, x, y
6a90: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
6aa0: 4f 20 78 32 20 56 41 4c 55 45 53 28 31 2c 20 35  O x2 VALUES(1, 5
6ab0: 30 2c 20 58 27 42 38 32 38 33 38 27 29 3b 0a 20  0, X'B82838');. 
6ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
6ad0: 56 41 4c 55 45 53 28 35 2c 20 38 34 2e 37 39 2c  VALUES(5, 84.79,
6ae0: 20 36 35 2e 38 38 29 3b 0a 20 20 49 4e 53 45 52   65.88);.  INSER
6af0: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
6b00: 28 33 2c 20 2d 32 32 2c 20 58 27 30 45 31 42 45  (3, -22, X'0E1BE
6b10: 34 35 32 41 33 39 33 27 29 3b 0a 20 20 49 4e 53  452A393');.  INS
6b20: 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55  ERT INTO x2 VALU
6b30: 45 53 28 37 2c 20 27 6d 69 73 74 72 75 73 74 65  ES(7, 'mistruste
6b40: 64 27 2c 20 27 73 74 61 6e 64 61 72 64 69 7a 65  d', 'standardize
6b50: 64 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49  d');.} {}..# EVI
6b60: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37 37  DENCE-OF: R-6077
6b70: 35 2d 36 34 39 31 36 20 49 66 20 61 20 57 48 45  5-64916 If a WHE
6b80: 52 45 20 63 6c 61 75 73 65 20 69 73 20 73 70 65  RE clause is spe
6b90: 63 69 66 69 65 64 2c 20 74 68 65 20 57 48 45 52  cified, the WHER
6ba0: 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69  E.# expression i
6bb0: 73 20 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20  s evaluated for 
6bc0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
6bd0: 69 6e 70 75 74 20 64 61 74 61 20 61 73 20 61 20  input data as a 
6be0: 62 6f 6f 6c 65 61 6e 0a 23 20 65 78 70 72 65 73  boolean.# expres
6bf0: 73 69 6f 6e 2e 20 4f 6e 6c 79 20 72 6f 77 73 20  sion. Only rows 
6c00: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
6c10: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
6c20: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 0a  ssion evaluates.
6c30: 23 20 74 6f 20 74 72 75 65 20 61 72 65 20 69 6e  # to true are in
6c40: 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
6c50: 64 61 74 61 73 65 74 20 62 65 66 6f 72 65 20 63  dataset before c
6c60: 6f 6e 74 69 6e 75 69 6e 67 2e 0a 23 0a 64 6f 5f  ontinuing..#.do_
6c70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
6c80: 65 6c 65 63 74 2d 33 2e 31 2e 31 20 7b 20 53 45  elect-3.1.1 { SE
6c90: 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57  LECT k FROM x1 W
6ca0: 48 45 52 45 20 78 20 7d 20 20 20 20 20 20 20 20  HERE x }        
6cb0: 20 7b 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {3}.do_execsql_
6cc0: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e  test e_select-3.
6cd0: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 6b 20 46  1.2 { SELECT k F
6ce0: 52 4f 4d 20 78 31 20 57 48 45 52 45 20 79 20 7d  ROM x1 WHERE y }
6cf0: 20 20 20 20 20 20 20 20 20 7b 33 20 35 20 36 7d           {3 5 6}
6d00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6d10: 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e 33 20   e_select-3.1.3 
6d20: 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20  { SELECT k FROM 
6d30: 78 31 20 57 48 45 52 45 20 7a 20 7d 20 20 20 20  x1 WHERE z }    
6d40: 20 20 20 20 20 7b 31 20 32 20 36 7d 0a 64 6f 5f       {1 2 6}.do_
6d50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
6d60: 65 6c 65 63 74 2d 33 2e 31 2e 34 20 7b 20 53 45  elect-3.1.4 { SE
6d70: 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57  LECT k FROM x1 W
6d80: 48 45 52 45 20 27 31 27 7c 7c 7a 20 20 20 20 7d  HERE '1'||z    }
6d90: 20 7b 31 20 32 20 34 20 36 7d 0a 64 6f 5f 65 78   {1 2 4 6}.do_ex
6da0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
6db0: 65 63 74 2d 33 2e 31 2e 35 20 7b 20 53 45 4c 45  ect-3.1.5 { SELE
6dc0: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45  CT k FROM x1 WHE
6dd0: 52 45 20 78 20 49 53 20 4e 55 4c 4c 20 7d 20 7b  RE x IS NULL } {
6de0: 34 20 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  4 5}.do_execsql_
6df0: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e  test e_select-3.
6e00: 31 2e 36 20 7b 20 53 45 4c 45 43 54 20 6b 20 46  1.6 { SELECT k F
6e10: 52 4f 4d 20 78 31 20 57 48 45 52 45 20 7a 20 2d  ROM x1 WHERE z -
6e20: 20 37 38 2e 34 33 20 7d 20 7b 32 20 34 20 36 7d   78.43 } {2 4 6}
6e30: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
6e40: 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e 31  t e_select-3.2.1
6e50: 61 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20 46  a {.  SELECT k F
6e60: 52 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM x1 LEFT JOIN
6e70: 20 78 32 20 55 53 49 4e 47 28 6b 29 0a 7d 20 7b   x2 USING(k).} {
6e80: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f  1 2 3 4 5 6}.do_
6e90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
6ea0: 65 6c 65 63 74 2d 33 2e 32 2e 31 62 20 7b 0a 20  elect-3.2.1b {. 
6eb0: 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78   SELECT k FROM x
6ec0: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 78 32 20 55  1 LEFT JOIN x2 U
6ed0: 53 49 4e 47 28 6b 29 20 57 48 45 52 45 20 78 32  SING(k) WHERE x2
6ee0: 2e 6b 20 4f 52 44 45 52 20 42 59 20 2b 6b 0a 7d  .k ORDER BY +k.}
6ef0: 20 7b 31 20 33 20 35 7d 0a 64 6f 5f 65 78 65 63   {1 3 5}.do_exec
6f00: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
6f10: 74 2d 33 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45  t-3.2.2 {.  SELE
6f20: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4c 45 46  CT k FROM x1 LEF
6f30: 54 20 4a 4f 49 4e 20 78 32 20 55 53 49 4e 47 28  T JOIN x2 USING(
6f40: 6b 29 20 57 48 45 52 45 20 78 32 2e 6b 20 49 53  k) WHERE x2.k IS
6f50: 20 4e 55 4c 4c 0a 7d 20 7b 32 20 34 20 36 7d 0a   NULL.} {2 4 6}.
6f60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6f70: 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e 33 20   e_select-3.2.3 
6f80: 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20 46 52 4f  {.  SELECT k FRO
6f90: 4d 20 78 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M x1 NATURAL JOI
6fa0: 4e 20 78 32 20 57 48 45 52 45 20 78 32 2e 6b 0a  N x2 WHERE x2.k.
6fb0: 7d 20 7b 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {3}.do_execsql
6fc0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33  _test e_select-3
6fd0: 2e 32 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.4 {.  SELECT 
6fe0: 6b 20 46 52 4f 4d 20 78 31 20 4e 41 54 55 52 41  k FROM x1 NATURA
6ff0: 4c 20 4a 4f 49 4e 20 78 32 20 57 48 45 52 45 20  L JOIN x2 WHERE 
7000: 78 32 2e 6b 2d 33 0a 7d 20 7b 7d 0a 0a 23 2d 2d  x2.k-3.} {}..#--
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20  -------.# Tests 
7060: 62 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  below this point
7070: 20 61 72 65 20 66 6f 63 75 73 65 64 20 6f 6e 20   are focused on 
7080: 76 65 72 69 66 79 69 6e 67 20 74 68 65 20 74 65  verifying the te
7090: 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e 74  stable statement
70a0: 73 0a 23 20 72 65 6c 61 74 65 64 20 74 6f 20 63  s.# related to c
70b0: 61 63 75 6c 61 74 69 6e 67 20 74 68 65 20 72 65  aculating the re
70c0: 73 75 6c 74 20 72 6f 77 73 20 6f 66 20 61 20 73  sult rows of a s
70d0: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
70e0: 74 65 6d 65 6e 74 2e 0a 23 0a 0a 64 72 6f 70 5f  tement..#..drop_
70f0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78  all_tables.do_ex
7100: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
7110: 65 63 74 2d 34 2e 30 20 7b 0a 20 20 43 52 45 41  ect-4.0 {.  CREA
7120: 54 45 20 54 41 42 4c 45 20 7a 31 28 61 2c 20 62  TE TABLE z1(a, b
7130: 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , c);.  CREATE T
7140: 41 42 4c 45 20 7a 32 28 64 2c 20 65 29 3b 0a 20  ABLE z2(d, e);. 
7150: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 33   CREATE TABLE z3
7160: 28 61 2c 20 62 29 3b 0a 0a 20 20 49 4e 53 45 52  (a, b);..  INSER
7170: 54 20 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53  T INTO z1 VALUES
7180: 28 35 31 2e 36 35 2c 20 2d 35 39 2e 35 38 2c 20  (51.65, -59.58, 
7190: 27 62 65 6c 66 72 69 65 73 27 29 3b 0a 20 20 49  'belfries');.  I
71a0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20 56 41  NSERT INTO z1 VA
71b0: 4c 55 45 53 28 2d 35 2c 20 4e 55 4c 4c 2c 20 37  LUES(-5, NULL, 7
71c0: 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  5);.  INSERT INT
71d0: 4f 20 7a 31 20 56 41 4c 55 45 53 28 2d 32 2e 32  O z1 VALUES(-2.2
71e0: 2c 20 2d 32 33 2e 31 38 2c 20 27 73 75 69 74 65  , -23.18, 'suite
71f0: 72 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  rs');.  INSERT I
7200: 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 4e 55  NTO z1 VALUES(NU
7210: 4c 4c 2c 20 36 37 2c 20 27 71 75 61 72 74 65 74  LL, 67, 'quartet
7220: 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  s');.  INSERT IN
7230: 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 2d 31 2e  TO z1 VALUES(-1.
7240: 30 34 2c 20 2d 33 32 2e 33 2c 20 27 61 73 70 65  04, -32.3, 'aspe
7250: 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  n');.  INSERT IN
7260: 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 36 33 2c  TO z1 VALUES(63,
7270: 20 27 62 6f 72 6e 27 2c 20 2d 32 36 29 3b 0a 0a   'born', -26);..
7280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 32    INSERT INTO z2
7290: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 32 31   VALUES(NULL, 21
72a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
72b0: 20 7a 32 20 56 41 4c 55 45 53 28 33 36 2c 20 36   z2 VALUES(36, 6
72c0: 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  );..  INSERT INT
72d0: 4f 20 7a 33 20 56 41 4c 55 45 53 28 27 73 75 62  O z3 VALUES('sub
72e0: 73 69 73 74 65 6e 63 65 27 2c 20 27 67 61 75 7a  sistence', 'gauz
72f0: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
7300: 54 4f 20 7a 33 20 56 41 4c 55 45 53 28 34 39 2e  TO z3 VALUES(49.
7310: 31 37 2c 20 2d 36 37 29 3b 0a 7d 20 7b 7d 0a 0a  17, -67);.} {}..
7320: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7330: 2d 33 36 33 32 37 2d 31 37 32 32 34 20 49 66 20  -36327-17224 If 
7340: 61 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73  a result express
7350: 69 6f 6e 20 69 73 20 74 68 65 20 73 70 65 63 69  ion is the speci
7360: 61 6c 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  al.# expression 
7370: 22 2a 22 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6c  "*" then all col
7380: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 70 75  umns in the inpu
7390: 74 20 64 61 74 61 20 61 72 65 20 73 75 62 73 74  t data are subst
73a0: 69 74 75 74 65 64 20 66 6f 72 0a 23 20 74 68 61  ituted for.# tha
73b0: 74 20 6f 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  t one expression
73c0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
73d0: 46 3a 20 52 2d 34 33 36 39 33 2d 33 30 35 32 32  F: R-43693-30522
73e0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
73f0: 6f 6e 20 69 73 20 74 68 65 20 61 6c 69 61 73 20  on is the alias 
7400: 6f 66 20 61 20 74 61 62 6c 65 0a 23 20 6f 72 20  of a table.# or 
7410: 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
7420: 46 52 4f 4d 20 63 6c 61 75 73 65 20 66 6f 6c 6c  FROM clause foll
7430: 6f 77 65 64 20 62 79 20 22 2e 2a 22 20 74 68 65  owed by ".*" the
7440: 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72  n all columns fr
7450: 6f 6d 0a 23 20 74 68 65 20 6e 61 6d 65 64 20 74  om.# the named t
7460: 61 62 6c 65 20 6f 72 20 73 75 62 71 75 65 72 79  able or subquery
7470: 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64   are substituted
7480: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
7490: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 64 6f  expression..#.do
74a0: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
74b0: 73 65 6c 65 63 74 2d 34 2e 31 20 7b 0a 20 20 31  select-4.1 {.  1
74c0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
74d0: 20 7a 31 20 4c 49 4d 49 54 20 31 22 20 20 20 20   z1 LIMIT 1"    
74e0: 20 20 20 20 20 20 20 20 20 7b 35 31 2e 36 35 20           {51.65 
74f0: 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73 7d  -59.58 belfries}
7500: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 2a 20  .  2  "SELECT * 
7510: 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54  FROM z1,z2 LIMIT
7520: 20 31 22 20 20 20 20 20 20 20 20 20 20 7b 35 31   1"          {51
7530: 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72  .65 -59.58 belfr
7540: 69 65 73 20 7b 7d 20 32 31 7d 0a 20 20 33 20 20  ies {} 21}.  3  
7550: 22 53 45 4c 45 43 54 20 7a 31 2e 2a 20 46 52 4f  "SELECT z1.* FRO
7560: 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22  M z1,z2 LIMIT 1"
7570: 20 20 20 20 20 20 20 7b 35 31 2e 36 35 20 2d 35         {51.65 -5
7580: 39 2e 35 38 20 62 65 6c 66 72 69 65 73 7d 0a 20  9.58 belfries}. 
7590: 20 34 20 20 22 53 45 4c 45 43 54 20 7a 32 2e 2a   4  "SELECT z2.*
75a0: 20 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49   FROM z1,z2 LIMI
75b0: 54 20 31 22 20 20 20 20 20 20 20 7b 7b 7d 20 32  T 1"       {{} 2
75c0: 31 7d 0a 20 20 35 20 20 22 53 45 4c 45 43 54 20  1}.  5  "SELECT 
75d0: 7a 32 2e 2a 2c 20 7a 31 2e 2a 20 46 52 4f 4d 20  z2.*, z1.* FROM 
75e0: 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22 20 7b  z1,z2 LIMIT 1" {
75f0: 7b 7d 20 32 31 20 35 31 2e 36 35 20 2d 35 39 2e  {} 21 51.65 -59.
7600: 35 38 20 62 65 6c 66 72 69 65 73 7d 0a 0a 20 20  58 belfries}..  
7610: 36 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  6  "SELECT count
7620: 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 7a 31 22 20  (*), * FROM z1" 
7630: 20 20 20 20 20 20 20 20 20 20 7b 36 20 35 31 2e            {6 51.
7640: 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69  65 -59.58 belfri
7650: 65 73 7d 0a 20 20 37 20 20 22 53 45 4c 45 43 54  es}.  7  "SELECT
7660: 20 6d 61 78 28 61 29 2c 20 2a 20 46 52 4f 4d 20   max(a), * FROM 
7670: 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20  z1"             
7680: 7b 36 33 20 36 33 20 62 6f 72 6e 20 2d 32 36 7d  {63 63 born -26}
7690: 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20 2a 2c  .  8  "SELECT *,
76a0: 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 7a 31 22   min(a) FROM z1"
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d 35               {-5
76c0: 20 7b 7d 20 37 35 20 2d 35 7d 0a 0a 20 20 39 20   {} 75 -5}..  9 
76d0: 20 22 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f   "SELECT *,* FRO
76e0: 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22  M z1,z2 LIMIT 1"
76f0: 20 7b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20   {        .     
7700: 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c  51.65 -59.58 bel
7710: 66 72 69 65 73 20 7b 7d 20 32 31 20 35 31 2e 36  fries {} 21 51.6
7720: 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65  5 -59.58 belfrie
7730: 73 20 7b 7d 20 32 31 0a 20 20 7d 0a 20 20 31 30  s {} 21.  }.  10
7740: 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a 2c 7a 31   "SELECT z1.*,z1
7750: 2e 2a 20 46 52 4f 4d 20 7a 32 2c 7a 31 20 4c 49  .* FROM z2,z1 LI
7760: 4d 49 54 20 31 22 20 7b 20 20 20 20 20 20 20 20  MIT 1" {        
7770: 0a 20 20 20 20 20 35 31 2e 36 35 20 2d 35 39 2e  .     51.65 -59.
7780: 35 38 20 62 65 6c 66 72 69 65 73 20 35 31 2e 36  58 belfries 51.6
7790: 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65  5 -59.58 belfrie
77a0: 73 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  s.  }.}..# EVIDE
77b0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 30 32 33 2d  NCE-OF: R-38023-
77c0: 31 38 33 39 36 20 49 74 20 69 73 20 61 6e 20 65  18396 It is an e
77d0: 72 72 6f 72 20 74 6f 20 75 73 65 20 61 20 22 2a  rror to use a "*
77e0: 22 20 6f 72 20 22 61 6c 69 61 73 2e 2a 22 0a 23  " or "alias.*".#
77f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
7800: 6e 79 20 63 6f 6e 74 65 78 74 20 6f 74 68 65 72  ny context other
7810: 20 74 68 61 6e 20 61 20 72 65 73 75 6c 74 20 65   than a result e
7820: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
7830: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
7840: 20 52 2d 34 34 33 32 34 2d 34 31 31 36 36 20 49   R-44324-41166 I
7850: 74 20 69 73 20 61 6c 73 6f 20 61 6e 20 65 72 72  t is also an err
7860: 6f 72 20 74 6f 20 75 73 65 20 61 20 22 2a 22 20  or to use a "*" 
7870: 6f 72 0a 23 20 22 61 6c 69 61 73 2e 2a 22 20 65  or.# "alias.*" e
7880: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 73  xpression in a s
7890: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 71 75 65  imple SELECT que
78a0: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
78b0: 20 68 61 76 65 20 61 0a 23 20 46 52 4f 4d 20 63   have a.# FROM c
78c0: 6c 61 75 73 65 2e 0a 23 0a 66 6f 72 65 61 63 68  lause..#.foreach
78d0: 20 7b 74 6e 20 73 65 6c 65 63 74 20 65 72 72 7d   {tn select err}
78e0: 20 7b 0a 20 20 31 2e 31 20 20 22 53 45 4c 45 43   {.  1.1  "SELEC
78f0: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 7a  T a, b, c FROM z
7900: 31 20 57 48 45 52 45 20 2a 22 20 20 20 20 7b 6e  1 WHERE *"    {n
7910: 65 61 72 20 22 2a 22 3a 20 73 79 6e 74 61 78 20  ear "*": syntax 
7920: 65 72 72 6f 72 7d 0a 20 20 31 2e 32 20 20 22 53  error}.  1.2  "S
7930: 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
7940: 4f 4d 20 7a 31 20 47 52 4f 55 50 20 42 59 20 2a  OM z1 GROUP BY *
7950: 22 20 7b 6e 65 61 72 20 22 2a 22 3a 20 73 79 6e  " {near "*": syn
7960: 74 61 78 20 65 72 72 6f 72 7d 0a 20 20 31 2e 33  tax error}.  1.3
7970: 20 20 22 53 45 4c 45 43 54 20 31 20 2b 20 2a 20    "SELECT 1 + * 
7980: 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20 20  FROM z1"        
7990: 20 20 20 20 20 20 7b 6e 65 61 72 20 22 2a 22 3a        {near "*":
79a0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a 20   syntax error}. 
79b0: 20 31 2e 34 20 20 22 53 45 4c 45 43 54 20 2a 20   1.4  "SELECT * 
79c0: 2b 20 31 20 46 52 4f 4d 20 7a 31 22 20 20 20 20  + 1 FROM z1"    
79d0: 20 20 20 20 20 20 20 20 20 20 7b 6e 65 61 72 20            {near 
79e0: 22 2b 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  "+": syntax erro
79f0: 72 7d 0a 0a 20 20 32 2e 31 20 22 53 45 4c 45 43  r}..  2.1 "SELEC
7a00: 54 20 2a 22 20 7b 6e 6f 20 74 61 62 6c 65 73 20  T *" {no tables 
7a10: 73 70 65 63 69 66 69 65 64 7d 0a 20 20 32 2e 32  specified}.  2.2
7a20: 20 22 53 45 4c 45 43 54 20 2a 20 57 48 45 52 45   "SELECT * WHERE
7a30: 20 31 22 20 7b 6e 6f 20 74 61 62 6c 65 73 20 73   1" {no tables s
7a40: 70 65 63 69 66 69 65 64 7d 0a 20 20 32 2e 33 20  pecified}.  2.3 
7a50: 22 53 45 4c 45 43 54 20 2a 20 57 48 45 52 45 20  "SELECT * WHERE 
7a60: 30 22 20 7b 6e 6f 20 74 61 62 6c 65 73 20 73 70  0" {no tables sp
7a70: 65 63 69 66 69 65 64 7d 0a 20 20 32 2e 34 20 22  ecified}.  2.4 "
7a80: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
7a90: 20 2a 22 20 7b 6e 6f 20 74 61 62 6c 65 73 20 73   *" {no tables s
7aa0: 70 65 63 69 66 69 65 64 7d 0a 7d 20 7b 0a 20 20  pecified}.} {.  
7ab0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
7ac0: 20 65 5f 73 65 6c 65 63 74 2d 34 2e 32 2e 24 74   e_select-4.2.$t
7ad0: 6e 20 24 73 65 6c 65 63 74 20 5b 6c 69 73 74 20  n $select [list 
7ae0: 31 20 24 65 72 72 5d 0a 7d 0a 0a 23 20 45 56 49  1 $err].}..# EVI
7af0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 36 36  DENCE-OF: R-0866
7b00: 39 2d 32 32 33 39 37 20 54 68 65 20 6e 75 6d 62  9-22397 The numb
7b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
7b20: 20 74 68 65 20 72 6f 77 73 20 72 65 74 75 72 6e   the rows return
7b30: 65 64 0a 23 20 62 79 20 61 20 73 69 6d 70 6c 65  ed.# by a simple
7b40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7b50: 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  t is equal to th
7b60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
7b70: 65 73 73 69 6f 6e 73 20 69 6e 0a 23 20 74 68 65  essions in.# the
7b80: 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69   result expressi
7b90: 6f 6e 20 6c 69 73 74 20 61 66 74 65 72 20 73 75  on list after su
7ba0: 62 73 74 69 74 75 74 69 6f 6e 20 6f 66 20 2a 20  bstitution of * 
7bb0: 61 6e 64 20 61 6c 69 61 73 2e 2a 0a 23 20 65 78  and alias.*.# ex
7bc0: 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 66 6f 72  pressions..#.for
7bd0: 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20  each {tn select 
7be0: 6e 43 6f 6c 7d 20 7b 0a 20 20 31 20 20 20 22 53  nCol} {.  1   "S
7bf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 7a 31 22  ELECT * FROM z1"
7c00: 20 20 20 33 0a 20 20 32 20 20 20 22 53 45 4c 45     3.  2   "SELE
7c10: 43 54 20 2a 20 46 52 4f 4d 20 7a 31 20 4e 41 54  CT * FROM z1 NAT
7c20: 55 52 41 4c 20 4a 4f 49 4e 20 7a 33 22 20 20 20  URAL JOIN z3"   
7c30: 20 20 20 20 20 20 20 20 20 33 0a 20 20 33 20 20           3.  3  
7c40: 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a 20 46 52   "SELECT z1.* FR
7c50: 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4a 4f  OM z1 NATURAL JO
7c60: 49 4e 20 7a 33 22 20 20 20 20 20 20 20 20 20 33  IN z3"         3
7c70: 0a 20 20 34 20 20 20 22 53 45 4c 45 43 54 20 7a  .  4   "SELECT z
7c80: 33 2e 2a 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55  3.* FROM z1 NATU
7c90: 52 41 4c 20 4a 4f 49 4e 20 7a 33 22 20 20 20 20  RAL JOIN z3"    
7ca0: 20 20 20 20 20 32 0a 20 20 35 20 20 20 22 53 45       2.  5   "SE
7cb0: 4c 45 43 54 20 7a 31 2e 2a 2c 20 7a 33 2e 2a 20  LECT z1.*, z3.* 
7cc0: 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20  FROM z1 NATURAL 
7cd0: 4a 4f 49 4e 20 7a 33 22 20 20 20 35 0a 20 20 36  JOIN z3"   5.  6
7ce0: 20 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c     "SELECT 1, 2,
7cf0: 20 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 22 20 20   z1.* FROM z1"  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 35 0a 20 20 37 20 20 20 22 53 45 4c 45 43 54   5.  7   "SELECT
7d20: 20 61 2c 20 2a 2c 20 62 2c 20 63 20 46 52 4f 4d   a, *, b, c FROM
7d30: 20 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20   z1"            
7d40: 20 20 20 20 20 20 20 36 0a 7d 20 7b 0a 20 20 73         6.} {.  s
7d50: 65 74 20 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74  et ::stmt [sqlit
7d60: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62  e3_prepare_v2 db
7d70: 20 24 73 65 6c 65 63 74 20 2d 31 20 44 55 4d 4d   $select -1 DUMM
7d80: 59 5d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 73  Y].  do_test e_s
7d90: 65 6c 65 63 74 2d 34 2e 33 2e 24 74 6e 20 7b 20  elect-4.3.$tn { 
7da0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
7db0: 6f 75 6e 74 20 24 3a 3a 73 74 6d 74 20 7d 20 24  ount $::stmt } $
7dc0: 6e 43 6f 6c 0a 20 20 73 71 6c 69 74 65 33 5f 66  nCol.  sqlite3_f
7dd0: 69 6e 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74 0a  inalize $::stmt.
7de0: 7d 0a 0a 0a 0a 23 20 49 6e 20 6c 61 6e 67 5f 73  }....# In lang_s
7df0: 65 6c 65 63 74 2e 68 74 6d 6c 2c 20 61 20 6e 6f  elect.html, a no
7e00: 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
7e10: 79 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20  y is defined as 
7e20: 61 6e 79 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  any simple SELEC
7e30: 54 0a 23 20 74 68 61 74 20 68 61 73 20 6e 6f 20  T.# that has no 
7e40: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
7e50: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
7e60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
7e70: 74 68 65 20 72 65 73 75 6c 74 0a 23 20 65 78 70  the result.# exp
7e80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 4f 74  ression list. Ot
7e90: 68 65 72 20 71 75 65 72 69 65 73 20 61 72 65 20  her queries are 
7ea0: 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
7eb0: 73 2e 20 54 65 73 74 20 63 61 73 65 73 0a 23 20  s. Test cases.# 
7ec0: 65 5f 73 65 6c 65 63 74 2d 34 2e 34 2e 2a 20 74  e_select-4.4.* t
7ed0: 68 72 6f 75 67 68 20 65 5f 73 65 6c 65 63 74 2d  hrough e_select-
7ee0: 34 2e 31 32 2e 2a 2c 20 69 6e 63 6c 75 73 69 76  4.12.*, inclusiv
7ef0: 65 2c 20 77 68 69 63 68 20 74 65 73 74 20 74 68  e, which test th
7f00: 65 20 70 61 72 74 20 6f 66 0a 23 20 73 69 6d 70  e part of.# simp
7f10: 6c 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  le SELECT that i
7f20: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
7f30: 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f  aggregate and no
7f40: 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
7f50: 69 65 73 0a 23 20 76 65 72 69 66 79 20 28 69 6e  ies.# verify (in
7f60: 20 61 20 77 61 79 29 20 74 68 61 74 20 74 68 65   a way) that the
7f70: 73 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 61  se definitions a
7f80: 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 3a 0a 23  re consistent:.#
7f90: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7fa0: 52 2d 32 30 36 33 37 2d 34 33 34 36 33 20 41 20  R-20637-43463 A 
7fb0: 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74  simple SELECT st
7fc0: 61 74 65 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  atement is an ag
7fd0: 67 72 65 67 61 74 65 0a 23 20 71 75 65 72 79 20  gregate.# query 
7fe0: 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 65  if it contains e
7ff0: 69 74 68 65 72 20 61 20 47 52 4f 55 50 20 42 59  ither a GROUP BY
8000: 20 63 6c 61 75 73 65 20 6f 72 20 6f 6e 65 20 6f   clause or one o
8010: 72 20 6d 6f 72 65 20 61 67 67 72 65 67 61 74 65  r more aggregate
8020: 0a 23 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  .# functions in 
8030: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2e 0a  the result-set..
8040: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
8050: 20 52 2d 32 33 31 35 35 2d 35 35 35 39 37 20 4f   R-23155-55597 O
8060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 73  therwise, if a s
8070: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 63 6f 6e  imple SELECT con
8080: 74 61 69 6e 73 20 6e 6f 0a 23 20 61 67 67 72 65  tains no.# aggre
8090: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
80a0: 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
80b0: 75 73 65 2c 20 69 74 20 69 73 20 61 20 6e 6f 6e  use, it is a non
80c0: 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79  -aggregate query
80d0: 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ..#..# EVIDENCE-
80e0: 4f 46 3a 20 52 2d 34 34 30 35 30 2d 34 37 33 36  OF: R-44050-4736
80f0: 32 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  2 If the SELECT 
8100: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 6e  statement is a n
8110: 6f 6e 2d 61 67 67 72 65 67 61 74 65 0a 23 20 71  on-aggregate.# q
8120: 75 65 72 79 2c 20 74 68 65 6e 20 65 61 63 68 20  uery, then each 
8130: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
8140: 65 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73  e result express
8150: 69 6f 6e 20 6c 69 73 74 20 69 73 20 65 76 61 6c  ion list is eval
8160: 75 61 74 65 64 0a 23 20 66 6f 72 20 65 61 63 68  uated.# for each
8170: 20 72 6f 77 20 69 6e 20 74 68 65 20 64 61 74 61   row in the data
8180: 73 65 74 20 66 69 6c 74 65 72 65 64 20 62 79 20  set filtered by 
8190: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
81a0: 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
81b0: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 34  sts e_select-4.4
81c0: 20 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 61   {.  1 "SELECT a
81d0: 2c 20 62 20 46 52 4f 4d 20 7a 31 22 0a 20 20 20  , b FROM z1".   
81e0: 20 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 2d   {51.65 -59.58 -
81f0: 35 20 7b 7d 20 2d 32 2e 32 20 2d 32 33 2e 31 38  5 {} -2.2 -23.18
8200: 20 7b 7d 20 36 37 20 2d 31 2e 30 34 20 2d 33 32   {} 67 -1.04 -32
8210: 2e 33 20 36 33 20 62 6f 72 6e 7d 0a 0a 20 20 32  .3 63 born}..  2
8220: 20 22 53 45 4c 45 43 54 20 61 20 49 53 20 4e 55   "SELECT a IS NU
8230: 4c 4c 2c 20 62 2b 31 2c 20 2a 20 46 52 4f 4d 20  LL, b+1, * FROM 
8240: 7a 31 22 20 7b 0a 20 20 20 20 20 20 20 20 30 20  z1" {.        0 
8250: 2d 35 38 2e 35 38 20 20 20 35 31 2e 36 35 20 2d  -58.58   51.65 -
8260: 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73 0a 20  59.58 belfries. 
8270: 20 20 20 20 20 20 20 30 20 7b 7d 20 20 20 20 20         0 {}     
8280: 20 20 2d 35 20 7b 7d 20 37 35 20 20 20 20 20 20    -5 {} 75      
8290: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 30        .        0
82a0: 20 2d 32 32 2e 31 38 20 20 20 2d 32 2e 32 20 2d   -22.18   -2.2 -
82b0: 32 33 2e 31 38 20 73 75 69 74 65 72 73 0a 20 20  23.18 suiters.  
82c0: 20 20 20 20 20 20 31 20 36 38 20 20 20 20 20 20        1 68      
82d0: 20 7b 7d 20 36 37 20 71 75 61 72 74 65 74 73 20   {} 67 quartets 
82e0: 20 20 20 0a 20 20 20 20 20 20 20 20 30 20 2d 33     .        0 -3
82f0: 31 2e 33 20 20 20 20 2d 31 2e 30 34 20 2d 33 32  1.3    -1.04 -32
8300: 2e 33 20 61 73 70 65 6e 0a 20 20 20 20 20 20 20  .3 aspen.       
8310: 20 30 20 31 20 20 20 20 20 20 20 20 36 33 20 62   0 1        63 b
8320: 6f 72 6e 20 2d 32 36 0a 20 20 7d 0a 0a 20 20 33  orn -26.  }..  3
8330: 20 22 53 45 4c 45 43 54 20 33 32 2a 33 32 2c 20   "SELECT 32*32, 
8340: 64 7c 7c 65 20 46 52 4f 4d 20 7a 32 22 20 7b 31  d||e FROM z2" {1
8350: 30 32 34 20 7b 7d 20 31 30 32 34 20 33 36 36 7d  024 {} 1024 366}
8360: 0a 7d 0a 0a 0a 23 20 54 65 73 74 20 63 61 73 65  .}...# Test case
8370: 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 35 2e 2a  s e_select-4.5.*
8380: 20 61 6e 64 20 65 5f 73 65 6c 65 63 74 2d 34 2e   and e_select-4.
8390: 36 2e 2a 20 74 6f 67 65 74 68 65 72 20 73 68 6f  6.* together sho
83a0: 77 20 74 68 61 74 3a 0a 23 0a 23 20 45 56 49 44  w that:.#.# EVID
83b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 39 38 38  ENCE-OF: R-51988
83c0: 2d 30 31 31 32 34 20 54 68 65 20 73 69 6e 67 6c  -01124 The singl
83d0: 65 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2d  e row of result-
83e0: 73 65 74 20 64 61 74 61 20 63 72 65 61 74 65 64  set data created
83f0: 0a 23 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67  .# by evaluating
8400: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
8410: 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
8420: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
8430: 74 68 65 0a 23 20 72 65 73 75 6c 74 2d 73 65 74  the.# result-set
8440: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
8450: 74 20 6f 66 20 61 6e 20 61 67 67 72 65 67 61 74  t of an aggregat
8460: 65 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  e query without 
8470: 61 20 47 52 4f 55 50 20 42 59 0a 23 20 63 6c 61  a GROUP BY.# cla
8480: 75 73 65 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e  use..#..# EVIDEN
8490: 43 45 2d 4f 46 3a 20 52 2d 35 37 36 32 39 2d 32  CE-OF: R-57629-2
84a0: 35 32 35 33 20 49 66 20 74 68 65 20 53 45 4c 45  5253 If the SELE
84b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
84c0: 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20 71  an aggregate.# q
84d0: 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 20 47  uery without a G
84e0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20  ROUP BY clause, 
84f0: 74 68 65 6e 20 65 61 63 68 20 61 67 67 72 65 67  then each aggreg
8500: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ate expression i
8510: 6e 20 74 68 65 0a 23 20 72 65 73 75 6c 74 2d 73  n the.# result-s
8520: 65 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  et is evaluated 
8530: 6f 6e 63 65 20 61 63 72 6f 73 73 20 74 68 65 20  once across the 
8540: 65 6e 74 69 72 65 20 64 61 74 61 73 65 74 2e 0a  entire dataset..
8550: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
8560: 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 35 20 7b  s e_select-4.5 {
8570: 0a 20 20 31 20 22 53 45 4c 45 43 54 20 63 6f 75  .  1 "SELECT cou
8580: 6e 74 28 61 29 2c 20 6d 61 78 28 61 29 2c 20 63  nt(a), max(a), c
8590: 6f 75 6e 74 28 62 29 2c 20 6d 61 78 28 62 29 20  ount(b), max(b) 
85a0: 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 7b 35  FROM z1"      {5
85b0: 20 36 33 20 35 20 62 6f 72 6e 7d 0a 20 20 32 20   63 5 born}.  2 
85c0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
85d0: 2c 20 6d 61 78 28 31 29 22 20 20 20 20 20 20 20  , max(1)"       
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 20 20 20 20 20 7b 31 20 31 7d 0a 0a           {1 1}..
8600: 20 20 33 20 22 53 45 4c 45 43 54 20 73 75 6d 28    3 "SELECT sum(
8610: 62 2b 31 29 20 46 52 4f 4d 20 7a 31 20 4e 41 54  b+1) FROM z1 NAT
8620: 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 7a  URAL LEFT JOIN z
8630: 33 22 20 20 20 20 20 20 20 20 20 20 20 7b 2d 34  3"           {-4
8640: 33 2e 30 36 7d 0a 20 20 34 20 22 53 45 4c 45 43  3.06}.  4 "SELEC
8650: 54 20 73 75 6d 28 62 2b 32 29 20 46 52 4f 4d 20  T sum(b+2) FROM 
8660: 7a 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  z1 NATURAL LEFT 
8670: 4a 4f 49 4e 20 7a 33 22 20 20 20 20 20 20 20 20  JOIN z3"        
8680: 20 20 20 7b 2d 33 38 2e 30 36 7d 0a 20 20 35 20     {-38.06}.  5 
8690: 22 53 45 4c 45 43 54 20 73 75 6d 28 62 20 49 53  "SELECT sum(b IS
86a0: 20 4e 4f 54 20 4e 55 4c 4c 29 20 46 52 4f 4d 20   NOT NULL) FROM 
86b0: 7a 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  z1 NATURAL LEFT 
86c0: 4a 4f 49 4e 20 7a 33 22 20 7b 35 7d 0a 7d 0a 0a  JOIN z3" {5}.}..
86d0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
86e0: 2d 32 36 36 38 34 2d 34 30 35 37 36 20 45 61 63  -26684-40576 Eac
86f0: 68 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  h non-aggregate 
8700: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
8710: 65 0a 23 20 72 65 73 75 6c 74 2d 73 65 74 20 69  e.# result-set i
8720: 73 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  s evaluated once
8730: 20 66 6f 72 20 61 6e 20 61 72 62 69 74 72 61 72   for an arbitrar
8740: 69 6c 79 20 73 65 6c 65 63 74 65 64 20 72 6f 77  ily selected row
8750: 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61 73 65   of the.# datase
8760: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
8770: 4f 46 3a 20 52 2d 32 37 39 39 34 2d 36 30 33 37  OF: R-27994-6037
8780: 36 20 54 68 65 20 73 61 6d 65 20 61 72 62 69 74  6 The same arbit
8790: 72 61 72 69 6c 79 20 73 65 6c 65 63 74 65 64 20  rarily selected 
87a0: 72 6f 77 20 69 73 20 75 73 65 64 0a 23 20 66 6f  row is used.# fo
87b0: 72 20 65 61 63 68 20 6e 6f 6e 2d 61 67 67 72 65  r each non-aggre
87c0: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  gate expression.
87d0: 0a 23 0a 23 20 20 20 4e 6f 74 65 3a 20 54 68 65  .#.#   Note: The
87e0: 20 72 65 73 75 6c 74 73 20 6f 66 20 6d 61 6e 79   results of many
87f0: 20 6f 66 20 74 68 65 20 71 75 65 72 69 65 73 20   of the queries 
8800: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f 66  in this block of
8810: 20 74 65 73 74 73 20 61 72 65 0a 23 20 20 20 74   tests are.#   t
8820: 65 63 68 6e 69 63 61 6c 6c 79 20 75 6e 64 65 66  echnically undef
8830: 69 6e 65 64 2c 20 61 73 20 74 68 65 20 64 6f 63  ined, as the doc
8840: 75 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  umentation does 
8850: 6e 6f 74 20 73 70 65 63 69 66 79 20 77 68 69 63  not specify whic
8860: 68 20 72 6f 77 0a 23 20 20 20 53 51 4c 69 74 65  h row.#   SQLite
8870: 20 77 69 6c 6c 20 61 72 62 69 74 72 61 72 69 6c   will arbitraril
8880: 79 20 73 65 6c 65 63 74 20 74 6f 20 75 73 65 20  y select to use 
8890: 66 6f 72 20 74 68 65 20 65 76 61 6c 75 61 74 69  for the evaluati
88a0: 6f 6e 20 6f 66 20 74 68 65 0a 23 20 20 20 6e 6f  on of the.#   no
88b0: 6e 2d 61 67 67 72 65 67 61 74 65 20 65 78 70 72  n-aggregate expr
88c0: 65 73 73 69 6f 6e 73 2e 0a 23 0a 64 72 6f 70 5f  essions..#.drop_
88d0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78  all_tables.do_ex
88e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
88f0: 65 63 74 2d 34 2e 36 2e 30 20 7b 0a 20 20 43 52  ect-4.6.0 {.  CR
8900: 45 41 54 45 20 54 41 42 4c 45 20 61 31 28 6f 6e  EATE TABLE a1(on
8910: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  e PRIMARY KEY, t
8920: 77 6f 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  wo);.  INSERT IN
8930: 54 4f 20 61 31 20 56 41 4c 55 45 53 28 31 2c 20  TO a1 VALUES(1, 
8940: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
8950: 4f 20 61 31 20 56 41 4c 55 45 53 28 32 2c 20 33  O a1 VALUES(2, 3
8960: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
8970: 20 61 31 20 56 41 4c 55 45 53 28 33 2c 20 36 29   a1 VALUES(3, 6)
8980: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
8990: 61 31 20 56 41 4c 55 45 53 28 34 2c 20 31 30 29  a1 VALUES(4, 10)
89a0: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
89b0: 45 20 61 32 28 6f 6e 65 20 50 52 49 4d 41 52 59  E a2(one PRIMARY
89c0: 20 4b 45 59 2c 20 74 68 72 65 65 29 3b 0a 20 20   KEY, three);.  
89d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 32 20 56  INSERT INTO a2 V
89e0: 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 49  ALUES(1, 1);.  I
89f0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 32 20 56 41  NSERT INTO a2 VA
8a00: 4c 55 45 53 28 33 2c 20 32 29 3b 0a 20 20 49 4e  LUES(3, 2);.  IN
8a10: 53 45 52 54 20 49 4e 54 4f 20 61 32 20 56 41 4c  SERT INTO a2 VAL
8a20: 55 45 53 28 36 2c 20 33 29 3b 0a 20 20 49 4e 53  UES(6, 3);.  INS
8a30: 45 52 54 20 49 4e 54 4f 20 61 32 20 56 41 4c 55  ERT INTO a2 VALU
8a40: 45 53 28 31 30 2c 20 34 29 3b 0a 7d 20 7b 7d 0a  ES(10, 4);.} {}.
8a50: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
8a60: 65 5f 73 65 6c 65 63 74 2d 34 2e 36 20 7b 0a 20  e_select-4.6 {. 
8a70: 20 31 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20   1 "SELECT one, 
8a80: 74 77 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  two, count(*) FR
8a90: 4f 4d 20 61 31 22 20 20 20 20 20 20 20 20 20 20  OM a1"          
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
8ab0: 20 31 20 34 7d 0a 20 20 32 20 22 53 45 4c 45 43   1 4}.  2 "SELEC
8ac0: 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f 75 6e  T one, two, coun
8ad0: 74 28 2a 29 20 46 52 4f 4d 20 61 31 20 57 48 45  t(*) FROM a1 WHE
8ae0: 52 45 20 6f 6e 65 3c 33 22 20 20 20 20 20 20 20  RE one<3"       
8af0: 20 20 20 20 20 7b 31 20 31 20 32 7d 0a 20 20 33       {1 1 2}.  3
8b00: 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20 74 77   "SELECT one, tw
8b10: 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  o, count(*) FROM
8b20: 20 61 31 20 57 48 45 52 45 20 6f 6e 65 3e 33 22   a1 WHERE one>3"
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 34 20 31              {4 1
8b40: 30 20 31 7d 20 0a 20 20 34 20 22 53 45 4c 45 43  0 1} .  4 "SELEC
8b50: 54 20 2a 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T *, count(*) FR
8b60: 4f 4d 20 61 31 20 4a 4f 49 4e 20 61 32 22 20 20  OM a1 JOIN a2"  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 20 20 7b 31 20 31 20 31 20 31 20 31 36       {1 1 1 1 16
8b90: 7d 0a 20 20 35 20 22 53 45 4c 45 43 54 20 2a 2c  }.  5 "SELECT *,
8ba0: 20 73 75 6d 28 74 68 72 65 65 29 20 46 52 4f 4d   sum(three) FROM
8bb0: 20 61 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   a1 NATURAL JOIN
8bc0: 20 61 32 22 20 20 20 20 20 20 20 20 20 20 20 20   a2"            
8bd0: 20 7b 31 20 31 20 31 20 33 7d 0a 20 20 36 20 22   {1 1 1 3}.  6 "
8be0: 53 45 4c 45 43 54 20 2a 2c 20 73 75 6d 28 74 68  SELECT *, sum(th
8bf0: 72 65 65 29 20 46 52 4f 4d 20 61 31 20 4e 41 54  ree) FROM a1 NAT
8c00: 55 52 41 4c 20 4a 4f 49 4e 20 61 32 22 20 20 20  URAL JOIN a2"   
8c10: 20 20 20 20 20 20 20 20 20 20 7b 31 20 31 20 31            {1 1 1
8c20: 20 33 7d 0a 20 20 37 20 22 53 45 4c 45 43 54 20   3}.  7 "SELECT 
8c30: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 74 68 72  group_concat(thr
8c40: 65 65 2c 20 27 27 29 2c 20 61 31 2e 2a 20 46 52  ee, ''), a1.* FR
8c50: 4f 4d 20 61 31 20 4e 41 54 55 52 41 4c 20 4a 4f  OM a1 NATURAL JO
8c60: 49 4e 20 61 32 22 20 7b 31 32 20 31 20 31 7d 0a  IN a2" {12 1 1}.
8c70: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
8c80: 3a 20 52 2d 30 34 34 38 36 2d 30 37 32 36 36 20  : R-04486-07266 
8c90: 4f 72 2c 20 69 66 20 74 68 65 20 64 61 74 61 73  Or, if the datas
8ca0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  et contains zero
8cb0: 20 72 6f 77 73 2c 20 74 68 65 6e 0a 23 20 65 61   rows, then.# ea
8cc0: 63 68 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  ch non-aggregate
8cd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
8ce0: 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74  valuated against
8cf0: 20 61 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e   a row consistin
8d00: 67 0a 23 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  g.# entirely of 
8d10: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 64  NULL values..#.d
8d20: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
8d30: 5f 73 65 6c 65 63 74 2d 34 2e 37 20 7b 0a 20 20  _select-4.7 {.  
8d40: 31 20 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20  1  "SELECT one, 
8d50: 74 77 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  two, count(*) FR
8d60: 4f 4d 20 61 31 20 57 48 45 52 45 20 30 22 20 20  OM a1 WHERE 0"  
8d70: 20 20 20 20 20 20 20 20 20 7b 7b 7d 20 7b 7d 20           {{} {} 
8d80: 30 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20  0}.  2  "SELECT 
8d90: 73 75 6d 28 74 77 6f 29 2c 20 2a 20 46 52 4f 4d  sum(two), * FROM
8da0: 20 61 31 2c 20 61 32 20 57 48 45 52 45 20 74 68   a1, a2 WHERE th
8db0: 72 65 65 3e 35 22 20 20 20 20 20 20 20 20 7b 7b  ree>5"        {{
8dc0: 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20  } {} {} {} {}}. 
8dd0: 20 33 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28   3  "SELECT max(
8de0: 6f 6e 65 29 20 49 53 20 4e 55 4c 4c 2c 20 6f 6e  one) IS NULL, on
8df0: 65 20 49 53 20 4e 55 4c 4c 2c 20 74 77 6f 20 49  e IS NULL, two I
8e00: 53 20 4e 55 4c 4c 20 46 52 4f 4d 20 61 31 20 57  S NULL FROM a1 W
8e10: 48 45 52 45 20 74 77 6f 3d 37 22 20 7b 0a 20 20  HERE two=7" {.  
8e20: 20 20 31 20 31 20 31 0a 20 20 7d 0a 7d 20 0a 0a    1 1 1.  }.} ..
8e30: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8e40: 2d 36 34 31 33 38 2d 32 38 37 37 34 20 41 6e 20  -64138-28774 An 
8e50: 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
8e60: 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
8e70: 42 59 0a 23 20 63 6c 61 75 73 65 20 61 6c 77 61  BY.# clause alwa
8e80: 79 73 20 72 65 74 75 72 6e 73 20 65 78 61 63 74  ys returns exact
8e90: 6c 79 20 6f 6e 65 20 72 6f 77 20 6f 66 20 64 61  ly one row of da
8ea0: 74 61 2c 20 65 76 65 6e 20 69 66 20 74 68 65 72  ta, even if ther
8eb0: 65 20 61 72 65 20 7a 65 72 6f 0a 23 20 72 6f 77  e are zero.# row
8ec0: 73 20 6f 66 20 69 6e 70 75 74 20 64 61 74 61 2e  s of input data.
8ed0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .#.foreach {tn s
8ee0: 65 6c 65 63 74 7d 20 7b 0a 20 20 38 2e 31 20 20  elect} {.  8.1  
8ef0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
8f00: 20 46 52 4f 4d 20 61 31 22 0a 20 20 38 2e 32 20   FROM a1".  8.2 
8f10: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
8f20: 29 20 46 52 4f 4d 20 61 31 20 57 48 45 52 45 20  ) FROM a1 WHERE 
8f30: 30 22 0a 20 20 38 2e 33 20 20 22 53 45 4c 45 43  0".  8.3  "SELEC
8f40: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
8f50: 61 31 20 57 48 45 52 45 20 31 22 0a 20 20 38 2e  a1 WHERE 1".  8.
8f60: 34 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61  4  "SELECT max(a
8f70: 31 2e 6f 6e 65 29 2b 6d 69 6e 28 74 77 6f 29 2c  1.one)+min(two),
8f80: 20 61 31 2e 6f 6e 65 2c 20 74 77 6f 2c 20 2a 20   a1.one, two, * 
8f90: 46 52 4f 4d 20 61 31 2c 20 61 32 20 57 48 45 52  FROM a1, a2 WHER
8fa0: 45 20 31 22 0a 20 20 38 2e 35 20 20 22 53 45 4c  E 1".  8.5  "SEL
8fb0: 45 43 54 20 6d 61 78 28 61 31 2e 6f 6e 65 29 2b  ECT max(a1.one)+
8fc0: 6d 69 6e 28 74 77 6f 29 2c 20 61 31 2e 6f 6e 65  min(two), a1.one
8fd0: 2c 20 74 77 6f 2c 20 2a 20 46 52 4f 4d 20 61 31  , two, * FROM a1
8fe0: 2c 20 61 32 20 57 48 45 52 45 20 30 22 0a 7d 20  , a2 WHERE 0".} 
8ff0: 7b 0a 20 20 23 20 53 65 74 20 24 6e 52 6f 77 20  {.  # Set $nRow 
9000: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9010: 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62   rows returned b
9020: 79 20 24 73 65 6c 65 63 74 3a 0a 20 20 73 65 74  y $select:.  set
9030: 20 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74 65 33   ::stmt [sqlite3
9040: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 24  _prepare_v2 db $
9050: 73 65 6c 65 63 74 20 2d 31 20 44 55 4d 4d 59 5d  select -1 DUMMY]
9060: 0a 20 20 73 65 74 20 6e 52 6f 77 20 30 0a 20 20  .  set nRow 0.  
9070: 77 68 69 6c 65 20 7b 22 53 51 4c 49 54 45 5f 52  while {"SQLITE_R
9080: 4f 57 22 20 3d 3d 20 5b 73 71 6c 69 74 65 33 5f  OW" == [sqlite3_
9090: 73 74 65 70 20 24 3a 3a 73 74 6d 74 5d 7d 20 7b  step $::stmt]} {
90a0: 20 69 6e 63 72 20 6e 52 6f 77 20 7d 0a 20 20 73   incr nRow }.  s
90b0: 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66  et rc [sqlite3_f
90c0: 69 6e 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74 5d  inalize $::stmt]
90d0: 0a 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20  ..  # Test that 
90e0: 24 6e 52 6f 77 3d 3d 31 20 61 6e 64 20 74 68 61  $nRow==1 and tha
90f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63  t statement exec
9100: 75 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ution was succes
9110: 73 66 75 6c 20 0a 20 20 23 20 28 72 63 3d 3d 53  sful .  # (rc==S
9120: 51 4c 49 54 45 5f 4f 4b 29 2e 0a 20 20 64 6f 5f  QLITE_OK)..  do_
9130: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e  test e_select-4.
9140: 24 74 6e 20 5b 6c 69 73 74 20 6c 69 73 74 20 24  $tn [list list $
9150: 72 63 20 24 6e 52 6f 77 5d 20 7b 53 51 4c 49 54  rc $nRow] {SQLIT
9160: 45 5f 4f 4b 20 31 7d 0a 7d 0a 0a 64 72 6f 70 5f  E_OK 1}.}..drop_
9170: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78  all_tables.do_ex
9180: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
9190: 65 63 74 2d 34 2e 39 2e 30 20 7b 0a 20 20 43 52  ect-4.9.0 {.  CR
91a0: 45 41 54 45 20 54 41 42 4c 45 20 62 31 28 6f 6e  EATE TABLE b1(on
91b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  e PRIMARY KEY, t
91c0: 77 6f 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  wo);.  INSERT IN
91d0: 54 4f 20 62 31 20 56 41 4c 55 45 53 28 31 2c 20  TO b1 VALUES(1, 
91e0: 27 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'o');.  INSERT I
91f0: 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 34 2c  NTO b1 VALUES(4,
9200: 20 27 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'f');.  INSERT 
9210: 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 33  INTO b1 VALUES(3
9220: 2c 20 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 't');.  INSERT
9230: 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28   INTO b1 VALUES(
9240: 32 2c 20 27 74 27 29 3b 0a 20 20 49 4e 53 45 52  2, 't');.  INSER
9250: 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53  T INTO b1 VALUES
9260: 28 35 2c 20 27 66 27 29 3b 0a 20 20 49 4e 53 45  (5, 'f');.  INSE
9270: 52 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  RT INTO b1 VALUE
9280: 53 28 37 2c 20 27 73 27 29 3b 0a 20 20 49 4e 53  S(7, 's');.  INS
9290: 45 52 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55  ERT INTO b1 VALU
92a0: 45 53 28 36 2c 20 27 73 27 29 3b 0a 0a 20 20 43  ES(6, 's');..  C
92b0: 52 45 41 54 45 20 54 41 42 4c 45 20 62 32 28 78  REATE TABLE b2(x
92c0: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
92d0: 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28 4e 55  NTO b2 VALUES(NU
92e0: 4c 4c 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54  LL, 0);.  INSERT
92f0: 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28   INTO b2 VALUES(
9300: 4e 55 4c 4c 2c 20 31 29 3b 0a 20 20 49 4e 53 45  NULL, 1);.  INSE
9310: 52 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45  RT INTO b2 VALUE
9320: 53 28 27 78 79 7a 27 2c 20 32 29 3b 0a 20 20 49  S('xyz', 2);.  I
9330: 4e 53 45 52 54 20 49 4e 54 4f 20 62 32 20 56 41  NSERT INTO b2 VA
9340: 4c 55 45 53 28 27 61 62 63 27 2c 20 33 29 3b 0a  LUES('abc', 3);.
9350: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 32    INSERT INTO b2
9360: 20 56 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 34   VALUES('xyz', 4
9370: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
9380: 4c 45 20 62 33 28 61 20 43 4f 4c 4c 41 54 45 20  LE b3(a COLLATE 
9390: 6e 6f 63 61 73 65 2c 20 62 20 43 4f 4c 4c 41 54  nocase, b COLLAT
93a0: 45 20 62 69 6e 61 72 79 29 3b 0a 20 20 49 4e 53  E binary);.  INS
93b0: 45 52 54 20 49 4e 54 4f 20 62 33 20 56 41 4c 55  ERT INTO b3 VALU
93c0: 45 53 28 27 61 62 63 27 2c 20 27 61 62 63 27 29  ES('abc', 'abc')
93d0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
93e0: 62 33 20 56 41 4c 55 45 53 28 27 61 42 43 27 2c  b3 VALUES('aBC',
93f0: 20 27 61 42 43 27 29 3b 0a 20 20 49 4e 53 45 52   'aBC');.  INSER
9400: 54 20 49 4e 54 4f 20 62 33 20 56 41 4c 55 45 53  T INTO b3 VALUES
9410: 28 27 44 65 66 27 2c 20 27 44 65 66 27 29 3b 0a  ('Def', 'Def');.
9420: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 33    INSERT INTO b3
9430: 20 56 41 4c 55 45 53 28 27 64 45 46 27 2c 20 27   VALUES('dEF', '
9440: 64 45 46 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45  dEF');.} {}..# E
9450: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
9460: 32 38 34 2d 33 35 39 39 30 20 49 66 20 74 68 65  284-35990 If the
9470: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9480: 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
9490: 65 0a 23 20 71 75 65 72 79 20 77 69 74 68 20 61  e.# query with a
94a0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
94b0: 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 20 74  , then each of t
94c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73  he expressions s
94d0: 70 65 63 69 66 69 65 64 0a 23 20 61 73 20 70 61  pecified.# as pa
94e0: 72 74 20 6f 66 20 74 68 65 20 47 52 4f 55 50 20  rt of the GROUP 
94f0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 65 76 61  BY clause is eva
9500: 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
9510: 72 6f 77 20 6f 66 20 74 68 65 0a 23 20 64 61 74  row of the.# dat
9520: 61 73 65 74 2e 20 45 61 63 68 20 72 6f 77 20 69  aset. Each row i
9530: 73 20 74 68 65 6e 20 61 73 73 69 67 6e 65 64 20  s then assigned 
9540: 74 6f 20 61 20 22 67 72 6f 75 70 22 20 62 61 73  to a "group" bas
9550: 65 64 20 6f 6e 20 74 68 65 20 72 65 73 75 6c 74  ed on the result
9560: 73 3b 0a 23 20 72 6f 77 73 20 66 6f 72 20 77 68  s;.# rows for wh
9570: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ich the results 
9580: 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  of evaluating th
9590: 65 20 47 52 4f 55 50 20 42 59 20 65 78 70 72 65  e GROUP BY expre
95a0: 73 73 69 6f 6e 73 20 61 72 65 0a 23 20 74 68 65  ssions are.# the
95b0: 20 73 61 6d 65 20 67 65 74 20 61 73 73 69 67 6e   same get assign
95c0: 65 64 20 74 6f 20 74 68 65 20 73 61 6d 65 20 67  ed to the same g
95d0: 72 6f 75 70 2e 0a 23 0a 23 20 20 20 54 68 65 73  roup..#.#   Thes
95e0: 65 20 74 65 73 74 73 20 61 6c 73 6f 20 73 68 6f  e tests also sho
95f0: 77 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f  w that the follo
9600: 77 69 6e 67 20 69 73 20 6e 6f 74 20 75 6e 74 72  wing is not untr
9610: 75 65 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ue:.#.# EVIDENCE
9620: 2d 4f 46 3a 20 52 2d 32 35 38 38 33 2d 35 35 30  -OF: R-25883-550
9630: 36 33 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  63 The expressio
9640: 6e 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ns in the GROUP 
9650: 42 59 20 63 6c 61 75 73 65 20 64 6f 0a 23 20 6e  BY clause do.# n
9660: 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20 65 78  ot have to be ex
9670: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
9680: 70 70 65 61 72 20 69 6e 20 74 68 65 20 72 65 73  ppear in the res
9690: 75 6c 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  ult..#.do_select
96a0: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
96b0: 34 2e 39 20 7b 0a 20 20 31 20 20 22 53 45 4c 45  4.9 {.  1  "SELE
96c0: 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
96d0: 6f 6e 65 29 2c 20 74 77 6f 20 46 52 4f 4d 20 62  one), two FROM b
96e0: 31 20 47 52 4f 55 50 20 42 59 20 74 77 6f 22 20  1 GROUP BY two" 
96f0: 7b 0a 20 20 20 20 2f 23 2c 23 20 66 20 20 20 31  {.    /#,# f   1
9700: 20 6f 20 20 20 23 2c 23 20 20 20 73 20 23 2c 23   o   #,#   s #,#
9710: 20 74 2f 0a 20 20 7d 0a 20 20 32 20 20 22 53 45   t/.  }.  2  "SE
9720: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
9730: 74 28 6f 6e 65 29 2c 20 73 75 6d 28 6f 6e 65 29  t(one), sum(one)
9740: 20 46 52 4f 4d 20 62 31 20 47 52 4f 55 50 20 42   FROM b1 GROUP B
9750: 59 20 28 6f 6e 65 3e 34 29 22 20 7b 0a 20 20 20  Y (one>4)" {.   
9760: 20 31 2c 32 2c 33 2c 34 20 31 30 20 20 20 20 35   1,2,3,4 10    5
9770: 2c 36 2c 37 20 31 38 0a 20 20 7d 0a 20 20 33 20  ,6,7 18.  }.  3 
9780: 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   "SELECT group_c
9790: 6f 6e 63 61 74 28 6f 6e 65 29 20 46 52 4f 4d 20  oncat(one) FROM 
97a0: 62 31 20 47 52 4f 55 50 20 42 59 20 28 74 77 6f  b1 GROUP BY (two
97b0: 3e 27 6f 27 29 2c 20 6f 6e 65 25 32 22 20 7b 0a  >'o'), one%2" {.
97c0: 20 20 20 20 34 20 20 31 2c 35 20 20 20 20 32 2c      4  1,5    2,
97d0: 36 20 20 20 33 2c 37 0a 20 20 7d 0a 20 20 34 20  6   3,7.  }.  4 
97e0: 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   "SELECT group_c
97f0: 6f 6e 63 61 74 28 6f 6e 65 29 20 46 52 4f 4d 20  oncat(one) FROM 
9800: 62 31 20 47 52 4f 55 50 20 42 59 20 28 6f 6e 65  b1 GROUP BY (one
9810: 3d 3d 32 20 4f 52 20 74 77 6f 3d 3d 27 6f 27 29  ==2 OR two=='o')
9820: 22 20 7b 0a 20 20 20 20 34 2c 33 2c 35 2c 37 2c  " {.    4,3,5,7,
9830: 36 20 20 20 20 31 2c 32 0a 20 20 7d 0a 7d 0a 0a  6    1,2.  }.}..
9840: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9850: 2d 31 34 39 32 36 2d 35 30 31 32 39 20 46 6f 72  -14926-50129 For
9860: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
9870: 20 67 72 6f 75 70 69 6e 67 20 72 6f 77 73 2c 20   grouping rows, 
9880: 4e 55 4c 4c 0a 23 20 76 61 6c 75 65 73 20 61 72  NULL.# values ar
9890: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
98a0: 61 6c 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  al..#.do_select_
98b0: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34  tests e_select-4
98c0: 2e 31 30 20 7b 0a 20 20 31 20 20 22 53 45 4c 45  .10 {.  1  "SELE
98d0: 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
98e0: 79 29 20 46 52 4f 4d 20 62 32 20 47 52 4f 55 50  y) FROM b2 GROUP
98f0: 20 42 59 20 78 22 20 7b 2f 23 2c 23 20 20 20 33   BY x" {/#,#   3
9900: 20 20 20 23 2c 23 2f 7d 0a 20 20 32 20 20 22 53     #,#/}.  2  "S
9910: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9920: 52 4f 4d 20 62 32 20 47 52 4f 55 50 20 42 59 20  ROM b2 GROUP BY 
9930: 43 41 53 45 20 57 48 45 4e 20 79 3c 34 20 54 48  CASE WHEN y<4 TH
9940: 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 30 20 45  EN NULL ELSE 0 E
9950: 4e 44 22 20 7b 34 20 31 7d 0a 7d 20 0a 0a 23 20  ND" {4 1}.} ..# 
9960: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
9970: 30 34 37 30 2d 33 30 33 31 38 20 54 68 65 20 75  0470-30318 The u
9980: 73 75 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 73  sual rules for s
9990: 65 6c 65 63 74 69 6e 67 20 61 20 63 6f 6c 6c 61  electing a colla
99a0: 74 69 6f 6e 0a 23 20 73 65 71 75 65 6e 63 65 20  tion.# sequence 
99b0: 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
99c0: 6d 70 61 72 65 20 74 65 78 74 20 76 61 6c 75 65  mpare text value
99d0: 73 20 61 70 70 6c 79 20 77 68 65 6e 20 65 76 61  s apply when eva
99e0: 6c 75 61 74 69 6e 67 0a 23 20 65 78 70 72 65 73  luating.# expres
99f0: 73 69 6f 6e 73 20 69 6e 20 61 20 47 52 4f 55 50  sions in a GROUP
9a00: 20 42 59 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f   BY clause..#.do
9a10: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
9a20: 73 65 6c 65 63 74 2d 34 2e 31 31 20 7b 0a 20 20  select-4.11 {.  
9a30: 31 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  1  "SELECT count
9a40: 28 2a 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55  (*) FROM b3 GROU
9a50: 50 20 42 59 20 62 22 20 20 20 20 20 20 7b 31 20  P BY b"      {1 
9a60: 31 20 31 20 31 7d 0a 20 20 32 20 20 22 53 45 4c  1 1 1}.  2  "SEL
9a70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9a80: 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20 61 22  M b3 GROUP BY a"
9a90: 20 20 20 20 20 20 7b 32 20 32 7d 0a 20 20 33 20        {2 2}.  3 
9aa0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
9ab0: 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55 50 20  ) FROM b3 GROUP 
9ac0: 42 59 20 2b 62 22 20 20 20 20 20 7b 31 20 31 20  BY +b"     {1 1 
9ad0: 31 20 31 7d 0a 20 20 34 20 20 22 53 45 4c 45 43  1 1}.  4  "SELEC
9ae0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9af0: 62 33 20 47 52 4f 55 50 20 42 59 20 2b 61 22 20  b3 GROUP BY +a" 
9b00: 20 20 20 20 7b 32 20 32 7d 0a 20 20 35 20 20 22      {2 2}.  5  "
9b10: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9b20: 46 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59  FROM b3 GROUP BY
9b30: 20 62 7c 7c 27 27 22 20 20 7b 31 20 31 20 31 20   b||''"  {1 1 1 
9b40: 31 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20  1}.  6  "SELECT 
9b50: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 33  count(*) FROM b3
9b60: 20 47 52 4f 55 50 20 42 59 20 61 7c 7c 27 27 22   GROUP BY a||''"
9b70: 20 20 7b 31 20 31 20 31 20 31 7d 0a 7d 0a 0a 23    {1 1 1 1}.}..#
9b80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9b90: 36 33 35 37 33 2d 35 30 37 33 30 20 54 68 65 20  63573-50730 The 
9ba0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 61  expressions in a
9bb0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
9bc0: 20 6d 61 79 0a 23 20 6e 6f 74 20 62 65 20 61 67   may.# not be ag
9bd0: 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
9be0: 6f 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ons..#.foreach {
9bf0: 74 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31  tn select} {.  1
9c00: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46  2.1  "SELECT * F
9c10: 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20  ROM b3 GROUP BY 
9c20: 63 6f 75 6e 74 28 2a 29 22 0a 20 20 31 32 2e 32  count(*)".  12.2
9c30: 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61 29    "SELECT max(a)
9c40: 20 46 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42   FROM b3 GROUP B
9c50: 59 20 6d 61 78 28 62 29 22 0a 20 20 31 32 2e 33  Y max(b)".  12.3
9c60: 20 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f    "SELECT group_
9c70: 63 6f 6e 63 61 74 28 61 29 20 46 52 4f 4d 20 62  concat(a) FROM b
9c80: 33 20 47 52 4f 55 50 20 42 59 20 61 2c 20 6d 61  3 GROUP BY a, ma
9c90: 78 28 62 29 22 0a 7d 20 7b 0a 20 20 73 65 74 20  x(b)".} {.  set 
9ca0: 72 65 73 20 7b 31 20 7b 61 67 67 72 65 67 61 74  res {1 {aggregat
9cb0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
9cc0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  not allowed in t
9cd0: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
9ce0: 73 65 7d 7d 0a 20 20 64 6f 5f 63 61 74 63 68 73  se}}.  do_catchs
9cf0: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
9d00: 2d 34 2e 24 74 6e 20 24 73 65 6c 65 63 74 20 24  -4.$tn $select $
9d10: 72 65 73 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  res.}..# EVIDENC
9d20: 45 2d 4f 46 3a 20 52 2d 33 31 35 33 37 2d 30 30  E-OF: R-31537-00
9d30: 31 30 31 20 49 66 20 61 20 48 41 56 49 4e 47 20  101 If a HAVING 
9d40: 63 6c 61 75 73 65 20 69 73 20 73 70 65 63 69 66  clause is specif
9d50: 69 65 64 2c 20 69 74 20 69 73 0a 23 20 65 76 61  ied, it is.# eva
9d60: 6c 75 61 74 65 64 20 6f 6e 63 65 20 66 6f 72 20  luated once for 
9d70: 65 61 63 68 20 67 72 6f 75 70 20 6f 66 20 72 6f  each group of ro
9d80: 77 73 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  ws as a boolean 
9d90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 66 20 74  expression. If t
9da0: 68 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 65  he.# result of e
9db0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 48 41  valuating the HA
9dc0: 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 66  VING clause is f
9dd0: 61 6c 73 65 2c 20 74 68 65 20 67 72 6f 75 70 20  alse, the group 
9de0: 69 73 0a 23 20 64 69 73 63 61 72 64 65 64 2e 0a  is.# discarded..
9df0: 23 0a 23 20 20 20 54 68 69 73 20 72 65 71 75 69  #.#   This requi
9e00: 72 65 6d 65 6e 74 20 69 73 20 74 65 73 74 65 64  rement is tested
9e10: 20 62 79 20 61 6c 6c 20 65 5f 73 65 6c 65 63 74   by all e_select
9e20: 2d 34 2e 31 33 2e 2a 20 74 65 73 74 73 2e 0a 23  -4.13.* tests..#
9e30: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9e40: 52 2d 30 34 31 33 32 2d 30 39 34 37 34 20 49 66  R-04132-09474 If
9e50: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
9e60: 73 65 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  se is an aggrega
9e70: 74 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 2c  te.# expression,
9e80: 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
9e90: 20 61 63 72 6f 73 73 20 61 6c 6c 20 72 6f 77 73   across all rows
9ea0: 20 69 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23   in the group..#
9eb0: 0a 23 20 20 20 54 65 73 74 65 64 20 62 79 20 65  .#   Tested by e
9ec0: 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e 31 2e 2a  _select-4.13.1.*
9ed0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
9ee0: 3a 20 52 2d 32 38 32 36 32 2d 34 37 34 34 37 20  : R-28262-47447 
9ef0: 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
9f00: 73 65 20 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72  se is a non-aggr
9f10: 65 67 61 74 65 0a 23 20 65 78 70 72 65 73 73 69  egate.# expressi
9f20: 6f 6e 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61  on, it is evalua
9f30: 74 65 64 20 77 69 74 68 20 72 65 73 70 65 63 74  ted with respect
9f40: 20 74 6f 20 61 6e 20 61 72 62 69 74 72 61 72 69   to an arbitrari
9f50: 6c 79 20 73 65 6c 65 63 74 65 64 0a 23 20 72 6f  ly selected.# ro
9f60: 77 20 66 72 6f 6d 20 74 68 65 20 67 72 6f 75 70  w from the group
9f70: 2e 0a 23 0a 23 20 20 20 54 65 73 74 65 64 20 62  ..#.#   Tested b
9f80: 79 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e  y e_select-4.13.
9f90: 32 2e 2a 0a 23 0a 23 20 20 20 54 65 73 74 73 20  2.*.#.#   Tests 
9fa0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 6c  in this block al
9fb0: 73 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  so show that thi
9fc0: 73 20 69 73 20 6e 6f 74 20 75 6e 74 72 75 65 3a  s is not untrue:
9fd0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
9fe0: 3a 20 52 2d 35 35 34 30 33 2d 31 33 34 35 30 20  : R-55403-13450 
9ff0: 54 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  The HAVING expre
a000: 73 73 69 6f 6e 20 6d 61 79 20 72 65 66 65 72 20  ssion may refer 
a010: 74 6f 20 76 61 6c 75 65 73 2c 0a 23 20 65 76 65  to values,.# eve
a020: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
a030: 74 69 6f 6e 73 2c 20 74 68 61 74 20 61 72 65 20  tions, that are 
a040: 6e 6f 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  not in the resul
a050: 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t..#.do_execsql_
a060: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e  test e_select-4.
a070: 31 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  13.0 {.  CREATE 
a080: 54 41 42 4c 45 20 63 31 28 75 70 2c 20 64 6f 77  TABLE c1(up, dow
a090: 6e 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  n);.  INSERT INT
a0a0: 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78 27 2c  O c1 VALUES('x',
a0b0: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
a0c0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78 27  TO c1 VALUES('x'
a0d0: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
a0e0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78  NTO c1 VALUES('x
a0f0: 27 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 4);.  INSERT 
a100: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27  INTO c1 VALUES('
a110: 78 27 2c 20 38 29 3b 0a 20 20 49 4e 53 45 52 54  x', 8);.  INSERT
a120: 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
a130: 27 79 27 2c 20 31 36 29 3b 0a 20 20 49 4e 53 45  'y', 16);.  INSE
a140: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
a150: 53 28 27 79 27 2c 20 33 32 29 3b 0a 0a 20 20 43  S('y', 32);..  C
a160: 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 69  REATE TABLE c2(i
a170: 2c 20 6a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , j);.  INSERT I
a180: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c  NTO c2 VALUES(1,
a190: 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   0);.  INSERT IN
a1a0: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 2c 20  TO c2 VALUES(2, 
a1b0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
a1c0: 4f 20 63 32 20 56 41 4c 55 45 53 28 33 2c 20 33  O c2 VALUES(3, 3
a1d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
a1e0: 20 63 32 20 56 41 4c 55 45 53 28 34 2c 20 36 29   c2 VALUES(4, 6)
a1f0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a200: 63 32 20 56 41 4c 55 45 53 28 35 2c 20 31 30 29  c2 VALUES(5, 10)
a210: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a220: 63 32 20 56 41 4c 55 45 53 28 36 2c 20 31 35 29  c2 VALUES(6, 15)
a230: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a240: 63 32 20 56 41 4c 55 45 53 28 37 2c 20 32 31 29  c2 VALUES(7, 21)
a250: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a260: 63 32 20 56 41 4c 55 45 53 28 38 2c 20 32 38 29  c2 VALUES(8, 28)
a270: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a280: 63 32 20 56 41 4c 55 45 53 28 39 2c 20 33 36 29  c2 VALUES(9, 36)
a290: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
a2a0: 45 20 63 33 28 69 20 50 52 49 4d 41 52 59 20 4b  E c3(i PRIMARY K
a2b0: 45 59 2c 20 6b 20 54 45 58 54 29 3b 0a 20 20 49  EY, k TEXT);.  I
a2c0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41  NSERT INTO c3 VA
a2d0: 4c 55 45 53 28 31 2c 20 20 27 68 79 64 72 6f 67  LUES(1,  'hydrog
a2e0: 65 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  en');.  INSERT I
a2f0: 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 32 2c  NTO c3 VALUES(2,
a300: 20 20 27 68 65 6c 69 75 6d 27 29 3b 0a 20 20 49    'helium');.  I
a310: 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41  NSERT INTO c3 VA
a320: 4c 55 45 53 28 33 2c 20 20 27 6c 69 74 68 69 75  LUES(3,  'lithiu
a330: 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  m');.  INSERT IN
a340: 54 4f 20 63 33 20 56 41 4c 55 45 53 28 34 2c 20  TO c3 VALUES(4, 
a350: 20 27 62 65 72 79 6c 6c 69 75 6d 27 29 3b 0a 20   'beryllium');. 
a360: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
a370: 56 41 4c 55 45 53 28 35 2c 20 20 27 62 6f 72 6f  VALUES(5,  'boro
a380: 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  n');.  INSERT IN
a390: 54 4f 20 63 33 20 56 41 4c 55 45 53 28 39 34 2c  TO c3 VALUES(94,
a3a0: 20 27 70 6c 75 74 6f 6e 69 75 6d 27 29 3b 0a 7d   'plutonium');.}
a3b0: 20 7b 7d 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74   {}..do_select_t
a3c0: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e  ests e_select-4.
a3d0: 31 33 20 7b 0a 20 20 31 2e 31 20 20 22 53 45 4c  13 {.  1.1  "SEL
a3e0: 45 43 54 20 75 70 20 46 52 4f 4d 20 63 31 20 47  ECT up FROM c1 G
a3f0: 52 4f 55 50 20 42 59 20 75 70 20 48 41 56 49 4e  ROUP BY up HAVIN
a400: 47 20 63 6f 75 6e 74 28 2a 29 3e 33 22 20 7b 78  G count(*)>3" {x
a410: 7d 0a 20 20 31 2e 32 20 20 22 53 45 4c 45 43 54  }.  1.2  "SELECT
a420: 20 75 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55   up FROM c1 GROU
a430: 50 20 42 59 20 75 70 20 48 41 56 49 4e 47 20 73  P BY up HAVING s
a440: 75 6d 28 64 6f 77 6e 29 3e 31 36 22 20 7b 79 7d  um(down)>16" {y}
a450: 0a 20 20 31 2e 33 20 20 22 53 45 4c 45 43 54 20  .  1.3  "SELECT 
a460: 75 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50  up FROM c1 GROUP
a470: 20 42 59 20 75 70 20 48 41 56 49 4e 47 20 73 75   BY up HAVING su
a480: 6d 28 64 6f 77 6e 29 3c 31 36 22 20 7b 78 7d 0a  m(down)<16" {x}.
a490: 20 20 31 2e 34 20 20 22 53 45 4c 45 43 54 20 75    1.4  "SELECT u
a4a0: 70 7c 7c 64 6f 77 6e 20 46 52 4f 4d 20 63 31 20  p||down FROM c1 
a4b0: 47 52 4f 55 50 20 42 59 20 28 64 6f 77 6e 3c 35  GROUP BY (down<5
a4c0: 29 20 48 41 56 49 4e 47 20 6d 61 78 28 64 6f 77  ) HAVING max(dow
a4d0: 6e 29 3c 31 30 22 20 7b 78 34 7d 0a 0a 20 20 32  n)<10" {x4}..  2
a4e0: 2e 31 20 20 22 53 45 4c 45 43 54 20 75 70 20 46  .1  "SELECT up F
a4f0: 52 4f 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20  ROM c1 GROUP BY 
a500: 75 70 20 48 41 56 49 4e 47 20 64 6f 77 6e 3e 31  up HAVING down>1
a510: 30 22 20 7b 79 7d 0a 20 20 32 2e 32 20 20 22 53  0" {y}.  2.2  "S
a520: 45 4c 45 43 54 20 75 70 20 46 52 4f 4d 20 63 31  ELECT up FROM c1
a530: 20 47 52 4f 55 50 20 42 59 20 75 70 20 48 41 56   GROUP BY up HAV
a540: 49 4e 47 20 75 70 3d 27 79 27 22 20 20 7b 79 7d  ING up='y'"  {y}
a550: 0a 0a 20 20 32 2e 33 20 20 22 53 45 4c 45 43 54  ..  2.3  "SELECT
a560: 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52   i, j FROM c2 GR
a570: 4f 55 50 20 42 59 20 69 3e 34 20 48 41 56 49 4e  OUP BY i>4 HAVIN
a580: 47 20 6a 3e 36 22 20 20 7b 35 20 31 30 7d 0a 7d  G j>6"  {5 10}.}
a590: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
a5a0: 20 52 2d 32 33 39 32 37 2d 35 34 30 38 31 20 45   R-23927-54081 E
a5b0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
a5c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  n the result-set
a5d0: 20 69 73 20 74 68 65 6e 0a 23 20 65 76 61 6c 75   is then.# evalu
a5e0: 61 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  ated once for ea
a5f0: 63 68 20 67 72 6f 75 70 20 6f 66 20 72 6f 77 73  ch group of rows
a600: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
a610: 46 3a 20 52 2d 35 33 37 33 35 2d 34 37 30 31 37  F: R-53735-47017
a620: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a630: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
a640: 74 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 2c  te.# expression,
a650: 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
a660: 20 61 63 72 6f 73 73 20 61 6c 6c 20 72 6f 77 73   across all rows
a670: 20 69 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23   in the group..#
a680: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
a690: 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 35 20 7b   e_select-4.15 {
a6a0: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 73 75  .  1  "SELECT su
a6b0: 6d 28 64 6f 77 6e 29 20 46 52 4f 4d 20 63 31 20  m(down) FROM c1 
a6c0: 47 52 4f 55 50 20 42 59 20 75 70 22 20 7b 31 35  GROUP BY up" {15
a6d0: 20 34 38 7d 0a 20 20 32 20 20 22 53 45 4c 45 43   48}.  2  "SELEC
a6e0: 54 20 73 75 6d 28 6a 29 2c 20 6d 61 78 28 6a 29  T sum(j), max(j)
a6f0: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
a700: 59 20 28 69 25 33 29 22 20 20 20 20 20 7b 35 34  Y (i%3)"     {54
a710: 20 33 36 20 32 37 20 32 31 20 33 39 20 32 38 7d   36 27 21 39 28}
a720: 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20 73 75  .  3  "SELECT su
a730: 6d 28 6a 29 2c 20 6d 61 78 28 6a 29 20 46 52 4f  m(j), max(j) FRO
a740: 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20 28 6a  M c2 GROUP BY (j
a750: 25 32 29 22 20 20 20 20 20 7b 38 30 20 33 36 20  %2)"     {80 36 
a760: 34 30 20 32 31 7d 0a 20 20 34 20 20 22 53 45 4c  40 21}.  4  "SEL
a770: 45 43 54 20 31 2b 73 75 6d 28 6a 29 2c 20 6d 61  ECT 1+sum(j), ma
a780: 78 28 6a 29 2b 31 20 46 52 4f 4d 20 63 32 20 47  x(j)+1 FROM c2 G
a790: 52 4f 55 50 20 42 59 20 28 6a 25 32 29 22 20 7b  ROUP BY (j%2)" {
a7a0: 38 31 20 33 37 20 34 31 20 32 32 7d 0a 20 20 35  81 37 41 22}.  5
a7b0: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
a7c0: 2a 29 2c 20 72 6f 75 6e 64 28 61 76 67 28 69 29  *), round(avg(i)
a7d0: 2c 32 29 20 46 52 4f 4d 20 63 31 2c 20 63 32 20  ,2) FROM c1, c2 
a7e0: 4f 4e 20 28 69 3d 64 6f 77 6e 29 20 47 52 4f 55  ON (i=down) GROU
a7f0: 50 20 42 59 20 6a 25 32 22 0a 20 20 20 20 20 20  P BY j%2".      
a800: 20 20 7b 33 20 34 2e 33 33 20 31 20 32 2e 30 7d    {3 4.33 1 2.0}
a810: 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .} ..# EVIDENCE-
a820: 4f 46 3a 20 52 2d 36 32 39 31 33 2d 31 39 38 33  OF: R-62913-1983
a830: 30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  0 Otherwise, it 
a840: 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  is evaluated aga
a850: 69 6e 73 74 20 61 20 73 69 6e 67 6c 65 0a 23 20  inst a single.# 
a860: 61 72 62 69 74 72 61 72 69 6c 79 20 63 68 6f 73  arbitrarily chos
a870: 65 6e 20 72 6f 77 20 66 72 6f 6d 20 77 69 74 68  en row from with
a880: 69 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a  in the group..#.
a890: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
a8a0: 2d 35 33 39 32 34 2d 30 38 38 30 39 20 49 66 20  -53924-08809 If 
a8b0: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
a8c0: 61 6e 20 6f 6e 65 20 6e 6f 6e 2d 61 67 67 72 65  an one non-aggre
a8d0: 67 61 74 65 0a 23 20 65 78 70 72 65 73 73 69 6f  gate.# expressio
a8e0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  n in the result-
a8f0: 73 65 74 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  set, then all su
a900: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ch expressions a
a910: 72 65 20 65 76 61 6c 75 61 74 65 64 0a 23 20 66  re evaluated.# f
a920: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e  or the same row.
a930: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
a940: 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 35  ts e_select-4.15
a950: 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20   {.  1  "SELECT 
a960: 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f  i, j FROM c2 GRO
a970: 55 50 20 42 59 20 69 25 32 22 20 20 20 20 20 20  UP BY i%2"      
a980: 20 20 20 20 20 20 20 7b 32 20 31 20 31 20 30 7d         {2 1 1 0}
a990: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 69 2c  .  2  "SELECT i,
a9a0: 20 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50   j FROM c2 GROUP
a9b0: 20 42 59 20 69 25 32 20 48 41 56 49 4e 47 20 6a   BY i%2 HAVING j
a9c0: 3c 33 30 22 20 7b 32 20 31 20 31 20 30 7d 0a 20  <30" {2 1 1 0}. 
a9d0: 20 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a   3  "SELECT i, j
a9e0: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
a9f0: 59 20 69 25 32 20 48 41 56 49 4e 47 20 6a 3e 33  Y i%2 HAVING j>3
aa00: 30 22 20 7b 7d 0a 20 20 34 20 20 22 53 45 4c 45  0" {}.  4  "SELE
aa10: 43 54 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20  CT i, j FROM c2 
aa20: 47 52 4f 55 50 20 42 59 20 69 25 32 20 48 41 56  GROUP BY i%2 HAV
aa30: 49 4e 47 20 6a 3e 33 30 22 20 7b 7d 0a 20 20 35  ING j>30" {}.  5
aa40: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
aa50: 2a 29 2c 20 69 2c 20 6b 20 46 52 4f 4d 20 63 32  *), i, k FROM c2
aa60: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 63 33   NATURAL JOIN c3
aa70: 20 47 52 4f 55 50 20 42 59 20 73 75 62 73 74 72   GROUP BY substr
aa80: 28 6b 2c 20 31 2c 20 31 29 22 0a 20 20 20 20 20  (k, 1, 1)".     
aa90: 20 20 20 7b 32 20 34 20 62 65 72 79 6c 6c 69 75     {2 4 berylliu
aaa0: 6d 20 32 20 31 20 68 79 64 72 6f 67 65 6e 20 31  m 2 1 hydrogen 1
aab0: 20 33 20 6c 69 74 68 69 75 6d 7d 0a 7d 20 0a 0a   3 lithium}.} ..
aac0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
aad0: 2d 31 39 33 33 34 2d 31 32 38 31 31 20 45 61 63  -19334-12811 Eac
aae0: 68 20 67 72 6f 75 70 20 6f 66 20 69 6e 70 75 74  h group of input
aaf0: 20 64 61 74 61 73 65 74 20 72 6f 77 73 0a 23 20   dataset rows.# 
ab00: 63 6f 6e 74 72 69 62 75 74 65 73 20 61 20 73 69  contributes a si
ab10: 6e 67 6c 65 20 72 6f 77 20 74 6f 20 74 68 65 20  ngle row to the 
ab20: 73 65 74 20 6f 66 20 72 65 73 75 6c 74 20 72 6f  set of result ro
ab30: 77 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ws..#.# EVIDENCE
ab40: 2d 4f 46 3a 20 52 2d 30 32 32 32 33 2d 34 39 32  -OF: R-02223-492
ab50: 37 39 20 53 75 62 6a 65 63 74 20 74 6f 20 66 69  79 Subject to fi
ab60: 6c 74 65 72 69 6e 67 20 61 73 73 6f 63 69 61 74  ltering associat
ab70: 65 64 20 77 69 74 68 20 74 68 65 0a 23 20 44 49  ed with the.# DI
ab80: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20  STINCT keyword, 
ab90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
aba0: 77 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ws returned by a
abb0: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
abc0: 79 0a 23 20 77 69 74 68 20 61 20 47 52 4f 55 50  y.# with a GROUP
abd0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 74 68   BY clause is th
abe0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6e 75  e same as the nu
abf0: 6d 62 65 72 20 6f 66 20 67 72 6f 75 70 73 20 6f  mber of groups o
ac00: 66 20 72 6f 77 73 0a 23 20 70 72 6f 64 75 63 65  f rows.# produce
ac10: 64 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68  d by applying th
ac20: 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 48  e GROUP BY and H
ac30: 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 6f  AVING clauses to
ac40: 20 74 68 65 20 66 69 6c 74 65 72 65 64 0a 23 20   the filtered.# 
ac50: 69 6e 70 75 74 20 64 61 74 61 73 65 74 2e 0a 23  input dataset..#
ac60: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
ac70: 20 65 5f 73 65 6c 65 63 74 2e 34 2e 31 36 20 2d   e_select.4.16 -
ac80: 63 6f 75 6e 74 20 7b 0a 20 20 31 20 20 22 53 45  count {.  1  "SE
ac90: 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f 4d 20 63  LECT i, j FROM c
aca0: 32 20 47 52 4f 55 50 20 42 59 20 69 25 32 22 20  2 GROUP BY i%2" 
acb0: 20 20 20 20 20 20 20 20 20 32 0a 20 20 32 20 20           2.  2  
acc0: 22 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f  "SELECT i, j FRO
acd0: 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20 69 22  M c2 GROUP BY i"
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 20 20              9.  
acf0: 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20  3  "SELECT i, j 
ad00: 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59  FROM c2 GROUP BY
ad10: 20 69 20 48 41 56 49 4e 47 20 69 3c 35 22 20 34   i HAVING i<5" 4
ad20: 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .} ..#----------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ad70: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
ad80: 74 65 73 74 73 20 61 74 74 65 6d 70 74 20 74 6f  tests attempt to
ad90: 20 76 65 72 69 66 79 20 73 74 61 74 65 6d 65 6e   verify statemen
ada0: 74 73 20 6d 61 64 65 20 72 65 67 61 72 64 69 6e  ts made regardin
adb0: 67 20 74 68 65 20 41 4c 4c 0a 23 20 61 6e 64 20  g the ALL.# and 
adc0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
add0: 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  s..#.drop_all_ta
ade0: 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  bles.do_execsql_
adf0: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 35 2e  test e_select-5.
ae00: 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.0 {.  CREATE T
ae10: 41 42 4c 45 20 68 31 28 61 2c 20 62 29 3b 0a 20  ABLE h1(a, b);. 
ae20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 31 20   INSERT INTO h1 
ae30: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
ae40: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
ae50: 68 31 20 56 41 4c 55 45 53 28 31 2c 20 27 49 27  h1 VALUES(1, 'I'
ae60: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
ae70: 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20 27 69   h1 VALUES(1, 'i
ae80: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
ae90: 4f 20 68 31 20 56 41 4c 55 45 53 28 34 2c 20 27  O h1 VALUES(4, '
aea0: 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54  four');.  INSERT
aeb0: 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45 53 28   INTO h1 VALUES(
aec0: 34 2c 20 27 49 56 27 29 3b 0a 20 20 49 4e 53 45  4, 'IV');.  INSE
aed0: 52 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45  RT INTO h1 VALUE
aee0: 53 28 34 2c 20 27 69 76 27 29 3b 0a 0a 20 20 43  S(4, 'iv');..  C
aef0: 52 45 41 54 45 20 54 41 42 4c 45 20 68 32 28 78  REATE TABLE h2(x
af00: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
af10: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
af20: 68 32 20 56 41 4c 55 45 53 28 27 4f 6e 65 27 29  h2 VALUES('One')
af30: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
af40: 68 32 20 56 41 4c 55 45 53 28 27 54 77 6f 27 29  h2 VALUES('Two')
af50: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
af60: 68 32 20 56 41 4c 55 45 53 28 27 54 68 72 65 65  h2 VALUES('Three
af70: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
af80: 4f 20 68 32 20 56 41 4c 55 45 53 28 27 46 6f 75  O h2 VALUES('Fou
af90: 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  r');.  INSERT IN
afa0: 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 6f 6e  TO h2 VALUES('on
afb0: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
afc0: 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 74 77  TO h2 VALUES('tw
afd0: 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
afe0: 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 74 68  TO h2 VALUES('th
aff0: 72 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ree');.  INSERT 
b000: 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27  INTO h2 VALUES('
b010: 66 6f 75 72 27 29 3b 0a 0a 20 20 43 52 45 41 54  four');..  CREAT
b020: 45 20 54 41 42 4c 45 20 68 33 28 63 2c 20 64 29  E TABLE h3(c, d)
b030: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
b040: 68 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  h3 VALUES(1, NUL
b050: 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  L);.  INSERT INT
b060: 4f 20 68 33 20 56 41 4c 55 45 53 28 32 2c 20 4e  O h3 VALUES(2, N
b070: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
b080: 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28 33 2c  NTO h3 VALUES(3,
b090: 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54   NULL);.  INSERT
b0a0: 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28   INTO h3 VALUES(
b0b0: 34 2c 20 27 32 27 29 3b 0a 20 20 49 4e 53 45 52  4, '2');.  INSER
b0c0: 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53  T INTO h3 VALUES
b0d0: 28 35 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53  (5, NULL);.  INS
b0e0: 45 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55  ERT INTO h3 VALU
b0f0: 45 53 28 36 2c 20 27 32 2c 33 27 29 3b 0a 20 20  ES(6, '2,3');.  
b100: 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33 20 56  INSERT INTO h3 V
b110: 41 4c 55 45 53 28 37 2c 20 4e 55 4c 4c 29 3b 0a  ALUES(7, NULL);.
b120: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33    INSERT INTO h3
b130: 20 56 41 4c 55 45 53 28 38 2c 20 27 32 2c 34 27   VALUES(8, '2,4'
b140: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b150: 20 68 33 20 56 41 4c 55 45 53 28 39 2c 20 27 33   h3 VALUES(9, '3
b160: 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  ');.} {}..# EVID
b170: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37 37 30  ENCE-OF: R-60770
b180: 2d 31 30 36 31 32 20 4f 6e 65 20 6f 66 20 74 68  -10612 One of th
b190: 65 20 41 4c 4c 20 6f 72 20 44 49 53 54 49 4e 43  e ALL or DISTINC
b1a0: 54 20 6b 65 79 77 6f 72 64 73 20 6d 61 79 0a 23  T keywords may.#
b1b0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 53 45 4c 45   follow the SELE
b1c0: 43 54 20 6b 65 79 77 6f 72 64 20 69 6e 20 61 20  CT keyword in a 
b1d0: 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74  simple SELECT st
b1e0: 61 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f 73 65  atement..#.do_se
b1f0: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
b200: 65 63 74 2d 35 2e 31 20 7b 0a 20 20 31 20 20 20  ect-5.1 {.  1   
b210: 22 53 45 4c 45 43 54 20 41 4c 4c 20 61 20 46 52  "SELECT ALL a FR
b220: 4f 4d 20 68 31 22 20 20 20 20 20 20 7b 31 20 31  OM h1"      {1 1
b230: 20 31 20 34 20 34 20 34 7d 0a 20 20 32 20 20 20   1 4 4 4}.  2   
b240: 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
b250: 20 61 20 46 52 4f 4d 20 68 31 22 20 7b 31 20 34   a FROM h1" {1 4
b260: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
b270: 4f 46 3a 20 52 2d 30 38 38 36 31 2d 33 34 32 38  OF: R-08861-3428
b280: 30 20 49 66 20 74 68 65 20 73 69 6d 70 6c 65 20  0 If the simple 
b290: 53 45 4c 45 43 54 20 69 73 20 61 20 53 45 4c 45  SELECT is a SELE
b2a0: 43 54 20 41 4c 4c 2c 20 74 68 65 6e 0a 23 20 74  CT ALL, then.# t
b2b0: 68 65 20 65 6e 74 69 72 65 20 73 65 74 20 6f 66  he entire set of
b2c0: 20 72 65 73 75 6c 74 20 72 6f 77 73 20 61 72 65   result rows are
b2d0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b2e0: 20 53 45 4c 45 43 54 2e 0a 23 0a 23 20 45 56 49   SELECT..#.# EVI
b2f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 32 35  DENCE-OF: R-0125
b300: 36 2d 30 31 39 35 30 20 49 66 20 6e 65 69 74 68  6-01950 If neith
b310: 65 72 20 41 4c 4c 20 6f 72 20 44 49 53 54 49 4e  er ALL or DISTIN
b320: 43 54 20 61 72 65 20 70 72 65 73 65 6e 74 2c 0a  CT are present,.
b330: 23 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 76  # then the behav
b340: 69 6f 72 20 69 73 20 61 73 20 69 66 20 41 4c 4c  ior is as if ALL
b350: 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2e   were specified.
b360: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
b370: 3a 20 52 2d 31 34 34 34 32 2d 34 31 33 30 35 20  : R-14442-41305 
b380: 49 66 20 74 68 65 20 73 69 6d 70 6c 65 20 53 45  If the simple SE
b390: 4c 45 43 54 20 69 73 20 61 20 53 45 4c 45 43 54  LECT is a SELECT
b3a0: 20 44 49 53 54 49 4e 43 54 2c 0a 23 20 74 68 65   DISTINCT,.# the
b3b0: 6e 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  n duplicate rows
b3c0: 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f   are removed fro
b3d0: 6d 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 73  m the set of res
b3e0: 75 6c 74 20 72 6f 77 73 20 62 65 66 6f 72 65 20  ult rows before 
b3f0: 69 74 0a 23 20 69 73 20 72 65 74 75 72 6e 65 64  it.# is returned
b400: 2e 0a 23 0a 23 20 20 20 54 68 65 20 74 68 72 65  ..#.#   The thre
b410: 65 20 74 65 73 74 61 62 6c 65 20 73 74 61 74 65  e testable state
b420: 6d 65 6e 74 73 20 61 62 6f 76 65 20 61 72 65 20  ments above are 
b430: 74 65 73 74 65 64 20 62 79 20 65 5f 73 65 6c 65  tested by e_sele
b440: 63 74 2d 35 2e 32 2e 2a 2c 0a 23 20 20 20 35 2e  ct-5.2.*,.#   5.
b450: 33 2e 2a 20 61 6e 64 20 35 2e 34 2e 2a 20 72 65  3.* and 5.4.* re
b460: 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a 64 6f  spectively..#.do
b470: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
b480: 73 65 6c 65 63 74 2d 35 20 7b 0a 20 20 33 2e 31  select-5 {.  3.1
b490: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 78 20 46   "SELECT ALL x F
b4a0: 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20 54 77 6f  ROM h2" {One Two
b4b0: 20 54 68 72 65 65 20 46 6f 75 72 20 6f 6e 65 20   Three Four one 
b4c0: 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72 7d 0a  two three four}.
b4d0: 20 20 33 2e 32 20 22 53 45 4c 45 43 54 20 41 4c    3.2 "SELECT AL
b4e0: 4c 20 78 20 46 52 4f 4d 20 68 31 2c 20 68 32 20  L x FROM h1, h2 
b4f0: 4f 4e 20 28 78 3d 62 29 22 20 7b 4f 6e 65 20 6f  ON (x=b)" {One o
b500: 6e 65 20 46 6f 75 72 20 66 6f 75 72 7d 0a 0a 20  ne Four four}.. 
b510: 20 33 2e 31 20 22 53 45 4c 45 43 54 20 78 20 46   3.1 "SELECT x F
b520: 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20 54 77 6f  ROM h2" {One Two
b530: 20 54 68 72 65 65 20 46 6f 75 72 20 6f 6e 65 20   Three Four one 
b540: 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72 7d 0a  two three four}.
b550: 20 20 33 2e 32 20 22 53 45 4c 45 43 54 20 78 20    3.2 "SELECT x 
b560: 46 52 4f 4d 20 68 31 2c 20 68 32 20 4f 4e 20 28  FROM h1, h2 ON (
b570: 78 3d 62 29 22 20 7b 4f 6e 65 20 6f 6e 65 20 46  x=b)" {One one F
b580: 6f 75 72 20 66 6f 75 72 7d 0a 0a 20 20 34 2e 31  our four}..  4.1
b590: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
b5a0: 54 20 78 20 46 52 4f 4d 20 68 32 22 20 7b 4f 6e  T x FROM h2" {On
b5b0: 65 20 54 77 6f 20 54 68 72 65 65 20 46 6f 75 72  e Two Three Four
b5c0: 7d 0a 20 20 34 2e 32 20 22 53 45 4c 45 43 54 20  }.  4.2 "SELECT 
b5d0: 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20  DISTINCT x FROM 
b5e0: 68 31 2c 20 68 32 20 4f 4e 20 28 78 3d 62 29 22  h1, h2 ON (x=b)"
b5f0: 20 7b 4f 6e 65 20 46 6f 75 72 7d 0a 7d 20 0a 0a   {One Four}.} ..
b600: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b610: 2d 30 32 30 35 34 2d 31 35 33 34 33 20 46 6f 72  -02054-15343 For
b620: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
b630: 20 64 65 74 65 63 74 69 6e 67 20 64 75 70 6c 69   detecting dupli
b640: 63 61 74 65 0a 23 20 72 6f 77 73 2c 20 74 77 6f  cate.# rows, two
b650: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
b660: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
b670: 65 20 65 71 75 61 6c 2e 0a 23 0a 64 6f 5f 73 65  e equal..#.do_se
b680: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
b690: 65 63 74 2d 35 2e 35 20 7b 0a 20 20 31 20 20 22  ect-5.5 {.  1  "
b6a0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
b6b0: 64 20 46 52 4f 4d 20 68 33 22 20 7b 7b 7d 20 32  d FROM h3" {{} 2
b6c0: 20 32 2c 33 20 32 2c 34 20 33 7d 0a 7d 0a 0a 23   2,3 2,4 3}.}..#
b6d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b6e0: 34 37 37 30 39 2d 32 37 32 33 31 20 54 68 65 20  47709-27231 The 
b6f0: 75 73 75 61 6c 20 72 75 6c 65 73 20 61 70 70 6c  usual rules appl
b700: 79 20 66 6f 72 20 73 65 6c 65 63 74 69 6e 67 20  y for selecting 
b710: 61 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  a.# collation se
b720: 71 75 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72  quence to compar
b730: 65 20 74 65 78 74 20 76 61 6c 75 65 73 2e 0a 23  e text values..#
b740: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
b750: 20 65 5f 73 65 6c 65 63 74 2d 35 2e 36 20 7b 0a   e_select-5.6 {.
b760: 20 20 31 20 20 22 53 45 4c 45 43 54 20 44 49 53    1  "SELECT DIS
b770: 54 49 4e 43 54 20 62 20 46 52 4f 4d 20 68 31 22  TINCT b FROM h1"
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 7b 6f 6e 65 20 49 20 69 20 66 6f 75 72 20    {one I i four 
b7a0: 49 56 20 69 76 7d 0a 20 20 32 20 20 22 53 45 4c  IV iv}.  2  "SEL
b7b0: 45 43 54 20 44 49 53 54 49 4e 43 54 20 62 20 43  ECT DISTINCT b C
b7c0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 46 52  OLLATE nocase FR
b7d0: 4f 4d 20 68 31 22 20 20 20 7b 6f 6e 65 20 49 20  OM h1"   {one I 
b7e0: 66 6f 75 72 20 49 56 7d 0a 20 20 33 20 20 22 53  four IV}.  3  "S
b7f0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
b800: 20 46 52 4f 4d 20 68 32 22 20 20 20 20 20 20 20   FROM h2"       
b810: 20 20 20 20 20 20 20 20 20 20 20 7b 4f 6e 65 20             {One 
b820: 54 77 6f 20 54 68 72 65 65 20 46 6f 75 72 7d 0a  Two Three Four}.
b830: 20 20 34 20 20 22 53 45 4c 45 43 54 20 44 49 53    4  "SELECT DIS
b840: 54 49 4e 43 54 20 78 20 43 4f 4c 4c 41 54 45 20  TINCT x COLLATE 
b850: 62 69 6e 61 72 79 20 46 52 4f 4d 20 68 32 22 20  binary FROM h2" 
b860: 20 20 7b 0a 20 20 20 20 4f 6e 65 20 54 77 6f 20    {.    One Two 
b870: 54 68 72 65 65 20 46 6f 75 72 20 6f 6e 65 20 74  Three Four one t
b880: 77 6f 20 74 68 72 65 65 20 66 6f 75 72 0a 20 20  wo three four.  
b890: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
b8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
b8e0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
b8f0: 74 65 73 74 73 20 2d 20 65 5f 73 65 6c 65 63 74  tests - e_select
b900: 2d 37 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74  -7.* - test that
b910: 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 64 65   statements made
b920: 20 74 6f 20 64 6f 0a 23 20 77 69 74 68 20 63 6f   to do.# with co
b930: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
b940: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 6f 72  atements are cor
b950: 72 65 63 74 2e 0a 23 0a 0a 23 20 45 56 49 44 45  rect..#..# EVIDE
b960: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 33 36 38 2d  NCE-OF: R-39368-
b970: 36 34 33 33 33 20 49 6e 20 61 20 63 6f 6d 70 6f  64333 In a compo
b980: 75 6e 64 20 53 45 4c 45 43 54 2c 20 61 6c 6c 20  und SELECT, all 
b990: 74 68 65 20 63 6f 6e 73 74 69 74 75 65 6e 74 0a  the constituent.
b9a0: 23 20 53 45 4c 45 43 54 73 20 6d 75 73 74 20 72  # SELECTs must r
b9b0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
b9c0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
b9d0: 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 20 20 41  columns..#.#   A
b9e0: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 74 65 73  ll the other tes
b9f0: 74 73 20 69 6e 20 74 68 69 73 20 73 65 63 74 69  ts in this secti
ba00: 6f 6e 20 75 73 65 20 63 6f 6d 70 6f 75 6e 64 20  on use compound 
ba10: 53 45 4c 45 43 54 73 20 63 72 65 61 74 65 64 0a  SELECTs created.
ba20: 23 20 20 20 75 73 69 6e 67 20 63 6f 6d 70 6f 6e  #   using compon
ba30: 65 6e 74 20 53 45 4c 45 43 54 73 20 74 68 61 74  ent SELECTs that
ba40: 20 64 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73   do return the s
ba50: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  ame number of co
ba60: 6c 75 6d 6e 73 2e 0a 23 20 20 20 53 6f 20 74 68  lumns..#   So th
ba70: 65 20 74 65 73 74 73 20 68 65 72 65 20 6a 75 73  e tests here jus
ba80: 74 20 73 68 6f 77 20 74 68 61 74 20 69 74 20 69  t show that it i
ba90: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 61 74  s an error to at
baa0: 74 65 6d 70 74 20 6f 74 68 65 72 77 69 73 65 2e  tempt otherwise.
bab0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
bac0: 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  es.do_execsql_te
bad0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 2e  st e_select-7.1.
bae0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
baf0: 4c 45 20 6a 31 28 61 2c 20 62 2c 20 63 29 3b 0a  LE j1(a, b, c);.
bb00: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a    CREATE TABLE j
bb10: 32 28 65 2c 20 66 29 3b 0a 20 20 43 52 45 41 54  2(e, f);.  CREAT
bb20: 45 20 54 41 42 4c 45 20 6a 33 28 67 29 3b 0a 7d  E TABLE j3(g);.}
bb30: 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65   {}.do_select_te
bb40: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31  sts e_select-7.1
bb50: 20 2d 65 72 72 6f 72 20 7b 0a 20 20 53 45 4c 45   -error {.  SELE
bb60: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
bb70: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 20  and right of %s 
bb80: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
bb90: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
bba0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 0a 7d 20  esult columns.} 
bbb0: 7b 0a 20 20 31 20 20 20 22 53 45 4c 45 43 54 20  {.  1   "SELECT 
bbc0: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20  a, b FROM j1    
bbd0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
bbe0: 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b   g FROM j3"    {
bbf0: 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a 20 20 32  {UNION ALL}}.  2
bc00: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 20 20 20     "SELECT *    
bc10: 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e  FROM j1    UNION
bc20: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52   ALL SELECT * FR
bc30: 4f 4d 20 6a 33 22 20 20 20 20 7b 7b 55 4e 49 4f  OM j3"    {{UNIO
bc40: 4e 20 41 4c 4c 7d 7d 0a 20 20 33 20 20 20 22 53  N ALL}}.  3   "S
bc50: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
bc60: 6a 31 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20  j1    UNION ALL 
bc70: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33  SELECT g FROM j3
bc80: 22 20 20 20 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c  "    {{UNION ALL
bc90: 7d 7d 0a 20 20 34 20 20 20 22 53 45 4c 45 43 54  }}.  4   "SELECT
bca0: 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20   a, b FROM j1   
bcb0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
bcc0: 54 20 2a 20 46 52 4f 4d 20 6a 33 2c 6a 32 22 20  T * FROM j3,j2" 
bcd0: 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a 20 20  {{UNION ALL}}.  
bce0: 35 20 20 20 22 53 45 4c 45 43 54 20 2a 20 20 20  5   "SELECT *   
bcf0: 20 46 52 4f 4d 20 6a 33 2c 6a 32 20 55 4e 49 4f   FROM j3,j2 UNIO
bd00: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 2c 20  N ALL SELECT a, 
bd10: 62 20 46 52 4f 4d 20 6a 31 22 20 7b 7b 55 4e 49  b FROM j1" {{UNI
bd20: 4f 4e 20 41 4c 4c 7d 7d 0a 0a 20 20 36 20 20 20  ON ALL}}..  6   
bd30: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
bd40: 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 53 45  M j1    UNION SE
bd50: 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33 22 20  LECT g FROM j3" 
bd60: 20 20 20 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 20         {UNION}. 
bd70: 20 37 20 20 20 22 53 45 4c 45 43 54 20 2a 20 20   7   "SELECT *  
bd80: 20 20 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49    FROM j1    UNI
bd90: 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ON SELECT * FROM
bda0: 20 6a 33 22 20 20 20 20 20 20 20 20 7b 55 4e 49   j3"        {UNI
bdb0: 4f 4e 7d 0a 20 20 38 20 20 20 22 53 45 4c 45 43  ON}.  8   "SELEC
bdc0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20  T a, b FROM j1  
bdd0: 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 67    UNION SELECT g
bde0: 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 20 20 20   FROM j3"       
bdf0: 20 7b 55 4e 49 4f 4e 7d 0a 20 20 39 20 20 20 22   {UNION}.  9   "
be00: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
be10: 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c   j1    UNION SEL
be20: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 2c 6a 32  ECT * FROM j3,j2
be30: 22 20 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 20 20  "     {UNION}.  
be40: 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20 20 20  10  "SELECT *   
be50: 20 46 52 4f 4d 20 6a 33 2c 6a 32 20 55 4e 49 4f   FROM j3,j2 UNIO
be60: 4e 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  N SELECT a, b FR
be70: 4f 4d 20 6a 31 22 20 20 20 20 20 7b 55 4e 49 4f  OM j1"     {UNIO
be80: 4e 7d 0a 0a 20 20 31 31 20 20 22 53 45 4c 45 43  N}..  11  "SELEC
be90: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20  T a, b FROM j1  
bea0: 20 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45    INTERSECT SELE
beb0: 43 54 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20  CT g FROM j3"   
bec0: 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20 31   {INTERSECT}.  1
bed0: 32 20 20 22 53 45 4c 45 43 54 20 2a 20 20 20 20  2  "SELECT *    
bee0: 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54 45 52  FROM j1    INTER
bef0: 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52  SECT SELECT * FR
bf00: 4f 4d 20 6a 33 22 20 20 20 20 7b 49 4e 54 45 52  OM j3"    {INTER
bf10: 53 45 43 54 7d 0a 20 20 31 33 20 20 22 53 45 4c  SECT}.  13  "SEL
bf20: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31  ECT a, b FROM j1
bf30: 20 20 20 20 49 4e 54 45 52 53 45 43 54 20 53 45      INTERSECT SE
bf40: 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33 22 20  LECT g FROM j3" 
bf50: 20 20 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20     {INTERSECT}. 
bf60: 20 31 34 20 20 22 53 45 4c 45 43 54 20 61 2c 20   14  "SELECT a, 
bf70: 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54  b FROM j1    INT
bf80: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
bf90: 46 52 4f 4d 20 6a 33 2c 6a 32 22 20 7b 49 4e 54  FROM j3,j2" {INT
bfa0: 45 52 53 45 43 54 7d 0a 20 20 31 35 20 20 22 53  ERSECT}.  15  "S
bfb0: 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20  ELECT *    FROM 
bfc0: 6a 33 2c 6a 32 20 49 4e 54 45 52 53 45 43 54 20  j3,j2 INTERSECT 
bfd0: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
bfe0: 20 6a 31 22 20 7b 49 4e 54 45 52 53 45 43 54 7d   j1" {INTERSECT}
bff0: 0a 0a 20 20 31 36 20 20 22 53 45 4c 45 43 54 20  ..  16  "SELECT 
c000: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20  a, b FROM j1    
c010: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 67 20  EXCEPT SELECT g 
c020: 46 52 4f 4d 20 6a 33 22 20 20 20 20 20 20 20 7b  FROM j3"       {
c030: 45 58 43 45 50 54 7d 0a 20 20 31 37 20 20 22 53  EXCEPT}.  17  "S
c040: 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20  ELECT *    FROM 
c050: 6a 31 20 20 20 20 45 58 43 45 50 54 20 53 45 4c  j1    EXCEPT SEL
c060: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20 20  ECT * FROM j3"  
c070: 20 20 20 20 20 7b 45 58 43 45 50 54 7d 0a 20 20       {EXCEPT}.  
c080: 31 38 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62  18  "SELECT a, b
c090: 20 46 52 4f 4d 20 6a 31 20 20 20 20 45 58 43 45   FROM j1    EXCE
c0a0: 50 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d  PT SELECT g FROM
c0b0: 20 6a 33 22 20 20 20 20 20 20 20 7b 45 58 43 45   j3"       {EXCE
c0c0: 50 54 7d 0a 20 20 31 39 20 20 22 53 45 4c 45 43  PT}.  19  "SELEC
c0d0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20  T a, b FROM j1  
c0e0: 20 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20    EXCEPT SELECT 
c0f0: 2a 20 46 52 4f 4d 20 6a 33 2c 6a 32 22 20 20 20  * FROM j3,j2"   
c100: 20 7b 45 58 43 45 50 54 7d 0a 20 20 32 30 20 20   {EXCEPT}.  20  
c110: 22 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f  "SELECT *    FRO
c120: 4d 20 6a 33 2c 6a 32 20 45 58 43 45 50 54 20 53  M j3,j2 EXCEPT S
c130: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
c140: 6a 31 22 20 20 20 20 7b 45 58 43 45 50 54 7d 0a  j1"    {EXCEPT}.
c150: 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
c160: 46 3a 20 52 2d 30 31 34 35 30 2d 31 31 31 35 32  F: R-01450-11152
c170: 20 41 73 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e   As the componen
c180: 74 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  ts of a compound
c190: 20 53 45 4c 45 43 54 20 6d 75 73 74 0a 23 20 62   SELECT must.# b
c1a0: 65 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  e simple SELECT 
c1b0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 74 68 65 79  statements, they
c1c0: 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e   may not contain
c1d0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
c1e0: 49 54 0a 23 20 63 6c 61 75 73 65 73 2e 0a 23 20  IT.# clauses..# 
c1f0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c  .foreach {tn sel
c200: 65 63 74 20 6f 70 31 20 6f 70 32 7d 20 7b 0a 20  ect op1 op2} {. 
c210: 20 31 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   1   "SELECT * F
c220: 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20  ROM j1 ORDER BY 
c230: 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  a UNION ALL SELE
c240: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22  CT * FROM j2,j3"
c250: 20 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42   .      {ORDER B
c260: 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20  Y} {UNION ALL}. 
c270: 20 32 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75   2   "SELECT cou
c280: 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 4f 52  nt(*) FROM j1 OR
c290: 44 45 52 20 42 59 20 31 20 55 4e 49 4f 4e 20 41  DER BY 1 UNION A
c2a0: 4c 4c 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29  LL SELECT max(e)
c2b0: 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20   FROM j2".      
c2c0: 7b 4f 52 44 45 52 20 42 59 7d 20 7b 55 4e 49 4f  {ORDER BY} {UNIO
c2d0: 4e 20 41 4c 4c 7d 0a 20 20 33 20 20 20 22 53 45  N ALL}.  3   "SE
c2e0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a  LECT count(*), *
c2f0: 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42   FROM j1 ORDER B
c300: 59 20 31 2c 32 2c 33 20 55 4e 49 4f 4e 20 41 4c  Y 1,2,3 UNION AL
c310: 4c 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f  L SELECT *,* FRO
c320: 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44  M j2".      {ORD
c330: 45 52 20 42 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c  ER BY} {UNION AL
c340: 4c 7d 0a 20 20 34 20 20 20 22 53 45 4c 45 43 54  L}.  4   "SELECT
c350: 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54   * FROM j1 LIMIT
c360: 20 31 30 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   10 UNION ALL SE
c370: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a  LECT * FROM j2,j
c380: 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20  3" .      LIMIT 
c390: 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20 35 20  {UNION ALL}.  5 
c3a0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
c3b0: 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f 46 46   j1 LIMIT 10 OFF
c3c0: 53 45 54 20 35 20 55 4e 49 4f 4e 20 41 4c 4c 20  SET 5 UNION ALL 
c3d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32  SELECT * FROM j2
c3e0: 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49  ,j3" .      LIMI
c3f0: 54 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20  T {UNION ALL}.  
c400: 36 20 20 20 22 53 45 4c 45 43 54 20 61 20 46 52  6   "SELECT a FR
c410: 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c  OM j1 LIMIT (SEL
c420: 45 43 54 20 65 20 46 52 4f 4d 20 6a 32 29 20 55  ECT e FROM j2) U
c430: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
c440: 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20  g FROM j2,j3" . 
c450: 20 20 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f       LIMIT {UNIO
c460: 4e 20 41 4c 4c 7d 0a 0a 20 20 37 20 20 20 22 53  N ALL}..  7   "S
c470: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
c480: 4f 52 44 45 52 20 42 59 20 61 20 55 4e 49 4f 4e  ORDER BY a UNION
c490: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
c4a0: 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 7b 4f 52  2,j3" .      {OR
c4b0: 44 45 52 20 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a  DER BY} {UNION}.
c4c0: 20 20 38 20 20 20 22 53 45 4c 45 43 54 20 63 6f    8   "SELECT co
c4d0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 4f  unt(*) FROM j1 O
c4e0: 52 44 45 52 20 42 59 20 31 20 55 4e 49 4f 4e 20  RDER BY 1 UNION 
c4f0: 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52  SELECT max(e) FR
c500: 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52  OM j2".      {OR
c510: 44 45 52 20 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a  DER BY} {UNION}.
c520: 20 20 39 20 20 20 22 53 45 4c 45 43 54 20 63 6f    9   "SELECT co
c530: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a  unt(*), * FROM j
c540: 31 20 4f 52 44 45 52 20 42 59 20 31 2c 32 2c 33  1 ORDER BY 1,2,3
c550: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 2c   UNION SELECT *,
c560: 2a 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20  * FROM j2".     
c570: 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 55 4e 49   {ORDER BY} {UNI
c580: 4f 4e 7d 0a 20 20 31 30 20 20 22 53 45 4c 45 43  ON}.  10  "SELEC
c590: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49  T * FROM j1 LIMI
c5a0: 54 20 31 30 20 55 4e 49 4f 4e 20 53 45 4c 45 43  T 10 UNION SELEC
c5b0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20  T * FROM j2,j3" 
c5c0: 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 55 4e  .      LIMIT {UN
c5d0: 49 4f 4e 7d 0a 20 20 31 31 20 20 22 53 45 4c 45  ION}.  11  "SELE
c5e0: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d  CT * FROM j1 LIM
c5f0: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 20 55  IT 10 OFFSET 5 U
c600: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  NION SELECT * FR
c610: 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20  OM j2,j3" .     
c620: 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 7d 0a 20   LIMIT {UNION}. 
c630: 20 31 32 20 20 22 53 45 4c 45 43 54 20 61 20 46   12  "SELECT a F
c640: 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 28 53 45  ROM j1 LIMIT (SE
c650: 4c 45 43 54 20 65 20 46 52 4f 4d 20 6a 32 29 20  LECT e FROM j2) 
c660: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 67 20 46  UNION SELECT g F
c670: 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20  ROM j2,j3" .    
c680: 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 7d 0a    LIMIT {UNION}.
c690: 0a 20 20 31 33 20 20 22 53 45 4c 45 43 54 20 2a  .  13  "SELECT *
c6a0: 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42   FROM j1 ORDER B
c6b0: 59 20 61 20 45 58 43 45 50 54 20 53 45 4c 45 43  Y a EXCEPT SELEC
c6c0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20  T * FROM j2,j3" 
c6d0: 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59  .      {ORDER BY
c6e0: 7d 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 34 20  } {EXCEPT}.  14 
c6f0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
c700: 29 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20  ) FROM j1 ORDER 
c710: 42 59 20 31 20 45 58 43 45 50 54 20 53 45 4c 45  BY 1 EXCEPT SELE
c720: 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a  CT max(e) FROM j
c730: 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20  2".      {ORDER 
c740: 42 59 7d 20 7b 45 58 43 45 50 54 7d 0a 20 20 31  BY} {EXCEPT}.  1
c750: 35 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  5  "SELECT count
c760: 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 4f  (*), * FROM j1 O
c770: 52 44 45 52 20 42 59 20 31 2c 32 2c 33 20 45 58  RDER BY 1,2,3 EX
c780: 43 45 50 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20  CEPT SELECT *,* 
c790: 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b  FROM j2".      {
c7a0: 4f 52 44 45 52 20 42 59 7d 20 7b 45 58 43 45 50  ORDER BY} {EXCEP
c7b0: 54 7d 0a 20 20 31 36 20 20 22 53 45 4c 45 43 54  T}.  16  "SELECT
c7c0: 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54   * FROM j1 LIMIT
c7d0: 20 31 30 20 45 58 43 45 50 54 20 53 45 4c 45 43   10 EXCEPT SELEC
c7e0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20  T * FROM j2,j3" 
c7f0: 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 45 58  .      LIMIT {EX
c800: 43 45 50 54 7d 0a 20 20 31 37 20 20 22 53 45 4c  CEPT}.  17  "SEL
c810: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49  ECT * FROM j1 LI
c820: 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 20  MIT 10 OFFSET 5 
c830: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
c840: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
c850: 20 20 20 4c 49 4d 49 54 20 7b 45 58 43 45 50 54     LIMIT {EXCEPT
c860: 7d 0a 20 20 31 38 20 20 22 53 45 4c 45 43 54 20  }.  18  "SELECT 
c870: 61 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20  a FROM j1 LIMIT 
c880: 28 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 6a  (SELECT e FROM j
c890: 32 29 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  2) EXCEPT SELECT
c8a0: 20 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a   g FROM j2,j3" .
c8b0: 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 45 58 43        LIMIT {EXC
c8c0: 45 50 54 7d 0a 0a 20 20 31 39 20 20 22 53 45 4c  EPT}..  19  "SEL
c8d0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52  ECT * FROM j1 OR
c8e0: 44 45 52 20 42 59 20 61 20 49 4e 54 45 52 53 45  DER BY a INTERSE
c8f0: 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  CT SELECT * FROM
c900: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 7b   j2,j3" .      {
c910: 4f 52 44 45 52 20 42 59 7d 20 7b 49 4e 54 45 52  ORDER BY} {INTER
c920: 53 45 43 54 7d 0a 20 20 32 30 20 20 22 53 45 4c  SECT}.  20  "SEL
c930: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
c940: 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 31 20  M j1 ORDER BY 1 
c950: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
c960: 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 22   max(e) FROM j2"
c970: 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59  .      {ORDER BY
c980: 7d 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20  } {INTERSECT}.  
c990: 32 31 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  21  "SELECT coun
c9a0: 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31 20  t(*), * FROM j1 
c9b0: 4f 52 44 45 52 20 42 59 20 31 2c 32 2c 33 20 49  ORDER BY 1,2,3 I
c9c0: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
c9d0: 2a 2c 2a 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20  *,* FROM j2".   
c9e0: 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 49     {ORDER BY} {I
c9f0: 4e 54 45 52 53 45 43 54 7d 0a 20 20 32 32 20 20  NTERSECT}.  22  
ca00: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
ca10: 31 20 4c 49 4d 49 54 20 31 30 20 49 4e 54 45 52  1 LIMIT 10 INTER
ca20: 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52  SECT SELECT * FR
ca30: 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20  OM j2,j3" .     
ca40: 20 4c 49 4d 49 54 20 7b 49 4e 54 45 52 53 45 43   LIMIT {INTERSEC
ca50: 54 7d 0a 20 20 32 33 20 20 22 53 45 4c 45 43 54  T}.  23  "SELECT
ca60: 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54   * FROM j1 LIMIT
ca70: 20 31 30 20 4f 46 46 53 45 54 20 35 20 49 4e 54   10 OFFSET 5 INT
ca80: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
ca90: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
caa0: 20 20 20 4c 49 4d 49 54 20 7b 49 4e 54 45 52 53     LIMIT {INTERS
cab0: 45 43 54 7d 0a 20 20 32 34 20 20 22 53 45 4c 45  ECT}.  24  "SELE
cac0: 43 54 20 61 20 46 52 4f 4d 20 6a 31 20 4c 49 4d  CT a FROM j1 LIM
cad0: 49 54 20 28 53 45 4c 45 43 54 20 65 20 46 52 4f  IT (SELECT e FRO
cae0: 4d 20 6a 32 29 20 49 4e 54 45 52 53 45 43 54 20  M j2) INTERSECT 
caf0: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32  SELECT g FROM j2
cb00: 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49  ,j3" .      LIMI
cb10: 54 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 7d 20  T {INTERSECT}.} 
cb20: 7b 0a 20 20 73 65 74 20 65 72 72 20 22 24 6f 70  {.  set err "$op
cb30: 31 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  1 clause should 
cb40: 63 6f 6d 65 20 61 66 74 65 72 20 24 6f 70 32 20  come after $op2 
cb50: 6e 6f 74 20 62 65 66 6f 72 65 22 0a 20 20 64 6f  not before".  do
cb60: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
cb70: 5f 73 65 6c 65 63 74 2d 37 2e 32 2e 24 74 6e 20  _select-7.2.$tn 
cb80: 24 73 65 6c 65 63 74 20 5b 6c 69 73 74 20 31 20  $select [list 1 
cb90: 24 65 72 72 5d 0a 7d 0a 0a 23 20 45 56 49 44 45  $err].}..# EVIDE
cba0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 34 34 30 2d  NCE-OF: R-45440-
cbb0: 32 35 36 33 33 20 4f 52 44 45 52 20 42 59 20 61  25633 ORDER BY a
cbc0: 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73  nd LIMIT clauses
cbd0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   may only occur.
cbe0: 23 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  # at the end of 
cbf0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6d 70 6f  the entire compo
cc00: 75 6e 64 20 53 45 4c 45 43 54 2c 20 61 6e 64 20  und SELECT, and 
cc10: 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65  then only if the
cc20: 20 66 69 6e 61 6c 0a 23 20 65 6c 65 6d 65 6e 74   final.# element
cc30: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
cc40: 20 69 73 20 6e 6f 74 20 61 20 56 41 4c 55 45 53   is not a VALUES
cc50: 20 63 6c 61 75 73 65 2e 0a 23 0a 66 6f 72 65 61   clause..#.forea
cc60: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 7d 20 7b  ch {tn select} {
cc70: 0a 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 2a  .  1   "SELECT *
cc80: 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 41   FROM j1 UNION A
cc90: 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  LL SELECT * FROM
cca0: 20 6a 32 2c 6a 33 20 4f 52 44 45 52 20 42 59 20   j2,j3 ORDER BY 
ccb0: 61 22 0a 20 20 32 20 20 20 22 53 45 4c 45 43 54  a".  2   "SELECT
ccc0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a   count(*) FROM j
ccd0: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
cce0: 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a  CT max(e) FROM j
ccf0: 32 20 4f 52 44 45 52 20 42 59 20 31 22 0a 20 20  2 ORDER BY 1".  
cd00: 33 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  3   "SELECT coun
cd10: 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31 20  t(*), * FROM j1 
cd20: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
cd30: 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52 44   *,* FROM j2 ORD
cd40: 45 52 20 42 59 20 31 2c 32 2c 33 22 0a 20 20 34  ER BY 1,2,3".  4
cd50: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
cd60: 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M j1 UNION ALL S
cd70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
cd80: 6a 33 20 4c 49 4d 49 54 20 31 30 22 20 0a 20 20  j3 LIMIT 10" .  
cd90: 35 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  5   "SELECT * FR
cda0: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM j1 UNION ALL 
cdb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32  SELECT * FROM j2
cdc0: 2c 6a 33 20 4c 49 4d 49 54 20 31 30 20 4f 46 46  ,j3 LIMIT 10 OFF
cdd0: 53 45 54 20 35 22 20 0a 20 20 36 20 20 20 22 53  SET 5" .  6   "S
cde0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a 31 20  ELECT a FROM j1 
cdf0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
ce00: 20 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49   g FROM j2,j3 LI
ce10: 4d 49 54 20 28 53 45 4c 45 43 54 20 31 30 29 22  MIT (SELECT 10)"
ce20: 20 0a 0a 20 20 37 20 20 20 22 53 45 4c 45 43 54   ..  7   "SELECT
ce30: 20 2a 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e   * FROM j1 UNION
ce40: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
ce50: 32 2c 6a 33 20 4f 52 44 45 52 20 42 59 20 61 22  2,j3 ORDER BY a"
ce60: 0a 20 20 38 20 20 20 22 53 45 4c 45 43 54 20 63  .  8   "SELECT c
ce70: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20  ount(*) FROM j1 
ce80: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 6d 61 78  UNION SELECT max
ce90: 28 65 29 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45  (e) FROM j2 ORDE
cea0: 52 20 42 59 20 31 22 0a 20 20 38 62 20 20 22 56  R BY 1".  8b  "V
ceb0: 41 4c 55 45 53 28 27 38 62 27 29 20 55 4e 49 4f  ALUES('8b') UNIO
cec0: 4e 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20  N SELECT max(e) 
ced0: 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59  FROM j2 ORDER BY
cee0: 20 31 22 0a 20 20 39 20 20 20 22 53 45 4c 45 43   1".  9   "SELEC
cef0: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46 52  T count(*), * FR
cf00: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM j1 UNION SELE
cf10: 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f  CT *,* FROM j2 O
cf20: 52 44 45 52 20 42 59 20 31 2c 32 2c 33 22 0a 20  RDER BY 1,2,3". 
cf30: 20 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20 46   10  "SELECT * F
cf40: 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM j1 UNION SEL
cf50: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
cf60: 20 4c 49 4d 49 54 20 31 30 22 20 0a 20 20 31 31   LIMIT 10" .  11
cf70: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
cf80: 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   j1 UNION SELECT
cf90: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49   * FROM j2,j3 LI
cfa0: 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22  MIT 10 OFFSET 5"
cfb0: 20 0a 20 20 31 32 20 20 22 53 45 4c 45 43 54 20   .  12  "SELECT 
cfc0: 61 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20  a FROM j1 UNION 
cfd0: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32  SELECT g FROM j2
cfe0: 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43  ,j3 LIMIT (SELEC
cff0: 54 20 31 30 29 22 20 0a 0a 20 20 31 33 20 20 22  T 10)" ..  13  "
d000: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
d010: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
d020: 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f 52 44 45   FROM j2,j3 ORDE
d030: 52 20 42 59 20 61 22 0a 20 20 31 34 20 20 22 53  R BY a".  14  "S
d040: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
d050: 52 4f 4d 20 6a 31 20 45 58 43 45 50 54 20 53 45  ROM j1 EXCEPT SE
d060: 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d  LECT max(e) FROM
d070: 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 22 0a   j2 ORDER BY 1".
d080: 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 63 6f    15  "SELECT co
d090: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a  unt(*), * FROM j
d0a0: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
d0b0: 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45  *,* FROM j2 ORDE
d0c0: 52 20 42 59 20 31 2c 32 2c 33 22 0a 20 20 31 36  R BY 1,2,3".  16
d0d0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
d0e0: 20 6a 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   j1 EXCEPT SELEC
d0f0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c  T * FROM j2,j3 L
d100: 49 4d 49 54 20 31 30 22 20 0a 20 20 31 37 20 20  IMIT 10" .  17  
d110: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
d120: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
d130: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d  * FROM j2,j3 LIM
d140: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
d150: 0a 20 20 31 38 20 20 22 53 45 4c 45 43 54 20 61  .  18  "SELECT a
d160: 20 46 52 4f 4d 20 6a 31 20 45 58 43 45 50 54 20   FROM j1 EXCEPT 
d170: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32  SELECT g FROM j2
d180: 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43  ,j3 LIMIT (SELEC
d190: 54 20 31 30 29 22 20 0a 0a 20 20 31 39 20 20 22  T 10)" ..  19  "
d1a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
d1b0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
d1c0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f  T * FROM j2,j3 O
d1d0: 52 44 45 52 20 42 59 20 61 22 0a 20 20 32 30 20  RDER BY a".  20 
d1e0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
d1f0: 29 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53  ) FROM j1 INTERS
d200: 45 43 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65  ECT SELECT max(e
d210: 29 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20  ) FROM j2 ORDER 
d220: 42 59 20 31 22 0a 20 20 32 31 20 20 22 53 45 4c  BY 1".  21  "SEL
d230: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20  ECT count(*), * 
d240: 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43  FROM j1 INTERSEC
d250: 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f  T SELECT *,* FRO
d260: 4d 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 2c  M j2 ORDER BY 1,
d270: 32 2c 33 22 0a 20 20 32 32 20 20 22 53 45 4c 45  2,3".  22  "SELE
d280: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54  CT * FROM j1 INT
d290: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
d2a0: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54  FROM j2,j3 LIMIT
d2b0: 20 31 30 22 20 0a 20 20 32 33 20 20 22 53 45 4c   10" .  23  "SEL
d2c0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e  ECT * FROM j1 IN
d2d0: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a  TERSECT SELECT *
d2e0: 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49   FROM j2,j3 LIMI
d2f0: 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 0a  T 10 OFFSET 5" .
d300: 20 20 32 34 20 20 22 53 45 4c 45 43 54 20 61 20    24  "SELECT a 
d310: 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43  FROM j1 INTERSEC
d320: 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  T SELECT g FROM 
d330: 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c  j2,j3 LIMIT (SEL
d340: 45 43 54 20 31 30 29 22 20 0a 7d 20 7b 0a 20 20  ECT 10)" .} {.  
d350: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
d360: 2d 37 2e 33 2e 24 74 6e 20 7b 20 63 61 74 63 68  -7.3.$tn { catch
d370: 20 7b 65 78 65 63 73 71 6c 20 24 73 65 6c 65 63   {execsql $selec
d380: 74 7d 20 6d 73 67 20 7d 20 30 0a 7d 0a 66 6f 72  t} msg } 0.}.for
d390: 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 7d  each {tn select}
d3a0: 20 7b 0a 20 20 35 30 20 20 20 22 53 45 4c 45 43   {.  50   "SELEC
d3b0: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45  T * FROM j1 ORDE
d3c0: 52 20 42 59 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  R BY 1 UNION ALL
d3d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
d3e0: 32 2c 6a 33 22 0a 20 20 35 31 20 20 20 22 53 45  2,j3".  51   "SE
d3f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c  LECT * FROM j1 L
d400: 49 4d 49 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  IMIT 1 UNION ALL
d410: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
d420: 32 2c 6a 33 22 0a 20 20 35 32 20 20 20 22 53 45  2,j3".  52   "SE
d430: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
d440: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM j1 UNION ALL 
d450: 56 41 4c 55 45 53 28 31 31 29 20 4f 52 44 45 52  VALUES(11) ORDER
d460: 20 42 59 20 31 22 0a 20 20 35 33 20 20 20 22 53   BY 1".  53   "S
d470: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
d480: 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM j1 UNION ALL
d490: 20 56 41 4c 55 45 53 28 31 31 29 20 4c 49 4d 49   VALUES(11) LIMI
d4a0: 54 20 31 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  T 1".} {.  do_te
d4b0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 33 2e  st e_select-7.3.
d4c0: 24 74 6e 20 7b 20 63 61 74 63 68 20 7b 65 78 65  $tn { catch {exe
d4d0: 63 73 71 6c 20 24 73 65 6c 65 63 74 7d 20 6d 73  csql $select} ms
d4e0: 67 20 7d 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45  g } 1.}..# EVIDE
d4f0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 35 33 31 2d  NCE-OF: R-08531-
d500: 33 36 35 34 33 20 41 20 63 6f 6d 70 6f 75 6e 64  36543 A compound
d510: 20 53 45 4c 45 43 54 20 63 72 65 61 74 65 64 20   SELECT created 
d520: 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 0a  using UNION ALL.
d530: 23 20 6f 70 65 72 61 74 6f 72 20 72 65 74 75 72  # operator retur
d540: 6e 73 20 61 6c 6c 20 74 68 65 20 72 6f 77 73 20  ns all the rows 
d550: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
d560: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
d570: 68 65 20 55 4e 49 4f 4e 0a 23 20 41 4c 4c 20 6f  he UNION.# ALL o
d580: 70 65 72 61 74 6f 72 2c 20 61 6e 64 20 61 6c 6c  perator, and all
d590: 20 74 68 65 20 72 6f 77 73 20 66 72 6f 6d 20 74   the rows from t
d5a0: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  he SELECT to the
d5b0: 20 72 69 67 68 74 20 6f 66 20 69 74 2e 0a 23 0a   right of it..#.
d5c0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
d5d0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
d5e0: 65 5f 73 65 6c 65 63 74 2d 37 2e 34 2e 30 20 7b  e_select-7.4.0 {
d5f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
d600: 71 31 28 61 20 54 45 58 54 2c 20 62 20 49 4e 54  q1(a TEXT, b INT
d610: 45 47 45 52 2c 20 63 29 3b 0a 20 20 43 52 45 41  EGER, c);.  CREA
d620: 54 45 20 54 41 42 4c 45 20 71 32 28 64 20 4e 55  TE TABLE q2(d NU
d630: 4d 42 45 52 2c 20 65 20 42 4c 4f 42 29 3b 0a 20  MBER, e BLOB);. 
d640: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 71 33   CREATE TABLE q3
d650: 28 66 20 52 45 41 4c 2c 20 67 29 3b 0a 0a 20 20  (f REAL, g);..  
d660: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 31 20 56  INSERT INTO q1 V
d670: 41 4c 55 45 53 28 31 36 2c 20 2d 38 37 2e 36 36  ALUES(16, -87.66
d680: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
d690: 54 20 49 4e 54 4f 20 71 31 20 56 41 4c 55 45 53  T INTO q1 VALUES
d6a0: 28 27 6c 65 67 69 62 6c 65 27 2c 20 39 34 2c 20  ('legible', 94, 
d6b0: 2d 34 32 2e 34 37 29 3b 0a 20 20 49 4e 53 45 52  -42.47);.  INSER
d6c0: 54 20 49 4e 54 4f 20 71 31 20 56 41 4c 55 45 53  T INTO q1 VALUES
d6d0: 28 27 62 65 61 75 74 79 27 2c 20 33 36 2c 20 4e  ('beauty', 36, N
d6e0: 55 4c 4c 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  ULL);..  INSERT 
d6f0: 49 4e 54 4f 20 71 32 20 56 41 4c 55 45 53 28 27  INTO q2 VALUES('
d700: 6c 65 67 69 62 6c 65 27 2c 20 31 29 3b 0a 20 20  legible', 1);.  
d710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 32 20 56  INSERT INTO q2 V
d720: 41 4c 55 45 53 28 27 62 65 61 75 74 79 27 2c 20  ALUES('beauty', 
d730: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
d740: 4f 20 71 32 20 56 41 4c 55 45 53 28 2d 36 35 2e  O q2 VALUES(-65.
d750: 39 31 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54  91, 4);.  INSERT
d760: 20 49 4e 54 4f 20 71 32 20 56 41 4c 55 45 53 28   INTO q2 VALUES(
d770: 27 65 6d 61 6e 61 74 69 6e 67 27 2c 20 2d 31 36  'emanating', -16
d780: 2e 35 36 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  .56);..  INSERT 
d790: 49 4e 54 4f 20 71 33 20 56 41 4c 55 45 53 28 27  INTO q3 VALUES('
d7a0: 62 65 61 75 74 79 27 2c 20 32 29 3b 0a 20 20 49  beauty', 2);.  I
d7b0: 4e 53 45 52 54 20 49 4e 54 4f 20 71 33 20 56 41  NSERT INTO q3 VA
d7c0: 4c 55 45 53 28 27 62 65 61 75 74 79 27 2c 20 32  LUES('beauty', 2
d7d0: 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63  );.} {}.do_selec
d7e0: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
d7f0: 2d 37 2e 34 20 7b 0a 20 20 31 20 20 20 7b 53 45  -7.4 {.  1   {SE
d800: 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31 20 55  LECT a FROM q1 U
d810: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
d820: 64 20 46 52 4f 4d 20 71 32 7d 0a 20 20 20 20 20  d FROM q2}.     
d830: 20 7b 31 36 20 6c 65 67 69 62 6c 65 20 62 65 61   {16 legible bea
d840: 75 74 79 20 6c 65 67 69 62 6c 65 20 62 65 61 75  uty legible beau
d850: 74 79 20 2d 36 35 2e 39 31 20 65 6d 61 6e 61 74  ty -65.91 emanat
d860: 69 6e 67 7d 0a 0a 20 20 32 20 20 20 7b 53 45 4c  ing}..  2   {SEL
d870: 45 43 54 20 2a 20 46 52 4f 4d 20 71 31 20 57 48  ECT * FROM q1 WH
d880: 45 52 45 20 61 3d 31 36 20 55 4e 49 4f 4e 20 41  ERE a=16 UNION A
d890: 4c 4c 20 53 45 4c 45 43 54 20 27 78 27 2c 20 2a  LL SELECT 'x', *
d8a0: 20 46 52 4f 4d 20 71 32 20 57 48 45 52 45 20 6f   FROM q2 WHERE o
d8b0: 69 64 3d 31 7d 0a 20 20 20 20 20 20 7b 31 36 20  id=1}.      {16 
d8c0: 2d 38 37 2e 36 36 20 7b 7d 20 78 20 6c 65 67 69  -87.66 {} x legi
d8d0: 62 6c 65 20 31 7d 0a 0a 20 20 33 20 20 20 7b 53  ble 1}..  3   {S
d8e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
d8f0: 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM q1 UNION ALL
d900: 20 53 45 4c 45 43 54 20 6d 69 6e 28 65 29 20 46   SELECT min(e) F
d910: 52 4f 4d 20 71 32 7d 20 0a 20 20 20 20 20 20 7b  ROM q2} .      {
d920: 33 20 2d 31 36 2e 35 36 7d 0a 0a 20 20 34 20 20  3 -16.56}..  4  
d930: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
d940: 71 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  q2 UNION ALL SEL
d950: 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d 20 0a  ECT * FROM q3} .
d960: 20 20 20 20 20 20 7b 6c 65 67 69 62 6c 65 20 31        {legible 1
d970: 20 62 65 61 75 74 79 20 32 20 2d 36 35 2e 39 31   beauty 2 -65.91
d980: 20 34 20 65 6d 61 6e 61 74 69 6e 67 20 2d 31 36   4 emanating -16
d990: 2e 35 36 20 62 65 61 75 74 79 20 32 20 62 65 61  .56 beauty 2 bea
d9a0: 75 74 79 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49  uty 2}.} ..# EVI
d9b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 36  DENCE-OF: R-2056
d9c0: 30 2d 33 39 31 36 32 20 54 68 65 20 55 4e 49 4f  0-39162 The UNIO
d9d0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  N operator works
d9e0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
d9f0: 0a 23 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 65 78  .# UNION ALL, ex
da00: 63 65 70 74 20 74 68 61 74 20 64 75 70 6c 69 63  cept that duplic
da10: 61 74 65 20 72 6f 77 73 20 61 72 65 20 72 65 6d  ate rows are rem
da20: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  oved from the fi
da30: 6e 61 6c 0a 23 20 72 65 73 75 6c 74 20 73 65 74  nal.# result set
da40: 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
da50: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 35  sts e_select-7.5
da60: 20 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54   {.  1   {SELECT
da70: 20 61 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e   a FROM q1 UNION
da80: 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 71   SELECT d FROM q
da90: 32 7d 0a 20 20 20 20 20 20 7b 2d 36 35 2e 39 31  2}.      {-65.91
daa0: 20 31 36 20 62 65 61 75 74 79 20 65 6d 61 6e 61   16 beauty emana
dab0: 74 69 6e 67 20 6c 65 67 69 62 6c 65 7d 0a 0a 20  ting legible}.. 
dac0: 20 32 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46   2   {SELECT * F
dad0: 52 4f 4d 20 71 31 20 57 48 45 52 45 20 61 3d 31  ROM q1 WHERE a=1
dae0: 36 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27  6 UNION SELECT '
daf0: 78 27 2c 20 2a 20 46 52 4f 4d 20 71 32 20 57 48  x', * FROM q2 WH
db00: 45 52 45 20 6f 69 64 3d 31 7d 0a 20 20 20 20 20  ERE oid=1}.     
db10: 20 7b 31 36 20 2d 38 37 2e 36 36 20 7b 7d 20 78   {16 -87.66 {} x
db20: 20 6c 65 67 69 62 6c 65 20 31 7d 0a 0a 20 20 33   legible 1}..  3
db30: 20 20 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74     {SELECT count
db40: 28 2a 29 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f  (*) FROM q1 UNIO
db50: 4e 20 53 45 4c 45 43 54 20 6d 69 6e 28 65 29 20  N SELECT min(e) 
db60: 46 52 4f 4d 20 71 32 7d 20 0a 20 20 20 20 20 20  FROM q2} .      
db70: 7b 2d 31 36 2e 35 36 20 33 7d 0a 0a 20 20 34 20  {-16.56 3}..  4 
db80: 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    {SELECT * FROM
db90: 20 71 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   q2 UNION SELECT
dba0: 20 2a 20 46 52 4f 4d 20 71 33 7d 20 0a 20 20 20   * FROM q3} .   
dbb0: 20 20 20 7b 2d 36 35 2e 39 31 20 34 20 62 65 61     {-65.91 4 bea
dbc0: 75 74 79 20 32 20 65 6d 61 6e 61 74 69 6e 67 20  uty 2 emanating 
dbd0: 2d 31 36 2e 35 36 20 6c 65 67 69 62 6c 65 20 31  -16.56 legible 1
dbe0: 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45  }.} ..# EVIDENCE
dbf0: 2d 4f 46 3a 20 52 2d 34 35 37 36 34 2d 33 31 37  -OF: R-45764-317
dc00: 33 37 20 54 68 65 20 49 4e 54 45 52 53 45 43 54  37 The INTERSECT
dc10: 20 6f 70 65 72 61 74 6f 72 20 72 65 74 75 72 6e   operator return
dc20: 73 20 74 68 65 0a 23 20 69 6e 74 65 72 73 65 63  s the.# intersec
dc30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 73 75  tion of the resu
dc40: 6c 74 73 20 6f 66 20 74 68 65 20 6c 65 66 74 20  lts of the left 
dc50: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
dc60: 73 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  s..#.do_select_t
dc70: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e  ests e_select-7.
dc80: 36 20 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45 43  6 {.  1   {SELEC
dc90: 54 20 61 20 46 52 4f 4d 20 71 31 20 49 4e 54 45  T a FROM q1 INTE
dca0: 52 53 45 43 54 20 53 45 4c 45 43 54 20 64 20 46  RSECT SELECT d F
dcb0: 52 4f 4d 20 71 32 7d 20 7b 62 65 61 75 74 79 20  ROM q2} {beauty 
dcc0: 6c 65 67 69 62 6c 65 7d 0a 20 20 32 20 20 20 7b  legible}.  2   {
dcd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 32  SELECT * FROM q2
dce0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
dcf0: 54 20 2a 20 46 52 4f 4d 20 71 33 7d 20 7b 62 65  T * FROM q3} {be
dd00: 61 75 74 79 20 32 7d 0a 7d 0a 0a 23 20 45 56 49  auty 2}.}..# EVI
dd10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 37 38  DENCE-OF: R-2578
dd20: 37 2d 32 38 39 34 39 20 54 68 65 20 45 58 43 45  7-28949 The EXCE
dd30: 50 54 20 6f 70 65 72 61 74 6f 72 20 72 65 74 75  PT operator retu
dd40: 72 6e 73 20 74 68 65 20 73 75 62 73 65 74 20 6f  rns the subset o
dd50: 66 0a 23 20 72 6f 77 73 20 72 65 74 75 72 6e 65  f.# rows returne
dd60: 64 20 62 79 20 74 68 65 20 6c 65 66 74 20 53 45  d by the left SE
dd70: 4c 45 43 54 20 74 68 61 74 20 61 72 65 20 6e 6f  LECT that are no
dd80: 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  t also returned 
dd90: 62 79 20 74 68 65 0a 23 20 72 69 67 68 74 2d 68  by the.# right-h
dda0: 61 6e 64 20 53 45 4c 45 43 54 2e 0a 23 0a 64 6f  and SELECT..#.do
ddb0: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
ddc0: 73 65 6c 65 63 74 2d 37 2e 37 20 7b 0a 20 20 31  select-7.7 {.  1
ddd0: 20 20 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f     {SELECT a FRO
dde0: 4d 20 71 31 20 45 58 43 45 50 54 20 53 45 4c 45  M q1 EXCEPT SELE
ddf0: 43 54 20 64 20 46 52 4f 4d 20 71 32 7d 20 7b 31  CT d FROM q2} {1
de00: 36 7d 0a 0a 20 20 32 20 20 20 7b 53 45 4c 45 43  6}..  2   {SELEC
de10: 54 20 2a 20 46 52 4f 4d 20 71 32 20 45 58 43 45  T * FROM q2 EXCE
de20: 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  PT SELECT * FROM
de30: 20 71 33 7d 20 0a 20 20 20 20 20 20 7b 2d 36 35   q3} .      {-65
de40: 2e 39 31 20 34 20 65 6d 61 6e 61 74 69 6e 67 20  .91 4 emanating 
de50: 2d 31 36 2e 35 36 20 6c 65 67 69 62 6c 65 20 31  -16.56 legible 1
de60: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
de70: 4f 46 3a 20 52 2d 34 30 37 32 39 2d 35 36 34 34  OF: R-40729-5644
de80: 37 20 44 75 70 6c 69 63 61 74 65 20 72 6f 77 73  7 Duplicate rows
de90: 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f   are removed fro
dea0: 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 23 20  m the results.# 
deb0: 6f 66 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64  of INTERSECT and
dec0: 20 45 58 43 45 50 54 20 6f 70 65 72 61 74 6f 72   EXCEPT operator
ded0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 72 65 73  s before the res
dee0: 75 6c 74 20 73 65 74 20 69 73 20 72 65 74 75 72  ult set is retur
def0: 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  ned..#.do_select
df00: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
df10: 37 2e 38 20 7b 0a 20 20 30 20 20 20 7b 53 45 4c  7.8 {.  0   {SEL
df20: 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d 20 7b  ECT * FROM q3} {
df30: 62 65 61 75 74 79 20 32 20 62 65 61 75 74 79 20  beauty 2 beauty 
df40: 32 7d 0a 0a 20 20 31 20 20 20 7b 53 45 4c 45 43  2}..  1   {SELEC
df50: 54 20 2a 20 46 52 4f 4d 20 71 33 20 49 4e 54 45  T * FROM q3 INTE
df60: 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46  RSECT SELECT * F
df70: 52 4f 4d 20 71 33 7d 20 7b 62 65 61 75 74 79 20  ROM q3} {beauty 
df80: 32 7d 0a 20 20 32 20 20 20 7b 53 45 4c 45 43 54  2}.  2   {SELECT
df90: 20 2a 20 46 52 4f 4d 20 71 33 20 45 58 43 45 50   * FROM q3 EXCEP
dfa0: 54 20 53 45 4c 45 43 54 20 61 2c 62 20 46 52 4f  T SELECT a,b FRO
dfb0: 4d 20 71 31 7d 20 20 7b 62 65 61 75 74 79 20 32  M q1}  {beauty 2
dfc0: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
dfd0: 4f 46 3a 20 52 2d 34 36 37 36 35 2d 34 33 33 36  OF: R-46765-4336
dfe0: 32 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  2 For the purpos
dff0: 65 73 20 6f 66 20 64 65 74 65 72 6d 69 6e 69 6e  es of determinin
e000: 67 20 64 75 70 6c 69 63 61 74 65 0a 23 20 72 6f  g duplicate.# ro
e010: 77 73 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ws for the resul
e020: 74 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53  ts of compound S
e030: 45 4c 45 43 54 20 6f 70 65 72 61 74 6f 72 73 2c  ELECT operators,
e040: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
e050: 0a 23 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  .# considered eq
e060: 75 61 6c 20 74 6f 20 6f 74 68 65 72 20 4e 55 4c  ual to other NUL
e070: 4c 20 76 61 6c 75 65 73 20 61 6e 64 20 64 69 73  L values and dis
e080: 74 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6e  tinct from all n
e090: 6f 6e 2d 4e 55 4c 4c 0a 23 20 76 61 6c 75 65 73  on-NULL.# values
e0a0: 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65  ..#.db nullvalue
e0b0: 20 6e 75 6c 6c 0a 64 6f 5f 73 65 6c 65 63 74 5f   null.do_select_
e0c0: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 37  tests e_select-7
e0d0: 2e 39 20 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45  .9 {.  1   {SELE
e0e0: 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 41 4c  CT NULL UNION AL
e0f0: 4c 20 53 45 4c 45 43 54 20 4e 55 4c 4c 7d 20 7b  L SELECT NULL} {
e100: 6e 75 6c 6c 20 6e 75 6c 6c 7d 0a 20 20 32 20 20  null null}.  2  
e110: 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e   {SELECT NULL UN
e120: 49 4f 4e 20 20 20 20 20 53 45 4c 45 43 54 20 4e  ION     SELECT N
e130: 55 4c 4c 7d 20 7b 6e 75 6c 6c 7d 0a 20 20 33 20  ULL} {null}.  3 
e140: 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49    {SELECT NULL I
e150: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
e160: 4e 55 4c 4c 7d 20 7b 6e 75 6c 6c 7d 0a 20 20 34  NULL} {null}.  4
e170: 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20     {SELECT NULL 
e180: 45 58 43 45 50 54 20 20 20 20 53 45 4c 45 43 54  EXCEPT    SELECT
e190: 20 4e 55 4c 4c 7d 20 7b 7d 0a 0a 20 20 35 20 20   NULL} {}..  5  
e1a0: 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e   {SELECT NULL UN
e1b0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
e1c0: 61 62 27 7d 20 7b 6e 75 6c 6c 20 61 62 7d 0a 20  ab'} {null ab}. 
e1d0: 20 36 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c   6   {SELECT NUL
e1e0: 4c 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c 45  L UNION     SELE
e1f0: 43 54 20 27 61 62 27 7d 20 7b 6e 75 6c 6c 20 61  CT 'ab'} {null a
e200: 62 7d 0a 20 20 37 20 20 20 7b 53 45 4c 45 43 54  b}.  7   {SELECT
e210: 20 4e 55 4c 4c 20 49 4e 54 45 52 53 45 43 54 20   NULL INTERSECT 
e220: 53 45 4c 45 43 54 20 27 61 62 27 7d 20 7b 7d 0a  SELECT 'ab'} {}.
e230: 20 20 38 20 20 20 7b 53 45 4c 45 43 54 20 4e 55    8   {SELECT NU
e240: 4c 4c 20 45 58 43 45 50 54 20 20 20 20 53 45 4c  LL EXCEPT    SEL
e250: 45 43 54 20 27 61 62 27 7d 20 7b 6e 75 6c 6c 7d  ECT 'ab'} {null}
e260: 0a 0a 20 20 39 20 20 20 7b 53 45 4c 45 43 54 20  ..  9   {SELECT 
e270: 4e 55 4c 4c 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  NULL UNION ALL S
e280: 45 4c 45 43 54 20 30 7d 20 7b 6e 75 6c 6c 20 30  ELECT 0} {null 0
e290: 7d 0a 20 20 31 30 20 20 7b 53 45 4c 45 43 54 20  }.  10  {SELECT 
e2a0: 4e 55 4c 4c 20 55 4e 49 4f 4e 20 20 20 20 20 53  NULL UNION     S
e2b0: 45 4c 45 43 54 20 30 7d 20 7b 6e 75 6c 6c 20 30  ELECT 0} {null 0
e2c0: 7d 0a 20 20 31 31 20 20 7b 53 45 4c 45 43 54 20  }.  11  {SELECT 
e2d0: 4e 55 4c 4c 20 49 4e 54 45 52 53 45 43 54 20 53  NULL INTERSECT S
e2e0: 45 4c 45 43 54 20 30 7d 20 7b 7d 0a 20 20 31 32  ELECT 0} {}.  12
e2f0: 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 45    {SELECT NULL E
e300: 58 43 45 50 54 20 20 20 20 53 45 4c 45 43 54 20  XCEPT    SELECT 
e310: 30 7d 20 7b 6e 75 6c 6c 7d 0a 0a 20 20 31 33 20  0} {null}..  13 
e320: 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20   {SELECT c FROM 
e330: 71 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  q1 UNION ALL SEL
e340: 45 43 54 20 67 20 46 52 4f 4d 20 71 33 7d 20 7b  ECT g FROM q3} {
e350: 6e 75 6c 6c 20 2d 34 32 2e 34 37 20 6e 75 6c 6c  null -42.47 null
e360: 20 32 20 32 7d 0a 20 20 31 34 20 20 7b 53 45 4c   2 2}.  14  {SEL
e370: 45 43 54 20 63 20 46 52 4f 4d 20 71 31 20 55 4e  ECT c FROM q1 UN
e380: 49 4f 4e 20 20 20 20 20 53 45 4c 45 43 54 20 67  ION     SELECT g
e390: 20 46 52 4f 4d 20 71 33 7d 20 7b 6e 75 6c 6c 20   FROM q3} {null 
e3a0: 2d 34 32 2e 34 37 20 32 7d 0a 20 20 31 35 20 20  -42.47 2}.  15  
e3b0: 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 71  {SELECT c FROM q
e3c0: 31 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  1 INTERSECT SELE
e3d0: 43 54 20 67 20 46 52 4f 4d 20 71 33 7d 20 7b 7d  CT g FROM q3} {}
e3e0: 0a 20 20 31 36 20 20 7b 53 45 4c 45 43 54 20 63  .  16  {SELECT c
e3f0: 20 46 52 4f 4d 20 71 31 20 45 58 43 45 50 54 20   FROM q1 EXCEPT 
e400: 20 20 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d     SELECT g FROM
e410: 20 71 33 7d 20 7b 6e 75 6c 6c 20 2d 34 32 2e 34   q3} {null -42.4
e420: 37 7d 0a 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  7}.}.db nullvalu
e430: 65 20 7b 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43  e {} ..# EVIDENC
e440: 45 2d 4f 46 3a 20 52 2d 35 31 32 33 32 2d 35 30  E-OF: R-51232-50
e450: 32 32 34 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  224 The collatio
e460: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
e470: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 0a 23  to compare two.#
e480: 20 74 65 78 74 20 76 61 6c 75 65 73 20 69 73 20   text values is 
e490: 64 65 74 65 72 6d 69 6e 65 64 20 61 73 20 69 66  determined as if
e4a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
e4b0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
e4c0: 68 74 2d 68 61 6e 64 0a 23 20 53 45 4c 45 43 54  ht-hand.# SELECT
e4d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 65 72 65   statements were
e4e0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
e4f0: 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  ght-hand operand
e500: 73 20 6f 66 20 74 68 65 20 65 71 75 61 6c 73 0a  s of the equals.
e510: 23 20 28 3d 29 20 6f 70 65 72 61 74 6f 72 2c 20  # (=) operator, 
e520: 65 78 63 65 70 74 20 74 68 61 74 20 67 72 65 61  except that grea
e530: 74 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 69  ter precedence i
e540: 73 20 6e 6f 74 20 61 73 73 69 67 6e 65 64 20 74  s not assigned t
e550: 6f 20 61 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20  o a.# collation 
e560: 73 65 71 75 65 6e 63 65 20 73 70 65 63 69 66 69  sequence specifi
e570: 65 64 20 77 69 74 68 20 74 68 65 20 70 6f 73 74  ed with the post
e580: 66 69 78 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  fix COLLATE oper
e590: 61 74 6f 72 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  ator..#.drop_all
e5a0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73  _tables.do_execs
e5b0: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
e5c0: 2d 37 2e 31 30 2e 30 20 7b 0a 20 20 43 52 45 41  -7.10.0 {.  CREA
e5d0: 54 45 20 54 41 42 4c 45 20 79 31 28 61 20 43 4f  TE TABLE y1(a CO
e5e0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 62 20  LLATE nocase, b 
e5f0: 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 2c 20  COLLATE binary, 
e600: 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  c);.  INSERT INT
e610: 4f 20 79 31 20 56 41 4c 55 45 53 28 27 41 62 63  O y1 VALUES('Abc
e620: 27 2c 20 27 61 62 63 27 2c 20 27 61 42 43 27 29  ', 'abc', 'aBC')
e630: 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74  ;.} {}.do_select
e640: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
e650: 37 2e 31 30 20 7b 0a 20 20 31 20 20 20 7b 53 45  7.10 {.  1   {SE
e660: 4c 45 43 54 20 27 61 62 63 27 20 20 20 20 20 20  LECT 'abc'      
e670: 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
e680: 53 45 4c 45 43 54 20 27 41 42 43 27 7d 20 7b 41  SELECT 'ABC'} {A
e690: 42 43 20 61 62 63 7d 0a 20 20 32 20 20 20 7b 53  BC abc}.  2   {S
e6a0: 45 4c 45 43 54 20 27 61 62 63 27 20 43 4f 4c 4c  ELECT 'abc' COLL
e6b0: 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 4f 4e  ATE nocase UNION
e6c0: 20 53 45 4c 45 43 54 20 27 41 42 43 27 7d 20 7b   SELECT 'ABC'} {
e6d0: 41 42 43 7d 0a 20 20 33 20 20 20 7b 53 45 4c 45  ABC}.  3   {SELE
e6e0: 43 54 20 27 61 62 63 27 20 20 20 20 20 20 20 20  CT 'abc'        
e6f0: 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 53 45          UNION SE
e700: 4c 45 43 54 20 27 41 42 43 27 20 43 4f 4c 4c 41  LECT 'ABC' COLLA
e710: 54 45 20 6e 6f 63 61 73 65 7d 20 7b 41 42 43 7d  TE nocase} {ABC}
e720: 0a 20 20 34 20 20 20 7b 53 45 4c 45 43 54 20 27  .  4   {SELECT '
e730: 61 62 63 27 20 43 4f 4c 4c 41 54 45 20 62 69 6e  abc' COLLATE bin
e740: 61 72 79 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  ary UNION SELECT
e750: 20 27 41 42 43 27 20 43 4f 4c 4c 41 54 45 20 6e   'ABC' COLLATE n
e760: 6f 63 61 73 65 7d 20 7b 41 42 43 20 61 62 63 7d  ocase} {ABC abc}
e770: 0a 20 20 35 20 20 20 7b 53 45 4c 45 43 54 20 27  .  5   {SELECT '
e780: 61 62 63 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  abc' COLLATE noc
e790: 61 73 65 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  ase UNION SELECT
e7a0: 20 27 41 42 43 27 20 43 4f 4c 4c 41 54 45 20 62   'ABC' COLLATE b
e7b0: 69 6e 61 72 79 7d 20 7b 41 42 43 7d 0a 0a 20 20  inary} {ABC}..  
e7c0: 36 20 20 20 7b 53 45 4c 45 43 54 20 61 20 46 52  6   {SELECT a FR
e7d0: 4f 4d 20 79 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM y1 UNION SELE
e7e0: 43 54 20 62 20 46 52 4f 4d 20 79 31 7d 20 20 20  CT b FROM y1}   
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 61 62               {ab
e800: 63 7d 0a 20 20 37 20 20 20 7b 53 45 4c 45 43 54  c}.  7   {SELECT
e810: 20 62 20 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e   b FROM y1 UNION
e820: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 79   SELECT a FROM y
e830: 31 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1}              
e840: 20 20 7b 41 62 63 20 61 62 63 7d 0a 20 20 38 20    {Abc abc}.  8 
e850: 20 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    {SELECT a FROM
e860: 20 79 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   y1 UNION SELECT
e870: 20 63 20 46 52 4f 4d 20 79 31 7d 20 20 20 20 20   c FROM y1}     
e880: 20 20 20 20 20 20 20 20 20 20 20 7b 61 42 43 7d             {aBC}
e890: 0a 0a 20 20 39 20 20 20 7b 53 45 4c 45 43 54 20  ..  9   {SELECT 
e8a0: 61 20 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e 20  a FROM y1 UNION 
e8b0: 53 45 4c 45 43 54 20 63 20 43 4f 4c 4c 41 54 45  SELECT c COLLATE
e8c0: 20 62 69 6e 61 72 79 20 46 52 4f 4d 20 79 31 7d   binary FROM y1}
e8d0: 20 7b 61 42 43 7d 0a 7d 0a 0a 23 20 45 56 49 44   {aBC}.}..# EVID
e8e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32 37 30 36  ENCE-OF: R-32706
e8f0: 2d 30 37 34 30 33 20 4e 6f 20 61 66 66 69 6e 69  -07403 No affini
e900: 74 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ty transformatio
e910: 6e 73 20 61 72 65 20 61 70 70 6c 69 65 64 20 74  ns are applied t
e920: 6f 0a 23 20 61 6e 79 20 76 61 6c 75 65 73 20 77  o.# any values w
e930: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 72 6f  hen comparing ro
e940: 77 73 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ws as part of a 
e950: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e  compound SELECT.
e960: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
e970: 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  es.do_execsql_te
e980: 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 30  st e_select-7.10
e990: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
e9a0: 42 4c 45 20 77 31 28 61 20 54 45 58 54 2c 20 62  BLE w1(a TEXT, b
e9b0: 20 4e 55 4d 42 45 52 29 3b 0a 20 20 43 52 45 41   NUMBER);.  CREA
e9c0: 54 45 20 54 41 42 4c 45 20 77 32 28 61 2c 20 62  TE TABLE w2(a, b
e9d0: 20 54 45 58 54 29 3b 0a 0a 20 20 49 4e 53 45 52   TEXT);..  INSER
e9e0: 54 20 49 4e 54 4f 20 77 31 20 56 41 4c 55 45 53  T INTO w1 VALUES
e9f0: 28 27 31 27 2c 20 34 2e 31 29 3b 0a 20 20 49 4e  ('1', 4.1);.  IN
ea00: 53 45 52 54 20 49 4e 54 4f 20 77 32 20 56 41 4c  SERT INTO w2 VAL
ea10: 55 45 53 28 31 2c 20 34 2e 31 29 3b 0a 7d 20 7b  UES(1, 4.1);.} {
ea20: 7d 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  }..do_select_tes
ea30: 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 31  ts e_select-7.11
ea40: 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54   {.  1  { SELECT
ea50: 20 61 20 46 52 4f 4d 20 77 31 20 55 4e 49 4f 4e   a FROM w1 UNION
ea60: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77   SELECT a FROM w
ea70: 32 20 7d 20 7b 31 20 31 7d 0a 20 20 32 20 20 7b  2 } {1 1}.  2  {
ea80: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77   SELECT a FROM w
ea90: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61  2 UNION SELECT a
eaa0: 20 46 52 4f 4d 20 77 31 20 7d 20 7b 31 20 31 7d   FROM w1 } {1 1}
eab0: 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62  .  3  { SELECT b
eac0: 20 46 52 4f 4d 20 77 31 20 55 4e 49 4f 4e 20 53   FROM w1 UNION S
ead0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32 20  ELECT b FROM w2 
eae0: 7d 20 7b 34 2e 31 20 34 2e 31 7d 0a 20 20 34 20  } {4.1 4.1}.  4 
eaf0: 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
eb00: 20 77 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   w2 UNION SELECT
eb10: 20 62 20 46 52 4f 4d 20 77 31 20 7d 20 7b 34 2e   b FROM w1 } {4.
eb20: 31 20 34 2e 31 7d 0a 0a 20 20 35 20 20 7b 20 53  1 4.1}..  5  { S
eb30: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20  ELECT a FROM w1 
eb40: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
eb50: 20 61 20 46 52 4f 4d 20 77 32 20 7d 20 7b 7d 0a   a FROM w2 } {}.
eb60: 20 20 36 20 20 7b 20 53 45 4c 45 43 54 20 61 20    6  { SELECT a 
eb70: 46 52 4f 4d 20 77 32 20 49 4e 54 45 52 53 45 43  FROM w2 INTERSEC
eb80: 54 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  T SELECT a FROM 
eb90: 77 31 20 7d 20 7b 7d 0a 20 20 37 20 20 7b 20 53  w1 } {}.  7  { S
eba0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31 20  ELECT b FROM w1 
ebb0: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
ebc0: 20 62 20 46 52 4f 4d 20 77 32 20 7d 20 7b 7d 0a   b FROM w2 } {}.
ebd0: 20 20 38 20 20 7b 20 53 45 4c 45 43 54 20 62 20    8  { SELECT b 
ebe0: 46 52 4f 4d 20 77 32 20 49 4e 54 45 52 53 45 43  FROM w2 INTERSEC
ebf0: 54 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  T SELECT b FROM 
ec00: 77 31 20 7d 20 7b 7d 0a 0a 20 20 39 20 20 7b 20  w1 } {}..  9  { 
ec10: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31  SELECT a FROM w1
ec20: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 61   EXCEPT SELECT a
ec30: 20 46 52 4f 4d 20 77 32 20 7d 20 7b 31 7d 0a 20   FROM w2 } {1}. 
ec40: 20 31 30 20 7b 20 53 45 4c 45 43 54 20 61 20 46   10 { SELECT a F
ec50: 52 4f 4d 20 77 32 20 45 58 43 45 50 54 20 53 45  ROM w2 EXCEPT SE
ec60: 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20 7d  LECT a FROM w1 }
ec70: 20 7b 31 7d 0a 20 20 31 31 20 7b 20 53 45 4c 45   {1}.  11 { SELE
ec80: 43 54 20 62 20 46 52 4f 4d 20 77 31 20 45 58 43  CT b FROM w1 EXC
ec90: 45 50 54 20 53 45 4c 45 43 54 20 62 20 46 52 4f  EPT SELECT b FRO
eca0: 4d 20 77 32 20 7d 20 7b 34 2e 31 7d 0a 20 20 31  M w2 } {4.1}.  1
ecb0: 32 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f  2 { SELECT b FRO
ecc0: 4d 20 77 32 20 45 58 43 45 50 54 20 53 45 4c 45  M w2 EXCEPT SELE
ecd0: 43 54 20 62 20 46 52 4f 4d 20 77 31 20 7d 20 7b  CT b FROM w1 } {
ece0: 34 2e 31 7d 0a 7d 0a 0a 0a 23 20 45 56 49 44 45  4.1}.}...# EVIDE
ecf0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 32 35 36 32 2d  NCE-OF: R-32562-
ed00: 32 30 35 36 36 20 57 68 65 6e 20 74 68 72 65 65  20566 When three
ed10: 20 6f 72 20 6d 6f 72 65 20 73 69 6d 70 6c 65 20   or more simple 
ed20: 53 45 4c 45 43 54 73 20 61 72 65 0a 23 20 63 6f  SELECTs are.# co
ed30: 6e 6e 65 63 74 65 64 20 69 6e 74 6f 20 61 20 63  nnected into a c
ed40: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
ed50: 74 68 65 79 20 67 72 6f 75 70 20 66 72 6f 6d 20  they group from 
ed60: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 49  left to right. I
ed70: 6e 0a 23 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  n.# other words,
ed80: 20 69 66 20 22 41 22 2c 20 22 42 22 20 61 6e 64   if "A", "B" and
ed90: 20 22 43 22 20 61 72 65 20 61 6c 6c 20 73 69 6d   "C" are all sim
eda0: 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ple SELECT state
edb0: 6d 65 6e 74 73 2c 20 28 41 0a 23 20 6f 70 20 42  ments, (A.# op B
edc0: 20 6f 70 20 43 29 20 69 73 20 70 72 6f 63 65 73   op C) is proces
edd0: 73 65 64 20 61 73 20 28 28 41 20 6f 70 20 42 29  sed as ((A op B)
ede0: 20 6f 70 20 43 29 2e 0a 23 0a 23 20 20 20 65 5f   op C)..#.#   e_
edf0: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 31 3a 20 50  select-7.12.1: P
ee00: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 55 4e 49  recedence of UNI
ee10: 4f 4e 20 76 73 2e 20 49 4e 54 45 52 53 45 43 54  ON vs. INTERSECT
ee20: 20 0a 23 20 20 20 65 5f 73 65 6c 65 63 74 2d 37   .#   e_select-7
ee30: 2e 31 32 2e 32 3a 20 50 72 65 63 65 64 65 6e 63  .12.2: Precedenc
ee40: 65 20 6f 66 20 55 4e 49 4f 4e 20 76 73 2e 20 55  e of UNION vs. U
ee50: 4e 49 4f 4e 20 41 4c 4c 20 0a 23 20 20 20 65 5f  NION ALL .#   e_
ee60: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 33 3a 20 50  select-7.12.3: P
ee70: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 55 4e 49  recedence of UNI
ee80: 4f 4e 20 76 73 2e 20 45 58 43 45 50 54 0a 23 20  ON vs. EXCEPT.# 
ee90: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
eea0: 34 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  4: Precedence of
eeb0: 20 49 4e 54 45 52 53 45 43 54 20 76 73 2e 20 55   INTERSECT vs. U
eec0: 4e 49 4f 4e 20 41 4c 4c 20 0a 23 20 20 20 65 5f  NION ALL .#   e_
eed0: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 35 3a 20 50  select-7.12.5: P
eee0: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 49 4e 54  recedence of INT
eef0: 45 52 53 45 43 54 20 76 73 2e 20 45 58 43 45 50  ERSECT vs. EXCEP
ef00: 54 0a 23 20 20 20 65 5f 73 65 6c 65 63 74 2d 37  T.#   e_select-7
ef10: 2e 31 32 2e 36 3a 20 50 72 65 63 65 64 65 6e 63  .12.6: Precedenc
ef20: 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 20 76  e of UNION ALL v
ef30: 73 2e 20 45 58 43 45 50 54 0a 23 20 20 20 65 5f  s. EXCEPT.#   e_
ef40: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 37 3a 20 43  select-7.12.7: C
ef50: 68 65 63 6b 20 74 68 61 74 20 22 61 20 45 58 43  heck that "a EXC
ef60: 45 50 54 20 62 20 45 58 43 45 50 54 20 63 22 20  EPT b EXCEPT c" 
ef70: 69 73 20 70 72 6f 63 65 73 73 65 64 20 61 73 20  is processed as 
ef80: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
ef90: 20 20 20 20 20 22 28 61 20 45 58 43 45 50 54 20       "(a EXCEPT 
efa0: 62 29 20 45 58 43 45 50 54 20 63 22 2e 0a 23 0a  b) EXCEPT c"..#.
efb0: 23 20 54 68 65 20 49 4e 54 45 52 53 45 43 54 20  # The INTERSECT 
efc0: 61 6e 64 20 45 58 43 45 50 54 20 6f 70 65 72 61  and EXCEPT opera
efd0: 74 69 6f 6e 73 20 61 72 65 20 6d 75 74 75 61 6c  tions are mutual
efe0: 6c 79 20 63 6f 6d 6d 75 74 61 74 69 76 65 2e 20  ly commutative. 
eff0: 53 6f 0a 23 20 74 68 65 20 65 5f 73 65 6c 65 63  So.# the e_selec
f000: 74 2d 37 2e 31 32 2e 35 20 74 65 73 74 20 63 61  t-7.12.5 test ca
f010: 73 65 73 20 64 6f 20 6e 6f 74 20 70 72 6f 76 65  ses do not prove
f020: 20 76 65 72 79 20 6d 75 63 68 2e 0a 23 0a 64 72   very much..#.dr
f030: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
f040: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
f050: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 30 20 7b 0a  select-7.12.0 {.
f060: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
f070: 31 28 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  1(x);.  INSERT I
f080: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 29  NTO t1 VALUES(1)
f090: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f0a0: 74 31 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20  t1 VALUES(2);.  
f0b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f0c0: 41 4c 55 45 53 28 33 29 3b 0a 7d 20 7b 7d 0a 66  ALUES(3);.} {}.f
f0d0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63  oreach {tn selec
f0e0: 74 20 72 65 73 7d 20 7b 0a 20 20 31 61 20 22 28  t res} {.  1a "(
f0f0: 31 2c 32 29 20 49 4e 54 45 52 53 45 43 54 20 28  1,2) INTERSECT (
f100: 31 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 28  1)   UNION     (
f110: 33 29 22 20 20 20 7b 31 20 33 7d 0a 20 20 31 62  3)"   {1 3}.  1b
f120: 20 22 28 33 29 20 20 20 55 4e 49 4f 4e 20 20 20   "(3)   UNION   
f130: 20 20 28 31 2c 32 29 20 49 4e 54 45 52 53 45 43    (1,2) INTERSEC
f140: 54 20 28 31 29 22 20 20 20 7b 31 7d 0a 0a 20 20  T (1)"   {1}..  
f150: 32 61 20 22 28 31 2c 32 29 20 55 4e 49 4f 4e 20  2a "(1,2) UNION 
f160: 20 20 20 20 28 33 29 20 20 20 55 4e 49 4f 4e 20      (3)   UNION 
f170: 41 4c 4c 20 28 31 29 22 20 20 20 7b 31 20 32 20  ALL (1)"   {1 2 
f180: 33 20 31 7d 0a 20 20 32 62 20 22 28 31 29 20 20  3 1}.  2b "(1)  
f190: 20 55 4e 49 4f 4e 20 41 4c 4c 20 28 33 29 20 20   UNION ALL (3)  
f1a0: 20 55 4e 49 4f 4e 20 20 20 20 20 28 31 2c 32 29   UNION     (1,2)
f1b0: 22 20 7b 31 20 32 20 33 7d 0a 0a 20 20 33 61 20  " {1 2 3}..  3a 
f1c0: 22 28 31 2c 32 29 20 55 4e 49 4f 4e 20 20 20 20  "(1,2) UNION    
f1d0: 20 28 33 29 20 20 20 45 58 43 45 50 54 20 20 20   (3)   EXCEPT   
f1e0: 20 28 31 29 22 20 20 20 7b 32 20 33 7d 0a 20 20   (1)"   {2 3}.  
f1f0: 33 62 20 22 28 31 2c 32 29 20 45 58 43 45 50 54  3b "(1,2) EXCEPT
f200: 20 20 20 20 28 33 29 20 20 20 55 4e 49 4f 4e 20      (3)   UNION 
f210: 20 20 20 20 28 31 29 22 20 20 20 7b 31 20 32 7d      (1)"   {1 2}
f220: 0a 0a 20 20 34 61 20 22 28 31 2c 32 29 20 49 4e  ..  4a "(1,2) IN
f230: 54 45 52 53 45 43 54 20 28 31 29 20 20 20 55 4e  TERSECT (1)   UN
f240: 49 4f 4e 20 41 4c 4c 20 28 33 29 22 20 20 20 7b  ION ALL (3)"   {
f250: 31 20 33 7d 0a 20 20 34 62 20 22 28 33 29 20 20  1 3}.  4b "(3)  
f260: 20 55 4e 49 4f 4e 20 20 20 20 20 28 31 2c 32 29   UNION     (1,2)
f270: 20 49 4e 54 45 52 53 45 43 54 20 28 31 29 22 20   INTERSECT (1)" 
f280: 20 20 7b 31 7d 0a 0a 20 20 35 61 20 22 28 31 2c    {1}..  5a "(1,
f290: 32 29 20 49 4e 54 45 52 53 45 43 54 20 28 32 29  2) INTERSECT (2)
f2a0: 20 20 20 45 58 43 45 50 54 20 20 20 20 28 32 29     EXCEPT    (2)
f2b0: 22 20 20 20 7b 7d 0a 20 20 35 62 20 22 28 32 2c  "   {}.  5b "(2,
f2c0: 33 29 20 45 58 43 45 50 54 20 20 20 20 28 32 29  3) EXCEPT    (2)
f2d0: 20 20 20 49 4e 54 45 52 53 45 43 54 20 28 32 29     INTERSECT (2)
f2e0: 22 20 20 20 7b 7d 0a 0a 20 20 36 61 20 22 28 32  "   {}..  6a "(2
f2f0: 29 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 28 32  )   UNION ALL (2
f300: 29 20 20 20 45 58 43 45 50 54 20 20 20 20 28 32  )   EXCEPT    (2
f310: 29 22 20 20 20 7b 7d 0a 20 20 36 62 20 22 28 32  )"   {}.  6b "(2
f320: 29 20 20 20 45 58 43 45 50 54 20 20 20 20 28 32  )   EXCEPT    (2
f330: 29 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 28 32  )   UNION ALL (2
f340: 29 22 20 20 20 7b 32 7d 0a 0a 20 20 37 20 20 22  )"   {2}..  7  "
f350: 28 32 2c 33 29 20 45 58 43 45 50 54 20 20 20 20  (2,3) EXCEPT    
f360: 28 32 29 20 20 20 45 58 43 45 50 54 20 20 20 20  (2)   EXCEPT    
f370: 28 33 29 22 20 20 20 7b 7d 0a 7d 20 7b 0a 20 20  (3)"   {}.} {.  
f380: 73 65 74 20 73 65 6c 65 63 74 20 5b 73 74 72 69  set select [stri
f390: 6e 67 20 6d 61 70 20 7b 28 20 7b 53 45 4c 45 43  ng map {( {SELEC
f3a0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
f3b0: 45 20 78 20 49 4e 20 28 7d 7d 20 24 73 65 6c 65  E x IN (}} $sele
f3c0: 63 74 5d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  ct].  do_execsql
f3d0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 37  _test e_select-7
f3e0: 2e 31 32 2e 24 74 6e 20 24 73 65 6c 65 63 74 20  .12.$tn $select 
f3f0: 5b 6c 69 73 74 20 7b 2a 7d 24 72 65 73 5d 0a 7d  [list {*}$res].}
f400: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
f410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
f450: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
f460: 0a 23 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  .#..drop_all_tab
f470: 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  les.do_execsql_t
f480: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31  est e_select-8.1
f490: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
f4a0: 42 4c 45 20 64 31 28 78 2c 20 79 2c 20 7a 29 3b  BLE d1(x, y, z);
f4b0: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
f4c0: 64 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  d1 VALUES(1, 2, 
f4d0: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
f4e0: 4f 20 64 31 20 56 41 4c 55 45 53 28 32 2c 20 35  O d1 VALUES(2, 5
f4f0: 2c 20 2d 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  , -1);.  INSERT 
f500: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31  INTO d1 VALUES(1
f510: 2c 20 32 2c 20 38 29 3b 0a 20 20 49 4e 53 45 52  , 2, 8);.  INSER
f520: 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53  T INTO d1 VALUES
f530: 28 31 2c 20 32 2c 20 37 29 3b 0a 20 20 49 4e 53  (1, 2, 7);.  INS
f540: 45 52 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55  ERT INTO d1 VALU
f550: 45 53 28 32 2c 20 34 2c 20 39 33 29 3b 0a 20 20  ES(2, 4, 93);.  
f560: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56  INSERT INTO d1 V
f570: 41 4c 55 45 53 28 31 2c 20 32 2c 20 2d 32 30 29  ALUES(1, 2, -20)
f580: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f590: 64 31 20 56 41 4c 55 45 53 28 31 2c 20 34 2c 20  d1 VALUES(1, 4, 
f5a0: 39 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  93);.  INSERT IN
f5b0: 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31 2c 20  TO d1 VALUES(1, 
f5c0: 35 2c 20 2d 31 29 3b 0a 0a 20 20 43 52 45 41 54  5, -1);..  CREAT
f5d0: 45 20 54 41 42 4c 45 20 64 32 28 61 2c 20 62 29  E TABLE d2(a, b)
f5e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f5f0: 64 32 20 56 41 4c 55 45 53 28 27 67 65 6e 74 6c  d2 VALUES('gentl
f600: 79 27 2c 20 27 66 61 69 6c 69 6e 67 73 27 29 3b  y', 'failings');
f610: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
f620: 32 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 65 72  2 VALUES('commer
f630: 63 69 61 6c 73 27 2c 20 27 62 61 74 68 72 6f 62  cials', 'bathrob
f640: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
f650: 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 69 74  TO d2 VALUES('it
f660: 65 72 61 74 65 27 2c 20 27 73 65 78 74 6f 6e 27  erate', 'sexton'
f670: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f680: 20 64 32 20 56 41 4c 55 45 53 28 27 62 61 62 69   d2 VALUES('babi
f690: 65 64 27 2c 20 27 63 68 61 72 69 74 61 62 6c 65  ed', 'charitable
f6a0: 6e 65 73 73 27 29 3b 0a 20 20 49 4e 53 45 52 54  ness');.  INSERT
f6b0: 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28   INTO d2 VALUES(
f6c0: 27 73 6f 6c 65 6d 6e 6e 65 73 73 27 2c 20 27 61  'solemnness', 'a
f6d0: 6e 6e 65 78 65 64 27 29 3b 0a 20 20 49 4e 53 45  nnexed');.  INSE
f6e0: 52 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45  RT INTO d2 VALUE
f6f0: 53 28 27 72 65 6a 6f 69 63 69 6e 67 27 2c 20 27  S('rejoicing', '
f700: 6c 69 61 62 69 6c 69 74 69 65 73 27 29 3b 0a 20  liabilities');. 
f710: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20   INSERT INTO d2 
f720: 56 41 4c 55 45 53 28 27 70 72 61 67 6d 61 74 69  VALUES('pragmati
f730: 73 74 27 2c 20 27 67 75 61 72 64 65 64 27 29 3b  st', 'guarded');
f740: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
f750: 32 20 56 41 4c 55 45 53 28 27 62 61 72 6b 65 64  2 VALUES('barked
f760: 27 2c 20 27 69 6e 74 65 72 72 75 70 74 65 64 27  ', 'interrupted'
f770: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f780: 20 64 32 20 56 41 4c 55 45 53 28 27 72 65 65 6d   d2 VALUES('reem
f790: 70 68 61 73 69 7a 65 73 27 2c 20 27 72 65 70 6c  phasizes', 'repl
f7a0: 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  y');.  INSERT IN
f7b0: 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 6c 61  TO d2 VALUES('la
f7c0: 64 27 2c 20 27 72 65 6c 65 6e 74 69 6e 67 27 29  d', 'relenting')
f7d0: 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  ;.} {}..# EVIDEN
f7e0: 43 45 2d 4f 46 3a 20 52 2d 34 34 39 38 38 2d 34  CE-OF: R-44988-4
f7f0: 31 30 36 34 20 52 6f 77 73 20 61 72 65 20 66 69  1064 Rows are fi
f800: 72 73 74 20 73 6f 72 74 65 64 20 62 61 73 65 64  rst sorted based
f810: 20 6f 6e 20 74 68 65 20 72 65 73 75 6c 74 73 0a   on the results.
f820: 23 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20  # of evaluating 
f830: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 78  the left-most ex
f840: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
f850: 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
f860: 68 65 6e 20 74 69 65 73 0a 23 20 61 72 65 20 62  hen ties.# are b
f870: 72 6f 6b 65 6e 20 62 79 20 65 76 61 6c 75 61 74  roken by evaluat
f880: 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ing the second l
f890: 65 66 74 2d 6d 6f 73 74 20 65 78 70 72 65 73 73  eft-most express
f8a0: 69 6f 6e 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 23  ion and so on..#
f8b0: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
f8c0: 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 20 7b 0a   e_select-8.1 {.
f8d0: 20 20 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46    1  "SELECT * F
f8e0: 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20  ROM d1 ORDER BY 
f8f0: 78 2c 20 79 2c 20 7a 22 20 7b 0a 20 20 20 20 20  x, y, z" {.     
f900: 31 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33  1 2 -20    1 2 3
f910: 20 20 20 20 31 20 32 20 37 20 20 20 20 31 20 32      1 2 7    1 2
f920: 20 38 20 20 20 20 0a 20 20 20 20 20 31 20 34 20   8    .     1 4 
f930: 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
f940: 32 20 34 20 39 33 20 20 20 32 20 35 20 2d 31 0a  2 4 93   2 5 -1.
f950: 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43    }.}..# EVIDENC
f960: 45 2d 4f 46 3a 20 52 2d 30 36 36 31 37 2d 35 34  E-OF: R-06617-54
f970: 35 38 38 20 45 61 63 68 20 4f 52 44 45 52 20 42  588 Each ORDER B
f980: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79  Y expression may
f990: 20 62 65 20 6f 70 74 69 6f 6e 61 6c 6c 79 0a 23   be optionally.#
f9a0: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6f 6e 65   followed by one
f9b0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 73   of the keywords
f9c0: 20 41 53 43 20 28 73 6d 61 6c 6c 65 72 20 76 61   ASC (smaller va
f9d0: 6c 75 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  lues are returne
f9e0: 64 0a 23 20 66 69 72 73 74 29 20 6f 72 20 44 45  d.# first) or DE
f9f0: 53 43 20 28 6c 61 72 67 65 72 20 76 61 6c 75 65  SC (larger value
fa00: 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
fa10: 69 72 73 74 29 2e 0a 23 0a 23 20 20 20 54 65 73  irst)..#.#   Tes
fa20: 74 20 63 61 73 65 73 20 65 5f 73 65 6c 65 63 74  t cases e_select
fa30: 2d 38 2e 32 2e 2a 20 74 65 73 74 20 74 68 65 20  -8.2.* test the 
fa40: 61 62 6f 76 65 2e 0a 23 0a 23 20 45 56 49 44 45  above..#.# EVIDE
fa50: 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 37 30 35 2d  NCE-OF: R-18705-
fa60: 33 33 33 39 33 20 49 66 20 6e 65 69 74 68 65 72  33393 If neither
fa70: 20 41 53 43 20 6f 72 20 44 45 53 43 20 61 72 65   ASC or DESC are
fa80: 20 73 70 65 63 69 66 69 65 64 2c 20 72 6f 77 73   specified, rows
fa90: 0a 23 20 61 72 65 20 73 6f 72 74 65 64 20 69 6e  .# are sorted in
faa0: 20 61 73 63 65 6e 64 69 6e 67 20 28 73 6d 61 6c   ascending (smal
fab0: 6c 65 72 20 76 61 6c 75 65 73 20 66 69 72 73 74  ler values first
fac0: 29 20 6f 72 64 65 72 20 62 79 20 64 65 66 61 75  ) order by defau
fad0: 6c 74 2e 0a 23 0a 23 20 20 20 54 65 73 74 20 63  lt..#.#   Test c
fae0: 61 73 65 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e  ases e_select-8.
faf0: 33 2e 2a 20 74 65 73 74 20 74 68 65 20 61 62 6f  3.* test the abo
fb00: 76 65 2e 20 41 6c 6c 20 38 2e 33 20 74 65 73 74  ve. All 8.3 test
fb10: 20 63 61 73 65 73 20 61 72 65 0a 23 20 20 20 63   cases are.#   c
fb20: 6f 70 69 65 73 20 6f 66 20 38 2e 32 20 74 65 73  opies of 8.2 tes
fb30: 74 20 63 61 73 65 73 20 77 69 74 68 20 74 68 65  t cases with the
fb40: 20 65 78 70 6c 69 63 69 74 20 22 41 53 43 22 20   explicit "ASC" 
fb50: 72 65 6d 6f 76 65 64 2e 0a 23 0a 64 6f 5f 73 65  removed..#.do_se
fb60: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
fb70: 65 63 74 2d 38 20 7b 0a 20 20 32 2e 31 20 20 22  ect-8 {.  2.1  "
fb80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31  SELECT * FROM d1
fb90: 20 4f 52 44 45 52 20 42 59 20 78 20 41 53 43 2c   ORDER BY x ASC,
fba0: 20 79 20 41 53 43 2c 20 7a 20 41 53 43 22 20 7b   y ASC, z ASC" {
fbb0: 0a 20 20 20 20 20 31 20 32 20 2d 32 30 20 20 20  .     1 2 -20   
fbc0: 20 31 20 32 20 33 20 20 20 20 31 20 32 20 37 20   1 2 3    1 2 7 
fbd0: 20 20 20 31 20 32 20 38 20 20 20 20 0a 20 20 20     1 2 8    .   
fbe0: 20 20 31 20 34 20 20 39 33 20 20 20 20 31 20 35    1 4  93    1 5
fbf0: 20 2d 31 20 20 20 32 20 34 20 39 33 20 20 20 32   -1   2 4 93   2
fc00: 20 35 20 2d 31 0a 20 20 7d 0a 20 20 32 2e 32 20   5 -1.  }.  2.2 
fc10: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
fc20: 64 31 20 4f 52 44 45 52 20 42 59 20 78 20 44 45  d1 ORDER BY x DE
fc30: 53 43 2c 20 79 20 44 45 53 43 2c 20 7a 20 44 45  SC, y DESC, z DE
fc40: 53 43 22 20 7b 0a 20 20 20 20 20 32 20 35 20 2d  SC" {.     2 5 -
fc50: 31 20 20 20 20 20 32 20 34 20 39 33 20 20 20 31  1     2 4 93   1
fc60: 20 35 20 2d 31 20 20 20 31 20 34 20 20 39 33 20   5 -1   1 4  93 
fc70: 20 20 20 0a 20 20 20 20 20 31 20 32 20 38 20 20     .     1 2 8  
fc80: 20 20 20 20 31 20 32 20 37 20 20 20 20 31 20 32      1 2 7    1 2
fc90: 20 33 20 20 20 20 31 20 32 20 2d 32 30 20 20 20   3    1 2 -20   
fca0: 20 0a 20 20 7d 0a 20 20 32 2e 33 20 22 53 45 4c   .  }.  2.3 "SEL
fcb0: 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
fcc0: 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20 79  DER BY x DESC, y
fcd0: 20 41 53 43 2c 20 7a 20 44 45 53 43 22 20 7b 0a   ASC, z DESC" {.
fce0: 20 20 20 20 20 32 20 34 20 39 33 20 20 20 32 20       2 4 93   2 
fcf0: 35 20 2d 31 20 20 20 20 20 31 20 32 20 38 20 20  5 -1     1 2 8  
fd00: 20 20 20 20 31 20 32 20 37 20 20 20 20 0a 20 20      1 2 7    .  
fd10: 20 20 20 31 20 32 20 33 20 20 20 20 31 20 32 20     1 2 3    1 2 
fd20: 2d 32 30 20 20 20 20 31 20 34 20 20 39 33 20 20  -20    1 4  93  
fd30: 20 20 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a    1 5 -1   .  }.
fd40: 20 20 32 2e 34 20 20 22 53 45 4c 45 43 54 20 2a    2.4  "SELECT *
fd50: 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42   FROM d1 ORDER B
fd60: 59 20 78 20 44 45 53 43 2c 20 79 20 41 53 43 2c  Y x DESC, y ASC,
fd70: 20 7a 20 41 53 43 22 20 7b 0a 20 20 20 20 20 32   z ASC" {.     2
fd80: 20 34 20 39 33 20 20 20 32 20 35 20 2d 31 20 20   4 93   2 5 -1  
fd90: 20 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20     1 2 -20    1 
fda0: 32 20 33 20 20 20 20 0a 20 20 20 20 20 31 20 32  2 3    .     1 2
fdb0: 20 37 20 20 20 20 31 20 32 20 38 20 20 20 20 20   7    1 2 8     
fdc0: 20 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20   1 4  93    1 5 
fdd0: 2d 31 20 20 20 0a 20 20 7d 0a 0a 20 20 33 2e 31  -1   .  }..  3.1
fde0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
fdf0: 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 2c 20   d1 ORDER BY x, 
fe00: 79 2c 20 7a 22 20 7b 0a 20 20 20 20 20 31 20 32  y, z" {.     1 2
fe10: 20 2d 32 30 20 20 20 20 31 20 32 20 33 20 20 20   -20    1 2 3   
fe20: 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
fe30: 20 20 20 0a 20 20 20 20 20 31 20 34 20 20 39 33     .     1 4  93
fe40: 20 20 20 20 31 20 35 20 2d 31 20 20 20 32 20 34      1 5 -1   2 4
fe50: 20 39 33 20 20 20 32 20 35 20 2d 31 0a 20 20 7d   93   2 5 -1.  }
fe60: 0a 20 20 33 2e 33 20 20 22 53 45 4c 45 43 54 20  .  3.3  "SELECT 
fe70: 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20  * FROM d1 ORDER 
fe80: 42 59 20 78 20 44 45 53 43 2c 20 79 2c 20 7a 20  BY x DESC, y, z 
fe90: 44 45 53 43 22 20 7b 0a 20 20 20 20 20 32 20 34  DESC" {.     2 4
fea0: 20 39 33 20 20 20 32 20 35 20 2d 31 20 20 20 20   93   2 5 -1    
feb0: 20 31 20 32 20 38 20 20 20 20 20 20 31 20 32 20   1 2 8      1 2 
fec0: 37 20 20 20 20 0a 20 20 20 20 20 31 20 32 20 33  7    .     1 2 3
fed0: 20 20 20 20 31 20 32 20 2d 32 30 20 20 20 20 31      1 2 -20    1
fee0: 20 34 20 20 39 33 20 20 20 20 31 20 35 20 2d 31   4  93    1 5 -1
fef0: 20 20 20 0a 20 20 7d 0a 20 20 33 2e 34 20 22 53     .  }.  3.4 "S
ff00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20  ELECT * FROM d1 
ff10: 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43 2c  ORDER BY x DESC,
ff20: 20 79 2c 20 7a 22 20 7b 0a 20 20 20 20 20 32 20   y, z" {.     2 
ff30: 34 20 39 33 20 20 20 32 20 35 20 2d 31 20 20 20  4 93   2 5 -1   
ff40: 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 32    1 2 -20    1 2
ff50: 20 33 20 20 20 20 0a 20 20 20 20 20 31 20 32 20   3    .     1 2 
ff60: 37 20 20 20 20 31 20 32 20 38 20 20 20 20 20 20  7    1 2 8      
ff70: 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20 2d  1 4  93    1 5 -
ff80: 31 20 20 20 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56  1   .  }.}..# EV
ff90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 37  IDENCE-OF: R-297
ffa0: 37 39 2d 30 34 32 38 31 20 49 66 20 74 68 65 20  79-04281 If the 
ffb0: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
ffc0: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
ffd0: 74 0a 23 20 69 6e 74 65 67 65 72 20 4b 20 74 68  t.# integer K th
ffe0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
fff0: 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  n is considered 
10000 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
10010 20 4b 2d 74 68 0a 23 20 63 6f 6c 75 6d 6e 20 6f   K-th.# column o
10020 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
10030 20 28 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 75   (columns are nu
10040 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
10050 20 74 6f 20 72 69 67 68 74 0a 23 20 73 74 61 72   to right.# star
10060 74 69 6e 67 20 77 69 74 68 20 31 29 2e 0a 23 0a  ting with 1)..#.
10070 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
10080 65 5f 73 65 6c 65 63 74 2d 38 2e 34 20 7b 0a 20  e_select-8.4 {. 
10090 20 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52   1  "SELECT * FR
100a0 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 31  OM d1 ORDER BY 1
100b0 20 41 53 43 2c 20 32 20 41 53 43 2c 20 33 20 41   ASC, 2 ASC, 3 A
100c0 53 43 22 20 7b 0a 20 20 20 20 20 31 20 32 20 2d  SC" {.     1 2 -
100d0 32 30 20 20 20 20 31 20 32 20 33 20 20 20 20 31  20    1 2 3    1
100e0 20 32 20 37 20 20 20 20 31 20 32 20 38 20 20 20   2 7    1 2 8   
100f0 20 0a 20 20 20 20 20 31 20 34 20 20 39 33 20 20   .     1 4  93  
10100 20 20 31 20 35 20 2d 31 20 20 20 32 20 34 20 39    1 5 -1   2 4 9
10110 33 20 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a 20  3   2 5 -1.  }. 
10120 20 32 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52   2  "SELECT * FR
10130 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 31  OM d1 ORDER BY 1
10140 20 44 45 53 43 2c 20 32 20 44 45 53 43 2c 20 33   DESC, 2 DESC, 3
10150 20 44 45 53 43 22 20 7b 0a 20 20 20 20 20 32 20   DESC" {.     2 
10160 35 20 2d 31 20 20 20 20 20 32 20 34 20 39 33 20  5 -1     2 4 93 
10170 20 20 31 20 35 20 2d 31 20 20 20 31 20 34 20 20    1 5 -1   1 4  
10180 39 33 20 20 20 20 0a 20 20 20 20 20 31 20 32 20  93    .     1 2 
10190 38 20 20 20 20 20 20 31 20 32 20 37 20 20 20 20  8      1 2 7    
101a0 31 20 32 20 33 20 20 20 20 31 20 32 20 2d 32 30  1 2 3    1 2 -20
101b0 20 20 20 20 0a 20 20 7d 0a 20 20 33 20 22 53 45      .  }.  3 "SE
101c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f  LECT * FROM d1 O
101d0 52 44 45 52 20 42 59 20 31 20 44 45 53 43 2c 20  RDER BY 1 DESC, 
101e0 32 20 41 53 43 2c 20 33 20 44 45 53 43 22 20 7b  2 ASC, 3 DESC" {
101f0 0a 20 20 20 20 20 32 20 34 20 39 33 20 20 20 32  .     2 4 93   2
10200 20 35 20 2d 31 20 20 20 20 20 31 20 32 20 38 20   5 -1     1 2 8 
10210 20 20 20 20 20 31 20 32 20 37 20 20 20 20 0a 20       1 2 7    . 
10220 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20 32      1 2 3    1 2
10230 20 2d 32 30 20 20 20 20 31 20 34 20 20 39 33 20   -20    1 4  93 
10240 20 20 20 31 20 35 20 2d 31 20 20 20 0a 20 20 7d     1 5 -1   .  }
10250 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20 2a 20  .  4  "SELECT * 
10260 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59  FROM d1 ORDER BY
10270 20 31 20 44 45 53 43 2c 20 32 20 41 53 43 2c 20   1 DESC, 2 ASC, 
10280 33 20 41 53 43 22 20 7b 0a 20 20 20 20 20 32 20  3 ASC" {.     2 
10290 34 20 39 33 20 20 20 32 20 35 20 2d 31 20 20 20  4 93   2 5 -1   
102a0 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 32    1 2 -20    1 2
102b0 20 33 20 20 20 20 0a 20 20 20 20 20 31 20 32 20   3    .     1 2 
102c0 37 20 20 20 20 31 20 32 20 38 20 20 20 20 20 20  7    1 2 8      
102d0 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20 2d  1 4  93    1 5 -
102e0 31 20 20 20 0a 20 20 7d 0a 20 20 35 20 20 22 53  1   .  }.  5  "S
102f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20  ELECT * FROM d1 
10300 4f 52 44 45 52 20 42 59 20 31 2c 20 32 2c 20 33  ORDER BY 1, 2, 3
10310 22 20 7b 0a 20 20 20 20 20 31 20 32 20 2d 32 30  " {.     1 2 -20
10320 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20 32      1 2 3    1 2
10330 20 37 20 20 20 20 31 20 32 20 38 20 20 20 20 0a   7    1 2 8    .
10340 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
10350 31 20 35 20 2d 31 20 20 20 32 20 34 20 39 33 20  1 5 -1   2 4 93 
10360 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a 20 20 36    2 5 -1.  }.  6
10370 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
10380 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 20 44   d1 ORDER BY 1 D
10390 45 53 43 2c 20 32 2c 20 33 20 44 45 53 43 22 20  ESC, 2, 3 DESC" 
103a0 7b 0a 20 20 20 20 20 32 20 34 20 39 33 20 20 20  {.     2 4 93   
103b0 32 20 35 20 2d 31 20 20 20 20 20 31 20 32 20 38  2 5 -1     1 2 8
103c0 20 20 20 20 20 20 31 20 32 20 37 20 20 20 20 0a        1 2 7    .
103d0 20 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20       1 2 3    1 
103e0 32 20 2d 32 30 20 20 20 20 31 20 34 20 20 39 33  2 -20    1 4  93
103f0 20 20 20 20 31 20 35 20 2d 31 20 20 20 0a 20 20      1 5 -1   .  
10400 7d 0a 20 20 37 20 20 22 53 45 4c 45 43 54 20 2a  }.  7  "SELECT *
10410 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42   FROM d1 ORDER B
10420 59 20 31 20 44 45 53 43 2c 20 32 2c 20 33 22 20  Y 1 DESC, 2, 3" 
10430 7b 0a 20 20 20 20 20 32 20 34 20 39 33 20 20 20  {.     2 4 93   
10440 32 20 35 20 2d 31 20 20 20 20 20 31 20 32 20 2d  2 5 -1     1 2 -
10450 32 30 20 20 20 20 31 20 32 20 33 20 20 20 20 0a  20    1 2 3    .
10460 20 20 20 20 20 31 20 32 20 37 20 20 20 20 31 20       1 2 7    1 
10470 32 20 38 20 20 20 20 20 20 31 20 34 20 20 39 33  2 8      1 4  93
10480 20 20 20 20 31 20 35 20 2d 31 20 20 20 0a 20 20      1 5 -1   .  
10490 7d 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20 7a  }.  8  "SELECT z
104a0 2c 20 78 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  , x FROM d1 ORDE
104b0 52 20 42 59 20 32 22 20 7b 0a 20 20 20 20 20 2f  R BY 2" {.     /
104c0 23 20 31 20 20 20 20 23 20 31 20 20 20 20 23 20  # 1    # 1    # 
104d0 31 20 20 20 23 20 31 20 0a 20 20 20 20 20 20 23  1   # 1 .      #
104e0 20 31 20 20 20 20 23 20 31 20 20 20 20 23 20 32   1    # 1    # 2
104f0 20 20 20 23 20 32 2f 0a 20 20 7d 0a 20 20 39 20     # 2/.  }.  9 
10500 20 22 53 45 4c 45 43 54 20 7a 2c 20 78 20 46 52   "SELECT z, x FR
10510 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 31  OM d1 ORDER BY 1
10520 22 20 7b 0a 20 20 20 20 20 2f 2d 32 30 20 31 20  " {.     /-20 1 
10530 20 2d 31 20 23 20 20 20 2d 31 20 23 20 20 20 33   -1 #   -1 #   3
10540 20 31 0a 20 20 20 20 20 37 20 31 20 20 20 20 20   1.     7 1     
10550 38 20 31 20 20 20 39 33 20 23 20 20 20 39 33 20  8 1   93 #   93 
10560 23 2f 20 20 20 0a 20 20 7d 0a 7d 0a 0a 23 20 45  #/   .  }.}..# E
10570 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
10580 32 38 36 2d 35 31 39 37 37 20 49 66 20 74 68 65  286-51977 If the
10590 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
105a0 73 69 6f 6e 20 69 73 20 61 6e 20 69 64 65 6e 74  sion is an ident
105b0 69 66 69 65 72 0a 23 20 74 68 61 74 20 63 6f 72  ifier.# that cor
105c0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
105d0 61 6c 69 61 73 20 6f 66 20 6f 6e 65 20 6f 66 20  alias of one of 
105e0 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  the output colum
105f0 6e 73 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 65  ns, then the.# e
10600 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
10610 73 69 64 65 72 65 64 20 61 6e 20 61 6c 69 61 73  sidered an alias
10620 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e   for that column
10630 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
10640 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 35  sts e_select-8.5
10650 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45 43 54   {.  1   "SELECT
10660 20 7a 2b 31 20 41 53 20 61 62 63 20 46 52 4f 4d   z+1 AS abc FROM
10670 20 64 31 20 4f 52 44 45 52 20 42 59 20 61 62 63   d1 ORDER BY abc
10680 22 20 7b 0a 20 20 20 20 2d 31 39 20 30 20 30 20  " {.    -19 0 0 
10690 34 20 38 20 39 20 39 34 20 39 34 0a 20 20 7d 0a  4 8 9 94 94.  }.
106a0 20 20 32 20 20 20 22 53 45 4c 45 43 54 20 7a 2b    2   "SELECT z+
106b0 31 20 41 53 20 61 62 63 20 46 52 4f 4d 20 64 31  1 AS abc FROM d1
106c0 20 4f 52 44 45 52 20 42 59 20 61 62 63 20 44 45   ORDER BY abc DE
106d0 53 43 22 20 7b 0a 20 20 20 20 39 34 20 39 34 20  SC" {.    94 94 
106e0 39 20 38 20 34 20 30 20 30 20 2d 31 39 0a 20 20  9 8 4 0 0 -19.  
106f0 7d 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20 7a  }.  3  "SELECT z
10700 20 41 53 20 78 2c 20 78 20 41 53 20 7a 20 46 52   AS x, x AS z FR
10710 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 7a  OM d1 ORDER BY z
10720 22 20 7b 0a 20 20 20 20 2f 23 20 31 20 20 20 20  " {.    /# 1    
10730 23 20 31 20 20 20 20 23 20 31 20 20 20 20 23 20  # 1    # 1    # 
10740 31 20 20 20 20 23 20 31 20 20 20 20 23 20 31 20  1    # 1    # 1 
10750 20 20 20 23 20 32 20 20 20 20 23 20 32 2f 0a 20     # 2    # 2/. 
10760 20 7d 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20   }.  4  "SELECT 
10770 7a 20 41 53 20 78 2c 20 78 20 41 53 20 7a 20 46  z AS x, x AS z F
10780 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20  ROM d1 ORDER BY 
10790 78 22 20 7b 0a 20 20 20 20 2f 2d 32 30 20 31 20  x" {.    /-20 1 
107a0 20 20 20 2d 31 20 23 20 20 20 20 2d 31 20 23 20     -1 #    -1 # 
107b0 20 20 20 33 20 31 20 20 20 20 37 20 31 20 20 20     3 1    7 1   
107c0 20 38 20 31 20 20 20 20 39 33 20 23 20 20 20 20   8 1    93 #    
107d0 39 33 20 23 2f 0a 20 20 7d 0a 7d 0a 0a 23 20 45  93 #/.  }.}..# E
107e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
107f0 30 36 38 2d 32 37 32 30 37 20 4f 74 68 65 72 77  068-27207 Otherw
10800 69 73 65 2c 20 69 66 20 74 68 65 20 4f 52 44 45  ise, if the ORDE
10810 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
10820 69 73 0a 23 20 61 6e 79 20 6f 74 68 65 72 20 65  is.# any other e
10830 78 70 72 65 73 73 69 6f 6e 2c 20 69 74 20 69 73  xpression, it is
10840 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
10850 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
10860 65 20 75 73 65 64 20 74 6f 0a 23 20 6f 72 64 65  e used to.# orde
10870 72 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  r the output row
10880 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
10890 4f 46 3a 20 52 2d 30 33 34 32 31 2d 35 37 39 38  OF: R-03421-5798
108a0 38 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  8 If the SELECT 
108b0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
108c0 69 6d 70 6c 65 20 53 45 4c 45 43 54 2c 0a 23 20  imple SELECT,.# 
108d0 74 68 65 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  then an ORDER BY
108e0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 6e 79   may contain any
108f0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
10900 73 73 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 73 65 6c  ssions..#.do_sel
10910 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
10920 63 74 2d 38 2e 36 20 7b 0a 20 20 31 20 20 20 22  ct-8.6 {.  1   "
10930 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31  SELECT * FROM d1
10940 20 4f 52 44 45 52 20 42 59 20 78 2b 79 2b 7a 22   ORDER BY x+y+z"
10950 20 7b 0a 20 20 20 20 31 20 32 20 2d 32 30 20 20   {.    1 2 -20  
10960 20 20 31 20 35 20 2d 31 20 20 20 20 31 20 32 20    1 5 -1    1 2 
10970 33 20 20 20 20 32 20 35 20 2d 31 20 0a 20 20 20  3    2 5 -1 .   
10980 20 31 20 32 20 37 20 20 20 20 20 20 31 20 32 20   1 2 7      1 2 
10990 38 20 20 20 20 20 31 20 34 20 39 33 20 20 20 32  8     1 4 93   2
109a0 20 34 20 39 33 0a 20 20 7d 0a 20 20 32 20 20 20   4 93.  }.  2   
109b0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  "SELECT * FROM d
109c0 31 20 4f 52 44 45 52 20 42 59 20 78 2a 7a 22 20  1 ORDER BY x*z" 
109d0 7b 0a 20 20 20 20 31 20 32 20 2d 32 30 20 20 20  {.    1 2 -20   
109e0 20 32 20 35 20 2d 31 20 20 20 20 31 20 35 20 2d   2 5 -1    1 5 -
109f0 31 20 20 20 20 31 20 32 20 33 20 0a 20 20 20 20  1    1 2 3 .    
10a00 31 20 32 20 37 20 20 20 20 20 20 31 20 32 20 38  1 2 7      1 2 8
10a10 20 20 20 20 20 31 20 34 20 39 33 20 20 20 20 32       1 4 93    2
10a20 20 34 20 39 33 0a 20 20 7d 0a 20 20 33 20 20 20   4 93.  }.  3   
10a30 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  "SELECT * FROM d
10a40 31 20 4f 52 44 45 52 20 42 59 20 79 2a 7a 22 20  1 ORDER BY y*z" 
10a50 7b 0a 20 20 20 20 31 20 32 20 2d 32 30 20 20 20  {.    1 2 -20   
10a60 20 32 20 35 20 2d 31 20 20 20 20 31 20 35 20 2d   2 5 -1    1 5 -
10a70 31 20 20 20 20 31 20 32 20 33 20 0a 20 20 20 20  1    1 2 3 .    
10a80 31 20 32 20 37 20 20 20 20 20 20 31 20 32 20 38  1 2 7      1 2 8
10a90 20 20 20 20 20 32 20 34 20 39 33 20 20 20 20 31       2 4 93    1
10aa0 20 34 20 39 33 0a 20 20 7d 0a 7d 0a 0a 23 20 45   4 93.  }.}..# E
10ab0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
10ac0 38 35 33 2d 30 38 31 34 37 20 48 6f 77 65 76 65  853-08147 Howeve
10ad0 72 2c 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  r, if the SELECT
10ae0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 23   is a compound.#
10af0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 4f 52   SELECT, then OR
10b00 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
10b10 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ns that are not 
10b20 61 6c 69 61 73 65 73 20 74 6f 20 6f 75 74 70 75  aliases to outpu
10b30 74 0a 23 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  t.# columns must
10b40 20 62 65 20 65 78 61 63 74 6c 79 20 74 68 65 20   be exactly the 
10b50 73 61 6d 65 20 61 73 20 61 6e 20 65 78 70 72 65  same as an expre
10b60 73 73 69 6f 6e 20 75 73 65 64 20 61 73 20 61 6e  ssion used as an
10b70 20 6f 75 74 70 75 74 0a 23 20 63 6f 6c 75 6d 6e   output.# column
10b80 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
10b90 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 37  sts e_select-8.7
10ba0 2e 31 20 2d 65 72 72 6f 72 20 7b 0a 20 20 25 73  .1 -error {.  %s
10bb0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64   ORDER BY term d
10bc0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
10bd0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  y column in the 
10be0 72 65 73 75 6c 74 20 73 65 74 0a 7d 20 7b 0a 20  result set.} {. 
10bf0 20 31 20 20 20 22 53 45 4c 45 43 54 20 78 20 46   1   "SELECT x F
10c00 52 4f 4d 20 64 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d1 UNION ALL
10c10 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64   SELECT a FROM d
10c20 32 20 4f 52 44 45 52 20 42 59 20 78 2a 7a 22 20  2 ORDER BY x*z" 
10c30 20 20 20 20 20 20 20 31 73 74 0a 20 20 32 20 20         1st.  2  
10c40 20 22 53 45 4c 45 43 54 20 78 2c 7a 20 46 52 4f   "SELECT x,z FRO
10c50 4d 20 64 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M d1 UNION ALL S
10c60 45 4c 45 43 54 20 61 2c 62 20 46 52 4f 4d 20 64  ELECT a,b FROM d
10c70 32 20 4f 52 44 45 52 20 42 59 20 78 2c 20 78 2f  2 ORDER BY x, x/
10c80 7a 22 20 32 6e 64 0a 7d 20 0a 0a 64 6f 5f 73 65  z" 2nd.} ..do_se
10c90 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
10ca0 65 63 74 2d 38 2e 37 2e 32 20 7b 0a 20 20 31 20  ect-8.7.2 {.  1 
10cb0 20 20 22 53 45 4c 45 43 54 20 78 2a 7a 20 46 52    "SELECT x*z FR
10cc0 4f 4d 20 64 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d1 UNION ALL 
10cd0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 32  SELECT a FROM d2
10ce0 20 4f 52 44 45 52 20 42 59 20 78 2a 7a 22 20 7b   ORDER BY x*z" {
10cf0 0a 20 20 20 20 2d 32 30 20 2d 32 20 2d 31 20 33  .    -20 -2 -1 3
10d00 20 37 20 38 20 39 33 20 31 38 36 20 62 61 62 69   7 8 93 186 babi
10d10 65 64 20 62 61 72 6b 65 64 20 63 6f 6d 6d 65 72  ed barked commer
10d20 63 69 61 6c 73 20 67 65 6e 74 6c 79 20 0a 20 20  cials gently .  
10d30 20 20 69 74 65 72 61 74 65 20 6c 61 64 20 70 72    iterate lad pr
10d40 61 67 6d 61 74 69 73 74 20 72 65 65 6d 70 68 61  agmatist reempha
10d50 73 69 7a 65 73 20 72 65 6a 6f 69 63 69 6e 67 20  sizes rejoicing 
10d60 73 6f 6c 65 6d 6e 6e 65 73 73 0a 20 20 7d 0a 20  solemnness.  }. 
10d70 20 32 20 20 20 22 53 45 4c 45 43 54 20 78 2c 20   2   "SELECT x, 
10d80 78 2f 7a 20 46 52 4f 4d 20 64 31 20 55 4e 49 4f  x/z FROM d1 UNIO
10d90 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 2c 62  N ALL SELECT a,b
10da0 20 46 52 4f 4d 20 64 32 20 4f 52 44 45 52 20 42   FROM d2 ORDER B
10db0 59 20 78 2c 20 78 2f 7a 22 20 7b 0a 20 20 20 20  Y x, x/z" {.    
10dc0 31 20 2d 31 20 31 20 30 20 31 20 30 20 31 20 30  1 -1 1 0 1 0 1 0
10dd0 20 31 20 30 20 31 20 30 20 32 20 2d 32 20 32 20   1 0 1 0 2 -2 2 
10de0 30 20 0a 20 20 20 20 62 61 62 69 65 64 20 63 68  0 .    babied ch
10df0 61 72 69 74 61 62 6c 65 6e 65 73 73 20 62 61 72  aritableness bar
10e00 6b 65 64 20 69 6e 74 65 72 72 75 70 74 65 64 20  ked interrupted 
10e10 63 6f 6d 6d 65 72 63 69 61 6c 73 20 62 61 74 68  commercials bath
10e20 72 6f 62 65 20 67 65 6e 74 6c 79 0a 20 20 20 20  robe gently.    
10e30 66 61 69 6c 69 6e 67 73 20 69 74 65 72 61 74 65  failings iterate
10e40 20 73 65 78 74 6f 6e 20 6c 61 64 20 72 65 6c 65   sexton lad rele
10e50 6e 74 69 6e 67 20 70 72 61 67 6d 61 74 69 73 74  nting pragmatist
10e60 20 67 75 61 72 64 65 64 20 72 65 65 6d 70 68 61   guarded reempha
10e70 73 69 7a 65 73 20 72 65 70 6c 79 0a 20 20 20 20  sizes reply.    
10e80 72 65 6a 6f 69 63 69 6e 67 20 6c 69 61 62 69 6c  rejoicing liabil
10e90 69 74 69 65 73 20 73 6f 6c 65 6d 6e 6e 65 73 73  ities solemnness
10ea0 20 61 6e 6e 65 78 65 64 0a 20 20 7d 0a 7d 20 0a   annexed.  }.} .
10eb0 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
10ec0 20 65 5f 73 65 6c 65 63 74 2d 38 2e 38 2e 30 20   e_select-8.8.0 
10ed0 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
10ee0 20 64 33 28 61 29 3b 0a 20 20 49 4e 53 45 52 54   d3(a);.  INSERT
10ef0 20 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28   INTO d3 VALUES(
10f00 27 74 65 78 74 27 29 3b 0a 20 20 49 4e 53 45 52  'text');.  INSER
10f10 54 20 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53  T INTO d3 VALUES
10f20 28 31 34 2e 31 29 3b 0a 20 20 49 4e 53 45 52 54  (14.1);.  INSERT
10f30 20 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28   INTO d3 VALUES(
10f40 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  13);.  INSERT IN
10f50 54 4f 20 64 33 20 56 41 4c 55 45 53 28 58 27 37  TO d3 VALUES(X'7
10f60 38 37 38 37 38 37 38 27 29 3b 0a 20 20 49 4e 53  8787878');.  INS
10f70 45 52 54 20 49 4e 54 4f 20 64 33 20 56 41 4c 55  ERT INTO d3 VALU
10f80 45 53 28 31 35 29 3b 0a 20 20 49 4e 53 45 52 54  ES(15);.  INSERT
10f90 20 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28   INTO d3 VALUES(
10fa0 31 32 2e 39 29 3b 0a 20 20 49 4e 53 45 52 54 20  12.9);.  INSERT 
10fb0 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28 6e  INTO d3 VALUES(n
10fc0 75 6c 6c 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  ull);..  CREATE 
10fd0 54 41 42 4c 45 20 64 34 28 78 20 43 4f 4c 4c 41  TABLE d4(x COLLA
10fe0 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e  TE nocase);.  IN
10ff0 53 45 52 54 20 49 4e 54 4f 20 64 34 20 56 41 4c  SERT INTO d4 VAL
11000 55 45 53 28 27 61 62 63 27 29 3b 0a 20 20 49 4e  UES('abc');.  IN
11010 53 45 52 54 20 49 4e 54 4f 20 64 34 20 56 41 4c  SERT INTO d4 VAL
11020 55 45 53 28 27 67 68 69 27 29 3b 0a 20 20 49 4e  UES('ghi');.  IN
11030 53 45 52 54 20 49 4e 54 4f 20 64 34 20 56 41 4c  SERT INTO d4 VAL
11040 55 45 53 28 27 44 45 46 27 29 3b 0a 20 20 49 4e  UES('DEF');.  IN
11050 53 45 52 54 20 49 4e 54 4f 20 64 34 20 56 41 4c  SERT INTO d4 VAL
11060 55 45 53 28 27 4a 4b 4c 27 29 3b 0a 7d 20 7b 7d  UES('JKL');.} {}
11070 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
11080 20 52 2d 31 30 38 38 33 2d 31 37 36 39 37 20 46   R-10883-17697 F
11090 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
110a0 6f 66 20 73 6f 72 74 69 6e 67 20 72 6f 77 73 2c  of sorting rows,
110b0 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20 63 6f   values.# are co
110c0 6d 70 61 72 65 64 20 69 6e 20 74 68 65 20 73 61  mpared in the sa
110d0 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20 63 6f  me way as for co
110e0 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
110f0 69 6f 6e 73 2e 0a 23 0a 23 20 20 20 54 68 65 20  ions..#.#   The 
11100 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
11110 76 65 72 69 66 79 20 74 68 61 74 20 76 61 6c 75  verify that valu
11120 65 73 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  es of different 
11130 74 79 70 65 73 20 61 72 65 20 73 6f 72 74 65 64  types are sorted
11140 0a 23 20 20 20 63 6f 72 72 65 63 74 6c 79 2c 20  .#   correctly, 
11150 61 6e 64 20 74 68 61 74 20 6d 69 78 65 64 20 72  and that mixed r
11160 65 61 6c 20 61 6e 64 20 69 6e 74 65 67 65 72 20  eal and integer 
11170 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61  values are compa
11180 72 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 23 0a  red properly..#.
11190 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
111a0 65 5f 73 65 6c 65 63 74 2d 38 2e 38 2e 31 20 7b  e_select-8.8.1 {
111b0 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  .  SELECT a FROM
111c0 20 64 33 20 4f 52 44 45 52 20 42 59 20 61 0a 7d   d3 ORDER BY a.}
111d0 20 7b 7b 7d 20 31 32 2e 39 20 31 33 20 31 34 2e   {{} 12.9 13 14.
111e0 31 20 31 35 20 74 65 78 74 20 78 78 78 78 7d 0a  1 15 text xxxx}.
111f0 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
11200 65 5f 73 65 6c 65 63 74 2d 38 2e 38 2e 32 20 7b  e_select-8.8.2 {
11210 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  .  SELECT a FROM
11220 20 64 33 20 4f 52 44 45 52 20 42 59 20 61 20 44   d3 ORDER BY a D
11230 45 53 43 0a 7d 20 7b 78 78 78 78 20 74 65 78 74  ESC.} {xxxx text
11240 20 31 35 20 31 34 2e 31 20 31 33 20 31 32 2e 39   15 14.1 13 12.9
11250 20 7b 7d 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43   {}}...# EVIDENC
11260 45 2d 4f 46 3a 20 52 2d 36 34 31 39 39 2d 32 32  E-OF: R-64199-22
11270 34 37 31 20 49 66 20 74 68 65 20 4f 52 44 45 52  471 If the ORDER
11280 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69   BY expression i
11290 73 20 61 73 73 69 67 6e 65 64 20 61 0a 23 20 63  s assigned a.# c
112a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
112b0 65 20 75 73 69 6e 67 20 74 68 65 20 70 6f 73 74  e using the post
112c0 66 69 78 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  fix COLLATE oper
112d0 61 74 6f 72 2c 20 74 68 65 6e 20 74 68 65 0a 23  ator, then the.#
112e0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
112f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
11300 20 75 73 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63   used..#.do_exec
11310 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
11320 74 2d 38 2e 39 2e 31 20 7b 0a 20 20 53 45 4c 45  t-8.9.1 {.  SELE
11330 43 54 20 78 20 46 52 4f 4d 20 64 34 20 4f 52 44  CT x FROM d4 ORD
11340 45 52 20 42 59 20 31 20 43 4f 4c 4c 41 54 45 20  ER BY 1 COLLATE 
11350 62 69 6e 61 72 79 0a 7d 20 7b 44 45 46 20 4a 4b  binary.} {DEF JK
11360 4c 20 61 62 63 20 67 68 69 7d 0a 64 6f 5f 65 78  L abc ghi}.do_ex
11370 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
11380 65 63 74 2d 38 2e 39 2e 32 20 7b 0a 20 20 53 45  ect-8.9.2 {.  SE
11390 4c 45 43 54 20 78 20 43 4f 4c 4c 41 54 45 20 62  LECT x COLLATE b
113a0 69 6e 61 72 79 20 46 52 4f 4d 20 64 34 20 4f 52  inary FROM d4 OR
113b0 44 45 52 20 42 59 20 31 20 43 4f 4c 4c 41 54 45  DER BY 1 COLLATE
113c0 20 6e 6f 63 61 73 65 0a 7d 20 7b 61 62 63 20 44   nocase.} {abc D
113d0 45 46 20 67 68 69 20 4a 4b 4c 7d 0a 0a 23 20 45  EF ghi JKL}..# E
113e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
113f0 33 39 38 2d 32 36 31 30 32 20 4f 74 68 65 72 77  398-26102 Otherw
11400 69 73 65 2c 20 69 66 20 74 68 65 20 4f 52 44 45  ise, if the ORDE
11410 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
11420 69 73 20 0a 23 20 61 6e 20 61 6c 69 61 73 20 74  is .# an alias t
11430 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
11440 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 61 73  that has been as
11450 73 69 67 6e 65 64 20 61 20 63 6f 6c 6c 61 74 69  signed a collati
11460 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 23 20 75  on sequence .# u
11470 73 69 6e 67 20 74 68 65 20 70 6f 73 74 66 69 78  sing the postfix
11480 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
11490 72 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6c 6c  r, then the coll
114a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
114b0 23 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  # assigned to th
114c0 65 20 61 6c 69 61 73 65 64 20 65 78 70 72 65 73  e aliased expres
114d0 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 23 0a  sion is used..#.
114e0 23 20 20 20 49 6e 20 74 68 65 20 74 65 73 74 20  #   In the test 
114f0 38 2e 31 30 2e 32 2c 20 74 68 65 20 6f 6e 6c 79  8.10.2, the only
11500 20 72 65 73 75 6c 74 2d 63 6f 6c 75 6d 6e 20 65   result-column e
11510 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f  xpression has no
11520 20 61 6c 69 61 73 2e 20 53 6f 20 74 68 65 0a 23   alias. So the.#
11530 20 20 20 4f 52 44 45 52 20 42 59 20 65 78 70 72     ORDER BY expr
11540 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20  ession is not a 
11550 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20  reference to it 
11560 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
11570 65 73 20 6e 6f 74 20 69 6e 68 65 72 69 74 0a 23  es not inherit.#
11580 20 20 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e     the collation
11590 20 73 65 71 75 65 6e 63 65 2e 20 49 6e 20 74 65   sequence. In te
115a0 73 74 20 38 2e 31 30 2e 33 2c 20 22 78 22 20 69  st 8.10.3, "x" i
115b0 73 20 74 68 65 20 61 6c 69 61 73 20 28 61 73 20  s the alias (as 
115c0 77 65 6c 6c 20 61 73 20 74 68 65 0a 23 20 20 20  well as the.#   
115d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 29 2c 20 73 6f  column name), so
115e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
115f0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6e 74 65  pression is inte
11600 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 61 6c  rpreted as an al
11610 69 61 73 20 61 6e 64 20 74 68 65 0a 23 20 20 20  ias and the.#   
11620 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
11630 63 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ce attached to t
11640 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
11650 20 69 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72   is used for sor
11660 74 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ting..#.do_execs
11670 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
11680 2d 38 2e 31 30 2e 31 20 7b 0a 20 20 53 45 4c 45  -8.10.1 {.  SELE
11690 43 54 20 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e  CT x COLLATE bin
116a0 61 72 79 20 46 52 4f 4d 20 64 34 20 4f 52 44 45  ary FROM d4 ORDE
116b0 52 20 42 59 20 31 0a 7d 20 7b 44 45 46 20 4a 4b  R BY 1.} {DEF JK
116c0 4c 20 61 62 63 20 67 68 69 7d 0a 64 6f 5f 65 78  L abc ghi}.do_ex
116d0 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
116e0 65 63 74 2d 38 2e 31 30 2e 32 20 7b 0a 20 20 53  ect-8.10.2 {.  S
116f0 45 4c 45 43 54 20 78 20 43 4f 4c 4c 41 54 45 20  ELECT x COLLATE 
11700 62 69 6e 61 72 79 20 46 52 4f 4d 20 64 34 20 4f  binary FROM d4 O
11710 52 44 45 52 20 42 59 20 78 0a 7d 20 7b 61 62 63  RDER BY x.} {abc
11720 20 44 45 46 20 67 68 69 20 4a 4b 4c 7d 0a 64 6f   DEF ghi JKL}.do
11730 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
11740 73 65 6c 65 63 74 2d 38 2e 31 30 2e 33 20 7b 0a  select-8.10.3 {.
11750 20 20 53 45 4c 45 43 54 20 78 20 43 4f 4c 4c 41    SELECT x COLLA
11760 54 45 20 62 69 6e 61 72 79 20 41 53 20 78 20 46  TE binary AS x F
11770 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59 20  ROM d4 ORDER BY 
11780 78 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62 63  x.} {DEF JKL abc
11790 20 67 68 69 7d 0a 0a 23 20 45 56 49 44 45 4e 43   ghi}..# EVIDENC
117a0 45 2d 4f 46 3a 20 52 2d 32 37 33 30 31 2d 30 39  E-OF: R-27301-09
117b0 36 35 38 20 4f 74 68 65 72 77 69 73 65 2c 20 69  658 Otherwise, i
117c0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  f the ORDER BY e
117d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 0a 23  xpression is a.#
117e0 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 61 6c   column or an al
117f0 69 61 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ias of an expres
11800 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 63  sion that is a c
11810 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
11820 64 65 66 61 75 6c 74 0a 23 20 63 6f 6c 6c 61 74  default.# collat
11830 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
11840 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75   the column is u
11850 73 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  sed..#.do_execsq
11860 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
11870 38 2e 31 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  8.11.1 {.  SELEC
11880 54 20 78 20 41 53 20 79 20 46 52 4f 4d 20 64 34  T x AS y FROM d4
11890 20 4f 52 44 45 52 20 42 59 20 79 0a 7d 20 7b 61   ORDER BY y.} {a
118a0 62 63 20 44 45 46 20 67 68 69 20 4a 4b 4c 7d 0a  bc DEF ghi JKL}.
118b0 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
118c0 65 5f 73 65 6c 65 63 74 2d 38 2e 31 31 2e 32 20  e_select-8.11.2 
118d0 7b 0a 20 20 53 45 4c 45 43 54 20 78 7c 7c 27 27  {.  SELECT x||''
118e0 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42   FROM d4 ORDER B
118f0 59 20 78 0a 7d 20 7b 61 62 63 20 44 45 46 20 67  Y x.} {abc DEF g
11900 68 69 20 4a 4b 4c 7d 0a 0a 23 20 45 56 49 44 45  hi JKL}..# EVIDE
11910 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 35 2d  NCE-OF: R-49925-
11920 35 35 39 30 35 20 4f 74 68 65 72 77 69 73 65 2c  55905 Otherwise,
11930 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c   the BINARY coll
11940 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
11950 73 0a 23 20 75 73 65 64 2e 0a 23 0a 64 6f 5f 65  s.# used..#.do_e
11960 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
11970 6c 65 63 74 2d 38 2e 31 32 2e 31 20 7b 0a 20 20  lect-8.12.1 {.  
11980 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 64 34  SELECT x FROM d4
11990 20 4f 52 44 45 52 20 42 59 20 78 7c 7c 27 27 0a   ORDER BY x||''.
119a0 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62 63 20 67  } {DEF JKL abc g
119b0 68 69 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  hi}..# EVIDENCE-
119c0 4f 46 3a 20 52 2d 34 34 31 33 30 2d 33 32 35 39  OF: R-44130-3259
119d0 33 20 49 66 20 61 6e 20 4f 52 44 45 52 20 42 59  3 If an ORDER BY
119e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
119f0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 23 20  ot an integer.# 
11a00 61 6c 69 61 73 2c 20 74 68 65 6e 20 53 51 4c 69  alias, then SQLi
11a10 74 65 20 73 65 61 72 63 68 65 73 20 74 68 65 20  te searches the 
11a20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  left-most SELECT
11a30 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
11a40 20 66 6f 72 20 61 0a 23 20 72 65 73 75 6c 74 20   for a.# result 
11a50 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63  column that matc
11a60 68 65 73 20 65 69 74 68 65 72 20 74 68 65 20 73  hes either the s
11a70 65 63 6f 6e 64 20 6f 72 20 74 68 69 72 64 20 72  econd or third r
11a80 75 6c 65 73 20 61 62 6f 76 65 2e 20 49 66 0a 23  ules above. If.#
11a90 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
11aa0 64 2c 20 74 68 65 20 73 65 61 72 63 68 20 73 74  d, the search st
11ab0 6f 70 73 20 61 6e 64 20 74 68 65 20 65 78 70 72  ops and the expr
11ac0 65 73 73 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65  ession is handle
11ad0 64 20 61 73 20 61 6e 0a 23 20 61 6c 69 61 73 20  d as an.# alias 
11ae0 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 63  for the result c
11af0 6f 6c 75 6d 6e 20 74 68 61 74 20 69 74 20 68 61  olumn that it ha
11b00 73 20 62 65 65 6e 20 6d 61 74 63 68 65 64 20 61  s been matched a
11b10 67 61 69 6e 73 74 2e 0a 23 20 4f 74 68 65 72 77  gainst..# Otherw
11b20 69 73 65 2c 20 74 68 65 20 6e 65 78 74 20 53 45  ise, the next SE
11b30 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
11b40 74 20 69 73 20 74 72 69 65 64 2c 20 61 6e 64 20  t is tried, and 
11b50 73 6f 20 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63  so on..#.do_exec
11b60 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
11b70 74 2d 38 2e 31 33 2e 30 20 7b 0a 20 20 43 52 45  t-8.13.0 {.  CRE
11b80 41 54 45 20 54 41 42 4c 45 20 64 35 28 61 2c 20  ATE TABLE d5(a, 
11b90 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  b);.  CREATE TAB
11ba0 4c 45 20 64 36 28 63 2c 20 64 29 3b 0a 20 20 43  LE d6(c, d);.  C
11bb0 52 45 41 54 45 20 54 41 42 4c 45 20 64 37 28 65  REATE TABLE d7(e
11bc0 2c 20 66 29 3b 0a 20 0a 20 20 49 4e 53 45 52 54  , f);. .  INSERT
11bd0 20 49 4e 54 4f 20 64 35 20 56 41 4c 55 45 53 28   INTO d5 VALUES(
11be0 31 2c 20 27 66 27 29 3b 0a 20 20 49 4e 53 45 52  1, 'f');.  INSER
11bf0 54 20 49 4e 54 4f 20 64 36 20 56 41 4c 55 45 53  T INTO d6 VALUES
11c00 28 32 2c 20 27 65 27 29 3b 0a 20 20 49 4e 53 45  (2, 'e');.  INSE
11c10 52 54 20 49 4e 54 4f 20 64 37 20 56 41 4c 55 45  RT INTO d7 VALUE
11c20 53 28 33 2c 20 27 64 27 29 3b 0a 20 20 49 4e 53  S(3, 'd');.  INS
11c30 45 52 54 20 49 4e 54 4f 20 64 35 20 56 41 4c 55  ERT INTO d5 VALU
11c40 45 53 28 34 2c 20 27 63 27 29 3b 0a 20 20 49 4e  ES(4, 'c');.  IN
11c50 53 45 52 54 20 49 4e 54 4f 20 64 36 20 56 41 4c  SERT INTO d6 VAL
11c60 55 45 53 28 35 2c 20 27 62 27 29 3b 0a 20 20 49  UES(5, 'b');.  I
11c70 4e 53 45 52 54 20 49 4e 54 4f 20 64 37 20 56 41  NSERT INTO d7 VA
11c80 4c 55 45 53 28 36 2c 20 27 61 27 29 3b 0a 0a 20  LUES(6, 'a');.. 
11c90 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 38   CREATE TABLE d8
11ca0 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (x COLLATE nocas
11cb0 65 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  e);.  CREATE TAB
11cc0 4c 45 20 64 39 28 79 20 43 4f 4c 4c 41 54 45 20  LE d9(y COLLATE 
11cd0 6e 6f 63 61 73 65 29 3b 0a 0a 20 20 49 4e 53 45  nocase);..  INSE
11ce0 52 54 20 49 4e 54 4f 20 64 38 20 56 41 4c 55 45  RT INTO d8 VALUE
11cf0 53 28 27 61 27 29 3b 0a 20 20 49 4e 53 45 52 54  S('a');.  INSERT
11d00 20 49 4e 54 4f 20 64 39 20 56 41 4c 55 45 53 28   INTO d9 VALUES(
11d10 27 42 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'B');.  INSERT I
11d20 4e 54 4f 20 64 38 20 56 41 4c 55 45 53 28 27 63  NTO d8 VALUES('c
11d30 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
11d40 4f 20 64 39 20 56 41 4c 55 45 53 28 27 44 27 29  O d9 VALUES('D')
11d50 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74  ;.} {}.do_select
11d60 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
11d70 38 2e 31 33 20 7b 0a 20 20 31 20 20 20 7b 20 53  8.13 {.  1   { S
11d80 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20  ELECT a FROM d5 
11d90 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
11da0 20 63 20 46 52 4f 4d 20 64 36 20 55 4e 49 4f 4e   c FROM d6 UNION
11db0 20 41 4c 4c 20 53 45 4c 45 43 54 20 65 20 46 52   ALL SELECT e FR
11dc0 4f 4d 20 64 37 0a 20 20 20 20 20 20 20 20 20 4f  OM d7.         O
11dd0 52 44 45 52 20 42 59 20 61 0a 20 20 20 20 20 20  RDER BY a.      
11de0 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
11df0 20 20 32 20 20 20 7b 20 53 45 4c 45 43 54 20 61    2   { SELECT a
11e00 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41   FROM d5 UNION A
11e10 4c 4c 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  LL SELECT c FROM
11e20 20 64 36 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   d6 UNION ALL SE
11e30 4c 45 43 54 20 65 20 46 52 4f 4d 20 64 37 0a 20  LECT e FROM d7. 
11e40 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
11e50 20 63 0a 20 20 20 20 20 20 7d 20 7b 31 20 32 20   c.      } {1 2 
11e60 33 20 34 20 35 20 36 7d 0a 20 20 33 20 20 20 7b  3 4 5 6}.  3   {
11e70 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64   SELECT a FROM d
11e80 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
11e90 43 54 20 63 20 46 52 4f 4d 20 64 36 20 55 4e 49  CT c FROM d6 UNI
11ea0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 65 20  ON ALL SELECT e 
11eb0 46 52 4f 4d 20 64 37 0a 20 20 20 20 20 20 20 20  FROM d7.        
11ec0 20 4f 52 44 45 52 20 42 59 20 65 0a 20 20 20 20   ORDER BY e.    
11ed0 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
11ee0 7d 0a 20 20 34 20 20 20 7b 20 53 45 4c 45 43 54  }.  4   { SELECT
11ef0 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   a FROM d5 UNION
11f00 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 20 46 52   ALL SELECT c FR
11f10 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d6 UNION ALL 
11f20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 64 37  SELECT e FROM d7
11f30 0a 20 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  .         ORDER 
11f40 42 59 20 31 0a 20 20 20 20 20 20 7d 20 7b 31 20  BY 1.      } {1 
11f50 32 20 33 20 34 20 35 20 36 7d 0a 0a 20 20 35 20  2 3 4 5 6}..  5 
11f60 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20    { SELECT a, b 
11f70 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c  FROM d5 UNION AL
11f80 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52  L SELECT b, a FR
11f90 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20 62  OM d5 ORDER BY b
11fa0 20 7d 20 0a 20 20 20 20 20 20 7b 66 20 31 20 20   } .      {f 1  
11fb0 20 63 20 34 20 20 20 34 20 63 20 20 20 31 20 66   c 4   4 c   1 f
11fc0 7d 0a 20 20 36 20 20 20 7b 20 53 45 4c 45 43 54  }.  6   { SELECT
11fd0 20 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e   a, b FROM d5 UN
11fe0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62  ION ALL SELECT b
11ff0 2c 20 61 20 46 52 4f 4d 20 64 35 20 4f 52 44 45  , a FROM d5 ORDE
12000 52 20 42 59 20 32 20 7d 20 0a 20 20 20 20 20 20  R BY 2 } .      
12010 7b 66 20 31 20 20 20 63 20 34 20 20 20 34 20 63  {f 1   c 4   4 c
12020 20 20 20 31 20 66 7d 0a 0a 20 20 37 20 20 20 7b     1 f}..  7   {
12030 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
12040 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M d5 UNION ALL S
12050 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
12060 64 35 20 4f 52 44 45 52 20 42 59 20 61 20 7d 20  d5 ORDER BY a } 
12070 0a 20 20 20 20 20 20 7b 31 20 66 20 20 20 34 20  .      {1 f   4 
12080 63 20 20 20 63 20 34 20 20 20 66 20 31 7d 0a 20  c   c 4   f 1}. 
12090 20 38 20 20 20 7b 20 53 45 4c 45 43 54 20 61 2c   8   { SELECT a,
120a0 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   b FROM d5 UNION
120b0 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20 61   ALL SELECT b, a
120c0 20 46 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42   FROM d5 ORDER B
120d0 59 20 31 20 7d 20 0a 20 20 20 20 20 20 7b 31 20  Y 1 } .      {1 
120e0 66 20 20 20 34 20 63 20 20 20 63 20 34 20 20 20  f   4 c   c 4   
120f0 66 20 31 7d 0a 0a 20 20 39 20 20 20 7b 20 53 45  f 1}..  9   { SE
12100 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64  LECT a, b FROM d
12110 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
12120 43 54 20 62 2c 20 61 2b 31 20 46 52 4f 4d 20 64  CT b, a+1 FROM d
12130 35 20 4f 52 44 45 52 20 42 59 20 61 2b 31 20 7d  5 ORDER BY a+1 }
12140 20 0a 20 20 20 20 20 20 7b 66 20 32 20 20 20 63   .      {f 2   c
12150 20 35 20 20 20 34 20 63 20 20 20 31 20 66 7d 0a   5   4 c   1 f}.
12160 20 20 31 30 20 20 7b 20 53 45 4c 45 43 54 20 61    10  { SELECT a
12170 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f  , b FROM d5 UNIO
12180 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20  N ALL SELECT b, 
12190 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f 52 44 45  a+1 FROM d5 ORDE
121a0 52 20 42 59 20 32 20 7d 20 0a 20 20 20 20 20 20  R BY 2 } .      
121b0 7b 66 20 32 20 20 20 63 20 35 20 20 20 34 20 63  {f 2   c 5   4 c
121c0 20 20 20 31 20 66 7d 0a 0a 20 20 31 31 20 20 7b     1 f}..  11  {
121d0 20 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 20 46   SELECT a+1, b F
121e0 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
121f0 20 53 45 4c 45 43 54 20 62 2c 20 61 2b 31 20 46   SELECT b, a+1 F
12200 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20  ROM d5 ORDER BY 
12210 61 2b 31 20 7d 20 0a 20 20 20 20 20 20 7b 32 20  a+1 } .      {2 
12220 66 20 20 20 35 20 63 20 20 20 63 20 35 20 20 20  f   5 c   c 5   
12230 66 20 32 7d 0a 20 20 31 32 20 20 7b 20 53 45 4c  f 2}.  12  { SEL
12240 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20  ECT a+1, b FROM 
12250 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
12260 45 43 54 20 62 2c 20 61 2b 31 20 46 52 4f 4d 20  ECT b, a+1 FROM 
12270 64 35 20 4f 52 44 45 52 20 42 59 20 31 20 7d 20  d5 ORDER BY 1 } 
12280 0a 20 20 20 20 20 20 7b 32 20 66 20 20 20 35 20  .      {2 f   5 
12290 63 20 20 20 63 20 35 20 20 20 66 20 32 7d 0a 7d  c   c 5   f 2}.}
122a0 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46   ..# EVIDENCE-OF
122b0 3a 20 52 2d 33 39 32 36 35 2d 30 34 30 37 30 20  : R-39265-04070 
122c0 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 65  If no matching e
122d0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
122e0 20 66 6f 75 6e 64 20 69 6e 0a 23 20 74 68 65 20   found in.# the 
122f0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f  result columns o
12300 66 20 61 6e 79 20 63 6f 6e 73 74 69 74 75 65 6e  f any constituen
12310 74 20 53 45 4c 45 43 54 2c 20 69 74 20 69 73 20  t SELECT, it is 
12320 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 73  an error..#.do_s
12330 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
12340 6c 65 63 74 2d 38 2e 31 34 20 2d 65 72 72 6f 72  lect-8.14 -error
12350 20 7b 0a 20 20 25 73 20 4f 52 44 45 52 20 42 59   {.  %s ORDER BY
12360 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d   term does not m
12370 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
12380 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
12390 74 0a 7d 20 7b 0a 20 20 31 20 20 20 7b 20 53 45  t.} {.  1   { SE
123a0 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20 55  LECT a FROM d5 U
123b0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
123c0 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20 61  OM d6 ORDER BY a
123d0 2b 31 20 7d 20 20 20 20 20 20 20 20 20 20 31 73  +1 }          1s
123e0 74 0a 20 20 32 20 20 20 7b 20 53 45 4c 45 43 54  t.  2   { SELECT
123f0 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   a FROM d5 UNION
12400 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64   SELECT c FROM d
12410 36 20 4f 52 44 45 52 20 42 59 20 61 2c 20 61 2b  6 ORDER BY a, a+
12420 31 20 7d 20 20 20 20 20 20 20 32 6e 64 0a 20 20  1 }       2nd.  
12430 33 20 20 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  3   { SELECT * F
12440 52 4f 4d 20 64 35 20 49 4e 54 45 52 53 45 43 54  ROM d5 INTERSECT
12450 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
12460 36 20 4f 52 44 45 52 20 42 59 20 27 68 65 6c 6c  6 ORDER BY 'hell
12470 6f 27 20 7d 20 20 31 73 74 0a 20 20 34 20 20 20  o' }  1st.  4   
12480 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
12490 64 35 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  d5 INTERSECT SEL
124a0 45 43 54 20 2a 20 46 52 4f 4d 20 64 36 20 4f 52  ECT * FROM d6 OR
124b0 44 45 52 20 42 59 20 62 6c 61 68 20 20 20 20 7d  DER BY blah    }
124c0 20 20 31 73 74 0a 20 20 35 20 20 20 7b 20 53 45    1st.  5   { SE
124d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 35 20 49  LECT * FROM d5 I
124e0 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
124f0 2a 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20  * FROM d6 ORDER 
12500 42 59 20 63 2c 64 2c 63 2b 64 20 7d 20 20 33 72  BY c,d,c+d }  3r
12510 64 0a 20 20 36 20 20 20 7b 20 53 45 4c 45 43 54  d.  6   { SELECT
12520 20 2a 20 46 52 4f 4d 20 64 35 20 45 58 43 45 50   * FROM d5 EXCEP
12530 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  T SELECT * FROM 
12540 64 37 20 4f 52 44 45 52 20 42 59 20 31 2c 32 2c  d7 ORDER BY 1,2,
12550 62 2c 61 2f 62 20 20 7d 20 20 34 74 68 0a 7d 20  b,a/b  }  4th.} 
12560 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
12570 20 52 2d 30 33 34 30 37 2d 31 31 34 38 33 20 45   R-03407-11483 E
12580 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
12590 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
125a0 69 73 0a 23 20 70 72 6f 63 65 73 73 65 64 20 73  is.# processed s
125b0 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6d 61  eparately and ma
125c0 79 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61  y be matched aga
125d0 69 6e 73 74 20 72 65 73 75 6c 74 20 63 6f 6c 75  inst result colu
125e0 6d 6e 73 20 66 72 6f 6d 0a 23 20 64 69 66 66 65  mns from.# diffe
125f0 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
12600 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
12610 6d 70 6f 75 6e 64 2e 0a 23 20 0a 64 6f 5f 73 65  mpound..# .do_se
12620 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
12630 65 63 74 2d 38 2e 31 35 20 7b 0a 20 20 31 20 20  ect-8.15 {.  1  
12640 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  { SELECT a, b FR
12650 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d5 UNION ALL 
12660 53 45 4c 45 43 54 20 63 2d 31 2c 20 64 20 46 52  SELECT c-1, d FR
12670 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20 61  OM d6 ORDER BY a
12680 2c 20 64 20 7d 0a 20 20 20 20 20 7b 31 20 65 20  , d }.     {1 e 
12690 20 20 31 20 66 20 20 20 34 20 62 20 20 20 34 20    1 f   4 b   4 
126a0 63 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54  c}.  2  { SELECT
126b0 20 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e   a, b FROM d5 UN
126c0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
126d0 2d 31 2c 20 64 20 46 52 4f 4d 20 64 36 20 4f 52  -1, d FROM d6 OR
126e0 44 45 52 20 42 59 20 63 2d 31 2c 20 62 20 7d 0a  DER BY c-1, b }.
126f0 20 20 20 20 20 7b 31 20 65 20 20 20 31 20 66 20       {1 e   1 f 
12700 20 20 34 20 62 20 20 20 34 20 63 7d 0a 20 20 33    4 b   4 c}.  3
12710 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20    { SELECT a, b 
12720 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c  FROM d5 UNION AL
12730 4c 20 53 45 4c 45 43 54 20 63 2d 31 2c 20 64 20  L SELECT c-1, d 
12740 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59  FROM d6 ORDER BY
12750 20 31 2c 20 32 20 7d 0a 20 20 20 20 20 7b 31 20   1, 2 }.     {1 
12760 65 20 20 20 31 20 66 20 20 20 34 20 62 20 20 20  e   1 f   4 b   
12770 34 20 63 7d 0a 7d 20 0a 0a 0a 23 2d 2d 2d 2d 2d  4 c}.} ...#-----
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127c0 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 72 65 6c  ----.# Tests rel
127d0 61 74 65 64 20 74 6f 20 73 74 61 74 65 6d 65 6e  ated to statemen
127e0 74 73 20 6d 61 64 65 20 61 62 6f 75 74 20 74 68  ts made about th
127f0 65 20 4c 49 4d 49 54 2f 4f 46 46 53 45 54 20 63  e LIMIT/OFFSET c
12800 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 65 78 65 63  lause..#.do_exec
12810 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
12820 74 2d 39 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t-9.0 {.  CREATE
12830 20 54 41 42 4c 45 20 66 31 28 61 2c 20 62 29 3b   TABLE f1(a, b);
12840 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
12850 31 20 56 41 4c 55 45 53 28 32 36 2c 20 27 7a 27  1 VALUES(26, 'z'
12860 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12870 20 66 31 20 56 41 4c 55 45 53 28 32 35 2c 20 27   f1 VALUES(25, '
12880 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  y');.  INSERT IN
12890 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 34 2c  TO f1 VALUES(24,
128a0 20 27 78 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'x');.  INSERT 
128b0 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32  INTO f1 VALUES(2
128c0 33 2c 20 27 77 27 29 3b 0a 20 20 49 4e 53 45 52  3, 'w');.  INSER
128d0 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
128e0 28 32 32 2c 20 27 76 27 29 3b 0a 20 20 49 4e 53  (22, 'v');.  INS
128f0 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12900 45 53 28 32 31 2c 20 27 75 27 29 3b 0a 20 20 49  ES(21, 'u');.  I
12910 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41  NSERT INTO f1 VA
12920 4c 55 45 53 28 32 30 2c 20 27 74 27 29 3b 0a 20  LUES(20, 't');. 
12930 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12940 56 41 4c 55 45 53 28 31 39 2c 20 27 73 27 29 3b  VALUES(19, 's');
12950 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
12960 31 20 56 41 4c 55 45 53 28 31 38 2c 20 27 72 27  1 VALUES(18, 'r'
12970 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12980 20 66 31 20 56 41 4c 55 45 53 28 31 37 2c 20 27   f1 VALUES(17, '
12990 71 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  q');.  INSERT IN
129a0 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 36 2c  TO f1 VALUES(16,
129b0 20 27 70 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'p');.  INSERT 
129c0 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31  INTO f1 VALUES(1
129d0 35 2c 20 27 6f 27 29 3b 0a 20 20 49 4e 53 45 52  5, 'o');.  INSER
129e0 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
129f0 28 31 34 2c 20 27 6e 27 29 3b 0a 20 20 49 4e 53  (14, 'n');.  INS
12a00 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12a10 45 53 28 31 33 2c 20 27 6d 27 29 3b 0a 20 20 49  ES(13, 'm');.  I
12a20 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41  NSERT INTO f1 VA
12a30 4c 55 45 53 28 31 32 2c 20 27 6c 27 29 3b 0a 20  LUES(12, 'l');. 
12a40 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12a50 56 41 4c 55 45 53 28 31 31 2c 20 27 6b 27 29 3b  VALUES(11, 'k');
12a60 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
12a70 31 20 56 41 4c 55 45 53 28 31 30 2c 20 27 6a 27  1 VALUES(10, 'j'
12a80 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12a90 20 66 31 20 56 41 4c 55 45 53 28 39 2c 20 27 69   f1 VALUES(9, 'i
12aa0 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12ab0 4f 20 66 31 20 56 41 4c 55 45 53 28 38 2c 20 27  O f1 VALUES(8, '
12ac0 68 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  h');.  INSERT IN
12ad0 54 4f 20 66 31 20 56 41 4c 55 45 53 28 37 2c 20  TO f1 VALUES(7, 
12ae0 27 67 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'g');.  INSERT I
12af0 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 36 2c  NTO f1 VALUES(6,
12b00 20 27 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'f');.  INSERT 
12b10 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 35  INTO f1 VALUES(5
12b20 2c 20 27 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'e');.  INSERT
12b30 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
12b40 34 2c 20 27 64 27 29 3b 0a 20 20 49 4e 53 45 52  4, 'd');.  INSER
12b50 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
12b60 28 33 2c 20 27 63 27 29 3b 0a 20 20 49 4e 53 45  (3, 'c');.  INSE
12b70 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
12b80 53 28 32 2c 20 27 62 27 29 3b 0a 20 20 49 4e 53  S(2, 'b');.  INS
12b90 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12ba0 45 53 28 31 2c 20 27 61 27 29 3b 0a 7d 20 7b 7d  ES(1, 'a');.} {}
12bb0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
12bc0 20 52 2d 33 30 34 38 31 2d 35 36 36 32 37 20 41   R-30481-56627 A
12bd0 6e 79 20 73 63 61 6c 61 72 20 65 78 70 72 65 73  ny scalar expres
12be0 73 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  sion may be used
12bf0 20 69 6e 20 74 68 65 0a 23 20 4c 49 4d 49 54 20   in the.# LIMIT 
12c00 63 6c 61 75 73 65 2c 20 73 6f 20 6c 6f 6e 67 20  clause, so long 
12c10 61 73 20 69 74 20 65 76 61 6c 75 61 74 65 73 20  as it evaluates 
12c20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  to an integer or
12c30 20 61 20 76 61 6c 75 65 20 74 68 61 74 0a 23 20   a value that.# 
12c40 63 61 6e 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c  can be losslessl
12c50 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  y converted to a
12c60 6e 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f 5f  n integer..#.do_
12c70 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
12c80 65 6c 65 63 74 2d 39 2e 31 20 7b 0a 20 20 31 20  elect-9.1 {.  1 
12c90 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
12ca0 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
12cb0 49 4d 49 54 20 35 20 7d 20 7b 61 20 62 20 63 20  IMIT 5 } {a b c 
12cc0 64 20 65 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45  d e}.  2  { SELE
12cd0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
12ce0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 32 2b  ER BY a LIMIT 2+
12cf0 33 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a  3 } {a b c d e}.
12d00 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62 20    3  { SELECT b 
12d10 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59  FROM f1 ORDER BY
12d20 20 61 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54   a LIMIT (SELECT
12d30 20 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45   a FROM f1 WHERE
12d40 20 62 20 3d 20 27 65 27 29 20 7d 20 0a 20 20 20   b = 'e') } .   
12d50 20 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20    {a b c d e}.  
12d60 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  4  { SELECT b FR
12d70 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
12d80 20 4c 49 4d 49 54 20 35 2e 30 20 7d 20 7b 61 20   LIMIT 5.0 } {a 
12d90 62 20 63 20 64 20 65 7d 0a 20 20 35 20 20 7b 20  b c d e}.  5  { 
12da0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
12db0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
12dc0 54 20 27 35 27 20 7d 20 7b 61 20 62 20 63 20 64  T '5' } {a b c d
12dd0 20 65 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   e}.}..# EVIDENC
12de0 45 2d 4f 46 3a 20 52 2d 34 36 31 35 35 2d 34 37  E-OF: R-46155-47
12df0 32 31 39 20 49 66 20 74 68 65 20 65 78 70 72 65  219 If the expre
12e00 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
12e10 74 6f 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  to a NULL value.
12e20 23 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 76  # or any other v
12e30 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  alue that cannot
12e40 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63   be losslessly c
12e50 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69  onverted to an i
12e60 6e 74 65 67 65 72 2c 0a 23 20 61 6e 20 65 72 72  nteger,.# an err
12e70 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
12e80 23 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  #..do_select_tes
12e90 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 32 20  ts e_select-9.2 
12ea0 2d 65 72 72 6f 72 20 22 64 61 74 61 74 79 70 65  -error "datatype
12eb0 20 6d 69 73 6d 61 74 63 68 22 20 7b 0a 20 20 31   mismatch" {.  1
12ec0 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
12ed0 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
12ee0 4c 49 4d 49 54 20 27 68 65 6c 6c 6f 27 20 7d 20  LIMIT 'hello' } 
12ef0 7b 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54  {}.  2  { SELECT
12f00 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
12f10 20 42 59 20 61 20 4c 49 4d 49 54 20 4e 55 4c 4c   BY a LIMIT NULL
12f20 20 7d 20 7b 7d 0a 20 20 33 20 20 7b 20 53 45 4c   } {}.  3  { SEL
12f30 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
12f40 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 58  DER BY a LIMIT X
12f50 27 41 42 43 44 27 20 7d 20 7b 7d 0a 20 20 34 20  'ABCD' } {}.  4 
12f60 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
12f70 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
12f80 49 4d 49 54 20 35 2e 31 20 7d 20 7b 7d 0a 20 20  IMIT 5.1 } {}.  
12f90 35 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  5  { SELECT b FR
12fa0 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
12fb0 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20 67   LIMIT (SELECT g
12fc0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 62 29 20 46  roup_concat(b) F
12fd0 52 4f 4d 20 66 31 29 20 7d 20 7b 7d 0a 7d 20 0a  ROM f1) } {}.} .
12fe0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
12ff0 52 2d 30 33 30 31 34 2d 32 36 34 31 34 20 49 66  R-03014-26414 If
13000 20 74 68 65 20 4c 49 4d 49 54 20 65 78 70 72 65   the LIMIT expre
13010 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
13020 74 6f 20 61 0a 23 20 6e 65 67 61 74 69 76 65 20  to a.# negative 
13030 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 72  value, then ther
13040 65 20 69 73 20 6e 6f 20 75 70 70 65 72 20 62 6f  e is no upper bo
13050 75 6e 64 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  und on the numbe
13060 72 20 6f 66 20 72 6f 77 73 0a 23 20 72 65 74 75  r of rows.# retu
13070 72 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  rned..#.do_selec
13080 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
13090 2d 39 2e 34 20 7b 0a 20 20 31 20 20 7b 20 53 45  -9.4 {.  1  { SE
130a0 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
130b0 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
130c0 2d 31 20 7d 20 0a 20 20 20 20 20 7b 61 20 62 20  -1 } .     {a b 
130d0 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20  c d e f g h i j 
130e0 6b 20 6c 20 6d 20 6e 20 6f 20 70 20 71 20 72 20  k l m n o p q r 
130f0 73 20 74 20 75 20 76 20 77 20 78 20 79 20 7a 7d  s t u v w x y z}
13100 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62  .  2  { SELECT b
13110 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13120 59 20 61 20 4c 49 4d 49 54 20 6c 65 6e 67 74 68  Y a LIMIT length
13130 28 27 61 62 63 27 29 2d 31 30 30 20 7d 20 0a 20  ('abc')-100 } . 
13140 20 20 20 20 7b 61 20 62 20 63 20 64 20 65 20 66      {a b c d e f
13150 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e   g h i j k l m n
13160 20 6f 20 70 20 71 20 72 20 73 20 74 20 75 20 76   o p q r s t u v
13170 20 77 20 78 20 79 20 7a 7d 0a 20 20 33 20 20 7b   w x y z}.  3  {
13180 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13190 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
131a0 49 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  IT (SELECT count
131b0 28 2a 29 20 46 52 4f 4d 20 66 31 29 2f 32 20 2d  (*) FROM f1)/2 -
131c0 20 31 34 20 7d 0a 20 20 20 20 20 7b 61 20 62 20   14 }.     {a b 
131d0 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20  c d e f g h i j 
131e0 6b 20 6c 20 6d 20 6e 20 6f 20 70 20 71 20 72 20  k l m n o p q r 
131f0 73 20 74 20 75 20 76 20 77 20 78 20 79 20 7a 7d  s t u v w x y z}
13200 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
13210 46 3a 20 52 2d 33 33 37 35 30 2d 32 39 35 33 36  F: R-33750-29536
13220 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
13230 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 74  SELECT returns t
13240 68 65 20 66 69 72 73 74 20 4e 0a 23 20 72 6f 77  he first N.# row
13250 73 20 6f 66 20 69 74 73 20 72 65 73 75 6c 74 20  s of its result 
13260 73 65 74 20 6f 6e 6c 79 2c 20 77 68 65 72 65 20  set only, where 
13270 4e 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 74  N is the value t
13280 68 61 74 20 74 68 65 20 4c 49 4d 49 54 0a 23 20  hat the LIMIT.# 
13290 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
132a0 61 74 65 73 20 74 6f 2e 0a 23 0a 64 6f 5f 73 65  ates to..#.do_se
132b0 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
132c0 65 63 74 2d 39 2e 35 20 7b 0a 20 20 31 20 20 7b  ect-9.5 {.  1  {
132d0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
132e0 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
132f0 49 54 20 30 20 7d 20 7b 7d 0a 20 20 32 20 20 7b  IT 0 } {}.  2  {
13300 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13310 31 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53  1 ORDER BY a DES
13320 43 20 4c 49 4d 49 54 20 34 20 7d 20 7b 7a 20 79  C LIMIT 4 } {z y
13330 20 78 20 77 7d 0a 20 20 33 20 20 7b 20 53 45 4c   x w}.  3  { SEL
13340 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13350 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49  DER BY a DESC LI
13360 4d 49 54 20 38 20 7d 20 7b 7a 20 79 20 78 20 77  MIT 8 } {z y x w
13370 20 76 20 75 20 74 20 73 7d 0a 20 20 34 20 20 7b   v u t s}.  4  {
13380 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13390 31 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53  1 ORDER BY a DES
133a0 43 20 4c 49 4d 49 54 20 27 31 32 2e 30 27 20 7d  C LIMIT '12.0' }
133b0 20 7b 7a 20 79 20 78 20 77 20 76 20 75 20 74 20   {z y x w v u t 
133c0 73 20 72 20 71 20 70 20 6f 7d 0a 7d 0a 0a 23 20  s r q p o}.}..# 
133d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
133e0 34 39 33 35 2d 31 39 30 35 37 20 4f 72 2c 20 69  4935-19057 Or, i
133f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
13400 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 72 65 74  tement would ret
13410 75 72 6e 0a 23 20 6c 65 73 73 20 74 68 61 6e 20  urn.# less than 
13420 4e 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 61  N rows without a
13430 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 74   LIMIT clause, t
13440 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 72  hen the entire r
13450 65 73 75 6c 74 20 73 65 74 20 69 73 0a 23 20 72  esult set is.# r
13460 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65  eturned..#.do_se
13470 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
13480 65 63 74 2d 39 2e 36 20 7b 0a 20 20 31 20 20 7b  ect-9.6 {.  1  {
13490 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
134a0 31 20 57 48 45 52 45 20 61 3e 32 31 20 4f 52 44  1 WHERE a>21 ORD
134b0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30  ER BY a LIMIT 10
134c0 20 7d 20 7b 76 20 77 20 78 20 79 20 7a 7d 0a 20   } {v w x y z}. 
134d0 20 32 20 20 7b 20 53 45 4c 45 43 54 20 63 6f 75   2  { SELECT cou
134e0 6e 74 28 2a 29 20 46 52 4f 4d 20 66 31 20 47 52  nt(*) FROM f1 GR
134f0 4f 55 50 20 42 59 20 61 2f 35 20 4f 52 44 45 52  OUP BY a/5 ORDER
13500 20 42 59 20 31 20 4c 49 4d 49 54 20 31 30 20 7d   BY 1 LIMIT 10 }
13510 20 7b 32 20 34 20 35 20 35 20 35 20 35 7d 0a 7d   {2 4 5 5 5 5}.}
13520 20 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   ...# EVIDENCE-O
13530 46 3a 20 52 2d 32 34 31 38 38 2d 32 34 33 34 39  F: R-24188-24349
13540 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
13550 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
13560 6f 70 74 69 6f 6e 61 6c 0a 23 20 4f 46 46 53 45  optional.# OFFSE
13570 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 6d 61  T clause that ma
13580 79 20 66 6f 6c 6c 6f 77 20 61 20 4c 49 4d 49 54  y follow a LIMIT
13590 20 63 6c 61 75 73 65 20 6d 75 73 74 20 61 6c 73   clause must als
135a0 6f 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 6e  o evaluate to an
135b0 0a 23 20 69 6e 74 65 67 65 72 2c 20 6f 72 20 61  .# integer, or a
135c0 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20   value that can 
135d0 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f  be losslessly co
135e0 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e  nverted to an in
135f0 74 65 67 65 72 2e 0a 23 0a 66 6f 72 65 61 63 68  teger..#.foreach
13600 20 7b 74 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20   {tn select} {. 
13610 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   1  { SELECT b F
13620 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13630 61 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54  a LIMIT 2 OFFSET
13640 20 27 68 65 6c 6c 6f 27 20 7d 20 0a 20 20 32 20   'hello' } .  2 
13650 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
13660 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
13670 49 4d 49 54 20 32 20 4f 46 46 53 45 54 20 4e 55  IMIT 2 OFFSET NU
13680 4c 4c 20 7d 20 0a 20 20 33 20 20 7b 20 53 45 4c  LL } .  3  { SEL
13690 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
136a0 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 32  DER BY a LIMIT 2
136b0 20 4f 46 46 53 45 54 20 58 27 41 42 43 44 27 20   OFFSET X'ABCD' 
136c0 7d 20 0a 20 20 34 20 20 7b 20 53 45 4c 45 43 54  } .  4  { SELECT
136d0 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
136e0 20 42 59 20 61 20 4c 49 4d 49 54 20 32 20 4f 46   BY a LIMIT 2 OF
136f0 46 53 45 54 20 35 2e 31 20 7d 20 0a 20 20 35 20  FSET 5.1 } .  5 
13700 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
13710 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 0a   f1 ORDER BY a .
13720 20 20 20 20 20 20 20 4c 49 4d 49 54 20 32 20 4f         LIMIT 2 O
13730 46 46 53 45 54 20 28 53 45 4c 45 43 54 20 67 72  FFSET (SELECT gr
13740 6f 75 70 5f 63 6f 6e 63 61 74 28 62 29 20 46 52  oup_concat(b) FR
13750 4f 4d 20 66 31 29 20 0a 20 20 7d 20 0a 7d 20 7b  OM f1) .  } .} {
13760 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .  do_catchsql_t
13770 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 39 2e 37  est e_select-9.7
13780 2e 24 74 6e 20 24 73 65 6c 65 63 74 20 7b 31 20  .$tn $select {1 
13790 7b 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  {datatype mismat
137a0 63 68 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  ch}}.}..# EVIDEN
137b0 43 45 2d 4f 46 3a 20 52 2d 32 30 34 36 37 2d 34  CE-OF: R-20467-4
137c0 33 34 32 32 20 49 66 20 61 6e 20 65 78 70 72 65  3422 If an expre
137d0 73 73 69 6f 6e 20 68 61 73 20 61 6e 20 4f 46 46  ssion has an OFF
137e0 53 45 54 20 63 6c 61 75 73 65 2c 20 74 68 65 6e  SET clause, then
137f0 0a 23 20 74 68 65 20 66 69 72 73 74 20 4d 20 72  .# the first M r
13800 6f 77 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20  ows are omitted 
13810 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20  from the result 
13820 73 65 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  set returned by 
13830 74 68 65 0a 23 20 53 45 4c 45 43 54 20 73 74 61  the.# SELECT sta
13840 74 65 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 6e  tement and the n
13850 65 78 74 20 4e 20 72 6f 77 73 20 61 72 65 20 72  ext N rows are r
13860 65 74 75 72 6e 65 64 2c 20 77 68 65 72 65 20 4d  eturned, where M
13870 20 61 6e 64 20 4e 20 61 72 65 0a 23 20 74 68 65   and N are.# the
13880 20 76 61 6c 75 65 73 20 74 68 61 74 20 74 68 65   values that the
13890 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d 49   OFFSET and LIMI
138a0 54 20 63 6c 61 75 73 65 73 20 65 76 61 6c 75 61  T clauses evalua
138b0 74 65 20 74 6f 2c 0a 23 20 72 65 73 70 65 63 74  te to,.# respect
138c0 69 76 65 6c 79 2e 0a 23 0a 64 6f 5f 73 65 6c 65  ively..#.do_sele
138d0 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
138e0 74 2d 39 2e 38 20 7b 0a 20 20 31 20 20 7b 20 53  t-9.8 {.  1  { S
138f0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13900 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13910 20 31 30 20 4f 46 46 53 45 54 20 35 7d 20 7b 66   10 OFFSET 5} {f
13920 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e   g h i j k l m n
13930 20 6f 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43   o}.  2  { SELEC
13940 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13950 52 20 42 59 20 61 20 4c 49 4d 49 54 20 32 2b 33  R BY a LIMIT 2+3
13960 20 4f 46 46 53 45 54 20 31 30 7d 20 7b 6b 20 6c   OFFSET 10} {k l
13970 20 6d 20 6e 20 6f 7d 0a 20 20 33 20 20 7b 20 53   m n o}.  3  { S
13980 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13990 4f 52 44 45 52 20 42 59 20 61 20 0a 20 20 20 20  ORDER BY a .    
139a0 20 20 20 4c 49 4d 49 54 20 20 28 53 45 4c 45 43     LIMIT  (SELEC
139b0 54 20 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52  T a FROM f1 WHER
139c0 45 20 62 3d 27 6a 27 29 20 0a 20 20 20 20 20 20  E b='j') .      
139d0 20 4f 46 46 53 45 54 20 28 53 45 4c 45 43 54 20   OFFSET (SELECT 
139e0 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20  a FROM f1 WHERE 
139f0 62 3d 27 62 27 29 20 0a 20 20 20 20 20 7d 20 7b  b='b') .     } {
13a00 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20  c d e f g h i j 
13a10 6b 20 6c 7d 0a 20 20 34 20 20 7b 20 53 45 4c 45  k l}.  4  { SELE
13a20 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13a30 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 27 35  ER BY a LIMIT '5
13a40 27 20 4f 46 46 53 45 54 20 33 2e 30 20 7d 20 7b  ' OFFSET 3.0 } {
13a50 64 20 65 20 66 20 67 20 68 7d 0a 20 20 35 20 20  d e f g h}.  5  
13a60 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
13a70 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
13a80 4d 49 54 20 27 35 27 20 4f 46 46 53 45 54 20 30  MIT '5' OFFSET 0
13a90 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20   } {a b c d e}. 
13aa0 20 36 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   6  { SELECT b F
13ab0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13ac0 61 20 4c 49 4d 49 54 20 30 20 4f 46 46 53 45 54  a LIMIT 0 OFFSET
13ad0 20 31 30 20 7d 20 7b 7d 0a 20 20 37 20 20 7b 20   10 } {}.  7  { 
13ae0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
13af0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
13b00 54 20 33 20 4f 46 46 53 45 54 20 27 31 27 7c 7c  T 3 OFFSET '1'||
13b10 27 35 27 20 7d 20 7b 70 20 71 20 72 7d 0a 7d 0a  '5' } {p q r}.}.
13b20 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
13b30 52 2d 33 34 36 34 38 2d 34 34 38 37 35 20 4f 72  R-34648-44875 Or
13b40 2c 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  , if the SELECT 
13b50 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6c 65 73  would return les
13b60 73 20 74 68 61 6e 0a 23 20 4d 2b 4e 20 72 6f 77  s than.# M+N row
13b70 73 20 69 66 20 69 74 20 64 69 64 20 6e 6f 74 20  s if it did not 
13b80 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
13b90 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  use, then the fi
13ba0 72 73 74 20 4d 20 72 6f 77 73 20 61 72 65 0a 23  rst M rows are.#
13bb0 20 73 6b 69 70 70 65 64 20 61 6e 64 20 74 68 65   skipped and the
13bc0 20 72 65 6d 61 69 6e 69 6e 67 20 72 6f 77 73 20   remaining rows 
13bd0 28 69 66 20 61 6e 79 29 20 61 72 65 20 72 65 74  (if any) are ret
13be0 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65  urned..#.do_sele
13bf0 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
13c00 74 2d 39 2e 39 20 7b 0a 20 20 31 20 20 7b 20 53  t-9.9 {.  1  { S
13c10 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13c20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13c30 20 31 30 20 4f 46 46 53 45 54 20 32 30 7d 20 7b   10 OFFSET 20} {
13c40 75 20 76 20 77 20 78 20 79 20 7a 7d 0a 20 20 32  u v w x y z}.  2
13c50 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f    { SELECT a FRO
13c60 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13c70 44 45 53 43 20 4c 49 4d 49 54 20 31 30 30 20 4f  DESC LIMIT 100 O
13c80 46 46 53 45 54 20 31 38 2b 34 7d 20 7b 34 20 33  FFSET 18+4} {4 3
13c90 20 32 20 31 7d 0a 7d 0a 0a 0a 23 20 45 56 49 44   2 1}.}...# EVID
13ca0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 32 39 33  ENCE-OF: R-23293
13cb0 2d 36 32 34 34 37 20 49 66 20 74 68 65 20 4f 46  -62447 If the OF
13cc0 46 53 45 54 20 63 6c 61 75 73 65 20 65 76 61 6c  FSET clause eval
13cd0 75 61 74 65 73 20 74 6f 20 61 0a 23 20 6e 65 67  uates to a.# neg
13ce0 61 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65  ative value, the
13cf0 20 72 65 73 75 6c 74 73 20 61 72 65 20 74 68 65   results are the
13d00 20 73 61 6d 65 20 61 73 20 69 66 20 69 74 20 68   same as if it h
13d10 61 64 20 65 76 61 6c 75 61 74 65 64 20 74 6f 0a  ad evaluated to.
13d20 23 20 7a 65 72 6f 2e 0a 23 0a 64 6f 5f 73 65 6c  # zero..#.do_sel
13d30 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
13d40 63 74 2d 39 2e 31 30 20 7b 0a 20 20 31 20 20 7b  ct-9.10 {.  1  {
13d50 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13d60 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
13d70 49 54 20 35 20 4f 46 46 53 45 54 20 2d 31 20 7d  IT 5 OFFSET -1 }
13d80 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20 32   {a b c d e}.  2
13d90 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13da0 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13db0 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20 2d  LIMIT 5 OFFSET -
13dc0 35 30 30 20 7d 20 7b 61 20 62 20 63 20 64 20 65  500 } {a b c d e
13dd0 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20  }.  3  { SELECT 
13de0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
13df0 42 59 20 61 20 4c 49 4d 49 54 20 35 20 4f 46 46  BY a LIMIT 5 OFF
13e00 53 45 54 20 30 20 20 7d 20 7b 61 20 62 20 63 20  SET 0  } {a b c 
13e10 64 20 65 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45  d e}.} ..# EVIDE
13e20 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 35 30 39 2d  NCE-OF: R-19509-
13e30 34 30 33 35 36 20 49 6e 73 74 65 61 64 20 6f 66  40356 Instead of
13e40 20 61 20 73 65 70 61 72 61 74 65 20 4f 46 46 53   a separate OFFS
13e50 45 54 20 63 6c 61 75 73 65 2c 20 74 68 65 0a 23  ET clause, the.#
13e60 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6d 61   LIMIT clause ma
13e70 79 20 73 70 65 63 69 66 79 20 74 77 6f 20 73 63  y specify two sc
13e80 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 73  alar expressions
13e90 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 20   separated by a 
13ea0 63 6f 6d 6d 61 2e 0a 23 0a 23 20 45 56 49 44 45  comma..#.# EVIDE
13eb0 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 37 38 38 2d  NCE-OF: R-33788-
13ec0 34 36 32 34 33 20 49 6e 20 74 68 69 73 20 63 61  46243 In this ca
13ed0 73 65 2c 20 74 68 65 20 66 69 72 73 74 20 65 78  se, the first ex
13ee0 70 72 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64  pression is used
13ef0 0a 23 20 61 73 20 74 68 65 20 4f 46 46 53 45 54  .# as the OFFSET
13f00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
13f10 74 68 65 20 73 65 63 6f 6e 64 20 61 73 20 74 68  the second as th
13f20 65 20 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69  e LIMIT expressi
13f30 6f 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  on..#.do_select_
13f40 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39  tests e_select-9
13f50 2e 31 31 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c  .11 {.  1  { SEL
13f60 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13f70 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 35  DER BY a LIMIT 5
13f80 2c 20 31 30 20 7d 20 7b 66 20 67 20 68 20 69 20  , 10 } {f g h i 
13f90 6a 20 6b 20 6c 20 6d 20 6e 20 6f 7d 0a 20 20 32  j k l m n o}.  2
13fa0 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13fb0 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13fc0 4c 49 4d 49 54 20 31 30 2c 20 32 2b 33 20 7d 20  LIMIT 10, 2+3 } 
13fd0 7b 6b 20 6c 20 6d 20 6e 20 6f 7d 0a 20 20 33 20  {k l m n o}.  3 
13fe0 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
13ff0 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 0a   f1 ORDER BY a .
14000 20 20 20 20 20 20 20 4c 49 4d 49 54 20 28 53 45         LIMIT (SE
14010 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20 57  LECT a FROM f1 W
14020 48 45 52 45 20 62 3d 27 62 27 29 2c 20 28 53 45  HERE b='b'), (SE
14030 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20 57  LECT a FROM f1 W
14040 48 45 52 45 20 62 3d 27 6a 27 29 20 0a 20 20 20  HERE b='j') .   
14050 20 20 7d 20 7b 63 20 64 20 65 20 66 20 67 20 68    } {c d e f g h
14060 20 69 20 6a 20 6b 20 6c 7d 0a 20 20 34 20 20 7b   i j k l}.  4  {
14070 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
14080 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
14090 49 54 20 33 2e 30 2c 20 27 35 27 20 7d 20 7b 64  IT 3.0, '5' } {d
140a0 20 65 20 66 20 67 20 68 7d 0a 20 20 35 20 20 7b   e f g h}.  5  {
140b0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
140c0 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
140d0 49 54 20 30 2c 20 27 35 27 20 7d 20 7b 61 20 62  IT 0, '5' } {a b
140e0 20 63 20 64 20 65 7d 0a 20 20 36 20 20 7b 20 53   c d e}.  6  { S
140f0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
14100 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
14110 20 31 30 2c 20 30 20 7d 20 7b 7d 0a 20 20 37 20   10, 0 } {}.  7 
14120 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
14130 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
14140 49 4d 49 54 20 27 31 27 7c 7c 27 35 27 2c 20 33  IMIT '1'||'5', 3
14150 20 7d 20 7b 70 20 71 20 72 7d 0a 0a 20 20 38 20   } {p q r}..  8 
14160 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
14170 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
14180 49 4d 49 54 20 32 30 2c 20 31 30 20 7d 20 7b 75  IMIT 20, 10 } {u
14190 20 76 20 77 20 78 20 79 20 7a 7d 0a 20 20 39 20   v w x y z}.  9 
141a0 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
141b0 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 44   f1 ORDER BY a D
141c0 45 53 43 20 4c 49 4d 49 54 20 31 38 2b 34 2c 20  ESC LIMIT 18+4, 
141d0 31 30 30 20 7d 20 7b 34 20 33 20 32 20 31 7d 0a  100 } {4 3 2 1}.
141e0 0a 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20 62  .  10 { SELECT b
141f0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
14200 59 20 61 20 4c 49 4d 49 54 20 2d 31 2c 20 35 20  Y a LIMIT -1, 5 
14210 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20  } {a b c d e}.  
14220 31 31 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  11 { SELECT b FR
14230 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
14240 20 4c 49 4d 49 54 20 2d 35 30 30 2c 20 35 20 7d   LIMIT -500, 5 }
14250 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20 31   {a b c d e}.  1
14260 32 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f  2 { SELECT b FRO
14270 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
14280 4c 49 4d 49 54 20 30 2c 20 35 20 7d 20 7b 61 20  LIMIT 0, 5 } {a 
14290 62 20 63 20 64 20 65 7d 0a 7d 0a 0a 66 69 6e 69  b c d e}.}..fini
142a0 73 68 5f 74 65 73 74 0a                          sh_test.