/ Hex Artifact Content
Login

Artifact 52692ff3849541e828ad4661fe3773a9b8711763:


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 20 7d 0a 0a 20 20 31 31 30  *)=2" { }..  110
13f0: 31 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  1.1  "SELECT DIS
1400: 54 49 4e 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  TINCT count(*), 
1410: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47  max(a) FROM t1 G
1420: 52 4f 55 50 20 42 59 20 62 22 20 7b 31 20 61 20  ROUP BY b" {1 a 
1430: 31 20 63 20 31 20 62 7d 0a 20 20 31 31 30 32 2e  1 c 1 b}.  1102.
1440: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
1450: 4e 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  NCT count(*), ma
1460: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20  x(a) FROM t1 .  
1470: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
1480: 59 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  Y b HAVING count
1490: 28 2a 29 3d 31 22 20 7b 0a 20 20 20 20 31 20 61  (*)=1" {.    1 a
14a0: 20 31 20 63 20 31 20 62 0a 20 20 7d 0a 20 20 31   1 c 1 b.  }.  1
14b0: 31 30 32 2e 32 20 20 22 53 45 4c 45 43 54 20 44  102.2  "SELECT D
14c0: 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28 2a 29  ISTINCT count(*)
14d0: 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31  , max(a) FROM t1
14e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f   .           GRO
14f0: 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
1500: 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 20 0a 20 20  ount(*)=2" { .  
1510: 7d 0a 0a 20 20 32 31 30 31 2e 31 20 20 22 53 45  }..  2101.1  "SE
1520: 4c 45 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a  LECT ALL count(*
1530: 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  ), max(a) FROM t
1540: 31 20 47 52 4f 55 50 20 42 59 20 62 22 20 7b 31  1 GROUP BY b" {1
1550: 20 61 20 31 20 63 20 31 20 62 7d 0a 20 20 32 31   a 1 c 1 b}.  21
1560: 30 32 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c  02.1  "SELECT AL
1570: 4c 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28  L count(*), max(
1580: 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20 20  a) FROM t1 .    
1590: 20 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20         GROUP BY 
15a0: 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  b HAVING count(*
15b0: 29 3d 31 22 20 7b 0a 20 20 20 20 31 20 61 20 31  )=1" {.    1 a 1
15c0: 20 63 20 31 20 62 0a 20 20 7d 0a 20 20 32 31 30   c 1 b.  }.  210
15d0: 32 2e 32 20 20 22 53 45 4c 45 43 54 20 41 4c 4c  2.2  "SELECT ALL
15e0: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61   count(*), max(a
15f0: 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20 20 20  ) FROM t1 .     
1600: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
1610: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
1620: 3d 32 22 20 7b 20 0a 20 20 7d 0a 0a 20 20 30 30  =2" { .  }..  00
1630: 31 31 2e 31 20 20 22 53 45 4c 45 43 54 20 31 2c  11.1  "SELECT 1,
1640: 20 32 2c 20 33 20 57 48 45 52 45 20 31 20 47 52   2, 3 WHERE 1 GR
1650: 4f 55 50 20 42 59 20 32 22 20 7b 31 20 32 20 33  OUP BY 2" {1 2 3
1660: 7d 0a 20 20 30 30 31 32 2e 31 20 20 22 53 45 4c  }.  0012.1  "SEL
1670: 45 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52  ECT 1, 2, 3 WHER
1680: 45 20 30 20 47 52 4f 55 50 20 42 59 20 32 20 48  E 0 GROUP BY 2 H
1690: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31  AVING count(*)=1
16a0: 22 20 7b 7d 0a 20 20 30 30 31 32 2e 32 20 20 22  " {}.  0012.2  "
16b0: 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 20 57  SELECT 1, 2, 3 W
16c0: 48 45 52 45 20 30 20 47 52 4f 55 50 20 42 59 20  HERE 0 GROUP BY 
16d0: 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  2 HAVING count(*
16e0: 29 3e 31 22 20 7b 7d 0a 0a 20 20 31 30 31 31 2e  )>1" {}..  1011.
16f0: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
1700: 4e 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52  NCT 1, 2, 3 WHER
1710: 45 20 30 20 47 52 4f 55 50 20 42 59 20 32 22 20  E 0 GROUP BY 2" 
1720: 7b 7d 0a 20 20 31 30 31 32 2e 31 20 20 22 53 45  {}.  1012.1  "SE
1730: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 31 2c  LECT DISTINCT 1,
1740: 20 32 2c 20 33 20 57 48 45 52 45 20 31 20 47 52   2, 3 WHERE 1 GR
1750: 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20  OUP BY 2 HAVING 
1760: 63 6f 75 6e 74 28 2a 29 3d 31 22 20 0a 20 20 20  count(*)=1" .   
1770: 20 20 20 20 20 20 20 7b 31 20 32 20 33 7d 0a 20         {1 2 3}. 
1780: 20 31 30 31 32 2e 32 20 20 22 53 45 4c 45 43 54   1012.2  "SELECT
1790: 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c 20   DISTINCT 1, 2, 
17a0: 33 20 57 48 45 52 45 20 4e 55 4c 4c 20 47 52 4f  3 WHERE NULL GRO
17b0: 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63  UP BY 2 HAVING c
17c0: 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20  ount(*)>1" {}.. 
17d0: 20 32 30 31 31 2e 31 20 20 22 53 45 4c 45 43 54   2011.1  "SELECT
17e0: 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57 48 45   ALL 1, 2, 3 WHE
17f0: 52 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 22  RE 1 GROUP BY 2"
1800: 20 7b 31 20 32 20 33 7d 0a 20 20 32 30 31 32 2e   {1 2 3}.  2012.
1810: 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31  1  "SELECT ALL 1
1820: 2c 20 32 2c 20 33 20 57 48 45 52 45 20 30 20 47  , 2, 3 WHERE 0 G
1830: 52 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e 47  ROUP BY 2 HAVING
1840: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 7d 0a   count(*)=1" {}.
1850: 20 20 32 30 31 32 2e 32 20 20 22 53 45 4c 45 43    2012.2  "SELEC
1860: 54 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57 48  T ALL 1, 2, 3 WH
1870: 45 52 45 20 27 61 62 63 27 20 47 52 4f 55 50 20  ERE 'abc' GROUP 
1880: 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e  BY 2 HAVING coun
1890: 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20 20 30 31  t(*)>1" {}..  01
18a0: 31 31 2e 31 20 20 22 53 45 4c 45 43 54 20 63 6f  11.1  "SELECT co
18b0: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
18c0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 27  ROM t1 WHERE a='
18d0: 61 27 20 47 52 4f 55 50 20 42 59 20 62 22 20 7b  a' GROUP BY b" {
18e0: 31 20 61 7d 0a 20 20 30 31 31 32 2e 31 20 20 22  1 a}.  0112.1  "
18f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
1900: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
1910: 0a 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52  .           WHER
1920: 45 20 61 3d 27 63 27 20 47 52 4f 55 50 20 42 59  E a='c' GROUP BY
1930: 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28   b HAVING count(
1940: 2a 29 3d 31 22 20 7b 31 20 63 7d 0a 20 20 30 31  *)=1" {1 c}.  01
1950: 31 32 2e 32 20 20 22 53 45 4c 45 43 54 20 63 6f  12.2  "SELECT co
1960: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
1970: 52 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20  ROM t1 .        
1980: 20 20 20 57 48 45 52 45 20 30 20 47 52 4f 55 50     WHERE 0 GROUP
1990: 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 6f 75   BY b HAVING cou
19a0: 6e 74 28 2a 29 3d 32 22 20 7b 20 7d 0a 20 20 31  nt(*)=2" { }.  1
19b0: 31 31 31 2e 31 20 20 22 53 45 4c 45 43 54 20 44  111.1  "SELECT D
19c0: 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28 2a 29  ISTINCT count(*)
19d0: 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31  , max(a) FROM t1
19e0: 20 57 48 45 52 45 20 61 3c 27 63 27 20 47 52 4f   WHERE a<'c' GRO
19f0: 55 50 20 42 59 20 62 22 20 0a 20 20 20 20 20 20  UP BY b" .      
1a00: 20 20 20 20 7b 31 20 61 20 31 20 62 7d 0a 20 20      {1 a 1 b}.  
1a10: 31 31 31 32 2e 31 20 20 22 53 45 4c 45 43 54 20  1112.1  "SELECT 
1a20: 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28 2a  DISTINCT count(*
1a30: 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  ), max(a) FROM t
1a40: 31 20 57 48 45 52 45 20 61 3e 27 61 27 0a 20 20  1 WHERE a>'a'.  
1a50: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
1a60: 59 20 62 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  Y b HAVING count
1a70: 28 2a 29 3d 31 22 20 7b 0a 20 20 20 20 31 20 63  (*)=1" {.    1 c
1a80: 20 31 20 62 0a 20 20 7d 0a 20 20 31 31 31 32 2e   1 b.  }.  1112.
1a90: 32 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  2  "SELECT DISTI
1aa0: 4e 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  NCT count(*), ma
1ab0: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45  x(a) FROM t1 WHE
1ac0: 52 45 20 30 0a 20 20 20 20 20 20 20 20 20 20 20  RE 0.           
1ad0: 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
1ae0: 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 20  G count(*)=2" { 
1af0: 0a 20 20 7d 0a 0a 20 20 32 31 31 31 2e 31 20 20  .  }..  2111.1  
1b00: 22 53 45 4c 45 43 54 20 41 4c 4c 20 63 6f 75 6e  "SELECT ALL coun
1b10: 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f  t(*), max(a) FRO
1b20: 4d 20 74 31 20 57 48 45 52 45 20 62 3e 27 6f 6e  M t1 WHERE b>'on
1b30: 65 27 20 47 52 4f 55 50 20 42 59 20 62 22 20 0a  e' GROUP BY b" .
1b40: 20 20 20 20 20 20 20 20 20 20 7b 31 20 63 20 31            {1 c 1
1b50: 20 62 7d 0a 20 20 32 31 31 32 2e 31 20 20 22 53   b}.  2112.1  "S
1b60: 45 4c 45 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28  ELECT ALL count(
1b70: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
1b80: 74 31 20 57 48 45 52 45 20 61 21 3d 27 62 27 0a  t1 WHERE a!='b'.
1b90: 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55 50             GROUP
1ba0: 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 6f 75   BY b HAVING cou
1bb0: 6e 74 28 2a 29 3d 31 22 20 7b 0a 20 20 20 20 31  nt(*)=1" {.    1
1bc0: 20 61 20 31 20 63 0a 20 20 7d 0a 20 20 32 31 31   a 1 c.  }.  211
1bd0: 32 2e 32 20 20 22 53 45 4c 45 43 54 20 41 4c 4c  2.2  "SELECT ALL
1be0: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61   count(*), max(a
1bf0: 29 20 46 52 4f 4d 20 74 31 20 0a 20 20 20 20 20  ) FROM t1 .     
1c00: 20 20 20 20 20 20 57 48 45 52 45 20 30 20 47 52        WHERE 0 GR
1c10: 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
1c20: 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 20 7d 0a  count(*)=2" { }.
1c30: 7d 0a 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20  }...# -- syntax 
1c40: 64 69 61 67 72 61 6d 20 72 65 73 75 6c 74 2d 63  diagram result-c
1c50: 6f 6c 75 6d 6e 0a 23 0a 64 6f 5f 73 65 6c 65 63  olumn.#.do_selec
1c60: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
1c70: 2d 30 2e 33 20 7b 0a 20 20 31 20 20 22 53 45 4c  -0.3 {.  1  "SEL
1c80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7b  ECT * FROM t1" {
1c90: 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68  a one b two c th
1ca0: 72 65 65 7d 0a 20 20 32 20 20 22 53 45 4c 45 43  ree}.  2  "SELEC
1cb0: 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 22 20  T t1.* FROM t1" 
1cc0: 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74  {a one b two c t
1cd0: 68 72 65 65 7d 0a 20 20 33 20 20 22 53 45 4c 45  hree}.  3  "SELE
1ce0: 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20 46  CT 'x'||a||'x' F
1cf0: 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62 78  ROM t1" {xax xbx
1d00: 20 78 63 78 7d 0a 20 20 34 20 20 22 53 45 4c 45   xcx}.  4  "SELE
1d10: 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20 61  CT 'x'||a||'x' a
1d20: 6c 69 61 73 20 46 52 4f 4d 20 74 31 22 20 7b 78  lias FROM t1" {x
1d30: 61 78 20 78 62 78 20 78 63 78 7d 0a 20 20 35 20  ax xbx xcx}.  5 
1d40: 20 22 53 45 4c 45 43 54 20 27 78 27 7c 7c 61 7c   "SELECT 'x'||a|
1d50: 7c 27 78 27 20 41 53 20 61 6c 69 61 73 20 46 52  |'x' AS alias FR
1d60: 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62 78 20  OM t1" {xax xbx 
1d70: 78 63 78 7d 0a 7d 0a 0a 23 20 2d 2d 20 73 79 6e  xcx}.}..# -- syn
1d80: 74 61 78 20 64 69 61 67 72 61 6d 20 6a 6f 69 6e  tax diagram join
1d90: 2d 73 6f 75 72 63 65 0a 23 0a 23 20 2d 2d 20 73  -source.#.# -- s
1da0: 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6a 6f  yntax diagram jo
1db0: 69 6e 2d 6f 70 0a 23 0a 64 6f 5f 73 65 6c 65 63  in-op.#.do_selec
1dc0: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
1dd0: 2d 30 2e 34 20 7b 0a 20 20 31 20 20 22 53 45 4c  -0.4 {.  1  "SEL
1de0: 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f  ECT t1.rowid FRO
1df0: 4d 20 74 31 22 20 7b 31 20 32 20 33 7d 0a 20 20  M t1" {1 2 3}.  
1e00: 32 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  2  "SELECT t1.ro
1e10: 77 69 64 20 46 52 4f 4d 20 74 31 2c 74 32 22 20  wid FROM t1,t2" 
1e20: 7b 31 20 31 20 31 20 32 20 32 20 32 20 33 20 33  {1 1 1 2 2 2 3 3
1e30: 20 33 7d 0a 20 20 33 20 20 22 53 45 4c 45 43 54   3}.  3  "SELECT
1e40: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
1e50: 31 2c 74 32 2c 74 33 22 20 7b 31 20 31 20 31 20  1,t2,t3" {1 1 1 
1e60: 31 20 31 20 31 20 32 20 32 20 32 20 32 20 32 20  1 1 1 2 2 2 2 2 
1e70: 32 20 33 20 33 20 33 20 33 20 33 20 33 7d 0a 0a  2 3 3 3 3 3 3}..
1e80: 20 20 34 20 20 22 53 45 4c 45 43 54 20 74 31 2e    4  "SELECT t1.
1e90: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 22 20 7b  rowid FROM t1" {
1ea0: 31 20 32 20 33 7d 0a 20 20 35 20 20 22 53 45 4c  1 2 3}.  5  "SEL
1eb0: 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f  ECT t1.rowid FRO
1ec0: 4d 20 74 31 20 4a 4f 49 4e 20 74 32 22 20 7b 31  M t1 JOIN t2" {1
1ed0: 20 31 20 31 20 32 20 32 20 32 20 33 20 33 20 33   1 1 2 2 2 3 3 3
1ee0: 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 74  }.  6  "SELECT t
1ef0: 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  1.rowid FROM t1 
1f00: 4a 4f 49 4e 20 74 32 20 4a 4f 49 4e 20 74 33 22  JOIN t2 JOIN t3"
1f10: 20 0a 20 20 20 20 20 7b 31 20 31 20 31 20 31 20   .     {1 1 1 1 
1f20: 31 20 31 20 32 20 32 20 32 20 32 20 32 20 32 20  1 1 2 2 2 2 2 2 
1f30: 33 20 33 20 33 20 33 20 33 20 33 7d 0a 0a 20 20  3 3 3 3 3 3}..  
1f40: 37 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  7  "SELECT t1.ro
1f50: 77 69 64 20 46 52 4f 4d 20 74 31 20 4e 41 54 55  wid FROM t1 NATU
1f60: 52 41 4c 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20  RAL JOIN t3" {1 
1f70: 32 7d 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20  2}.  8  "SELECT 
1f80: 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  t1.rowid FROM t1
1f90: 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4f 55   NATURAL LEFT OU
1fa0: 54 45 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20  TER JOIN t3" {1 
1fb0: 32 20 33 7d 0a 20 20 39 20 20 22 53 45 4c 45 43  2 3}.  9  "SELEC
1fc0: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1fd0: 74 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  t1 NATURAL LEFT 
1fe0: 4a 4f 49 4e 20 74 33 22 20 7b 31 20 32 20 33 7d  JOIN t3" {1 2 3}
1ff0: 0a 20 20 31 30 20 22 53 45 4c 45 43 54 20 74 31  .  10 "SELECT t1
2000: 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 4e  .rowid FROM t1 N
2010: 41 54 55 52 41 4c 20 49 4e 4e 45 52 20 4a 4f 49  ATURAL INNER JOI
2020: 4e 20 74 33 22 20 7b 31 20 32 7d 0a 20 20 31 31  N t3" {1 2}.  11
2030: 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69   "SELECT t1.rowi
2040: 64 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41  d FROM t1 NATURA
2050: 4c 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 33 22  L CROSS JOIN t3"
2060: 20 7b 31 20 32 7d 0a 0a 20 20 31 32 20 22 53 45   {1 2}..  12 "SE
2070: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
2080: 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 33 22 20 7b  OM t1 JOIN t3" {
2090: 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20 31  1 1 2 2 3 3}.  1
20a0: 33 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77  3 "SELECT t1.row
20b0: 69 64 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20  id FROM t1 LEFT 
20c0: 4f 55 54 45 52 20 4a 4f 49 4e 20 74 33 22 20 7b  OUTER JOIN t3" {
20d0: 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20 31  1 1 2 2 3 3}.  1
20e0: 34 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77  4 "SELECT t1.row
20f0: 69 64 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20  id FROM t1 LEFT 
2100: 4a 4f 49 4e 20 74 33 22 20 7b 31 20 31 20 32 20  JOIN t3" {1 1 2 
2110: 32 20 33 20 33 7d 0a 20 20 31 35 20 22 53 45 4c  2 3 3}.  15 "SEL
2120: 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f  ECT t1.rowid FRO
2130: 4d 20 74 31 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  M t1 INNER JOIN 
2140: 74 33 22 20 7b 31 20 31 20 32 20 32 20 33 20 33  t3" {1 1 2 2 3 3
2150: 7d 0a 20 20 31 36 20 22 53 45 4c 45 43 54 20 74  }.  16 "SELECT t
2160: 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  1.rowid FROM t1 
2170: 43 52 4f 53 53 20 4a 4f 49 4e 20 74 33 22 20 7b  CROSS JOIN t3" {
2180: 31 20 31 20 32 20 32 20 33 20 33 7d 0a 7d 0a 0a  1 1 2 2 3 3}.}..
2190: 23 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67  # -- syntax diag
21a0: 72 61 6d 20 63 6f 6d 70 6f 75 6e 64 2d 6f 70 65  ram compound-ope
21b0: 72 61 74 6f 72 0a 23 0a 64 6f 5f 73 65 6c 65 63  rator.#.do_selec
21c0: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
21d0: 2d 30 2e 35 20 7b 0a 20 20 31 20 20 22 53 45 4c  -0.5 {.  1  "SEL
21e0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
21f0: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
2200: 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f 4d 20  CT rowid+2 FROM 
2210: 74 34 22 20 7b 31 20 32 20 33 20 33 20 34 7d 0a  t4" {1 2 3 3 4}.
2220: 20 20 32 20 20 22 53 45 4c 45 43 54 20 72 6f 77    2  "SELECT row
2230: 69 64 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e  id FROM t1 UNION
2240: 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69       SELECT rowi
2250: 64 2b 32 20 46 52 4f 4d 20 74 34 22 20 7b 31 20  d+2 FROM t4" {1 
2260: 32 20 33 20 34 7d 0a 20 20 33 20 20 22 53 45 4c  2 3 4}.  3  "SEL
2270: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
2280: 31 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  1 INTERSECT SELE
2290: 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f 4d 20  CT rowid+2 FROM 
22a0: 74 34 22 20 7b 33 7d 0a 20 20 34 20 20 22 53 45  t4" {3}.  4  "SE
22b0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
22c0: 74 31 20 45 58 43 45 50 54 20 20 20 20 53 45 4c  t1 EXCEPT    SEL
22d0: 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f 4d  ECT rowid+2 FROM
22e0: 20 74 34 22 20 7b 31 20 32 7d 0a 7d 0a 0a 23 20   t4" {1 2}.}..# 
22f0: 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  -- syntax diagra
2300: 6d 20 6f 72 64 65 72 69 6e 67 2d 74 65 72 6d 0a  m ordering-term.
2310: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
2320: 73 20 65 5f 73 65 6c 65 63 74 2d 30 2e 36 20 7b  s e_select-0.6 {
2330: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 62 7c  .  1  "SELECT b|
2340: 7c 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  |a FROM t1 ORDER
2350: 20 42 59 20 62 7c 7c 61 22 20 20 20 20 20 20 20   BY b||a"       
2360: 20 20 20 20 20 20 20 20 20 20 20 7b 6f 6e 65 61             {onea
2370: 20 74 68 72 65 65 63 20 74 77 6f 62 7d 0a 20 20   threec twob}.  
2380: 32 20 20 22 53 45 4c 45 43 54 20 62 7c 7c 61 20  2  "SELECT b||a 
2390: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
23a0: 20 28 62 7c 7c 61 29 20 43 4f 4c 4c 41 54 45 20   (b||a) COLLATE 
23b0: 6e 6f 63 61 73 65 22 20 7b 6f 6e 65 61 20 74 68  nocase" {onea th
23c0: 72 65 65 63 20 74 77 6f 62 7d 0a 20 20 33 20 20  reec twob}.  3  
23d0: 22 53 45 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f  "SELECT b||a FRO
23e0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 62  M t1 ORDER BY (b
23f0: 7c 7c 61 29 20 41 53 43 22 20 20 20 20 20 20 20  ||a) ASC"       
2400: 20 20 20 20 20 7b 6f 6e 65 61 20 74 68 72 65 65       {onea three
2410: 63 20 74 77 6f 62 7d 0a 20 20 34 20 20 22 53 45  c twob}.  4  "SE
2420: 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f 4d 20 74  LECT b||a FROM t
2430: 31 20 4f 52 44 45 52 20 42 59 20 28 62 7c 7c 61  1 ORDER BY (b||a
2440: 29 20 44 45 53 43 22 20 20 20 20 20 20 20 20 20  ) DESC"         
2450: 20 20 7b 74 77 6f 62 20 74 68 72 65 65 63 20 6f    {twob threec o
2460: 6e 65 61 7d 0a 7d 0a 0a 23 20 2d 2d 20 73 79 6e  nea}.}..# -- syn
2470: 74 61 78 20 64 69 61 67 72 61 6d 20 73 65 6c 65  tax diagram sele
2480: 63 74 2d 73 74 6d 74 0a 23 0a 64 6f 5f 73 65 6c  ct-stmt.#.do_sel
2490: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
24a0: 63 74 2d 30 2e 37 20 7b 0a 20 20 31 20 20 22 53  ct-0.7 {.  1  "S
24b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
24c0: 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20   {a one b two c 
24d0: 74 68 72 65 65 7d 0a 20 20 32 20 20 22 53 45 4c  three}.  2  "SEL
24e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
24f0: 44 45 52 20 42 59 20 62 22 20 7b 61 20 6f 6e 65  DER BY b" {a one
2500: 20 63 20 74 68 72 65 65 20 62 20 74 77 6f 7d 0a   c three b two}.
2510: 20 20 33 20 20 22 53 45 4c 45 43 54 20 2a 20 46    3  "SELECT * F
2520: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
2530: 62 2c 20 61 22 20 7b 61 20 6f 6e 65 20 63 20 74  b, a" {a one c t
2540: 68 72 65 65 20 62 20 74 77 6f 7d 0a 0a 20 20 34  hree b two}..  4
2550: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
2560: 20 74 31 20 4c 49 4d 49 54 20 31 30 22 20 7b 61   t1 LIMIT 10" {a
2570: 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72   one b two c thr
2580: 65 65 7d 0a 20 20 35 20 20 22 53 45 4c 45 43 54  ee}.  5  "SELECT
2590: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54   * FROM t1 LIMIT
25a0: 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 7b 7d   10 OFFSET 5" {}
25b0: 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 2a 20  .  6  "SELECT * 
25c0: 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 30  FROM t1 LIMIT 10
25d0: 2c 20 35 22 20 7b 7d 0a 0a 20 20 37 20 20 22 53  , 5" {}..  7  "S
25e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
25f0: 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
2600: 20 31 30 22 20 7b 61 20 6f 6e 65 20 62 20 74 77   10" {a one b tw
2610: 6f 20 63 20 74 68 72 65 65 7d 0a 20 20 38 20 20  o c three}.  8  
2620: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2630: 31 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49 4d  1 ORDER BY b LIM
2640: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
2650: 7b 7d 0a 20 20 39 20 20 22 53 45 4c 45 43 54 20  {}.  9  "SELECT 
2660: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
2670: 42 59 20 61 2c 62 20 4c 49 4d 49 54 20 31 30 2c  BY a,b LIMIT 10,
2680: 20 35 22 20 7b 7d 0a 0a 20 20 31 30 20 20 22 53   5" {}..  10  "S
2690: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
26a0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20  UNION SELECT b, 
26b0: 61 20 46 52 4f 4d 20 74 31 22 20 0a 20 20 20 20  a FROM t1" .    
26c0: 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20   {a one b two c 
26d0: 74 68 72 65 65 20 6f 6e 65 20 61 20 74 68 72 65  three one a thre
26e0: 65 20 63 20 74 77 6f 20 62 7d 0a 20 20 31 31 20  e c two b}.  11 
26f0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2700: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
2710: 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44  b, a FROM t1 ORD
2720: 45 52 20 42 59 20 62 22 20 0a 20 20 20 20 20 7b  ER BY b" .     {
2730: 6f 6e 65 20 61 20 74 77 6f 20 62 20 74 68 72 65  one a two b thre
2740: 65 20 63 20 61 20 6f 6e 65 20 63 20 74 68 72 65  e c a one c thre
2750: 65 20 62 20 74 77 6f 7d 0a 20 20 31 32 20 20 22  e b two}.  12  "
2760: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2770: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
2780: 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   a FROM t1 ORDER
2790: 20 42 59 20 62 2c 20 61 22 20 0a 20 20 20 20 20   BY b, a" .     
27a0: 7b 6f 6e 65 20 61 20 74 77 6f 20 62 20 74 68 72  {one a two b thr
27b0: 65 65 20 63 20 61 20 6f 6e 65 20 63 20 74 68 72  ee c a one c thr
27c0: 65 65 20 62 20 74 77 6f 7d 0a 20 20 31 33 20 20  ee b two}.  13  
27d0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
27e0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
27f0: 2c 20 61 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  , a FROM t1 LIMI
2800: 54 20 31 30 22 20 0a 20 20 20 20 20 7b 61 20 6f  T 10" .     {a o
2810: 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72 65 65  ne b two c three
2820: 20 6f 6e 65 20 61 20 74 68 72 65 65 20 63 20 74   one a three c t
2830: 77 6f 20 62 7d 0a 20 20 31 34 20 20 22 53 45 4c  wo b}.  14  "SEL
2840: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
2850: 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20 61 20  ION SELECT b, a 
2860: 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 31 30  FROM t1 LIMIT 10
2870: 20 4f 46 46 53 45 54 20 35 22 20 0a 20 20 20 20   OFFSET 5" .    
2880: 20 7b 74 77 6f 20 62 7d 0a 20 20 31 35 20 20 22   {two b}.  15  "
2890: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
28a0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
28b0: 20 61 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54   a FROM t1 LIMIT
28c0: 20 31 30 2c 20 35 22 20 0a 20 20 20 20 20 7b 7d   10, 5" .     {}
28d0: 0a 20 20 31 36 20 20 22 53 45 4c 45 43 54 20 2a  .  16  "SELECT *
28e0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
28f0: 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
2900: 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  t1 ORDER BY a LI
2910: 4d 49 54 20 31 30 22 20 0a 20 20 20 20 20 7b 61  MIT 10" .     {a
2920: 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72   one b two c thr
2930: 65 65 20 6f 6e 65 20 61 20 74 68 72 65 65 20 63  ee one a three c
2940: 20 74 77 6f 20 62 7d 0a 20 20 31 37 20 20 22 53   two b}.  17  "S
2950: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2960: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20  UNION SELECT b, 
2970: 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  a FROM t1 ORDER 
2980: 42 59 20 62 20 4c 49 4d 49 54 20 31 30 20 4f 46  BY b LIMIT 10 OF
2990: 46 53 45 54 20 35 22 20 0a 20 20 20 20 20 7b 62  FSET 5" .     {b
29a0: 20 74 77 6f 7d 0a 20 20 31 38 20 20 22 53 45 4c   two}.  18  "SEL
29b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
29c0: 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c 20 61 20  ION SELECT b, a 
29d0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
29e0: 20 61 2c 62 20 4c 49 4d 49 54 20 31 30 2c 20 35   a,b LIMIT 10, 5
29f0: 22 20 0a 20 20 20 20 20 7b 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
2a50: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 66  ollowing tests f
2a60: 6f 63 75 73 20 6f 6e 20 46 52 4f 4d 20 63 6c 61  ocus on FROM cla
2a70: 75 73 65 20 28 6a 6f 69 6e 29 20 70 72 6f 63 65  use (join) proce
2a80: 73 73 69 6e 67 2e 0a 23 0a 0a 23 20 45 56 49 44  ssing..#..# EVID
2a90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 30 37 34  ENCE-OF: R-16074
2aa0: 2d 35 34 31 39 36 20 49 66 20 74 68 65 20 46 52  -54196 If the FR
2ab0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6d 69  OM clause is omi
2ac0: 74 74 65 64 20 66 72 6f 6d 20 61 20 73 69 6d 70  tted from a simp
2ad0: 6c 65 0a 23 20 53 45 4c 45 43 54 20 73 74 61 74  le.# SELECT stat
2ae0: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  ement, then the 
2af0: 69 6e 70 75 74 20 64 61 74 61 20 69 73 20 69 6d  input data is im
2b00: 70 6c 69 63 69 74 6c 79 20 61 20 73 69 6e 67 6c  plicitly a singl
2b10: 65 20 72 6f 77 20 7a 65 72 6f 0a 23 20 63 6f 6c  e row zero.# col
2b20: 75 6d 6e 73 20 77 69 64 65 0a 23 0a 64 6f 5f 73  umns wide.#.do_s
2b30: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
2b40: 6c 65 63 74 2d 31 2e 31 20 7b 0a 20 20 31 20 22  lect-1.1 {.  1 "
2b50: 53 45 4c 45 43 54 20 27 61 62 63 27 22 20 20 20  SELECT 'abc'"   
2b60: 20 20 20 20 20 20 20 20 20 7b 61 62 63 7d 0a 20           {abc}. 
2b70: 20 32 20 22 53 45 4c 45 43 54 20 27 61 62 63 27   2 "SELECT 'abc'
2b80: 20 57 48 45 52 45 20 4e 55 4c 4c 22 20 7b 7d 0a   WHERE NULL" {}.
2b90: 20 20 33 20 22 53 45 4c 45 43 54 20 4e 55 4c 4c    3 "SELECT NULL
2ba0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7b  "             {{
2bb0: 7d 7d 0a 20 20 34 20 22 53 45 4c 45 43 54 20 63  }}.  4 "SELECT c
2bc0: 6f 75 6e 74 28 2a 29 22 20 20 20 20 20 20 20 20  ount(*)"        
2bd0: 20 7b 31 7d 0a 20 20 35 20 22 53 45 4c 45 43 54   {1}.  5 "SELECT
2be0: 20 63 6f 75 6e 74 28 2a 29 20 57 48 45 52 45 20   count(*) WHERE 
2bf0: 30 22 20 7b 30 7d 0a 20 20 36 20 22 53 45 4c 45  0" {0}.  6 "SELE
2c00: 43 54 20 63 6f 75 6e 74 28 2a 29 20 57 48 45 52  CT count(*) WHER
2c10: 45 20 31 22 20 7b 31 7d 0a 7d 0a 0a 23 20 45 56  E 1" {1}.}..# EV
2c20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 34  IDENCE-OF: R-454
2c30: 32 34 2d 30 37 33 35 32 20 49 66 20 74 68 65 72  24-07352 If ther
2c40: 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
2c50: 6c 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 71  le table or subq
2c60: 75 65 72 79 0a 23 20 69 6e 20 74 68 65 20 46 52  uery.# in the FR
2c70: 4f 4d 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  OM clause, then 
2c80: 74 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 75  the input data u
2c90: 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  sed by the SELEC
2ca0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 23 20 69 73  T statement.# is
2cb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2cc0: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
2cd0: 2e 0a 23 0a 23 20 20 20 54 68 65 20 72 65 73 75  ..#.#   The resu
2ce0: 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
2cf0: 54 20 71 75 65 72 69 65 73 20 73 75 67 67 65 73  T queries sugges
2d00: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
2d10: 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65  operating on the
2d20: 0a 23 20 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66  .#   contents of
2d30: 20 74 68 65 20 74 61 62 6c 65 20 27 78 78 27 2e   the table 'xx'.
2d40: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
2d50: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 32 2e  st e_select-1.2.
2d60: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
2d70: 4c 45 20 78 78 28 78 2c 20 79 29 3b 0a 20 20 49  LE xx(x, y);.  I
2d80: 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20 56 41  NSERT INTO xx VA
2d90: 4c 55 45 53 28 27 49 69 4a 6c 73 49 50 65 70 4d  LUES('IiJlsIPepM
2da0: 75 41 68 55 27 2c 20 58 27 31 30 42 30 30 42 38  uAhU', X'10B00B8
2db0: 39 37 41 31 35 42 41 41 30 32 45 33 46 39 38 44  97A15BAA02E3F98D
2dc0: 43 45 38 46 32 27 29 3b 0a 20 20 49 4e 53 45 52  CE8F2');.  INSER
2dd0: 54 20 49 4e 54 4f 20 78 78 20 56 41 4c 55 45 53  T INTO xx VALUES
2de0: 28 4e 55 4c 4c 2c 20 2d 31 36 2e 38 37 29 3b 0a  (NULL, -16.87);.
2df0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78    INSERT INTO xx
2e00: 20 56 41 4c 55 45 53 28 2d 31 37 2e 38 39 2c 20   VALUES(-17.89, 
2e10: 27 6c 69 6e 67 75 69 73 74 69 63 61 6c 6c 79 27  'linguistically'
2e20: 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63  );.} {}.do_selec
2e30: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
2e40: 2d 31 2e 32 20 7b 0a 20 20 31 20 20 22 53 45 4c  -1.2 {.  1  "SEL
2e50: 45 43 54 20 71 75 6f 74 65 28 78 29 2c 20 71 75  ECT quote(x), qu
2e60: 6f 74 65 28 79 29 20 46 52 4f 4d 20 78 78 22 20  ote(y) FROM xx" 
2e70: 7b 0a 20 20 20 20 20 27 49 69 4a 6c 73 49 50 65  {.     'IiJlsIPe
2e80: 70 4d 75 41 68 55 27 20 58 27 31 30 42 30 30 42  pMuAhU' X'10B00B
2e90: 38 39 37 41 31 35 42 41 41 30 32 45 33 46 39 38  897A15BAA02E3F98
2ea0: 44 43 45 38 46 32 27 20 0a 20 20 20 20 20 4e 55  DCE8F2' .     NU
2eb0: 4c 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  LL             -
2ec0: 31 36 2e 38 37 20 20 20 20 20 20 20 20 20 20 20  16.87           
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
2ee0: 20 20 20 20 20 2d 31 37 2e 38 39 20 20 20 20 20       -17.89     
2ef0: 20 20 20 20 20 20 27 6c 69 6e 67 75 69 73 74 69        'linguisti
2f00: 63 61 6c 6c 79 27 20 20 20 20 20 20 20 20 20 20  cally'          
2f10: 20 20 20 20 20 20 0a 20 20 7d 0a 0a 20 20 32 20        .  }..  2 
2f20: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
2f30: 29 2c 20 63 6f 75 6e 74 28 78 29 2c 20 63 6f 75  ), count(x), cou
2f40: 6e 74 28 79 29 20 46 52 4f 4d 20 78 78 22 20 7b  nt(y) FROM xx" {
2f50: 33 20 32 20 33 7d 0a 20 20 33 20 20 22 53 45 4c  3 2 3}.  3  "SEL
2f60: 45 43 54 20 73 75 6d 28 78 29 2c 20 73 75 6d 28  ECT sum(x), sum(
2f70: 79 29 20 46 52 4f 4d 20 78 78 22 20 20 20 20 20  y) FROM xx"     
2f80: 20 20 20 20 20 20 20 20 20 20 7b 2d 31 37 2e 38            {-17.8
2f90: 39 20 2d 31 36 2e 38 37 7d 0a 7d 0a 0a 23 20 45  9 -16.87}.}..# E
2fa0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
2fb0: 33 35 35 2d 30 39 38 30 34 20 49 66 20 74 68 65  355-09804 If the
2fc0: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
2fd0: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
2fe0: 71 75 65 72 79 0a 23 20 69 6e 20 46 52 4f 4d 20  query.# in FROM 
2ff0: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
3000: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20  contents of all 
3010: 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 73 75  tables and/or su
3020: 62 71 75 65 72 69 65 73 20 61 72 65 0a 23 20 6a  bqueries are.# j
3030: 6f 69 6e 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  oined into a sin
3040: 67 6c 65 20 64 61 74 61 73 65 74 20 66 6f 72 20  gle dataset for 
3050: 74 68 65 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  the simple SELEC
3060: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 0a 23  T statement to.#
3070: 20 6f 70 65 72 61 74 65 20 6f 6e 2e 0a 23 0a 23   operate on..#.#
3080: 20 20 20 54 68 65 72 65 20 61 72 65 20 6d 6f 72     There are mor
3090: 65 20 64 65 74 61 69 6c 65 64 20 74 65 73 74 73  e detailed tests
30a0: 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
30b0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 68 61  requirements tha
30c0: 74 20 61 64 64 20 0a 23 20 20 20 6d 6f 72 65 20  t add .#   more 
30d0: 64 65 74 61 69 6c 20 74 6f 20 74 68 69 73 20 69  detail to this i
30e0: 64 65 61 2e 20 57 65 20 6a 75 73 74 20 61 64 64  dea. We just add
30f0: 20 61 20 73 69 6e 67 6c 65 20 74 65 73 74 20 74   a single test t
3100: 68 61 74 20 73 68 6f 77 73 20 74 68 61 74 0a 23  hat shows that.#
3110: 20 20 20 64 61 74 61 20 69 73 20 63 6f 6d 69 6e     data is comin
3120: 67 20 66 72 6f 6d 20 65 61 63 68 20 6f 66 20 74  g from each of t
3130: 68 65 20 74 68 72 65 65 20 74 61 62 6c 65 73 20  he three tables 
3140: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 46 52  following the FR
3150: 4f 4d 20 63 6c 61 75 73 65 0a 23 20 20 20 68 65  OM clause.#   he
3160: 72 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  re to show that 
3170: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 76  the statement, v
3180: 61 67 75 65 20 61 73 20 69 74 20 69 73 2c 20 69  ague as it is, i
3190: 73 20 6e 6f 74 20 69 6e 63 6f 72 72 65 63 74 2e  s not incorrect.
31a0: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
31b0: 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 33 20  ts e_select-1.3 
31c0: 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 2a 20  {.  1 "SELECT * 
31d0: 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 22  FROM t1, t2, t3"
31e0: 20 7b 0a 20 20 20 20 20 20 61 20 6f 6e 65 20 61   {.      a one a
31f0: 20 49 20 61 20 31 20 61 20 6f 6e 65 20 61 20 49   I a 1 a one a I
3200: 20 62 20 32 20 61 20 6f 6e 65 20 62 20 49 49 20   b 2 a one b II 
3210: 61 20 31 20 0a 20 20 20 20 20 20 61 20 6f 6e 65  a 1 .      a one
3220: 20 62 20 49 49 20 62 20 32 20 61 20 6f 6e 65 20   b II b 2 a one 
3230: 63 20 49 49 49 20 61 20 31 20 61 20 6f 6e 65 20  c III a 1 a one 
3240: 63 20 49 49 49 20 62 20 32 20 0a 20 20 20 20 20  c III b 2 .     
3250: 20 62 20 74 77 6f 20 61 20 49 20 61 20 31 20 62   b two a I a 1 b
3260: 20 74 77 6f 20 61 20 49 20 62 20 32 20 62 20 74   two a I b 2 b t
3270: 77 6f 20 62 20 49 49 20 61 20 31 20 0a 20 20 20  wo b II a 1 .   
3280: 20 20 20 62 20 74 77 6f 20 62 20 49 49 20 62 20     b two b II b 
3290: 32 20 62 20 74 77 6f 20 63 20 49 49 49 20 61 20  2 b two c III a 
32a0: 31 20 62 20 74 77 6f 20 63 20 49 49 49 20 62 20  1 b two c III b 
32b0: 32 20 0a 20 20 20 20 20 20 63 20 74 68 72 65 65  2 .      c three
32c0: 20 61 20 49 20 61 20 31 20 63 20 74 68 72 65 65   a I a 1 c three
32d0: 20 61 20 49 20 62 20 32 20 63 20 74 68 72 65 65   a I b 2 c three
32e0: 20 62 20 49 49 20 61 20 31 20 0a 20 20 20 20 20   b II a 1 .     
32f0: 20 63 20 74 68 72 65 65 20 62 20 49 49 20 62 20   c three b II b 
3300: 32 20 63 20 74 68 72 65 65 20 63 20 49 49 49 20  2 c three c III 
3310: 61 20 31 20 63 20 74 68 72 65 65 20 63 20 49 49  a 1 c three c II
3320: 49 20 62 20 32 0a 20 20 7d 0a 7d 0a 0a 23 0a 23  I b 2.  }.}..#.#
3330: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3340: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
3350: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 2a 20 2d  e_select-1.4.* -
3360: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20 64   test that the d
3370: 65 73 63 72 69 70 74 69 6f 6e 0a 23 20 6f 66 20  escription.# of 
3380: 63 61 72 74 65 73 69 61 6e 20 6a 6f 69 6e 73 20  cartesian joins 
3390: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 64 6f  in the SELECT do
33a0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 63  cumentation is c
33b0: 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 53  onsistent with S
33c0: 51 4c 69 74 65 2e 0a 23 20 49 6e 20 64 6f 69 6e  QLite..# In doin
33d0: 67 20 73 6f 2c 20 77 65 20 74 65 73 74 20 74 68  g so, we test th
33e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
33f0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 61  e requirements a
3400: 73 20 61 20 73 69 64 65 2d 65 66 66 65 63 74 3a  s a side-effect:
3410: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3420: 3a 20 52 2d 34 39 38 37 32 2d 30 33 31 39 32 20  : R-49872-03192 
3430: 49 66 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 65 72  If the join-oper
3440: 61 74 6f 72 20 69 73 20 22 43 52 4f 53 53 20 4a  ator is "CROSS J
3450: 4f 49 4e 22 2c 0a 23 20 22 49 4e 4e 45 52 20 4a  OIN",.# "INNER J
3460: 4f 49 4e 22 2c 20 22 4a 4f 49 4e 22 20 6f 72 20  OIN", "JOIN" or 
3470: 61 20 63 6f 6d 6d 61 20 28 22 2c 22 29 20 61 6e  a comma (",") an
3480: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 4e  d there is no ON
3490: 20 6f 72 20 55 53 49 4e 47 0a 23 20 63 6c 61 75   or USING.# clau
34a0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  se, then the res
34b0: 75 6c 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ult of the join 
34c0: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 63 61  is simply the ca
34d0: 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74 20  rtesian product 
34e0: 6f 66 0a 23 20 74 68 65 20 6c 65 66 74 20 61 6e  of.# the left an
34f0: 64 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61 74  d right-hand dat
3500: 61 73 65 74 73 2e 0a 23 0a 23 20 20 20 20 54 68  asets..#.#    Th
3510: 65 20 74 65 73 74 73 20 61 72 65 20 62 75 69 6c  e tests are buil
3520: 74 20 6f 6e 20 74 68 69 73 20 61 73 73 65 72 74  t on this assert
3530: 69 6f 6e 2e 20 52 65 61 6c 6c 79 2c 20 74 68 65  ion. Really, the
3540: 79 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  y test that the 
3550: 6f 75 74 70 75 74 0a 23 20 20 20 20 6f 66 20 61  output.#    of a
3560: 20 43 52 4f 53 53 20 4a 4f 49 4e 2c 20 4a 4f 49   CROSS JOIN, JOI
3570: 4e 2c 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 6f 72  N, INNER JOIN or
3580: 20 22 2c 22 20 6a 6f 69 6e 20 6d 61 74 63 68 65   "," join matche
3590: 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  s the expected r
35a0: 65 73 75 6c 74 0a 23 20 20 20 20 6f 66 20 63 61  esult.#    of ca
35b0: 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63 61  lculating the ca
35c0: 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74 20  rtesian product 
35d0: 6f 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  of the left and 
35e0: 72 69 67 68 74 2d 68 61 6e 64 20 64 61 74 61 73  right-hand datas
35f0: 65 74 73 2e 20 0a 23 0a 23 20 45 56 49 44 45 4e  ets. .#.# EVIDEN
3600: 43 45 2d 4f 46 3a 20 52 2d 34 36 32 35 36 2d 35  CE-OF: R-46256-5
3610: 37 32 34 33 20 54 68 65 72 65 20 69 73 20 6e 6f  7243 There is no
3620: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
3630: 65 65 6e 20 74 68 65 20 22 49 4e 4e 45 52 0a 23  een the "INNER.#
3640: 20 4a 4f 49 4e 22 2c 20 22 4a 4f 49 4e 22 20 61   JOIN", "JOIN" a
3650: 6e 64 20 22 2c 22 20 6a 6f 69 6e 20 6f 70 65 72  nd "," join oper
3660: 61 74 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45  ators..#.# EVIDE
3670: 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 37 31 2d  NCE-OF: R-25071-
3680: 32 31 32 30 32 20 54 68 65 20 22 43 52 4f 53 53  21202 The "CROSS
3690: 20 4a 4f 49 4e 22 20 6a 6f 69 6e 20 6f 70 65 72   JOIN" join oper
36a0: 61 74 6f 72 20 70 72 6f 64 75 63 65 73 20 74 68  ator produces th
36b0: 65 0a 23 20 73 61 6d 65 20 72 65 73 75 6c 74 20  e.# same result 
36c0: 61 73 20 74 68 65 20 22 49 4e 4e 45 52 20 4a 4f  as the "INNER JO
36d0: 49 4e 22 2c 20 22 4a 4f 49 4e 22 20 61 6e 64 20  IN", "JOIN" and 
36e0: 22 2c 22 20 6f 70 65 72 61 74 6f 72 73 0a 23 0a  "," operators.#.
36f0: 23 20 20 20 20 41 6c 6c 20 74 65 73 74 73 20 61  #    All tests a
3700: 72 65 20 72 75 6e 20 34 20 74 69 6d 65 73 2c 20  re run 4 times, 
3710: 77 69 74 68 20 74 68 65 20 6f 6e 6c 79 20 64 69  with the only di
3720: 66 66 65 72 65 6e 63 65 20 69 6e 20 65 61 63 68  fference in each
3730: 20 72 75 6e 20 62 65 69 6e 67 0a 23 20 20 20 20   run being.#    
3740: 77 68 69 63 68 20 6f 66 20 74 68 65 20 34 20 65  which of the 4 e
3750: 71 75 69 76 61 6c 65 6e 74 20 63 61 72 74 65 73  quivalent cartes
3760: 69 61 6e 20 70 72 6f 64 75 63 74 20 6a 6f 69 6e  ian product join
3770: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 75   operators are u
3780: 73 65 64 2e 0a 23 20 20 20 20 53 69 6e 63 65 20  sed..#    Since 
3790: 74 68 65 20 6f 75 74 70 75 74 20 64 61 74 61 20  the output data 
37a0: 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 61  is the same in a
37b0: 6c 6c 20 63 61 73 65 73 2c 20 77 65 20 63 6f 6e  ll cases, we con
37c0: 73 69 64 65 72 20 74 68 61 74 20 74 68 69 73 0a  sider that this.
37d0: 23 20 20 20 20 71 75 61 6c 69 66 69 65 73 20 61  #    qualifies a
37e0: 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 74 77  s testing the tw
37f0: 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f  o statements abo
3800: 76 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ve..#.do_execsql
3810: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3820: 2e 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .4.0 {.  CREATE 
3830: 54 41 42 4c 45 20 78 31 28 61 2c 20 62 29 3b 0a  TABLE x1(a, b);.
3840: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
3850: 32 28 63 2c 20 64 2c 20 65 29 3b 0a 20 20 43 52  2(c, d, e);.  CR
3860: 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 66 2c  EATE TABLE x3(f,
3870: 20 67 2c 20 68 2c 20 69 29 3b 0a 0a 20 20 2d 2d   g, h, i);..  --
3880: 20 78 31 3a 20 33 20 72 6f 77 73 2c 20 32 20 63   x1: 3 rows, 2 c
3890: 6f 6c 75 6d 6e 73 0a 20 20 49 4e 53 45 52 54 20  olumns.  INSERT 
38a0: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 32  INTO x1 VALUES(2
38b0: 34 2c 20 27 63 6f 6e 76 65 72 67 69 6e 67 27 29  4, 'converging')
38c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
38d0: 78 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  x1 VALUES(NULL, 
38e0: 58 27 43 42 37 31 27 29 3b 0a 20 20 49 4e 53 45  X'CB71');.  INSE
38f0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
3900: 53 28 27 62 6c 6f 6e 64 73 27 2c 20 27 70 72 6f  S('blonds', 'pro
3910: 70 72 69 65 74 61 72 79 27 29 3b 0a 0a 20 20 2d  prietary');..  -
3920: 2d 20 78 32 3a 20 32 20 72 6f 77 73 2c 20 33 20  - x2: 2 rows, 3 
3930: 63 6f 6c 75 6d 6e 73 0a 20 20 49 4e 53 45 52 54  columns.  INSERT
3940: 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28   INTO x2 VALUES(
3950: 2d 36 30 2e 30 36 2c 20 4e 55 4c 4c 2c 20 4e 55  -60.06, NULL, NU
3960: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  LL);.  INSERT IN
3970: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 2d 35 38  TO x2 VALUES(-58
3980: 2c 20 4e 55 4c 4c 2c 20 31 2e 32 31 29 3b 0a 0a  , NULL, 1.21);..
3990: 20 20 2d 2d 20 78 33 3a 20 35 20 72 6f 77 73 2c    -- x3: 5 rows,
39a0: 20 34 20 63 6f 6c 75 6d 6e 73 0a 20 20 49 4e 53   4 columns.  INS
39b0: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
39c0: 45 53 28 2d 33 39 2e 32 34 2c 20 4e 55 4c 4c 2c  ES(-39.24, NULL,
39d0: 20 27 65 6e 63 6f 6d 70 61 73 73 27 2c 20 2d 31   'encompass', -1
39e0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
39f0: 20 78 33 20 56 41 4c 55 45 53 28 27 70 72 65 73   x3 VALUES('pres
3a00: 65 6e 74 69 6e 67 27 2c 20 35 31 2c 20 27 72 65  enting', 51, 're
3a10: 66 6f 72 6d 61 74 69 6f 6e 27 2c 20 27 64 69 67  formation', 'dig
3a20: 6e 69 66 69 65 64 27 29 3b 0a 20 20 49 4e 53 45  nified');.  INSE
3a30: 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55 45  RT INTO x3 VALUE
3a40: 53 28 27 63 6f 6e 64 75 63 74 69 6e 67 27 2c 20  S('conducting', 
3a50: 2d 38 37 2e 32 34 2c 20 33 37 2e 35 36 2c 20 4e  -87.24, 37.56, N
3a60: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
3a70: 4e 54 4f 20 78 33 20 56 41 4c 55 45 53 28 27 63  NTO x3 VALUES('c
3a80: 6f 6c 64 65 73 74 27 2c 20 2d 39 36 2c 20 27 64  oldest', -96, 'd
3a90: 72 61 6d 61 74 69 73 74 73 27 2c 20 38 32 2e 33  ramatists', 82.3
3aa0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3ab0: 20 78 33 20 56 41 4c 55 45 53 28 27 61 6c 65 72   x3 VALUES('aler
3ac0: 74 69 6e 67 27 2c 20 4e 55 4c 4c 2c 20 2d 39 33  ting', NULL, -93
3ad0: 2e 37 39 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 7d  .79, NULL);.} {}
3ae0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
3af0: 20 52 2d 35 39 30 38 39 2d 32 35 38 32 38 20 54   R-59089-25828 T
3b00: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
3b10: 65 20 63 61 72 74 65 73 69 61 6e 20 70 72 6f 64  e cartesian prod
3b20: 75 63 74 0a 23 20 64 61 74 61 73 65 74 20 61 72  uct.# dataset ar
3b30: 65 2c 20 69 6e 20 6f 72 64 65 72 2c 20 61 6c 6c  e, in order, all
3b40: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
3b50: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 64 61  the left-hand da
3b60: 74 61 73 65 74 0a 23 20 66 6f 6c 6c 6f 77 65 64  taset.# followed
3b70: 20 62 79 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75   by all the colu
3b80: 6d 6e 73 20 6f 66 20 74 68 65 20 72 69 67 68 74  mns of the right
3b90: 2d 68 61 6e 64 20 64 61 74 61 73 65 74 2e 0a 23  -hand dataset..#
3ba0: 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f  .do_join_test e_
3bb0: 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 31 20 7b  select-1.4.1.1 {
3bc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3bd0: 20 78 31 20 25 4a 4f 49 4e 25 20 78 32 20 4c 49   x1 %JOIN% x2 LI
3be0: 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74 20  MIT 1.} [concat 
3bf0: 7b 32 34 20 63 6f 6e 76 65 72 67 69 6e 67 7d 20  {24 converging} 
3c00: 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 5d 0a  {-60.06 {} {}}].
3c10: 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f  .do_join_test e_
3c20: 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 32 20 7b  select-1.4.1.2 {
3c30: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3c40: 20 78 32 20 25 4a 4f 49 4e 25 20 78 31 20 4c 49   x2 %JOIN% x1 LI
3c50: 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74 20  MIT 1.} [concat 
3c60: 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 20 7b  {-60.06 {} {}} {
3c70: 32 34 20 63 6f 6e 76 65 72 67 69 6e 67 7d 5d 0a  24 converging}].
3c80: 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f  .do_join_test e_
3c90: 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 33 20 7b  select-1.4.1.3 {
3ca0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3cb0: 20 78 33 20 25 4a 4f 49 4e 25 20 78 32 20 4c 49   x3 %JOIN% x2 LI
3cc0: 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74 20  MIT 1.} [concat 
3cd0: 7b 2d 33 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d  {-39.24 {} encom
3ce0: 70 61 73 73 20 2d 31 7d 20 7b 2d 36 30 2e 30 36  pass -1} {-60.06
3cf0: 20 7b 7d 20 7b 7d 7d 5d 0a 0a 64 6f 5f 6a 6f 69   {} {}}]..do_joi
3d00: 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  n_test e_select-
3d10: 31 2e 34 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45  1.4.1.4 {.  SELE
3d20: 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 25 4a 4f  CT * FROM x2 %JO
3d30: 49 4e 25 20 78 33 20 4c 49 4d 49 54 20 31 0a 7d  IN% x3 LIMIT 1.}
3d40: 20 5b 63 6f 6e 63 61 74 20 7b 2d 36 30 2e 30 36   [concat {-60.06
3d50: 20 7b 7d 20 7b 7d 7d 20 7b 2d 33 39 2e 32 34 20   {} {}} {-39.24 
3d60: 7b 7d 20 65 6e 63 6f 6d 70 61 73 73 20 2d 31 7d  {} encompass -1}
3d70: 5d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  ]..# EVIDENCE-OF
3d80: 3a 20 52 2d 34 34 34 31 34 2d 35 34 37 31 30 20  : R-44414-54710 
3d90: 54 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 69  There is a row i
3da0: 6e 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20  n the cartesian 
3db0: 70 72 6f 64 75 63 74 0a 23 20 64 61 74 61 73 65  product.# datase
3dc0: 74 20 66 6f 72 6d 65 64 20 62 79 20 63 6f 6d 62  t formed by comb
3dd0: 69 6e 69 6e 67 20 65 61 63 68 20 75 6e 69 71 75  ining each uniqu
3de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
3df0: 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 0a   a row from the.
3e00: 23 20 6c 65 66 74 2d 68 61 6e 64 20 61 6e 64 20  # left-hand and 
3e10: 72 69 67 68 74 2d 68 61 6e 64 20 64 61 74 61 73  right-hand datas
3e20: 65 74 73 2e 0a 23 0a 64 6f 5f 6a 6f 69 6e 5f 74  ets..#.do_join_t
3e30: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  est e_select-1.4
3e40: 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.1 {.  SELECT 
3e50: 2a 20 46 52 4f 4d 20 78 32 20 25 4a 4f 49 4e 25  * FROM x2 %JOIN%
3e60: 20 78 33 20 4f 52 44 45 52 20 42 59 20 2b 63 2c   x3 ORDER BY +c,
3e70: 20 2b 66 0a 7d 20 5b 6c 69 73 74 20 2d 36 30 2e   +f.} [list -60.
3e80: 30 36 20 7b 7d 20 7b 7d 20 20 20 20 20 20 2d 33  06 {} {}      -3
3e90: 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d 70 61 73  9.24 {} encompas
3ea0: 73 20 2d 31 20 20 20 20 20 20 20 20 20 20 20 20  s -1            
3eb0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d       \.        -
3ec0: 36 30 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20 20  60.06 {} {}     
3ed0: 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39 33   alerting {} -93
3ee0: 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .79 {}          
3ef0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
3f00: 20 20 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 20 20    -60.06 {} {}  
3f10: 20 20 20 20 63 6f 6c 64 65 73 74 20 2d 39 36 20      coldest -96 
3f20: 64 72 61 6d 61 74 69 73 74 73 20 38 32 2e 33 20  dramatists 82.3 
3f30: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
3f40: 20 20 20 20 20 2d 36 30 2e 30 36 20 7b 7d 20 7b       -60.06 {} {
3f50: 7d 20 20 20 20 20 20 63 6f 6e 64 75 63 74 69 6e  }      conductin
3f60: 67 20 2d 38 37 2e 32 34 20 33 37 2e 35 36 20 7b  g -87.24 37.56 {
3f70: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  }             \.
3f80: 20 20 20 20 20 20 20 20 2d 36 30 2e 30 36 20 7b          -60.06 {
3f90: 7d 20 7b 7d 20 20 20 20 20 20 70 72 65 73 65 6e  } {}      presen
3fa0: 74 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74  ting 51 reformat
3fb0: 69 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20  ion dignified   
3fc0: 20 5c 0a 20 20 20 20 20 20 20 20 2d 35 38 20 7b   \.        -58 {
3fd0: 7d 20 31 2e 32 31 20 20 20 20 20 20 20 2d 33 39  } 1.21       -39
3fe0: 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d 70 61 73 73  .24 {} encompass
3ff0: 20 2d 31 20 20 20 20 20 20 20 20 20 20 20 20 20   -1             
4000: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 35      \.        -5
4010: 38 20 7b 7d 20 31 2e 32 31 20 20 20 20 20 20 20  8 {} 1.21       
4020: 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39 33 2e  alerting {} -93.
4030: 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20  79 {}           
4040: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20         \.       
4050: 20 2d 35 38 20 7b 7d 20 31 2e 32 31 20 20 20 20   -58 {} 1.21    
4060: 20 20 20 63 6f 6c 64 65 73 74 20 2d 39 36 20 64     coldest -96 d
4070: 72 61 6d 61 74 69 73 74 73 20 38 32 2e 33 20 20  ramatists 82.3  
4080: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
4090: 20 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32 31 20      -58 {} 1.21 
40a0: 20 20 20 20 20 20 63 6f 6e 64 75 63 74 69 6e 67        conducting
40b0: 20 2d 38 37 2e 32 34 20 33 37 2e 35 36 20 7b 7d   -87.24 37.56 {}
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
40d0: 20 20 20 20 20 20 20 2d 35 38 20 7b 7d 20 31 2e         -58 {} 1.
40e0: 32 31 20 20 20 20 20 20 20 70 72 65 73 65 6e 74  21       present
40f0: 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74 69  ing 51 reformati
4100: 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20 20  on dignified    
4110: 5c 0a 5d 0a 23 20 54 4f 44 4f 3a 20 43 6f 6d 65  \.].# TODO: Come
4120: 20 62 61 63 6b 20 61 6e 64 20 61 64 64 20 61 20   back and add a 
4130: 66 65 77 20 6d 6f 72 65 20 6c 69 6b 65 20 74 68  few more like th
4140: 65 20 61 62 6f 76 65 2e 0a 0a 23 20 45 56 49 44  e above...# EVID
4150: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 34 33 39  ENCE-OF: R-18439
4160: 2d 33 38 35 34 38 20 49 6e 20 6f 74 68 65 72 20  -38548 In other 
4170: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 6c 65  words, if the le
4180: 66 74 2d 68 61 6e 64 20 64 61 74 61 73 65 74 0a  ft-hand dataset.
4190: 23 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 4e 6c  # consists of Nl
41a0: 65 66 74 20 72 6f 77 73 20 6f 66 20 4d 6c 65 66  eft rows of Mlef
41b0: 74 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64 20 74  t columns, and t
41c0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61  he right-hand da
41d0: 74 61 73 65 74 20 6f 66 0a 23 20 4e 72 69 67 68  taset of.# Nrigh
41e0: 74 20 72 6f 77 73 20 6f 66 20 4d 72 69 67 68 74  t rows of Mright
41f0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
4200: 68 65 20 63 61 72 74 65 73 69 61 6e 20 70 72 6f  he cartesian pro
4210: 64 75 63 74 20 69 73 20 61 20 64 61 74 61 73 65  duct is a datase
4220: 74 0a 23 20 6f 66 20 4e 6c 65 66 74 26 74 69 6d  t.# of Nleft&tim
4230: 65 73 3b 4e 72 69 67 68 74 20 72 6f 77 73 2c 20  es;Nright rows, 
4240: 65 61 63 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  each containing 
4250: 4d 6c 65 66 74 2b 4d 72 69 67 68 74 20 63 6f 6c  Mleft+Mright col
4260: 75 6d 6e 73 2e 0a 23 0a 23 20 78 31 2c 20 78 32  umns..#.# x1, x2
4270: 20 20 20 20 28 4e 6c 68 73 3d 33 2c 20 4e 72 68      (Nlhs=3, Nrh
4280: 73 3d 32 29 20 20 20 28 4d 6c 68 73 3d 32 2c 20  s=2)   (Mlhs=2, 
4290: 4d 72 68 73 3d 33 29 0a 64 6f 5f 6a 6f 69 6e 5f  Mrhs=3).do_join_
42a0: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e  test e_select-1.
42b0: 34 2e 33 2e 31 20 7b 20 0a 20 20 53 45 4c 45 43  4.3.1 { .  SELEC
42c0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
42d0: 78 31 20 25 4a 4f 49 4e 25 20 78 32 20 0a 7d 20  x1 %JOIN% x2 .} 
42e0: 5b 65 78 70 72 20 33 2a 32 5d 0a 64 6f 5f 74 65  [expr 3*2].do_te
42f0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e  st e_select-1.4.
4300: 33 2e 32 20 7b 20 0a 20 20 65 78 70 72 20 7b 5b  3.2 { .  expr {[
4310: 6c 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71 6c  llength [execsql
4320: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
4330: 78 31 2c 20 78 32 7d 5d 5d 20 2f 20 36 7d 0a 7d  x1, x2}]] / 6}.}
4340: 20 5b 65 78 70 72 20 32 2b 33 5d 0a 0a 23 20 78   [expr 2+3]..# x
4350: 32 2c 20 78 33 20 20 20 20 28 4e 6c 68 73 3d 32  2, x3    (Nlhs=2
4360: 2c 20 4e 72 68 73 3d 35 29 20 20 20 28 4d 6c 68  , Nrhs=5)   (Mlh
4370: 73 3d 33 2c 20 4d 72 68 73 3d 34 29 0a 64 6f 5f  s=3, Mrhs=4).do_
4380: 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65  join_test e_sele
4390: 63 74 2d 31 2e 34 2e 33 2e 33 20 7b 20 0a 20 20  ct-1.4.3.3 { .  
43a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
43b0: 46 52 4f 4d 20 78 32 20 25 4a 4f 49 4e 25 20 78  FROM x2 %JOIN% x
43c0: 33 20 0a 7d 20 5b 65 78 70 72 20 32 2a 35 5d 0a  3 .} [expr 2*5].
43d0: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
43e0: 2d 31 2e 34 2e 33 2e 34 20 7b 20 0a 20 20 65 78  -1.4.3.4 { .  ex
43f0: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65 78  pr {[llength [ex
4400: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
4410: 46 52 4f 4d 20 78 32 20 4a 4f 49 4e 20 78 33 7d  FROM x2 JOIN x3}
4420: 5d 5d 20 2f 20 31 30 7d 0a 7d 20 5b 65 78 70 72  ]] / 10}.} [expr
4430: 20 33 2b 34 5d 0a 0a 23 20 78 33 2c 20 78 31 20   3+4]..# x3, x1 
4440: 20 20 20 28 4e 6c 68 73 3d 35 2c 20 4e 72 68 73     (Nlhs=5, Nrhs
4450: 3d 33 29 20 20 20 28 4d 6c 68 73 3d 34 2c 20 4d  =3)   (Mlhs=4, M
4460: 72 68 73 3d 32 29 0a 64 6f 5f 6a 6f 69 6e 5f 74  rhs=2).do_join_t
4470: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  est e_select-1.4
4480: 2e 33 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54  .3.5 { .  SELECT
4490: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78   count(*) FROM x
44a0: 33 20 25 4a 4f 49 4e 25 20 78 31 20 0a 7d 20 5b  3 %JOIN% x1 .} [
44b0: 65 78 70 72 20 35 2a 33 5d 0a 64 6f 5f 74 65 73  expr 5*3].do_tes
44c0: 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 33  t e_select-1.4.3
44d0: 2e 36 20 7b 20 0a 20 20 65 78 70 72 20 7b 5b 6c  .6 { .  expr {[l
44e0: 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71 6c 20  length [execsql 
44f0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78  {SELECT * FROM x
4500: 33 20 43 52 4f 53 53 20 4a 4f 49 4e 20 78 31 7d  3 CROSS JOIN x1}
4510: 5d 5d 20 2f 20 31 35 7d 0a 7d 20 5b 65 78 70 72  ]] / 15}.} [expr
4520: 20 34 2b 32 5d 0a 0a 23 20 78 33 2c 20 78 33 20   4+2]..# x3, x3 
4530: 20 20 20 28 4e 6c 68 73 3d 35 2c 20 4e 72 68 73     (Nlhs=5, Nrhs
4540: 3d 35 29 20 20 20 28 4d 6c 68 73 3d 34 2c 20 4d  =5)   (Mlhs=4, M
4550: 72 68 73 3d 34 29 0a 64 6f 5f 6a 6f 69 6e 5f 74  rhs=4).do_join_t
4560: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  est e_select-1.4
4570: 2e 33 2e 37 20 7b 20 0a 20 20 53 45 4c 45 43 54  .3.7 { .  SELECT
4580: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78   count(*) FROM x
4590: 33 20 25 4a 4f 49 4e 25 20 78 33 20 0a 7d 20 5b  3 %JOIN% x3 .} [
45a0: 65 78 70 72 20 35 2a 35 5d 0a 64 6f 5f 74 65 73  expr 5*5].do_tes
45b0: 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 33  t e_select-1.4.3
45c0: 2e 38 20 7b 20 0a 20 20 65 78 70 72 20 7b 5b 6c  .8 { .  expr {[l
45d0: 6c 65 6e 67 74 68 20 5b 65 78 65 63 73 71 6c 20  length [execsql 
45e0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78  {SELECT * FROM x
45f0: 33 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 78 33 20  3 INNER JOIN x3 
4600: 41 53 20 78 34 7d 5d 5d 20 2f 20 32 35 7d 0a 7d  AS x4}]] / 25}.}
4610: 20 5b 65 78 70 72 20 34 2b 34 5d 0a 0a 23 20 53   [expr 4+4]..# S
4620: 6f 6d 65 20 65 78 74 72 61 20 63 61 72 74 65 73  ome extra cartes
4630: 69 61 6e 20 70 72 6f 64 75 63 74 20 74 65 73 74  ian product test
4640: 73 20 75 73 69 6e 67 20 74 61 62 6c 65 73 20 74  s using tables t
4650: 31 20 61 6e 64 20 74 32 2e 0a 23 0a 64 6f 5f 65  1 and t2..#.do_e
4660: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
4670: 6c 65 63 74 2d 31 2e 34 2e 34 2e 31 20 7b 20 53  lect-1.4.4.1 { S
4680: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
4690: 20 74 32 20 7d 20 24 74 31 5f 63 72 6f 73 73 5f   t2 } $t1_cross_
46a0: 74 32 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t2.do_execsql_te
46b0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e  st e_select-1.4.
46c0: 34 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  4.2 { SELECT * F
46d0: 52 4f 4d 20 74 31 20 41 53 20 78 2c 20 74 31 20  ROM t1 AS x, t1 
46e0: 41 53 20 79 7d 20 24 74 31 5f 63 72 6f 73 73 5f  AS y} $t1_cross_
46f0: 74 31 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  t1..do_select_te
4700: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34  sts e_select-1.4
4710: 2e 35 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  .5 [list        
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
4740: 20 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52   1 { SELECT * FR
4750: 4f 4d 20 74 31 20 43 52 4f 53 53 20 4a 4f 49 4e  OM t1 CROSS JOIN
4760: 20 74 32 20 7d 20 20 20 20 20 20 20 20 20 20 20   t2 }           
4770: 24 74 31 5f 63 72 6f 73 73 5f 74 32 20 20 20 20  $t1_cross_t2    
4780: 20 20 20 20 5c 0a 20 20 20 20 32 20 7b 20 53 45      \.    2 { SE
4790: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 41  LECT * FROM t1 A
47a0: 53 20 79 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74  S y CROSS JOIN t
47b0: 31 20 41 53 20 78 20 7d 20 24 74 31 5f 63 72 6f  1 AS x } $t1_cro
47c0: 73 73 5f 74 31 20 20 20 20 20 20 20 20 5c 0a 20  ss_t1        \. 
47d0: 20 20 20 33 20 7b 20 53 45 4c 45 43 54 20 2a 20     3 { SELECT * 
47e0: 46 52 4f 4d 20 74 31 20 49 4e 4e 45 52 20 4a 4f  FROM t1 INNER JO
47f0: 49 4e 20 74 32 20 7d 20 20 20 20 20 20 20 20 20  IN t2 }         
4800: 20 20 24 74 31 5f 63 72 6f 73 73 5f 74 32 20 20    $t1_cross_t2  
4810: 20 20 20 20 20 20 5c 0a 20 20 20 20 34 20 7b 20        \.    4 { 
4820: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4830: 20 41 53 20 79 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS y INNER JOIN
4840: 20 74 31 20 41 53 20 78 20 7d 20 24 74 31 5f 63   t1 AS x } $t1_c
4850: 72 6f 73 73 5f 74 31 20 20 20 20 20 20 20 20 5c  ross_t1        \
4860: 0a 5d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .]..# EVIDENCE-O
4870: 46 3a 20 52 2d 33 38 34 36 35 2d 30 33 36 31 36  F: R-38465-03616
4880: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
4890: 4f 4e 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  ON clause then t
48a0: 68 65 20 4f 4e 0a 23 20 65 78 70 72 65 73 73 69  he ON.# expressi
48b0: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
48c0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
48d0: 74 68 65 20 63 61 72 74 65 73 69 61 6e 20 70 72  the cartesian pr
48e0: 6f 64 75 63 74 20 61 73 20 61 0a 23 20 62 6f 6f  oduct as a.# boo
48f0: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  lean expression.
4900: 20 4f 6e 6c 79 20 72 6f 77 73 20 66 6f 72 20 77   Only rows for w
4910: 68 69 63 68 20 74 68 65 20 65 78 70 72 65 73 73  hich the express
4920: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
4930: 0a 23 20 74 72 75 65 20 61 72 65 20 69 6e 63 6c  .# true are incl
4940: 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  uded from the da
4950: 74 61 73 65 74 2e 0a 23 0a 66 6f 72 65 61 63 68  taset..#.foreach
4960: 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65 73 7d   {tn select res}
4970: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 5c 0a 20 20 20 20 31 20 7b 20 53 45      \.    1 { SE
49b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25  LECT * FROM t1 %
49c0: 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 31 29 20  JOIN% t2 ON (1) 
49d0: 7d 20 20 20 20 20 20 20 24 74 31 5f 63 72 6f 73  }       $t1_cros
49e0: 73 5f 74 32 20 20 20 20 20 20 20 20 20 20 20 20  s_t2            
49f0: 20 5c 0a 20 20 20 20 32 20 7b 20 53 45 4c 45 43   \.    2 { SELEC
4a00: 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49  T * FROM t1 %JOI
4a10: 4e 25 20 74 32 20 4f 4e 20 28 30 29 20 7d 20 20  N% t2 ON (0) }  
4a20: 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20       [list]     
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4a40: 20 20 20 20 33 20 7b 20 53 45 4c 45 43 54 20 2a      3 { SELECT *
4a50: 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20   FROM t1 %JOIN% 
4a60: 74 32 20 4f 4e 20 28 4e 55 4c 4c 29 20 7d 20 20  t2 ON (NULL) }  
4a70: 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20 20 20    [list]        
4a80: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
4a90: 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52   4 { SELECT * FR
4aa0: 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20  OM t1 %JOIN% t2 
4ab0: 4f 4e 20 28 27 61 62 63 27 29 20 7d 20 20 20 5b  ON ('abc') }   [
4ac0: 6c 69 73 74 5d 20 20 20 20 20 20 20 20 20 20 20  list]           
4ad0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 35 20          \.    5 
4ae0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4af0: 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20  t1 %JOIN% t2 ON 
4b00: 28 27 31 61 62 27 29 20 7d 20 20 20 24 74 31 5f  ('1ab') }   $t1_
4b10: 63 72 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20  cross_t2        
4b20: 20 20 20 20 20 5c 0a 20 20 20 20 36 20 7b 20 53       \.    6 { S
4b30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4b40: 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 30 2e  %JOIN% t2 ON (0.
4b50: 39 29 20 7d 20 20 20 20 20 24 74 31 5f 63 72 6f  9) }     $t1_cro
4b60: 73 73 5f 74 32 20 20 20 20 20 20 20 20 20 20 20  ss_t2           
4b70: 20 20 5c 0a 20 20 20 20 37 20 7b 20 53 45 4c 45    \.    7 { SELE
4b80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f  CT * FROM t1 %JO
4b90: 49 4e 25 20 74 32 20 4f 4e 20 28 27 30 2e 39 27  IN% t2 ON ('0.9'
4ba0: 29 20 7d 20 20 20 24 74 31 5f 63 72 6f 73 73 5f  ) }   $t1_cross_
4bb0: 74 32 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  t2             \
4bc0: 0a 20 20 20 20 38 20 7b 20 53 45 4c 45 43 54 20  .    8 { SELECT 
4bd0: 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25  * FROM t1 %JOIN%
4be0: 20 74 32 20 4f 4e 20 28 30 2e 30 29 20 7d 20 20   t2 ON (0.0) }  
4bf0: 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20 20     [list]       
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 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 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 39           \.    9
4c60: 20 7b 20 53 45 4c 45 43 54 20 74 31 2e 62 2c 20   { SELECT t1.b, 
4c70: 74 32 2e 62 20 46 52 4f 4d 20 74 31 20 25 4a 4f  t2.b FROM t1 %JO
4c80: 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e 61 20  IN% t2 ON (t1.a 
4c90: 3d 20 74 32 2e 61 29 20 7d 20 20 20 20 20 20 20  = t2.a) }       
4ca0: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 6f        \.      {o
4cb0: 6e 65 20 49 20 74 77 6f 20 49 49 20 74 68 72 65  ne I two II thre
4cc0: 65 20 49 49 49 7d 20 20 20 20 20 20 20 20 20 20  e III}          
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 5c 0a 20 20 20 31 30 20 7b 20 53 45 4c     \.   10 { SEL
4d00: 45 43 54 20 74 31 2e 62 2c 20 74 32 2e 62 20 46  ECT t1.b, t2.b F
4d10: 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32  ROM t1 %JOIN% t2
4d20: 20 4f 4e 20 28 74 31 2e 61 20 3d 20 27 61 27 29   ON (t1.a = 'a')
4d30: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
4d40: 5c 0a 20 20 20 20 20 20 7b 6f 6e 65 20 49 20 6f  \.      {one I o
4d50: 6e 65 20 49 49 20 6f 6e 65 20 49 49 49 7d 20 20  ne II one III}  
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 20 20                  
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4d90: 20 20 31 31 20 7b 20 53 45 4c 45 43 54 20 74 31    11 { SELECT t1
4da0: 2e 62 2c 20 74 32 2e 62 20 0a 20 20 20 20 20 20  .b, t2.b .      
4db0: 20 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25    FROM t1 %JOIN%
4dc0: 20 74 32 20 4f 4e 20 28 43 41 53 45 20 57 48 45   t2 ON (CASE WHE
4dd0: 4e 20 74 31 2e 61 20 3d 20 27 61 27 20 54 48 45  N t1.a = 'a' THE
4de0: 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 31 20 45 4e  N NULL ELSE 1 EN
4df0: 44 29 20 7d 20 5c 0a 20 20 20 20 20 20 7b 74 77  D) } \.      {tw
4e00: 6f 20 49 20 74 77 6f 20 49 49 20 74 77 6f 20 49  o I two II two I
4e10: 49 49 20 74 68 72 65 65 20 49 20 74 68 72 65 65  II three I three
4e20: 20 49 49 20 74 68 72 65 65 20 49 49 49 7d 20 20   II three III}  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e40: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 6a 6f 69    \.] {.  do_joi
4e50: 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  n_test e_select-
4e60: 31 2e 33 2e 24 74 6e 20 24 73 65 6c 65 63 74 20  1.3.$tn $select 
4e70: 24 72 65 73 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  $res.}..# EVIDEN
4e80: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 33 33 2d 30  CE-OF: R-49933-0
4e90: 35 31 33 37 20 49 66 20 74 68 65 72 65 20 69 73  5137 If there is
4ea0: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20   a USING clause 
4eb0: 74 68 65 6e 20 65 61 63 68 20 6f 66 20 74 68 65  then each of the
4ec0: 0a 23 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  .# column names 
4ed0: 73 70 65 63 69 66 69 65 64 20 6d 75 73 74 20 65  specified must e
4ee0: 78 69 73 74 20 69 6e 20 74 68 65 20 64 61 74 61  xist in the data
4ef0: 73 65 74 73 20 74 6f 20 62 6f 74 68 20 74 68 65  sets to both the
4f00: 20 6c 65 66 74 20 61 6e 64 0a 23 20 72 69 67 68   left and.# righ
4f10: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2d 6f 70  t of the join-op
4f20: 65 72 61 74 6f 72 2e 0a 23 0a 64 6f 5f 73 65 6c  erator..#.do_sel
4f30: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
4f40: 63 74 2d 31 2e 34 20 2d 65 72 72 6f 72 20 7b 0a  ct-1.4 -error {.
4f50: 20 20 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73    cannot join us
4f60: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
4f70: 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72 65 73 65  column not prese
4f80: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4f90: 73 0a 7d 20 7b 0a 20 20 31 20 7b 20 53 45 4c 45  s.} {.  1 { SELE
4fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 33  CT * FROM t1, t3
4fb0: 20 55 53 49 4e 47 20 28 62 29 20 7d 20 20 20 22   USING (b) }   "
4fc0: 62 22 0a 20 20 32 20 7b 20 53 45 4c 45 43 54 20  b".  2 { SELECT 
4fd0: 2a 20 46 52 4f 4d 20 74 33 2c 20 74 31 20 55 53  * FROM t3, t1 US
4fe0: 49 4e 47 20 28 63 29 20 7d 20 20 20 22 63 22 0a  ING (c) }   "c".
4ff0: 20 20 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    3 { SELECT * F
5000: 52 4f 4d 20 74 33 2c 20 28 53 45 4c 45 43 54 20  ROM t3, (SELECT 
5010: 61 20 41 53 20 62 2c 20 62 20 41 53 20 63 20 46  a AS b, b AS c F
5020: 52 4f 4d 20 74 31 29 20 55 53 49 4e 47 20 28 61  ROM t1) USING (a
5030: 29 20 7d 20 20 20 22 61 22 0a 7d 20 0a 0a 23 20  ) }   "a".} ..# 
5040: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
5050: 32 37 37 36 2d 35 32 38 33 30 20 46 6f 72 20 65  2776-52830 For e
5060: 61 63 68 20 70 61 69 72 20 6f 66 20 6e 61 6d 65  ach pair of name
5070: 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 0a 23  d columns, the.#
5080: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 6c 68 73   expression "lhs
5090: 2e 58 20 3d 20 72 68 73 2e 58 22 20 69 73 20 65  .X = rhs.X" is e
50a0: 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63  valuated for eac
50b0: 68 20 72 6f 77 20 6f 66 20 74 68 65 20 63 61 72  h row of the car
50c0: 74 65 73 69 61 6e 0a 23 20 70 72 6f 64 75 63 74  tesian.# product
50d0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78   as a boolean ex
50e0: 70 72 65 73 73 69 6f 6e 2e 20 4f 6e 6c 79 20 72  pression. Only r
50f0: 6f 77 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c  ows for which al
5100: 6c 20 73 75 63 68 0a 23 20 65 78 70 72 65 73 73  l such.# express
5110: 69 6f 6e 73 20 65 76 61 6c 75 61 74 65 73 20 74  ions evaluates t
5120: 6f 20 74 72 75 65 20 61 72 65 20 69 6e 63 6c 75  o true are inclu
5130: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ded from the res
5140: 75 6c 74 20 73 65 74 2e 0a 23 0a 64 6f 5f 73 65  ult set..#.do_se
5150: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
5160: 65 63 74 2d 31 2e 35 20 7b 0a 20 20 31 20 7b 20  ect-1.5 {.  1 { 
5170: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5180: 2c 20 74 33 20 55 53 49 4e 47 20 28 61 29 20 20  , t3 USING (a)  
5190: 20 7d 20 20 7b 61 20 6f 6e 65 20 31 20 62 20 74   }  {a one 1 b t
51a0: 77 6f 20 32 7d 0a 20 20 32 20 7b 20 53 45 4c 45  wo 2}.  2 { SELE
51b0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c 20 74 34  CT * FROM t3, t4
51c0: 20 55 53 49 4e 47 20 28 61 2c 63 29 20 7d 20 20   USING (a,c) }  
51d0: 7b 62 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49 44  {b 2}.} ..# EVID
51e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 30 34 36  ENCE-OF: R-54046
51f0: 2d 34 38 36 30 30 20 57 68 65 6e 20 63 6f 6d 70  -48600 When comp
5200: 61 72 69 6e 67 20 76 61 6c 75 65 73 20 61 73 20  aring values as 
5210: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 0a 23 20  a result of a.# 
5220: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74 68  USING clause, th
5230: 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65 73 20 66  e normal rules f
5240: 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 66 66 69  or handling affi
5250: 6e 69 74 69 65 73 2c 20 63 6f 6c 6c 61 74 69 6f  nities, collatio
5260: 6e 0a 23 20 73 65 71 75 65 6e 63 65 73 20 61 6e  n.# sequences an
5270: 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e  d NULL values in
5280: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 70 70   comparisons app
5290: 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ly..#.# EVIDENCE
52a0: 2d 4f 46 3a 20 52 2d 33 38 34 32 32 2d 30 34 34  -OF: R-38422-044
52b0: 30 32 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66 72  02 The column fr
52c0: 6f 6d 20 74 68 65 20 64 61 74 61 73 65 74 20 6f  om the dataset o
52d0: 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d 68 61 6e  n the.# left-han
52e0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 6a 6f  d side of the jo
52f0: 69 6e 2d 6f 70 65 72 61 74 6f 72 20 69 73 20 63  in-operator is c
5300: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
5310: 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d 68 61  on the.# left-ha
5320: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  nd side of the c
5330: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
5340: 6f 72 20 28 3d 29 20 66 6f 72 20 74 68 65 20 70  or (=) for the p
5350: 75 72 70 6f 73 65 73 20 6f 66 0a 23 20 63 6f 6c  urposes of.# col
5360: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5370: 61 6e 64 20 61 66 66 69 6e 69 74 79 20 70 72 65  and affinity pre
5380: 63 65 64 65 6e 63 65 2e 0a 23 0a 64 6f 5f 65 78  cedence..#.do_ex
5390: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
53a0: 65 63 74 2d 31 2e 36 2e 30 20 7b 0a 20 20 43 52  ect-1.6.0 {.  CR
53b0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 20  EATE TABLE t5(a 
53c0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20  COLLATE nocase, 
53d0: 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  b COLLATE binary
53e0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
53f0: 20 74 35 20 56 41 4c 55 45 53 28 27 41 41 27 2c   t5 VALUES('AA',
5400: 20 27 63 63 27 29 3b 0a 20 20 49 4e 53 45 52 54   'cc');.  INSERT
5410: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
5420: 27 42 42 27 2c 20 27 64 64 27 29 3b 0a 20 20 49  'BB', 'dd');.  I
5430: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
5440: 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
5450: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
5460: 20 74 36 28 61 20 43 4f 4c 4c 41 54 45 20 62 69   t6(a COLLATE bi
5470: 6e 61 72 79 2c 20 62 20 43 4f 4c 4c 41 54 45 20  nary, b COLLATE 
5480: 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e 53 45 52  nocase);.  INSER
5490: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
54a0: 28 27 61 61 27 2c 20 27 63 63 27 29 3b 0a 20 20  ('aa', 'cc');.  
54b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
54c0: 41 4c 55 45 53 28 27 62 62 27 2c 20 27 44 44 27  ALUES('bb', 'DD'
54d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
54e0: 20 74 36 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   t6 VALUES(NULL,
54f0: 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 7d 0a 66 6f 72   NULL);.} {}.for
5500: 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20  each {tn select 
5510: 72 65 73 7d 20 7b 0a 20 20 31 20 7b 20 53 45 4c  res} {.  1 { SEL
5520: 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 25 4a  ECT * FROM t5 %J
5530: 4f 49 4e 25 20 74 36 20 55 53 49 4e 47 20 28 61  OIN% t6 USING (a
5540: 29 20 7d 20 7b 41 41 20 63 63 20 63 63 20 42 42  ) } {AA cc cc BB
5550: 20 64 64 20 44 44 7d 0a 20 20 32 20 7b 20 53 45   dd DD}.  2 { SE
5560: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 25  LECT * FROM t6 %
5570: 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47 20 28  JOIN% t5 USING (
5580: 61 29 20 7d 20 7b 7d 0a 20 20 33 20 7b 20 53 45  a) } {}.  3 { SE
5590: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
55a0: 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f  ECT a COLLATE no
55b0: 63 61 73 65 2c 20 62 20 46 52 4f 4d 20 74 36 29  case, b FROM t6)
55c0: 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47   %JOIN% t5 USING
55d0: 20 28 61 29 20 7d 20 0a 20 20 20 20 7b 61 61 20   (a) } .    {aa 
55e0: 63 63 20 63 63 20 62 62 20 44 44 20 64 64 7d 0a  cc cc bb DD dd}.
55f0: 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    4 { SELECT * F
5600: 52 4f 4d 20 74 35 20 25 4a 4f 49 4e 25 20 74 36  ROM t5 %JOIN% t6
5610: 20 55 53 49 4e 47 20 28 61 2c 62 29 20 7d 20 7b   USING (a,b) } {
5620: 41 41 20 63 63 7d 0a 20 20 35 20 7b 20 53 45 4c  AA cc}.  5 { SEL
5630: 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 20 25 4a  ECT * FROM t6 %J
5640: 4f 49 4e 25 20 74 35 20 55 53 49 4e 47 20 28 61  OIN% t5 USING (a
5650: 2c 62 29 20 7d 20 7b 7d 0a 7d 20 7b 0a 20 20 64  ,b) } {}.} {.  d
5660: 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65  o_join_test e_se
5670: 6c 65 63 74 2d 31 2e 36 2e 24 74 6e 20 24 73 65  lect-1.6.$tn $se
5680: 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a 23 20 45  lect $res.}..# E
5690: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
56a0: 30 34 37 2d 31 30 34 36 31 20 46 6f 72 20 65 61  047-10461 For ea
56b0: 63 68 20 70 61 69 72 20 6f 66 20 63 6f 6c 75 6d  ch pair of colum
56c0: 6e 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ns identified by
56d0: 20 61 0a 23 20 55 53 49 4e 47 20 63 6c 61 75 73   a.# USING claus
56e0: 65 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 72  e, the column fr
56f0: 6f 6d 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  om the right-han
5700: 64 20 64 61 74 61 73 65 74 20 69 73 20 6f 6d 69  d dataset is omi
5710: 74 74 65 64 20 66 72 6f 6d 0a 23 20 74 68 65 20  tted from.# the 
5720: 6a 6f 69 6e 65 64 20 64 61 74 61 73 65 74 2e 0a  joined dataset..
5730: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5740: 20 52 2d 35 36 31 33 32 2d 31 35 37 30 30 20 54   R-56132-15700 T
5750: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
5760: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
5770: 65 6e 20 61 20 55 53 49 4e 47 0a 23 20 63 6c 61  en a USING.# cla
5780: 75 73 65 20 61 6e 64 20 69 74 73 20 65 71 75 69  use and its equi
5790: 76 61 6c 65 6e 74 20 4f 4e 20 63 6f 6e 73 74 72  valent ON constr
57a0: 61 69 6e 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20  aint..#.foreach 
57b0: 7b 74 6e 20 73 65 6c 65 63 74 20 72 65 73 7d 20  {tn select res} 
57c0: 7b 0a 20 20 31 61 20 7b 20 53 45 4c 45 43 54 20  {.  1a { SELECT 
57d0: 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25  * FROM t1 %JOIN%
57e0: 20 74 32 20 55 53 49 4e 47 20 28 61 29 20 20 20   t2 USING (a)   
57f0: 20 20 20 7d 20 0a 20 20 20 20 20 7b 61 20 6f 6e     } .     {a on
5800: 65 20 49 20 62 20 74 77 6f 20 49 49 20 63 20 74  e I b two II c t
5810: 68 72 65 65 20 49 49 49 7d 0a 20 20 31 62 20 7b  hree III}.  1b {
5820: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5830: 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28  1 %JOIN% t2 ON (
5840: 74 31 2e 61 3d 74 32 2e 61 29 20 7d 0a 20 20 20  t1.a=t2.a) }.   
5850: 20 20 7b 61 20 6f 6e 65 20 61 20 49 20 62 20 74    {a one a I b t
5860: 77 6f 20 62 20 49 49 20 63 20 74 68 72 65 65 20  wo b II c three 
5870: 63 20 49 49 49 7d 0a 0a 20 20 32 61 20 7b 20 53  c III}..  2a { S
5880: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
5890: 25 4a 4f 49 4e 25 20 74 34 20 55 53 49 4e 47 20  %JOIN% t4 USING 
58a0: 28 61 29 20 20 20 20 20 20 7d 20 20 0a 20 20 20  (a)      }  .   
58b0: 20 20 7b 61 20 31 20 7b 7d 20 62 20 32 20 32 7d    {a 1 {} b 2 2}
58c0: 0a 20 20 32 62 20 7b 20 53 45 4c 45 43 54 20 2a  .  2b { SELECT *
58d0: 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49 4e 25 20   FROM t3 %JOIN% 
58e0: 74 34 20 4f 4e 20 28 74 33 2e 61 3d 74 34 2e 61  t4 ON (t3.a=t4.a
58f0: 29 20 7d 20 0a 20 20 20 20 20 7b 61 20 31 20 61  ) } .     {a 1 a
5900: 20 7b 7d 20 62 20 32 20 62 20 32 7d 0a 0a 20 20   {} b 2 b 2}..  
5910: 33 61 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  3a { SELECT * FR
5920: 4f 4d 20 74 33 20 25 4a 4f 49 4e 25 20 74 34 20  OM t3 %JOIN% t4 
5930: 55 53 49 4e 47 20 28 61 2c 63 29 20 20 20 20 20  USING (a,c)     
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 7b               } {
5950: 62 20 32 7d 0a 20 20 33 62 20 7b 20 53 45 4c 45  b 2}.  3b { SELE
5960: 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 25 4a 4f  CT * FROM t3 %JO
5970: 49 4e 25 20 74 34 20 4f 4e 20 28 74 33 2e 61 3d  IN% t4 ON (t3.a=
5980: 74 34 2e 61 20 41 4e 44 20 74 33 2e 63 3d 74 34  t4.a AND t3.c=t4
5990: 2e 63 29 20 7d 20 7b 62 20 32 20 62 20 32 7d 0a  .c) } {b 2 b 2}.
59a0: 0a 20 20 34 61 20 7b 20 53 45 4c 45 43 54 20 2a  .  4a { SELECT *
59b0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
59c0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20  COLLATE nocase, 
59d0: 62 20 46 52 4f 4d 20 74 36 29 20 41 53 20 78 20  b FROM t6) AS x 
59e0: 0a 20 20 20 20 20 20 20 25 4a 4f 49 4e 25 20 74  .       %JOIN% t
59f0: 35 20 55 53 49 4e 47 20 28 61 29 20 7d 20 0a 20  5 USING (a) } . 
5a00: 20 20 20 20 7b 61 61 20 63 63 20 63 63 20 62 62      {aa cc cc bb
5a10: 20 44 44 20 64 64 7d 0a 20 20 34 62 20 7b 20 53   DD dd}.  4b { S
5a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
5a30: 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20 6e  LECT a COLLATE n
5a40: 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d 20 74 36  ocase, b FROM t6
5a50: 29 20 41 53 20 78 0a 20 20 20 20 20 20 20 25 4a  ) AS x.       %J
5a60: 4f 49 4e 25 20 74 35 20 4f 4e 20 28 78 2e 61 3d  OIN% t5 ON (x.a=
5a70: 74 35 2e 61 29 20 7d 20 0a 20 20 20 20 20 7b 61  t5.a) } .     {a
5a80: 61 20 63 63 20 41 41 20 63 63 20 62 62 20 44 44  a cc AA cc bb DD
5a90: 20 42 42 20 64 64 7d 0a 7d 20 7b 0a 20 20 64 6f   BB dd}.} {.  do
5aa0: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
5ab0: 65 63 74 2d 31 2e 37 2e 24 74 6e 20 24 73 65 6c  ect-1.7.$tn $sel
5ac0: 65 63 74 20 24 72 65 73 0a 7d 0a 23 20 45 56 49  ect $res.}.# EVI
5ad0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 35 33  DENCE-OF: R-4253
5ae0: 31 2d 35 32 38 37 34 20 49 66 20 74 68 65 20 6a  1-52874 If the j
5af0: 6f 69 6e 2d 6f 70 65 72 61 74 6f 72 20 69 73 20  oin-operator is 
5b00: 61 20 22 4c 45 46 54 20 4a 4f 49 4e 22 20 6f 72  a "LEFT JOIN" or
5b10: 0a 23 20 22 4c 45 46 54 20 4f 55 54 45 52 20 4a  .# "LEFT OUTER J
5b20: 4f 49 4e 22 2c 20 74 68 65 6e 20 61 66 74 65 72  OIN", then after
5b30: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
5b40: 20 66 69 6c 74 65 72 69 6e 67 20 63 6c 61 75 73   filtering claus
5b50: 65 73 20 68 61 76 65 0a 23 20 62 65 65 6e 20 61  es have.# been a
5b60: 70 70 6c 69 65 64 2c 20 61 6e 20 65 78 74 72 61  pplied, an extra
5b70: 20 72 6f 77 20 69 73 20 61 64 64 65 64 20 74 6f   row is added to
5b80: 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20   the output for 
5b90: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a  each row in the.
5ba0: 23 20 6f 72 69 67 69 6e 61 6c 20 6c 65 66 74 2d  # original left-
5bb0: 68 61 6e 64 20 69 6e 70 75 74 20 64 61 74 61 73  hand input datas
5bc0: 65 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  et that correspo
5bd0: 6e 64 73 20 74 6f 20 6e 6f 20 72 6f 77 73 20 61  nds to no rows a
5be0: 74 20 61 6c 6c 20 69 6e 0a 23 20 74 68 65 20 63  t all in.# the c
5bf0: 6f 6d 70 6f 73 69 74 65 20 64 61 74 61 73 65 74  omposite dataset
5c00: 20 28 69 66 20 61 6e 79 29 2e 0a 23 0a 64 6f 5f   (if any)..#.do_
5c10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
5c20: 65 6c 65 63 74 2d 31 2e 38 2e 30 20 7b 0a 20 20  elect-1.8.0 {.  
5c30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
5c40: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41  a, b, c);.  CREA
5c50: 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 64  TE TABLE t8(a, d
5c60: 2c 20 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  , e);..  INSERT 
5c70: 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 27  INTO t7 VALUES('
5c80: 78 27 2c 20 27 65 78 27 2c 20 20 32 34 29 3b 0a  x', 'ex',  24);.
5c90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
5ca0: 20 56 41 4c 55 45 53 28 27 79 27 2c 20 27 77 68   VALUES('y', 'wh
5cb0: 79 27 2c 20 32 35 29 3b 0a 0a 20 20 49 4e 53 45  y', 25);..  INSE
5cc0: 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45  RT INTO t8 VALUE
5cd0: 53 28 27 78 27 2c 20 27 61 62 63 27 2c 20 32 34  S('x', 'abc', 24
5ce0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
5cf0: 20 74 38 20 56 41 4c 55 45 53 28 27 7a 27 2c 20   t8 VALUES('z', 
5d00: 27 67 68 69 27 2c 20 32 36 29 3b 0a 7d 20 7b 7d  'ghi', 26);.} {}
5d10: 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  ..do_select_test
5d20: 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 38 20 7b  s e_select-1.8 {
5d30: 0a 20 20 31 61 20 22 53 45 4c 45 43 54 20 63 6f  .  1a "SELECT co
5d40: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 37 20 4a  unt(*) FROM t7 J
5d50: 4f 49 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d  OIN t8 ON (t7.a=
5d60: 74 38 2e 61 29 22 20 7b 31 7d 0a 20 20 31 62 20  t8.a)" {1}.  1b 
5d70: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
5d80: 20 46 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a 4f   FROM t7 LEFT JO
5d90: 49 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74  IN t8 ON (t7.a=t
5da0: 38 2e 61 29 22 20 7b 32 7d 0a 20 20 32 61 20 22  8.a)" {2}.  2a "
5db0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
5dc0: 46 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20  FROM t7 JOIN t8 
5dd0: 55 53 49 4e 47 20 28 61 29 22 20 7b 31 7d 0a 20  USING (a)" {1}. 
5de0: 20 32 62 20 22 53 45 4c 45 43 54 20 63 6f 75 6e   2b "SELECT coun
5df0: 74 28 2a 29 20 46 52 4f 4d 20 74 37 20 4c 45 46  t(*) FROM t7 LEF
5e00: 54 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20  T JOIN t8 USING 
5e10: 28 61 29 22 20 7b 32 7d 0a 7d 0a 0a 0a 23 20 45  (a)" {2}.}...# E
5e20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
5e30: 36 30 37 2d 35 32 39 38 38 20 54 68 65 20 61 64  607-52988 The ad
5e40: 64 65 64 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e  ded rows contain
5e50: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20   NULL values in 
5e60: 74 68 65 0a 23 20 63 6f 6c 75 6d 6e 73 20 74 68  the.# columns th
5e70: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
5e80: 79 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73  y contain values
5e90: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
5ea0: 20 72 69 67 68 74 2d 68 61 6e 64 0a 23 20 69 6e   right-hand.# in
5eb0: 70 75 74 20 64 61 74 61 73 65 74 2e 0a 23 0a 64  put dataset..#.d
5ec0: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
5ed0: 5f 73 65 6c 65 63 74 2d 31 2e 39 20 7b 0a 20 20  _select-1.9 {.  
5ee0: 31 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  1a "SELECT * FRO
5ef0: 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 4f 4e 20  M t7 JOIN t8 ON 
5f00: 28 74 37 2e 61 3d 74 38 2e 61 29 22 20 7b 78 20  (t7.a=t8.a)" {x 
5f10: 65 78 20 32 34 20 78 20 61 62 63 20 32 34 7d 0a  ex 24 x abc 24}.
5f20: 20 20 31 62 20 22 53 45 4c 45 43 54 20 2a 20 46    1b "SELECT * F
5f30: 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49 4e  ROM t7 LEFT JOIN
5f40: 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38 2e   t8 ON (t7.a=t8.
5f50: 61 29 22 20 0a 20 20 20 20 20 7b 78 20 65 78 20  a)" .     {x ex 
5f60: 32 34 20 78 20 61 62 63 20 32 34 20 79 20 77 68  24 x abc 24 y wh
5f70: 79 20 32 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20  y 25 {} {} {}}. 
5f80: 20 32 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52   2a "SELECT * FR
5f90: 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 55 53  OM t7 JOIN t8 US
5fa0: 49 4e 47 20 28 61 29 22 20 7b 78 20 65 78 20 32  ING (a)" {x ex 2
5fb0: 34 20 61 62 63 20 32 34 7d 0a 20 20 32 62 20 22  4 abc 24}.  2b "
5fc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
5fd0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38 20 55 53   LEFT JOIN t8 US
5fe0: 49 4e 47 20 28 61 29 22 20 7b 78 20 65 78 20 32  ING (a)" {x ex 2
5ff0: 34 20 61 62 63 20 32 34 20 79 20 77 68 79 20 32  4 abc 24 y why 2
6000: 35 20 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 20 45 56  5 {} {}}.}..# EV
6010: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 39  IDENCE-OF: R-049
6020: 33 32 2d 35 35 39 34 32 20 49 66 20 74 68 65 20  32-55942 If the 
6030: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
6040: 69 73 20 69 6e 20 74 68 65 0a 23 20 6a 6f 69 6e  is in the.# join
6050: 2d 6f 70 65 72 61 74 6f 72 20 74 68 65 6e 20 61  -operator then a
6060: 6e 20 69 6d 70 6c 69 63 69 74 20 55 53 49 4e 47  n implicit USING
6070: 20 63 6c 61 75 73 65 20 69 73 20 61 64 64 65 64   clause is added
6080: 20 74 6f 20 74 68 65 0a 23 20 6a 6f 69 6e 2d 63   to the.# join-c
6090: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 54 68 65 20  onstraints. The 
60a0: 69 6d 70 6c 69 63 69 74 20 55 53 49 4e 47 20 63  implicit USING c
60b0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 65  lause contains e
60c0: 61 63 68 20 6f 66 20 74 68 65 0a 23 20 63 6f 6c  ach of the.# col
60d0: 75 6d 6e 20 6e 61 6d 65 73 20 74 68 61 74 20 61  umn names that a
60e0: 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 74 68  ppear in both th
60f0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
6100: 2d 68 61 6e 64 20 69 6e 70 75 74 0a 23 20 64 61  -hand input.# da
6110: 74 61 73 65 74 73 2e 0a 23 0a 64 6f 5f 73 65 6c  tasets..#.do_sel
6120: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
6130: 63 74 2d 31 2d 31 30 20 7b 0a 20 20 31 61 20 22  ct-1-10 {.  1a "
6140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
6150: 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20 28   JOIN t8 USING (
6160: 61 29 22 20 20 20 20 20 20 20 20 7b 78 20 65 78  a)"        {x ex
6170: 20 32 34 20 61 62 63 20 32 34 7d 0a 20 20 31 62   24 abc 24}.  1b
6180: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
6190: 74 37 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t7 NATURAL JOIN 
61a0: 74 38 22 20 20 20 20 20 20 20 20 20 20 7b 78 20  t8"          {x 
61b0: 65 78 20 32 34 20 61 62 63 20 32 34 7d 0a 0a 20  ex 24 abc 24}.. 
61c0: 20 32 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52   2a "SELECT * FR
61d0: 4f 4d 20 74 38 20 4a 4f 49 4e 20 74 37 20 55 53  OM t8 JOIN t7 US
61e0: 49 4e 47 20 28 61 29 22 20 20 20 20 20 20 20 20  ING (a)"        
61f0: 7b 78 20 61 62 63 20 32 34 20 65 78 20 32 34 7d  {x abc 24 ex 24}
6200: 0a 20 20 32 62 20 22 53 45 4c 45 43 54 20 2a 20  .  2b "SELECT * 
6210: 46 52 4f 4d 20 74 38 20 4e 41 54 55 52 41 4c 20  FROM t8 NATURAL 
6220: 4a 4f 49 4e 20 74 37 22 20 20 20 20 20 20 20 20  JOIN t7"        
6230: 20 20 7b 78 20 61 62 63 20 32 34 20 65 78 20 32    {x abc 24 ex 2
6240: 34 7d 0a 0a 20 20 33 61 20 22 53 45 4c 45 43 54  4}..  3a "SELECT
6250: 20 2a 20 46 52 4f 4d 20 74 37 20 4c 45 46 54 20   * FROM t7 LEFT 
6260: 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20 28 61  JOIN t8 USING (a
6270: 29 22 20 20 20 7b 78 20 65 78 20 32 34 20 61 62  )"   {x ex 24 ab
6280: 63 20 32 34 20 79 20 77 68 79 20 32 35 20 7b 7d  c 24 y why 25 {}
6290: 20 7b 7d 7d 0a 20 20 33 62 20 22 53 45 4c 45 43   {}}.  3b "SELEC
62a0: 54 20 2a 20 46 52 4f 4d 20 74 37 20 4e 41 54 55  T * FROM t7 NATU
62b0: 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38  RAL LEFT JOIN t8
62c0: 22 20 20 20 20 20 7b 78 20 65 78 20 32 34 20 61  "     {x ex 24 a
62d0: 62 63 20 32 34 20 79 20 77 68 79 20 32 35 20 7b  bc 24 y why 25 {
62e0: 7d 20 7b 7d 7d 0a 0a 20 20 34 61 20 22 53 45 4c  } {}}..  4a "SEL
62f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4c 45  ECT * FROM t8 LE
6300: 46 54 20 4a 4f 49 4e 20 74 37 20 55 53 49 4e 47  FT JOIN t7 USING
6310: 20 28 61 29 22 20 20 20 7b 78 20 61 62 63 20 32   (a)"   {x abc 2
6320: 34 20 65 78 20 32 34 20 7a 20 67 68 69 20 32 36  4 ex 24 z ghi 26
6330: 20 7b 7d 20 7b 7d 7d 0a 20 20 34 62 20 22 53 45   {} {}}.  4b "SE
6340: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4e  LECT * FROM t8 N
6350: 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e  ATURAL LEFT JOIN
6360: 20 74 37 22 20 20 20 20 20 7b 78 20 61 62 63 20   t7"     {x abc 
6370: 32 34 20 65 78 20 32 34 20 7a 20 67 68 69 20 32  24 ex 24 z ghi 2
6380: 36 20 7b 7d 20 7b 7d 7d 0a 0a 20 20 35 61 20 22  6 {} {}}..  5a "
6390: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
63a0: 20 4a 4f 49 4e 20 74 34 20 55 53 49 4e 47 20 28   JOIN t4 USING (
63b0: 61 2c 63 29 22 20 20 20 20 20 20 7b 62 20 32 7d  a,c)"      {b 2}
63c0: 0a 20 20 35 62 20 22 53 45 4c 45 43 54 20 2a 20  .  5b "SELECT * 
63d0: 46 52 4f 4d 20 74 33 20 4e 41 54 55 52 41 4c 20  FROM t3 NATURAL 
63e0: 4a 4f 49 4e 20 74 34 22 20 20 20 20 20 20 20 20  JOIN t4"        
63f0: 20 20 7b 62 20 32 7d 0a 0a 20 20 36 61 20 22 53    {b 2}..  6a "S
6400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
6410: 4c 45 46 54 20 4a 4f 49 4e 20 74 34 20 55 53 49  LEFT JOIN t4 USI
6420: 4e 47 20 28 61 2c 63 29 22 20 7b 61 20 31 20 62  NG (a,c)" {a 1 b
6430: 20 32 7d 0a 20 20 36 62 20 22 53 45 4c 45 43 54   2}.  6b "SELECT
6440: 20 2a 20 46 52 4f 4d 20 74 33 20 4e 41 54 55 52   * FROM t3 NATUR
6450: 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 34 22  AL LEFT JOIN t4"
6460: 20 20 20 20 20 7b 61 20 31 20 62 20 32 7d 0a 7d       {a 1 b 2}.}
6470: 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46   ..# EVIDENCE-OF
6480: 3a 20 52 2d 34 39 35 36 36 2d 30 31 35 37 30 20  : R-49566-01570 
6490: 49 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  If the left and 
64a0: 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70 75 74  right-hand input
64b0: 20 64 61 74 61 73 65 74 73 0a 23 20 66 65 61 74   datasets.# feat
64c0: 75 72 65 20 6e 6f 20 63 6f 6d 6d 6f 6e 20 63 6f  ure no common co
64d0: 6c 75 6d 6e 20 6e 61 6d 65 73 2c 20 74 68 65 6e  lumn names, then
64e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
64f0: 77 6f 72 64 20 68 61 73 20 6e 6f 20 65 66 66 65  word has no effe
6500: 63 74 0a 23 20 6f 6e 20 74 68 65 20 72 65 73 75  ct.# on the resu
6510: 6c 74 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  lts of the join.
6520: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
6530: 73 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 31 31  st e_select-1.11
6540: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
6550: 42 4c 45 20 74 31 30 28 78 2c 20 79 29 3b 0a 20  BLE t10(x, y);. 
6560: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30   INSERT INTO t10
6570: 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72 75 65   VALUES(1, 'true
6580: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
6590: 4f 20 74 31 30 20 56 41 4c 55 45 53 28 30 2c 20  O t10 VALUES(0, 
65a0: 27 66 61 6c 73 65 27 29 3b 0a 7d 20 7b 7d 0a 64  'false');.} {}.d
65b0: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
65c0: 5f 73 65 6c 65 63 74 2d 31 2d 31 31 20 7b 0a 20  _select-1-11 {. 
65d0: 20 31 61 20 22 53 45 4c 45 43 54 20 61 2c 20 78   1a "SELECT a, x
65e0: 20 46 52 4f 4d 20 74 31 20 43 52 4f 53 53 20 4a   FROM t1 CROSS J
65f0: 4f 49 4e 20 74 31 30 22 20 7b 61 20 31 20 61 20  OIN t10" {a 1 a 
6600: 30 20 62 20 31 20 62 20 30 20 63 20 31 20 63 20  0 b 1 b 0 c 1 c 
6610: 30 7d 0a 20 20 31 62 20 22 53 45 4c 45 43 54 20  0}.  1b "SELECT 
6620: 61 2c 20 78 20 46 52 4f 4d 20 74 31 20 4e 41 54  a, x FROM t1 NAT
6630: 55 52 41 4c 20 43 52 4f 53 53 20 4a 4f 49 4e 20  URAL CROSS JOIN 
6640: 74 31 30 22 20 7b 61 20 31 20 61 20 30 20 62 20  t10" {a 1 a 0 b 
6650: 31 20 62 20 30 20 63 20 31 20 63 20 30 7d 0a 7d  1 b 0 c 1 c 0}.}
6660: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
6670: 20 52 2d 33 39 36 32 35 2d 35 39 31 33 33 20 41   R-39625-59133 A
6680: 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61   USING or ON cla
6690: 75 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  use may not be a
66a0: 64 64 65 64 20 74 6f 20 61 0a 23 20 6a 6f 69 6e  dded to a.# join
66b0: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
66c0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
66d0: 6f 72 64 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ord..#.foreach {
66e0: 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20 7b 53  tn sql} {.  1 {S
66f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
6700: 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49  NATURAL LEFT JOI
6710: 4e 20 74 32 20 55 53 49 4e 47 20 28 61 29 7d 0a  N t2 USING (a)}.
6720: 20 20 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52    2 {SELECT * FR
6730: 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 4c 45  OM t1 NATURAL LE
6740: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 74  FT JOIN t2 ON (t
6750: 31 2e 61 3d 74 32 2e 61 29 7d 0a 20 20 33 20 7b  1.a=t2.a)}.  3 {
6760: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6770: 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a 4f   NATURAL LEFT JO
6780: 49 4e 20 74 32 20 4f 4e 20 28 34 35 29 7d 0a 7d  IN t2 ON (45)}.}
6790: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
67a0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
67b0: 2e 31 32 2e 24 74 6e 20 22 0a 20 20 20 20 24 73  .12.$tn ".    $s
67c0: 71 6c 0a 20 20 22 20 7b 31 20 7b 61 20 4e 41 54  ql.  " {1 {a NAT
67d0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
67e0: 74 20 68 61 76 65 20 61 6e 20 4f 4e 20 6f 72 20  t have an ON or 
67f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 7d 7d 0a 7d  USING clause}}.}
6800: 0a 0a 23 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 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6850: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
6860: 20 74 65 73 74 73 20 2d 20 65 5f 73 65 6c 65 63   tests - e_selec
6870: 74 2d 33 2e 2a 20 2d 20 63 6f 6e 63 65 6e 74 72  t-3.* - concentr
6880: 61 74 65 20 6f 6e 20 76 65 72 69 66 79 69 6e 67  ate on verifying
6890: 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 6d   .# statements m
68a0: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 57 48  ade regarding WH
68b0: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
68c0: 73 73 69 6e 67 2e 0a 23 0a 64 72 6f 70 5f 61 6c  ssing..#.drop_al
68d0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63  l_tables.do_exec
68e0: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
68f0: 74 2d 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t-3.0 {.  CREATE
6900: 20 54 41 42 4c 45 20 78 31 28 6b 2c 20 78 2c 20   TABLE x1(k, x, 
6910: 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20  y, z);.  INSERT 
6920: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 31  INTO x1 VALUES(1
6930: 2c 20 27 72 65 6c 69 6e 71 75 69 73 68 65 64 27  , 'relinquished'
6940: 2c 20 27 61 70 68 61 73 69 61 27 2c 20 37 38 2e  , 'aphasia', 78.
6950: 34 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  43);.  INSERT IN
6960: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 32 2c 20  TO x1 VALUES(2, 
6970: 58 27 41 38 45 38 44 36 36 46 27 2c 20 20 20 20  X'A8E8D66F',    
6980: 58 27 30 37 43 46 27 2c 20 20 20 2d 38 31 29 3b  X'07CF',   -81);
6990: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
69a0: 31 20 56 41 4c 55 45 53 28 33 2c 20 2d 32 32 2c  1 VALUES(3, -22,
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 32 37 2e              -27.
69c0: 35 37 2c 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20  57,    NULL);.  
69d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
69e0: 41 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 2c 20 20  ALUES(4, NULL,  
69f0: 20 20 20 20 20 20 20 20 20 27 62 79 67 6f 6e 65           'bygone
6a00: 27 2c 20 20 27 70 69 63 6b 79 27 29 3b 0a 20 20  ',  'picky');.  
6a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
6a20: 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 2c 20 20  ALUES(5, NULL,  
6a30: 20 20 20 20 20 20 20 20 20 39 36 2e 32 38 2c 20           96.28, 
6a40: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53      NULL);.  INS
6a50: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
6a60: 45 53 28 36 2c 20 30 2c 20 20 20 20 20 20 20 20  ES(6, 0,        
6a70: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
6a80: 20 32 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54   2);..  CREATE T
6a90: 41 42 4c 45 20 78 32 28 6b 2c 20 78 2c 20 79 32  ABLE x2(k, x, y2
6aa0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
6ab0: 20 78 32 20 56 41 4c 55 45 53 28 31 2c 20 35 30   x2 VALUES(1, 50
6ac0: 2c 20 58 27 42 38 32 38 33 38 27 29 3b 0a 20 20  , X'B82838');.  
6ad0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56  INSERT INTO x2 V
6ae0: 41 4c 55 45 53 28 35 2c 20 38 34 2e 37 39 2c 20  ALUES(5, 84.79, 
6af0: 36 35 2e 38 38 29 3b 0a 20 20 49 4e 53 45 52 54  65.88);.  INSERT
6b00: 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28   INTO x2 VALUES(
6b10: 33 2c 20 2d 32 32 2c 20 58 27 30 45 31 42 45 34  3, -22, X'0E1BE4
6b20: 35 32 41 33 39 33 27 29 3b 0a 20 20 49 4e 53 45  52A393');.  INSE
6b30: 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45  RT INTO x2 VALUE
6b40: 53 28 37 2c 20 27 6d 69 73 74 72 75 73 74 65 64  S(7, 'mistrusted
6b50: 27 2c 20 27 73 74 61 6e 64 61 72 64 69 7a 65 64  ', 'standardized
6b60: 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  ');.} {}..# EVID
6b70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37 37 35  ENCE-OF: R-60775
6b80: 2d 36 34 39 31 36 20 49 66 20 61 20 57 48 45 52  -64916 If a WHER
6b90: 45 20 63 6c 61 75 73 65 20 69 73 20 73 70 65 63  E clause is spec
6ba0: 69 66 69 65 64 2c 20 74 68 65 20 57 48 45 52 45  ified, the WHERE
6bb0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  .# expression is
6bc0: 20 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65   evaluated for e
6bd0: 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 69  ach row in the i
6be0: 6e 70 75 74 20 64 61 74 61 20 61 73 20 61 20 62  nput data as a b
6bf0: 6f 6f 6c 65 61 6e 0a 23 20 65 78 70 72 65 73 73  oolean.# express
6c00: 69 6f 6e 2e 20 4f 6e 6c 79 20 72 6f 77 73 20 66  ion. Only rows f
6c10: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
6c20: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
6c30: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 0a 23  sion evaluates.#
6c40: 20 74 6f 20 74 72 75 65 20 61 72 65 20 69 6e 63   to true are inc
6c50: 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  luded from the d
6c60: 61 74 61 73 65 74 20 62 65 66 6f 72 65 20 63 6f  ataset before co
6c70: 6e 74 69 6e 75 69 6e 67 2e 0a 23 0a 64 6f 5f 65  ntinuing..#.do_e
6c80: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
6c90: 6c 65 63 74 2d 33 2e 31 2e 31 20 7b 20 53 45 4c  lect-3.1.1 { SEL
6ca0: 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48  ECT k FROM x1 WH
6cb0: 45 52 45 20 78 20 7d 20 20 20 20 20 20 20 20 20  ERE x }         
6cc0: 7b 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {3}.do_execsql_t
6cd0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31  est e_select-3.1
6ce0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52  .2 { SELECT k FR
6cf0: 4f 4d 20 78 31 20 57 48 45 52 45 20 79 20 7d 20  OM x1 WHERE y } 
6d00: 20 20 20 20 20 20 20 20 7b 33 20 35 20 36 7d 0a          {3 5 6}.
6d10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6d20: 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e 33 20 7b  e_select-3.1.3 {
6d30: 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78   SELECT k FROM x
6d40: 31 20 57 48 45 52 45 20 7a 20 7d 20 20 20 20 20  1 WHERE z }     
6d50: 20 20 20 20 7b 31 20 32 20 36 7d 0a 64 6f 5f 65      {1 2 6}.do_e
6d60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
6d70: 6c 65 63 74 2d 33 2e 31 2e 34 20 7b 20 53 45 4c  lect-3.1.4 { SEL
6d80: 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48  ECT k FROM x1 WH
6d90: 45 52 45 20 27 31 27 7c 7c 7a 20 20 20 20 7d 20  ERE '1'||z    } 
6da0: 7b 31 20 32 20 34 20 36 7d 0a 64 6f 5f 65 78 65  {1 2 4 6}.do_exe
6db0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
6dc0: 63 74 2d 33 2e 31 2e 35 20 7b 20 53 45 4c 45 43  ct-3.1.5 { SELEC
6dd0: 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45 52  T k FROM x1 WHER
6de0: 45 20 78 20 49 53 20 4e 55 4c 4c 20 7d 20 7b 34  E x IS NULL } {4
6df0: 20 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   5}.do_execsql_t
6e00: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31  est e_select-3.1
6e10: 2e 36 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52  .6 { SELECT k FR
6e20: 4f 4d 20 78 31 20 57 48 45 52 45 20 7a 20 2d 20  OM x1 WHERE z - 
6e30: 37 38 2e 34 33 20 7d 20 7b 32 20 34 20 36 7d 0a  78.43 } {2 4 6}.
6e40: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6e50: 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e 31 61   e_select-3.2.1a
6e60: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20 46 52   {.  SELECT k FR
6e70: 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM x1 LEFT JOIN 
6e80: 78 32 20 55 53 49 4e 47 28 6b 29 0a 7d 20 7b 31  x2 USING(k).} {1
6e90: 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 65   2 3 4 5 6}.do_e
6ea0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
6eb0: 6c 65 63 74 2d 33 2e 32 2e 31 62 20 7b 0a 20 20  lect-3.2.1b {.  
6ec0: 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31  SELECT k FROM x1
6ed0: 20 4c 45 46 54 20 4a 4f 49 4e 20 78 32 20 55 53   LEFT JOIN x2 US
6ee0: 49 4e 47 28 6b 29 20 57 48 45 52 45 20 78 32 2e  ING(k) WHERE x2.
6ef0: 6b 0a 7d 20 7b 31 20 33 20 35 7d 0a 64 6f 5f 65  k.} {1 3 5}.do_e
6f00: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
6f10: 6c 65 63 74 2d 33 2e 32 2e 32 20 7b 0a 20 20 53  lect-3.2.2 {.  S
6f20: 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20  ELECT k FROM x1 
6f30: 4c 45 46 54 20 4a 4f 49 4e 20 78 32 20 55 53 49  LEFT JOIN x2 USI
6f40: 4e 47 28 6b 29 20 57 48 45 52 45 20 78 32 2e 6b  NG(k) WHERE x2.k
6f50: 20 49 53 20 4e 55 4c 4c 0a 7d 20 7b 32 20 34 20   IS NULL.} {2 4 
6f60: 36 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  6}..do_execsql_t
6f70: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32  est e_select-3.2
6f80: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20  .3 {.  SELECT k 
6f90: 46 52 4f 4d 20 78 31 20 4e 41 54 55 52 41 4c 20  FROM x1 NATURAL 
6fa0: 4a 4f 49 4e 20 78 32 20 57 48 45 52 45 20 78 32  JOIN x2 WHERE x2
6fb0: 2e 6b 0a 7d 20 7b 33 7d 0a 64 6f 5f 65 78 65 63  .k.} {3}.do_exec
6fc0: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
6fd0: 74 2d 33 2e 32 2e 34 20 7b 0a 20 20 53 45 4c 45  t-3.2.4 {.  SELE
6fe0: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4e 41 54  CT k FROM x1 NAT
6ff0: 55 52 41 4c 20 4a 4f 49 4e 20 78 32 20 57 48 45  URAL JOIN x2 WHE
7000: 52 45 20 78 32 2e 6b 2d 33 0a 7d 20 7b 7d 0a 0a  RE x2.k-3.} {}..
7010: 23 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 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
7060: 74 73 20 62 65 6c 6f 77 20 74 68 69 73 20 70 6f  ts below this po
7070: 69 6e 74 20 61 72 65 20 66 6f 63 75 73 65 64 20  int are focused 
7080: 6f 6e 20 76 65 72 69 66 79 69 6e 67 20 74 68 65  on verifying the
7090: 20 74 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d   testable statem
70a0: 65 6e 74 73 0a 23 20 72 65 6c 61 74 65 64 20 74  ents.# related t
70b0: 6f 20 63 61 63 75 6c 61 74 69 6e 67 20 74 68 65  o caculating the
70c0: 20 72 65 73 75 6c 74 20 72 6f 77 73 20 6f 66 20   result rows of 
70d0: 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  a simple SELECT 
70e0: 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 0a 64 72  statement..#..dr
70f0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
7100: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7110: 73 65 6c 65 63 74 2d 34 2e 30 20 7b 0a 20 20 43  select-4.0 {.  C
7120: 52 45 41 54 45 20 54 41 42 4c 45 20 7a 31 28 61  REATE TABLE z1(a
7130: 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
7140: 45 20 54 41 42 4c 45 20 7a 32 28 64 2c 20 65 29  E TABLE z2(d, e)
7150: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
7160: 20 7a 33 28 61 2c 20 62 29 3b 0a 0a 20 20 49 4e   z3(a, b);..  IN
7170: 53 45 52 54 20 49 4e 54 4f 20 7a 31 20 56 41 4c  SERT INTO z1 VAL
7180: 55 45 53 28 35 31 2e 36 35 2c 20 2d 35 39 2e 35  UES(51.65, -59.5
7190: 38 2c 20 27 62 65 6c 66 72 69 65 73 27 29 3b 0a  8, 'belfries');.
71a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31    INSERT INTO z1
71b0: 20 56 41 4c 55 45 53 28 2d 35 2c 20 4e 55 4c 4c   VALUES(-5, NULL
71c0: 2c 20 37 35 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 75);.  INSERT 
71d0: 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 2d  INTO z1 VALUES(-
71e0: 32 2e 32 2c 20 2d 32 33 2e 31 38 2c 20 27 73 75  2.2, -23.18, 'su
71f0: 69 74 65 72 73 27 29 3b 0a 20 20 49 4e 53 45 52  iters');.  INSER
7200: 54 20 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53  T INTO z1 VALUES
7210: 28 4e 55 4c 4c 2c 20 36 37 2c 20 27 71 75 61 72  (NULL, 67, 'quar
7220: 74 65 74 73 27 29 3b 0a 20 20 49 4e 53 45 52 54  tets');.  INSERT
7230: 20 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28   INTO z1 VALUES(
7240: 2d 31 2e 30 34 2c 20 2d 33 32 2e 33 2c 20 27 61  -1.04, -32.3, 'a
7250: 73 70 65 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54  spen');.  INSERT
7260: 20 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28   INTO z1 VALUES(
7270: 36 33 2c 20 27 62 6f 72 6e 27 2c 20 2d 32 36 29  63, 'born', -26)
7280: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
7290: 20 7a 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   z2 VALUES(NULL,
72a0: 20 32 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   21);.  INSERT I
72b0: 4e 54 4f 20 7a 32 20 56 41 4c 55 45 53 28 33 36  NTO z2 VALUES(36
72c0: 2c 20 36 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  , 6);..  INSERT 
72d0: 49 4e 54 4f 20 7a 33 20 56 41 4c 55 45 53 28 27  INTO z3 VALUES('
72e0: 73 75 62 73 69 73 74 65 6e 63 65 27 2c 20 27 67  subsistence', 'g
72f0: 61 75 7a 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  auze');.  INSERT
7300: 20 49 4e 54 4f 20 7a 33 20 56 41 4c 55 45 53 28   INTO z3 VALUES(
7310: 34 39 2e 31 37 2c 20 2d 36 37 29 3b 0a 7d 20 7b  49.17, -67);.} {
7320: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
7330: 3a 20 52 2d 33 36 33 32 37 2d 31 37 32 32 34 20  : R-36327-17224 
7340: 49 66 20 61 20 72 65 73 75 6c 74 20 65 78 70 72  If a result expr
7350: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 73 70  ession is the sp
7360: 65 63 69 61 6c 0a 23 20 65 78 70 72 65 73 73 69  ecial.# expressi
7370: 6f 6e 20 22 2a 22 20 74 68 65 6e 20 61 6c 6c 20  on "*" then all 
7380: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
7390: 6e 70 75 74 20 64 61 74 61 20 61 72 65 20 73 75  nput data are su
73a0: 62 73 74 69 74 75 74 65 64 20 66 6f 72 0a 23 20  bstituted for.# 
73b0: 74 68 61 74 20 6f 6e 65 20 65 78 70 72 65 73 73  that one express
73c0: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
73d0: 45 2d 4f 46 3a 20 52 2d 34 33 36 39 33 2d 33 30  E-OF: R-43693-30
73e0: 35 32 32 20 49 66 20 74 68 65 20 65 78 70 72 65  522 If the expre
73f0: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 61 6c 69  ssion is the ali
7400: 61 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 23 20  as of a table.# 
7410: 6f 72 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  or subquery in t
7420: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 66  he FROM clause f
7430: 6f 6c 6c 6f 77 65 64 20 62 79 20 22 2e 2a 22 20  ollowed by ".*" 
7440: 74 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  then all columns
7450: 20 66 72 6f 6d 0a 23 20 74 68 65 20 6e 61 6d 65   from.# the name
7460: 64 20 74 61 62 6c 65 20 6f 72 20 73 75 62 71 75  d table or subqu
7470: 65 72 79 20 61 72 65 20 73 75 62 73 74 69 74 75  ery are substitu
7480: 74 65 64 20 66 6f 72 20 74 68 65 20 73 69 6e 67  ted for the sing
7490: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23  le expression..#
74a0: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
74b0: 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 20 7b 0a   e_select-4.1 {.
74c0: 20 20 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46    1  "SELECT * F
74d0: 52 4f 4d 20 7a 31 20 4c 49 4d 49 54 20 31 22 20  ROM z1 LIMIT 1" 
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 35 31 2e              {51.
74f0: 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69  65 -59.58 belfri
7500: 65 73 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54  es}.  2  "SELECT
7510: 20 2a 20 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c 49   * FROM z1,z2 LI
7520: 4d 49 54 20 31 22 20 20 20 20 20 20 20 20 20 20  MIT 1"          
7530: 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65  {51.65 -59.58 be
7540: 6c 66 72 69 65 73 20 7b 7d 20 32 31 7d 0a 20 20  lfries {} 21}.  
7550: 33 20 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a 20  3  "SELECT z1.* 
7560: 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54  FROM z1,z2 LIMIT
7570: 20 31 22 20 20 20 20 20 20 20 7b 35 31 2e 36 35   1"       {51.65
7580: 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73   -59.58 belfries
7590: 7d 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20 7a  }.  4  "SELECT z
75a0: 32 2e 2a 20 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c  2.* FROM z1,z2 L
75b0: 49 4d 49 54 20 31 22 20 20 20 20 20 20 20 7b 7b  IMIT 1"       {{
75c0: 7d 20 32 31 7d 0a 20 20 35 20 20 22 53 45 4c 45  } 21}.  5  "SELE
75d0: 43 54 20 7a 32 2e 2a 2c 20 7a 31 2e 2a 20 46 52  CT z2.*, z1.* FR
75e0: 4f 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31  OM z1,z2 LIMIT 1
75f0: 22 20 7b 7b 7d 20 32 31 20 35 31 2e 36 35 20 2d  " {{} 21 51.65 -
7600: 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73 7d 0a  59.58 belfries}.
7610: 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 63 6f  .  6  "SELECT co
7620: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 7a  unt(*), * FROM z
7630: 31 22 20 20 20 20 20 20 20 20 20 20 20 7b 36 20  1"           {6 
7640: 36 33 20 62 6f 72 6e 20 2d 32 36 7d 0a 20 20 37  63 born -26}.  7
7650: 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61 29    "SELECT max(a)
7660: 2c 20 2a 20 46 52 4f 4d 20 7a 31 22 20 20 20 20  , * FROM z1"    
7670: 20 20 20 20 20 20 20 20 20 7b 36 33 20 36 33 20           {63 63 
7680: 62 6f 72 6e 20 2d 32 36 7d 0a 20 20 38 20 20 22  born -26}.  8  "
7690: 53 45 4c 45 43 54 20 2a 2c 20 6d 69 6e 28 61 29  SELECT *, min(a)
76a0: 20 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20   FROM z1"       
76b0: 20 20 20 20 20 20 7b 2d 35 20 7b 7d 20 37 35 20        {-5 {} 75 
76c0: 2d 35 7d 0a 0a 20 20 39 20 20 22 53 45 4c 45 43  -5}..  9  "SELEC
76d0: 54 20 2a 2c 2a 20 46 52 4f 4d 20 7a 31 2c 7a 32  T *,* FROM z1,z2
76e0: 20 4c 49 4d 49 54 20 31 22 20 7b 20 20 20 20 20   LIMIT 1" {     
76f0: 20 20 20 0a 20 20 20 20 20 35 31 2e 36 35 20 2d     .     51.65 -
7700: 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73 20 7b  59.58 belfries {
7710: 7d 20 32 31 20 35 31 2e 36 35 20 2d 35 39 2e 35  } 21 51.65 -59.5
7720: 38 20 62 65 6c 66 72 69 65 73 20 7b 7d 20 32 31  8 belfries {} 21
7730: 0a 20 20 7d 0a 20 20 31 30 20 22 53 45 4c 45 43  .  }.  10 "SELEC
7740: 54 20 7a 31 2e 2a 2c 7a 31 2e 2a 20 46 52 4f 4d  T z1.*,z1.* FROM
7750: 20 7a 32 2c 7a 31 20 4c 49 4d 49 54 20 31 22 20   z2,z1 LIMIT 1" 
7760: 7b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 35  {        .     5
7770: 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66  1.65 -59.58 belf
7780: 72 69 65 73 20 35 31 2e 36 35 20 2d 35 39 2e 35  ries 51.65 -59.5
7790: 38 20 62 65 6c 66 72 69 65 73 0a 20 20 7d 0a 7d  8 belfries.  }.}
77a0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
77b0: 20 52 2d 33 38 30 32 33 2d 31 38 33 39 36 20 49   R-38023-18396 I
77c0: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
77d0: 20 75 73 65 20 61 20 22 2a 22 20 6f 72 20 22 61   use a "*" or "a
77e0: 6c 69 61 73 2e 2a 22 0a 23 20 65 78 70 72 65 73  lias.*".# expres
77f0: 73 69 6f 6e 20 69 6e 20 61 6e 79 20 63 6f 6e 74  sion in any cont
7800: 65 78 74 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ext other than a
7810: 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69   result expressi
7820: 6f 6e 20 6c 69 73 74 2e 0a 23 0a 23 20 45 56 49  on list..#.# EVI
7830: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 33 32  DENCE-OF: R-4432
7840: 34 2d 34 31 31 36 36 20 49 74 20 69 73 20 61 6c  4-41166 It is al
7850: 73 6f 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 75  so an error to u
7860: 73 65 20 61 20 22 2a 22 20 6f 72 0a 23 20 22 61  se a "*" or.# "a
7870: 6c 69 61 73 2e 2a 22 20 65 78 70 72 65 73 73 69  lias.*" expressi
7880: 6f 6e 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53  on in a simple S
7890: 45 4c 45 43 54 20 71 75 65 72 79 20 74 68 61 74  ELECT query that
78a0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
78b0: 0a 23 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  .# FROM clause..
78c0: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  #.foreach {tn se
78d0: 6c 65 63 74 20 65 72 72 7d 20 7b 0a 20 20 31 2e  lect err} {.  1.
78e0: 31 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 2c  1  "SELECT a, b,
78f0: 20 63 20 46 52 4f 4d 20 7a 31 20 57 48 45 52 45   c FROM z1 WHERE
7900: 20 2a 22 20 20 20 20 7b 6e 65 61 72 20 22 2a 22   *"    {near "*"
7910: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a  : syntax error}.
7920: 20 20 31 2e 32 20 20 22 53 45 4c 45 43 54 20 61    1.2  "SELECT a
7930: 2c 20 62 2c 20 63 20 46 52 4f 4d 20 7a 31 20 47  , b, c FROM z1 G
7940: 52 4f 55 50 20 42 59 20 2a 22 20 7b 6e 65 61 72  ROUP BY *" {near
7950: 20 22 2a 22 3a 20 73 79 6e 74 61 78 20 65 72 72   "*": syntax err
7960: 6f 72 7d 0a 20 20 31 2e 33 20 20 22 53 45 4c 45  or}.  1.3  "SELE
7970: 43 54 20 31 20 2b 20 2a 20 46 52 4f 4d 20 7a 31  CT 1 + * FROM z1
7980: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  "              {
7990: 6e 65 61 72 20 22 2a 22 3a 20 73 79 6e 74 61 78  near "*": syntax
79a0: 20 65 72 72 6f 72 7d 0a 20 20 31 2e 34 20 20 22   error}.  1.4  "
79b0: 53 45 4c 45 43 54 20 2a 20 2b 20 31 20 46 52 4f  SELECT * + 1 FRO
79c0: 4d 20 7a 31 22 20 20 20 20 20 20 20 20 20 20 20  M z1"           
79d0: 20 20 20 7b 6e 65 61 72 20 22 2b 22 3a 20 73 79     {near "+": sy
79e0: 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 32  ntax error}..  2
79f0: 2e 31 20 22 53 45 4c 45 43 54 20 2a 22 20 7b 6e  .1 "SELECT *" {n
7a00: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
7a10: 65 64 7d 0a 20 20 32 2e 32 20 22 53 45 4c 45 43  ed}.  2.2 "SELEC
7a20: 54 20 2a 20 57 48 45 52 45 20 31 22 20 7b 6e 6f  T * WHERE 1" {no
7a30: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
7a40: 64 7d 0a 20 20 32 2e 33 20 22 53 45 4c 45 43 54  d}.  2.3 "SELECT
7a50: 20 2a 20 57 48 45 52 45 20 30 22 20 7b 6e 6f 20   * WHERE 0" {no 
7a60: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
7a70: 7d 0a 20 20 32 2e 34 20 22 53 45 4c 45 43 54 20  }.  2.4 "SELECT 
7a80: 63 6f 75 6e 74 28 2a 29 2c 20 2a 22 20 7b 6e 6f  count(*), *" {no
7a90: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
7aa0: 64 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63  d}.} {.  do_catc
7ab0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  hsql_test e_sele
7ac0: 63 74 2d 34 2e 32 2e 24 74 6e 20 24 73 65 6c 65  ct-4.2.$tn $sele
7ad0: 63 74 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d  ct [list 1 $err]
7ae0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
7af0: 46 3a 20 52 2d 30 38 36 36 39 2d 32 32 33 39 37  F: R-08669-22397
7b00: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
7b10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 6f  olumns in the ro
7b20: 77 73 20 72 65 74 75 72 6e 65 64 0a 23 20 62 79  ws returned.# by
7b30: 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54   a simple SELECT
7b40: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 71   statement is eq
7b50: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
7b60: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
7b70: 20 69 6e 0a 23 20 74 68 65 20 72 65 73 75 6c 74   in.# the result
7b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7b90: 20 61 66 74 65 72 20 73 75 62 73 74 69 74 75 74   after substitut
7ba0: 69 6f 6e 20 6f 66 20 2a 20 61 6e 64 20 61 6c 69  ion of * and ali
7bb0: 61 73 2e 2a 0a 23 20 65 78 70 72 65 73 73 69 6f  as.*.# expressio
7bc0: 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  ns..#.foreach {t
7bd0: 6e 20 73 65 6c 65 63 74 20 6e 43 6f 6c 7d 20 7b  n select nCol} {
7be0: 0a 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 2a  .  1   "SELECT *
7bf0: 20 46 52 4f 4d 20 7a 31 22 20 20 20 33 0a 20 20   FROM z1"   3.  
7c00: 32 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  2   "SELECT * FR
7c10: 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4a 4f  OM z1 NATURAL JO
7c20: 49 4e 20 7a 33 22 20 20 20 20 20 20 20 20 20 20  IN z3"          
7c30: 20 20 33 0a 20 20 33 20 20 20 22 53 45 4c 45 43    3.  3   "SELEC
7c40: 54 20 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 20 4e  T z1.* FROM z1 N
7c50: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 7a 33 22 20  ATURAL JOIN z3" 
7c60: 20 20 20 20 20 20 20 20 33 0a 20 20 34 20 20 20          3.  4   
7c70: 22 53 45 4c 45 43 54 20 7a 33 2e 2a 20 46 52 4f  "SELECT z3.* FRO
7c80: 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M z1 NATURAL JOI
7c90: 4e 20 7a 33 22 20 20 20 20 20 20 20 20 20 32 0a  N z3"         2.
7ca0: 20 20 35 20 20 20 22 53 45 4c 45 43 54 20 7a 31    5   "SELECT z1
7cb0: 2e 2a 2c 20 7a 33 2e 2a 20 46 52 4f 4d 20 7a 31  .*, z3.* FROM z1
7cc0: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 7a 33   NATURAL JOIN z3
7cd0: 22 20 20 20 35 0a 20 20 36 20 20 20 22 53 45 4c  "   5.  6   "SEL
7ce0: 45 43 54 20 31 2c 20 32 2c 20 7a 31 2e 2a 20 46  ECT 1, 2, z1.* F
7cf0: 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20 20 20  ROM z1"         
7d00: 20 20 20 20 20 20 20 20 20 20 35 0a 20 20 37 20            5.  7 
7d10: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 2a 2c 20    "SELECT a, *, 
7d20: 62 2c 20 63 20 46 52 4f 4d 20 7a 31 22 20 20 20  b, c FROM z1"   
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 36 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 74  6.} {.  set ::st
7d50: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
7d60: 61 72 65 5f 76 32 20 64 62 20 24 73 65 6c 65 63  are_v2 db $selec
7d70: 74 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 64 6f  t -1 DUMMY].  do
7d80: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34  _test e_select-4
7d90: 2e 33 2e 24 74 6e 20 7b 20 73 71 6c 69 74 65 33  .3.$tn { sqlite3
7da0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 24 3a  _column_count $:
7db0: 3a 73 74 6d 74 20 7d 20 24 6e 43 6f 6c 0a 20 20  :stmt } $nCol.  
7dc0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
7dd0: 20 24 3a 3a 73 74 6d 74 0a 7d 0a 0a 0a 0a 23 20   $::stmt.}....# 
7de0: 49 6e 20 6c 61 6e 67 5f 73 65 6c 65 63 74 2e 68  In lang_select.h
7df0: 74 6d 6c 2c 20 61 20 6e 6f 6e 2d 61 67 67 72 65  tml, a non-aggre
7e00: 67 61 74 65 20 71 75 65 72 79 20 69 73 20 64 65  gate query is de
7e10: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 73 69 6d  fined as any sim
7e20: 70 6c 65 20 53 45 4c 45 43 54 0a 23 20 74 68 61  ple SELECT.# tha
7e30: 74 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  t has no GROUP B
7e40: 59 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  Y clause and no 
7e50: 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
7e60: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73  sions in the res
7e70: 75 6c 74 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  ult.# expression
7e80: 20 6c 69 73 74 2e 20 4f 74 68 65 72 20 71 75 65   list. Other que
7e90: 72 69 65 73 20 61 72 65 20 61 67 67 72 65 67 61  ries are aggrega
7ea0: 74 65 20 71 75 65 72 69 65 73 2e 20 54 65 73 74  te queries. Test
7eb0: 20 63 61 73 65 73 0a 23 20 65 5f 73 65 6c 65 63   cases.# e_selec
7ec0: 74 2d 34 2e 34 2e 2a 20 74 68 72 6f 75 67 68 20  t-4.4.* through 
7ed0: 65 5f 73 65 6c 65 63 74 2d 34 2e 31 32 2e 2a 2c  e_select-4.12.*,
7ee0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 68 69 63   inclusive, whic
7ef0: 68 20 74 65 73 74 20 74 68 65 20 70 61 72 74 20  h test the part 
7f00: 6f 66 0a 23 20 73 69 6d 70 6c 65 20 53 45 4c 45  of.# simple SELE
7f10: 43 54 20 74 68 61 74 20 69 73 20 64 69 66 66 65  CT that is diffe
7f20: 72 65 6e 74 20 66 6f 72 20 61 67 67 72 65 67 61  rent for aggrega
7f30: 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
7f40: 67 61 74 65 20 71 75 65 72 69 65 73 0a 23 20 76  gate queries.# v
7f50: 65 72 69 66 79 20 28 69 6e 20 61 20 77 61 79 29  erify (in a way)
7f60: 20 74 68 61 74 20 74 68 65 73 65 20 64 65 66 69   that these defi
7f70: 6e 69 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73  nitions are cons
7f80: 69 73 74 65 6e 74 3a 0a 23 0a 23 20 45 56 49 44  istent:.#.# EVID
7f90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 36 33 37  ENCE-OF: R-20637
7fa0: 2d 34 33 34 36 33 20 41 20 73 69 6d 70 6c 65 20  -43463 A simple 
7fb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7fc0: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
7fd0: 0a 23 20 71 75 65 72 79 20 69 66 20 69 74 20 63  .# query if it c
7fe0: 6f 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20 61  ontains either a
7ff0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
8000: 20 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   or one or more 
8010: 61 67 67 72 65 67 61 74 65 0a 23 20 66 75 6e 63  aggregate.# func
8020: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73  tions in the res
8030: 75 6c 74 2d 73 65 74 2e 0a 23 0a 23 20 45 56 49  ult-set..#.# EVI
8040: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 31 35  DENCE-OF: R-2315
8050: 35 2d 35 35 35 39 37 20 4f 74 68 65 72 77 69 73  5-55597 Otherwis
8060: 65 2c 20 69 66 20 61 20 73 69 6d 70 6c 65 20 53  e, if a simple S
8070: 45 4c 45 43 54 20 63 6f 6e 74 61 69 6e 73 20 6e  ELECT contains n
8080: 6f 0a 23 20 61 67 67 72 65 67 61 74 65 20 66 75  o.# aggregate fu
8090: 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
80a0: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 69 74  UP BY clause, it
80b0: 20 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67   is a non-aggreg
80c0: 61 74 65 20 71 75 65 72 79 2e 0a 23 0a 0a 23 20  ate query..#..# 
80d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
80e0: 34 30 35 30 2d 34 37 33 36 32 20 49 66 20 74 68  4050-47362 If th
80f0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
8100: 6e 74 20 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72  nt is a non-aggr
8110: 65 67 61 74 65 0a 23 20 71 75 65 72 79 2c 20 74  egate.# query, t
8120: 68 65 6e 20 65 61 63 68 20 65 78 70 72 65 73 73  hen each express
8130: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
8140: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
8150: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 23  t is evaluated.#
8160: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
8170: 20 74 68 65 20 64 61 74 61 73 65 74 20 66 69 6c   the dataset fil
8180: 74 65 72 65 64 20 62 79 20 74 68 65 20 57 48 45  tered by the WHE
8190: 52 45 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f  RE clause..#.do_
81a0: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
81b0: 65 6c 65 63 74 2d 34 2e 34 20 7b 0a 20 20 31 20  elect-4.4 {.  1 
81c0: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
81d0: 4d 20 7a 31 22 0a 20 20 20 20 7b 35 31 2e 36 35  M z1".    {51.65
81e0: 20 2d 35 39 2e 35 38 20 2d 35 20 7b 7d 20 2d 32   -59.58 -5 {} -2
81f0: 2e 32 20 2d 32 33 2e 31 38 20 7b 7d 20 36 37 20  .2 -23.18 {} 67 
8200: 2d 31 2e 30 34 20 2d 33 32 2e 33 20 36 33 20 62  -1.04 -32.3 63 b
8210: 6f 72 6e 7d 0a 0a 20 20 32 20 22 53 45 4c 45 43  orn}..  2 "SELEC
8220: 54 20 61 20 49 53 20 4e 55 4c 4c 2c 20 62 2b 31  T a IS NULL, b+1
8230: 2c 20 2a 20 46 52 4f 4d 20 7a 31 22 20 7b 0a 20  , * FROM z1" {. 
8240: 20 20 20 20 20 20 20 30 20 2d 35 38 2e 35 38 20         0 -58.58 
8250: 20 20 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62    51.65 -59.58 b
8260: 65 6c 66 72 69 65 73 0a 20 20 20 20 20 20 20 20  elfries.        
8270: 30 20 7b 7d 20 20 20 20 20 20 20 2d 35 20 7b 7d  0 {}       -5 {}
8280: 20 37 35 20 20 20 20 20 20 20 20 20 20 20 20 0a   75            .
8290: 20 20 20 20 20 20 20 20 30 20 2d 32 32 2e 31 38          0 -22.18
82a0: 20 20 20 2d 32 2e 32 20 2d 32 33 2e 31 38 20 73     -2.2 -23.18 s
82b0: 75 69 74 65 72 73 0a 20 20 20 20 20 20 20 20 31  uiters.        1
82c0: 20 36 38 20 20 20 20 20 20 20 7b 7d 20 36 37 20   68       {} 67 
82d0: 71 75 61 72 74 65 74 73 20 20 20 20 0a 20 20 20  quartets    .   
82e0: 20 20 20 20 20 30 20 2d 33 31 2e 33 20 20 20 20       0 -31.3    
82f0: 2d 31 2e 30 34 20 2d 33 32 2e 33 20 61 73 70 65  -1.04 -32.3 aspe
8300: 6e 0a 20 20 20 20 20 20 20 20 30 20 31 20 20 20  n.        0 1   
8310: 20 20 20 20 20 36 33 20 62 6f 72 6e 20 2d 32 36       63 born -26
8320: 0a 20 20 7d 0a 0a 20 20 33 20 22 53 45 4c 45 43  .  }..  3 "SELEC
8330: 54 20 33 32 2a 33 32 2c 20 64 7c 7c 65 20 46 52  T 32*32, d||e FR
8340: 4f 4d 20 7a 32 22 20 7b 31 30 32 34 20 7b 7d 20  OM z2" {1024 {} 
8350: 31 30 32 34 20 33 36 36 7d 0a 7d 0a 0a 0a 23 20  1024 366}.}...# 
8360: 54 65 73 74 20 63 61 73 65 73 20 65 5f 73 65 6c  Test cases e_sel
8370: 65 63 74 2d 34 2e 35 2e 2a 20 61 6e 64 20 65 5f  ect-4.5.* and e_
8380: 73 65 6c 65 63 74 2d 34 2e 36 2e 2a 20 74 6f 67  select-4.6.* tog
8390: 65 74 68 65 72 20 73 68 6f 77 20 74 68 61 74 3a  ether show that:
83a0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
83b0: 3a 20 52 2d 35 31 39 38 38 2d 30 31 31 32 34 20  : R-51988-01124 
83c0: 54 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  The single row o
83d0: 66 20 72 65 73 75 6c 74 2d 73 65 74 20 64 61 74  f result-set dat
83e0: 61 20 63 72 65 61 74 65 64 0a 23 20 62 79 20 65  a created.# by e
83f0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 61 67  valuating the ag
8400: 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
8410: 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
8420: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 23 20 72  sions in the.# r
8430: 65 73 75 6c 74 2d 73 65 74 20 66 6f 72 6d 73 20  esult-set forms 
8440: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  the result of an
8450: 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
8460: 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
8470: 20 42 59 0a 23 20 63 6c 61 75 73 65 2e 0a 23 0a   BY.# clause..#.
8480: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8490: 52 2d 35 37 36 32 39 2d 32 35 32 35 33 20 49 66  R-57629-25253 If
84a0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
84b0: 65 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ement is an aggr
84c0: 65 67 61 74 65 0a 23 20 71 75 65 72 79 20 77 69  egate.# query wi
84d0: 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
84e0: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 65 61   clause, then ea
84f0: 63 68 20 61 67 67 72 65 67 61 74 65 20 65 78 70  ch aggregate exp
8500: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 23  ression in the.#
8510: 20 72 65 73 75 6c 74 2d 73 65 74 20 69 73 20 65   result-set is e
8520: 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 63  valuated once ac
8530: 72 6f 73 73 20 74 68 65 20 65 6e 74 69 72 65 20  ross the entire 
8540: 64 61 74 61 73 65 74 2e 0a 23 0a 64 6f 5f 73 65  dataset..#.do_se
8550: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
8560: 65 63 74 2d 34 2e 35 20 7b 0a 20 20 31 20 22 53  ect-4.5 {.  1 "S
8570: 45 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20  ELECT count(a), 
8580: 6d 61 78 28 61 29 2c 20 63 6f 75 6e 74 28 62 29  max(a), count(b)
8590: 2c 20 6d 61 78 28 62 29 20 46 52 4f 4d 20 7a 31  , max(b) FROM z1
85a0: 22 20 20 20 20 20 20 7b 35 20 36 33 20 35 20 62  "      {5 63 5 b
85b0: 6f 72 6e 7d 0a 20 20 32 20 22 53 45 4c 45 43 54  orn}.  2 "SELECT
85c0: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 31   count(*), max(1
85d0: 29 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )"              
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 7b 31 20 31 7d 0a 0a 20 20 33 20 22 53 45    {1 1}..  3 "SE
8600: 4c 45 43 54 20 73 75 6d 28 62 2b 31 29 20 46 52  LECT sum(b+1) FR
8610: 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4c 45  OM z1 NATURAL LE
8620: 46 54 20 4a 4f 49 4e 20 7a 33 22 20 20 20 20 20  FT JOIN z3"     
8630: 20 20 20 20 20 20 7b 2d 34 33 2e 30 36 7d 0a 20        {-43.06}. 
8640: 20 34 20 22 53 45 4c 45 43 54 20 73 75 6d 28 62   4 "SELECT sum(b
8650: 2b 32 29 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55  +2) FROM z1 NATU
8660: 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 7a 33  RAL LEFT JOIN z3
8670: 22 20 20 20 20 20 20 20 20 20 20 20 7b 2d 33 38  "           {-38
8680: 2e 30 36 7d 0a 20 20 35 20 22 53 45 4c 45 43 54  .06}.  5 "SELECT
8690: 20 73 75 6d 28 62 20 49 53 20 4e 4f 54 20 4e 55   sum(b IS NOT NU
86a0: 4c 4c 29 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55  LL) FROM z1 NATU
86b0: 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 7a 33  RAL LEFT JOIN z3
86c0: 22 20 7b 35 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  " {5}.}..# EVIDE
86d0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 36 38 34 2d  NCE-OF: R-26684-
86e0: 34 30 35 37 36 20 45 61 63 68 20 6e 6f 6e 2d 61  40576 Each non-a
86f0: 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
8700: 69 6f 6e 20 69 6e 20 74 68 65 0a 23 20 72 65 73  ion in the.# res
8710: 75 6c 74 2d 73 65 74 20 69 73 20 65 76 61 6c 75  ult-set is evalu
8720: 61 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 61 6e  ated once for an
8730: 20 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c   arbitrarily sel
8740: 65 63 74 65 64 20 72 6f 77 20 6f 66 20 74 68 65  ected row of the
8750: 0a 23 20 64 61 74 61 73 65 74 2e 0a 23 0a 23 20  .# dataset..#.# 
8760: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
8770: 37 39 39 34 2d 36 30 33 37 36 20 54 68 65 20 73  7994-60376 The s
8780: 61 6d 65 20 61 72 62 69 74 72 61 72 69 6c 79 20  ame arbitrarily 
8790: 73 65 6c 65 63 74 65 64 20 72 6f 77 20 69 73 20  selected row is 
87a0: 75 73 65 64 0a 23 20 66 6f 72 20 65 61 63 68 20  used.# for each 
87b0: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 65 78  non-aggregate ex
87c0: 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20 20 20  pression..#.#   
87d0: 4e 6f 74 65 3a 20 54 68 65 20 72 65 73 75 6c 74  Note: The result
87e0: 73 20 6f 66 20 6d 61 6e 79 20 6f 66 20 74 68 65  s of many of the
87f0: 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 69 73   queries in this
8800: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
8810: 61 72 65 0a 23 20 20 20 74 65 63 68 6e 69 63 61  are.#   technica
8820: 6c 6c 79 20 75 6e 64 65 66 69 6e 65 64 2c 20 61  lly undefined, a
8830: 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  s the documentat
8840: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 73 70 65  ion does not spe
8850: 63 69 66 79 20 77 68 69 63 68 20 72 6f 77 0a 23  cify which row.#
8860: 20 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 61     SQLite will a
8870: 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65 63  rbitrarily selec
8880: 74 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  t to use for the
8890: 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74   evaluation of t
88a0: 68 65 0a 23 20 20 20 6e 6f 6e 2d 61 67 67 72 65  he.#   non-aggre
88b0: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
88c0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
88d0: 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  les.do_execsql_t
88e0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 36  est e_select-4.6
88f0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
8900: 42 4c 45 20 61 31 28 6f 6e 65 20 50 52 49 4d 41  BLE a1(one PRIMA
8910: 52 59 20 4b 45 59 2c 20 74 77 6f 29 3b 0a 20 20  RY KEY, two);.  
8920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 31 20 56  INSERT INTO a1 V
8930: 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 49  ALUES(1, 1);.  I
8940: 4e 53 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41  NSERT INTO a1 VA
8950: 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 49 4e  LUES(2, 3);.  IN
8960: 53 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c  SERT INTO a1 VAL
8970: 55 45 53 28 33 2c 20 36 29 3b 0a 20 20 49 4e 53  UES(3, 6);.  INS
8980: 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c 55  ERT INTO a1 VALU
8990: 45 53 28 34 2c 20 31 30 29 3b 0a 0a 20 20 43 52  ES(4, 10);..  CR
89a0: 45 41 54 45 20 54 41 42 4c 45 20 61 32 28 6f 6e  EATE TABLE a2(on
89b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  e PRIMARY KEY, t
89c0: 68 72 65 65 29 3b 0a 20 20 49 4e 53 45 52 54 20  hree);.  INSERT 
89d0: 49 4e 54 4f 20 61 32 20 56 41 4c 55 45 53 28 31  INTO a2 VALUES(1
89e0: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
89f0: 4e 54 4f 20 61 32 20 56 41 4c 55 45 53 28 33 2c  NTO a2 VALUES(3,
8a00: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
8a10: 54 4f 20 61 32 20 56 41 4c 55 45 53 28 36 2c 20  TO a2 VALUES(6, 
8a20: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
8a30: 4f 20 61 32 20 56 41 4c 55 45 53 28 31 30 2c 20  O a2 VALUES(10, 
8a40: 34 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65  4);.} {}.do_sele
8a50: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
8a60: 74 2d 34 2e 36 20 7b 0a 20 20 31 20 22 53 45 4c  t-4.6 {.  1 "SEL
8a70: 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f  ECT one, two, co
8a80: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 22 20  unt(*) FROM a1" 
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 20 20 20 7b 34 20 31 30 20 34 7d 20         {4 10 4} 
8ab0: 0a 20 20 32 20 22 53 45 4c 45 43 54 20 6f 6e 65  .  2 "SELECT one
8ac0: 2c 20 74 77 6f 2c 20 63 6f 75 6e 74 28 2a 29 20  , two, count(*) 
8ad0: 46 52 4f 4d 20 61 31 20 57 48 45 52 45 20 6f 6e  FROM a1 WHERE on
8ae0: 65 3c 33 22 20 20 20 20 20 20 20 20 20 20 20 20  e<3"            
8af0: 7b 32 20 33 20 32 7d 20 0a 20 20 33 20 22 53 45  {2 3 2} .  3 "SE
8b00: 4c 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 63  LECT one, two, c
8b10: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 20  ount(*) FROM a1 
8b20: 57 48 45 52 45 20 6f 6e 65 3e 33 22 20 20 20 20  WHERE one>3"    
8b30: 20 20 20 20 20 20 20 20 7b 34 20 31 30 20 31 7d          {4 10 1}
8b40: 20 0a 20 20 34 20 22 53 45 4c 45 43 54 20 2a 2c   .  4 "SELECT *,
8b50: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
8b60: 31 20 4a 4f 49 4e 20 61 32 22 20 20 20 20 20 20  1 JOIN a2"      
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 7b 34 20 31 30 20 31 30 20 34 20 31 36 7d 20   {4 10 10 4 16} 
8b90: 0a 20 20 35 20 22 53 45 4c 45 43 54 20 2a 2c 20  .  5 "SELECT *, 
8ba0: 73 75 6d 28 74 68 72 65 65 29 20 46 52 4f 4d 20  sum(three) FROM 
8bb0: 61 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  a1 NATURAL JOIN 
8bc0: 61 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20  a2"             
8bd0: 7b 33 20 36 20 32 20 33 7d 0a 20 20 36 20 22 53  {3 6 2 3}.  6 "S
8be0: 45 4c 45 43 54 20 2a 2c 20 73 75 6d 28 74 68 72  ELECT *, sum(thr
8bf0: 65 65 29 20 46 52 4f 4d 20 61 31 20 4e 41 54 55  ee) FROM a1 NATU
8c00: 52 41 4c 20 4a 4f 49 4e 20 61 32 22 20 20 20 20  RAL JOIN a2"    
8c10: 20 20 20 20 20 20 20 20 20 7b 33 20 36 20 32 20           {3 6 2 
8c20: 33 7d 0a 20 20 37 20 22 53 45 4c 45 43 54 20 67  3}.  7 "SELECT g
8c30: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 74 68 72 65  roup_concat(thre
8c40: 65 2c 20 27 27 29 2c 20 61 31 2e 2a 20 46 52 4f  e, ''), a1.* FRO
8c50: 4d 20 61 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M a1 NATURAL JOI
8c60: 4e 20 61 32 22 20 7b 31 32 20 33 20 36 7d 0a 7d  N a2" {12 3 6}.}
8c70: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8c80: 20 52 2d 30 34 34 38 36 2d 30 37 32 36 36 20 4f   R-04486-07266 O
8c90: 72 2c 20 69 66 20 74 68 65 20 64 61 74 61 73 65  r, if the datase
8ca0: 74 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  t contains zero 
8cb0: 72 6f 77 73 2c 20 74 68 65 6e 0a 23 20 65 61 63  rows, then.# eac
8cc0: 68 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  h non-aggregate 
8cd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
8ce0: 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20  aluated against 
8cf0: 61 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e 67  a row consisting
8d00: 0a 23 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 4e  .# entirely of N
8d10: 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 64 6f  ULL values..#.do
8d20: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
8d30: 73 65 6c 65 63 74 2d 34 2e 37 20 7b 0a 20 20 31  select-4.7 {.  1
8d40: 20 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20 74    "SELECT one, t
8d50: 77 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  wo, count(*) FRO
8d60: 4d 20 61 31 20 57 48 45 52 45 20 30 22 20 20 20  M a1 WHERE 0"   
8d70: 20 20 20 20 20 20 20 20 7b 7b 7d 20 7b 7d 20 30          {{} {} 0
8d80: 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 73  }.  2  "SELECT s
8d90: 75 6d 28 74 77 6f 29 2c 20 2a 20 46 52 4f 4d 20  um(two), * FROM 
8da0: 61 31 2c 20 61 32 20 57 48 45 52 45 20 74 68 72  a1, a2 WHERE thr
8db0: 65 65 3e 35 22 20 20 20 20 20 20 20 20 7b 7b 7d  ee>5"        {{}
8dc0: 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20   {} {} {} {}}.  
8dd0: 33 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 6f  3  "SELECT max(o
8de0: 6e 65 29 20 49 53 20 4e 55 4c 4c 2c 20 6f 6e 65  ne) IS NULL, one
8df0: 20 49 53 20 4e 55 4c 4c 2c 20 74 77 6f 20 49 53   IS NULL, two IS
8e00: 20 4e 55 4c 4c 20 46 52 4f 4d 20 61 31 20 57 48   NULL FROM a1 WH
8e10: 45 52 45 20 74 77 6f 3d 37 22 20 7b 0a 20 20 20  ERE two=7" {.   
8e20: 20 31 20 31 20 31 0a 20 20 7d 0a 7d 20 0a 0a 23   1 1 1.  }.} ..#
8e30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8e40: 36 34 31 33 38 2d 32 38 37 37 34 20 41 6e 20 61  64138-28774 An a
8e50: 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 77  ggregate query w
8e60: 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
8e70: 59 0a 23 20 63 6c 61 75 73 65 20 61 6c 77 61 79  Y.# clause alway
8e80: 73 20 72 65 74 75 72 6e 73 20 65 78 61 63 74 6c  s returns exactl
8e90: 79 20 6f 6e 65 20 72 6f 77 20 6f 66 20 64 61 74  y one row of dat
8ea0: 61 2c 20 65 76 65 6e 20 69 66 20 74 68 65 72 65  a, even if there
8eb0: 20 61 72 65 20 7a 65 72 6f 0a 23 20 72 6f 77 73   are zero.# rows
8ec0: 20 6f 66 20 69 6e 70 75 74 20 64 61 74 61 2e 0a   of input data..
8ed0: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  #.foreach {tn se
8ee0: 6c 65 63 74 7d 20 7b 0a 20 20 38 2e 31 20 20 22  lect} {.  8.1  "
8ef0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
8f00: 46 52 4f 4d 20 61 31 22 0a 20 20 38 2e 32 20 20  FROM a1".  8.2  
8f10: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
8f20: 20 46 52 4f 4d 20 61 31 20 57 48 45 52 45 20 30   FROM a1 WHERE 0
8f30: 22 0a 20 20 38 2e 33 20 20 22 53 45 4c 45 43 54  ".  8.3  "SELECT
8f40: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
8f50: 31 20 57 48 45 52 45 20 31 22 0a 20 20 38 2e 34  1 WHERE 1".  8.4
8f60: 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61 31    "SELECT max(a1
8f70: 2e 6f 6e 65 29 2b 6d 69 6e 28 74 77 6f 29 2c 20  .one)+min(two), 
8f80: 61 31 2e 6f 6e 65 2c 20 74 77 6f 2c 20 2a 20 46  a1.one, two, * F
8f90: 52 4f 4d 20 61 31 2c 20 61 32 20 57 48 45 52 45  ROM a1, a2 WHERE
8fa0: 20 31 22 0a 20 20 38 2e 35 20 20 22 53 45 4c 45   1".  8.5  "SELE
8fb0: 43 54 20 6d 61 78 28 61 31 2e 6f 6e 65 29 2b 6d  CT max(a1.one)+m
8fc0: 69 6e 28 74 77 6f 29 2c 20 61 31 2e 6f 6e 65 2c  in(two), a1.one,
8fd0: 20 74 77 6f 2c 20 2a 20 46 52 4f 4d 20 61 31 2c   two, * FROM a1,
8fe0: 20 61 32 20 57 48 45 52 45 20 30 22 0a 7d 20 7b   a2 WHERE 0".} {
8ff0: 0a 20 20 23 20 53 65 74 20 24 6e 52 6f 77 20 74  .  # Set $nRow t
9000: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
9010: 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79  rows returned by
9020: 20 24 73 65 6c 65 63 74 3a 0a 20 20 73 65 74 20   $select:.  set 
9030: 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f  ::stmt [sqlite3_
9040: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 24 73  prepare_v2 db $s
9050: 65 6c 65 63 74 20 2d 31 20 44 55 4d 4d 59 5d 0a  elect -1 DUMMY].
9060: 20 20 73 65 74 20 6e 52 6f 77 20 30 0a 20 20 77    set nRow 0.  w
9070: 68 69 6c 65 20 7b 22 53 51 4c 49 54 45 5f 52 4f  hile {"SQLITE_RO
9080: 57 22 20 3d 3d 20 5b 73 71 6c 69 74 65 33 5f 73  W" == [sqlite3_s
9090: 74 65 70 20 24 3a 3a 73 74 6d 74 5d 7d 20 7b 20  tep $::stmt]} { 
90a0: 69 6e 63 72 20 6e 52 6f 77 20 7d 0a 20 20 73 65  incr nRow }.  se
90b0: 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66 69  t rc [sqlite3_fi
90c0: 6e 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74 5d 0a  nalize $::stmt].
90d0: 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20 24  .  # Test that $
90e0: 6e 52 6f 77 3d 3d 31 20 61 6e 64 20 74 68 61 74  nRow==1 and that
90f0: 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75   statement execu
9100: 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
9110: 66 75 6c 20 0a 20 20 23 20 28 72 63 3d 3d 53 51  ful .  # (rc==SQ
9120: 4c 49 54 45 5f 4f 4b 29 2e 0a 20 20 64 6f 5f 74  LITE_OK)..  do_t
9130: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 24  est e_select-4.$
9140: 74 6e 20 5b 6c 69 73 74 20 6c 69 73 74 20 24 72  tn [list list $r
9150: 63 20 24 6e 52 6f 77 5d 20 7b 53 51 4c 49 54 45  c $nRow] {SQLITE
9160: 5f 4f 4b 20 31 7d 0a 7d 0a 0a 64 72 6f 70 5f 61  _OK 1}.}..drop_a
9170: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65  ll_tables.do_exe
9180: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
9190: 63 74 2d 34 2e 39 2e 30 20 7b 0a 20 20 43 52 45  ct-4.9.0 {.  CRE
91a0: 41 54 45 20 54 41 42 4c 45 20 62 31 28 6f 6e 65  ATE TABLE b1(one
91b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 77   PRIMARY KEY, tw
91c0: 6f 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  o);.  INSERT INT
91d0: 4f 20 62 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O b1 VALUES(1, '
91e0: 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
91f0: 54 4f 20 62 31 20 56 41 4c 55 45 53 28 34 2c 20  TO b1 VALUES(4, 
9200: 27 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'f');.  INSERT I
9210: 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 33 2c  NTO b1 VALUES(3,
9220: 20 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   't');.  INSERT 
9230: 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 32  INTO b1 VALUES(2
9240: 2c 20 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 't');.  INSERT
9250: 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28   INTO b1 VALUES(
9260: 35 2c 20 27 66 27 29 3b 0a 20 20 49 4e 53 45 52  5, 'f');.  INSER
9270: 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53  T INTO b1 VALUES
9280: 28 37 2c 20 27 73 27 29 3b 0a 20 20 49 4e 53 45  (7, 's');.  INSE
9290: 52 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  RT INTO b1 VALUE
92a0: 53 28 36 2c 20 27 73 27 29 3b 0a 0a 20 20 43 52  S(6, 's');..  CR
92b0: 45 41 54 45 20 54 41 42 4c 45 20 62 32 28 78 2c  EATE TABLE b2(x,
92c0: 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   y);.  INSERT IN
92d0: 54 4f 20 62 32 20 56 41 4c 55 45 53 28 4e 55 4c  TO b2 VALUES(NUL
92e0: 4c 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  L, 0);.  INSERT 
92f0: 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28 4e  INTO b2 VALUES(N
9300: 55 4c 4c 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  ULL, 1);.  INSER
9310: 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53  T INTO b2 VALUES
9320: 28 27 78 79 7a 27 2c 20 32 29 3b 0a 20 20 49 4e  ('xyz', 2);.  IN
9330: 53 45 52 54 20 49 4e 54 4f 20 62 32 20 56 41 4c  SERT INTO b2 VAL
9340: 55 45 53 28 27 61 62 63 27 2c 20 33 29 3b 0a 20  UES('abc', 3);. 
9350: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 32 20   INSERT INTO b2 
9360: 56 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 34 29  VALUES('xyz', 4)
9370: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
9380: 45 20 62 33 28 61 20 43 4f 4c 4c 41 54 45 20 6e  E b3(a COLLATE n
9390: 6f 63 61 73 65 2c 20 62 20 43 4f 4c 4c 41 54 45  ocase, b COLLATE
93a0: 20 62 69 6e 61 72 79 29 3b 0a 20 20 49 4e 53 45   binary);.  INSE
93b0: 52 54 20 49 4e 54 4f 20 62 33 20 56 41 4c 55 45  RT INTO b3 VALUE
93c0: 53 28 27 61 62 63 27 2c 20 27 61 62 63 27 29 3b  S('abc', 'abc');
93d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62  .  INSERT INTO b
93e0: 33 20 56 41 4c 55 45 53 28 27 61 42 43 27 2c 20  3 VALUES('aBC', 
93f0: 27 61 42 43 27 29 3b 0a 20 20 49 4e 53 45 52 54  'aBC');.  INSERT
9400: 20 49 4e 54 4f 20 62 33 20 56 41 4c 55 45 53 28   INTO b3 VALUES(
9410: 27 44 65 66 27 2c 20 27 44 65 66 27 29 3b 0a 20  'Def', 'Def');. 
9420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 33 20   INSERT INTO b3 
9430: 56 41 4c 55 45 53 28 27 64 45 46 27 2c 20 27 64  VALUES('dEF', 'd
9440: 45 46 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56  EF');.} {}..# EV
9450: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32  IDENCE-OF: R-072
9460: 38 34 2d 33 35 39 39 30 20 49 66 20 74 68 65 20  84-35990 If the 
9470: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9480: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
9490: 0a 23 20 71 75 65 72 79 20 77 69 74 68 20 61 20  .# query with a 
94a0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2c  GROUP BY clause,
94b0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 20 74 68   then each of th
94c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 70  e expressions sp
94d0: 65 63 69 66 69 65 64 0a 23 20 61 73 20 70 61 72  ecified.# as par
94e0: 74 20 6f 66 20 74 68 65 20 47 52 4f 55 50 20 42  t of the GROUP B
94f0: 59 20 63 6c 61 75 73 65 20 69 73 20 65 76 61 6c  Y clause is eval
9500: 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
9510: 6f 77 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61  ow of the.# data
9520: 73 65 74 2e 20 45 61 63 68 20 72 6f 77 20 69 73  set. Each row is
9530: 20 74 68 65 6e 20 61 73 73 69 67 6e 65 64 20 74   then assigned t
9540: 6f 20 61 20 22 67 72 6f 75 70 22 20 62 61 73 65  o a "group" base
9550: 64 20 6f 6e 20 74 68 65 20 72 65 73 75 6c 74 73  d on the results
9560: 3b 0a 23 20 72 6f 77 73 20 66 6f 72 20 77 68 69  ;.# rows for whi
9570: 63 68 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ch the results o
9580: 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  f evaluating the
9590: 20 47 52 4f 55 50 20 42 59 20 65 78 70 72 65 73   GROUP BY expres
95a0: 73 69 6f 6e 73 20 61 72 65 0a 23 20 74 68 65 20  sions are.# the 
95b0: 73 61 6d 65 20 67 65 74 20 61 73 73 69 67 6e 65  same get assigne
95c0: 64 20 74 6f 20 74 68 65 20 73 61 6d 65 20 67 72  d to the same gr
95d0: 6f 75 70 2e 0a 23 0a 23 20 20 20 54 68 65 73 65  oup..#.#   These
95e0: 20 74 65 73 74 73 20 61 6c 73 6f 20 73 68 6f 77   tests also show
95f0: 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77   that the follow
9600: 69 6e 67 20 69 73 20 6e 6f 74 20 75 6e 74 72 75  ing is not untru
9610: 65 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e:.#.# EVIDENCE-
9620: 4f 46 3a 20 52 2d 32 35 38 38 33 2d 35 35 30 36  OF: R-25883-5506
9630: 33 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  3 The expression
9640: 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
9650: 59 20 63 6c 61 75 73 65 20 64 6f 0a 23 20 6e 6f  Y clause do.# no
9660: 74 20 68 61 76 65 20 74 6f 20 62 65 20 65 78 70  t have to be exp
9670: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 70  ressions that ap
9680: 70 65 61 72 20 69 6e 20 74 68 65 20 72 65 73 75  pear in the resu
9690: 6c 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  lt..#.do_select_
96a0: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34  tests e_select-4
96b0: 2e 39 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43  .9 {.  1  "SELEC
96c0: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 6f  T group_concat(o
96d0: 6e 65 29 2c 20 74 77 6f 20 46 52 4f 4d 20 62 31  ne), two FROM b1
96e0: 20 47 52 4f 55 50 20 42 59 20 74 77 6f 22 20 7b   GROUP BY two" {
96f0: 0a 20 20 20 20 2f 23 2c 23 20 66 20 20 20 31 20  .    /#,# f   1 
9700: 6f 20 20 20 23 2c 23 20 20 20 73 20 23 2c 23 20  o   #,#   s #,# 
9710: 74 2f 0a 20 20 7d 0a 20 20 32 20 20 22 53 45 4c  t/.  }.  2  "SEL
9720: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
9730: 28 6f 6e 65 29 2c 20 73 75 6d 28 6f 6e 65 29 20  (one), sum(one) 
9740: 46 52 4f 4d 20 62 31 20 47 52 4f 55 50 20 42 59  FROM b1 GROUP BY
9750: 20 28 6f 6e 65 3e 34 29 22 20 7b 0a 20 20 20 20   (one>4)" {.    
9760: 31 2c 32 2c 33 2c 34 20 31 30 20 20 20 20 35 2c  1,2,3,4 10    5,
9770: 36 2c 37 20 31 38 0a 20 20 7d 0a 20 20 33 20 20  6,7 18.  }.  3  
9780: 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f  "SELECT group_co
9790: 6e 63 61 74 28 6f 6e 65 29 20 46 52 4f 4d 20 62  ncat(one) FROM b
97a0: 31 20 47 52 4f 55 50 20 42 59 20 28 74 77 6f 3e  1 GROUP BY (two>
97b0: 27 6f 27 29 2c 20 6f 6e 65 25 32 22 20 7b 0a 20  'o'), one%2" {. 
97c0: 20 20 20 34 20 20 31 2c 35 20 20 20 20 32 2c 36     4  1,5    2,6
97d0: 20 20 20 33 2c 37 0a 20 20 7d 0a 20 20 34 20 20     3,7.  }.  4  
97e0: 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f  "SELECT group_co
97f0: 6e 63 61 74 28 6f 6e 65 29 20 46 52 4f 4d 20 62  ncat(one) FROM b
9800: 31 20 47 52 4f 55 50 20 42 59 20 28 6f 6e 65 3d  1 GROUP BY (one=
9810: 3d 32 20 4f 52 20 74 77 6f 3d 3d 27 6f 27 29 22  =2 OR two=='o')"
9820: 20 7b 0a 20 20 20 20 34 2c 33 2c 35 2c 37 2c 36   {.    4,3,5,7,6
9830: 20 20 20 20 31 2c 32 0a 20 20 7d 0a 7d 0a 0a 23      1,2.  }.}..#
9840: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9850: 31 34 39 32 36 2d 35 30 31 32 39 20 46 6f 72 20  14926-50129 For 
9860: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
9870: 67 72 6f 75 70 69 6e 67 20 72 6f 77 73 2c 20 4e  grouping rows, N
9880: 55 4c 4c 0a 23 20 76 61 6c 75 65 73 20 61 72 65  ULL.# values are
9890: 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
98a0: 6c 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  l..#.do_select_t
98b0: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e  ests e_select-4.
98c0: 31 30 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43  10 {.  1  "SELEC
98d0: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 79  T group_concat(y
98e0: 29 20 46 52 4f 4d 20 62 32 20 47 52 4f 55 50 20  ) FROM b2 GROUP 
98f0: 42 59 20 78 22 20 7b 2f 23 2c 23 20 20 20 33 20  BY x" {/#,#   3 
9900: 20 20 23 2c 23 2f 7d 0a 20 20 32 20 20 22 53 45    #,#/}.  2  "SE
9910: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9920: 4f 4d 20 62 32 20 47 52 4f 55 50 20 42 59 20 43  OM b2 GROUP BY C
9930: 41 53 45 20 57 48 45 4e 20 79 3c 34 20 54 48 45  ASE WHEN y<4 THE
9940: 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 30 20 45 4e  N NULL ELSE 0 EN
9950: 44 22 20 7b 34 20 31 7d 0a 7d 20 0a 0a 23 20 45  D" {4 1}.} ..# E
9960: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 30  VIDENCE-OF: R-10
9970: 34 37 30 2d 33 30 33 31 38 20 54 68 65 20 75 73  470-30318 The us
9980: 75 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 73 65  ual rules for se
9990: 6c 65 63 74 69 6e 67 20 61 20 63 6f 6c 6c 61 74  lecting a collat
99a0: 69 6f 6e 0a 23 20 73 65 71 75 65 6e 63 65 20 77  ion.# sequence w
99b0: 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6d  ith which to com
99c0: 70 61 72 65 20 74 65 78 74 20 76 61 6c 75 65 73  pare text values
99d0: 20 61 70 70 6c 79 20 77 68 65 6e 20 65 76 61 6c   apply when eval
99e0: 75 61 74 69 6e 67 0a 23 20 65 78 70 72 65 73 73  uating.# express
99f0: 69 6f 6e 73 20 69 6e 20 61 20 47 52 4f 55 50 20  ions in a GROUP 
9a00: 42 59 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f  BY clause..#.do_
9a10: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
9a20: 65 6c 65 63 74 2d 34 2e 31 31 20 7b 0a 20 20 31  elect-4.11 {.  1
9a30: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
9a40: 2a 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55 50  *) FROM b3 GROUP
9a50: 20 42 59 20 62 22 20 20 20 20 20 20 7b 31 20 31   BY b"      {1 1
9a60: 20 31 20 31 7d 0a 20 20 32 20 20 22 53 45 4c 45   1 1}.  2  "SELE
9a70: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9a80: 20 62 33 20 47 52 4f 55 50 20 42 59 20 61 22 20   b3 GROUP BY a" 
9a90: 20 20 20 20 20 7b 32 20 32 7d 0a 20 20 33 20 20       {2 2}.  3  
9aa0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
9ab0: 20 46 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42   FROM b3 GROUP B
9ac0: 59 20 2b 62 22 20 20 20 20 20 7b 31 20 31 20 31  Y +b"     {1 1 1
9ad0: 20 31 7d 0a 20 20 34 20 20 22 53 45 4c 45 43 54   1}.  4  "SELECT
9ae0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62   count(*) FROM b
9af0: 33 20 47 52 4f 55 50 20 42 59 20 2b 61 22 20 20  3 GROUP BY +a"  
9b00: 20 20 20 7b 32 20 32 7d 0a 20 20 35 20 20 22 53     {2 2}.  5  "S
9b10: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9b20: 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20  ROM b3 GROUP BY 
9b30: 62 7c 7c 27 27 22 20 20 7b 31 20 31 20 31 20 31  b||''"  {1 1 1 1
9b40: 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 63  }.  6  "SELECT c
9b50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 33 20  ount(*) FROM b3 
9b60: 47 52 4f 55 50 20 42 59 20 61 7c 7c 27 27 22 20  GROUP BY a||''" 
9b70: 20 7b 31 20 31 20 31 20 31 7d 0a 7d 0a 0a 23 20   {1 1 1 1}.}..# 
9b80: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
9b90: 33 35 37 33 2d 35 30 37 33 30 20 54 68 65 20 65  3573-50730 The e
9ba0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 61 20  xpressions in a 
9bb0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9bc0: 6d 61 79 0a 23 20 6e 6f 74 20 62 65 20 61 67 67  may.# not be agg
9bd0: 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f  regate expressio
9be0: 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  ns..#.foreach {t
9bf0: 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31 32  n select} {.  12
9c00: 2e 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .1  "SELECT * FR
9c10: 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20 63  OM b3 GROUP BY c
9c20: 6f 75 6e 74 28 2a 29 22 0a 20 20 31 32 2e 32 20  ount(*)".  12.2 
9c30: 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20   "SELECT max(a) 
9c40: 46 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59  FROM b3 GROUP BY
9c50: 20 6d 61 78 28 62 29 22 0a 20 20 31 32 2e 33 20   max(b)".  12.3 
9c60: 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   "SELECT group_c
9c70: 6f 6e 63 61 74 28 61 29 20 46 52 4f 4d 20 62 33  oncat(a) FROM b3
9c80: 20 47 52 4f 55 50 20 42 59 20 61 2c 20 6d 61 78   GROUP BY a, max
9c90: 28 62 29 22 0a 7d 20 7b 0a 20 20 73 65 74 20 72  (b)".} {.  set r
9ca0: 65 73 20 7b 31 20 7b 61 67 67 72 65 67 61 74 65  es {1 {aggregate
9cb0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e   functions are n
9cc0: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  ot allowed in th
9cd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
9ce0: 65 7d 7d 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  e}}.  do_catchsq
9cf0: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
9d00: 34 2e 24 74 6e 20 24 73 65 6c 65 63 74 20 24 72  4.$tn $select $r
9d10: 65 73 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  es.}..# EVIDENCE
9d20: 2d 4f 46 3a 20 52 2d 33 31 35 33 37 2d 30 30 31  -OF: R-31537-001
9d30: 30 31 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  01 If a HAVING c
9d40: 6c 61 75 73 65 20 69 73 20 73 70 65 63 69 66 69  lause is specifi
9d50: 65 64 2c 20 69 74 20 69 73 0a 23 20 65 76 61 6c  ed, it is.# eval
9d60: 75 61 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  uated once for e
9d70: 61 63 68 20 67 72 6f 75 70 20 6f 66 20 72 6f 77  ach group of row
9d80: 73 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 65  s as a boolean e
9d90: 78 70 72 65 73 73 69 6f 6e 2e 20 49 66 20 74 68  xpression. If th
9da0: 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 65 76  e.# result of ev
9db0: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 48 41 56  aluating the HAV
9dc0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 66 61  ING clause is fa
9dd0: 6c 73 65 2c 20 74 68 65 20 67 72 6f 75 70 20 69  lse, the group i
9de0: 73 0a 23 20 64 69 73 63 61 72 64 65 64 2e 0a 23  s.# discarded..#
9df0: 0a 23 20 20 20 54 68 69 73 20 72 65 71 75 69 72  .#   This requir
9e00: 65 6d 65 6e 74 20 69 73 20 74 65 73 74 65 64 20  ement is tested 
9e10: 62 79 20 61 6c 6c 20 65 5f 73 65 6c 65 63 74 2d  by all e_select-
9e20: 34 2e 31 33 2e 2a 20 74 65 73 74 73 2e 0a 23 0a  4.13.* tests..#.
9e30: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9e40: 2d 30 34 31 33 32 2d 30 39 34 37 34 20 49 66 20  -04132-09474 If 
9e50: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
9e60: 65 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  e is an aggregat
9e70: 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  e.# expression, 
9e80: 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  it is evaluated 
9e90: 61 63 72 6f 73 73 20 61 6c 6c 20 72 6f 77 73 20  across all rows 
9ea0: 69 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a  in the group..#.
9eb0: 23 20 20 20 54 65 73 74 65 64 20 62 79 20 65 5f  #   Tested by e_
9ec0: 73 65 6c 65 63 74 2d 34 2e 31 33 2e 31 2e 2a 0a  select-4.13.1.*.
9ed0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
9ee0: 20 52 2d 32 38 32 36 32 2d 34 37 34 34 37 20 49   R-28262-47447 I
9ef0: 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  f a HAVING claus
9f00: 65 20 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72 65  e is a non-aggre
9f10: 67 61 74 65 0a 23 20 65 78 70 72 65 73 73 69 6f  gate.# expressio
9f20: 6e 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  n, it is evaluat
9f30: 65 64 20 77 69 74 68 20 72 65 73 70 65 63 74 20  ed with respect 
9f40: 74 6f 20 61 6e 20 61 72 62 69 74 72 61 72 69 6c  to an arbitraril
9f50: 79 20 73 65 6c 65 63 74 65 64 0a 23 20 72 6f 77  y selected.# row
9f60: 20 66 72 6f 6d 20 74 68 65 20 67 72 6f 75 70 2e   from the group.
9f70: 0a 23 0a 23 20 20 20 54 65 73 74 65 64 20 62 79  .#.#   Tested by
9f80: 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e 32   e_select-4.13.2
9f90: 2e 2a 0a 23 0a 23 20 20 20 54 65 73 74 73 20 69  .*.#.#   Tests i
9fa0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  n this block als
9fb0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  o show that this
9fc0: 20 69 73 20 6e 6f 74 20 75 6e 74 72 75 65 3a 0a   is not untrue:.
9fd0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
9fe0: 20 52 2d 35 35 34 30 33 2d 31 33 34 35 30 20 54   R-55403-13450 T
9ff0: 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
a000: 73 69 6f 6e 20 6d 61 79 20 72 65 66 65 72 20 74  sion may refer t
a010: 6f 20 76 61 6c 75 65 73 2c 0a 23 20 65 76 65 6e  o values,.# even
a020: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a030: 69 6f 6e 73 2c 20 74 68 61 74 20 61 72 65 20 6e  ions, that are n
a040: 6f 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ot in the result
a050: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
a060: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31  est e_select-4.1
a070: 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  3.0 {.  CREATE T
a080: 41 42 4c 45 20 63 31 28 75 70 2c 20 64 6f 77 6e  ABLE c1(up, down
a090: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
a0a0: 20 63 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20   c1 VALUES('x', 
a0b0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
a0c0: 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78 27 2c  O c1 VALUES('x',
a0d0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
a0e0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78 27  TO c1 VALUES('x'
a0f0: 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 4);.  INSERT I
a100: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 78  NTO c1 VALUES('x
a110: 27 2c 20 38 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 8);.  INSERT 
a120: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27  INTO c1 VALUES('
a130: 79 27 2c 20 31 36 29 3b 0a 20 20 49 4e 53 45 52  y', 16);.  INSER
a140: 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
a150: 28 27 79 27 2c 20 33 32 29 3b 0a 0a 20 20 43 52  ('y', 32);..  CR
a160: 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 69 2c  EATE TABLE c2(i,
a170: 20 6a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   j);.  INSERT IN
a180: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20  TO c2 VALUES(1, 
a190: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0);.  INSERT INT
a1a0: 4f 20 63 32 20 56 41 4c 55 45 53 28 32 2c 20 31  O c2 VALUES(2, 1
a1b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
a1c0: 20 63 32 20 56 41 4c 55 45 53 28 33 2c 20 33 29   c2 VALUES(3, 3)
a1d0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a1e0: 63 32 20 56 41 4c 55 45 53 28 34 2c 20 36 29 3b  c2 VALUES(4, 6);
a1f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a200: 32 20 56 41 4c 55 45 53 28 35 2c 20 31 30 29 3b  2 VALUES(5, 10);
a210: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a220: 32 20 56 41 4c 55 45 53 28 36 2c 20 31 35 29 3b  2 VALUES(6, 15);
a230: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a240: 32 20 56 41 4c 55 45 53 28 37 2c 20 32 31 29 3b  2 VALUES(7, 21);
a250: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a260: 32 20 56 41 4c 55 45 53 28 38 2c 20 32 38 29 3b  2 VALUES(8, 28);
a270: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a280: 32 20 56 41 4c 55 45 53 28 39 2c 20 33 36 29 3b  2 VALUES(9, 36);
a290: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
a2a0: 20 63 33 28 69 20 50 52 49 4d 41 52 59 20 4b 45   c3(i PRIMARY KE
a2b0: 59 2c 20 6b 20 54 45 58 54 29 3b 0a 20 20 49 4e  Y, k TEXT);.  IN
a2c0: 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c  SERT INTO c3 VAL
a2d0: 55 45 53 28 31 2c 20 20 27 68 79 64 72 6f 67 65  UES(1,  'hydroge
a2e0: 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  n');.  INSERT IN
a2f0: 54 4f 20 63 33 20 56 41 4c 55 45 53 28 32 2c 20  TO c3 VALUES(2, 
a300: 20 27 68 65 6c 69 75 6d 27 29 3b 0a 20 20 49 4e   'helium');.  IN
a310: 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c  SERT INTO c3 VAL
a320: 55 45 53 28 33 2c 20 20 27 6c 69 74 68 69 75 6d  UES(3,  'lithium
a330: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
a340: 4f 20 63 33 20 56 41 4c 55 45 53 28 34 2c 20 20  O c3 VALUES(4,  
a350: 27 62 65 72 79 6c 6c 69 75 6d 27 29 3b 0a 20 20  'beryllium');.  
a360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56  INSERT INTO c3 V
a370: 41 4c 55 45 53 28 35 2c 20 20 27 62 6f 72 6f 6e  ALUES(5,  'boron
a380: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
a390: 4f 20 63 33 20 56 41 4c 55 45 53 28 39 34 2c 20  O c3 VALUES(94, 
a3a0: 27 70 6c 75 74 6f 6e 69 75 6d 27 29 3b 0a 7d 20  'plutonium');.} 
a3b0: 7b 7d 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  {}..do_select_te
a3c0: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31  sts e_select-4.1
a3d0: 33 20 7b 0a 20 20 31 2e 31 20 20 22 53 45 4c 45  3 {.  1.1  "SELE
a3e0: 43 54 20 75 70 20 46 52 4f 4d 20 63 31 20 47 52  CT up FROM c1 GR
a3f0: 4f 55 50 20 42 59 20 75 70 20 48 41 56 49 4e 47  OUP BY up HAVING
a400: 20 63 6f 75 6e 74 28 2a 29 3e 33 22 20 7b 78 7d   count(*)>3" {x}
a410: 0a 20 20 31 2e 32 20 20 22 53 45 4c 45 43 54 20  .  1.2  "SELECT 
a420: 75 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50  up FROM c1 GROUP
a430: 20 42 59 20 75 70 20 48 41 56 49 4e 47 20 73 75   BY up HAVING su
a440: 6d 28 64 6f 77 6e 29 3e 31 36 22 20 7b 79 7d 0a  m(down)>16" {y}.
a450: 20 20 31 2e 33 20 20 22 53 45 4c 45 43 54 20 75    1.3  "SELECT u
a460: 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50 20  p FROM c1 GROUP 
a470: 42 59 20 75 70 20 48 41 56 49 4e 47 20 73 75 6d  BY up HAVING sum
a480: 28 64 6f 77 6e 29 3c 31 36 22 20 7b 78 7d 0a 20  (down)<16" {x}. 
a490: 20 31 2e 34 20 20 22 53 45 4c 45 43 54 20 75 70   1.4  "SELECT up
a4a0: 7c 7c 64 6f 77 6e 20 46 52 4f 4d 20 63 31 20 47  ||down FROM c1 G
a4b0: 52 4f 55 50 20 42 59 20 28 64 6f 77 6e 3c 35 29  ROUP BY (down<5)
a4c0: 20 48 41 56 49 4e 47 20 6d 61 78 28 64 6f 77 6e   HAVING max(down
a4d0: 29 3c 31 30 22 20 7b 78 34 7d 0a 0a 20 20 32 2e  )<10" {x4}..  2.
a4e0: 31 20 20 22 53 45 4c 45 43 54 20 75 70 20 46 52  1  "SELECT up FR
a4f0: 4f 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20 75  OM c1 GROUP BY u
a500: 70 20 48 41 56 49 4e 47 20 64 6f 77 6e 3e 31 30  p HAVING down>10
a510: 22 20 7b 79 7d 0a 20 20 32 2e 32 20 20 22 53 45  " {y}.  2.2  "SE
a520: 4c 45 43 54 20 75 70 20 46 52 4f 4d 20 63 31 20  LECT up FROM c1 
a530: 47 52 4f 55 50 20 42 59 20 75 70 20 48 41 56 49  GROUP BY up HAVI
a540: 4e 47 20 75 70 3d 27 79 27 22 20 20 7b 79 7d 0a  NG up='y'"  {y}.
a550: 0a 20 20 32 2e 33 20 20 22 53 45 4c 45 43 54 20  .  2.3  "SELECT 
a560: 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f  i, j FROM c2 GRO
a570: 55 50 20 42 59 20 69 3e 34 20 48 41 56 49 4e 47  UP BY i>4 HAVING
a580: 20 69 3e 36 22 20 20 7b 39 20 33 36 7d 0a 7d 0a   i>6"  {9 36}.}.
a590: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
a5a0: 52 2d 32 33 39 32 37 2d 35 34 30 38 31 20 45 61  R-23927-54081 Ea
a5b0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
a5c0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
a5d0: 69 73 20 74 68 65 6e 0a 23 20 65 76 61 6c 75 61  is then.# evalua
a5e0: 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ted once for eac
a5f0: 68 20 67 72 6f 75 70 20 6f 66 20 72 6f 77 73 2e  h group of rows.
a600: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a610: 3a 20 52 2d 35 33 37 33 35 2d 34 37 30 31 37 20  : R-53735-47017 
a620: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
a630: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
a640: 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  e.# expression, 
a650: 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  it is evaluated 
a660: 61 63 72 6f 73 73 20 61 6c 6c 20 72 6f 77 73 20  across all rows 
a670: 69 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a  in the group..#.
a680: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
a690: 65 5f 73 65 6c 65 63 74 2d 34 2e 31 35 20 7b 0a  e_select-4.15 {.
a6a0: 20 20 31 20 20 22 53 45 4c 45 43 54 20 73 75 6d    1  "SELECT sum
a6b0: 28 64 6f 77 6e 29 20 46 52 4f 4d 20 63 31 20 47  (down) FROM c1 G
a6c0: 52 4f 55 50 20 42 59 20 75 70 22 20 7b 31 35 20  ROUP BY up" {15 
a6d0: 34 38 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54  48}.  2  "SELECT
a6e0: 20 73 75 6d 28 6a 29 2c 20 6d 61 78 28 6a 29 20   sum(j), max(j) 
a6f0: 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59  FROM c2 GROUP BY
a700: 20 28 69 25 33 29 22 20 20 20 20 20 7b 35 34 20   (i%3)"     {54 
a710: 33 36 20 32 37 20 32 31 20 33 39 20 32 38 7d 0a  36 27 21 39 28}.
a720: 20 20 33 20 20 22 53 45 4c 45 43 54 20 73 75 6d    3  "SELECT sum
a730: 28 6a 29 2c 20 6d 61 78 28 6a 29 20 46 52 4f 4d  (j), max(j) FROM
a740: 20 63 32 20 47 52 4f 55 50 20 42 59 20 28 6a 25   c2 GROUP BY (j%
a750: 32 29 22 20 20 20 20 20 7b 38 30 20 33 36 20 34  2)"     {80 36 4
a760: 30 20 32 31 7d 0a 20 20 34 20 20 22 53 45 4c 45  0 21}.  4  "SELE
a770: 43 54 20 31 2b 73 75 6d 28 6a 29 2c 20 6d 61 78  CT 1+sum(j), max
a780: 28 6a 29 2b 31 20 46 52 4f 4d 20 63 32 20 47 52  (j)+1 FROM c2 GR
a790: 4f 55 50 20 42 59 20 28 6a 25 32 29 22 20 7b 38  OUP BY (j%2)" {8
a7a0: 31 20 33 37 20 34 31 20 32 32 7d 0a 20 20 35 20  1 37 41 22}.  5 
a7b0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
a7c0: 29 2c 20 72 6f 75 6e 64 28 61 76 67 28 69 29 2c  ), round(avg(i),
a7d0: 32 29 20 46 52 4f 4d 20 63 31 2c 20 63 32 20 4f  2) FROM c1, c2 O
a7e0: 4e 20 28 69 3d 64 6f 77 6e 29 20 47 52 4f 55 50  N (i=down) GROUP
a7f0: 20 42 59 20 6a 25 32 22 0a 20 20 20 20 20 20 20   BY j%2".       
a800: 20 7b 33 20 34 2e 33 33 20 31 20 32 2e 30 7d 0a   {3 4.33 1 2.0}.
a810: 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
a820: 46 3a 20 52 2d 36 32 39 31 33 2d 31 39 38 33 30  F: R-62913-19830
a830: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
a840: 73 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  s evaluated agai
a850: 6e 73 74 20 61 20 73 69 6e 67 6c 65 0a 23 20 61  nst a single.# a
a860: 72 62 69 74 72 61 72 69 6c 79 20 63 68 6f 73 65  rbitrarily chose
a870: 6e 20 72 6f 77 20 66 72 6f 6d 20 77 69 74 68 69  n row from withi
a880: 6e 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a 23  n the group..#.#
a890: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a8a0: 35 33 39 32 34 2d 30 38 38 30 39 20 49 66 20 74  53924-08809 If t
a8b0: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
a8c0: 6e 20 6f 6e 65 20 6e 6f 6e 2d 61 67 67 72 65 67  n one non-aggreg
a8d0: 61 74 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  ate.# expression
a8e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
a8f0: 65 74 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  et, then all suc
a900: 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  h expressions ar
a910: 65 20 65 76 61 6c 75 61 74 65 64 0a 23 20 66 6f  e evaluated.# fo
a920: 72 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 0a  r the same row..
a930: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
a940: 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 35 20  s e_select-4.15 
a950: 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 69  {.  1  "SELECT i
a960: 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f 55  , j FROM c2 GROU
a970: 50 20 42 59 20 69 25 32 22 20 20 20 20 20 20 20  P BY i%2"       
a980: 20 20 20 20 20 20 7b 38 20 32 38 20 20 20 39 20        {8 28   9 
a990: 33 36 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54  36}.  2  "SELECT
a9a0: 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52   i, j FROM c2 GR
a9b0: 4f 55 50 20 42 59 20 69 25 32 20 48 41 56 49 4e  OUP BY i%2 HAVIN
a9c0: 47 20 6a 3c 33 30 22 20 7b 38 20 32 38 7d 0a 20  G j<30" {8 28}. 
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 39 20 33 36 7d 0a 20 20 34 20 20 22  0" {9 36}.  4  "
aa10: 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f 4d  SELECT i, j FROM
aa20: 20 63 32 20 47 52 4f 55 50 20 42 59 20 69 25 32   c2 GROUP BY i%2
aa30: 20 48 41 56 49 4e 47 20 6a 3e 33 30 22 20 7b 39   HAVING j>30" {9
aa40: 20 33 36 7d 0a 20 20 35 20 20 22 53 45 4c 45 43   36}.  5  "SELEC
aa50: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 69 2c 20 6b  T count(*), i, k
aa60: 20 46 52 4f 4d 20 63 32 20 4e 41 54 55 52 41 4c   FROM c2 NATURAL
aa70: 20 4a 4f 49 4e 20 63 33 20 47 52 4f 55 50 20 42   JOIN c3 GROUP B
aa80: 59 20 73 75 62 73 74 72 28 6b 2c 20 31 2c 20 31  Y substr(k, 1, 1
aa90: 29 22 0a 20 20 20 20 20 20 20 20 7b 32 20 35 20  )".        {2 5 
aaa0: 62 6f 72 6f 6e 20 20 20 32 20 32 20 68 65 6c 69  boron   2 2 heli
aab0: 75 6d 20 20 20 31 20 33 20 6c 69 74 68 69 75 6d  um   1 3 lithium
aac0: 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45  }.} ..# EVIDENCE
aad0: 2d 4f 46 3a 20 52 2d 31 39 33 33 34 2d 31 32 38  -OF: R-19334-128
aae0: 31 31 20 45 61 63 68 20 67 72 6f 75 70 20 6f 66  11 Each group of
aaf0: 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 20 72   input dataset r
ab00: 6f 77 73 0a 23 20 63 6f 6e 74 72 69 62 75 74 65  ows.# contribute
ab10: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74  s a single row t
ab20: 6f 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 73  o the set of res
ab30: 75 6c 74 20 72 6f 77 73 2e 0a 23 0a 23 20 45 56  ult rows..#.# EV
ab40: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 32  IDENCE-OF: R-022
ab50: 32 33 2d 34 39 32 37 39 20 53 75 62 6a 65 63 74  23-49279 Subject
ab60: 20 74 6f 20 66 69 6c 74 65 72 69 6e 67 20 61 73   to filtering as
ab70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ab80: 65 0a 23 20 44 49 53 54 49 4e 43 54 20 6b 65 79  e.# DISTINCT key
ab90: 77 6f 72 64 2c 20 74 68 65 20 6e 75 6d 62 65 72  word, the number
aba0: 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
abb0: 64 20 62 79 20 61 6e 20 61 67 67 72 65 67 61 74  d by an aggregat
abc0: 65 20 71 75 65 72 79 0a 23 20 77 69 74 68 20 61  e query.# with a
abd0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
abe0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
abf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 67 72  the number of gr
ac00: 6f 75 70 73 20 6f 66 20 72 6f 77 73 0a 23 20 70  oups of rows.# p
ac10: 72 6f 64 75 63 65 64 20 62 79 20 61 70 70 6c 79  roduced by apply
ac20: 69 6e 67 20 74 68 65 20 47 52 4f 55 50 20 42 59  ing the GROUP BY
ac30: 20 61 6e 64 20 48 41 56 49 4e 47 20 63 6c 61 75   and HAVING clau
ac40: 73 65 73 20 74 6f 20 74 68 65 20 66 69 6c 74 65  ses to the filte
ac50: 72 65 64 0a 23 20 69 6e 70 75 74 20 64 61 74 61  red.# input data
ac60: 73 65 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  set..#.do_select
ac70: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2e  _tests e_select.
ac80: 34 2e 31 36 20 2d 63 6f 75 6e 74 20 7b 0a 20 20  4.16 -count {.  
ac90: 31 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20  1  "SELECT i, j 
aca0: 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59  FROM c2 GROUP BY
acb0: 20 69 25 32 22 20 20 20 20 20 20 20 20 20 20 32   i%2"          2
acc0: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 69 2c  .  2  "SELECT i,
acd0: 20 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50   j FROM c2 GROUP
ace0: 20 42 59 20 69 22 20 20 20 20 20 20 20 20 20 20   BY i"          
acf0: 20 20 39 0a 20 20 33 20 20 22 53 45 4c 45 43 54    9.  3  "SELECT
ad00: 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47 52   i, j FROM c2 GR
ad10: 4f 55 50 20 42 59 20 69 20 48 41 56 49 4e 47 20  OUP BY i HAVING 
ad20: 69 3c 35 22 20 34 0a 7d 20 0a 0a 23 2d 2d 2d 2d  i<5" 4.} ..#----
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 2d  ----------------
ad70: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
ad80: 6f 77 69 6e 67 20 74 65 73 74 73 20 61 74 74 65  owing tests atte
ad90: 6d 70 74 20 74 6f 20 76 65 72 69 66 79 20 73 74  mpt to verify st
ada0: 61 74 65 6d 65 6e 74 73 20 6d 61 64 65 20 72 65  atements made re
adb0: 67 61 72 64 69 6e 67 20 74 68 65 20 41 4c 4c 0a  garding the ALL.
adc0: 23 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 6b  # and DISTINCT k
add0: 65 79 77 6f 72 64 73 2e 0a 23 0a 64 72 6f 70 5f  eywords..#.drop_
ade0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78  all_tables.do_ex
adf0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
ae00: 65 63 74 2d 35 2e 31 2e 30 20 7b 0a 20 20 43 52  ect-5.1.0 {.  CR
ae10: 45 41 54 45 20 54 41 42 4c 45 20 68 31 28 61 2c  EATE TABLE h1(a,
ae20: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
ae30: 54 4f 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20  TO h1 VALUES(1, 
ae40: 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  'one');.  INSERT
ae50: 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45 53 28   INTO h1 VALUES(
ae60: 31 2c 20 27 49 27 29 3b 0a 20 20 49 4e 53 45 52  1, 'I');.  INSER
ae70: 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45 53  T INTO h1 VALUES
ae80: 28 31 2c 20 27 69 27 29 3b 0a 20 20 49 4e 53 45  (1, 'i');.  INSE
ae90: 52 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45  RT INTO h1 VALUE
aea0: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
aeb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 31 20 56  INSERT INTO h1 V
aec0: 41 4c 55 45 53 28 34 2c 20 27 49 56 27 29 3b 0a  ALUES(4, 'IV');.
aed0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 31    INSERT INTO h1
aee0: 20 56 41 4c 55 45 53 28 34 2c 20 27 69 76 27 29   VALUES(4, 'iv')
aef0: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
af00: 45 20 68 32 28 78 20 43 4f 4c 4c 41 54 45 20 6e  E h2(x COLLATE n
af10: 6f 63 61 73 65 29 3b 0a 20 20 49 4e 53 45 52 54  ocase);.  INSERT
af20: 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28   INTO h2 VALUES(
af30: 27 4f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  'One');.  INSERT
af40: 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28   INTO h2 VALUES(
af50: 27 54 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54  'Two');.  INSERT
af60: 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28   INTO h2 VALUES(
af70: 27 54 68 72 65 65 27 29 3b 0a 20 20 49 4e 53 45  'Three');.  INSE
af80: 52 54 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45  RT INTO h2 VALUE
af90: 53 28 27 46 6f 75 72 27 29 3b 0a 20 20 49 4e 53  S('Four');.  INS
afa0: 45 52 54 20 49 4e 54 4f 20 68 32 20 56 41 4c 55  ERT INTO h2 VALU
afb0: 45 53 28 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  ES('one');.  INS
afc0: 45 52 54 20 49 4e 54 4f 20 68 32 20 56 41 4c 55  ERT INTO h2 VALU
afd0: 45 53 28 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53  ES('two');.  INS
afe0: 45 52 54 20 49 4e 54 4f 20 68 32 20 56 41 4c 55  ERT INTO h2 VALU
aff0: 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20 49  ES('three');.  I
b000: 4e 53 45 52 54 20 49 4e 54 4f 20 68 32 20 56 41  NSERT INTO h2 VA
b010: 4c 55 45 53 28 27 66 6f 75 72 27 29 3b 0a 0a 20  LUES('four');.. 
b020: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 68 33   CREATE TABLE h3
b030: 28 63 2c 20 64 29 3b 0a 20 20 49 4e 53 45 52 54  (c, d);.  INSERT
b040: 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28   INTO h3 VALUES(
b050: 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45  1, NULL);.  INSE
b060: 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45  RT INTO h3 VALUE
b070: 53 28 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e  S(2, NULL);.  IN
b080: 53 45 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c  SERT INTO h3 VAL
b090: 55 45 53 28 33 2c 20 4e 55 4c 4c 29 3b 0a 20 20  UES(3, NULL);.  
b0a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33 20 56  INSERT INTO h3 V
b0b0: 41 4c 55 45 53 28 34 2c 20 27 32 27 29 3b 0a 20  ALUES(4, '2');. 
b0c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33 20   INSERT INTO h3 
b0d0: 56 41 4c 55 45 53 28 35 2c 20 4e 55 4c 4c 29 3b  VALUES(5, NULL);
b0e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68  .  INSERT INTO h
b0f0: 33 20 56 41 4c 55 45 53 28 36 2c 20 27 32 2c 33  3 VALUES(6, '2,3
b100: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
b110: 4f 20 68 33 20 56 41 4c 55 45 53 28 37 2c 20 4e  O h3 VALUES(7, N
b120: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
b130: 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28 38 2c  NTO h3 VALUES(8,
b140: 20 27 32 2c 34 27 29 3b 0a 20 20 49 4e 53 45 52   '2,4');.  INSER
b150: 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53  T INTO h3 VALUES
b160: 28 39 2c 20 27 33 27 29 3b 0a 7d 20 7b 7d 0a 0a  (9, '3');.} {}..
b170: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b180: 2d 36 30 37 37 30 2d 31 30 36 31 32 20 4f 6e 65  -60770-10612 One
b190: 20 6f 66 20 74 68 65 20 41 4c 4c 20 6f 72 20 44   of the ALL or D
b1a0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 73  ISTINCT keywords
b1b0: 20 6d 61 79 0a 23 20 66 6f 6c 6c 6f 77 20 74 68   may.# follow th
b1c0: 65 20 53 45 4c 45 43 54 20 6b 65 79 77 6f 72 64  e SELECT keyword
b1d0: 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53 45 4c   in a simple SEL
b1e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  ECT statement..#
b1f0: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
b200: 20 65 5f 73 65 6c 65 63 74 2d 35 2e 31 20 7b 0a   e_select-5.1 {.
b210: 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 41 4c    1   "SELECT AL
b220: 4c 20 61 20 46 52 4f 4d 20 68 31 22 20 20 20 20  L a FROM h1"    
b230: 20 20 7b 31 20 31 20 31 20 34 20 34 20 34 7d 0a    {1 1 1 4 4 4}.
b240: 20 20 32 20 20 20 22 53 45 4c 45 43 54 20 44 49    2   "SELECT DI
b250: 53 54 49 4e 43 54 20 61 20 46 52 4f 4d 20 68 31  STINCT a FROM h1
b260: 22 20 7b 31 20 34 7d 0a 7d 0a 0a 23 20 45 56 49  " {1 4}.}..# EVI
b270: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 38 36  DENCE-OF: R-0886
b280: 31 2d 33 34 32 38 30 20 49 66 20 74 68 65 20 73  1-34280 If the s
b290: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 69 73 20  imple SELECT is 
b2a0: 61 20 53 45 4c 45 43 54 20 41 4c 4c 2c 20 74 68  a SELECT ALL, th
b2b0: 65 6e 0a 23 20 74 68 65 20 65 6e 74 69 72 65 20  en.# the entire 
b2c0: 73 65 74 20 6f 66 20 72 65 73 75 6c 74 20 72 6f  set of result ro
b2d0: 77 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ws are returned 
b2e0: 62 79 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 23  by the SELECT..#
b2f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b300: 52 2d 30 31 32 35 36 2d 30 31 39 35 30 20 49 66  R-01256-01950 If
b310: 20 6e 65 69 74 68 65 72 20 41 4c 4c 20 6f 72 20   neither ALL or 
b320: 44 49 53 54 49 4e 43 54 20 61 72 65 20 70 72 65  DISTINCT are pre
b330: 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20 74 68 65  sent,.# then the
b340: 20 62 65 68 61 76 69 6f 72 20 69 73 20 61 73 20   behavior is as 
b350: 69 66 20 41 4c 4c 20 77 65 72 65 20 73 70 65 63  if ALL were spec
b360: 69 66 69 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  ified..#.# EVIDE
b370: 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 34 34 32 2d  NCE-OF: R-14442-
b380: 34 31 33 30 35 20 49 66 20 74 68 65 20 73 69 6d  41305 If the sim
b390: 70 6c 65 20 53 45 4c 45 43 54 20 69 73 20 61 20  ple SELECT is a 
b3a0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 2c  SELECT DISTINCT,
b3b0: 0a 23 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  .# then duplicat
b3c0: 65 20 72 6f 77 73 20 61 72 65 20 72 65 6d 6f 76  e rows are remov
b3d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20  ed from the set 
b3e0: 6f 66 20 72 65 73 75 6c 74 20 72 6f 77 73 20 62  of result rows b
b3f0: 65 66 6f 72 65 20 69 74 0a 23 20 69 73 20 72 65  efore it.# is re
b400: 74 75 72 6e 65 64 2e 0a 23 0a 23 20 20 20 54 68  turned..#.#   Th
b410: 65 20 74 68 72 65 65 20 74 65 73 74 61 62 6c 65  e three testable
b420: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76   statements abov
b430: 65 20 61 72 65 20 74 65 73 74 65 64 20 62 79 20  e are tested by 
b440: 65 5f 73 65 6c 65 63 74 2d 35 2e 32 2e 2a 2c 0a  e_select-5.2.*,.
b450: 23 20 20 20 35 2e 33 2e 2a 20 61 6e 64 20 35 2e  #   5.3.* and 5.
b460: 34 2e 2a 20 72 65 73 70 65 63 74 69 76 65 6c 79  4.* respectively
b470: 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
b480: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 35 20 7b  sts e_select-5 {
b490: 0a 20 20 33 2e 31 20 22 53 45 4c 45 43 54 20 41  .  3.1 "SELECT A
b4a0: 4c 4c 20 78 20 46 52 4f 4d 20 68 32 22 20 7b 4f  LL x FROM h2" {O
b4b0: 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46 6f 75  ne Two Three Fou
b4c0: 72 20 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20  r one two three 
b4d0: 66 6f 75 72 7d 0a 20 20 33 2e 32 20 22 53 45 4c  four}.  3.2 "SEL
b4e0: 45 43 54 20 41 4c 4c 20 78 20 46 52 4f 4d 20 68  ECT ALL x FROM h
b4f0: 31 2c 20 68 32 20 4f 4e 20 28 78 3d 62 29 22 20  1, h2 ON (x=b)" 
b500: 7b 4f 6e 65 20 6f 6e 65 20 46 6f 75 72 20 66 6f  {One one Four fo
b510: 75 72 7d 0a 0a 20 20 33 2e 31 20 22 53 45 4c 45  ur}..  3.1 "SELE
b520: 43 54 20 78 20 46 52 4f 4d 20 68 32 22 20 7b 4f  CT x FROM h2" {O
b530: 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46 6f 75  ne Two Three Fou
b540: 72 20 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20  r one two three 
b550: 66 6f 75 72 7d 0a 20 20 33 2e 32 20 22 53 45 4c  four}.  3.2 "SEL
b560: 45 43 54 20 78 20 46 52 4f 4d 20 68 31 2c 20 68  ECT x FROM h1, h
b570: 32 20 4f 4e 20 28 78 3d 62 29 22 20 7b 4f 6e 65  2 ON (x=b)" {One
b580: 20 6f 6e 65 20 46 6f 75 72 20 66 6f 75 72 7d 0a   one Four four}.
b590: 0a 20 20 34 2e 31 20 22 53 45 4c 45 43 54 20 44  .  4.1 "SELECT D
b5a0: 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20 68  ISTINCT x FROM h
b5b0: 32 22 20 7b 4f 6e 65 20 54 77 6f 20 54 68 72 65  2" {One Two Thre
b5c0: 65 20 46 6f 75 72 7d 0a 20 20 34 2e 32 20 22 53  e Four}.  4.2 "S
b5d0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
b5e0: 20 46 52 4f 4d 20 68 31 2c 20 68 32 20 4f 4e 20   FROM h1, h2 ON 
b5f0: 28 78 3d 62 29 22 20 7b 4f 6e 65 20 46 6f 75 72  (x=b)" {One Four
b600: 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45  }.} ..# EVIDENCE
b610: 2d 4f 46 3a 20 52 2d 30 32 30 35 34 2d 31 35 33  -OF: R-02054-153
b620: 34 33 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  43 For the purpo
b630: 73 65 73 20 6f 66 20 64 65 74 65 63 74 69 6e 67  ses of detecting
b640: 20 64 75 70 6c 69 63 61 74 65 0a 23 20 72 6f 77   duplicate.# row
b650: 73 2c 20 74 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  s, two NULL valu
b660: 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
b670: 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 0a 23  d to be equal..#
b680: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
b690: 20 65 5f 73 65 6c 65 63 74 2d 35 2e 35 20 7b 0a   e_select-5.5 {.
b6a0: 20 20 31 20 20 22 53 45 4c 45 43 54 20 44 49 53    1  "SELECT DIS
b6b0: 54 49 4e 43 54 20 64 20 46 52 4f 4d 20 68 33 22  TINCT d FROM h3"
b6c0: 20 7b 7b 7d 20 32 20 32 2c 33 20 32 2c 34 20 33   {{} 2 2,3 2,4 3
b6d0: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
b6e0: 4f 46 3a 20 52 2d 35 38 33 35 39 2d 35 32 31 31  OF: R-58359-5211
b6f0: 32 20 54 68 65 20 6e 6f 72 6d 61 6c 20 72 75 6c  2 The normal rul
b700: 65 73 20 66 6f 72 20 73 65 6c 65 63 74 69 6e 67  es for selecting
b710: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 0a 23 20 73   a collation.# s
b720: 65 71 75 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61  equence to compa
b730: 72 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 77  re text values w
b740: 69 74 68 20 61 70 70 6c 79 2e 0a 23 0a 64 6f 5f  ith apply..#.do_
b750: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
b760: 65 6c 65 63 74 2d 35 2e 36 20 7b 0a 20 20 31 20  elect-5.6 {.  1 
b770: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
b780: 54 20 62 20 46 52 4f 4d 20 68 31 22 20 20 20 20  T b FROM h1"    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 6f                {o
b7a0: 6e 65 20 49 20 69 20 66 6f 75 72 20 49 56 20 69  ne I i four IV i
b7b0: 76 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20  v}.  2  "SELECT 
b7c0: 44 49 53 54 49 4e 43 54 20 62 20 43 4f 4c 4c 41  DISTINCT b COLLA
b7d0: 54 45 20 6e 6f 63 61 73 65 20 46 52 4f 4d 20 68  TE nocase FROM h
b7e0: 31 22 20 20 20 7b 6f 6e 65 20 49 20 66 6f 75 72  1"   {one I four
b7f0: 20 49 56 7d 0a 20 20 33 20 20 22 53 45 4c 45 43   IV}.  3  "SELEC
b800: 54 20 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f  T DISTINCT x FRO
b810: 4d 20 68 32 22 20 20 20 20 20 20 20 20 20 20 20  M h2"           
b820: 20 20 20 20 20 20 20 7b 4f 6e 65 20 54 77 6f 20         {One Two 
b830: 54 68 72 65 65 20 46 6f 75 72 7d 0a 20 20 34 20  Three Four}.  4 
b840: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
b850: 54 20 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  T x COLLATE bina
b860: 72 79 20 46 52 4f 4d 20 68 32 22 20 20 20 7b 0a  ry FROM h2"   {.
b870: 20 20 20 20 4f 6e 65 20 54 77 6f 20 54 68 72 65      One Two Thre
b880: 65 20 46 6f 75 72 20 6f 6e 65 20 74 77 6f 20 74  e Four one two t
b890: 68 72 65 65 20 66 6f 75 72 0a 20 20 7d 0a 7d 0a  hree four.  }.}.
b8a0: 0a 23 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 2d  ----------------
b8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
b8f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
b900: 73 20 2d 20 65 5f 73 65 6c 65 63 74 2d 37 2e 2a  s - e_select-7.*
b910: 20 2d 20 74 65 73 74 20 74 68 61 74 20 73 74 61   - test that sta
b920: 74 65 6d 65 6e 74 73 20 6d 61 64 65 20 74 6f 20  tements made to 
b930: 64 6f 0a 23 20 77 69 74 68 20 63 6f 6d 70 6f 75  do.# with compou
b940: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
b950: 65 6e 74 73 20 61 72 65 20 63 6f 72 72 65 63 74  ents are correct
b960: 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ..#..# EVIDENCE-
b970: 4f 46 3a 20 52 2d 33 39 33 36 38 2d 36 34 33 33  OF: R-39368-6433
b980: 33 20 49 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  3 In a compound 
b990: 53 45 4c 45 43 54 2c 20 61 6c 6c 20 74 68 65 20  SELECT, all the 
b9a0: 63 6f 6e 73 74 69 74 75 65 6e 74 0a 23 20 53 45  constituent.# SE
b9b0: 4c 45 43 54 73 20 6d 75 73 74 20 72 65 74 75 72  LECTs must retur
b9c0: 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
b9d0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
b9e0: 6d 6e 73 2e 0a 23 0a 23 20 20 20 41 6c 6c 20 74  mns..#.#   All t
b9f0: 68 65 20 6f 74 68 65 72 20 74 65 73 74 73 20 69  he other tests i
ba00: 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 75  n this section u
ba10: 73 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  se compound SELE
ba20: 43 54 73 20 63 72 65 61 74 65 64 0a 23 20 20 20  CTs created.#   
ba30: 75 73 69 6e 67 20 63 6f 6d 70 6f 6e 65 6e 74 20  using component 
ba40: 53 45 4c 45 43 54 73 20 74 68 61 74 20 64 6f 20  SELECTs that do 
ba50: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
ba60: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
ba70: 73 2e 0a 23 20 20 20 53 6f 20 74 68 65 20 74 65  s..#   So the te
ba80: 73 74 73 20 68 65 72 65 20 6a 75 73 74 20 73 68  sts here just sh
ba90: 6f 77 20 74 68 61 74 20 69 74 20 69 73 20 61 6e  ow that it is an
baa0: 20 65 72 72 6f 72 20 74 6f 20 61 74 74 65 6d 70   error to attemp
bab0: 74 20 6f 74 68 65 72 77 69 73 65 2e 0a 23 0a 64  t otherwise..#.d
bac0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
bad0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bae0: 5f 73 65 6c 65 63 74 2d 37 2e 31 2e 30 20 7b 0a  _select-7.1.0 {.
baf0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a    CREATE TABLE j
bb00: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  1(a, b, c);.  CR
bb10: 45 41 54 45 20 54 41 42 4c 45 20 6a 32 28 65 2c  EATE TABLE j2(e,
bb20: 20 66 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   f);.  CREATE TA
bb30: 42 4c 45 20 6a 33 28 67 29 3b 0a 7d 20 7b 7d 0a  BLE j3(g);.} {}.
bb40: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
bb50: 65 5f 73 65 6c 65 63 74 2d 37 2e 31 20 2d 65 72  e_select-7.1 -er
bb60: 72 6f 72 20 7b 0a 20 20 53 45 4c 45 43 54 73 20  ror {.  SELECTs 
bb70: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
bb80: 72 69 67 68 74 20 6f 66 20 25 73 20 64 6f 20 6e  right of %s do n
bb90: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
bba0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
bbb0: 74 20 63 6f 6c 75 6d 6e 73 0a 7d 20 7b 0a 20 20  t columns.} {.  
bbc0: 31 20 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62  1   "SELECT a, b
bbd0: 20 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f   FROM j1    UNIO
bbe0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 67 20 46  N ALL SELECT g F
bbf0: 52 4f 4d 20 6a 33 22 20 20 20 20 7b 7b 55 4e 49  ROM j3"    {{UNI
bc00: 4f 4e 20 41 4c 4c 7d 7d 0a 20 20 32 20 20 20 22  ON ALL}}.  2   "
bc10: 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d  SELECT *    FROM
bc20: 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c   j1    UNION ALL
bc30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
bc40: 33 22 20 20 20 20 7b 7b 55 4e 49 4f 4e 20 41 4c  3"    {{UNION AL
bc50: 4c 7d 7d 0a 20 20 33 20 20 20 22 53 45 4c 45 43  L}}.  3   "SELEC
bc60: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20  T a, b FROM j1  
bc70: 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45    UNION ALL SELE
bc80: 43 54 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20  CT g FROM j3"   
bc90: 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a 20   {{UNION ALL}}. 
bca0: 20 34 20 20 20 22 53 45 4c 45 43 54 20 61 2c 20   4   "SELECT a, 
bcb0: 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49  b FROM j1    UNI
bcc0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20  ON ALL SELECT * 
bcd0: 46 52 4f 4d 20 6a 33 2c 6a 32 22 20 7b 7b 55 4e  FROM j3,j2" {{UN
bce0: 49 4f 4e 20 41 4c 4c 7d 7d 0a 20 20 35 20 20 20  ION ALL}}.  5   
bcf0: 22 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f  "SELECT *    FRO
bd00: 4d 20 6a 33 2c 6a 32 20 55 4e 49 4f 4e 20 41 4c  M j3,j2 UNION AL
bd10: 4c 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  L SELECT a, b FR
bd20: 4f 4d 20 6a 31 22 20 7b 7b 55 4e 49 4f 4e 20 41  OM j1" {{UNION A
bd30: 4c 4c 7d 7d 0a 0a 20 20 36 20 20 20 22 53 45 4c  LL}}..  6   "SEL
bd40: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31  ECT a, b FROM j1
bd50: 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54      UNION SELECT
bd60: 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 20   g FROM j3"     
bd70: 20 20 20 7b 55 4e 49 4f 4e 7d 0a 20 20 37 20 20     {UNION}.  7  
bd80: 20 22 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52   "SELECT *    FR
bd90: 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 53  OM j1    UNION S
bda0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22  ELECT * FROM j3"
bdb0: 20 20 20 20 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a          {UNION}.
bdc0: 20 20 38 20 20 20 22 53 45 4c 45 43 54 20 61 2c    8   "SELECT a,
bdd0: 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e   b FROM j1    UN
bde0: 49 4f 4e 20 53 45 4c 45 43 54 20 67 20 46 52 4f  ION SELECT g FRO
bdf0: 4d 20 6a 33 22 20 20 20 20 20 20 20 20 7b 55 4e  M j3"        {UN
be00: 49 4f 4e 7d 0a 20 20 39 20 20 20 22 53 45 4c 45  ION}.  9   "SELE
be10: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20  CT a, b FROM j1 
be20: 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20     UNION SELECT 
be30: 2a 20 46 52 4f 4d 20 6a 33 2c 6a 32 22 20 20 20  * FROM j3,j2"   
be40: 20 20 7b 55 4e 49 4f 4e 7d 0a 20 20 31 30 20 20    {UNION}.  10  
be50: 22 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f  "SELECT *    FRO
be60: 4d 20 6a 33 2c 6a 32 20 55 4e 49 4f 4e 20 53 45  M j3,j2 UNION SE
be70: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a  LECT a, b FROM j
be80: 31 22 20 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 0a  1"     {UNION}..
be90: 20 20 31 31 20 20 22 53 45 4c 45 43 54 20 61 2c    11  "SELECT a,
bea0: 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e   b FROM j1    IN
beb0: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 67  TERSECT SELECT g
bec0: 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b 49 4e   FROM j3"    {IN
bed0: 54 45 52 53 45 43 54 7d 0a 20 20 31 32 20 20 22  TERSECT}.  12  "
bee0: 53 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d  SELECT *    FROM
bef0: 20 6a 31 20 20 20 20 49 4e 54 45 52 53 45 43 54   j1    INTERSECT
bf00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
bf10: 33 22 20 20 20 20 7b 49 4e 54 45 52 53 45 43 54  3"    {INTERSECT
bf20: 7d 0a 20 20 31 33 20 20 22 53 45 4c 45 43 54 20  }.  13  "SELECT 
bf30: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20  a, b FROM j1    
bf40: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
bf50: 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b   g FROM j3"    {
bf60: 49 4e 54 45 52 53 45 43 54 7d 0a 20 20 31 34 20  INTERSECT}.  14 
bf70: 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52   "SELECT a, b FR
bf80: 4f 4d 20 6a 31 20 20 20 20 49 4e 54 45 52 53 45  OM j1    INTERSE
bf90: 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  CT SELECT * FROM
bfa0: 20 6a 33 2c 6a 32 22 20 7b 49 4e 54 45 52 53 45   j3,j2" {INTERSE
bfb0: 43 54 7d 0a 20 20 31 35 20 20 22 53 45 4c 45 43  CT}.  15  "SELEC
bfc0: 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 33 2c 6a  T *    FROM j3,j
bfd0: 32 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  2 INTERSECT SELE
bfe0: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 22  CT a, b FROM j1"
bff0: 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 0a 20 20   {INTERSECT}..  
c000: 31 36 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62  16  "SELECT a, b
c010: 20 46 52 4f 4d 20 6a 31 20 20 20 20 45 58 43 45   FROM j1    EXCE
c020: 50 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d  PT SELECT g FROM
c030: 20 6a 33 22 20 20 20 20 20 20 20 7b 45 58 43 45   j3"       {EXCE
c040: 50 54 7d 0a 20 20 31 37 20 20 22 53 45 4c 45 43  PT}.  17  "SELEC
c050: 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 31 20 20  T *    FROM j1  
c060: 20 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20    EXCEPT SELECT 
c070: 2a 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 20 20  * FROM j3"      
c080: 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 38 20 20   {EXCEPT}.  18  
c090: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
c0a0: 4d 20 6a 31 20 20 20 20 45 58 43 45 50 54 20 53  M j1    EXCEPT S
c0b0: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33 22  ELECT g FROM j3"
c0c0: 20 20 20 20 20 20 20 7b 45 58 43 45 50 54 7d 0a         {EXCEPT}.
c0d0: 20 20 31 39 20 20 22 53 45 4c 45 43 54 20 61 2c    19  "SELECT a,
c0e0: 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 45 58   b FROM j1    EX
c0f0: 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52  CEPT SELECT * FR
c100: 4f 4d 20 6a 33 2c 6a 32 22 20 20 20 20 7b 45 58  OM j3,j2"    {EX
c110: 43 45 50 54 7d 0a 20 20 32 30 20 20 22 53 45 4c  CEPT}.  20  "SEL
c120: 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 33  ECT *    FROM j3
c130: 2c 6a 32 20 45 58 43 45 50 54 20 53 45 4c 45 43  ,j2 EXCEPT SELEC
c140: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20  T a, b FROM j1" 
c150: 20 20 20 7b 45 58 43 45 50 54 7d 0a 7d 20 0a 0a     {EXCEPT}.} ..
c160: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
c170: 2d 30 31 34 35 30 2d 31 31 31 35 32 20 41 73 20  -01450-11152 As 
c180: 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f  the components o
c190: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  f a compound SEL
c1a0: 45 43 54 20 6d 75 73 74 0a 23 20 62 65 20 73 69  ECT must.# be si
c1b0: 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  mple SELECT stat
c1c0: 65 6d 65 6e 74 73 2c 20 74 68 65 79 20 6d 61 79  ements, they may
c1d0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
c1e0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 0a 23  ER BY or LIMIT.#
c1f0: 20 63 6c 61 75 73 65 73 2e 0a 23 20 0a 66 6f 72   clauses..# .for
c200: 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20  each {tn select 
c210: 6f 70 31 20 6f 70 32 7d 20 7b 0a 20 20 31 20 20  op1 op2} {.  1  
c220: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
c230: 6a 31 20 4f 52 44 45 52 20 42 59 20 61 20 55 4e  j1 ORDER BY a UN
c240: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
c250: 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20   FROM j2,j3" .  
c260: 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b      {ORDER BY} {
c270: 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20 32 20 20  UNION ALL}.  2  
c280: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
c290: 29 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20  ) FROM j1 ORDER 
c2a0: 42 59 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  BY 1 UNION ALL S
c2b0: 45 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52 4f  ELECT max(e) FRO
c2c0: 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44  M j2".      {ORD
c2d0: 45 52 20 42 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c  ER BY} {UNION AL
c2e0: 4c 7d 0a 20 20 33 20 20 20 22 53 45 4c 45 43 54  L}.  3   "SELECT
c2f0: 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f   count(*), * FRO
c300: 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 31 2c  M j1 ORDER BY 1,
c310: 32 2c 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  2,3 UNION ALL SE
c320: 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32  LECT *,* FROM j2
c330: 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42  ".      {ORDER B
c340: 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20  Y} {UNION ALL}. 
c350: 20 34 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   4   "SELECT * F
c360: 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20  ROM j1 LIMIT 10 
c370: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
c380: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a   * FROM j2,j3" .
c390: 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49        LIMIT {UNI
c3a0: 4f 4e 20 41 4c 4c 7d 0a 20 20 35 20 20 20 22 53  ON ALL}.  5   "S
c3b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
c3c0: 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
c3d0: 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
c3e0: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22  CT * FROM j2,j3"
c3f0: 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 55   .      LIMIT {U
c400: 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20 36 20 20 20  NION ALL}.  6   
c410: 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a  "SELECT a FROM j
c420: 31 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20  1 LIMIT (SELECT 
c430: 65 20 46 52 4f 4d 20 6a 32 29 20 55 4e 49 4f 4e  e FROM j2) UNION
c440: 20 41 4c 4c 20 53 45 4c 45 43 54 20 67 20 46 52   ALL SELECT g FR
c450: 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20  OM j2,j3" .     
c460: 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 20 41 4c   LIMIT {UNION AL
c470: 4c 7d 0a 0a 20 20 37 20 20 20 22 53 45 4c 45 43  L}..  7   "SELEC
c480: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45  T * FROM j1 ORDE
c490: 52 20 42 59 20 61 20 55 4e 49 4f 4e 20 53 45 4c  R BY a UNION SEL
c4a0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
c4b0: 22 20 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20  " .      {ORDER 
c4c0: 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a 20 20 38 20  BY} {UNION}.  8 
c4d0: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
c4e0: 2a 29 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52  *) FROM j1 ORDER
c4f0: 20 42 59 20 31 20 55 4e 49 4f 4e 20 53 45 4c 45   BY 1 UNION SELE
c500: 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a  CT max(e) FROM j
c510: 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20  2".      {ORDER 
c520: 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a 20 20 39 20  BY} {UNION}.  9 
c530: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
c540: 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52  *), * FROM j1 OR
c550: 44 45 52 20 42 59 20 31 2c 32 2c 33 20 55 4e 49  DER BY 1,2,3 UNI
c560: 4f 4e 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52  ON SELECT *,* FR
c570: 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52  OM j2".      {OR
c580: 44 45 52 20 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a  DER BY} {UNION}.
c590: 20 20 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20    10  "SELECT * 
c5a0: 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30  FROM j1 LIMIT 10
c5b0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20   UNION SELECT * 
c5c0: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
c5d0: 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 7d     LIMIT {UNION}
c5e0: 0a 20 20 31 31 20 20 22 53 45 4c 45 43 54 20 2a  .  11  "SELECT *
c5f0: 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31   FROM j1 LIMIT 1
c600: 30 20 4f 46 46 53 45 54 20 35 20 55 4e 49 4f 4e  0 OFFSET 5 UNION
c610: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
c620: 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d  2,j3" .      LIM
c630: 49 54 20 7b 55 4e 49 4f 4e 7d 0a 20 20 31 32 20  IT {UNION}.  12 
c640: 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   "SELECT a FROM 
c650: 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54  j1 LIMIT (SELECT
c660: 20 65 20 46 52 4f 4d 20 6a 32 29 20 55 4e 49 4f   e FROM j2) UNIO
c670: 4e 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  N SELECT g FROM 
c680: 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49  j2,j3" .      LI
c690: 4d 49 54 20 7b 55 4e 49 4f 4e 7d 0a 0a 20 20 31  MIT {UNION}..  1
c6a0: 33 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  3  "SELECT * FRO
c6b0: 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 61 20  M j1 ORDER BY a 
c6c0: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
c6d0: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
c6e0: 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 45     {ORDER BY} {E
c6f0: 58 43 45 50 54 7d 0a 20 20 31 34 20 20 22 53 45  XCEPT}.  14  "SE
c700: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
c710: 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 31  OM j1 ORDER BY 1
c720: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 6d   EXCEPT SELECT m
c730: 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 22 0a 20  ax(e) FROM j2". 
c740: 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20       {ORDER BY} 
c750: 7b 45 58 43 45 50 54 7d 0a 20 20 31 35 20 20 22  {EXCEPT}.  15  "
c760: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
c770: 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52   * FROM j1 ORDER
c780: 20 42 59 20 31 2c 32 2c 33 20 45 58 43 45 50 54   BY 1,2,3 EXCEPT
c790: 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d   SELECT *,* FROM
c7a0: 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45   j2".      {ORDE
c7b0: 52 20 42 59 7d 20 7b 45 58 43 45 50 54 7d 0a 20  R BY} {EXCEPT}. 
c7c0: 20 31 36 20 20 22 53 45 4c 45 43 54 20 2a 20 46   16  "SELECT * F
c7d0: 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20  ROM j1 LIMIT 10 
c7e0: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
c7f0: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
c800: 20 20 20 4c 49 4d 49 54 20 7b 45 58 43 45 50 54     LIMIT {EXCEPT
c810: 7d 0a 20 20 31 37 20 20 22 53 45 4c 45 43 54 20  }.  17  "SELECT 
c820: 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20  * FROM j1 LIMIT 
c830: 31 30 20 4f 46 46 53 45 54 20 35 20 45 58 43 45  10 OFFSET 5 EXCE
c840: 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  PT SELECT * FROM
c850: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c   j2,j3" .      L
c860: 49 4d 49 54 20 7b 45 58 43 45 50 54 7d 0a 20 20  IMIT {EXCEPT}.  
c870: 31 38 20 20 22 53 45 4c 45 43 54 20 61 20 46 52  18  "SELECT a FR
c880: 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c  OM j1 LIMIT (SEL
c890: 45 43 54 20 65 20 46 52 4f 4d 20 6a 32 29 20 45  ECT e FROM j2) E
c8a0: 58 43 45 50 54 20 53 45 4c 45 43 54 20 67 20 46  XCEPT SELECT g F
c8b0: 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20  ROM j2,j3" .    
c8c0: 20 20 4c 49 4d 49 54 20 7b 45 58 43 45 50 54 7d    LIMIT {EXCEPT}
c8d0: 0a 0a 20 20 31 39 20 20 22 53 45 4c 45 43 54 20  ..  19  "SELECT 
c8e0: 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20  * FROM j1 ORDER 
c8f0: 42 59 20 61 20 49 4e 54 45 52 53 45 43 54 20 53  BY a INTERSECT S
c900: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
c910: 6a 33 22 20 0a 20 20 20 20 20 20 7b 4f 52 44 45  j3" .      {ORDE
c920: 52 20 42 59 7d 20 7b 49 4e 54 45 52 53 45 43 54  R BY} {INTERSECT
c930: 7d 0a 20 20 32 30 20 20 22 53 45 4c 45 43 54 20  }.  20  "SELECT 
c940: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31  count(*) FROM j1
c950: 20 4f 52 44 45 52 20 42 59 20 31 20 49 4e 54 45   ORDER BY 1 INTE
c960: 52 53 45 43 54 20 53 45 4c 45 43 54 20 6d 61 78  RSECT SELECT max
c970: 28 65 29 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20  (e) FROM j2".   
c980: 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 49     {ORDER BY} {I
c990: 4e 54 45 52 53 45 43 54 7d 0a 20 20 32 31 20 20  NTERSECT}.  21  
c9a0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
c9b0: 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45  , * FROM j1 ORDE
c9c0: 52 20 42 59 20 31 2c 32 2c 33 20 49 4e 54 45 52  R BY 1,2,3 INTER
c9d0: 53 45 43 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20  SECT SELECT *,* 
c9e0: 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b  FROM j2".      {
c9f0: 4f 52 44 45 52 20 42 59 7d 20 7b 49 4e 54 45 52  ORDER BY} {INTER
ca00: 53 45 43 54 7d 0a 20 20 32 32 20 20 22 53 45 4c  SECT}.  22  "SEL
ca10: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49  ECT * FROM j1 LI
ca20: 4d 49 54 20 31 30 20 49 4e 54 45 52 53 45 43 54  MIT 10 INTERSECT
ca30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
ca40: 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d  2,j3" .      LIM
ca50: 49 54 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20  IT {INTERSECT}. 
ca60: 20 32 33 20 20 22 53 45 4c 45 43 54 20 2a 20 46   23  "SELECT * F
ca70: 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20  ROM j1 LIMIT 10 
ca80: 4f 46 46 53 45 54 20 35 20 49 4e 54 45 52 53 45  OFFSET 5 INTERSE
ca90: 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  CT SELECT * FROM
caa0: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c   j2,j3" .      L
cab0: 49 4d 49 54 20 7b 49 4e 54 45 52 53 45 43 54 7d  IMIT {INTERSECT}
cac0: 0a 20 20 32 34 20 20 22 53 45 4c 45 43 54 20 61  .  24  "SELECT a
cad0: 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 28   FROM j1 LIMIT (
cae0: 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 6a 32  SELECT e FROM j2
caf0: 29 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  ) INTERSECT SELE
cb00: 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 22  CT g FROM j2,j3"
cb10: 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b 49   .      LIMIT {I
cb20: 4e 54 45 52 53 45 43 54 7d 0a 7d 20 7b 0a 20 20  NTERSECT}.} {.  
cb30: 73 65 74 20 65 72 72 20 22 24 6f 70 31 20 63 6c  set err "$op1 cl
cb40: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
cb50: 20 61 66 74 65 72 20 24 6f 70 32 20 6e 6f 74 20   after $op2 not 
cb60: 62 65 66 6f 72 65 22 0a 20 20 64 6f 5f 63 61 74  before".  do_cat
cb70: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  chsql_test e_sel
cb80: 65 63 74 2d 37 2e 32 2e 24 74 6e 20 24 73 65 6c  ect-7.2.$tn $sel
cb90: 65 63 74 20 5b 6c 69 73 74 20 31 20 24 65 72 72  ect [list 1 $err
cba0: 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ].}..# EVIDENCE-
cbb0: 4f 46 3a 20 52 2d 34 35 34 34 30 2d 32 35 36 33  OF: R-45440-2563
cbc0: 33 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 4c  3 ORDER BY and L
cbd0: 49 4d 49 54 20 63 6c 61 75 73 65 73 20 6d 61 79  IMIT clauses may
cbe0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 23 20 61 74   only occur.# at
cbf0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cc00: 65 6e 74 69 72 65 20 63 6f 6d 70 6f 75 6e 64 20  entire compound 
cc10: 53 45 4c 45 43 54 2c 20 61 6e 64 20 74 68 65 6e  SELECT, and then
cc20: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6e   only if the fin
cc30: 61 6c 0a 23 20 65 6c 65 6d 65 6e 74 20 6f 66 20  al.# element of 
cc40: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 69 73 20  the compound is 
cc50: 6e 6f 74 20 61 20 56 41 4c 55 45 53 20 63 6c 61  not a VALUES cla
cc60: 75 73 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  use..#.foreach {
cc70: 74 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31  tn select} {.  1
cc80: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
cc90: 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M j1 UNION ALL S
cca0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
ccb0: 6a 33 20 4f 52 44 45 52 20 42 59 20 61 22 0a 20  j3 ORDER BY a". 
ccc0: 20 32 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75   2   "SELECT cou
ccd0: 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e  nt(*) FROM j1 UN
cce0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 6d  ION ALL SELECT m
ccf0: 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 20 4f 52  ax(e) FROM j2 OR
cd00: 44 45 52 20 42 59 20 31 22 0a 20 20 33 20 20 20  DER BY 1".  3   
cd10: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
cd20: 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  , * FROM j1 UNIO
cd30: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 2c 2a  N ALL SELECT *,*
cd40: 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42   FROM j2 ORDER B
cd50: 59 20 31 2c 32 2c 33 22 0a 20 20 34 20 20 20 22  Y 1,2,3".  4   "
cd60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
cd70: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
cd80: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c  T * FROM j2,j3 L
cd90: 49 4d 49 54 20 31 30 22 20 0a 20 20 35 20 20 20  IMIT 10" .  5   
cda0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
cdb0: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
cdc0: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT * FROM j2,j3 
cdd0: 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
cde0: 35 22 20 0a 20 20 36 20 20 20 22 53 45 4c 45 43  5" .  6   "SELEC
cdf0: 54 20 61 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  T a FROM j1 UNIO
ce00: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 67 20 46  N ALL SELECT g F
ce10: 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20  ROM j2,j3 LIMIT 
ce20: 28 53 45 4c 45 43 54 20 31 30 29 22 20 0a 0a 20  (SELECT 10)" .. 
ce30: 20 37 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   7   "SELECT * F
ce40: 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM j1 UNION SEL
ce50: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
ce60: 20 4f 52 44 45 52 20 42 59 20 61 22 0a 20 20 38   ORDER BY a".  8
ce70: 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
ce80: 28 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  (*) FROM j1 UNIO
ce90: 4e 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20  N SELECT max(e) 
cea0: 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59  FROM j2 ORDER BY
ceb0: 20 31 22 0a 20 20 38 62 20 20 22 56 41 4c 55 45   1".  8b  "VALUE
cec0: 53 28 27 38 62 27 29 20 55 4e 49 4f 4e 20 53 45  S('8b') UNION SE
ced0: 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d  LECT max(e) FROM
cee0: 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 22 0a   j2 ORDER BY 1".
cef0: 20 20 39 20 20 20 22 53 45 4c 45 43 54 20 63 6f    9   "SELECT co
cf00: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a  unt(*), * FROM j
cf10: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a  1 UNION SELECT *
cf20: 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52  ,* FROM j2 ORDER
cf30: 20 42 59 20 31 2c 32 2c 33 22 0a 20 20 31 30 20   BY 1,2,3".  10 
cf40: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
cf50: 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  j1 UNION SELECT 
cf60: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d  * FROM j2,j3 LIM
cf70: 49 54 20 31 30 22 20 0a 20 20 31 31 20 20 22 53  IT 10" .  11  "S
cf80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
cf90: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46  UNION SELECT * F
cfa0: 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20  ROM j2,j3 LIMIT 
cfb0: 31 30 20 4f 46 46 53 45 54 20 35 22 20 0a 20 20  10 OFFSET 5" .  
cfc0: 31 32 20 20 22 53 45 4c 45 43 54 20 61 20 46 52  12  "SELECT a FR
cfd0: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM j1 UNION SELE
cfe0: 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT g FROM j2,j3 
cff0: 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20 31 30  LIMIT (SELECT 10
d000: 29 22 20 0a 0a 20 20 31 33 20 20 22 53 45 4c 45  )" ..  13  "SELE
d010: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 45 58 43  CT * FROM j1 EXC
d020: 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  EPT SELECT * FRO
d030: 4d 20 6a 32 2c 6a 33 20 4f 52 44 45 52 20 42 59  M j2,j3 ORDER BY
d040: 20 61 22 0a 20 20 31 34 20 20 22 53 45 4c 45 43   a".  14  "SELEC
d050: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d060: 6a 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  j1 EXCEPT SELECT
d070: 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 20   max(e) FROM j2 
d080: 4f 52 44 45 52 20 42 59 20 31 22 0a 20 20 31 35  ORDER BY 1".  15
d090: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
d0a0: 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 45 58  *), * FROM j1 EX
d0b0: 43 45 50 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20  CEPT SELECT *,* 
d0c0: 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59  FROM j2 ORDER BY
d0d0: 20 31 2c 32 2c 33 22 0a 20 20 31 36 20 20 22 53   1,2,3".  16  "S
d0e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
d0f0: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
d100: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54  FROM j2,j3 LIMIT
d110: 20 31 30 22 20 0a 20 20 31 37 20 20 22 53 45 4c   10" .  17  "SEL
d120: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 45 58  ECT * FROM j1 EX
d130: 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52  CEPT SELECT * FR
d140: 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 31  OM j2,j3 LIMIT 1
d150: 30 20 4f 46 46 53 45 54 20 35 22 20 0a 20 20 31  0 OFFSET 5" .  1
d160: 38 20 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  8  "SELECT a FRO
d170: 4d 20 6a 31 20 45 58 43 45 50 54 20 53 45 4c 45  M j1 EXCEPT SELE
d180: 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT g FROM j2,j3 
d190: 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20 31 30  LIMIT (SELECT 10
d1a0: 29 22 20 0a 0a 20 20 31 39 20 20 22 53 45 4c 45  )" ..  19  "SELE
d1b0: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54  CT * FROM j1 INT
d1c0: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
d1d0: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f 52 44 45 52  FROM j2,j3 ORDER
d1e0: 20 42 59 20 61 22 0a 20 20 32 30 20 20 22 53 45   BY a".  20  "SE
d1f0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
d200: 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43 54 20  OM j1 INTERSECT 
d210: 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52  SELECT max(e) FR
d220: 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31  OM j2 ORDER BY 1
d230: 22 0a 20 20 32 31 20 20 22 53 45 4c 45 43 54 20  ".  21  "SELECT 
d240: 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d  count(*), * FROM
d250: 20 6a 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   j1 INTERSECT SE
d260: 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32  LECT *,* FROM j2
d270: 20 4f 52 44 45 52 20 42 59 20 31 2c 32 2c 33 22   ORDER BY 1,2,3"
d280: 0a 20 20 32 32 20 20 22 53 45 4c 45 43 54 20 2a  .  22  "SELECT *
d290: 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45   FROM j1 INTERSE
d2a0: 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  CT SELECT * FROM
d2b0: 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 31 30 22   j2,j3 LIMIT 10"
d2c0: 20 0a 20 20 32 33 20 20 22 53 45 4c 45 43 54 20   .  23  "SELECT 
d2d0: 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53  * FROM j1 INTERS
d2e0: 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ECT SELECT * FRO
d2f0: 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 31 30  M j2,j3 LIMIT 10
d300: 20 4f 46 46 53 45 54 20 35 22 20 0a 20 20 32 34   OFFSET 5" .  24
d310: 20 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    "SELECT a FROM
d320: 20 6a 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   j1 INTERSECT SE
d330: 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c 6a  LECT g FROM j2,j
d340: 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20  3 LIMIT (SELECT 
d350: 31 30 29 22 20 0a 7d 20 7b 0a 20 20 64 6f 5f 74  10)" .} {.  do_t
d360: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 33  est e_select-7.3
d370: 2e 24 74 6e 20 7b 20 63 61 74 63 68 20 7b 65 78  .$tn { catch {ex
d380: 65 63 73 71 6c 20 24 73 65 6c 65 63 74 7d 20 6d  ecsql $select} m
d390: 73 67 20 7d 20 30 0a 7d 0a 66 6f 72 65 61 63 68  sg } 0.}.foreach
d3a0: 20 7b 74 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20   {tn select} {. 
d3b0: 20 35 30 20 20 20 22 53 45 4c 45 43 54 20 2a 20   50   "SELECT * 
d3c0: 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59  FROM j1 ORDER BY
d3d0: 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c   1 UNION ALL SEL
d3e0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
d3f0: 22 0a 20 20 35 31 20 20 20 22 53 45 4c 45 43 54  ".  51   "SELECT
d400: 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54   * FROM j1 LIMIT
d410: 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c   1 UNION ALL SEL
d420: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
d430: 22 0a 20 20 35 32 20 20 20 22 53 45 4c 45 43 54  ".  52   "SELECT
d440: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a   count(*) FROM j
d450: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 56 41 4c 55  1 UNION ALL VALU
d460: 45 53 28 31 31 29 20 4f 52 44 45 52 20 42 59 20  ES(11) ORDER BY 
d470: 31 22 0a 20 20 35 33 20 20 20 22 53 45 4c 45 43  1".  53   "SELEC
d480: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d490: 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 56 41 4c  j1 UNION ALL VAL
d4a0: 55 45 53 28 31 31 29 20 4c 49 4d 49 54 20 31 22  UES(11) LIMIT 1"
d4b0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
d4c0: 5f 73 65 6c 65 63 74 2d 37 2e 33 2e 24 74 6e 20  _select-7.3.$tn 
d4d0: 7b 20 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c  { catch {execsql
d4e0: 20 24 73 65 6c 65 63 74 7d 20 6d 73 67 20 7d 20   $select} msg } 
d4f0: 31 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  1.}..# EVIDENCE-
d500: 4f 46 3a 20 52 2d 30 38 35 33 31 2d 33 36 35 34  OF: R-08531-3654
d510: 33 20 41 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  3 A compound SEL
d520: 45 43 54 20 63 72 65 61 74 65 64 20 75 73 69 6e  ECT created usin
d530: 67 20 55 4e 49 4f 4e 20 41 4c 4c 0a 23 20 6f 70  g UNION ALL.# op
d540: 65 72 61 74 6f 72 20 72 65 74 75 72 6e 73 20 61  erator returns a
d550: 6c 6c 20 74 68 65 20 72 6f 77 73 20 66 72 6f 6d  ll the rows from
d560: 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f 20 74   the SELECT to t
d570: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 55  he left of the U
d580: 4e 49 4f 4e 0a 23 20 41 4c 4c 20 6f 70 65 72 61  NION.# ALL opera
d590: 74 6f 72 2c 20 61 6e 64 20 61 6c 6c 20 74 68 65  tor, and all the
d5a0: 20 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 53   rows from the S
d5b0: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
d5c0: 68 74 20 6f 66 20 69 74 2e 0a 23 0a 64 72 6f 70  ht of it..#.drop
d5d0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
d5e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
d5f0: 6c 65 63 74 2d 37 2e 34 2e 30 20 7b 0a 20 20 43  lect-7.4.0 {.  C
d600: 52 45 41 54 45 20 54 41 42 4c 45 20 71 31 28 61  REATE TABLE q1(a
d610: 20 54 45 58 54 2c 20 62 20 49 4e 54 45 47 45 52   TEXT, b INTEGER
d620: 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , c);.  CREATE T
d630: 41 42 4c 45 20 71 32 28 64 20 4e 55 4d 42 45 52  ABLE q2(d NUMBER
d640: 2c 20 65 20 42 4c 4f 42 29 3b 0a 20 20 43 52 45  , e BLOB);.  CRE
d650: 41 54 45 20 54 41 42 4c 45 20 71 33 28 66 20 52  ATE TABLE q3(f R
d660: 45 41 4c 2c 20 67 29 3b 0a 0a 20 20 49 4e 53 45  EAL, g);..  INSE
d670: 52 54 20 49 4e 54 4f 20 71 31 20 56 41 4c 55 45  RT INTO q1 VALUE
d680: 53 28 31 36 2c 20 2d 38 37 2e 36 36 2c 20 4e 55  S(16, -87.66, NU
d690: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  LL);.  INSERT IN
d6a0: 54 4f 20 71 31 20 56 41 4c 55 45 53 28 27 6c 65  TO q1 VALUES('le
d6b0: 67 69 62 6c 65 27 2c 20 39 34 2c 20 2d 34 32 2e  gible', 94, -42.
d6c0: 34 37 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  47);.  INSERT IN
d6d0: 54 4f 20 71 31 20 56 41 4c 55 45 53 28 27 62 65  TO q1 VALUES('be
d6e0: 61 75 74 79 27 2c 20 33 36 2c 20 4e 55 4c 4c 29  auty', 36, NULL)
d6f0: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
d700: 20 71 32 20 56 41 4c 55 45 53 28 27 6c 65 67 69   q2 VALUES('legi
d710: 62 6c 65 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45  ble', 1);.  INSE
d720: 52 54 20 49 4e 54 4f 20 71 32 20 56 41 4c 55 45  RT INTO q2 VALUE
d730: 53 28 27 62 65 61 75 74 79 27 2c 20 32 29 3b 0a  S('beauty', 2);.
d740: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 32    INSERT INTO q2
d750: 20 56 41 4c 55 45 53 28 2d 36 35 2e 39 31 2c 20   VALUES(-65.91, 
d760: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
d770: 4f 20 71 32 20 56 41 4c 55 45 53 28 27 65 6d 61  O q2 VALUES('ema
d780: 6e 61 74 69 6e 67 27 2c 20 2d 31 36 2e 35 36 29  nating', -16.56)
d790: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
d7a0: 20 71 33 20 56 41 4c 55 45 53 28 27 62 65 61 75   q3 VALUES('beau
d7b0: 74 79 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  ty', 2);.  INSER
d7c0: 54 20 49 4e 54 4f 20 71 33 20 56 41 4c 55 45 53  T INTO q3 VALUES
d7d0: 28 27 62 65 61 75 74 79 27 2c 20 32 29 3b 0a 7d  ('beauty', 2);.}
d7e0: 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65   {}.do_select_te
d7f0: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 34  sts e_select-7.4
d800: 20 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54   {.  1   {SELECT
d810: 20 61 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e   a FROM q1 UNION
d820: 20 41 4c 4c 20 53 45 4c 45 43 54 20 64 20 46 52   ALL SELECT d FR
d830: 4f 4d 20 71 32 7d 0a 20 20 20 20 20 20 7b 31 36  OM q2}.      {16
d840: 20 6c 65 67 69 62 6c 65 20 62 65 61 75 74 79 20   legible beauty 
d850: 6c 65 67 69 62 6c 65 20 62 65 61 75 74 79 20 2d  legible beauty -
d860: 36 35 2e 39 31 20 65 6d 61 6e 61 74 69 6e 67 7d  65.91 emanating}
d870: 0a 0a 20 20 32 20 20 20 7b 53 45 4c 45 43 54 20  ..  2   {SELECT 
d880: 2a 20 46 52 4f 4d 20 71 31 20 57 48 45 52 45 20  * FROM q1 WHERE 
d890: 61 3d 31 36 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  a=16 UNION ALL S
d8a0: 45 4c 45 43 54 20 27 78 27 2c 20 2a 20 46 52 4f  ELECT 'x', * FRO
d8b0: 4d 20 71 32 20 57 48 45 52 45 20 6f 69 64 3d 31  M q2 WHERE oid=1
d8c0: 7d 0a 20 20 20 20 20 20 7b 31 36 20 2d 38 37 2e  }.      {16 -87.
d8d0: 36 36 20 7b 7d 20 78 20 6c 65 67 69 62 6c 65 20  66 {} x legible 
d8e0: 31 7d 0a 0a 20 20 33 20 20 20 7b 53 45 4c 45 43  1}..  3   {SELEC
d8f0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
d900: 71 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  q1 UNION ALL SEL
d910: 45 43 54 20 6d 69 6e 28 65 29 20 46 52 4f 4d 20  ECT min(e) FROM 
d920: 71 32 7d 20 0a 20 20 20 20 20 20 7b 33 20 2d 31  q2} .      {3 -1
d930: 36 2e 35 36 7d 0a 0a 20 20 34 20 20 20 7b 53 45  6.56}..  4   {SE
d940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 32 20 55  LECT * FROM q2 U
d950: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
d960: 2a 20 46 52 4f 4d 20 71 33 7d 20 0a 20 20 20 20  * FROM q3} .    
d970: 20 20 7b 6c 65 67 69 62 6c 65 20 31 20 62 65 61    {legible 1 bea
d980: 75 74 79 20 32 20 2d 36 35 2e 39 31 20 34 20 65  uty 2 -65.91 4 e
d990: 6d 61 6e 61 74 69 6e 67 20 2d 31 36 2e 35 36 20  manating -16.56 
d9a0: 62 65 61 75 74 79 20 32 20 62 65 61 75 74 79 20  beauty 2 beauty 
d9b0: 32 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43  2}.} ..# EVIDENC
d9c0: 45 2d 4f 46 3a 20 52 2d 32 30 35 36 30 2d 33 39  E-OF: R-20560-39
d9d0: 31 36 32 20 54 68 65 20 55 4e 49 4f 4e 20 6f 70  162 The UNION op
d9e0: 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 74 68 65  erator works the
d9f0: 20 73 61 6d 65 20 77 61 79 20 61 73 0a 23 20 55   same way as.# U
da00: 4e 49 4f 4e 20 41 4c 4c 2c 20 65 78 63 65 70 74  NION ALL, except
da10: 20 74 68 61 74 20 64 75 70 6c 69 63 61 74 65 20   that duplicate 
da20: 72 6f 77 73 20 61 72 65 20 72 65 6d 6f 76 65 64  rows are removed
da30: 20 66 72 6f 6d 20 74 68 65 20 66 69 6e 61 6c 0a   from the final.
da40: 23 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 23 0a  # result set..#.
da50: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
da60: 65 5f 73 65 6c 65 63 74 2d 37 2e 35 20 7b 0a 20  e_select-7.5 {. 
da70: 20 31 20 20 20 7b 53 45 4c 45 43 54 20 61 20 46   1   {SELECT a F
da80: 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM q1 UNION SEL
da90: 45 43 54 20 64 20 46 52 4f 4d 20 71 32 7d 0a 20  ECT d FROM q2}. 
daa0: 20 20 20 20 20 7b 2d 36 35 2e 39 31 20 31 36 20       {-65.91 16 
dab0: 62 65 61 75 74 79 20 65 6d 61 6e 61 74 69 6e 67  beauty emanating
dac0: 20 6c 65 67 69 62 6c 65 7d 0a 0a 20 20 32 20 20   legible}..  2  
dad0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
dae0: 71 31 20 57 48 45 52 45 20 61 3d 31 36 20 55 4e  q1 WHERE a=16 UN
daf0: 49 4f 4e 20 53 45 4c 45 43 54 20 27 78 27 2c 20  ION SELECT 'x', 
db00: 2a 20 46 52 4f 4d 20 71 32 20 57 48 45 52 45 20  * FROM q2 WHERE 
db10: 6f 69 64 3d 31 7d 0a 20 20 20 20 20 20 7b 31 36  oid=1}.      {16
db20: 20 2d 38 37 2e 36 36 20 7b 7d 20 78 20 6c 65 67   -87.66 {} x leg
db30: 69 62 6c 65 20 31 7d 0a 0a 20 20 33 20 20 20 7b  ible 1}..  3   {
db40: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
db50: 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20 53 45  FROM q1 UNION SE
db60: 4c 45 43 54 20 6d 69 6e 28 65 29 20 46 52 4f 4d  LECT min(e) FROM
db70: 20 71 32 7d 20 0a 20 20 20 20 20 20 7b 2d 31 36   q2} .      {-16
db80: 2e 35 36 20 33 7d 0a 0a 20 20 34 20 20 20 7b 53  .56 3}..  4   {S
db90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 32 20  ELECT * FROM q2 
dba0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46  UNION SELECT * F
dbb0: 52 4f 4d 20 71 33 7d 20 0a 20 20 20 20 20 20 7b  ROM q3} .      {
dbc0: 2d 36 35 2e 39 31 20 34 20 62 65 61 75 74 79 20  -65.91 4 beauty 
dbd0: 32 20 65 6d 61 6e 61 74 69 6e 67 20 2d 31 36 2e  2 emanating -16.
dbe0: 35 36 20 6c 65 67 69 62 6c 65 20 31 7d 0a 7d 20  56 legible 1}.} 
dbf0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
dc00: 20 52 2d 34 35 37 36 34 2d 33 31 37 33 37 20 54   R-45764-31737 T
dc10: 68 65 20 49 4e 54 45 52 53 45 43 54 20 6f 70 65  he INTERSECT ope
dc20: 72 61 74 6f 72 20 72 65 74 75 72 6e 73 20 74 68  rator returns th
dc30: 65 0a 23 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  e.# intersection
dc40: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
dc50: 6f 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  of the left and 
dc60: 72 69 67 68 74 20 53 45 4c 45 43 54 73 2e 0a 23  right SELECTs..#
dc70: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
dc80: 20 65 5f 73 65 6c 65 63 74 2d 37 2e 36 20 7b 0a   e_select-7.6 {.
dc90: 20 20 31 20 20 20 7b 53 45 4c 45 43 54 20 61 20    1   {SELECT a 
dca0: 46 52 4f 4d 20 71 31 20 49 4e 54 45 52 53 45 43  FROM q1 INTERSEC
dcb0: 54 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20  T SELECT d FROM 
dcc0: 71 32 7d 20 7b 62 65 61 75 74 79 20 6c 65 67 69  q2} {beauty legi
dcd0: 62 6c 65 7d 0a 20 20 32 20 20 20 7b 53 45 4c 45  ble}.  2   {SELE
dce0: 43 54 20 2a 20 46 52 4f 4d 20 71 32 20 49 4e 54  CT * FROM q2 INT
dcf0: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
dd00: 46 52 4f 4d 20 71 33 7d 20 7b 62 65 61 75 74 79  FROM q3} {beauty
dd10: 20 32 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   2}.}..# EVIDENC
dd20: 45 2d 4f 46 3a 20 52 2d 32 35 37 38 37 2d 32 38  E-OF: R-25787-28
dd30: 39 34 39 20 54 68 65 20 45 58 43 45 50 54 20 6f  949 The EXCEPT o
dd40: 70 65 72 61 74 6f 72 20 72 65 74 75 72 6e 73 20  perator returns 
dd50: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 23 20  the subset of.# 
dd60: 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79  rows returned by
dd70: 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45 43 54   the left SELECT
dd80: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 6c   that are not al
dd90: 73 6f 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  so returned by t
dda0: 68 65 0a 23 20 72 69 67 68 74 2d 68 61 6e 64 20  he.# right-hand 
ddb0: 53 45 4c 45 43 54 2e 0a 23 0a 64 6f 5f 73 65 6c  SELECT..#.do_sel
ddc0: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
ddd0: 63 74 2d 37 2e 37 20 7b 0a 20 20 31 20 20 20 7b  ct-7.7 {.  1   {
dde0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31  SELECT a FROM q1
ddf0: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 64   EXCEPT SELECT d
de00: 20 46 52 4f 4d 20 71 32 7d 20 7b 31 36 7d 0a 0a   FROM q2} {16}..
de10: 20 20 32 20 20 20 7b 53 45 4c 45 43 54 20 2a 20    2   {SELECT * 
de20: 46 52 4f 4d 20 71 32 20 45 58 43 45 50 54 20 53  FROM q2 EXCEPT S
de30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d  ELECT * FROM q3}
de40: 20 0a 20 20 20 20 20 20 7b 2d 36 35 2e 39 31 20   .      {-65.91 
de50: 34 20 65 6d 61 6e 61 74 69 6e 67 20 2d 31 36 2e  4 emanating -16.
de60: 35 36 20 6c 65 67 69 62 6c 65 20 31 7d 0a 7d 0a  56 legible 1}.}.
de70: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
de80: 52 2d 34 30 37 32 39 2d 35 36 34 34 37 20 44 75  R-40729-56447 Du
de90: 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
dea0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
deb0: 65 20 72 65 73 75 6c 74 73 0a 23 20 6f 66 20 49  e results.# of I
dec0: 4e 54 45 52 53 45 43 54 20 61 6e 64 20 45 58 43  NTERSECT and EXC
ded0: 45 50 54 20 6f 70 65 72 61 74 6f 72 73 20 62 65  EPT operators be
dee0: 66 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  fore the result 
def0: 73 65 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  set is returned.
df00: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
df10: 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 38 20  ts e_select-7.8 
df20: 7b 0a 20 20 30 20 20 20 7b 53 45 4c 45 43 54 20  {.  0   {SELECT 
df30: 2a 20 46 52 4f 4d 20 71 33 7d 20 7b 62 65 61 75  * FROM q3} {beau
df40: 74 79 20 32 20 62 65 61 75 74 79 20 32 7d 0a 0a  ty 2 beauty 2}..
df50: 20 20 31 20 20 20 7b 53 45 4c 45 43 54 20 2a 20    1   {SELECT * 
df60: 46 52 4f 4d 20 71 33 20 49 4e 54 45 52 53 45 43  FROM q3 INTERSEC
df70: 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  T SELECT * FROM 
df80: 71 33 7d 20 7b 62 65 61 75 74 79 20 32 7d 0a 20  q3} {beauty 2}. 
df90: 20 32 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46   2   {SELECT * F
dfa0: 52 4f 4d 20 71 33 20 45 58 43 45 50 54 20 53 45  ROM q3 EXCEPT SE
dfb0: 4c 45 43 54 20 61 2c 62 20 46 52 4f 4d 20 71 31  LECT a,b FROM q1
dfc0: 7d 20 20 7b 62 65 61 75 74 79 20 32 7d 0a 7d 0a  }  {beauty 2}.}.
dfd0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
dfe0: 52 2d 34 36 37 36 35 2d 34 33 33 36 32 20 46 6f  R-46765-43362 Fo
dff0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
e000: 66 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 64 75  f determining du
e010: 70 6c 69 63 61 74 65 0a 23 20 72 6f 77 73 20 66  plicate.# rows f
e020: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  or the results o
e030: 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  f compound SELEC
e040: 54 20 6f 70 65 72 61 74 6f 72 73 2c 20 4e 55 4c  T operators, NUL
e050: 4c 20 76 61 6c 75 65 73 20 61 72 65 0a 23 20 63  L values are.# c
e060: 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
e070: 74 6f 20 6f 74 68 65 72 20 4e 55 4c 4c 20 76 61  to other NULL va
e080: 6c 75 65 73 20 61 6e 64 20 64 69 73 74 69 6e 63  lues and distinc
e090: 74 20 66 72 6f 6d 20 61 6c 6c 20 6e 6f 6e 2d 4e  t from all non-N
e0a0: 55 4c 4c 0a 23 20 76 61 6c 75 65 73 2e 0a 23 0a  ULL.# values..#.
e0b0: 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c  db nullvalue nul
e0c0: 6c 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  l.do_select_test
e0d0: 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 39 20 7b  s e_select-7.9 {
e0e0: 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54 20 4e  .  1   {SELECT N
e0f0: 55 4c 4c 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  ULL UNION ALL SE
e100: 4c 45 43 54 20 4e 55 4c 4c 7d 20 7b 6e 75 6c 6c  LECT NULL} {null
e110: 20 6e 75 6c 6c 7d 0a 20 20 32 20 20 20 7b 53 45   null}.  2   {SE
e120: 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20  LECT NULL UNION 
e130: 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c 4c 7d      SELECT NULL}
e140: 20 7b 6e 75 6c 6c 7d 0a 20 20 33 20 20 20 7b 53   {null}.  3   {S
e150: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 4e 54 45 52  ELECT NULL INTER
e160: 53 45 43 54 20 53 45 4c 45 43 54 20 4e 55 4c 4c  SECT SELECT NULL
e170: 7d 20 7b 6e 75 6c 6c 7d 0a 20 20 34 20 20 20 7b  } {null}.  4   {
e180: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 45 58 43 45  SELECT NULL EXCE
e190: 50 54 20 20 20 20 53 45 4c 45 43 54 20 4e 55 4c  PT    SELECT NUL
e1a0: 4c 7d 20 7b 7d 0a 0a 20 20 35 20 20 20 7b 53 45  L} {}..  5   {SE
e1b0: 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20  LECT NULL UNION 
e1c0: 41 4c 4c 20 53 45 4c 45 43 54 20 27 61 62 27 7d  ALL SELECT 'ab'}
e1d0: 20 7b 6e 75 6c 6c 20 61 62 7d 0a 20 20 36 20 20   {null ab}.  6  
e1e0: 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e   {SELECT NULL UN
e1f0: 49 4f 4e 20 20 20 20 20 53 45 4c 45 43 54 20 27  ION     SELECT '
e200: 61 62 27 7d 20 7b 6e 75 6c 6c 20 61 62 7d 0a 20  ab'} {null ab}. 
e210: 20 37 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c   7   {SELECT NUL
e220: 4c 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  L INTERSECT SELE
e230: 43 54 20 27 61 62 27 7d 20 7b 7d 0a 20 20 38 20  CT 'ab'} {}.  8 
e240: 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 45    {SELECT NULL E
e250: 58 43 45 50 54 20 20 20 20 53 45 4c 45 43 54 20  XCEPT    SELECT 
e260: 27 61 62 27 7d 20 7b 6e 75 6c 6c 7d 0a 0a 20 20  'ab'} {null}..  
e270: 39 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c  9   {SELECT NULL
e280: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
e290: 54 20 30 7d 20 7b 6e 75 6c 6c 20 30 7d 0a 20 20  T 0} {null 0}.  
e2a0: 31 30 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c  10  {SELECT NULL
e2b0: 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c 45 43   UNION     SELEC
e2c0: 54 20 30 7d 20 7b 6e 75 6c 6c 20 30 7d 0a 20 20  T 0} {null 0}.  
e2d0: 31 31 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c  11  {SELECT NULL
e2e0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
e2f0: 54 20 30 7d 20 7b 7d 0a 20 20 31 32 20 20 7b 53  T 0} {}.  12  {S
e300: 45 4c 45 43 54 20 4e 55 4c 4c 20 45 58 43 45 50  ELECT NULL EXCEP
e310: 54 20 20 20 20 53 45 4c 45 43 54 20 30 7d 20 7b  T    SELECT 0} {
e320: 6e 75 6c 6c 7d 0a 0a 20 20 31 33 20 20 7b 53 45  null}..  13  {SE
e330: 4c 45 43 54 20 63 20 46 52 4f 4d 20 71 31 20 55  LECT c FROM q1 U
e340: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
e350: 67 20 46 52 4f 4d 20 71 33 7d 20 7b 6e 75 6c 6c  g FROM q3} {null
e360: 20 2d 34 32 2e 34 37 20 6e 75 6c 6c 20 32 20 32   -42.47 null 2 2
e370: 7d 0a 20 20 31 34 20 20 7b 53 45 4c 45 43 54 20  }.  14  {SELECT 
e380: 63 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20  c FROM q1 UNION 
e390: 20 20 20 20 53 45 4c 45 43 54 20 67 20 46 52 4f      SELECT g FRO
e3a0: 4d 20 71 33 7d 20 7b 6e 75 6c 6c 20 2d 34 32 2e  M q3} {null -42.
e3b0: 34 37 20 32 7d 0a 20 20 31 35 20 20 7b 53 45 4c  47 2}.  15  {SEL
e3c0: 45 43 54 20 63 20 46 52 4f 4d 20 71 31 20 49 4e  ECT c FROM q1 IN
e3d0: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 67  TERSECT SELECT g
e3e0: 20 46 52 4f 4d 20 71 33 7d 20 7b 7d 0a 20 20 31   FROM q3} {}.  1
e3f0: 36 20 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f  6  {SELECT c FRO
e400: 4d 20 71 31 20 45 58 43 45 50 54 20 20 20 20 53  M q1 EXCEPT    S
e410: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 71 33 7d  ELECT g FROM q3}
e420: 20 7b 6e 75 6c 6c 20 2d 34 32 2e 34 37 7d 0a 7d   {null -42.47}.}
e430: 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d  .db nullvalue {}
e440: 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46   ..# EVIDENCE-OF
e450: 3a 20 52 2d 35 31 32 33 32 2d 35 30 32 32 34 20  : R-51232-50224 
e460: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
e470: 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 63  quence used to c
e480: 6f 6d 70 61 72 65 20 74 77 6f 0a 23 20 74 65 78  ompare two.# tex
e490: 74 20 76 61 6c 75 65 73 20 69 73 20 64 65 74 65  t values is dete
e4a0: 72 6d 69 6e 65 64 20 61 73 20 69 66 20 74 68 65  rmined as if the
e4b0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
e4c0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 2d 68  left and right-h
e4d0: 61 6e 64 0a 23 20 53 45 4c 45 43 54 20 73 74 61  and.# SELECT sta
e4e0: 74 65 6d 65 6e 74 73 20 77 65 72 65 20 74 68 65  tements were the
e4f0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 2d   left and right-
e500: 68 61 6e 64 20 6f 70 65 72 61 6e 64 73 20 6f 66  hand operands of
e510: 20 74 68 65 20 65 71 75 61 6c 73 0a 23 20 28 3d   the equals.# (=
e520: 29 20 6f 70 65 72 61 74 6f 72 2c 20 65 78 63 65  ) operator, exce
e530: 70 74 20 74 68 61 74 20 67 72 65 61 74 65 72 20  pt that greater 
e540: 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 6e 6f  precedence is no
e550: 74 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 0a  t assigned to a.
e560: 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  # collation sequ
e570: 65 6e 63 65 20 73 70 65 63 69 66 69 65 64 20 77  ence specified w
e580: 69 74 68 20 74 68 65 20 70 6f 73 74 66 69 78 20  ith the postfix 
e590: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
e5a0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
e5b0: 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  les.do_execsql_t
e5c0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31  est e_select-7.1
e5d0: 30 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  0.0 {.  CREATE T
e5e0: 41 42 4c 45 20 79 31 28 61 20 43 4f 4c 4c 41 54  ABLE y1(a COLLAT
e5f0: 45 20 6e 6f 63 61 73 65 2c 20 62 20 43 4f 4c 4c  E nocase, b COLL
e600: 41 54 45 20 62 69 6e 61 72 79 2c 20 63 29 3b 0a  ATE binary, c);.
e610: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 79 31    INSERT INTO y1
e620: 20 56 41 4c 55 45 53 28 27 41 62 63 27 2c 20 27   VALUES('Abc', '
e630: 61 62 63 27 2c 20 27 61 42 43 27 29 3b 0a 7d 20  abc', 'aBC');.} 
e640: 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  {}.do_select_tes
e650: 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 30  ts e_select-7.10
e660: 20 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54   {.  1   {SELECT
e670: 20 27 61 62 63 27 20 20 20 20 20 20 20 20 20 20   'abc'          
e680: 20 20 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45        UNION SELE
e690: 43 54 20 27 41 42 43 27 7d 20 7b 41 42 43 20 61  CT 'ABC'} {ABC a
e6a0: 62 63 7d 0a 20 20 32 20 20 20 7b 53 45 4c 45 43  bc}.  2   {SELEC
e6b0: 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45 20  T 'abc' COLLATE 
e6c0: 6e 6f 63 61 73 65 20 55 4e 49 4f 4e 20 53 45 4c  nocase UNION SEL
e6d0: 45 43 54 20 27 41 42 43 27 7d 20 7b 41 42 43 7d  ECT 'ABC'} {ABC}
e6e0: 0a 20 20 33 20 20 20 7b 53 45 4c 45 43 54 20 27  .  3   {SELECT '
e6f0: 61 62 63 27 20 20 20 20 20 20 20 20 20 20 20 20  abc'            
e700: 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54      UNION SELECT
e710: 20 27 41 42 43 27 20 43 4f 4c 4c 41 54 45 20 6e   'ABC' COLLATE n
e720: 6f 63 61 73 65 7d 20 7b 41 42 43 7d 0a 20 20 34  ocase} {ABC}.  4
e730: 20 20 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27     {SELECT 'abc'
e740: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20   COLLATE binary 
e750: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42  UNION SELECT 'AB
e760: 43 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  C' COLLATE nocas
e770: 65 7d 20 7b 41 42 43 20 61 62 63 7d 0a 20 20 35  e} {ABC abc}.  5
e780: 20 20 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27     {SELECT 'abc'
e790: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
e7a0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42  UNION SELECT 'AB
e7b0: 43 27 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  C' COLLATE binar
e7c0: 79 7d 20 7b 41 42 43 7d 0a 0a 20 20 36 20 20 20  y} {ABC}..  6   
e7d0: 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 79  {SELECT a FROM y
e7e0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
e7f0: 20 46 52 4f 4d 20 79 31 7d 20 20 20 20 20 20 20   FROM y1}       
e800: 20 20 20 20 20 20 20 20 20 7b 61 62 63 7d 0a 20           {abc}. 
e810: 20 37 20 20 20 7b 53 45 4c 45 43 54 20 62 20 46   7   {SELECT b F
e820: 52 4f 4d 20 79 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM y1 UNION SEL
e830: 45 43 54 20 61 20 46 52 4f 4d 20 79 31 7d 20 20  ECT a FROM y1}  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
e850: 62 63 20 61 62 63 7d 0a 20 20 38 20 20 20 7b 53  bc abc}.  8   {S
e860: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 79 31 20  ELECT a FROM y1 
e870: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
e880: 52 4f 4d 20 79 31 7d 20 20 20 20 20 20 20 20 20  ROM y1}         
e890: 20 20 20 20 20 20 20 7b 61 42 43 7d 0a 0a 20 20         {aBC}..  
e8a0: 39 20 20 20 7b 53 45 4c 45 43 54 20 61 20 46 52  9   {SELECT a FR
e8b0: 4f 4d 20 79 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM y1 UNION SELE
e8c0: 43 54 20 63 20 43 4f 4c 4c 41 54 45 20 62 69 6e  CT c COLLATE bin
e8d0: 61 72 79 20 46 52 4f 4d 20 79 31 7d 20 7b 61 42  ary FROM y1} {aB
e8e0: 43 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  C}.}..# EVIDENCE
e8f0: 2d 4f 46 3a 20 52 2d 33 32 37 30 36 2d 30 37 34  -OF: R-32706-074
e900: 30 33 20 4e 6f 20 61 66 66 69 6e 69 74 79 20 74  03 No affinity t
e910: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 61  ransformations a
e920: 72 65 20 61 70 70 6c 69 65 64 20 74 6f 0a 23 20  re applied to.# 
e930: 61 6e 79 20 76 61 6c 75 65 73 20 77 68 65 6e 20  any values when 
e940: 63 6f 6d 70 61 72 69 6e 67 20 72 6f 77 73 20 61  comparing rows a
e950: 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
e960: 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 23 0a 64  ound SELECT..#.d
e970: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
e980: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
e990: 5f 73 65 6c 65 63 74 2d 37 2e 31 30 2e 30 20 7b  _select-7.10.0 {
e9a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
e9b0: 77 31 28 61 20 54 45 58 54 2c 20 62 20 4e 55 4d  w1(a TEXT, b NUM
e9c0: 42 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20 54  BER);.  CREATE T
e9d0: 41 42 4c 45 20 77 32 28 61 2c 20 62 20 54 45 58  ABLE w2(a, b TEX
e9e0: 54 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  T);..  INSERT IN
e9f0: 54 4f 20 77 31 20 56 41 4c 55 45 53 28 27 31 27  TO w1 VALUES('1'
ea00: 2c 20 34 2e 31 29 3b 0a 20 20 49 4e 53 45 52 54  , 4.1);.  INSERT
ea10: 20 49 4e 54 4f 20 77 32 20 56 41 4c 55 45 53 28   INTO w2 VALUES(
ea20: 31 2c 20 34 2e 31 29 3b 0a 7d 20 7b 7d 0a 0a 64  1, 4.1);.} {}..d
ea30: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
ea40: 5f 73 65 6c 65 63 74 2d 37 2e 31 31 20 7b 0a 20  _select-7.11 {. 
ea50: 20 31 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46   1  { SELECT a F
ea60: 52 4f 4d 20 77 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM w1 UNION SEL
ea70: 45 43 54 20 61 20 46 52 4f 4d 20 77 32 20 7d 20  ECT a FROM w2 } 
ea80: 7b 31 20 31 7d 0a 20 20 32 20 20 7b 20 53 45 4c  {1 1}.  2  { SEL
ea90: 45 43 54 20 61 20 46 52 4f 4d 20 77 32 20 55 4e  ECT a FROM w2 UN
eaa0: 49 4f 4e 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ION SELECT a FRO
eab0: 4d 20 77 31 20 7d 20 7b 31 20 31 7d 0a 20 20 33  M w1 } {1 1}.  3
eac0: 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
ead0: 4d 20 77 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M w1 UNION SELEC
eae0: 54 20 62 20 46 52 4f 4d 20 77 32 20 7d 20 7b 34  T b FROM w2 } {4
eaf0: 2e 31 20 34 2e 31 7d 0a 20 20 34 20 20 7b 20 53  .1 4.1}.  4  { S
eb00: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32 20  ELECT b FROM w2 
eb10: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
eb20: 52 4f 4d 20 77 31 20 7d 20 7b 34 2e 31 20 34 2e  ROM w1 } {4.1 4.
eb30: 31 7d 0a 0a 20 20 35 20 20 7b 20 53 45 4c 45 43  1}..  5  { SELEC
eb40: 54 20 61 20 46 52 4f 4d 20 77 31 20 49 4e 54 45  T a FROM w1 INTE
eb50: 52 53 45 43 54 20 53 45 4c 45 43 54 20 61 20 46  RSECT SELECT a F
eb60: 52 4f 4d 20 77 32 20 7d 20 7b 7d 0a 20 20 36 20  ROM w2 } {}.  6 
eb70: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
eb80: 20 77 32 20 49 4e 54 45 52 53 45 43 54 20 53 45   w2 INTERSECT SE
eb90: 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20 7d  LECT a FROM w1 }
eba0: 20 7b 7d 0a 20 20 37 20 20 7b 20 53 45 4c 45 43   {}.  7  { SELEC
ebb0: 54 20 62 20 46 52 4f 4d 20 77 31 20 49 4e 54 45  T b FROM w1 INTE
ebc0: 52 53 45 43 54 20 53 45 4c 45 43 54 20 62 20 46  RSECT SELECT b F
ebd0: 52 4f 4d 20 77 32 20 7d 20 7b 7d 0a 20 20 38 20  ROM w2 } {}.  8 
ebe0: 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
ebf0: 20 77 32 20 49 4e 54 45 52 53 45 43 54 20 53 45   w2 INTERSECT SE
ec00: 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31 20 7d  LECT b FROM w1 }
ec10: 20 7b 7d 0a 0a 20 20 39 20 20 7b 20 53 45 4c 45   {}..  9  { SELE
ec20: 43 54 20 61 20 46 52 4f 4d 20 77 31 20 45 58 43  CT a FROM w1 EXC
ec30: 45 50 54 20 53 45 4c 45 43 54 20 61 20 46 52 4f  EPT SELECT a FRO
ec40: 4d 20 77 32 20 7d 20 7b 31 7d 0a 20 20 31 30 20  M w2 } {1}.  10 
ec50: 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  { SELECT a FROM 
ec60: 77 32 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  w2 EXCEPT SELECT
ec70: 20 61 20 46 52 4f 4d 20 77 31 20 7d 20 7b 31 7d   a FROM w1 } {1}
ec80: 0a 20 20 31 31 20 7b 20 53 45 4c 45 43 54 20 62  .  11 { SELECT b
ec90: 20 46 52 4f 4d 20 77 31 20 45 58 43 45 50 54 20   FROM w1 EXCEPT 
eca0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32  SELECT b FROM w2
ecb0: 20 7d 20 7b 34 2e 31 7d 0a 20 20 31 32 20 7b 20   } {4.1}.  12 { 
ecc0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32  SELECT b FROM w2
ecd0: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 62   EXCEPT SELECT b
ece0: 20 46 52 4f 4d 20 77 31 20 7d 20 7b 34 2e 31 7d   FROM w1 } {4.1}
ecf0: 0a 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .}...# EVIDENCE-
ed00: 4f 46 3a 20 52 2d 33 32 35 36 32 2d 32 30 35 36  OF: R-32562-2056
ed10: 36 20 57 68 65 6e 20 74 68 72 65 65 20 6f 72 20  6 When three or 
ed20: 6d 6f 72 65 20 73 69 6d 70 6c 65 20 53 45 4c 45  more simple SELE
ed30: 43 54 73 20 61 72 65 0a 23 20 63 6f 6e 6e 65 63  CTs are.# connec
ed40: 74 65 64 20 69 6e 74 6f 20 61 20 63 6f 6d 70 6f  ted into a compo
ed50: 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 79  und SELECT, they
ed60: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
ed70: 20 74 6f 20 72 69 67 68 74 2e 20 49 6e 0a 23 20   to right. In.# 
ed80: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
ed90: 22 41 22 2c 20 22 42 22 20 61 6e 64 20 22 43 22  "A", "B" and "C"
eda0: 20 61 72 65 20 61 6c 6c 20 73 69 6d 70 6c 65 20   are all simple 
edb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
edc0: 73 2c 20 28 41 0a 23 20 6f 70 20 42 20 6f 70 20  s, (A.# op B op 
edd0: 43 29 20 69 73 20 70 72 6f 63 65 73 73 65 64 20  C) is processed 
ede0: 61 73 20 28 28 41 20 6f 70 20 42 29 20 6f 70 20  as ((A op B) op 
edf0: 43 29 2e 0a 23 0a 23 20 20 20 65 5f 73 65 6c 65  C)..#.#   e_sele
ee00: 63 74 2d 37 2e 31 32 2e 31 3a 20 50 72 65 63 65  ct-7.12.1: Prece
ee10: 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20 76  dence of UNION v
ee20: 73 2e 20 49 4e 54 45 52 53 45 43 54 20 0a 23 20  s. INTERSECT .# 
ee30: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
ee40: 32 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  2: Precedence of
ee50: 20 55 4e 49 4f 4e 20 76 73 2e 20 55 4e 49 4f 4e   UNION vs. UNION
ee60: 20 41 4c 4c 20 0a 23 20 20 20 65 5f 73 65 6c 65   ALL .#   e_sele
ee70: 63 74 2d 37 2e 31 32 2e 33 3a 20 50 72 65 63 65  ct-7.12.3: Prece
ee80: 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20 76  dence of UNION v
ee90: 73 2e 20 45 58 43 45 50 54 0a 23 20 20 20 65 5f  s. EXCEPT.#   e_
eea0: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 34 3a 20 50  select-7.12.4: P
eeb0: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 49 4e 54  recedence of INT
eec0: 45 52 53 45 43 54 20 76 73 2e 20 55 4e 49 4f 4e  ERSECT vs. UNION
eed0: 20 41 4c 4c 20 0a 23 20 20 20 65 5f 73 65 6c 65   ALL .#   e_sele
eee0: 63 74 2d 37 2e 31 32 2e 35 3a 20 50 72 65 63 65  ct-7.12.5: Prece
eef0: 64 65 6e 63 65 20 6f 66 20 49 4e 54 45 52 53 45  dence of INTERSE
ef00: 43 54 20 76 73 2e 20 45 58 43 45 50 54 0a 23 20  CT vs. EXCEPT.# 
ef10: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
ef20: 36 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  6: Precedence of
ef30: 20 55 4e 49 4f 4e 20 41 4c 4c 20 76 73 2e 20 45   UNION ALL vs. E
ef40: 58 43 45 50 54 0a 23 20 20 20 65 5f 73 65 6c 65  XCEPT.#   e_sele
ef50: 63 74 2d 37 2e 31 32 2e 37 3a 20 43 68 65 63 6b  ct-7.12.7: Check
ef60: 20 74 68 61 74 20 22 61 20 45 58 43 45 50 54 20   that "a EXCEPT 
ef70: 62 20 45 58 43 45 50 54 20 63 22 20 69 73 20 70  b EXCEPT c" is p
ef80: 72 6f 63 65 73 73 65 64 20 61 73 20 0a 23 20 20  rocessed as .#  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 22 28 61 20 45 58 43 45 50 54 20 62 29 20 45   "(a EXCEPT b) E
efb0: 58 43 45 50 54 20 63 22 2e 0a 23 0a 23 20 54 68  XCEPT c"..#.# Th
efc0: 65 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20  e INTERSECT and 
efd0: 45 58 43 45 50 54 20 6f 70 65 72 61 74 69 6f 6e  EXCEPT operation
efe0: 73 20 61 72 65 20 6d 75 74 75 61 6c 6c 79 20 63  s are mutually c
eff0: 6f 6d 6d 75 74 61 74 69 76 65 2e 20 53 6f 0a 23  ommutative. So.#
f000: 20 74 68 65 20 65 5f 73 65 6c 65 63 74 2d 37 2e   the e_select-7.
f010: 31 32 2e 35 20 74 65 73 74 20 63 61 73 65 73 20  12.5 test cases 
f020: 64 6f 20 6e 6f 74 20 70 72 6f 76 65 20 76 65 72  do not prove ver
f030: 79 20 6d 75 63 68 2e 0a 23 0a 64 72 6f 70 5f 61  y much..#.drop_a
f040: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65  ll_tables.do_exe
f050: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
f060: 63 74 2d 37 2e 31 32 2e 30 20 7b 0a 20 20 43 52  ct-7.12.0 {.  CR
f070: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
f080: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f090: 74 31 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  t1 VALUES(1);.  
f0a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f0b0: 41 4c 55 45 53 28 32 29 3b 0a 20 20 49 4e 53 45  ALUES(2);.  INSE
f0c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
f0d0: 53 28 33 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 65 61  S(3);.} {}.forea
f0e0: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65  ch {tn select re
f0f0: 73 7d 20 7b 0a 20 20 31 61 20 22 28 31 2c 32 29  s} {.  1a "(1,2)
f100: 20 49 4e 54 45 52 53 45 43 54 20 28 31 29 20 20   INTERSECT (1)  
f110: 20 55 4e 49 4f 4e 20 20 20 20 20 28 33 29 22 20   UNION     (3)" 
f120: 20 20 7b 31 20 33 7d 0a 20 20 31 62 20 22 28 33    {1 3}.  1b "(3
f130: 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 28 31  )   UNION     (1
f140: 2c 32 29 20 49 4e 54 45 52 53 45 43 54 20 28 31  ,2) INTERSECT (1
f150: 29 22 20 20 20 7b 31 7d 0a 0a 20 20 32 61 20 22  )"   {1}..  2a "
f160: 28 31 2c 32 29 20 55 4e 49 4f 4e 20 20 20 20 20  (1,2) UNION     
f170: 28 33 29 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20  (3)   UNION ALL 
f180: 28 31 29 22 20 20 20 7b 31 20 32 20 33 20 31 7d  (1)"   {1 2 3 1}
f190: 0a 20 20 32 62 20 22 28 31 29 20 20 20 55 4e 49  .  2b "(1)   UNI
f1a0: 4f 4e 20 41 4c 4c 20 28 33 29 20 20 20 55 4e 49  ON ALL (3)   UNI
f1b0: 4f 4e 20 20 20 20 20 28 31 2c 32 29 22 20 7b 31  ON     (1,2)" {1
f1c0: 20 32 20 33 7d 0a 0a 20 20 33 61 20 22 28 31 2c   2 3}..  3a "(1,
f1d0: 32 29 20 55 4e 49 4f 4e 20 20 20 20 20 28 33 29  2) UNION     (3)
f1e0: 20 20 20 45 58 43 45 50 54 20 20 20 20 28 31 29     EXCEPT    (1)
f1f0: 22 20 20 20 7b 32 20 33 7d 0a 20 20 33 62 20 22  "   {2 3}.  3b "
f200: 28 31 2c 32 29 20 45 58 43 45 50 54 20 20 20 20  (1,2) EXCEPT    
f210: 28 33 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20  (3)   UNION     
f220: 28 31 29 22 20 20 20 7b 31 20 32 7d 0a 0a 20 20  (1)"   {1 2}..  
f230: 34 61 20 22 28 31 2c 32 29 20 49 4e 54 45 52 53  4a "(1,2) INTERS
f240: 45 43 54 20 28 31 29 20 20 20 55 4e 49 4f 4e 20  ECT (1)   UNION 
f250: 41 4c 4c 20 28 33 29 22 20 20 20 7b 31 20 33 7d  ALL (3)"   {1 3}
f260: 0a 20 20 34 62 20 22 28 33 29 20 20 20 55 4e 49  .  4b "(3)   UNI
f270: 4f 4e 20 20 20 20 20 28 31 2c 32 29 20 49 4e 54  ON     (1,2) INT
f280: 45 52 53 45 43 54 20 28 31 29 22 20 20 20 7b 31  ERSECT (1)"   {1
f290: 7d 0a 0a 20 20 35 61 20 22 28 31 2c 32 29 20 49  }..  5a "(1,2) I
f2a0: 4e 54 45 52 53 45 43 54 20 28 32 29 20 20 20 45  NTERSECT (2)   E
f2b0: 58 43 45 50 54 20 20 20 20 28 32 29 22 20 20 20  XCEPT    (2)"   
f2c0: 7b 7d 0a 20 20 35 62 20 22 28 32 2c 33 29 20 45  {}.  5b "(2,3) E
f2d0: 58 43 45 50 54 20 20 20 20 28 32 29 20 20 20 49  XCEPT    (2)   I
f2e0: 4e 54 45 52 53 45 43 54 20 28 32 29 22 20 20 20  NTERSECT (2)"   
f2f0: 7b 7d 0a 0a 20 20 36 61 20 22 28 32 29 20 20 20  {}..  6a "(2)   
f300: 55 4e 49 4f 4e 20 41 4c 4c 20 28 32 29 20 20 20  UNION ALL (2)   
f310: 45 58 43 45 50 54 20 20 20 20 28 32 29 22 20 20  EXCEPT    (2)"  
f320: 20 7b 7d 0a 20 20 36 62 20 22 28 32 29 20 20 20   {}.  6b "(2)   
f330: 45 58 43 45 50 54 20 20 20 20 28 32 29 20 20 20  EXCEPT    (2)   
f340: 55 4e 49 4f 4e 20 41 4c 4c 20 28 32 29 22 20 20  UNION ALL (2)"  
f350: 20 7b 32 7d 0a 0a 20 20 37 20 20 22 28 32 2c 33   {2}..  7  "(2,3
f360: 29 20 45 58 43 45 50 54 20 20 20 20 28 32 29 20  ) EXCEPT    (2) 
f370: 20 20 45 58 43 45 50 54 20 20 20 20 28 33 29 22    EXCEPT    (3)"
f380: 20 20 20 7b 7d 0a 7d 20 7b 0a 20 20 73 65 74 20     {}.} {.  set 
f390: 73 65 6c 65 63 74 20 5b 73 74 72 69 6e 67 20 6d  select [string m
f3a0: 61 70 20 7b 28 20 7b 53 45 4c 45 43 54 20 78 20  ap {( {SELECT x 
f3b0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20  FROM t1 WHERE x 
f3c0: 49 4e 20 28 7d 7d 20 24 73 65 6c 65 63 74 5d 0a  IN (}} $select].
f3d0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
f3e0: 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e  t e_select-7.12.
f3f0: 24 74 6e 20 24 73 65 6c 65 63 74 20 5b 6c 69 73  $tn $select [lis
f400: 74 20 7b 2a 7d 24 72 65 73 5d 0a 7d 0a 0a 0a 23  t {*}$res].}...#
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 2d 2d 2d  ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4f 52 44 45  ---------.# ORDE
f460: 52 20 42 59 20 63 6c 61 75 73 65 73 0a 23 0a 0a  R BY clauses.#..
f470: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
f480: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
f490: 65 5f 73 65 6c 65 63 74 2d 38 2e 31 2e 30 20 7b  e_select-8.1.0 {
f4a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
f4b0: 64 31 28 78 2c 20 79 2c 20 7a 29 3b 0a 0a 20 20  d1(x, y, z);..  
f4c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56  INSERT INTO d1 V
f4d0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
f4e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31    INSERT INTO d1
f4f0: 20 56 41 4c 55 45 53 28 32 2c 20 35 2c 20 2d 31   VALUES(2, 5, -1
f500: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f510: 20 64 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   d1 VALUES(1, 2,
f520: 20 38 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   8);.  INSERT IN
f530: 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31 2c 20  TO d1 VALUES(1, 
f540: 32 2c 20 37 29 3b 0a 20 20 49 4e 53 45 52 54 20  2, 7);.  INSERT 
f550: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 32  INTO d1 VALUES(2
f560: 2c 20 34 2c 20 39 33 29 3b 0a 20 20 49 4e 53 45  , 4, 93);.  INSE
f570: 52 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45  RT INTO d1 VALUE
f580: 53 28 31 2c 20 32 2c 20 2d 32 30 29 3b 0a 20 20  S(1, 2, -20);.  
f590: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56  INSERT INTO d1 V
f5a0: 41 4c 55 45 53 28 31 2c 20 34 2c 20 39 33 29 3b  ALUES(1, 4, 93);
f5b0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
f5c0: 31 20 56 41 4c 55 45 53 28 31 2c 20 35 2c 20 2d  1 VALUES(1, 5, -
f5d0: 31 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  1);..  CREATE TA
f5e0: 42 4c 45 20 64 32 28 61 2c 20 62 29 3b 0a 20 20  BLE d2(a, b);.  
f5f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56  INSERT INTO d2 V
f600: 41 4c 55 45 53 28 27 67 65 6e 74 6c 79 27 2c 20  ALUES('gently', 
f610: 27 66 61 69 6c 69 6e 67 73 27 29 3b 0a 20 20 49  'failings');.  I
f620: 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56 41  NSERT INTO d2 VA
f630: 4c 55 45 53 28 27 63 6f 6d 6d 65 72 63 69 61 6c  LUES('commercial
f640: 73 27 2c 20 27 62 61 74 68 72 6f 62 65 27 29 3b  s', 'bathrobe');
f650: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
f660: 32 20 56 41 4c 55 45 53 28 27 69 74 65 72 61 74  2 VALUES('iterat
f670: 65 27 2c 20 27 73 65 78 74 6f 6e 27 29 3b 0a 20  e', 'sexton');. 
f680: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20   INSERT INTO d2 
f690: 56 41 4c 55 45 53 28 27 62 61 62 69 65 64 27 2c  VALUES('babied',
f6a0: 20 27 63 68 61 72 69 74 61 62 6c 65 6e 65 73 73   'charitableness
f6b0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
f6c0: 4f 20 64 32 20 56 41 4c 55 45 53 28 27 73 6f 6c  O d2 VALUES('sol
f6d0: 65 6d 6e 6e 65 73 73 27 2c 20 27 61 6e 6e 65 78  emnness', 'annex
f6e0: 65 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ed');.  INSERT I
f6f0: 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 72  NTO d2 VALUES('r
f700: 65 6a 6f 69 63 69 6e 67 27 2c 20 27 6c 69 61 62  ejoicing', 'liab
f710: 69 6c 69 74 69 65 73 27 29 3b 0a 20 20 49 4e 53  ilities');.  INS
f720: 45 52 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55  ERT INTO d2 VALU
f730: 45 53 28 27 70 72 61 67 6d 61 74 69 73 74 27 2c  ES('pragmatist',
f740: 20 27 67 75 61 72 64 65 64 27 29 3b 0a 20 20 49   'guarded');.  I
f750: 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56 41  NSERT INTO d2 VA
f760: 4c 55 45 53 28 27 62 61 72 6b 65 64 27 2c 20 27  LUES('barked', '
f770: 69 6e 74 65 72 72 75 70 74 65 64 27 29 3b 0a 20  interrupted');. 
f780: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20   INSERT INTO d2 
f790: 56 41 4c 55 45 53 28 27 72 65 65 6d 70 68 61 73  VALUES('reemphas
f7a0: 69 7a 65 73 27 2c 20 27 72 65 70 6c 79 27 29 3b  izes', 'reply');
f7b0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
f7c0: 32 20 56 41 4c 55 45 53 28 27 6c 61 64 27 2c 20  2 VALUES('lad', 
f7d0: 27 72 65 6c 65 6e 74 69 6e 67 27 29 3b 0a 7d 20  'relenting');.} 
f7e0: 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  {}..# EVIDENCE-O
f7f0: 46 3a 20 52 2d 34 34 39 38 38 2d 34 31 30 36 34  F: R-44988-41064
f800: 20 52 6f 77 73 20 61 72 65 20 66 69 72 73 74 20   Rows are first 
f810: 73 6f 72 74 65 64 20 62 61 73 65 64 20 6f 6e 20  sorted based on 
f820: 74 68 65 20 72 65 73 75 6c 74 73 0a 23 20 6f 66  the results.# of
f830: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
f840: 6c 65 66 74 2d 6d 6f 73 74 20 65 78 70 72 65 73  left-most expres
f850: 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44 45  sion in the ORDE
f860: 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
f870: 74 69 65 73 0a 23 20 61 72 65 20 62 72 6f 6b 65  ties.# are broke
f880: 6e 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20  n by evaluating 
f890: 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d  the second left-
f8a0: 6d 6f 73 74 20 65 78 70 72 65 73 73 69 6f 6e 20  most expression 
f8b0: 61 6e 64 20 73 6f 20 6f 6e 2e 0a 23 0a 64 6f 5f  and so on..#.do_
f8c0: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
f8d0: 65 6c 65 63 74 2d 38 2e 31 20 7b 0a 20 20 31 20  elect-8.1 {.  1 
f8e0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
f8f0: 64 31 20 4f 52 44 45 52 20 42 59 20 78 2c 20 79  d1 ORDER BY x, y
f900: 2c 20 7a 22 20 7b 0a 20 20 20 20 20 31 20 32 20  , z" {.     1 2 
f910: 2d 32 30 20 20 20 20 31 20 32 20 33 20 20 20 20  -20    1 2 3    
f920: 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20 20  1 2 7    1 2 8  
f930: 20 20 0a 20 20 20 20 20 31 20 34 20 20 39 33 20    .     1 4  93 
f940: 20 20 20 31 20 35 20 2d 31 20 20 20 32 20 34 20     1 5 -1   2 4 
f950: 39 33 20 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a  93   2 5 -1.  }.
f960: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
f970: 3a 20 52 2d 30 36 36 31 37 2d 35 34 35 38 38 20  : R-06617-54588 
f980: 45 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78  Each ORDER BY ex
f990: 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 62 65 20  pression may be 
f9a0: 6f 70 74 69 6f 6e 61 6c 6c 79 0a 23 20 66 6f 6c  optionally.# fol
f9b0: 6c 6f 77 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  lowed by one of 
f9c0: 74 68 65 20 6b 65 79 77 6f 72 64 73 20 41 53 43  the keywords ASC
f9d0: 20 28 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73   (smaller values
f9e0: 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 23 20   are returned.# 
f9f0: 66 69 72 73 74 29 20 6f 72 20 44 45 53 43 20 28  first) or DESC (
fa00: 6c 61 72 67 65 72 20 76 61 6c 75 65 73 20 61 72  larger values ar
fa10: 65 20 72 65 74 75 72 6e 65 64 20 66 69 72 73 74  e returned first
fa20: 29 2e 0a 23 0a 23 20 20 20 54 65 73 74 20 63 61  )..#.#   Test ca
fa30: 73 65 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 32  ses e_select-8.2
fa40: 2e 2a 20 74 65 73 74 20 74 68 65 20 61 62 6f 76  .* test the abov
fa50: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
fa60: 4f 46 3a 20 52 2d 31 38 37 30 35 2d 33 33 33 39  OF: R-18705-3339
fa70: 33 20 49 66 20 6e 65 69 74 68 65 72 20 41 53 43  3 If neither ASC
fa80: 20 6f 72 20 44 45 53 43 20 61 72 65 20 73 70 65   or DESC are spe
fa90: 63 69 66 69 65 64 2c 20 72 6f 77 73 0a 23 20 61  cified, rows.# a
faa0: 72 65 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63  re sorted in asc
fab0: 65 6e 64 69 6e 67 20 28 73 6d 61 6c 6c 65 72 20  ending (smaller 
fac0: 76 61 6c 75 65 73 20 66 69 72 73 74 29 20 6f 72  values first) or
fad0: 64 65 72 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  der by default..
fae0: 23 0a 23 20 20 20 54 65 73 74 20 63 61 73 65 73  #.#   Test cases
faf0: 20 65 5f 73 65 6c 65 63 74 2d 38 2e 33 2e 2a 20   e_select-8.3.* 
fb00: 74 65 73 74 20 74 68 65 20 61 62 6f 76 65 2e 20  test the above. 
fb10: 41 6c 6c 20 38 2e 33 20 74 65 73 74 20 63 61 73  All 8.3 test cas
fb20: 65 73 20 61 72 65 0a 23 20 20 20 63 6f 70 69 65  es are.#   copie
fb30: 73 20 6f 66 20 38 2e 32 20 74 65 73 74 20 63 61  s of 8.2 test ca
fb40: 73 65 73 20 77 69 74 68 20 74 68 65 20 65 78 70  ses with the exp
fb50: 6c 69 63 69 74 20 22 41 53 43 22 20 72 65 6d 6f  licit "ASC" remo
fb60: 76 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  ved..#.do_select
fb70: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
fb80: 38 20 7b 0a 20 20 32 2e 31 20 20 22 53 45 4c 45  8 {.  2.1  "SELE
fb90: 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
fba0: 45 52 20 42 59 20 78 20 41 53 43 2c 20 79 20 41  ER BY x ASC, y A
fbb0: 53 43 2c 20 7a 20 41 53 43 22 20 7b 0a 20 20 20  SC, z ASC" {.   
fbc0: 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 32    1 2 -20    1 2
fbd0: 20 33 20 20 20 20 31 20 32 20 37 20 20 20 20 31   3    1 2 7    1
fbe0: 20 32 20 38 20 20 20 20 0a 20 20 20 20 20 31 20   2 8    .     1 
fbf0: 34 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20  4  93    1 5 -1 
fc00: 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
fc10: 31 0a 20 20 7d 0a 20 20 32 2e 32 20 20 22 53 45  1.  }.  2.2  "SE
fc20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f  LECT * FROM d1 O
fc30: 52 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20  RDER BY x DESC, 
fc40: 79 20 44 45 53 43 2c 20 7a 20 44 45 53 43 22 20  y DESC, z DESC" 
fc50: 7b 0a 20 20 20 20 20 32 20 35 20 2d 31 20 20 20  {.     2 5 -1   
fc60: 20 20 32 20 34 20 39 33 20 20 20 31 20 35 20 2d    2 4 93   1 5 -
fc70: 31 20 20 20 31 20 34 20 20 39 33 20 20 20 20 0a  1   1 4  93    .
fc80: 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20 20       1 2 8      
fc90: 31 20 32 20 37 20 20 20 20 31 20 32 20 33 20 20  1 2 7    1 2 3  
fca0: 20 20 31 20 32 20 2d 32 30 20 20 20 20 0a 20 20    1 2 -20    .  
fcb0: 7d 0a 20 20 32 2e 33 20 22 53 45 4c 45 43 54 20  }.  2.3 "SELECT 
fcc0: 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20  * FROM d1 ORDER 
fcd0: 42 59 20 78 20 44 45 53 43 2c 20 79 20 41 53 43  BY x DESC, y ASC
fce0: 2c 20 7a 20 44 45 53 43 22 20 7b 0a 20 20 20 20  , z DESC" {.    
fcf0: 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d 31   2 4 93   2 5 -1
fd00: 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20 20       1 2 8      
fd10: 31 20 32 20 37 20 20 20 20 0a 20 20 20 20 20 31  1 2 7    .     1
fd20: 20 32 20 33 20 20 20 20 31 20 32 20 2d 32 30 20   2 3    1 2 -20 
fd30: 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31 20     1 4  93    1 
fd40: 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20 32 2e  5 -1   .  }.  2.
fd50: 34 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  4  "SELECT * FRO
fd60: 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 20  M d1 ORDER BY x 
fd70: 44 45 53 43 2c 20 79 20 41 53 43 2c 20 7a 20 41  DESC, y ASC, z A
fd80: 53 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39  SC" {.     2 4 9
fd90: 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31  3   2 5 -1     1
fda0: 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20   2 -20    1 2 3 
fdb0: 20 20 20 0a 20 20 20 20 20 31 20 32 20 37 20 20     .     1 2 7  
fdc0: 20 20 31 20 32 20 38 20 20 20 20 20 20 31 20 34    1 2 8      1 4
fdd0: 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20    93    1 5 -1  
fde0: 20 0a 20 20 7d 0a 0a 20 20 33 2e 31 20 20 22 53   .  }..  3.1  "S
fdf0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20  ELECT * FROM d1 
fe00: 4f 52 44 45 52 20 42 59 20 78 2c 20 79 2c 20 7a  ORDER BY x, y, z
fe10: 22 20 7b 0a 20 20 20 20 20 31 20 32 20 2d 32 30  " {.     1 2 -20
fe20: 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20 32      1 2 3    1 2
fe30: 20 37 20 20 20 20 31 20 32 20 38 20 20 20 20 0a   7    1 2 8    .
fe40: 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
fe50: 31 20 35 20 2d 31 20 20 20 32 20 34 20 39 33 20  1 5 -1   2 4 93 
fe60: 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a 20 20 33    2 5 -1.  }.  3
fe70: 2e 33 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .3  "SELECT * FR
fe80: 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78  OM d1 ORDER BY x
fe90: 20 44 45 53 43 2c 20 79 2c 20 7a 20 44 45 53 43   DESC, y, z DESC
fea0: 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33 20  " {.     2 4 93 
feb0: 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20 32    2 5 -1     1 2
fec0: 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20 20   8      1 2 7   
fed0: 20 0a 20 20 20 20 20 31 20 32 20 33 20 20 20 20   .     1 2 3    
fee0: 31 20 32 20 2d 32 30 20 20 20 20 31 20 34 20 20  1 2 -20    1 4  
fef0: 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20 0a  93    1 5 -1   .
ff00: 20 20 7d 0a 20 20 33 2e 34 20 22 53 45 4c 45 43    }.  3.4 "SELEC
ff10: 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  T * FROM d1 ORDE
ff20: 52 20 42 59 20 78 20 44 45 53 43 2c 20 79 2c 20  R BY x DESC, y, 
ff30: 7a 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33  z" {.     2 4 93
ff40: 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20     2 5 -1     1 
ff50: 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20 20  2 -20    1 2 3  
ff60: 20 20 0a 20 20 20 20 20 31 20 32 20 37 20 20 20    .     1 2 7   
ff70: 20 31 20 32 20 38 20 20 20 20 20 20 31 20 34 20   1 2 8      1 4 
ff80: 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
ff90: 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  .  }.}..# EVIDEN
ffa0: 43 45 2d 4f 46 3a 20 52 2d 32 39 37 37 39 2d 30  CE-OF: R-29779-0
ffb0: 34 32 38 31 20 49 66 20 74 68 65 20 4f 52 44 45  4281 If the ORDE
ffc0: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
ffd0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 0a 23 20  is a constant.# 
ffe0: 69 6e 74 65 67 65 72 20 4b 20 74 68 65 6e 20 74  integer K then t
fff0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10000 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 61   considered an a
10010 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4b 2d 74  lias for the K-t
10020 68 0a 23 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  h.# column of th
10030 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 63 6f  e result set (co
10040 6c 75 6d 6e 73 20 61 72 65 20 6e 75 6d 62 65 72  lumns are number
10050 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
10060 72 69 67 68 74 0a 23 20 73 74 61 72 74 69 6e 67  right.# starting
10070 20 77 69 74 68 20 31 29 2e 0a 23 0a 64 6f 5f 73   with 1)..#.do_s
10080 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
10090 6c 65 63 74 2d 38 2e 34 20 7b 0a 20 20 31 20 20  lect-8.4 {.  1  
100a0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  "SELECT * FROM d
100b0 31 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  1 ORDER BY 1 ASC
100c0 2c 20 32 20 41 53 43 2c 20 33 20 41 53 43 22 20  , 2 ASC, 3 ASC" 
100d0 7b 0a 20 20 20 20 20 31 20 32 20 2d 32 30 20 20  {.     1 2 -20  
100e0 20 20 31 20 32 20 33 20 20 20 20 31 20 32 20 37    1 2 3    1 2 7
100f0 20 20 20 20 31 20 32 20 38 20 20 20 20 0a 20 20      1 2 8    .  
10100 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31 20     1 4  93    1 
10110 35 20 2d 31 20 20 20 32 20 34 20 39 33 20 20 20  5 -1   2 4 93   
10120 32 20 35 20 2d 31 0a 20 20 7d 0a 20 20 32 20 20  2 5 -1.  }.  2  
10130 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  "SELECT * FROM d
10140 31 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53  1 ORDER BY 1 DES
10150 43 2c 20 32 20 44 45 53 43 2c 20 33 20 44 45 53  C, 2 DESC, 3 DES
10160 43 22 20 7b 0a 20 20 20 20 20 32 20 35 20 2d 31  C" {.     2 5 -1
10170 20 20 20 20 20 32 20 34 20 39 33 20 20 20 31 20       2 4 93   1 
10180 35 20 2d 31 20 20 20 31 20 34 20 20 39 33 20 20  5 -1   1 4  93  
10190 20 20 0a 20 20 20 20 20 31 20 32 20 38 20 20 20    .     1 2 8   
101a0 20 20 20 31 20 32 20 37 20 20 20 20 31 20 32 20     1 2 7    1 2 
101b0 33 20 20 20 20 31 20 32 20 2d 32 30 20 20 20 20  3    1 2 -20    
101c0 0a 20 20 7d 0a 20 20 33 20 22 53 45 4c 45 43 54  .  }.  3 "SELECT
101d0 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   * FROM d1 ORDER
101e0 20 42 59 20 31 20 44 45 53 43 2c 20 32 20 41 53   BY 1 DESC, 2 AS
101f0 43 2c 20 33 20 44 45 53 43 22 20 7b 0a 20 20 20  C, 3 DESC" {.   
10200 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
10210 31 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20  1     1 2 8     
10220 20 31 20 32 20 37 20 20 20 20 0a 20 20 20 20 20   1 2 7    .     
10230 31 20 32 20 33 20 20 20 20 31 20 32 20 2d 32 30  1 2 3    1 2 -20
10240 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31      1 4  93    1
10250 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20 34   5 -1   .  }.  4
10260 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
10270 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 20 44   d1 ORDER BY 1 D
10280 45 53 43 2c 20 32 20 41 53 43 2c 20 33 20 41 53  ESC, 2 ASC, 3 AS
10290 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33  C" {.     2 4 93
102a0 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20     2 5 -1     1 
102b0 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20 20  2 -20    1 2 3  
102c0 20 20 0a 20 20 20 20 20 31 20 32 20 37 20 20 20    .     1 2 7   
102d0 20 31 20 32 20 38 20 20 20 20 20 20 31 20 34 20   1 2 8      1 4 
102e0 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
102f0 0a 20 20 7d 0a 20 20 35 20 20 22 53 45 4c 45 43  .  }.  5  "SELEC
10300 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  T * FROM d1 ORDE
10310 52 20 42 59 20 31 2c 20 32 2c 20 33 22 20 7b 0a  R BY 1, 2, 3" {.
10320 20 20 20 20 20 31 20 32 20 2d 32 30 20 20 20 20       1 2 -20    
10330 31 20 32 20 33 20 20 20 20 31 20 32 20 37 20 20  1 2 3    1 2 7  
10340 20 20 31 20 32 20 38 20 20 20 20 0a 20 20 20 20    1 2 8    .    
10350 20 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20   1 4  93    1 5 
10360 2d 31 20 20 20 32 20 34 20 39 33 20 20 20 32 20  -1   2 4 93   2 
10370 35 20 2d 31 0a 20 20 7d 0a 20 20 36 20 20 22 53  5 -1.  }.  6  "S
10380 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20  ELECT * FROM d1 
10390 4f 52 44 45 52 20 42 59 20 31 20 44 45 53 43 2c  ORDER BY 1 DESC,
103a0 20 32 2c 20 33 20 44 45 53 43 22 20 7b 0a 20 20   2, 3 DESC" {.  
103b0 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20     2 4 93   2 5 
103c0 2d 31 20 20 20 20 20 31 20 32 20 38 20 20 20 20  -1     1 2 8    
103d0 20 20 31 20 32 20 37 20 20 20 20 0a 20 20 20 20    1 2 7    .    
103e0 20 31 20 32 20 33 20 20 20 20 31 20 32 20 2d 32   1 2 3    1 2 -2
103f0 30 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20  0    1 4  93    
10400 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20  1 5 -1   .  }.  
10410 37 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  7  "SELECT * FRO
10420 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 20  M d1 ORDER BY 1 
10430 44 45 53 43 2c 20 32 2c 20 33 22 20 7b 0a 20 20  DESC, 2, 3" {.  
10440 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20     2 4 93   2 5 
10450 2d 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20  -1     1 2 -20  
10460 20 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20    1 2 3    .    
10470 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
10480 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
10490 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20  1 5 -1   .  }.  
104a0 38 20 20 22 53 45 4c 45 43 54 20 7a 2c 20 78 20  8  "SELECT z, x 
104b0 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59  FROM d1 ORDER BY
104c0 20 32 22 20 7b 0a 20 20 20 20 20 2f 23 20 31 20   2" {.     /# 1 
104d0 20 20 20 23 20 31 20 20 20 20 23 20 31 20 20 20     # 1    # 1   
104e0 23 20 31 20 0a 20 20 20 20 20 20 23 20 31 20 20  # 1 .      # 1  
104f0 20 20 23 20 31 20 20 20 20 23 20 32 20 20 20 23    # 1    # 2   #
10500 20 32 2f 0a 20 20 7d 0a 20 20 39 20 20 22 53 45   2/.  }.  9  "SE
10510 4c 45 43 54 20 7a 2c 20 78 20 46 52 4f 4d 20 64  LECT z, x FROM d
10520 31 20 4f 52 44 45 52 20 42 59 20 31 22 20 7b 0a  1 ORDER BY 1" {.
10530 20 20 20 20 20 2f 2d 32 30 20 31 20 20 2d 31 20       /-20 1  -1 
10540 23 20 20 20 2d 31 20 23 20 20 20 33 20 31 0a 20  #   -1 #   3 1. 
10550 20 20 20 20 37 20 31 20 20 20 20 20 38 20 31 20      7 1     8 1 
10560 20 20 39 33 20 23 20 20 20 39 33 20 23 2f 20 20    93 #   93 #/  
10570 20 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   .  }.}..# EVIDE
10580 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 38 36 2d  NCE-OF: R-63286-
10590 35 31 39 37 37 20 49 66 20 74 68 65 20 4f 52 44  51977 If the ORD
105a0 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
105b0 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65   is an identifie
105c0 72 0a 23 20 74 68 61 74 20 63 6f 72 72 65 73 70  r.# that corresp
105d0 6f 6e 64 73 20 74 6f 20 74 68 65 20 61 6c 69 61  onds to the alia
105e0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
105f0 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 2c 20  output columns, 
10600 74 68 65 6e 20 74 68 65 0a 23 20 65 78 70 72 65  then the.# expre
10610 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ssion is conside
10620 72 65 64 20 61 6e 20 61 6c 69 61 73 20 66 6f 72  red an alias for
10630 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 23 0a   that column..#.
10640 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
10650 65 5f 73 65 6c 65 63 74 2d 38 2e 35 20 7b 0a 20  e_select-8.5 {. 
10660 20 31 20 20 20 22 53 45 4c 45 43 54 20 7a 2b 31   1   "SELECT z+1
10670 20 41 53 20 61 62 63 20 46 52 4f 4d 20 64 31 20   AS abc FROM d1 
10680 4f 52 44 45 52 20 42 59 20 61 62 63 22 20 7b 0a  ORDER BY abc" {.
10690 20 20 20 20 2d 31 39 20 30 20 30 20 34 20 38 20      -19 0 0 4 8 
106a0 39 20 39 34 20 39 34 0a 20 20 7d 0a 20 20 32 20  9 94 94.  }.  2 
106b0 20 20 22 53 45 4c 45 43 54 20 7a 2b 31 20 41 53    "SELECT z+1 AS
106c0 20 61 62 63 20 46 52 4f 4d 20 64 31 20 4f 52 44   abc FROM d1 ORD
106d0 45 52 20 42 59 20 61 62 63 20 44 45 53 43 22 20  ER BY abc DESC" 
106e0 7b 0a 20 20 20 20 39 34 20 39 34 20 39 20 38 20  {.    94 94 9 8 
106f0 34 20 30 20 30 20 2d 31 39 0a 20 20 7d 0a 20 20  4 0 0 -19.  }.  
10700 33 20 20 22 53 45 4c 45 43 54 20 7a 20 41 53 20  3  "SELECT z AS 
10710 78 2c 20 78 20 41 53 20 7a 20 46 52 4f 4d 20 64  x, x AS z FROM d
10720 31 20 4f 52 44 45 52 20 42 59 20 7a 22 20 7b 0a  1 ORDER BY z" {.
10730 20 20 20 20 2f 23 20 31 20 20 20 20 23 20 31 20      /# 1    # 1 
10740 20 20 20 23 20 31 20 20 20 20 23 20 31 20 20 20     # 1    # 1   
10750 20 23 20 31 20 20 20 20 23 20 31 20 20 20 20 23   # 1    # 1    #
10760 20 32 20 20 20 20 23 20 32 2f 0a 20 20 7d 0a 20   2    # 2/.  }. 
10770 20 34 20 20 22 53 45 4c 45 43 54 20 7a 20 41 53   4  "SELECT z AS
10780 20 78 2c 20 78 20 41 53 20 7a 20 46 52 4f 4d 20   x, x AS z FROM 
10790 64 31 20 4f 52 44 45 52 20 42 59 20 78 22 20 7b  d1 ORDER BY x" {
107a0 0a 20 20 20 20 2f 2d 32 30 20 31 20 20 20 20 2d  .    /-20 1    -
107b0 31 20 23 20 20 20 20 2d 31 20 23 20 20 20 20 33  1 #    -1 #    3
107c0 20 31 20 20 20 20 37 20 31 20 20 20 20 38 20 31   1    7 1    8 1
107d0 20 20 20 20 39 33 20 23 20 20 20 20 39 33 20 23      93 #    93 #
107e0 2f 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  /.  }.}..# EVIDE
107f0 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 36 38 2d  NCE-OF: R-65068-
10800 32 37 32 30 37 20 4f 74 68 65 72 77 69 73 65 2c  27207 Otherwise,
10810 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
10820 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23   expression is.#
10830 20 61 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   any other expre
10840 73 73 69 6f 6e 2c 20 69 74 20 69 73 20 65 76 61  ssion, it is eva
10850 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  luated and the r
10860 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 75 73  eturned value us
10870 65 64 20 74 6f 0a 23 20 6f 72 64 65 72 20 74 68  ed to.# order th
10880 65 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 23  e output rows..#
10890 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
108a0 52 2d 30 33 34 32 31 2d 35 37 39 38 38 20 49 66  R-03421-57988 If
108b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
108c0 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c  ement is a simpl
108d0 65 20 53 45 4c 45 43 54 2c 0a 23 20 74 68 65 6e  e SELECT,.# then
108e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6d 61 79   an ORDER BY may
108f0 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 61 72 62   contain any arb
10900 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
10910 6e 73 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  ns..#.do_select_
10920 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38  tests e_select-8
10930 2e 36 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45  .6 {.  1   "SELE
10940 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
10950 45 52 20 42 59 20 78 2b 79 2b 7a 22 20 7b 0a 20  ER BY x+y+z" {. 
10960 20 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20     1 2 -20    1 
10970 35 20 2d 31 20 20 20 20 31 20 32 20 33 20 20 20  5 -1    1 2 3   
10980 20 32 20 35 20 2d 31 20 0a 20 20 20 20 31 20 32   2 5 -1 .    1 2
10990 20 37 20 20 20 20 20 20 31 20 32 20 38 20 20 20   7      1 2 8   
109a0 20 20 31 20 34 20 39 33 20 20 20 32 20 34 20 39    1 4 93   2 4 9
109b0 33 0a 20 20 7d 0a 20 20 32 20 20 20 22 53 45 4c  3.  }.  2   "SEL
109c0 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
109d0 44 45 52 20 42 59 20 78 2a 7a 22 20 7b 0a 20 20  DER BY x*z" {.  
109e0 20 20 31 20 32 20 2d 32 30 20 20 20 20 32 20 35    1 2 -20    2 5
109f0 20 2d 31 20 20 20 20 31 20 35 20 2d 31 20 20 20   -1    1 5 -1   
10a00 20 31 20 32 20 33 20 0a 20 20 20 20 31 20 32 20   1 2 3 .    1 2 
10a10 37 20 20 20 20 20 20 31 20 32 20 38 20 20 20 20  7      1 2 8    
10a20 20 31 20 34 20 39 33 20 20 20 20 32 20 34 20 39   1 4 93    2 4 9
10a30 33 0a 20 20 7d 0a 20 20 33 20 20 20 22 53 45 4c  3.  }.  3   "SEL
10a40 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
10a50 44 45 52 20 42 59 20 79 2a 7a 22 20 7b 0a 20 20  DER BY y*z" {.  
10a60 20 20 31 20 32 20 2d 32 30 20 20 20 20 32 20 35    1 2 -20    2 5
10a70 20 2d 31 20 20 20 20 31 20 35 20 2d 31 20 20 20   -1    1 5 -1   
10a80 20 31 20 32 20 33 20 0a 20 20 20 20 31 20 32 20   1 2 3 .    1 2 
10a90 37 20 20 20 20 20 20 31 20 32 20 38 20 20 20 20  7      1 2 8    
10aa0 20 32 20 34 20 39 33 20 20 20 20 31 20 34 20 39   2 4 93    1 4 9
10ab0 33 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  3.  }.}..# EVIDE
10ac0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 38 35 33 2d  NCE-OF: R-28853-
10ad0 30 38 31 34 37 20 48 6f 77 65 76 65 72 2c 20 69  08147 However, i
10ae0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
10af0 61 20 63 6f 6d 70 6f 75 6e 64 0a 23 20 53 45 4c  a compound.# SEL
10b00 45 43 54 2c 20 74 68 65 6e 20 4f 52 44 45 52 20  ECT, then ORDER 
10b10 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  BY expressions t
10b20 68 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 69 61  hat are not alia
10b30 73 65 73 20 74 6f 20 6f 75 74 70 75 74 0a 23 20  ses to output.# 
10b40 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
10b50 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
10b60 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   as an expressio
10b70 6e 20 75 73 65 64 20 61 73 20 61 6e 20 6f 75 74  n used as an out
10b80 70 75 74 0a 23 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  put.# column..#.
10b90 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
10ba0 65 5f 73 65 6c 65 63 74 2d 38 2e 37 2e 31 20 2d  e_select-8.7.1 -
10bb0 65 72 72 6f 72 20 7b 0a 20 20 25 73 20 4f 52 44  error {.  %s ORD
10bc0 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
10bd0 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  not match any co
10be0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
10bf0 6c 74 20 73 65 74 0a 7d 20 7b 0a 20 20 31 20 20  lt set.} {.  1  
10c00 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
10c10 64 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d1 UNION ALL SEL
10c20 45 43 54 20 61 20 46 52 4f 4d 20 64 32 20 4f 52  ECT a FROM d2 OR
10c30 44 45 52 20 42 59 20 78 2a 7a 22 20 20 20 20 20  DER BY x*z"     
10c40 20 20 20 31 73 74 0a 20 20 32 20 20 20 22 53 45     1st.  2   "SE
10c50 4c 45 43 54 20 78 2c 7a 20 46 52 4f 4d 20 64 31  LECT x,z FROM d1
10c60 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
10c70 54 20 61 2c 62 20 46 52 4f 4d 20 64 32 20 4f 52  T a,b FROM d2 OR
10c80 44 45 52 20 42 59 20 78 2c 20 78 2f 7a 22 20 32  DER BY x, x/z" 2
10c90 6e 64 0a 7d 20 0a 0a 64 6f 5f 73 65 6c 65 63 74  nd.} ..do_select
10ca0 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
10cb0 38 2e 37 2e 32 20 7b 0a 20 20 31 20 20 20 22 53  8.7.2 {.  1   "S
10cc0 45 4c 45 43 54 20 78 2a 7a 20 46 52 4f 4d 20 64  ELECT x*z FROM d
10cd0 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
10ce0 43 54 20 61 20 46 52 4f 4d 20 64 32 20 4f 52 44  CT a FROM d2 ORD
10cf0 45 52 20 42 59 20 78 2a 7a 22 20 7b 0a 20 20 20  ER BY x*z" {.   
10d00 20 2d 32 30 20 2d 32 20 2d 31 20 33 20 37 20 38   -20 -2 -1 3 7 8
10d10 20 39 33 20 31 38 36 20 62 61 62 69 65 64 20 62   93 186 babied b
10d20 61 72 6b 65 64 20 63 6f 6d 6d 65 72 63 69 61 6c  arked commercial
10d30 73 20 67 65 6e 74 6c 79 20 0a 20 20 20 20 69 74  s gently .    it
10d40 65 72 61 74 65 20 6c 61 64 20 70 72 61 67 6d 61  erate lad pragma
10d50 74 69 73 74 20 72 65 65 6d 70 68 61 73 69 7a 65  tist reemphasize
10d60 73 20 72 65 6a 6f 69 63 69 6e 67 20 73 6f 6c 65  s rejoicing sole
10d70 6d 6e 6e 65 73 73 0a 20 20 7d 0a 20 20 32 20 20  mnness.  }.  2  
10d80 20 22 53 45 4c 45 43 54 20 78 2c 20 78 2f 7a 20   "SELECT x, x/z 
10d90 46 52 4f 4d 20 64 31 20 55 4e 49 4f 4e 20 41 4c  FROM d1 UNION AL
10da0 4c 20 53 45 4c 45 43 54 20 61 2c 62 20 46 52 4f  L SELECT a,b FRO
10db0 4d 20 64 32 20 4f 52 44 45 52 20 42 59 20 78 2c  M d2 ORDER BY x,
10dc0 20 78 2f 7a 22 20 7b 0a 20 20 20 20 31 20 2d 31   x/z" {.    1 -1
10dd0 20 31 20 30 20 31 20 30 20 31 20 30 20 31 20 30   1 0 1 0 1 0 1 0
10de0 20 31 20 30 20 32 20 2d 32 20 32 20 30 20 0a 20   1 0 2 -2 2 0 . 
10df0 20 20 20 62 61 62 69 65 64 20 63 68 61 72 69 74     babied charit
10e00 61 62 6c 65 6e 65 73 73 20 62 61 72 6b 65 64 20  ableness barked 
10e10 69 6e 74 65 72 72 75 70 74 65 64 20 63 6f 6d 6d  interrupted comm
10e20 65 72 63 69 61 6c 73 20 62 61 74 68 72 6f 62 65  ercials bathrobe
10e30 20 67 65 6e 74 6c 79 0a 20 20 20 20 66 61 69 6c   gently.    fail
10e40 69 6e 67 73 20 69 74 65 72 61 74 65 20 73 65 78  ings iterate sex
10e50 74 6f 6e 20 6c 61 64 20 72 65 6c 65 6e 74 69 6e  ton lad relentin
10e60 67 20 70 72 61 67 6d 61 74 69 73 74 20 67 75 61  g pragmatist gua
10e70 72 64 65 64 20 72 65 65 6d 70 68 61 73 69 7a 65  rded reemphasize
10e80 73 20 72 65 70 6c 79 0a 20 20 20 20 72 65 6a 6f  s reply.    rejo
10e90 69 63 69 6e 67 20 6c 69 61 62 69 6c 69 74 69 65  icing liabilitie
10ea0 73 20 73 6f 6c 65 6d 6e 6e 65 73 73 20 61 6e 6e  s solemnness ann
10eb0 65 78 65 64 0a 20 20 7d 0a 7d 20 0a 0a 64 6f 5f  exed.  }.} ..do_
10ec0 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
10ed0 65 6c 65 63 74 2d 38 2e 38 2e 30 20 7b 0a 20 20  elect-8.8.0 {.  
10ee0 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 33 28  CREATE TABLE d3(
10ef0 61 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  a);.  INSERT INT
10f00 4f 20 64 33 20 56 41 4c 55 45 53 28 27 74 65 78  O d3 VALUES('tex
10f10 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  t');.  INSERT IN
10f20 54 4f 20 64 33 20 56 41 4c 55 45 53 28 31 34 2e  TO d3 VALUES(14.
10f30 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
10f40 4f 20 64 33 20 56 41 4c 55 45 53 28 31 33 29 3b  O d3 VALUES(13);
10f50 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
10f60 33 20 56 41 4c 55 45 53 28 58 27 37 38 37 38 37  3 VALUES(X'78787
10f70 38 37 38 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  878');.  INSERT 
10f80 49 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28 31  INTO d3 VALUES(1
10f90 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  5);.  INSERT INT
10fa0 4f 20 64 33 20 56 41 4c 55 45 53 28 31 32 2e 39  O d3 VALUES(12.9
10fb0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10fc0 20 64 33 20 56 41 4c 55 45 53 28 6e 75 6c 6c 29   d3 VALUES(null)
10fd0 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
10fe0 45 20 64 34 28 78 20 43 4f 4c 4c 41 54 45 20 6e  E d4(x COLLATE n
10ff0 6f 63 61 73 65 29 3b 0a 20 20 49 4e 53 45 52 54  ocase);.  INSERT
11000 20 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28   INTO d4 VALUES(
11010 27 61 62 63 27 29 3b 0a 20 20 49 4e 53 45 52 54  'abc');.  INSERT
11020 20 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28   INTO d4 VALUES(
11030 27 67 68 69 27 29 3b 0a 20 20 49 4e 53 45 52 54  'ghi');.  INSERT
11040 20 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28   INTO d4 VALUES(
11050 27 44 45 46 27 29 3b 0a 20 20 49 4e 53 45 52 54  'DEF');.  INSERT
11060 20 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28   INTO d4 VALUES(
11070 27 4a 4b 4c 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20  'JKL');.} {}..# 
11080 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
11090 30 38 38 33 2d 31 37 36 39 37 20 46 6f 72 20 74  0883-17697 For t
110a0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 73  he purposes of s
110b0 6f 72 74 69 6e 67 20 72 6f 77 73 2c 20 76 61 6c  orting rows, val
110c0 75 65 73 0a 23 20 61 72 65 20 63 6f 6d 70 61 72  ues.# are compar
110d0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
110e0 61 79 20 61 73 20 66 6f 72 20 63 6f 6d 70 61 72  ay as for compar
110f0 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  ison expressions
11100 2e 0a 23 0a 23 20 20 20 54 68 65 20 66 6f 6c 6c  ..#.#   The foll
11110 6f 77 69 6e 67 20 74 65 73 74 73 20 76 65 72 69  owing tests veri
11120 66 79 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f  fy that values o
11130 66 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  f different type
11140 73 20 61 72 65 20 73 6f 72 74 65 64 0a 23 20 20  s are sorted.#  
11150 20 63 6f 72 72 65 63 74 6c 79 2c 20 61 6e 64 20   correctly, and 
11160 74 68 61 74 20 6d 69 78 65 64 20 72 65 61 6c 20  that mixed real 
11170 61 6e 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  and integer valu
11180 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  es are compared 
11190 70 72 6f 70 65 72 6c 79 2e 0a 23 0a 64 6f 5f 65  properly..#.do_e
111a0 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
111b0 6c 65 63 74 2d 38 2e 38 2e 31 20 7b 0a 20 20 53  lect-8.8.1 {.  S
111c0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 33 20  ELECT a FROM d3 
111d0 4f 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 7b 7d  ORDER BY a.} {{}
111e0 20 31 32 2e 39 20 31 33 20 31 34 2e 31 20 31 35   12.9 13 14.1 15
111f0 20 74 65 78 74 20 78 78 78 78 7d 0a 64 6f 5f 65   text xxxx}.do_e
11200 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
11210 6c 65 63 74 2d 38 2e 38 2e 32 20 7b 0a 20 20 53  lect-8.8.2 {.  S
11220 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 33 20  ELECT a FROM d3 
11230 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 0a  ORDER BY a DESC.
11240 7d 20 7b 78 78 78 78 20 74 65 78 74 20 31 35 20  } {xxxx text 15 
11250 31 34 2e 31 20 31 33 20 31 32 2e 39 20 7b 7d 7d  14.1 13 12.9 {}}
11260 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  ...# EVIDENCE-OF
11270 3a 20 52 2d 36 34 31 39 39 2d 32 32 34 37 31 20  : R-64199-22471 
11280 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
11290 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 73  expression is as
112a0 73 69 67 6e 65 64 20 61 0a 23 20 63 6f 6c 6c 61  signed a.# colla
112b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
112c0 69 6e 67 20 74 68 65 20 70 6f 73 74 66 69 78 20  ing the postfix 
112d0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
112e0 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 73 70 65  , then the.# spe
112f0 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
11300 20 73 65 71 75 65 6e 63 65 20 69 73 20 75 73 65   sequence is use
11310 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d..#.do_execsql_
11320 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e  test e_select-8.
11330 39 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78  9.1 {.  SELECT x
11340 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42   FROM d4 ORDER B
11350 59 20 31 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  Y 1 COLLATE bina
11360 72 79 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62  ry.} {DEF JKL ab
11370 63 20 67 68 69 7d 0a 64 6f 5f 65 78 65 63 73 71  c ghi}.do_execsq
11380 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
11390 38 2e 39 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  8.9.2 {.  SELECT
113a0 20 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   x COLLATE binar
113b0 79 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20  y FROM d4 ORDER 
113c0 42 59 20 31 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  BY 1 COLLATE noc
113d0 61 73 65 0a 7d 20 7b 61 62 63 20 44 45 46 20 67  ase.} {abc DEF g
113e0 68 69 20 4a 4b 4c 7d 0a 0a 23 20 45 56 49 44 45  hi JKL}..# EVIDE
113f0 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 33 39 38 2d  NCE-OF: R-09398-
11400 32 36 31 30 32 20 4f 74 68 65 72 77 69 73 65 2c  26102 Otherwise,
11410 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
11420 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 0a   expression is .
11430 23 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 61 6e  # an alias to an
11440 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
11450 20 68 61 73 20 62 65 65 6e 20 61 73 73 69 67 6e   has been assign
11460 65 64 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ed a collation s
11470 65 71 75 65 6e 63 65 20 0a 23 20 75 73 69 6e 67  equence .# using
11480 20 74 68 65 20 70 6f 73 74 66 69 78 20 43 4f 4c   the postfix COL
11490 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
114a0 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hen the collatio
114b0 6e 20 73 65 71 75 65 6e 63 65 20 0a 23 20 61 73  n sequence .# as
114c0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 61 6c  signed to the al
114d0 69 61 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  iased expression
114e0 20 69 73 20 75 73 65 64 2e 0a 23 0a 23 20 20 20   is used..#.#   
114f0 49 6e 20 74 68 65 20 74 65 73 74 20 38 2e 31 30  In the test 8.10
11500 2e 32 2c 20 74 68 65 20 6f 6e 6c 79 20 72 65 73  .2, the only res
11510 75 6c 74 2d 63 6f 6c 75 6d 6e 20 65 78 70 72 65  ult-column expre
11520 73 73 69 6f 6e 20 68 61 73 20 6e 6f 20 61 6c 69  ssion has no ali
11530 61 73 2e 20 53 6f 20 74 68 65 0a 23 20 20 20 4f  as. So the.#   O
11540 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
11550 6f 6e 20 69 73 20 6e 6f 74 20 61 20 72 65 66 65  on is not a refe
11560 72 65 6e 63 65 20 74 6f 20 69 74 20 61 6e 64 20  rence to it and 
11570 74 68 65 72 65 66 6f 72 65 20 64 6f 65 73 20 6e  therefore does n
11580 6f 74 20 69 6e 68 65 72 69 74 0a 23 20 20 20 74  ot inherit.#   t
11590 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
115a0 75 65 6e 63 65 2e 20 49 6e 20 74 65 73 74 20 38  uence. In test 8
115b0 2e 31 30 2e 33 2c 20 22 78 22 20 69 73 20 74 68  .10.3, "x" is th
115c0 65 20 61 6c 69 61 73 20 28 61 73 20 77 65 6c 6c  e alias (as well
115d0 20 61 73 20 74 68 65 0a 23 20 20 20 63 6f 6c 75   as the.#   colu
115e0 6d 6e 20 6e 61 6d 65 29 2c 20 73 6f 20 74 68 65  mn name), so the
115f0 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
11600 73 69 6f 6e 20 69 73 20 69 6e 74 65 72 70 72 65  sion is interpre
11610 74 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73 20  ted as an alias 
11620 61 6e 64 20 74 68 65 0a 23 20 20 20 63 6f 6c 6c  and the.#   coll
11630 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
11640 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
11650 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 69 73 20  esult column is 
11660 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
11670 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
11680 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31  est e_select-8.1
11690 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78  0.1 {.  SELECT x
116a0 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20   COLLATE binary 
116b0 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59  FROM d4 ORDER BY
116c0 20 31 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62   1.} {DEF JKL ab
116d0 63 20 67 68 69 7d 0a 64 6f 5f 65 78 65 63 73 71  c ghi}.do_execsq
116e0 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
116f0 38 2e 31 30 2e 32 20 7b 0a 20 20 53 45 4c 45 43  8.10.2 {.  SELEC
11700 54 20 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  T x COLLATE bina
11710 72 79 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52  ry FROM d4 ORDER
11720 20 42 59 20 78 0a 7d 20 7b 61 62 63 20 44 45 46   BY x.} {abc DEF
11730 20 67 68 69 20 4a 4b 4c 7d 0a 64 6f 5f 65 78 65   ghi JKL}.do_exe
11740 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
11750 63 74 2d 38 2e 31 30 2e 33 20 7b 0a 20 20 53 45  ct-8.10.3 {.  SE
11760 4c 45 43 54 20 78 20 43 4f 4c 4c 41 54 45 20 62  LECT x COLLATE b
11770 69 6e 61 72 79 20 41 53 20 78 20 46 52 4f 4d 20  inary AS x FROM 
11780 64 34 20 4f 52 44 45 52 20 42 59 20 78 0a 7d 20  d4 ORDER BY x.} 
11790 7b 44 45 46 20 4a 4b 4c 20 61 62 63 20 67 68 69  {DEF JKL abc ghi
117a0 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
117b0 3a 20 52 2d 32 37 33 30 31 2d 30 39 36 35 38 20  : R-27301-09658 
117c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
117d0 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  e ORDER BY expre
117e0 73 73 69 6f 6e 20 69 73 20 61 0a 23 20 63 6f 6c  ssion is a.# col
117f0 75 6d 6e 20 6f 72 20 61 6e 20 61 6c 69 61 73 20  umn or an alias 
11800 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
11810 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
11820 6e 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61  n, then the defa
11830 75 6c 74 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20  ult.# collation 
11840 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
11850 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 2e   column is used.
11860 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
11870 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 31  st e_select-8.11
11880 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20  .1 {.  SELECT x 
11890 41 53 20 79 20 46 52 4f 4d 20 64 34 20 4f 52 44  AS y FROM d4 ORD
118a0 45 52 20 42 59 20 79 0a 7d 20 7b 61 62 63 20 44  ER BY y.} {abc D
118b0 45 46 20 67 68 69 20 4a 4b 4c 7d 0a 64 6f 5f 65  EF ghi JKL}.do_e
118c0 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
118d0 6c 65 63 74 2d 38 2e 31 31 2e 32 20 7b 0a 20 20  lect-8.11.2 {.  
118e0 53 45 4c 45 43 54 20 78 7c 7c 27 27 20 46 52 4f  SELECT x||'' FRO
118f0 4d 20 64 34 20 4f 52 44 45 52 20 42 59 20 78 0a  M d4 ORDER BY x.
11900 7d 20 7b 61 62 63 20 44 45 46 20 67 68 69 20 4a  } {abc DEF ghi J
11910 4b 4c 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  KL}..# EVIDENCE-
11920 4f 46 3a 20 52 2d 34 39 39 32 35 2d 35 35 39 30  OF: R-49925-5590
11930 35 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  5 Otherwise, the
11940 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
11950 6e 20 73 65 71 75 65 6e 63 65 20 69 73 0a 23 20  n sequence is.# 
11960 75 73 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  used..#.do_execs
11970 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
11980 2d 38 2e 31 32 2e 31 20 7b 0a 20 20 53 45 4c 45  -8.12.1 {.  SELE
11990 43 54 20 78 20 46 52 4f 4d 20 64 34 20 4f 52 44  CT x FROM d4 ORD
119a0 45 52 20 42 59 20 78 7c 7c 27 27 0a 7d 20 7b 44  ER BY x||''.} {D
119b0 45 46 20 4a 4b 4c 20 61 62 63 20 67 68 69 7d 0a  EF JKL abc ghi}.
119c0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
119d0 52 2d 34 34 31 33 30 2d 33 32 35 39 33 20 49 66  R-44130-32593 If
119e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
119f0 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
11a00 6e 20 69 6e 74 65 67 65 72 0a 23 20 61 6c 69 61  n integer.# alia
11a10 73 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 73  s, then SQLite s
11a20 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 66 74  earches the left
11a30 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 69 6e 20  -most SELECT in 
11a40 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 66 6f 72  the compound for
11a50 20 61 0a 23 20 72 65 73 75 6c 74 20 63 6f 6c 75   a.# result colu
11a60 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  mn that matches 
11a70 65 69 74 68 65 72 20 74 68 65 20 73 65 63 6f 6e  either the secon
11a80 64 20 6f 72 20 74 68 69 72 64 20 72 75 6c 65 73  d or third rules
11a90 20 61 62 6f 76 65 2e 20 49 66 0a 23 20 61 20 6d   above. If.# a m
11aa0 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 74  atch is found, t
11ab0 68 65 20 73 65 61 72 63 68 20 73 74 6f 70 73 20  he search stops 
11ac0 61 6e 64 20 74 68 65 20 65 78 70 72 65 73 73 69  and the expressi
11ad0 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  on is handled as
11ae0 20 61 6e 0a 23 20 61 6c 69 61 73 20 66 6f 72 20   an.# alias for 
11af0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
11b00 6e 20 74 68 61 74 20 69 74 20 68 61 73 20 62 65  n that it has be
11b10 65 6e 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  en matched again
11b20 73 74 2e 0a 23 20 4f 74 68 65 72 77 69 73 65 2c  st..# Otherwise,
11b30 20 74 68 65 20 6e 65 78 74 20 53 45 4c 45 43 54   the next SELECT
11b40 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 69 73   to the right is
11b50 20 74 72 69 65 64 2c 20 61 6e 64 20 73 6f 20 6f   tried, and so o
11b60 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  n..#.do_execsql_
11b70 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e  test e_select-8.
11b80 31 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  13.0 {.  CREATE 
11b90 54 41 42 4c 45 20 64 35 28 61 2c 20 62 29 3b 0a  TABLE d5(a, b);.
11ba0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
11bb0 36 28 63 2c 20 64 29 3b 0a 20 20 43 52 45 41 54  6(c, d);.  CREAT
11bc0 45 20 54 41 42 4c 45 20 64 37 28 65 2c 20 66 29  E TABLE d7(e, f)
11bd0 3b 0a 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ;. .  INSERT INT
11be0 4f 20 64 35 20 56 41 4c 55 45 53 28 31 2c 20 27  O d5 VALUES(1, '
11bf0 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  f');.  INSERT IN
11c00 54 4f 20 64 36 20 56 41 4c 55 45 53 28 32 2c 20  TO d6 VALUES(2, 
11c10 27 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'e');.  INSERT I
11c20 4e 54 4f 20 64 37 20 56 41 4c 55 45 53 28 33 2c  NTO d7 VALUES(3,
11c30 20 27 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'd');.  INSERT 
11c40 49 4e 54 4f 20 64 35 20 56 41 4c 55 45 53 28 34  INTO d5 VALUES(4
11c50 2c 20 27 63 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'c');.  INSERT
11c60 20 49 4e 54 4f 20 64 36 20 56 41 4c 55 45 53 28   INTO d6 VALUES(
11c70 35 2c 20 27 62 27 29 3b 0a 20 20 49 4e 53 45 52  5, 'b');.  INSER
11c80 54 20 49 4e 54 4f 20 64 37 20 56 41 4c 55 45 53  T INTO d7 VALUES
11c90 28 36 2c 20 27 61 27 29 3b 0a 0a 20 20 43 52 45  (6, 'a');..  CRE
11ca0 41 54 45 20 54 41 42 4c 45 20 64 38 28 78 20 43  ATE TABLE d8(x C
11cb0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
11cc0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
11cd0 39 28 79 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  9(y COLLATE noca
11ce0 73 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49  se);..  INSERT I
11cf0 4e 54 4f 20 64 38 20 56 41 4c 55 45 53 28 27 61  NTO d8 VALUES('a
11d00 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
11d10 4f 20 64 39 20 56 41 4c 55 45 53 28 27 42 27 29  O d9 VALUES('B')
11d20 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
11d30 64 38 20 56 41 4c 55 45 53 28 27 63 27 29 3b 0a  d8 VALUES('c');.
11d40 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 39    INSERT INTO d9
11d50 20 56 41 4c 55 45 53 28 27 44 27 29 3b 0a 7d 20   VALUES('D');.} 
11d60 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  {}.do_select_tes
11d70 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 33  ts e_select-8.13
11d80 20 7b 0a 20 20 31 20 20 20 7b 20 53 45 4c 45 43   {.  1   { SELEC
11d90 54 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f  T a FROM d5 UNIO
11da0 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 20 46  N ALL SELECT c F
11db0 52 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d6 UNION ALL
11dc0 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 64   SELECT e FROM d
11dd0 37 0a 20 20 20 20 20 20 20 20 20 4f 52 44 45 52  7.         ORDER
11de0 20 42 59 20 61 0a 20 20 20 20 20 20 7d 20 7b 31   BY a.      } {1
11df0 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 32 20   2 3 4 5 6}.  2 
11e00 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f    { SELECT a FRO
11e10 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M d5 UNION ALL S
11e20 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64 36 20  ELECT c FROM d6 
11e30 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
11e40 20 65 20 46 52 4f 4d 20 64 37 0a 20 20 20 20 20   e FROM d7.     
11e50 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 0a 20      ORDER BY c. 
11e60 20 20 20 20 20 7d 20 7b 31 20 32 20 33 20 34 20       } {1 2 3 4 
11e70 35 20 36 7d 0a 20 20 33 20 20 20 7b 20 53 45 4c  5 6}.  3   { SEL
11e80 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20 55 4e  ECT a FROM d5 UN
11e90 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
11ea0 20 46 52 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41   FROM d6 UNION A
11eb0 4c 4c 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d  LL SELECT e FROM
11ec0 20 64 37 0a 20 20 20 20 20 20 20 20 20 4f 52 44   d7.         ORD
11ed0 45 52 20 42 59 20 65 0a 20 20 20 20 20 20 7d 20  ER BY e.      } 
11ee0 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20  {1 2 3 4 5 6}.  
11ef0 34 20 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46  4   { SELECT a F
11f00 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
11f10 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64   SELECT c FROM d
11f20 36 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  6 UNION ALL SELE
11f30 43 54 20 65 20 46 52 4f 4d 20 64 37 0a 20 20 20  CT e FROM d7.   
11f40 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31        ORDER BY 1
11f50 0a 20 20 20 20 20 20 7d 20 7b 31 20 32 20 33 20  .      } {1 2 3 
11f60 34 20 35 20 36 7d 0a 0a 20 20 35 20 20 20 7b 20  4 5 6}..  5   { 
11f70 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
11f80 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   d5 UNION ALL SE
11f90 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 64  LECT b, a FROM d
11fa0 35 20 4f 52 44 45 52 20 42 59 20 62 20 7d 20 0a  5 ORDER BY b } .
11fb0 20 20 20 20 20 20 7b 66 20 31 20 20 20 63 20 34        {f 1   c 4
11fc0 20 20 20 34 20 63 20 20 20 31 20 66 7d 0a 20 20     4 c   1 f}.  
11fd0 36 20 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20  6   { SELECT a, 
11fe0 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20  b FROM d5 UNION 
11ff0 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 20  ALL SELECT b, a 
12000 46 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59  FROM d5 ORDER BY
12010 20 32 20 7d 20 0a 20 20 20 20 20 20 7b 66 20 31   2 } .      {f 1
12020 20 20 20 63 20 34 20 20 20 34 20 63 20 20 20 31     c 4   4 c   1
12030 20 66 7d 0a 0a 20 20 37 20 20 20 7b 20 53 45 4c   f}..  7   { SEL
12040 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64 35  ECT a, b FROM d5
12050 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
12060 54 20 62 2c 20 61 20 46 52 4f 4d 20 64 35 20 4f  T b, a FROM d5 O
12070 52 44 45 52 20 42 59 20 61 20 7d 20 0a 20 20 20  RDER BY a } .   
12080 20 20 20 7b 31 20 66 20 20 20 34 20 63 20 20 20     {1 f   4 c   
12090 63 20 34 20 20 20 66 20 31 7d 0a 20 20 38 20 20  c 4   f 1}.  8  
120a0 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46   { SELECT a, b F
120b0 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
120c0 20 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f   SELECT b, a FRO
120d0 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20 31 20  M d5 ORDER BY 1 
120e0 7d 20 0a 20 20 20 20 20 20 7b 31 20 66 20 20 20  } .      {1 f   
120f0 34 20 63 20 20 20 63 20 34 20 20 20 66 20 31 7d  4 c   c 4   f 1}
12100 0a 0a 20 20 39 20 20 20 7b 20 53 45 4c 45 43 54  ..  9   { SELECT
12110 20 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e   a, b FROM d5 UN
12120 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62  ION ALL SELECT b
12130 2c 20 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f 52  , a+1 FROM d5 OR
12140 44 45 52 20 42 59 20 61 2b 31 20 7d 20 0a 20 20  DER BY a+1 } .  
12150 20 20 20 20 7b 66 20 32 20 20 20 63 20 35 20 20      {f 2   c 5  
12160 20 34 20 63 20 20 20 31 20 66 7d 0a 20 20 31 30   4 c   1 f}.  10
12170 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20    { SELECT a, b 
12180 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c  FROM d5 UNION AL
12190 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 2b 31 20  L SELECT b, a+1 
121a0 46 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59  FROM d5 ORDER BY
121b0 20 32 20 7d 20 0a 20 20 20 20 20 20 7b 66 20 32   2 } .      {f 2
121c0 20 20 20 63 20 35 20 20 20 34 20 63 20 20 20 31     c 5   4 c   1
121d0 20 66 7d 0a 0a 20 20 31 31 20 20 7b 20 53 45 4c   f}..  11  { SEL
121e0 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20  ECT a+1, b FROM 
121f0 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
12200 45 43 54 20 62 2c 20 61 2b 31 20 46 52 4f 4d 20  ECT b, a+1 FROM 
12210 64 35 20 4f 52 44 45 52 20 42 59 20 61 2b 31 20  d5 ORDER BY a+1 
12220 7d 20 0a 20 20 20 20 20 20 7b 32 20 66 20 20 20  } .      {2 f   
12230 35 20 63 20 20 20 63 20 35 20 20 20 66 20 32 7d  5 c   c 5   f 2}
12240 0a 20 20 31 32 20 20 7b 20 53 45 4c 45 43 54 20  .  12  { SELECT 
12250 61 2b 31 2c 20 62 20 46 52 4f 4d 20 64 35 20 55  a+1, b FROM d5 U
12260 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
12270 62 2c 20 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f  b, a+1 FROM d5 O
12280 52 44 45 52 20 42 59 20 31 20 7d 20 0a 20 20 20  RDER BY 1 } .   
12290 20 20 20 7b 32 20 66 20 20 20 35 20 63 20 20 20     {2 f   5 c   
122a0 63 20 35 20 20 20 66 20 32 7d 0a 7d 20 0a 0a 23  c 5   f 2}.} ..#
122b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
122c0 33 39 32 36 35 2d 30 34 30 37 30 20 49 66 20 6e  39265-04070 If n
122d0 6f 20 6d 61 74 63 68 69 6e 67 20 65 78 70 72 65  o matching expre
122e0 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 66 6f 75  ssion can be fou
122f0 6e 64 20 69 6e 0a 23 20 74 68 65 20 72 65 73 75  nd in.# the resu
12300 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e  lt columns of an
12310 79 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 53 45  y constituent SE
12320 4c 45 43 54 2c 20 69 74 20 69 73 20 61 6e 20 65  LECT, it is an e
12330 72 72 6f 72 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  rror..#.do_selec
12340 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
12350 2d 38 2e 31 34 20 2d 65 72 72 6f 72 20 7b 0a 20  -8.14 -error {. 
12360 20 25 73 20 4f 52 44 45 52 20 42 59 20 74 65 72   %s ORDER BY ter
12370 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
12380 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   any column in t
12390 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 7d 20  he result set.} 
123a0 7b 0a 20 20 31 20 20 20 7b 20 53 45 4c 45 43 54  {.  1   { SELECT
123b0 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   a FROM d5 UNION
123c0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64   SELECT c FROM d
123d0 36 20 4f 52 44 45 52 20 42 59 20 61 2b 31 20 7d  6 ORDER BY a+1 }
123e0 20 20 20 20 20 20 20 20 20 20 31 73 74 0a 20 20            1st.  
123f0 32 20 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46  2   { SELECT a F
12400 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 53 45 4c  ROM d5 UNION SEL
12410 45 43 54 20 63 20 46 52 4f 4d 20 64 36 20 4f 52  ECT c FROM d6 OR
12420 44 45 52 20 42 59 20 61 2c 20 61 2b 31 20 7d 20  DER BY a, a+1 } 
12430 20 20 20 20 20 20 32 6e 64 0a 20 20 33 20 20 20        2nd.  3   
12440 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
12450 64 35 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  d5 INTERSECT SEL
12460 45 43 54 20 2a 20 46 52 4f 4d 20 64 36 20 4f 52  ECT * FROM d6 OR
12470 44 45 52 20 42 59 20 27 68 65 6c 6c 6f 27 20 7d  DER BY 'hello' }
12480 20 20 31 73 74 0a 20 20 34 20 20 20 7b 20 53 45    1st.  4   { SE
12490 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 35 20 49  LECT * FROM d5 I
124a0 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
124b0 2a 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20  * FROM d6 ORDER 
124c0 42 59 20 62 6c 61 68 20 20 20 20 7d 20 20 31 73  BY blah    }  1s
124d0 74 0a 20 20 35 20 20 20 7b 20 53 45 4c 45 43 54  t.  5   { SELECT
124e0 20 2a 20 46 52 4f 4d 20 64 35 20 49 4e 54 45 52   * FROM d5 INTER
124f0 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52  SECT SELECT * FR
12500 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20 63  OM d6 ORDER BY c
12510 2c 64 2c 63 2b 64 20 7d 20 20 33 72 64 0a 20 20  ,d,c+d }  3rd.  
12520 36 20 20 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6   { SELECT * F
12530 52 4f 4d 20 64 35 20 45 58 43 45 50 54 20 53 45  ROM d5 EXCEPT SE
12540 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 37 20 4f  LECT * FROM d7 O
12550 52 44 45 52 20 42 59 20 31 2c 32 2c 62 2c 61 2f  RDER BY 1,2,b,a/
12560 62 20 20 7d 20 20 34 74 68 0a 7d 20 0a 0a 23 20  b  }  4th.} ..# 
12570 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
12580 33 34 30 37 2d 31 31 34 38 33 20 45 61 63 68 20  3407-11483 Each 
12590 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
125a0 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 0a 23  R BY clause is.#
125b0 20 70 72 6f 63 65 73 73 65 64 20 73 65 70 61 72   processed separ
125c0 61 74 65 6c 79 20 61 6e 64 20 6d 61 79 20 62 65  ately and may be
125d0 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74   matched against
125e0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
125f0 66 72 6f 6d 0a 23 20 64 69 66 66 65 72 65 6e 74  from.# different
12600 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12610 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
12620 6e 64 2e 0a 23 20 0a 64 6f 5f 73 65 6c 65 63 74  nd..# .do_select
12630 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
12640 38 2e 31 35 20 7b 0a 20 20 31 20 20 7b 20 53 45  8.15 {.  1  { SE
12650 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64  LECT a, b FROM d
12660 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
12670 43 54 20 63 2d 31 2c 20 64 20 46 52 4f 4d 20 64  CT c-1, d FROM d
12680 36 20 4f 52 44 45 52 20 42 59 20 61 2c 20 64 20  6 ORDER BY a, d 
12690 7d 0a 20 20 20 20 20 7b 31 20 65 20 20 20 31 20  }.     {1 e   1 
126a0 66 20 20 20 34 20 62 20 20 20 34 20 63 7d 0a 20  f   4 b   4 c}. 
126b0 20 32 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20   2  { SELECT a, 
126c0 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20  b FROM d5 UNION 
126d0 41 4c 4c 20 53 45 4c 45 43 54 20 63 2d 31 2c 20  ALL SELECT c-1, 
126e0 64 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20  d FROM d6 ORDER 
126f0 42 59 20 63 2d 31 2c 20 62 20 7d 0a 20 20 20 20  BY c-1, b }.    
12700 20 7b 31 20 65 20 20 20 31 20 66 20 20 20 34 20   {1 e   1 f   4 
12710 62 20 20 20 34 20 63 7d 0a 20 20 33 20 20 7b 20  b   4 c}.  3  { 
12720 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
12730 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   d5 UNION ALL SE
12740 4c 45 43 54 20 63 2d 31 2c 20 64 20 46 52 4f 4d  LECT c-1, d FROM
12750 20 64 36 20 4f 52 44 45 52 20 42 59 20 31 2c 20   d6 ORDER BY 1, 
12760 32 20 7d 0a 20 20 20 20 20 7b 31 20 65 20 20 20  2 }.     {1 e   
12770 31 20 66 20 20 20 34 20 62 20 20 20 34 20 63 7d  1 f   4 b   4 c}
12780 0a 7d 20 0a 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127d0 0a 23 20 54 65 73 74 73 20 72 65 6c 61 74 65 64  .# Tests related
127e0 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d   to statements m
127f0 61 64 65 20 61 62 6f 75 74 20 74 68 65 20 4c 49  ade about the LI
12800 4d 49 54 2f 4f 46 46 53 45 54 20 63 6c 61 75 73  MIT/OFFSET claus
12810 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  e..#.do_execsql_
12820 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 39 2e  test e_select-9.
12830 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
12840 4c 45 20 66 31 28 61 2c 20 62 29 3b 0a 20 20 49  LE f1(a, b);.  I
12850 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41  NSERT INTO f1 VA
12860 4c 55 45 53 28 32 36 2c 20 27 7a 27 29 3b 0a 20  LUES(26, 'z');. 
12870 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12880 56 41 4c 55 45 53 28 32 35 2c 20 27 79 27 29 3b  VALUES(25, 'y');
12890 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
128a0 31 20 56 41 4c 55 45 53 28 32 34 2c 20 27 78 27  1 VALUES(24, 'x'
128b0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
128c0 20 66 31 20 56 41 4c 55 45 53 28 32 33 2c 20 27   f1 VALUES(23, '
128d0 77 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  w');.  INSERT IN
128e0 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 32 2c  TO f1 VALUES(22,
128f0 20 27 76 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'v');.  INSERT 
12900 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32  INTO f1 VALUES(2
12910 31 2c 20 27 75 27 29 3b 0a 20 20 49 4e 53 45 52  1, 'u');.  INSER
12920 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
12930 28 32 30 2c 20 27 74 27 29 3b 0a 20 20 49 4e 53  (20, 't');.  INS
12940 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12950 45 53 28 31 39 2c 20 27 73 27 29 3b 0a 20 20 49  ES(19, 's');.  I
12960 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41  NSERT INTO f1 VA
12970 4c 55 45 53 28 31 38 2c 20 27 72 27 29 3b 0a 20  LUES(18, 'r');. 
12980 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12990 56 41 4c 55 45 53 28 31 37 2c 20 27 71 27 29 3b  VALUES(17, 'q');
129a0 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
129b0 31 20 56 41 4c 55 45 53 28 31 36 2c 20 27 70 27  1 VALUES(16, 'p'
129c0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
129d0 20 66 31 20 56 41 4c 55 45 53 28 31 35 2c 20 27   f1 VALUES(15, '
129e0 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
129f0 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 34 2c  TO f1 VALUES(14,
12a00 20 27 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'n');.  INSERT 
12a10 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31  INTO f1 VALUES(1
12a20 33 2c 20 27 6d 27 29 3b 0a 20 20 49 4e 53 45 52  3, 'm');.  INSER
12a30 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
12a40 28 31 32 2c 20 27 6c 27 29 3b 0a 20 20 49 4e 53  (12, 'l');.  INS
12a50 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12a60 45 53 28 31 31 2c 20 27 6b 27 29 3b 0a 20 20 49  ES(11, 'k');.  I
12a70 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41  NSERT INTO f1 VA
12a80 4c 55 45 53 28 31 30 2c 20 27 6a 27 29 3b 0a 20  LUES(10, 'j');. 
12a90 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12aa0 56 41 4c 55 45 53 28 39 2c 20 27 69 27 29 3b 0a  VALUES(9, 'i');.
12ab0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
12ac0 20 56 41 4c 55 45 53 28 38 2c 20 27 68 27 29 3b   VALUES(8, 'h');
12ad0 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
12ae0 31 20 56 41 4c 55 45 53 28 37 2c 20 27 67 27 29  1 VALUES(7, 'g')
12af0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
12b00 66 31 20 56 41 4c 55 45 53 28 36 2c 20 27 66 27  f1 VALUES(6, 'f'
12b10 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12b20 20 66 31 20 56 41 4c 55 45 53 28 35 2c 20 27 65   f1 VALUES(5, 'e
12b30 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12b40 4f 20 66 31 20 56 41 4c 55 45 53 28 34 2c 20 27  O f1 VALUES(4, '
12b50 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  d');.  INSERT IN
12b60 54 4f 20 66 31 20 56 41 4c 55 45 53 28 33 2c 20  TO f1 VALUES(3, 
12b70 27 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'c');.  INSERT I
12b80 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 2c  NTO f1 VALUES(2,
12b90 20 27 62 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'b');.  INSERT 
12ba0 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31  INTO f1 VALUES(1
12bb0 2c 20 27 61 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20  , 'a');.} {}..# 
12bc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
12bd0 30 34 38 31 2d 35 36 36 32 37 20 41 6e 79 20 73  0481-56627 Any s
12be0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
12bf0 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20   may be used in 
12c00 74 68 65 0a 23 20 4c 49 4d 49 54 20 63 6c 61 75  the.# LIMIT clau
12c10 73 65 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20 69  se, so long as i
12c20 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  t evaluates to a
12c30 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 76  n integer or a v
12c40 61 6c 75 65 20 74 68 61 74 0a 23 20 63 61 6e 20  alue that.# can 
12c50 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f  be losslessly co
12c60 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e  nverted to an in
12c70 74 65 67 65 72 2e 0a 23 0a 64 6f 5f 73 65 6c 65  teger..#.do_sele
12c80 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
12c90 74 2d 39 2e 31 20 7b 0a 20 20 31 20 20 7b 20 53  t-9.1 {.  1  { S
12ca0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
12cb0 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
12cc0 20 35 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d   5 } {a b c d e}
12cd0 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62  .  2  { SELECT b
12ce0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
12cf0 59 20 61 20 4c 49 4d 49 54 20 32 2b 33 20 7d 20  Y a LIMIT 2+3 } 
12d00 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20 33 20  {a b c d e}.  3 
12d10 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
12d20 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
12d30 49 4d 49 54 20 28 53 45 4c 45 43 54 20 61 20 46  IMIT (SELECT a F
12d40 52 4f 4d 20 66 31 20 57 48 45 52 45 20 62 20 3d  ROM f1 WHERE b =
12d50 20 27 65 27 29 20 7d 20 0a 20 20 20 20 20 7b 61   'e') } .     {a
12d60 20 62 20 63 20 64 20 65 7d 0a 20 20 34 20 20 7b   b c d e}.  4  {
12d70 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
12d80 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
12d90 49 54 20 35 2e 30 20 7d 20 7b 61 20 62 20 63 20  IT 5.0 } {a b c 
12da0 64 20 65 7d 0a 20 20 35 20 20 7b 20 53 45 4c 45  d e}.  5  { SELE
12db0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
12dc0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 27 35  ER BY a LIMIT '5
12dd0 27 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a  ' } {a b c d e}.
12de0 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
12df0 3a 20 52 2d 34 36 31 35 35 2d 34 37 32 31 39 20  : R-46155-47219 
12e00 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
12e10 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
12e20 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 23 20 6f 72   NULL value.# or
12e30 20 61 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   any other value
12e40 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
12e50 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65  losslessly conve
12e60 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  rted to an integ
12e70 65 72 2c 0a 23 20 61 6e 20 65 72 72 6f 72 20 69  er,.# an error i
12e80 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 0a 64  s returned..#..d
12e90 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
12ea0 5f 73 65 6c 65 63 74 2d 39 2e 32 20 2d 65 72 72  _select-9.2 -err
12eb0 6f 72 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  or "datatype mis
12ec0 6d 61 74 63 68 22 20 7b 0a 20 20 31 20 20 7b 20  match" {.  1  { 
12ed0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
12ee0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
12ef0 54 20 27 68 65 6c 6c 6f 27 20 7d 20 7b 7d 0a 20  T 'hello' } {}. 
12f00 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   2  { SELECT b F
12f10 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
12f20 61 20 4c 49 4d 49 54 20 4e 55 4c 4c 20 7d 20 7b  a LIMIT NULL } {
12f30 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20  }.  3  { SELECT 
12f40 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
12f50 42 59 20 61 20 4c 49 4d 49 54 20 58 27 41 42 43  BY a LIMIT X'ABC
12f60 44 27 20 7d 20 7b 7d 0a 20 20 34 20 20 7b 20 53  D' } {}.  4  { S
12f70 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
12f80 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
12f90 20 35 2e 31 20 7d 20 7b 7d 0a 20 20 35 20 20 7b   5.1 } {}.  5  {
12fa0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
12fb0 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
12fc0 49 54 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70  IT (SELECT group
12fd0 5f 63 6f 6e 63 61 74 28 62 29 20 46 52 4f 4d 20  _concat(b) FROM 
12fe0 66 31 29 20 7d 20 7b 7d 0a 7d 20 0a 0a 23 20 45  f1) } {}.} ..# E
12ff0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
13000 30 31 34 2d 32 36 34 31 34 20 49 66 20 74 68 65  014-26414 If the
13010 20 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69 6f   LIMIT expressio
13020 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
13030 0a 23 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  .# negative valu
13040 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  e, then there is
13050 20 6e 6f 20 75 70 70 65 72 20 62 6f 75 6e 64 20   no upper bound 
13060 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
13070 20 72 6f 77 73 0a 23 20 72 65 74 75 72 6e 65 64   rows.# returned
13080 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
13090 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 34  sts e_select-9.4
130a0 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54   {.  1  { SELECT
130b0 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
130c0 20 42 59 20 61 20 4c 49 4d 49 54 20 2d 31 20 7d   BY a LIMIT -1 }
130d0 20 0a 20 20 20 20 20 7b 61 20 62 20 63 20 64 20   .     {a b c d 
130e0 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20  e f g h i j k l 
130f0 6d 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74 20  m n o p q r s t 
13100 75 20 76 20 77 20 78 20 79 20 7a 7d 0a 20 20 32  u v w x y z}.  2
13110 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13120 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13130 4c 49 4d 49 54 20 6c 65 6e 67 74 68 28 27 61 62  LIMIT length('ab
13140 63 27 29 2d 31 30 30 20 7d 20 0a 20 20 20 20 20  c')-100 } .     
13150 7b 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68  {a b c d e f g h
13160 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70   i j k l m n o p
13170 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78   q r s t u v w x
13180 20 79 20 7a 7d 0a 20 20 33 20 20 7b 20 53 45 4c   y z}.  3  { SEL
13190 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
131a0 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 28  DER BY a LIMIT (
131b0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
131c0 46 52 4f 4d 20 66 31 29 2f 32 20 2d 20 31 34 20  FROM f1)/2 - 14 
131d0 7d 0a 20 20 20 20 20 7b 61 20 62 20 63 20 64 20  }.     {a b c d 
131e0 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20  e f g h i j k l 
131f0 6d 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74 20  m n o p q r s t 
13200 75 20 76 20 77 20 78 20 79 20 7a 7d 0a 7d 0a 0a  u v w x y z}.}..
13210 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
13220 2d 33 33 37 35 30 2d 32 39 35 33 36 20 4f 74 68  -33750-29536 Oth
13230 65 72 77 69 73 65 2c 20 74 68 65 20 53 45 4c 45  erwise, the SELE
13240 43 54 20 72 65 74 75 72 6e 73 20 74 68 65 20 66  CT returns the f
13250 69 72 73 74 20 4e 0a 23 20 72 6f 77 73 20 6f 66  irst N.# rows of
13260 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 20   its result set 
13270 6f 6e 6c 79 2c 20 77 68 65 72 65 20 4e 20 69 73  only, where N is
13280 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
13290 74 68 65 20 4c 49 4d 49 54 0a 23 20 65 78 70 72  the LIMIT.# expr
132a0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
132b0 20 74 6f 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74   to..#.do_select
132c0 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
132d0 39 2e 35 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c  9.5 {.  1  { SEL
132e0 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
132f0 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 30  DER BY a LIMIT 0
13300 20 7d 20 7b 7d 0a 20 20 32 20 20 7b 20 53 45 4c   } {}.  2  { SEL
13310 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13320 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49  DER BY a DESC LI
13330 4d 49 54 20 34 20 7d 20 7b 7a 20 79 20 78 20 77  MIT 4 } {z y x w
13340 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20  }.  3  { SELECT 
13350 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
13360 42 59 20 61 20 44 45 53 43 20 4c 49 4d 49 54 20  BY a DESC LIMIT 
13370 38 20 7d 20 7b 7a 20 79 20 78 20 77 20 76 20 75  8 } {z y x w v u
13380 20 74 20 73 7d 0a 20 20 34 20 20 7b 20 53 45 4c   t s}.  4  { SEL
13390 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
133a0 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49  DER BY a DESC LI
133b0 4d 49 54 20 27 31 32 2e 30 27 20 7d 20 7b 7a 20  MIT '12.0' } {z 
133c0 79 20 78 20 77 20 76 20 75 20 74 20 73 20 72 20  y x w v u t s r 
133d0 71 20 70 20 6f 7d 0a 7d 0a 0a 23 20 45 56 49 44  q p o}.}..# EVID
133e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 39 33 35  ENCE-OF: R-54935
133f0 2d 31 39 30 35 37 20 4f 72 2c 20 69 66 20 74 68  -19057 Or, if th
13400 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13410 6e 74 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 0a  nt would return.
13420 23 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 72 6f  # less than N ro
13430 77 73 20 77 69 74 68 6f 75 74 20 61 20 4c 49 4d  ws without a LIM
13440 49 54 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  IT clause, then 
13450 74 68 65 20 65 6e 74 69 72 65 20 72 65 73 75 6c  the entire resul
13460 74 20 73 65 74 20 69 73 0a 23 20 72 65 74 75 72  t set is.# retur
13470 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  ned..#.do_select
13480 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
13490 39 2e 36 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c  9.6 {.  1  { SEL
134a0 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 57 48  ECT b FROM f1 WH
134b0 45 52 45 20 61 3e 32 31 20 4f 52 44 45 52 20 42  ERE a>21 ORDER B
134c0 59 20 61 20 4c 49 4d 49 54 20 31 30 20 7d 20 7b  Y a LIMIT 10 } {
134d0 76 20 77 20 78 20 79 20 7a 7d 0a 20 20 32 20 20  v w x y z}.  2  
134e0 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
134f0 29 20 46 52 4f 4d 20 66 31 20 47 52 4f 55 50 20  ) FROM f1 GROUP 
13500 42 59 20 61 2f 35 20 4f 52 44 45 52 20 42 59 20  BY a/5 ORDER BY 
13510 31 20 4c 49 4d 49 54 20 31 30 20 7d 20 7b 32 20  1 LIMIT 10 } {2 
13520 34 20 35 20 35 20 35 20 35 7d 0a 7d 20 0a 0a 0a  4 5 5 5 5}.} ...
13530 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
13540 2d 32 34 31 38 38 2d 32 34 33 34 39 20 54 68 65  -24188-24349 The
13550 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 74 61   expression atta
13560 63 68 65 64 20 74 6f 20 74 68 65 20 6f 70 74 69  ched to the opti
13570 6f 6e 61 6c 0a 23 20 4f 46 46 53 45 54 20 63 6c  onal.# OFFSET cl
13580 61 75 73 65 20 74 68 61 74 20 6d 61 79 20 66 6f  ause that may fo
13590 6c 6c 6f 77 20 61 20 4c 49 4d 49 54 20 63 6c 61  llow a LIMIT cla
135a0 75 73 65 20 6d 75 73 74 20 61 6c 73 6f 20 65 76  use must also ev
135b0 61 6c 75 61 74 65 20 74 6f 20 61 6e 0a 23 20 69  aluate to an.# i
135c0 6e 74 65 67 65 72 2c 20 6f 72 20 61 20 76 61 6c  nteger, or a val
135d0 75 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 6c  ue that can be l
135e0 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
135f0 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ted to an intege
13600 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  r..#.foreach {tn
13610 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31 20 20   select} {.  1  
13620 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
13630 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
13640 4d 49 54 20 32 20 4f 46 46 53 45 54 20 27 68 65  MIT 2 OFFSET 'he
13650 6c 6c 6f 27 20 7d 20 0a 20 20 32 20 20 7b 20 53  llo' } .  2  { S
13660 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13670 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13680 20 32 20 4f 46 46 53 45 54 20 4e 55 4c 4c 20 7d   2 OFFSET NULL }
13690 20 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20   .  3  { SELECT 
136a0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
136b0 42 59 20 61 20 4c 49 4d 49 54 20 32 20 4f 46 46  BY a LIMIT 2 OFF
136c0 53 45 54 20 58 27 41 42 43 44 27 20 7d 20 0a 20  SET X'ABCD' } . 
136d0 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   4  { SELECT b F
136e0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
136f0 61 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54  a LIMIT 2 OFFSET
13700 20 35 2e 31 20 7d 20 0a 20 20 35 20 20 7b 20 53   5.1 } .  5  { S
13710 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13720 4f 52 44 45 52 20 42 59 20 61 20 0a 20 20 20 20  ORDER BY a .    
13730 20 20 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45     LIMIT 2 OFFSE
13740 54 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70 5f  T (SELECT group_
13750 63 6f 6e 63 61 74 28 62 29 20 46 52 4f 4d 20 66  concat(b) FROM f
13760 31 29 20 0a 20 20 7d 20 0a 7d 20 7b 0a 20 20 64  1) .  } .} {.  d
13770 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
13780 65 5f 73 65 6c 65 63 74 2d 39 2e 37 2e 24 74 6e  e_select-9.7.$tn
13790 20 24 73 65 6c 65 63 74 20 7b 31 20 7b 64 61 74   $select {1 {dat
137a0 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d  atype mismatch}}
137b0 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
137c0 46 3a 20 52 2d 32 30 34 36 37 2d 34 33 34 32 32  F: R-20467-43422
137d0 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
137e0 6e 20 68 61 73 20 61 6e 20 4f 46 46 53 45 54 20  n has an OFFSET 
137f0 63 6c 61 75 73 65 2c 20 74 68 65 6e 0a 23 20 74  clause, then.# t
13800 68 65 20 66 69 72 73 74 20 4d 20 72 6f 77 73 20  he first M rows 
13810 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
13820 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
13830 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
13840 23 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  # SELECT stateme
13850 6e 74 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20  nt and the next 
13860 4e 20 72 6f 77 73 20 61 72 65 20 72 65 74 75 72  N rows are retur
13870 6e 65 64 2c 20 77 68 65 72 65 20 4d 20 61 6e 64  ned, where M and
13880 20 4e 20 61 72 65 0a 23 20 74 68 65 20 76 61 6c   N are.# the val
13890 75 65 73 20 74 68 61 74 20 74 68 65 20 4f 46 46  ues that the OFF
138a0 53 45 54 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c  SET and LIMIT cl
138b0 61 75 73 65 73 20 65 76 61 6c 75 61 74 65 20 74  auses evaluate t
138c0 6f 2c 0a 23 20 72 65 73 70 65 63 74 69 76 65 6c  o,.# respectivel
138d0 79 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  y..#.do_select_t
138e0 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e  ests e_select-9.
138f0 38 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43  8 {.  1  { SELEC
13900 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13910 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 20  R BY a LIMIT 10 
13920 4f 46 46 53 45 54 20 35 7d 20 7b 66 20 67 20 68  OFFSET 5} {f g h
13930 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 7d 0a   i j k l m n o}.
13940 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20    2  { SELECT b 
13950 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59  FROM f1 ORDER BY
13960 20 61 20 4c 49 4d 49 54 20 32 2b 33 20 4f 46 46   a LIMIT 2+3 OFF
13970 53 45 54 20 31 30 7d 20 7b 6b 20 6c 20 6d 20 6e  SET 10} {k l m n
13980 20 6f 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43   o}.  3  { SELEC
13990 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
139a0 52 20 42 59 20 61 20 0a 20 20 20 20 20 20 20 4c  R BY a .       L
139b0 49 4d 49 54 20 20 28 53 45 4c 45 43 54 20 61 20  IMIT  (SELECT a 
139c0 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20 62 3d  FROM f1 WHERE b=
139d0 27 6a 27 29 20 0a 20 20 20 20 20 20 20 4f 46 46  'j') .       OFF
139e0 53 45 54 20 28 53 45 4c 45 43 54 20 61 20 46 52  SET (SELECT a FR
139f0 4f 4d 20 66 31 20 57 48 45 52 45 20 62 3d 27 62  OM f1 WHERE b='b
13a00 27 29 20 0a 20 20 20 20 20 7d 20 7b 63 20 64 20  ') .     } {c d 
13a10 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 7d  e f g h i j k l}
13a20 0a 20 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62  .  4  { SELECT b
13a30 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13a40 59 20 61 20 4c 49 4d 49 54 20 27 35 27 20 4f 46  Y a LIMIT '5' OF
13a50 46 53 45 54 20 33 2e 30 20 7d 20 7b 64 20 65 20  FSET 3.0 } {d e 
13a60 66 20 67 20 68 7d 0a 20 20 35 20 20 7b 20 53 45  f g h}.  5  { SE
13a70 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
13a80 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
13a90 27 35 27 20 4f 46 46 53 45 54 20 30 20 7d 20 7b  '5' OFFSET 0 } {
13aa0 61 20 62 20 63 20 64 20 65 7d 0a 20 20 36 20 20  a b c d e}.  6  
13ab0 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
13ac0 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
13ad0 4d 49 54 20 30 20 4f 46 46 53 45 54 20 31 30 20  MIT 0 OFFSET 10 
13ae0 7d 20 7b 7d 0a 20 20 37 20 20 7b 20 53 45 4c 45  } {}.  7  { SELE
13af0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13b00 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 33 20  ER BY a LIMIT 3 
13b10 4f 46 46 53 45 54 20 27 31 27 7c 7c 27 35 27 20  OFFSET '1'||'5' 
13b20 7d 20 7b 70 20 71 20 72 7d 0a 7d 0a 0a 23 20 45  } {p q r}.}..# E
13b30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34  VIDENCE-OF: R-34
13b40 36 34 38 2d 34 34 38 37 35 20 4f 72 2c 20 69 66  648-44875 Or, if
13b50 20 74 68 65 20 53 45 4c 45 43 54 20 77 6f 75 6c   the SELECT woul
13b60 64 20 72 65 74 75 72 6e 20 6c 65 73 73 20 74 68  d return less th
13b70 61 6e 0a 23 20 4d 2b 4e 20 72 6f 77 73 20 69 66  an.# M+N rows if
13b80 20 69 74 20 64 69 64 20 6e 6f 74 20 68 61 76 65   it did not have
13b90 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
13ba0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13bb0 4d 20 72 6f 77 73 20 61 72 65 0a 23 20 73 6b 69  M rows are.# ski
13bc0 70 70 65 64 20 61 6e 64 20 74 68 65 20 72 65 6d  pped and the rem
13bd0 61 69 6e 69 6e 67 20 72 6f 77 73 20 28 69 66 20  aining rows (if 
13be0 61 6e 79 29 20 61 72 65 20 72 65 74 75 72 6e 65  any) are returne
13bf0 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  d..#.do_select_t
13c00 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e  ests e_select-9.
13c10 39 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43  9 {.  1  { SELEC
13c20 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13c30 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 20  R BY a LIMIT 10 
13c40 4f 46 46 53 45 54 20 32 30 7d 20 7b 75 20 76 20  OFFSET 20} {u v 
13c50 77 20 78 20 79 20 7a 7d 0a 20 20 32 20 20 7b 20  w x y z}.  2  { 
13c60 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31  SELECT a FROM f1
13c70 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43   ORDER BY a DESC
13c80 20 4c 49 4d 49 54 20 31 30 30 20 4f 46 46 53 45   LIMIT 100 OFFSE
13c90 54 20 31 38 2b 34 7d 20 7b 34 20 33 20 32 20 31  T 18+4} {4 3 2 1
13ca0 7d 0a 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45  }.}...# EVIDENCE
13cb0 2d 4f 46 3a 20 52 2d 32 33 32 39 33 2d 36 32 34  -OF: R-23293-624
13cc0 34 37 20 49 66 20 74 68 65 20 4f 46 46 53 45 54  47 If the OFFSET
13cd0 20 63 6c 61 75 73 65 20 65 76 61 6c 75 61 74 65   clause evaluate
13ce0 73 20 74 6f 20 61 0a 23 20 6e 65 67 61 74 69 76  s to a.# negativ
13cf0 65 20 76 61 6c 75 65 2c 20 74 68 65 20 72 65 73  e value, the res
13d00 75 6c 74 73 20 61 72 65 20 74 68 65 20 73 61 6d  ults are the sam
13d10 65 20 61 73 20 69 66 20 69 74 20 68 61 64 20 65  e as if it had e
13d20 76 61 6c 75 61 74 65 64 20 74 6f 0a 23 20 7a 65  valuated to.# ze
13d30 72 6f 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  ro..#.do_select_
13d40 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39  tests e_select-9
13d50 2e 31 30 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c  .10 {.  1  { SEL
13d60 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13d70 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 35  DER BY a LIMIT 5
13d80 20 4f 46 46 53 45 54 20 2d 31 20 7d 20 7b 61 20   OFFSET -1 } {a 
13d90 62 20 63 20 64 20 65 7d 0a 20 20 32 20 20 7b 20  b c d e}.  2  { 
13da0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
13db0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
13dc0 54 20 35 20 4f 46 46 53 45 54 20 2d 35 30 30 20  T 5 OFFSET -500 
13dd0 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20  } {a b c d e}.  
13de0 33 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  3  { SELECT b FR
13df0 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
13e00 20 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20   LIMIT 5 OFFSET 
13e10 30 20 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d  0  } {a b c d e}
13e20 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .} ..# EVIDENCE-
13e30 4f 46 3a 20 52 2d 31 39 35 30 39 2d 34 30 33 35  OF: R-19509-4035
13e40 36 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 73  6 Instead of a s
13e50 65 70 61 72 61 74 65 20 4f 46 46 53 45 54 20 63  eparate OFFSET c
13e60 6c 61 75 73 65 2c 20 74 68 65 0a 23 20 4c 49 4d  lause, the.# LIM
13e70 49 54 20 63 6c 61 75 73 65 20 6d 61 79 20 73 70  IT clause may sp
13e80 65 63 69 66 79 20 74 77 6f 20 73 63 61 6c 61 72  ecify two scalar
13e90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70   expressions sep
13ea0 61 72 61 74 65 64 20 62 79 20 61 20 63 6f 6d 6d  arated by a comm
13eb0 61 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  a..#.# EVIDENCE-
13ec0 4f 46 3a 20 52 2d 33 33 37 38 38 2d 34 36 32 34  OF: R-33788-4624
13ed0 33 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  3 In this case, 
13ee0 74 68 65 20 66 69 72 73 74 20 65 78 70 72 65 73  the first expres
13ef0 73 69 6f 6e 20 69 73 20 75 73 65 64 0a 23 20 61  sion is used.# a
13f00 73 20 74 68 65 20 4f 46 46 53 45 54 20 65 78 70  s the OFFSET exp
13f10 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20  ression and the 
13f20 73 65 63 6f 6e 64 20 61 73 20 74 68 65 20 4c 49  second as the LI
13f30 4d 49 54 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  MIT expression..
13f40 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
13f50 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 31 31 20  s e_select-9.11 
13f60 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20  {.  1  { SELECT 
13f70 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
13f80 42 59 20 61 20 4c 49 4d 49 54 20 35 2c 20 31 30  BY a LIMIT 5, 10
13f90 20 7d 20 7b 66 20 67 20 68 20 69 20 6a 20 6b 20   } {f g h i j k 
13fa0 6c 20 6d 20 6e 20 6f 7d 0a 20 20 32 20 20 7b 20  l m n o}.  2  { 
13fb0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
13fc0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
13fd0 54 20 31 30 2c 20 32 2b 33 20 7d 20 7b 6b 20 6c  T 10, 2+3 } {k l
13fe0 20 6d 20 6e 20 6f 7d 0a 20 20 33 20 20 7b 20 53   m n o}.  3  { S
13ff0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
14000 4f 52 44 45 52 20 42 59 20 61 20 0a 20 20 20 20  ORDER BY a .    
14010 20 20 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54     LIMIT (SELECT
14020 20 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45   a FROM f1 WHERE
14030 20 62 3d 27 62 27 29 2c 20 28 53 45 4c 45 43 54   b='b'), (SELECT
14040 20 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45   a FROM f1 WHERE
14050 20 62 3d 27 6a 27 29 20 0a 20 20 20 20 20 7d 20   b='j') .     } 
14060 7b 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a  {c d e f g h i j
14070 20 6b 20 6c 7d 0a 20 20 34 20 20 7b 20 53 45 4c   k l}.  4  { SEL
14080 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
14090 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 33  DER BY a LIMIT 3
140a0 2e 30 2c 20 27 35 27 20 7d 20 7b 64 20 65 20 66  .0, '5' } {d e f
140b0 20 67 20 68 7d 0a 20 20 35 20 20 7b 20 53 45 4c   g h}.  5  { SEL
140c0 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
140d0 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 30  DER BY a LIMIT 0
140e0 2c 20 27 35 27 20 7d 20 7b 61 20 62 20 63 20 64  , '5' } {a b c d
140f0 20 65 7d 0a 20 20 36 20 20 7b 20 53 45 4c 45 43   e}.  6  { SELEC
14100 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
14110 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 2c  R BY a LIMIT 10,
14120 20 30 20 7d 20 7b 7d 0a 20 20 37 20 20 7b 20 53   0 } {}.  7  { S
14130 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
14140 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
14150 20 27 31 27 7c 7c 27 35 27 2c 20 33 20 7d 20 7b   '1'||'5', 3 } {
14160 70 20 71 20 72 7d 0a 0a 20 20 38 20 20 7b 20 53  p q r}..  8  { S
14170 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
14180 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
14190 20 32 30 2c 20 31 30 20 7d 20 7b 75 20 76 20 77   20, 10 } {u v w
141a0 20 78 20 79 20 7a 7d 0a 20 20 39 20 20 7b 20 53   x y z}.  9  { S
141b0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20  ELECT a FROM f1 
141c0 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 20  ORDER BY a DESC 
141d0 4c 49 4d 49 54 20 31 38 2b 34 2c 20 31 30 30 20  LIMIT 18+4, 100 
141e0 7d 20 7b 34 20 33 20 32 20 31 7d 0a 0a 20 20 31  } {4 3 2 1}..  1
141f0 30 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f  0 { SELECT b FRO
14200 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
14210 4c 49 4d 49 54 20 2d 31 2c 20 35 20 7d 20 7b 61  LIMIT -1, 5 } {a
14220 20 62 20 63 20 64 20 65 7d 0a 20 20 31 31 20 7b   b c d e}.  11 {
14230 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
14240 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
14250 49 54 20 2d 35 30 30 2c 20 35 20 7d 20 7b 61 20  IT -500, 5 } {a 
14260 62 20 63 20 64 20 65 7d 0a 20 20 31 32 20 7b 20  b c d e}.  12 { 
14270 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
14280 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
14290 54 20 30 2c 20 35 20 7d 20 7b 61 20 62 20 63 20  T 0, 5 } {a b c 
142a0 64 20 65 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74  d e}.}..finish_t
142b0 65 73 74 0a                                      est.