/ Hex Artifact Content
Login

Artifact 07e8d81268ba1ffcaf1dc4bec48956af150c42f9:


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 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
09c0: 46 3a 20 52 2d 31 31 33 35 33 2d 33 33 35 30 31  F: R-11353-33501
09d0: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
09e0: 61 6d 20 6a 6f 69 6e 2d 63 6f 6e 73 74 72 61 69  am join-constrai
09f0: 6e 74 0a 23 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73  nt.#.do_join_tes
0a00: 74 20 65 5f 73 65 6c 65 63 74 2d 30 2e 31 2e 31  t e_select-0.1.1
0a10: 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e   {.  SELECT coun
0a20: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 25 4a 4f  t(*) FROM t1 %JO
0a30: 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d  IN% t2 ON (t1.a=
0a40: 74 32 2e 61 29 0a 7d 20 7b 33 7d 0a 64 6f 5f 6a  t2.a).} {3}.do_j
0a50: 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  oin_test e_selec
0a60: 74 2d 30 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45  t-0.1.2 {.  SELE
0a70: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0a80: 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 55 53   t1 %JOIN% t2 US
0a90: 49 4e 47 20 28 61 29 0a 7d 20 7b 33 7d 0a 64 6f  ING (a).} {3}.do
0aa0: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
0ab0: 65 63 74 2d 30 2e 31 2e 33 20 7b 0a 20 20 53 45  ect-0.1.3 {.  SE
0ac0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
0ad0: 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 0a  OM t1 %JOIN% t2.
0ae0: 7d 20 7b 39 7d 0a 64 6f 5f 63 61 74 63 68 73 71  } {9}.do_catchsq
0af0: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
0b00: 30 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  0.1.4 {.  SELECT
0b10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0b20: 31 2c 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d 74  1, t2 ON (t1.a=t
0b30: 32 2e 61 29 20 55 53 49 4e 47 20 28 61 29 0a 7d  2.a) USING (a).}
0b40: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 68 61 76 65   {1 {cannot have
0b50: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
0b60: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
0b70: 65 20 73 61 6d 65 20 6a 6f 69 6e 7d 7d 0a 64 6f  e same join}}.do
0b80: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
0b90: 5f 73 65 6c 65 63 74 2d 30 2e 31 2e 35 20 7b 0a  _select-0.1.5 {.
0ba0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
0bb0: 29 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 55 53  ) FROM t1, t2 US
0bc0: 49 4e 47 20 28 61 29 20 4f 4e 20 28 74 31 2e 61  ING (a) ON (t1.a
0bd0: 3d 74 32 2e 61 29 0a 7d 20 7b 31 20 7b 6e 65 61  =t2.a).} {1 {nea
0be0: 72 20 22 4f 4e 22 3a 20 73 79 6e 74 61 78 20 65  r "ON": syntax e
0bf0: 72 72 6f 72 7d 7d 0a 0a 23 20 45 56 49 44 45 4e  rror}}..# EVIDEN
0c00: 43 45 2d 4f 46 3a 20 52 2d 34 30 39 31 39 2d 34  CE-OF: R-40919-4
0c10: 30 39 34 31 20 2d 2d 20 73 79 6e 74 61 78 20 64  0941 -- syntax d
0c20: 69 61 67 72 61 6d 20 73 65 6c 65 63 74 2d 63 6f  iagram select-co
0c30: 72 65 0a 23 0a 23 20 20 20 30 3a 20 53 45 4c 45  re.#.#   0: SELE
0c40: 43 54 20 2e 2e 2e 0a 23 20 20 20 31 3a 20 53 45  CT ....#   1: SE
0c50: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 2e 2e  LECT DISTINCT ..
0c60: 2e 0a 23 20 20 20 32 3a 20 53 45 4c 45 43 54 20  ..#   2: SELECT 
0c70: 41 4c 4c 20 2e 2e 2e 0a 23 0a 23 20 20 20 30 3a  ALL ....#.#   0:
0c80: 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
0c90: 23 20 20 20 31 3a 20 48 61 73 20 46 52 4f 4d 20  #   1: Has FROM 
0ca0: 63 6c 61 75 73 65 0a 23 0a 23 20 20 20 30 3a 20  clause.#.#   0: 
0cb0: 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  No WHERE clause.
0cc0: 23 20 20 20 31 3a 20 48 61 73 20 57 48 45 52 45  #   1: Has WHERE
0cd0: 20 63 6c 61 75 73 65 0a 23 0a 23 20 20 20 30 3a   clause.#.#   0:
0ce0: 20 4e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   No GROUP BY cla
0cf0: 75 73 65 0a 23 20 20 20 31 3a 20 48 61 73 20 47  use.#   1: Has G
0d00: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 23  ROUP BY clause.#
0d10: 20 20 20 32 3a 20 48 61 73 20 47 52 4f 55 50 20     2: Has GROUP 
0d20: 42 59 20 61 6e 64 20 48 41 56 49 4e 47 20 63 6c  BY and HAVING cl
0d30: 61 75 73 65 73 0a 23 0a 64 6f 5f 73 65 6c 65 63  auses.#.do_selec
0d40: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
0d50: 2d 30 2e 32 20 7b 0a 20 20 30 30 30 30 2e 31 20  -0.2 {.  0000.1 
0d60: 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33   "SELECT 1, 2, 3
0d70: 20 22 20 7b 31 20 32 20 33 7d 0a 20 20 31 30 30   " {1 2 3}.  100
0d80: 30 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  0.1  "SELECT DIS
0d90: 54 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 22 20  TINCT 1, 2, 3 " 
0da0: 7b 31 20 32 20 33 7d 0a 20 20 32 30 30 30 2e 31  {1 2 3}.  2000.1
0db0: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c    "SELECT ALL 1,
0dc0: 20 32 2c 20 33 20 22 20 7b 31 20 32 20 33 7d 0a   2, 3 " {1 2 3}.
0dd0: 20 20 0a 20 20 30 31 30 30 2e 31 20 20 22 53 45    .  0100.1  "SE
0de0: 4c 45 43 54 20 61 2c 20 62 2c 20 61 7c 7c 62 20  LECT a, b, a||b 
0df0: 46 52 4f 4d 20 74 31 20 22 20 7b 0a 20 20 20 20  FROM t1 " {.    
0e00: 61 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74 77 6f  a one aone b two
0e10: 20 62 74 77 6f 20 63 20 74 68 72 65 65 20 63 74   btwo c three ct
0e20: 68 72 65 65 0a 20 20 7d 0a 20 20 31 31 30 30 2e  hree.  }.  1100.
0e30: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
0e40: 4e 43 54 20 61 2c 20 62 2c 20 61 7c 7c 62 20 46  NCT a, b, a||b F
0e50: 52 4f 4d 20 74 31 20 22 20 7b 0a 20 20 20 20 61  ROM t1 " {.    a
0e60: 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74 77 6f 20   one aone b two 
0e70: 62 74 77 6f 20 63 20 74 68 72 65 65 20 63 74 68  btwo c three cth
0e80: 72 65 65 0a 20 20 7d 0a 20 20 31 32 30 30 2e 31  ree.  }.  1200.1
0e90: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 61 2c    "SELECT ALL a,
0ea0: 20 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31   b, a||b FROM t1
0eb0: 20 22 20 7b 0a 20 20 20 20 61 20 6f 6e 65 20 61   " {.    a one a
0ec0: 6f 6e 65 20 62 20 74 77 6f 20 62 74 77 6f 20 63  one b two btwo c
0ed0: 20 74 68 72 65 65 20 63 74 68 72 65 65 0a 20 20   three cthree.  
0ee0: 7d 0a 0a 20 20 30 30 31 30 2e 31 20 20 22 53 45  }..  0010.1  "SE
0ef0: 4c 45 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45  LECT 1, 2, 3 WHE
0f00: 52 45 20 31 20 22 20 7b 31 20 32 20 33 7d 0a 20  RE 1 " {1 2 3}. 
0f10: 20 30 30 31 30 2e 32 20 20 22 53 45 4c 45 43 54   0010.2  "SELECT
0f20: 20 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20 30   1, 2, 3 WHERE 0
0f30: 20 22 20 7b 7d 0a 20 20 30 30 31 30 2e 33 20 20   " {}.  0010.3  
0f40: 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 20  "SELECT 1, 2, 3 
0f50: 57 48 45 52 45 20 4e 55 4c 4c 20 22 20 7b 7d 0a  WHERE NULL " {}.
0f60: 0a 20 20 31 30 31 30 2e 31 20 20 22 53 45 4c 45  .  1010.1  "SELE
0f70: 43 54 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32  CT DISTINCT 1, 2
0f80: 2c 20 33 20 57 48 45 52 45 20 31 20 22 20 7b 31  , 3 WHERE 1 " {1
0f90: 20 32 20 33 7d 0a 0a 20 20 32 30 31 30 2e 31 20   2 3}..  2010.1 
0fa0: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20   "SELECT ALL 1, 
0fb0: 32 2c 20 33 20 57 48 45 52 45 20 31 20 22 20 7b  2, 3 WHERE 1 " {
0fc0: 31 20 32 20 33 7d 0a 0a 20 20 30 31 31 30 2e 31  1 2 3}..  0110.1
0fd0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 2c 20    "SELECT a, b, 
0fe0: 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a||b FROM t1 WHE
0ff0: 52 45 20 61 21 3d 27 78 27 20 22 20 7b 0a 20 20  RE a!='x' " {.  
1000: 20 20 61 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74    a one aone b t
1010: 77 6f 20 62 74 77 6f 20 63 20 74 68 72 65 65 20  wo btwo c three 
1020: 63 74 68 72 65 65 0a 20 20 7d 0a 20 20 30 31 31  cthree.  }.  011
1030: 30 2e 32 20 20 22 53 45 4c 45 43 54 20 61 2c 20  0.2  "SELECT a, 
1040: 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20  b, a||b FROM t1 
1050: 57 48 45 52 45 20 61 3d 3d 27 78 27 22 20 7b 7d  WHERE a=='x'" {}
1060: 0a 0a 20 20 31 31 31 30 2e 31 20 20 22 53 45 4c  ..  1110.1  "SEL
1070: 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c 20  ECT DISTINCT a, 
1080: 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20  b, a||b FROM t1 
1090: 57 48 45 52 45 20 61 21 3d 27 78 27 20 22 20 7b  WHERE a!='x' " {
10a0: 0a 20 20 20 20 61 20 6f 6e 65 20 61 6f 6e 65 20  .    a one aone 
10b0: 62 20 74 77 6f 20 62 74 77 6f 20 63 20 74 68 72  b two btwo c thr
10c0: 65 65 20 63 74 68 72 65 65 0a 20 20 7d 0a 0a 20  ee cthree.  }.. 
10d0: 20 32 31 31 30 2e 30 20 20 22 53 45 4c 45 43 54   2110.0  "SELECT
10e0: 20 41 4c 4c 20 61 2c 20 62 2c 20 61 7c 7c 62 20   ALL a, b, a||b 
10f0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1100: 3d 27 78 27 22 20 7b 7d 0a 0a 20 20 30 30 30 31  ='x'" {}..  0001
1110: 2e 31 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32  .1  "SELECT 1, 2
1120: 2c 20 33 20 47 52 4f 55 50 20 42 59 20 32 22 20  , 3 GROUP BY 2" 
1130: 7b 31 20 32 20 33 7d 0a 20 20 30 30 30 32 2e 31  {1 2 3}.  0002.1
1140: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
1150: 33 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56  3 GROUP BY 2 HAV
1160: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20  ING count(*)=1" 
1170: 7b 31 20 32 20 33 7d 0a 20 20 30 30 30 32 2e 32  {1 2 3}.  0002.2
1180: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
1190: 33 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56  3 GROUP BY 2 HAV
11a0: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20  ING count(*)>1" 
11b0: 7b 7d 0a 0a 20 20 31 30 30 31 2e 31 20 20 22 53  {}..  1001.1  "S
11c0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 31  ELECT DISTINCT 1
11d0: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
11e0: 32 22 20 7b 31 20 32 20 33 7d 0a 20 20 31 30 30  2" {1 2 3}.  100
11f0: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  2.1  "SELECT DIS
1200: 54 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 47 52  TINCT 1, 2, 3 GR
1210: 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20  OUP BY 2 HAVING 
1220: 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20 32  count(*)=1" {1 2
1230: 20 33 7d 0a 20 20 31 30 30 32 2e 32 20 20 22 53   3}.  1002.2  "S
1240: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 31  ELECT DISTINCT 1
1250: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
1260: 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  2 HAVING count(*
1270: 29 3e 31 22 20 7b 7d 0a 0a 20 20 32 30 30 31 2e  )>1" {}..  2001.
1280: 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31  1  "SELECT ALL 1
1290: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
12a0: 32 22 20 7b 31 20 32 20 33 7d 0a 20 20 32 30 30  2" {1 2 3}.  200
12b0: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c  2.1  "SELECT ALL
12c0: 20 31 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42   1, 2, 3 GROUP B
12d0: 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  Y 2 HAVING count
12e0: 28 2a 29 3d 31 22 20 7b 31 20 32 20 33 7d 0a 20  (*)=1" {1 2 3}. 
12f0: 20 32 30 30 32 2e 32 20 20 22 53 45 4c 45 43 54   2002.2  "SELECT
1300: 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 47 52 4f   ALL 1, 2, 3 GRO
1310: 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63  UP BY 2 HAVING c
1320: 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20  ount(*)>1" {}.. 
1330: 20 30 31 30 31 2e 31 20 20 22 53 45 4c 45 43 54   0101.1  "SELECT
1340: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61   count(*), max(a
1350: 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  ) FROM t1 GROUP 
1360: 42 59 20 62 22 20 7b 31 20 61 20 31 20 63 20 31  BY b" {1 a 1 c 1
1370: 20 62 7d 0a 20 20 30 31 30 32 2e 31 20 20 22 53   b}.  0102.1  "S
1380: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
1390: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47  max(a) FROM t1 G
13a0: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
13b0: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
13c0: 20 20 20 31 20 61 20 31 20 63 20 31 20 62 0a 20     1 a 1 c 1 b. 
13d0: 20 7d 0a 20 20 30 31 30 32 2e 32 20 20 22 53 45   }.  0102.2  "SE
13e0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
13f0: 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47 52  ax(a) FROM t1 GR
1400: 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
1410: 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 20 7d 0a  count(*)=2" { }.
1420: 0a 20 20 31 31 30 31 2e 31 20 20 22 53 45 4c 45  .  1101.1  "SELE
1430: 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e  CT DISTINCT coun
1440: 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f  t(*), max(a) FRO
1450: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 62 22  M t1 GROUP BY b"
1460: 20 7b 31 20 61 20 31 20 63 20 31 20 62 7d 0a 20   {1 a 1 c 1 b}. 
1470: 20 31 31 30 32 2e 31 20 20 22 53 45 4c 45 43 54   1102.1  "SELECT
1480: 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28   DISTINCT count(
1490: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
14a0: 74 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 47  t1 .           G
14b0: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
14c0: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
14d0: 20 20 20 31 20 61 20 31 20 63 20 31 20 62 0a 20     1 a 1 c 1 b. 
14e0: 20 7d 0a 20 20 31 31 30 32 2e 32 20 20 22 53 45   }.  1102.2  "SE
14f0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f  LECT DISTINCT co
1500: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
1510: 52 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20  ROM t1 .        
1520: 20 20 20 47 52 4f 55 50 20 42 59 20 62 20 48 41     GROUP BY b HA
1530: 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22  VING count(*)=2"
1540: 20 7b 20 0a 20 20 7d 0a 0a 20 20 32 31 30 31 2e   { .  }..  2101.
1550: 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 63  1  "SELECT ALL c
1560: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
1570: 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
1580: 20 62 22 20 7b 31 20 61 20 31 20 63 20 31 20 62   b" {1 a 1 c 1 b
1590: 7d 0a 20 20 32 31 30 32 2e 31 20 20 22 53 45 4c  }.  2102.1  "SEL
15a0: 45 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29  ECT ALL count(*)
15b0: 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31  , max(a) FROM t1
15c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f   .           GRO
15d0: 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
15e0: 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20 20 20  ount(*)=1" {.   
15f0: 20 31 20 61 20 31 20 63 20 31 20 62 0a 20 20 7d   1 a 1 c 1 b.  }
1600: 0a 20 20 32 31 30 32 2e 32 20 20 22 53 45 4c 45  .  2102.2  "SELE
1610: 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c  CT ALL count(*),
1620: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
1630: 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55  .           GROU
1640: 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 6f  P BY b HAVING co
1650: 75 6e 74 28 2a 29 3d 32 22 20 7b 20 0a 20 20 7d  unt(*)=2" { .  }
1660: 0a 0a 20 20 30 30 31 31 2e 31 20 20 22 53 45 4c  ..  0011.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 31 20 47 52 4f 55 50 20 42 59 20 32 22 20  E 1 GROUP BY 2" 
1690: 7b 31 20 32 20 33 7d 0a 20 20 30 30 31 32 2e 31  {1 2 3}.  0012.1
16a0: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
16b0: 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50 20  3 WHERE 0 GROUP 
16c0: 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e  BY 2 HAVING coun
16d0: 74 28 2a 29 3d 31 22 20 7b 7d 0a 20 20 30 30 31  t(*)=1" {}.  001
16e0: 32 2e 32 20 20 22 53 45 4c 45 43 54 20 31 2c 20  2.2  "SELECT 1, 
16f0: 32 2c 20 33 20 57 48 45 52 45 20 30 20 47 52 4f  2, 3 WHERE 0 GRO
1700: 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63  UP BY 2 HAVING c
1710: 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20  ount(*)>1" {}.. 
1720: 20 31 30 31 31 2e 31 20 20 22 53 45 4c 45 43 54   1011.1  "SELECT
1730: 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c 20   DISTINCT 1, 2, 
1740: 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50 20  3 WHERE 0 GROUP 
1750: 42 59 20 32 22 20 7b 7d 0a 20 20 31 30 31 32 2e  BY 2" {}.  1012.
1760: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
1770: 4e 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52  NCT 1, 2, 3 WHER
1780: 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 20 48  E 1 GROUP BY 2 H
1790: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31  AVING count(*)=1
17a0: 22 20 0a 20 20 20 20 20 20 20 20 20 20 7b 31 20  " .          {1 
17b0: 32 20 33 7d 0a 20 20 31 30 31 32 2e 32 20 20 22  2 3}.  1012.2  "
17c0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
17d0: 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20 4e 55  1, 2, 3 WHERE NU
17e0: 4c 4c 20 47 52 4f 55 50 20 42 59 20 32 20 48 41  LL GROUP BY 2 HA
17f0: 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22  VING count(*)>1"
1800: 20 7b 7d 0a 0a 20 20 32 30 31 31 2e 31 20 20 22   {}..  2011.1  "
1810: 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32 2c  SELECT ALL 1, 2,
1820: 20 33 20 57 48 45 52 45 20 31 20 47 52 4f 55 50   3 WHERE 1 GROUP
1830: 20 42 59 20 32 22 20 7b 31 20 32 20 33 7d 0a 20   BY 2" {1 2 3}. 
1840: 20 32 30 31 32 2e 31 20 20 22 53 45 4c 45 43 54   2012.1  "SELECT
1850: 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57 48 45   ALL 1, 2, 3 WHE
1860: 52 45 20 30 20 47 52 4f 55 50 20 42 59 20 32 20  RE 0 GROUP BY 2 
1870: 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d  HAVING count(*)=
1880: 31 22 20 7b 7d 0a 20 20 32 30 31 32 2e 32 20 20  1" {}.  2012.2  
1890: 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32  "SELECT ALL 1, 2
18a0: 2c 20 33 20 57 48 45 52 45 20 27 61 62 63 27 20  , 3 WHERE 'abc' 
18b0: 47 52 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e  GROUP BY 2 HAVIN
18c0: 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d  G count(*)>1" {}
18d0: 0a 0a 20 20 30 31 31 31 2e 31 20 20 22 53 45 4c  ..  0111.1  "SEL
18e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  ECT count(*), ma
18f0: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45  x(a) FROM t1 WHE
1900: 52 45 20 61 3d 27 61 27 20 47 52 4f 55 50 20 42  RE a='a' GROUP B
1910: 59 20 62 22 20 7b 31 20 61 7d 0a 20 20 30 31 31  Y b" {1 a}.  011
1920: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 63 6f 75  2.1  "SELECT cou
1930: 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52  nt(*), max(a) FR
1940: 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20 20  OM t1 .         
1950: 20 20 57 48 45 52 45 20 61 3d 27 63 27 20 47 52    WHERE a='c' GR
1960: 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
1970: 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20 63  count(*)=1" {1 c
1980: 7d 0a 20 20 30 31 31 32 2e 32 20 20 22 53 45 4c  }.  0112.2  "SEL
1990: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  ECT count(*), ma
19a0: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20  x(a) FROM t1 .  
19b0: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 30           WHERE 0
19c0: 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
19d0: 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b  NG count(*)=2" {
19e0: 20 7d 0a 20 20 31 31 31 31 2e 31 20 20 22 53 45   }.  1111.1  "SE
19f0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f  LECT DISTINCT co
1a00: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
1a10: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c 27  ROM t1 WHERE a<'
1a20: 63 27 20 47 52 4f 55 50 20 42 59 20 62 22 20 0a  c' GROUP BY b" .
1a30: 20 20 20 20 20 20 20 20 20 20 7b 31 20 61 20 31            {1 a 1
1a40: 20 62 7d 0a 20 20 31 31 31 32 2e 31 20 20 22 53   b}.  1112.1  "S
1a50: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63  ELECT DISTINCT c
1a60: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
1a70: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
1a80: 27 61 27 0a 20 20 20 20 20 20 20 20 20 20 20 47  'a'.           G
1a90: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1aa0: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
1ab0: 20 20 20 31 20 63 20 31 20 62 0a 20 20 7d 0a 20     1 c 1 b.  }. 
1ac0: 20 31 31 31 32 2e 32 20 20 22 53 45 4c 45 43 54   1112.2  "SELECT
1ad0: 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28   DISTINCT count(
1ae0: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
1af0: 74 31 20 57 48 45 52 45 20 30 0a 20 20 20 20 20  t1 WHERE 0.     
1b00: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
1b10: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
1b20: 3d 32 22 20 7b 20 0a 20 20 7d 0a 0a 20 20 32 31  =2" { .  }..  21
1b30: 31 31 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c  11.1  "SELECT AL
1b40: 4c 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28  L count(*), max(
1b50: 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  a) FROM t1 WHERE
1b60: 20 62 3e 27 6f 6e 65 27 20 47 52 4f 55 50 20 42   b>'one' GROUP B
1b70: 59 20 62 22 20 0a 20 20 20 20 20 20 20 20 20 20  Y b" .          
1b80: 7b 31 20 63 20 31 20 62 7d 0a 20 20 32 31 31 32  {1 c 1 b}.  2112
1b90: 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20  .1  "SELECT ALL 
1ba0: 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29  count(*), max(a)
1bb0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1bc0: 21 3d 27 62 27 0a 20 20 20 20 20 20 20 20 20 20  !='b'.          
1bd0: 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
1be0: 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b  NG count(*)=1" {
1bf0: 0a 20 20 20 20 31 20 61 20 31 20 63 0a 20 20 7d  .    1 a 1 c.  }
1c00: 0a 20 20 32 31 31 32 2e 32 20 20 22 53 45 4c 45  .  2112.2  "SELE
1c10: 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c  CT ALL count(*),
1c20: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
1c30: 0a 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52  .           WHER
1c40: 45 20 30 20 47 52 4f 55 50 20 42 59 20 62 20 48  E 0 GROUP BY b H
1c50: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32  AVING count(*)=2
1c60: 22 20 7b 20 7d 0a 7d 0a 0a 0a 23 20 45 56 49 44  " { }.}...# EVID
1c70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 33 37 38  ENCE-OF: R-41378
1c80: 2d 32 36 37 33 34 20 2d 2d 20 73 79 6e 74 61 78  -26734 -- syntax
1c90: 20 64 69 61 67 72 61 6d 20 72 65 73 75 6c 74 2d   diagram result-
1ca0: 63 6f 6c 75 6d 6e 0a 23 0a 64 6f 5f 73 65 6c 65  column.#.do_sele
1cb0: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
1cc0: 74 2d 30 2e 33 20 7b 0a 20 20 31 20 20 22 53 45  t-0.3 {.  1  "SE
1cd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20  LECT * FROM t1" 
1ce0: 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74  {a one b two c t
1cf0: 68 72 65 65 7d 0a 20 20 32 20 20 22 53 45 4c 45  hree}.  2  "SELE
1d00: 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 22  CT t1.* FROM t1"
1d10: 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20   {a one b two c 
1d20: 74 68 72 65 65 7d 0a 20 20 33 20 20 22 53 45 4c  three}.  3  "SEL
1d30: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1d40: 46 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62  FROM t1" {xax xb
1d50: 78 20 78 63 78 7d 0a 20 20 34 20 20 22 53 45 4c  x xcx}.  4  "SEL
1d60: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1d70: 61 6c 69 61 73 20 46 52 4f 4d 20 74 31 22 20 7b  alias FROM t1" {
1d80: 78 61 78 20 78 62 78 20 78 63 78 7d 0a 20 20 35  xax xbx xcx}.  5
1d90: 20 20 22 53 45 4c 45 43 54 20 27 78 27 7c 7c 61    "SELECT 'x'||a
1da0: 7c 7c 27 78 27 20 41 53 20 61 6c 69 61 73 20 46  ||'x' AS alias F
1db0: 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62 78  ROM t1" {xax xbx
1dc0: 20 78 63 78 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   xcx}.}..# EVIDE
1dd0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 31 32 39 2d  NCE-OF: R-43129-
1de0: 33 35 36 34 38 20 2d 2d 20 73 79 6e 74 61 78 20  35648 -- syntax 
1df0: 64 69 61 67 72 61 6d 20 6a 6f 69 6e 2d 73 6f 75  diagram join-sou
1e00: 72 63 65 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  rce.#.# EVIDENCE
1e10: 2d 4f 46 3a 20 52 2d 33 36 36 38 33 2d 33 37 34  -OF: R-36683-374
1e20: 36 30 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61  60 -- syntax dia
1e30: 67 72 61 6d 20 6a 6f 69 6e 2d 6f 70 0a 23 0a 64  gram join-op.#.d
1e40: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
1e50: 5f 73 65 6c 65 63 74 2d 30 2e 34 20 7b 0a 20 20  _select-0.4 {.  
1e60: 31 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  1  "SELECT t1.ro
1e70: 77 69 64 20 46 52 4f 4d 20 74 31 22 20 7b 31 20  wid FROM t1" {1 
1e80: 32 20 33 7d 0a 20 20 32 20 20 22 53 45 4c 45 43  2 3}.  2  "SELEC
1e90: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1ea0: 74 31 2c 74 32 22 20 7b 31 20 31 20 31 20 32 20  t1,t2" {1 1 1 2 
1eb0: 32 20 32 20 33 20 33 20 33 7d 0a 20 20 33 20 20  2 2 3 3 3}.  3  
1ec0: 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64  "SELECT t1.rowid
1ed0: 20 46 52 4f 4d 20 74 31 2c 74 32 2c 74 33 22 20   FROM t1,t2,t3" 
1ee0: 7b 31 20 31 20 31 20 31 20 31 20 31 20 32 20 32  {1 1 1 1 1 1 2 2
1ef0: 20 32 20 32 20 32 20 32 20 33 20 33 20 33 20 33   2 2 2 2 3 3 3 3
1f00: 20 33 20 33 7d 0a 0a 20 20 34 20 20 22 53 45 4c   3 3}..  4  "SEL
1f10: 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f  ECT t1.rowid FRO
1f20: 4d 20 74 31 22 20 7b 31 20 32 20 33 7d 0a 20 20  M t1" {1 2 3}.  
1f30: 35 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  5  "SELECT t1.ro
1f40: 77 69 64 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  wid FROM t1 JOIN
1f50: 20 74 32 22 20 7b 31 20 31 20 31 20 32 20 32 20   t2" {1 1 1 2 2 
1f60: 32 20 33 20 33 20 33 7d 0a 20 20 36 20 20 22 53  2 3 3 3}.  6  "S
1f70: 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46  ELECT t1.rowid F
1f80: 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 32 20 4a  ROM t1 JOIN t2 J
1f90: 4f 49 4e 20 74 33 22 20 0a 20 20 20 20 20 7b 31  OIN t3" .     {1
1fa0: 20 31 20 31 20 31 20 31 20 31 20 32 20 32 20 32   1 1 1 1 1 2 2 2
1fb0: 20 32 20 32 20 32 20 33 20 33 20 33 20 33 20 33   2 2 2 3 3 3 3 3
1fc0: 20 33 7d 0a 0a 20 20 37 20 20 22 53 45 4c 45 43   3}..  7  "SELEC
1fd0: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1fe0: 74 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t1 NATURAL JOIN 
1ff0: 74 33 22 20 7b 31 20 32 7d 0a 20 20 38 20 20 22  t3" {1 2}.  8  "
2000: 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20  SELECT t1.rowid 
2010: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
2020: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2030: 74 33 22 20 7b 31 20 32 20 33 7d 0a 20 20 39 20  t3" {1 2 3}.  9 
2040: 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69   "SELECT t1.rowi
2050: 64 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41  d FROM t1 NATURA
2060: 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 22 20  L LEFT JOIN t3" 
2070: 7b 31 20 32 20 33 7d 0a 20 20 31 30 20 22 53 45  {1 2 3}.  10 "SE
2080: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
2090: 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 49 4e  OM t1 NATURAL IN
20a0: 4e 45 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20  NER JOIN t3" {1 
20b0: 32 7d 0a 20 20 31 31 20 22 53 45 4c 45 43 54 20  2}.  11 "SELECT 
20c0: 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  t1.rowid FROM t1
20d0: 20 4e 41 54 55 52 41 4c 20 43 52 4f 53 53 20 4a   NATURAL CROSS J
20e0: 4f 49 4e 20 74 33 22 20 7b 31 20 32 7d 0a 0a 20  OIN t3" {1 2}.. 
20f0: 20 31 32 20 22 53 45 4c 45 43 54 20 74 31 2e 72   12 "SELECT t1.r
2100: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 4a 4f 49  owid FROM t1 JOI
2110: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
2120: 20 33 7d 0a 20 20 31 33 20 22 53 45 4c 45 43 54   3}.  13 "SELECT
2130: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
2140: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
2150: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
2160: 20 33 7d 0a 20 20 31 34 20 22 53 45 4c 45 43 54   3}.  14 "SELECT
2170: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
2180: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 22 20  1 LEFT JOIN t3" 
2190: 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20  {1 1 2 2 3 3}.  
21a0: 31 35 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  15 "SELECT t1.ro
21b0: 77 69 64 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45  wid FROM t1 INNE
21c0: 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20 31 20  R JOIN t3" {1 1 
21d0: 32 20 32 20 33 20 33 7d 0a 20 20 31 36 20 22 53  2 2 3 3}.  16 "S
21e0: 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46  ELECT t1.rowid F
21f0: 52 4f 4d 20 74 31 20 43 52 4f 53 53 20 4a 4f 49  ROM t1 CROSS JOI
2200: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
2210: 20 33 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   3}.}..# EVIDENC
2220: 45 2d 4f 46 3a 20 52 2d 32 38 33 30 38 2d 33 37  E-OF: R-28308-37
2230: 38 31 33 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  813 -- syntax di
2240: 61 67 72 61 6d 20 63 6f 6d 70 6f 75 6e 64 2d 6f  agram compound-o
2250: 70 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 73 65 6c  perator.#.do_sel
2260: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
2270: 63 74 2d 30 2e 35 20 7b 0a 20 20 31 20 20 22 53  ct-0.5 {.  1  "S
2280: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2290: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
22a0: 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f  LECT rowid+2 FRO
22b0: 4d 20 74 34 22 20 7b 31 20 32 20 33 20 33 20 34  M t4" {1 2 3 3 4
22c0: 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 72  }.  2  "SELECT r
22d0: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 55 4e 49  owid FROM t1 UNI
22e0: 4f 4e 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f  ON     SELECT ro
22f0: 77 69 64 2b 32 20 46 52 4f 4d 20 74 34 22 20 7b  wid+2 FROM t4" {
2300: 31 20 32 20 33 20 34 7d 0a 20 20 33 20 20 22 53  1 2 3 4}.  3  "S
2310: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2320: 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   t1 INTERSECT SE
2330: 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f  LECT rowid+2 FRO
2340: 4d 20 74 34 22 20 7b 33 7d 0a 20 20 34 20 20 22  M t4" {3}.  4  "
2350: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2360: 4d 20 74 31 20 45 58 43 45 50 54 20 20 20 20 53  M t1 EXCEPT    S
2370: 45 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52  ELECT rowid+2 FR
2380: 4f 4d 20 74 34 22 20 7b 31 20 32 7d 0a 7d 0a 0a  OM t4" {1 2}.}..
2390: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
23a0: 2d 30 36 34 38 30 2d 33 34 39 35 30 20 2d 2d 20  -06480-34950 -- 
23b0: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6f  syntax diagram o
23c0: 72 64 65 72 69 6e 67 2d 74 65 72 6d 0a 23 0a 64  rdering-term.#.d
23d0: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
23e0: 5f 73 65 6c 65 63 74 2d 30 2e 36 20 7b 0a 20 20  _select-0.6 {.  
23f0: 31 20 20 22 53 45 4c 45 43 54 20 62 7c 7c 61 20  1  "SELECT b||a 
2400: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
2410: 20 62 7c 7c 61 22 20 20 20 20 20 20 20 20 20 20   b||a"          
2420: 20 20 20 20 20 20 20 20 7b 6f 6e 65 61 20 74 68          {onea th
2430: 72 65 65 63 20 74 77 6f 62 7d 0a 20 20 32 20 20  reec twob}.  2  
2440: 22 53 45 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f  "SELECT b||a FRO
2450: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 62  M t1 ORDER BY (b
2460: 7c 7c 61 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ||a) COLLATE noc
2470: 61 73 65 22 20 7b 6f 6e 65 61 20 74 68 72 65 65  ase" {onea three
2480: 63 20 74 77 6f 62 7d 0a 20 20 33 20 20 22 53 45  c twob}.  3  "SE
2490: 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f 4d 20 74  LECT b||a FROM t
24a0: 31 20 4f 52 44 45 52 20 42 59 20 28 62 7c 7c 61  1 ORDER BY (b||a
24b0: 29 20 41 53 43 22 20 20 20 20 20 20 20 20 20 20  ) ASC"          
24c0: 20 20 7b 6f 6e 65 61 20 74 68 72 65 65 63 20 74    {onea threec t
24d0: 77 6f 62 7d 0a 20 20 34 20 20 22 53 45 4c 45 43  wob}.  4  "SELEC
24e0: 54 20 62 7c 7c 61 20 46 52 4f 4d 20 74 31 20 4f  T b||a FROM t1 O
24f0: 52 44 45 52 20 42 59 20 28 62 7c 7c 61 29 20 44  RDER BY (b||a) D
2500: 45 53 43 22 20 20 20 20 20 20 20 20 20 20 20 7b  ESC"           {
2510: 74 77 6f 62 20 74 68 72 65 65 63 20 6f 6e 65 61  twob threec onea
2520: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
2530: 4f 46 3a 20 52 2d 32 33 39 32 36 2d 33 36 36 36  OF: R-23926-3666
2540: 38 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67  8 -- syntax diag
2550: 72 61 6d 20 73 65 6c 65 63 74 2d 73 74 6d 74 0a  ram select-stmt.
2560: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
2570: 73 20 65 5f 73 65 6c 65 63 74 2d 30 2e 37 20 7b  s e_select-0.7 {
2580: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 2a 20  .  1  "SELECT * 
2590: 46 52 4f 4d 20 74 31 22 20 7b 61 20 6f 6e 65 20  FROM t1" {a one 
25a0: 62 20 74 77 6f 20 63 20 74 68 72 65 65 7d 0a 20  b two c three}. 
25b0: 20 32 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52   2  "SELECT * FR
25c0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 62  OM t1 ORDER BY b
25d0: 22 20 7b 61 20 6f 6e 65 20 63 20 74 68 72 65 65  " {a one c three
25e0: 20 62 20 74 77 6f 7d 0a 20 20 33 20 20 22 53 45   b two}.  3  "SE
25f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f  LECT * FROM t1 O
2600: 52 44 45 52 20 42 59 20 62 2c 20 61 22 20 7b 61  RDER BY b, a" {a
2610: 20 6f 6e 65 20 63 20 74 68 72 65 65 20 62 20 74   one c three b t
2620: 77 6f 7d 0a 0a 20 20 34 20 20 22 53 45 4c 45 43  wo}..  4  "SELEC
2630: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  T * FROM t1 LIMI
2640: 54 20 31 30 22 20 7b 61 20 6f 6e 65 20 62 20 74  T 10" {a one b t
2650: 77 6f 20 63 20 74 68 72 65 65 7d 0a 20 20 35 20  wo c three}.  5 
2660: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2670: 74 31 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53  t1 LIMIT 10 OFFS
2680: 45 54 20 35 22 20 7b 7d 0a 20 20 36 20 20 22 53  ET 5" {}.  6  "S
2690: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
26a0: 4c 49 4d 49 54 20 31 30 2c 20 35 22 20 7b 7d 0a  LIMIT 10, 5" {}.
26b0: 0a 20 20 37 20 20 22 53 45 4c 45 43 54 20 2a 20  .  7  "SELECT * 
26c0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
26d0: 20 61 20 4c 49 4d 49 54 20 31 30 22 20 7b 61 20   a LIMIT 10" {a 
26e0: 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72 65  one b two c thre
26f0: 65 7d 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20  e}.  8  "SELECT 
2700: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
2710: 42 59 20 62 20 4c 49 4d 49 54 20 31 30 20 4f 46  BY b LIMIT 10 OF
2720: 46 53 45 54 20 35 22 20 7b 7d 0a 20 20 39 20 20  FSET 5" {}.  9  
2730: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2740: 31 20 4f 52 44 45 52 20 42 59 20 61 2c 62 20 4c  1 ORDER BY a,b L
2750: 49 4d 49 54 20 31 30 2c 20 35 22 20 7b 7d 0a 0a  IMIT 10, 5" {}..
2760: 20 20 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20    10  "SELECT * 
2770: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
2780: 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74  LECT b, a FROM t
2790: 31 22 20 0a 20 20 20 20 20 7b 61 20 6f 6e 65 20  1" .     {a one 
27a0: 62 20 74 77 6f 20 63 20 74 68 72 65 65 20 6f 6e  b two c three on
27b0: 65 20 61 20 74 68 72 65 65 20 63 20 74 77 6f 20  e a three c two 
27c0: 62 7d 0a 20 20 31 31 20 20 22 53 45 4c 45 43 54  b}.  11  "SELECT
27d0: 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   * FROM t1 UNION
27e0: 20 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f   SELECT b, a FRO
27f0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 62 22  M t1 ORDER BY b"
2800: 20 0a 20 20 20 20 20 7b 6f 6e 65 20 61 20 74 77   .     {one a tw
2810: 6f 20 62 20 74 68 72 65 65 20 63 20 61 20 6f 6e  o b three c a on
2820: 65 20 63 20 74 68 72 65 65 20 62 20 74 77 6f 7d  e c three b two}
2830: 0a 20 20 31 32 20 20 22 53 45 4c 45 43 54 20 2a  .  12  "SELECT *
2840: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
2850: 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
2860: 74 31 20 4f 52 44 45 52 20 42 59 20 62 2c 20 61  t1 ORDER BY b, a
2870: 22 20 0a 20 20 20 20 20 7b 6f 6e 65 20 61 20 74  " .     {one a t
2880: 77 6f 20 62 20 74 68 72 65 65 20 63 20 61 20 6f  wo b three c a o
2890: 6e 65 20 63 20 74 68 72 65 65 20 62 20 74 77 6f  ne c three b two
28a0: 7d 0a 20 20 31 33 20 20 22 53 45 4c 45 43 54 20  }.  13  "SELECT 
28b0: 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  * FROM t1 UNION 
28c0: 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d  SELECT b, a FROM
28d0: 20 74 31 20 4c 49 4d 49 54 20 31 30 22 20 0a 20   t1 LIMIT 10" . 
28e0: 20 20 20 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f      {a one b two
28f0: 20 63 20 74 68 72 65 65 20 6f 6e 65 20 61 20 74   c three one a t
2900: 68 72 65 65 20 63 20 74 77 6f 20 62 7d 0a 20 20  hree c two b}.  
2910: 31 34 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  14  "SELECT * FR
2920: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
2930: 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20  CT b, a FROM t1 
2940: 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
2950: 35 22 20 0a 20 20 20 20 20 7b 74 77 6f 20 62 7d  5" .     {two b}
2960: 0a 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 2a  .  15  "SELECT *
2970: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
2980: 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
2990: 74 31 20 4c 49 4d 49 54 20 31 30 2c 20 35 22 20  t1 LIMIT 10, 5" 
29a0: 0a 20 20 20 20 20 7b 7d 0a 20 20 31 36 20 20 22  .     {}.  16  "
29b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
29c0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
29d0: 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   a FROM t1 ORDER
29e0: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 22 20   BY a LIMIT 10" 
29f0: 0a 20 20 20 20 20 7b 61 20 6f 6e 65 20 62 20 74  .     {a one b t
2a00: 77 6f 20 63 20 74 68 72 65 65 20 6f 6e 65 20 61  wo c three one a
2a10: 20 74 68 72 65 65 20 63 20 74 77 6f 20 62 7d 0a   three c two b}.
2a20: 20 20 31 37 20 20 22 53 45 4c 45 43 54 20 2a 20    17  "SELECT * 
2a30: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
2a40: 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74  LECT b, a FROM t
2a50: 31 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49 4d  1 ORDER BY b LIM
2a60: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
2a70: 0a 20 20 20 20 20 7b 62 20 74 77 6f 7d 0a 20 20  .     {b two}.  
2a80: 31 38 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  18  "SELECT * FR
2a90: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
2aa0: 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20  CT b, a FROM t1 
2ab0: 4f 52 44 45 52 20 42 59 20 61 2c 62 20 4c 49 4d  ORDER BY a,b LIM
2ac0: 49 54 20 31 30 2c 20 35 22 20 0a 20 20 20 20 20  IT 10, 5" .     
2ad0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
2b30: 20 74 65 73 74 73 20 66 6f 63 75 73 20 6f 6e 20   tests focus on 
2b40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 6a 6f 69  FROM clause (joi
2b50: 6e 29 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23  n) processing..#
2b60: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
2b70: 20 52 2d 31 36 30 37 34 2d 35 34 31 39 36 20 49   R-16074-54196 I
2b80: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b90: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  e is omitted fro
2ba0: 6d 20 61 20 73 69 6d 70 6c 65 0a 23 20 53 45 4c  m a simple.# SEL
2bb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
2bc0: 68 65 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61  hen the input da
2bd0: 74 61 20 69 73 20 69 6d 70 6c 69 63 69 74 6c 79  ta is implicitly
2be0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 7a 65   a single row ze
2bf0: 72 6f 0a 23 20 63 6f 6c 75 6d 6e 73 20 77 69 64  ro.# columns wid
2c00: 65 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  e.#.do_select_te
2c10: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 31  sts e_select-1.1
2c20: 20 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 27   {.  1 "SELECT '
2c30: 61 62 63 27 22 20 20 20 20 20 20 20 20 20 20 20  abc'"           
2c40: 20 7b 61 62 63 7d 0a 20 20 32 20 22 53 45 4c 45   {abc}.  2 "SELE
2c50: 43 54 20 27 61 62 63 27 20 57 48 45 52 45 20 4e  CT 'abc' WHERE N
2c60: 55 4c 4c 22 20 7b 7d 0a 20 20 33 20 22 53 45 4c  ULL" {}.  3 "SEL
2c70: 45 43 54 20 4e 55 4c 4c 22 20 20 20 20 20 20 20  ECT NULL"       
2c80: 20 20 20 20 20 20 7b 7b 7d 7d 0a 20 20 34 20 22        {{}}.  4 "
2c90: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 22  SELECT count(*)"
2ca0: 20 20 20 20 20 20 20 20 20 7b 31 7d 0a 20 20 35           {1}.  5
2cb0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
2cc0: 29 20 57 48 45 52 45 20 30 22 20 7b 30 7d 0a 20  ) WHERE 0" {0}. 
2cd0: 20 36 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74   6 "SELECT count
2ce0: 28 2a 29 20 57 48 45 52 45 20 31 22 20 7b 31 7d  (*) WHERE 1" {1}
2cf0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
2d00: 46 3a 20 52 2d 34 38 31 31 34 2d 33 33 32 35 35  F: R-48114-33255
2d10: 20 49 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c   If there is onl
2d20: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2d30: 20 69 6e 20 74 68 65 0a 23 20 6a 6f 69 6e 2d 73   in the.# join-s
2d40: 6f 75 72 63 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  ource following 
2d50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
2d60: 20 74 68 65 6e 20 74 68 65 20 69 6e 70 75 74 20   then the input 
2d70: 64 61 74 61 20 75 73 65 64 20 62 79 20 74 68 65  data used by the
2d80: 0a 23 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  .# SELECT statem
2d90: 65 6e 74 20 69 73 20 74 68 65 20 63 6f 6e 74 65  ent is the conte
2da0: 6e 74 73 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  nts of the named
2db0: 20 74 61 62 6c 65 2e 0a 23 0a 23 20 20 20 54 68   table..#.#   Th
2dc0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
2dd0: 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20   SELECT queries 
2de0: 73 75 67 67 65 73 74 20 74 68 61 74 20 74 68 65  suggest that the
2df0: 79 20 61 72 65 20 6f 70 65 72 61 74 69 6e 67 20  y are operating 
2e00: 6f 6e 20 74 68 65 0a 23 20 20 20 63 6f 6e 74 65  on the.#   conte
2e10: 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  nts of the table
2e20: 20 27 78 78 27 2e 0a 23 0a 64 6f 5f 65 78 65 63   'xx'..#.do_exec
2e30: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
2e40: 74 2d 31 2e 32 2e 30 20 7b 0a 20 20 43 52 45 41  t-1.2.0 {.  CREA
2e50: 54 45 20 54 41 42 4c 45 20 78 78 28 78 2c 20 79  TE TABLE xx(x, y
2e60: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2e70: 20 78 78 20 56 41 4c 55 45 53 28 27 49 69 4a 6c   xx VALUES('IiJl
2e80: 73 49 50 65 70 4d 75 41 68 55 27 2c 20 58 27 31  sIPepMuAhU', X'1
2e90: 30 42 30 30 42 38 39 37 41 31 35 42 41 41 30 32  0B00B897A15BAA02
2ea0: 45 33 46 39 38 44 43 45 38 46 32 27 29 3b 0a 20  E3F98DCE8F2');. 
2eb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20   INSERT INTO xx 
2ec0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 2d 31 36  VALUES(NULL, -16
2ed0: 2e 38 37 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  .87);.  INSERT I
2ee0: 4e 54 4f 20 78 78 20 56 41 4c 55 45 53 28 2d 31  NTO xx VALUES(-1
2ef0: 37 2e 38 39 2c 20 27 6c 69 6e 67 75 69 73 74 69  7.89, 'linguisti
2f00: 63 61 6c 6c 79 27 29 3b 0a 7d 20 7b 7d 0a 64 6f  cally');.} {}.do
2f10: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
2f20: 73 65 6c 65 63 74 2d 31 2e 32 20 7b 0a 20 20 31  select-1.2 {.  1
2f30: 20 20 22 53 45 4c 45 43 54 20 71 75 6f 74 65 28    "SELECT quote(
2f40: 78 29 2c 20 71 75 6f 74 65 28 79 29 20 46 52 4f  x), quote(y) FRO
2f50: 4d 20 78 78 22 20 7b 0a 20 20 20 20 20 27 49 69  M xx" {.     'Ii
2f60: 4a 6c 73 49 50 65 70 4d 75 41 68 55 27 20 58 27  JlsIPepMuAhU' X'
2f70: 31 30 42 30 30 42 38 39 37 41 31 35 42 41 41 30  10B00B897A15BAA0
2f80: 32 45 33 46 39 38 44 43 45 38 46 32 27 20 0a 20  2E3F98DCE8F2' . 
2f90: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
2fa0: 20 20 20 20 20 2d 31 36 2e 38 37 20 20 20 20 20       -16.87     
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 0a 20 20 20 20 20 2d 31 37 2e 38       .     -17.8
2fd0: 39 20 20 20 20 20 20 20 20 20 20 20 27 6c 69 6e  9           'lin
2fe0: 67 75 69 73 74 69 63 61 6c 6c 79 27 20 20 20 20  guistically'    
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d              .  }
3000: 0a 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 63  ..  2  "SELECT c
3010: 6f 75 6e 74 28 2a 29 2c 20 63 6f 75 6e 74 28 78  ount(*), count(x
3020: 29 2c 20 63 6f 75 6e 74 28 79 29 20 46 52 4f 4d  ), count(y) FROM
3030: 20 78 78 22 20 7b 33 20 32 20 33 7d 0a 20 20 33   xx" {3 2 3}.  3
3040: 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 78 29    "SELECT sum(x)
3050: 2c 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 78 78  , sum(y) FROM xx
3060: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3070: 7b 2d 31 37 2e 38 39 20 2d 31 36 2e 38 37 7d 0a  {-17.89 -16.87}.
3080: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
3090: 3a 20 52 2d 32 33 35 39 33 2d 31 32 34 35 36 20  : R-23593-12456 
30a0: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
30b0: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
30c0: 73 70 65 63 69 66 69 65 64 0a 23 20 61 73 20 70  specified.# as p
30d0: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2d  art of the join-
30e0: 73 6f 75 72 63 65 20 66 6f 6c 6c 6f 77 69 6e 67  source following
30f0: 20 74 68 65 20 46 52 4f 4d 20 6b 65 79 77 6f 72   the FROM keywor
3100: 64 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 63 6f  d, then the.# co
3110: 6e 74 65 6e 74 73 20 6f 66 20 65 61 63 68 20 6e  ntents of each n
3120: 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20 6a  amed table are j
3130: 6f 69 6e 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  oined into a sin
3140: 67 6c 65 20 64 61 74 61 73 65 74 20 66 6f 72 20  gle dataset for 
3150: 74 68 65 0a 23 20 73 69 6d 70 6c 65 20 53 45 4c  the.# simple SEL
3160: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
3170: 20 6f 70 65 72 61 74 65 20 6f 6e 2e 0a 23 0a 23   operate on..#.#
3180: 20 20 20 54 68 65 72 65 20 61 72 65 20 6d 6f 72     There are mor
3190: 65 20 64 65 74 61 69 6c 65 64 20 74 65 73 74 73  e detailed tests
31a0: 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
31b0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 68 61  requirements tha
31c0: 74 20 61 64 64 20 0a 23 20 20 20 6d 6f 72 65 20  t add .#   more 
31d0: 64 65 74 61 69 6c 20 74 6f 20 74 68 69 73 20 69  detail to this i
31e0: 64 65 61 2e 20 57 65 20 6a 75 73 74 20 61 64 64  dea. We just add
31f0: 20 61 20 73 69 6e 67 6c 65 20 74 65 73 74 20 74   a single test t
3200: 68 61 74 20 73 68 6f 77 73 20 74 68 61 74 0a 23  hat shows that.#
3210: 20 20 20 64 61 74 61 20 69 73 20 63 6f 6d 69 6e     data is comin
3220: 67 20 66 72 6f 6d 20 65 61 63 68 20 6f 66 20 74  g from each of t
3230: 68 65 20 74 68 72 65 65 20 74 61 62 6c 65 73 20  he three tables 
3240: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 46 52  following the FR
3250: 4f 4d 20 63 6c 61 75 73 65 0a 23 20 20 20 68 65  OM clause.#   he
3260: 72 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  re to show that 
3270: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 76  the statement, v
3280: 61 67 75 65 20 61 73 20 69 74 20 69 73 2c 20 69  ague as it is, i
3290: 73 20 6e 6f 74 20 69 6e 63 6f 72 72 65 63 74 2e  s not incorrect.
32a0: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
32b0: 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 33 20  ts e_select-1.3 
32c0: 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 2a 20  {.  1 "SELECT * 
32d0: 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 22  FROM t1, t2, t3"
32e0: 20 7b 0a 20 20 20 20 20 20 61 20 6f 6e 65 20 61   {.      a one a
32f0: 20 49 20 61 20 31 20 61 20 6f 6e 65 20 61 20 49   I a 1 a one a I
3300: 20 62 20 32 20 61 20 6f 6e 65 20 62 20 49 49 20   b 2 a one b II 
3310: 61 20 31 20 0a 20 20 20 20 20 20 61 20 6f 6e 65  a 1 .      a one
3320: 20 62 20 49 49 20 62 20 32 20 61 20 6f 6e 65 20   b II b 2 a one 
3330: 63 20 49 49 49 20 61 20 31 20 61 20 6f 6e 65 20  c III a 1 a one 
3340: 63 20 49 49 49 20 62 20 32 20 0a 20 20 20 20 20  c III b 2 .     
3350: 20 62 20 74 77 6f 20 61 20 49 20 61 20 31 20 62   b two a I a 1 b
3360: 20 74 77 6f 20 61 20 49 20 62 20 32 20 62 20 74   two a I b 2 b t
3370: 77 6f 20 62 20 49 49 20 61 20 31 20 0a 20 20 20  wo b II a 1 .   
3380: 20 20 20 62 20 74 77 6f 20 62 20 49 49 20 62 20     b two b II b 
3390: 32 20 62 20 74 77 6f 20 63 20 49 49 49 20 61 20  2 b two c III a 
33a0: 31 20 62 20 74 77 6f 20 63 20 49 49 49 20 62 20  1 b two c III b 
33b0: 32 20 0a 20 20 20 20 20 20 63 20 74 68 72 65 65  2 .      c three
33c0: 20 61 20 49 20 61 20 31 20 63 20 74 68 72 65 65   a I a 1 c three
33d0: 20 61 20 49 20 62 20 32 20 63 20 74 68 72 65 65   a I b 2 c three
33e0: 20 62 20 49 49 20 61 20 31 20 0a 20 20 20 20 20   b II a 1 .     
33f0: 20 63 20 74 68 72 65 65 20 62 20 49 49 20 62 20   c three b II b 
3400: 32 20 63 20 74 68 72 65 65 20 63 20 49 49 49 20  2 c three c III 
3410: 61 20 31 20 63 20 74 68 72 65 65 20 63 20 49 49  a 1 c three c II
3420: 49 20 62 20 32 0a 20 20 7d 0a 7d 0a 0a 23 0a 23  I b 2.  }.}..#.#
3430: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3440: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
3450: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 2a 20 2d  e_select-1.4.* -
3460: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20 64   test that the d
3470: 65 73 63 72 69 70 74 69 6f 6e 0a 23 20 6f 66 20  escription.# of 
3480: 63 61 72 74 65 73 69 61 6e 20 6a 6f 69 6e 73 20  cartesian joins 
3490: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 64 6f  in the SELECT do
34a0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 63  cumentation is c
34b0: 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 53  onsistent with S
34c0: 51 4c 69 74 65 2e 0a 23 20 49 6e 20 64 6f 69 6e  QLite..# In doin
34d0: 67 20 73 6f 2c 20 77 65 20 74 65 73 74 20 74 68  g so, we test th
34e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
34f0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 61  e requirements a
3500: 73 20 61 20 73 69 64 65 2d 65 66 66 65 63 74 3a  s a side-effect:
3510: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3520: 3a 20 52 2d 34 36 31 32 32 2d 31 34 39 33 30 20  : R-46122-14930 
3530: 49 66 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 20 69  If the join-op i
3540: 73 20 22 43 52 4f 53 53 20 4a 4f 49 4e 22 2c 20  s "CROSS JOIN", 
3550: 22 49 4e 4e 45 52 0a 23 20 4a 4f 49 4e 22 2c 20  "INNER.# JOIN", 
3560: 22 4a 4f 49 4e 22 20 6f 72 20 61 20 63 6f 6d 6d  "JOIN" or a comm
3570: 61 20 28 22 2c 22 29 20 61 6e 64 20 74 68 65 72  a (",") and ther
3580: 65 20 69 73 20 6e 6f 20 4f 4e 20 6f 72 20 55 53  e is no ON or US
3590: 49 4e 47 20 63 6c 61 75 73 65 2c 0a 23 20 74 68  ING clause,.# th
35a0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
35b0: 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 73 69 6d   the join is sim
35c0: 70 6c 79 20 74 68 65 20 63 61 72 74 65 73 69 61  ply the cartesia
35d0: 6e 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  n product of the
35e0: 0a 23 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  .# left and righ
35f0: 74 2d 68 61 6e 64 20 64 61 74 61 73 65 74 73 2e  t-hand datasets.
3600: 0a 23 0a 23 20 20 20 20 54 68 65 20 74 65 73 74  .#.#    The test
3610: 73 20 61 72 65 20 62 75 69 6c 74 20 6f 6e 20 74  s are built on t
3620: 68 69 73 20 61 73 73 65 72 74 69 6f 6e 2e 20 52  his assertion. R
3630: 65 61 6c 6c 79 2c 20 74 68 65 79 20 74 65 73 74  eally, they test
3640: 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
3650: 0a 23 20 20 20 20 6f 66 20 61 20 43 52 4f 53 53  .#    of a CROSS
3660: 20 4a 4f 49 4e 2c 20 4a 4f 49 4e 2c 20 49 4e 4e   JOIN, JOIN, INN
3670: 45 52 20 4a 4f 49 4e 20 6f 72 20 22 2c 22 20 6a  ER JOIN or "," j
3680: 6f 69 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20  oin matches the 
3690: 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 0a  expected result.
36a0: 23 20 20 20 20 6f 66 20 63 61 6c 63 75 6c 61 74  #    of calculat
36b0: 69 6e 67 20 74 68 65 20 63 61 72 74 65 73 69 61  ing the cartesia
36c0: 6e 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  n product of the
36d0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 2d   left and right-
36e0: 68 61 6e 64 20 64 61 74 61 73 65 74 73 2e 20 0a  hand datasets. .
36f0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
3700: 20 52 2d 34 36 32 35 36 2d 35 37 32 34 33 20 54   R-46256-57243 T
3710: 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
3720: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
3730: 65 20 22 49 4e 4e 45 52 0a 23 20 4a 4f 49 4e 22  e "INNER.# JOIN"
3740: 2c 20 22 4a 4f 49 4e 22 20 61 6e 64 20 22 2c 22  , "JOIN" and ","
3750: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 2e   join operators.
3760: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3770: 3a 20 52 2d 30 37 35 34 34 2d 32 34 31 35 35 20  : R-07544-24155 
3780: 54 68 65 20 22 43 52 4f 53 53 20 4a 4f 49 4e 22  The "CROSS JOIN"
3790: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 70   join operator p
37a0: 72 6f 64 75 63 65 73 20 74 68 65 0a 23 20 73 61  roduces the.# sa
37b0: 6d 65 20 64 61 74 61 20 61 73 20 74 68 65 20 22  me data as the "
37c0: 49 4e 4e 45 52 20 4a 4f 49 4e 22 2c 20 22 4a 4f  INNER JOIN", "JO
37d0: 49 4e 22 20 61 6e 64 20 22 2c 22 20 6f 70 65 72  IN" and "," oper
37e0: 61 74 6f 72 73 0a 23 0a 23 20 20 20 20 41 6c 6c  ators.#.#    All
37f0: 20 74 65 73 74 73 20 61 72 65 20 72 75 6e 20 34   tests are run 4
3800: 20 74 69 6d 65 73 2c 20 77 69 74 68 20 74 68 65   times, with the
3810: 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
3820: 20 69 6e 20 65 61 63 68 20 72 75 6e 20 62 65 69   in each run bei
3830: 6e 67 0a 23 20 20 20 20 77 68 69 63 68 20 6f 66  ng.#    which of
3840: 20 74 68 65 20 34 20 65 71 75 69 76 61 6c 65 6e   the 4 equivalen
3850: 74 20 63 61 72 74 65 73 69 61 6e 20 70 72 6f 64  t cartesian prod
3860: 75 63 74 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  uct join operato
3870: 72 73 20 61 72 65 20 75 73 65 64 2e 0a 23 20 20  rs are used..#  
3880: 20 20 53 69 6e 63 65 20 74 68 65 20 6f 75 74 70    Since the outp
3890: 75 74 20 64 61 74 61 20 69 73 20 74 68 65 20 73  ut data is the s
38a0: 61 6d 65 20 69 6e 20 61 6c 6c 20 63 61 73 65 73  ame in all cases
38b0: 2c 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  , we consider th
38c0: 61 74 20 74 68 69 73 0a 23 20 20 20 20 71 75 61  at this.#    qua
38d0: 6c 69 66 69 65 73 20 61 73 20 74 65 73 74 69 6e  lifies as testin
38e0: 67 20 74 68 65 20 74 77 6f 20 73 74 61 74 65 6d  g the two statem
38f0: 65 6e 74 73 20 61 62 6f 76 65 2e 0a 23 0a 64 6f  ents above..#.do
3900: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3910: 73 65 6c 65 63 74 2d 31 2e 34 2e 30 20 7b 0a 20  select-1.4.0 {. 
3920: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
3930: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
3940: 20 54 41 42 4c 45 20 78 32 28 63 2c 20 64 2c 20   TABLE x2(c, d, 
3950: 65 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  e);.  CREATE TAB
3960: 4c 45 20 78 33 28 66 2c 20 67 2c 20 68 2c 20 69  LE x3(f, g, h, i
3970: 29 3b 0a 0a 20 20 2d 2d 20 78 31 3a 20 33 20 72  );..  -- x1: 3 r
3980: 6f 77 73 2c 20 32 20 63 6f 6c 75 6d 6e 73 0a 20  ows, 2 columns. 
3990: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
39a0: 56 41 4c 55 45 53 28 32 34 2c 20 27 63 6f 6e 76  VALUES(24, 'conv
39b0: 65 72 67 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45  erging');.  INSE
39c0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
39d0: 53 28 4e 55 4c 4c 2c 20 58 27 43 42 37 31 27 29  S(NULL, X'CB71')
39e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
39f0: 78 31 20 56 41 4c 55 45 53 28 27 62 6c 6f 6e 64  x1 VALUES('blond
3a00: 73 27 2c 20 27 70 72 6f 70 72 69 65 74 61 72 79  s', 'proprietary
3a10: 27 29 3b 0a 0a 20 20 2d 2d 20 78 32 3a 20 32 20  ');..  -- x2: 2 
3a20: 72 6f 77 73 2c 20 33 20 63 6f 6c 75 6d 6e 73 0a  rows, 3 columns.
3a30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
3a40: 20 56 41 4c 55 45 53 28 2d 36 30 2e 30 36 2c 20   VALUES(-60.06, 
3a50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  NULL, NULL);.  I
3a60: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
3a70: 4c 55 45 53 28 2d 35 38 2c 20 4e 55 4c 4c 2c 20  LUES(-58, NULL, 
3a80: 31 2e 32 31 29 3b 0a 0a 20 20 2d 2d 20 78 33 3a  1.21);..  -- x3:
3a90: 20 35 20 72 6f 77 73 2c 20 34 20 63 6f 6c 75 6d   5 rows, 4 colum
3aa0: 6e 73 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ns.  INSERT INTO
3ab0: 20 78 33 20 56 41 4c 55 45 53 28 2d 33 39 2e 32   x3 VALUES(-39.2
3ac0: 34 2c 20 4e 55 4c 4c 2c 20 27 65 6e 63 6f 6d 70  4, NULL, 'encomp
3ad0: 61 73 73 27 2c 20 2d 31 29 3b 0a 20 20 49 4e 53  ass', -1);.  INS
3ae0: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
3af0: 45 53 28 27 70 72 65 73 65 6e 74 69 6e 67 27 2c  ES('presenting',
3b00: 20 35 31 2c 20 27 72 65 66 6f 72 6d 61 74 69 6f   51, 'reformatio
3b10: 6e 27 2c 20 27 64 69 67 6e 69 66 69 65 64 27 29  n', 'dignified')
3b20: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3b30: 78 33 20 56 41 4c 55 45 53 28 27 63 6f 6e 64 75  x3 VALUES('condu
3b40: 63 74 69 6e 67 27 2c 20 2d 38 37 2e 32 34 2c 20  cting', -87.24, 
3b50: 33 37 2e 35 36 2c 20 4e 55 4c 4c 29 3b 0a 20 20  37.56, NULL);.  
3b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 33 20 56  INSERT INTO x3 V
3b70: 41 4c 55 45 53 28 27 63 6f 6c 64 65 73 74 27 2c  ALUES('coldest',
3b80: 20 2d 39 36 2c 20 27 64 72 61 6d 61 74 69 73 74   -96, 'dramatist
3b90: 73 27 2c 20 38 32 2e 33 29 3b 0a 20 20 49 4e 53  s', 82.3);.  INS
3ba0: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
3bb0: 45 53 28 27 61 6c 65 72 74 69 6e 67 27 2c 20 4e  ES('alerting', N
3bc0: 55 4c 4c 2c 20 2d 39 33 2e 37 39 2c 20 4e 55 4c  ULL, -93.79, NUL
3bd0: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
3be0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 30 38 39  ENCE-OF: R-59089
3bf0: 2d 32 35 38 32 38 20 54 68 65 20 63 6f 6c 75 6d  -25828 The colum
3c00: 6e 73 20 6f 66 20 74 68 65 20 63 61 72 74 65 73  ns of the cartes
3c10: 69 61 6e 20 70 72 6f 64 75 63 74 0a 23 20 64 61  ian product.# da
3c20: 74 61 73 65 74 20 61 72 65 2c 20 69 6e 20 6f 72  taset are, in or
3c30: 64 65 72 2c 20 61 6c 6c 20 74 68 65 20 63 6f 6c  der, all the col
3c40: 75 6d 6e 73 20 6f 66 20 74 68 65 20 6c 65 66 74  umns of the left
3c50: 2d 68 61 6e 64 20 64 61 74 61 73 65 74 0a 23 20  -hand dataset.# 
3c60: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6c 6c 20  followed by all 
3c70: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
3c80: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61  he right-hand da
3c90: 74 61 73 65 74 2e 0a 23 0a 64 6f 5f 6a 6f 69 6e  taset..#.do_join
3ca0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3cb0: 2e 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  .4.1.1 {.  SELEC
3cc0: 54 20 2a 20 46 52 4f 4d 20 78 31 20 25 4a 4f 49  T * FROM x1 %JOI
3cd0: 4e 25 20 78 32 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x2 LIMIT 1.} 
3ce0: 5b 63 6f 6e 63 61 74 20 7b 32 34 20 63 6f 6e 76  [concat {24 conv
3cf0: 65 72 67 69 6e 67 7d 20 7b 2d 36 30 2e 30 36 20  erging} {-60.06 
3d00: 7b 7d 20 7b 7d 7d 5d 0a 0a 64 6f 5f 6a 6f 69 6e  {} {}}]..do_join
3d10: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3d20: 2e 34 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  .4.1.2 {.  SELEC
3d30: 54 20 2a 20 46 52 4f 4d 20 78 32 20 25 4a 4f 49  T * FROM x2 %JOI
3d40: 4e 25 20 78 31 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x1 LIMIT 1.} 
3d50: 5b 63 6f 6e 63 61 74 20 7b 2d 36 30 2e 30 36 20  [concat {-60.06 
3d60: 7b 7d 20 7b 7d 7d 20 7b 32 34 20 63 6f 6e 76 65  {} {}} {24 conve
3d70: 72 67 69 6e 67 7d 5d 0a 0a 64 6f 5f 6a 6f 69 6e  rging}]..do_join
3d80: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3d90: 2e 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  .4.1.3 {.  SELEC
3da0: 54 20 2a 20 46 52 4f 4d 20 78 33 20 25 4a 4f 49  T * FROM x3 %JOI
3db0: 4e 25 20 78 32 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x2 LIMIT 1.} 
3dc0: 5b 63 6f 6e 63 61 74 20 7b 2d 33 39 2e 32 34 20  [concat {-39.24 
3dd0: 7b 7d 20 65 6e 63 6f 6d 70 61 73 73 20 2d 31 7d  {} encompass -1}
3de0: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 5d   {-60.06 {} {}}]
3df0: 0a 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65  ..do_join_test e
3e00: 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 34 20  _select-1.4.1.4 
3e10: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3e20: 4d 20 78 32 20 25 4a 4f 49 4e 25 20 78 33 20 4c  M x2 %JOIN% x3 L
3e30: 49 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74  IMIT 1.} [concat
3e40: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 20   {-60.06 {} {}} 
3e50: 7b 2d 33 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d  {-39.24 {} encom
3e60: 70 61 73 73 20 2d 31 7d 5d 0a 0a 23 20 45 56 49  pass -1}]..# EVI
3e70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 34 31  DENCE-OF: R-4441
3e80: 34 2d 35 34 37 31 30 20 54 68 65 72 65 20 69 73  4-54710 There is
3e90: 20 61 20 72 6f 77 20 69 6e 20 74 68 65 20 63 61   a row in the ca
3ea0: 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74 0a  rtesian product.
3eb0: 23 20 64 61 74 61 73 65 74 20 66 6f 72 6d 65 64  # dataset formed
3ec0: 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 65 61   by combining ea
3ed0: 63 68 20 75 6e 69 71 75 65 20 63 6f 6d 62 69 6e  ch unique combin
3ee0: 61 74 69 6f 6e 20 6f 66 20 61 20 72 6f 77 20 66  ation of a row f
3ef0: 72 6f 6d 20 74 68 65 0a 23 20 6c 65 66 74 2d 68  rom the.# left-h
3f00: 61 6e 64 20 61 6e 64 20 72 69 67 68 74 2d 68 61  and and right-ha
3f10: 6e 64 20 64 61 74 61 73 65 74 73 2e 0a 23 0a 64  nd datasets..#.d
3f20: 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65  o_join_test e_se
3f30: 6c 65 63 74 2d 31 2e 34 2e 32 2e 31 20 7b 0a 20  lect-1.4.2.1 {. 
3f40: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
3f50: 32 20 25 4a 4f 49 4e 25 20 78 33 0a 7d 20 5b 6c  2 %JOIN% x3.} [l
3f60: 69 73 74 20 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d  ist -60.06 {} {}
3f70: 20 20 20 20 20 20 2d 33 39 2e 32 34 20 7b 7d 20        -39.24 {} 
3f80: 65 6e 63 6f 6d 70 61 73 73 20 2d 31 20 20 20 20  encompass -1    
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3fa0: 20 20 20 20 20 20 20 2d 36 30 2e 30 36 20 7b 7d         -60.06 {}
3fb0: 20 7b 7d 20 20 20 20 20 20 70 72 65 73 65 6e 74   {}      present
3fc0: 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74 69  ing 51 reformati
3fd0: 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20 20  on dignified    
3fe0: 5c 0a 20 20 20 20 20 20 20 20 2d 36 30 2e 30 36  \.        -60.06
3ff0: 20 7b 7d 20 7b 7d 20 20 20 20 20 20 63 6f 6e 64   {} {}      cond
4000: 75 63 74 69 6e 67 20 2d 38 37 2e 32 34 20 33 37  ucting -87.24 37
4010: 2e 35 36 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .56 {}          
4020: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 36 30     \.        -60
4030: 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20 20 20 63  .06 {} {}      c
4040: 6f 6c 64 65 73 74 20 2d 39 36 20 64 72 61 6d 61  oldest -96 drama
4050: 74 69 73 74 73 20 38 32 2e 33 20 20 20 20 20 20  tists 82.3      
4060: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
4070: 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20  -60.06 {} {}    
4080: 20 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39    alerting {} -9
4090: 33 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20  3.79 {}         
40a0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
40b0: 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32 31 20 20     -58 {} 1.21  
40c0: 20 20 20 20 20 2d 33 39 2e 32 34 20 7b 7d 20 65       -39.24 {} e
40d0: 6e 63 6f 6d 70 61 73 73 20 2d 31 20 20 20 20 20  ncompass -1     
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
40f0: 20 20 20 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32        -58 {} 1.2
4100: 31 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 69  1       presenti
4110: 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74 69 6f  ng 51 reformatio
4120: 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20 20 5c  n dignified    \
4130: 0a 20 20 20 20 20 20 20 20 2d 35 38 20 7b 7d 20  .        -58 {} 
4140: 31 2e 32 31 20 20 20 20 20 20 20 63 6f 6e 64 75  1.21       condu
4150: 63 74 69 6e 67 20 2d 38 37 2e 32 34 20 33 37 2e  cting -87.24 37.
4160: 35 36 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20  56 {}           
4170: 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 35 38 20    \.        -58 
4180: 7b 7d 20 31 2e 32 31 20 20 20 20 20 20 20 63 6f  {} 1.21       co
4190: 6c 64 65 73 74 20 2d 39 36 20 64 72 61 6d 61 74  ldest -96 dramat
41a0: 69 73 74 73 20 38 32 2e 33 20 20 20 20 20 20 20  ists 82.3       
41b0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d       \.        -
41c0: 35 38 20 7b 7d 20 31 2e 32 31 20 20 20 20 20 20  58 {} 1.21      
41d0: 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39 33   alerting {} -93
41e0: 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .79 {}          
41f0: 20 20 20 20 20 20 20 20 5c 0a 5d 0a 23 20 54 4f          \.].# TO
4200: 44 4f 3a 20 43 6f 6d 65 20 62 61 63 6b 20 61 6e  DO: Come back an
4210: 64 20 61 64 64 20 61 20 66 65 77 20 6d 6f 72 65  d add a few more
4220: 20 6c 69 6b 65 20 74 68 65 20 61 62 6f 76 65 2e   like the above.
4230: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
4240: 20 52 2d 32 30 36 35 39 2d 34 33 32 36 37 20 49   R-20659-43267 I
4250: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
4260: 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  f the left-hand 
4270: 64 61 74 61 73 65 74 0a 23 20 63 6f 6e 73 69 73  dataset.# consis
4280: 74 73 20 6f 66 20 4e 6c 68 73 20 72 6f 77 73 20  ts of Nlhs rows 
4290: 6f 66 20 4d 6c 68 73 20 63 6f 6c 75 6d 6e 73 2c  of Mlhs columns,
42a0: 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 2d 68   and the right-h
42b0: 61 6e 64 20 64 61 74 61 73 65 74 20 6f 66 0a 23  and dataset of.#
42c0: 20 4e 72 68 73 20 72 6f 77 73 20 6f 66 20 4d 72   Nrhs rows of Mr
42d0: 68 73 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  hs columns, then
42e0: 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20 70   the cartesian p
42f0: 72 6f 64 75 63 74 20 69 73 20 61 20 64 61 74 61  roduct is a data
4300: 73 65 74 20 6f 66 0a 23 20 4e 6c 68 73 2e 4e 72  set of.# Nlhs.Nr
4310: 68 73 20 72 6f 77 73 2c 20 65 61 63 68 20 63 6f  hs rows, each co
4320: 6e 74 61 69 6e 69 6e 67 20 4d 6c 68 73 2b 4d 72  ntaining Mlhs+Mr
4330: 68 73 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20  hs columns..#.# 
4340: 78 31 2c 20 78 32 20 20 20 20 28 4e 6c 68 73 3d  x1, x2    (Nlhs=
4350: 33 2c 20 4e 72 68 73 3d 32 29 20 20 20 28 4d 6c  3, Nrhs=2)   (Ml
4360: 68 73 3d 32 2c 20 4d 72 68 73 3d 33 29 0a 64 6f  hs=2, Mrhs=3).do
4370: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
4380: 65 63 74 2d 31 2e 34 2e 33 2e 31 20 7b 20 0a 20  ect-1.4.3.1 { . 
4390: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
43a0: 20 46 52 4f 4d 20 78 31 20 25 4a 4f 49 4e 25 20   FROM x1 %JOIN% 
43b0: 78 32 20 0a 7d 20 5b 65 78 70 72 20 33 2a 32 5d  x2 .} [expr 3*2]
43c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  .do_test e_selec
43d0: 74 2d 31 2e 34 2e 33 2e 32 20 7b 20 0a 20 20 65  t-1.4.3.2 { .  e
43e0: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65  xpr {[llength [e
43f0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
4400: 20 46 52 4f 4d 20 78 31 2c 20 78 32 7d 5d 5d 20   FROM x1, x2}]] 
4410: 2f 20 36 7d 0a 7d 20 5b 65 78 70 72 20 32 2b 33  / 6}.} [expr 2+3
4420: 5d 0a 0a 23 20 78 32 2c 20 78 33 20 20 20 20 28  ]..# x2, x3    (
4430: 4e 6c 68 73 3d 32 2c 20 4e 72 68 73 3d 35 29 20  Nlhs=2, Nrhs=5) 
4440: 20 20 28 4d 6c 68 73 3d 33 2c 20 4d 72 68 73 3d    (Mlhs=3, Mrhs=
4450: 34 29 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20  4).do_join_test 
4460: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 33 2e 33  e_select-1.4.3.3
4470: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 63 6f 75   { .  SELECT cou
4480: 6e 74 28 2a 29 20 46 52 4f 4d 20 78 32 20 25 4a  nt(*) FROM x2 %J
4490: 4f 49 4e 25 20 78 33 20 0a 7d 20 5b 65 78 70 72  OIN% x3 .} [expr
44a0: 20 32 2a 35 5d 0a 64 6f 5f 74 65 73 74 20 65 5f   2*5].do_test e_
44b0: 73 65 6c 65 63 74 2d 31 2e 34 2e 33 2e 34 20 7b  select-1.4.3.4 {
44c0: 20 0a 20 20 65 78 70 72 20 7b 5b 6c 6c 65 6e 67   .  expr {[lleng
44d0: 74 68 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  th [execsql {SEL
44e0: 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 4a 4f  ECT * FROM x2 JO
44f0: 49 4e 20 78 33 7d 5d 5d 20 2f 20 31 30 7d 0a 7d  IN x3}]] / 10}.}
4500: 20 5b 65 78 70 72 20 33 2b 34 5d 0a 0a 23 20 78   [expr 3+4]..# x
4510: 33 2c 20 78 31 20 20 20 20 28 4e 6c 68 73 3d 35  3, x1    (Nlhs=5
4520: 2c 20 4e 72 68 73 3d 33 29 20 20 20 28 4d 6c 68  , Nrhs=3)   (Mlh
4530: 73 3d 34 2c 20 4d 72 68 73 3d 32 29 0a 64 6f 5f  s=4, Mrhs=2).do_
4540: 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65  join_test e_sele
4550: 63 74 2d 31 2e 34 2e 33 2e 35 20 7b 20 0a 20 20  ct-1.4.3.5 { .  
4560: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4570: 46 52 4f 4d 20 78 33 20 25 4a 4f 49 4e 25 20 78  FROM x3 %JOIN% x
4580: 31 20 0a 7d 20 5b 65 78 70 72 20 35 2a 33 5d 0a  1 .} [expr 5*3].
4590: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
45a0: 2d 31 2e 34 2e 33 2e 36 20 7b 20 0a 20 20 65 78  -1.4.3.6 { .  ex
45b0: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65 78  pr {[llength [ex
45c0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
45d0: 46 52 4f 4d 20 78 33 20 43 52 4f 53 53 20 4a 4f  FROM x3 CROSS JO
45e0: 49 4e 20 78 31 7d 5d 5d 20 2f 20 31 35 7d 0a 7d  IN x1}]] / 15}.}
45f0: 20 5b 65 78 70 72 20 34 2b 32 5d 0a 0a 23 20 78   [expr 4+2]..# x
4600: 33 2c 20 78 33 20 20 20 20 28 4e 6c 68 73 3d 35  3, x3    (Nlhs=5
4610: 2c 20 4e 72 68 73 3d 35 29 20 20 20 28 4d 6c 68  , Nrhs=5)   (Mlh
4620: 73 3d 34 2c 20 4d 72 68 73 3d 34 29 0a 64 6f 5f  s=4, Mrhs=4).do_
4630: 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65  join_test e_sele
4640: 63 74 2d 31 2e 34 2e 33 2e 37 20 7b 20 0a 20 20  ct-1.4.3.7 { .  
4650: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4660: 46 52 4f 4d 20 78 33 20 25 4a 4f 49 4e 25 20 78  FROM x3 %JOIN% x
4670: 33 20 0a 7d 20 5b 65 78 70 72 20 35 2a 35 5d 0a  3 .} [expr 5*5].
4680: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
4690: 2d 31 2e 34 2e 33 2e 38 20 7b 20 0a 20 20 65 78  -1.4.3.8 { .  ex
46a0: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65 78  pr {[llength [ex
46b0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
46c0: 46 52 4f 4d 20 78 33 20 49 4e 4e 45 52 20 4a 4f  FROM x3 INNER JO
46d0: 49 4e 20 78 33 20 41 53 20 78 34 7d 5d 5d 20 2f  IN x3 AS x4}]] /
46e0: 20 32 35 7d 0a 7d 20 5b 65 78 70 72 20 34 2b 34   25}.} [expr 4+4
46f0: 5d 0a 0a 23 20 53 6f 6d 65 20 65 78 74 72 61 20  ]..# Some extra 
4700: 63 61 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63  cartesian produc
4710: 74 20 74 65 73 74 73 20 75 73 69 6e 67 20 74 61  t tests using ta
4720: 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 2e 0a  bles t1 and t2..
4730: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
4740: 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 34  t e_select-1.4.4
4750: 2e 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .1 { SELECT * FR
4760: 4f 4d 20 74 31 2c 20 74 32 20 7d 20 24 74 31 5f  OM t1, t2 } $t1_
4770: 63 72 6f 73 73 5f 74 32 0a 64 6f 5f 65 78 65 63  cross_t2.do_exec
4780: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
4790: 74 2d 31 2e 34 2e 34 2e 32 20 7b 20 53 45 4c 45  t-1.4.4.2 { SELE
47a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 41 53 20  CT * FROM t1 AS 
47b0: 78 2c 20 74 31 20 41 53 20 79 7d 20 24 74 31 5f  x, t1 AS y} $t1_
47c0: 63 72 6f 73 73 5f 74 31 0a 0a 64 6f 5f 73 65 6c  cross_t1..do_sel
47d0: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
47e0: 63 74 2d 31 2e 34 2e 35 20 5b 6c 69 73 74 20 20  ct-1.4.5 [list  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 5c 0a 20 20 20 20 31 20 7b 20 53 45 4c 45 43   \.    1 { SELEC
4820: 54 20 2a 20 46 52 4f 4d 20 74 31 20 43 52 4f 53  T * FROM t1 CROS
4830: 53 20 4a 4f 49 4e 20 74 32 20 7d 20 20 20 20 20  S JOIN t2 }     
4840: 20 20 20 20 20 20 24 74 31 5f 63 72 6f 73 73 5f        $t1_cross_
4850: 74 32 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20  t2        \.    
4860: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
4870: 4d 20 74 31 20 41 53 20 79 20 43 52 4f 53 53 20  M t1 AS y CROSS 
4880: 4a 4f 49 4e 20 74 31 20 41 53 20 78 20 7d 20 24  JOIN t1 AS x } $
4890: 74 31 5f 63 72 6f 73 73 5f 74 31 20 20 20 20 20  t1_cross_t1     
48a0: 20 20 20 5c 0a 20 20 20 20 33 20 7b 20 53 45 4c     \.    3 { SEL
48b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e  ECT * FROM t1 IN
48c0: 4e 45 52 20 4a 4f 49 4e 20 74 32 20 7d 20 20 20  NER JOIN t2 }   
48d0: 20 20 20 20 20 20 20 20 24 74 31 5f 63 72 6f 73          $t1_cros
48e0: 73 5f 74 32 20 20 20 20 20 20 20 20 5c 0a 20 20  s_t2        \.  
48f0: 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    4 { SELECT * F
4900: 52 4f 4d 20 74 31 20 41 53 20 79 20 49 4e 4e 45  ROM t1 AS y INNE
4910: 52 20 4a 4f 49 4e 20 74 31 20 41 53 20 78 20 7d  R JOIN t1 AS x }
4920: 20 24 74 31 5f 63 72 6f 73 73 5f 74 31 20 20 20   $t1_cross_t1   
4930: 20 20 20 20 20 5c 0a 5d 0a 0a 0a 23 20 45 56 49       \.]...# EVI
4940: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 37  DENCE-OF: R-2277
4950: 35 2d 35 36 34 39 36 20 49 66 20 74 68 65 72 65  5-56496 If there
4960: 20 69 73 20 61 6e 20 4f 4e 20 63 6c 61 75 73 65   is an ON clause
4970: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
4980: 0a 23 20 74 68 65 20 4f 4e 20 65 78 70 72 65 73  .# the ON expres
4990: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
49a0: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  d for each row o
49b0: 66 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20  f the cartesian 
49c0: 70 72 6f 64 75 63 74 0a 23 20 61 73 20 61 20 62  product.# as a b
49d0: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
49e0: 6e 2e 20 41 6c 6c 20 72 6f 77 73 20 66 6f 72 20  n. All rows for 
49f0: 77 68 69 63 68 20 74 68 65 20 65 78 70 72 65 73  which the expres
4a00: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 0a 23  sion evaluates.#
4a10: 20 74 6f 20 66 61 6c 73 65 20 61 72 65 20 65 78   to false are ex
4a20: 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
4a30: 64 61 74 61 73 65 74 2e 0a 23 0a 66 6f 72 65 61  dataset..#.forea
4a40: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65  ch {tn select re
4a50: 73 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  s} [list        
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 20 5c 0a 20 20 20 20 31 20 7b 20        \.    1 { 
4a90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4aa0: 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 31   %JOIN% t2 ON (1
4ab0: 29 20 7d 20 20 20 20 20 20 20 24 74 31 5f 63 72  ) }       $t1_cr
4ac0: 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20 20 20  oss_t2          
4ad0: 20 20 20 5c 0a 20 20 20 20 32 20 7b 20 53 45 4c     \.    2 { SEL
4ae0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a  ECT * FROM t1 %J
4af0: 4f 49 4e 25 20 74 32 20 4f 4e 20 28 30 29 20 7d  OIN% t2 ON (0) }
4b00: 20 20 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20         [list]   
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 5c 0a 20 20 20 20 33 20 7b 20 53 45 4c 45 43 54  \.    3 { SELECT
4b30: 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e   * FROM t1 %JOIN
4b40: 25 20 74 32 20 4f 4e 20 28 4e 55 4c 4c 29 20 7d  % t2 ON (NULL) }
4b50: 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20      [list]      
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4b70: 20 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20     4 { SELECT * 
4b80: 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74  FROM t1 %JOIN% t
4b90: 32 20 4f 4e 20 28 27 61 62 63 27 29 20 7d 20 20  2 ON ('abc') }  
4ba0: 20 5b 6c 69 73 74 5d 20 20 20 20 20 20 20 20 20   [list]         
4bb0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
4bc0: 35 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  5 { SELECT * FRO
4bd0: 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f  M t1 %JOIN% t2 O
4be0: 4e 20 28 27 31 61 62 27 29 20 7d 20 20 20 24 74  N ('1ab') }   $t
4bf0: 31 5f 63 72 6f 73 73 5f 74 32 20 20 20 20 20 20  1_cross_t2      
4c00: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 36 20 7b         \.    6 {
4c10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4c20: 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28  1 %JOIN% t2 ON (
4c30: 30 2e 39 29 20 7d 20 20 20 20 20 24 74 31 5f 63  0.9) }     $t1_c
4c40: 72 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20 20  ross_t2         
4c50: 20 20 20 20 5c 0a 20 20 20 20 37 20 7b 20 53 45      \.    7 { SE
4c60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25  LECT * FROM t1 %
4c70: 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 27 30 2e  JOIN% t2 ON ('0.
4c80: 39 27 29 20 7d 20 20 20 24 74 31 5f 63 72 6f 73  9') }   $t1_cros
4c90: 73 5f 74 32 20 20 20 20 20 20 20 20 20 20 20 20  s_t2            
4ca0: 20 5c 0a 20 20 20 20 38 20 7b 20 53 45 4c 45 43   \.    8 { SELEC
4cb0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49  T * FROM t1 %JOI
4cc0: 4e 25 20 74 32 20 4f 4e 20 28 30 2e 30 29 20 7d  N% t2 ON (0.0) }
4cd0: 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20       [list]     
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
4d40: 20 39 20 7b 20 53 45 4c 45 43 54 20 74 31 2e 62   9 { SELECT t1.b
4d50: 2c 20 74 32 2e 62 20 46 52 4f 4d 20 74 31 20 25  , t2.b FROM t1 %
4d60: 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e  JOIN% t2 ON (t1.
4d70: 61 20 3d 20 74 32 2e 61 29 20 7d 20 20 20 20 20  a = t2.a) }     
4d80: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
4d90: 7b 6f 6e 65 20 49 20 74 77 6f 20 49 49 20 74 68  {one I two II th
4da0: 72 65 65 20 49 49 49 7d 20 20 20 20 20 20 20 20  ree III}        
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 5c 0a 20 20 20 31 30 20 7b 20 53       \.   10 { S
4de0: 45 4c 45 43 54 20 74 31 2e 62 2c 20 74 32 2e 62  ELECT t1.b, t2.b
4df0: 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20   FROM t1 %JOIN% 
4e00: 74 32 20 4f 4e 20 28 74 31 2e 61 20 3d 20 27 61  t2 ON (t1.a = 'a
4e10: 27 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  ') }            
4e20: 20 20 5c 0a 20 20 20 20 20 20 7b 6f 6e 65 20 49    \.      {one I
4e30: 20 6f 6e 65 20 49 49 20 6f 6e 65 20 49 49 49 7d   one II one III}
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4e70: 0a 20 20 20 31 31 20 7b 20 53 45 4c 45 43 54 20  .   11 { SELECT 
4e80: 74 31 2e 62 2c 20 74 32 2e 62 20 0a 20 20 20 20  t1.b, t2.b .    
4e90: 20 20 20 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49      FROM t1 %JOI
4ea0: 4e 25 20 74 32 20 4f 4e 20 28 43 41 53 45 20 57  N% t2 ON (CASE W
4eb0: 48 45 4e 20 74 31 2e 61 20 3d 20 27 61 27 20 54  HEN t1.a = 'a' T
4ec0: 48 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 31 20  HEN NULL ELSE 1 
4ed0: 45 4e 44 29 20 7d 20 5c 0a 20 20 20 20 20 20 7b  END) } \.      {
4ee0: 74 77 6f 20 49 20 74 77 6f 20 49 49 20 74 77 6f  two I two II two
4ef0: 20 49 49 49 20 74 68 72 65 65 20 49 20 74 68 72   III three I thr
4f00: 65 65 20 49 49 20 74 68 72 65 65 20 49 49 49 7d  ee II three III}
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 6a      \.] {.  do_j
4f30: 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  oin_test e_selec
4f40: 74 2d 31 2e 33 2e 24 74 6e 20 24 73 65 6c 65 63  t-1.3.$tn $selec
4f50: 74 20 24 72 65 73 0a 7d 0a 0a 23 20 45 56 49 44  t $res.}..# EVID
4f60: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 35 38  ENCE-OF: R-63358
4f70: 2d 35 34 38 36 32 20 49 66 20 74 68 65 72 65 20  -54862 If there 
4f80: 69 73 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  is a USING claus
4f90: 65 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 23  e specified as.#
4fa0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 69   part of the joi
4fb0: 6e 2d 63 6f 6e 73 74 72 61 69 6e 74 2c 20 74 68  n-constraint, th
4fc0: 65 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  en each of the c
4fd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 73 70 65 63  olumn names spec
4fe0: 69 66 69 65 64 0a 23 20 6d 75 73 74 20 65 78 69  ified.# must exi
4ff0: 73 74 20 69 6e 20 74 68 65 20 64 61 74 61 73 65  st in the datase
5000: 74 73 20 74 6f 20 62 6f 74 68 20 74 68 65 20 6c  ts to both the l
5010: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
5020: 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 2e 0a 23 0a   the join-op..#.
5030: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
5040: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 20 2d 65 72  e_select-1.4 -er
5050: 72 6f 72 20 7b 0a 20 20 63 61 6e 6e 6f 74 20 6a  ror {.  cannot j
5060: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
5070: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74   %s - column not
5080: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
5090: 20 74 61 62 6c 65 73 0a 7d 20 7b 0a 20 20 31 20   tables.} {.  1 
50a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
50b0: 74 31 2c 20 74 33 20 55 53 49 4e 47 20 28 62 29  t1, t3 USING (b)
50c0: 20 7d 20 20 20 22 62 22 0a 20 20 32 20 7b 20 53   }   "b".  2 { S
50d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c  ELECT * FROM t3,
50e0: 20 74 31 20 55 53 49 4e 47 20 28 63 29 20 7d 20   t1 USING (c) } 
50f0: 20 20 22 63 22 0a 20 20 33 20 7b 20 53 45 4c 45    "c".  3 { SELE
5100: 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c 20 28 53  CT * FROM t3, (S
5110: 45 4c 45 43 54 20 61 20 41 53 20 62 2c 20 62 20  ELECT a AS b, b 
5120: 41 53 20 63 20 46 52 4f 4d 20 74 31 29 20 55 53  AS c FROM t1) US
5130: 49 4e 47 20 28 61 29 20 7d 20 20 20 22 61 22 0a  ING (a) }   "a".
5140: 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
5150: 46 3a 20 52 2d 35 35 39 38 37 2d 30 34 35 38 34  F: R-55987-04584
5160: 20 46 6f 72 20 65 61 63 68 20 70 61 69 72 20 6f   For each pair o
5170: 66 20 6e 61 6d 65 73 61 6b 65 20 63 6f 6c 75 6d  f namesake colum
5180: 6e 73 2c 20 74 68 65 0a 23 20 65 78 70 72 65 73  ns, the.# expres
5190: 73 69 6f 6e 20 22 6c 68 73 2e 58 20 3d 20 72 68  sion "lhs.X = rh
51a0: 73 2e 58 22 20 69 73 20 65 76 61 6c 75 61 74 65  s.X" is evaluate
51b0: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  d for each row o
51c0: 66 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 0a  f the cartesian.
51d0: 23 20 70 72 6f 64 75 63 74 20 61 73 20 61 20 62  # product as a b
51e0: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
51f0: 6e 2e 20 41 6c 6c 20 72 6f 77 73 20 66 6f 72 20  n. All rows for 
5200: 77 68 69 63 68 20 6f 6e 65 20 6f 72 20 6d 6f 72  which one or mor
5210: 65 20 6f 66 20 74 68 65 0a 23 20 65 78 70 72 65  e of the.# expre
5220: 73 73 69 6f 6e 73 20 65 76 61 6c 75 61 74 65 73  ssions evaluates
5230: 20 74 6f 20 66 61 6c 73 65 20 61 72 65 20 65 78   to false are ex
5240: 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
5250: 72 65 73 75 6c 74 20 73 65 74 2e 0a 23 0a 64 6f  result set..#.do
5260: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
5270: 73 65 6c 65 63 74 2d 31 2e 35 20 7b 0a 20 20 31  select-1.5 {.  1
5280: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5290: 20 74 31 2c 20 74 33 20 55 53 49 4e 47 20 28 61   t1, t3 USING (a
52a0: 29 20 20 20 7d 20 20 7b 61 20 6f 6e 65 20 31 20  )   }  {a one 1 
52b0: 62 20 74 77 6f 20 32 7d 0a 20 20 32 20 7b 20 53  b two 2}.  2 { S
52c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c  ELECT * FROM t3,
52d0: 20 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 20   t4 USING (a,c) 
52e0: 7d 20 20 7b 62 20 32 7d 0a 7d 20 0a 0a 23 20 45  }  {b 2}.} ..# E
52f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34  VIDENCE-OF: R-54
5300: 30 34 36 2d 34 38 36 30 30 20 57 68 65 6e 20 63  046-48600 When c
5310: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 20  omparing values 
5320: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
5330: 0a 23 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c  .# USING clause,
5340: 20 74 68 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65   the normal rule
5350: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61  s for handling a
5360: 66 66 69 6e 69 74 69 65 73 2c 20 63 6f 6c 6c 61  ffinities, colla
5370: 74 69 6f 6e 0a 23 20 73 65 71 75 65 6e 63 65 73  tion.# sequences
5380: 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
5390: 20 69 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   in comparisons 
53a0: 61 70 70 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45  apply..#.# EVIDE
53b0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 34 36 36 2d  NCE-OF: R-35466-
53c0: 31 38 35 37 38 20 54 68 65 20 63 6f 6c 75 6d 6e  18578 The column
53d0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 73 65   from the datase
53e0: 74 20 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d  t on the.# left-
53f0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
5400: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69   join operator i
5410: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
5420: 62 65 20 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74  be on the.# left
5430: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
5440: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
5450: 72 61 74 6f 72 20 28 3d 29 20 66 6f 72 20 74 68  rator (=) for th
5460: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 0a 23 20  e purposes of.# 
5470: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
5480: 63 65 20 61 6e 64 20 61 66 66 69 6e 69 74 79 20  ce and affinity 
5490: 70 72 65 63 65 64 65 6e 63 65 2e 0a 23 0a 64 6f  precedence..#.do
54a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
54b0: 73 65 6c 65 63 74 2d 31 2e 36 2e 30 20 7b 0a 20  select-1.6.0 {. 
54c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
54d0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
54e0: 65 2c 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  e, b COLLATE bin
54f0: 61 72 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ary);.  INSERT I
5500: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 41  NTO t5 VALUES('A
5510: 41 27 2c 20 27 63 63 27 29 3b 0a 20 20 49 4e 53  A', 'cc');.  INS
5520: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
5530: 45 53 28 27 42 42 27 2c 20 27 64 64 27 29 3b 0a  ES('BB', 'dd');.
5540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
5550: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
5560: 4c 4c 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  LL);.  CREATE TA
5570: 42 4c 45 20 74 36 28 61 20 43 4f 4c 4c 41 54 45  BLE t6(a COLLATE
5580: 20 62 69 6e 61 72 79 2c 20 62 20 43 4f 4c 4c 41   binary, b COLLA
5590: 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e  TE nocase);.  IN
55a0: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
55b0: 55 45 53 28 27 61 61 27 2c 20 27 63 63 27 29 3b  UES('aa', 'cc');
55c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
55d0: 36 20 56 41 4c 55 45 53 28 27 62 62 27 2c 20 27  6 VALUES('bb', '
55e0: 44 44 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  DD');.  INSERT I
55f0: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 4e 55  NTO t6 VALUES(NU
5600: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 7d 0a  LL, NULL);.} {}.
5610: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65  foreach {tn sele
5620: 63 74 20 72 65 73 7d 20 7b 0a 20 20 31 20 7b 20  ct res} {.  1 { 
5630: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35  SELECT * FROM t5
5640: 20 25 4a 4f 49 4e 25 20 74 36 20 55 53 49 4e 47   %JOIN% t6 USING
5650: 20 28 61 29 20 7d 20 7b 41 41 20 63 63 20 63 63   (a) } {AA cc cc
5660: 20 42 42 20 64 64 20 44 44 7d 0a 20 20 32 20 7b   BB dd DD}.  2 {
5670: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5680: 36 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e  6 %JOIN% t5 USIN
5690: 47 20 28 61 29 20 7d 20 7b 7d 0a 20 20 33 20 7b  G (a) } {}.  3 {
56a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
56b0: 53 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45  SELECT a COLLATE
56c0: 20 6e 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d 20   nocase, b FROM 
56d0: 74 36 29 20 25 4a 4f 49 4e 25 20 74 35 20 55 53  t6) %JOIN% t5 US
56e0: 49 4e 47 20 28 61 29 20 7d 20 0a 20 20 20 20 7b  ING (a) } .    {
56f0: 61 61 20 63 63 20 63 63 20 62 62 20 44 44 20 64  aa cc cc bb DD d
5700: 64 7d 0a 20 20 34 20 7b 20 53 45 4c 45 43 54 20  d}.  4 { SELECT 
5710: 2a 20 46 52 4f 4d 20 74 35 20 25 4a 4f 49 4e 25  * FROM t5 %JOIN%
5720: 20 74 36 20 55 53 49 4e 47 20 28 61 2c 62 29 20   t6 USING (a,b) 
5730: 7d 20 7b 41 41 20 63 63 7d 0a 20 20 35 20 7b 20  } {AA cc}.  5 { 
5740: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
5750: 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47   %JOIN% t5 USING
5760: 20 28 61 2c 62 29 20 7d 20 7b 7d 0a 7d 20 7b 0a   (a,b) } {}.} {.
5770: 20 20 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65    do_join_test e
5780: 5f 73 65 6c 65 63 74 2d 31 2e 36 2e 24 74 6e 20  _select-1.6.$tn 
5790: 24 73 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a  $select $res.}..
57a0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
57b0: 2d 35 37 30 34 37 2d 31 30 34 36 31 20 46 6f 72  -57047-10461 For
57c0: 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 63 6f   each pair of co
57d0: 6c 75 6d 6e 73 20 69 64 65 6e 74 69 66 69 65 64  lumns identified
57e0: 20 62 79 20 61 0a 23 20 55 53 49 4e 47 20 63 6c   by a.# USING cl
57f0: 61 75 73 65 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  ause, the column
5800: 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 2d   from the right-
5810: 68 61 6e 64 20 64 61 74 61 73 65 74 20 69 73 20  hand dataset is 
5820: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 23 20 74  omitted from.# t
5830: 68 65 20 6a 6f 69 6e 65 64 20 64 61 74 61 73 65  he joined datase
5840: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
5850: 4f 46 3a 20 52 2d 35 36 31 33 32 2d 31 35 37 30  OF: R-56132-1570
5860: 30 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  0 This is the on
5870: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
5880: 74 77 65 65 6e 20 61 20 55 53 49 4e 47 0a 23 20  tween a USING.# 
5890: 63 6c 61 75 73 65 20 61 6e 64 20 69 74 73 20 65  clause and its e
58a0: 71 75 69 76 61 6c 65 6e 74 20 4f 4e 20 63 6f 6e  quivalent ON con
58b0: 73 74 72 61 69 6e 74 2e 0a 23 0a 66 6f 72 65 61  straint..#.forea
58c0: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65  ch {tn select re
58d0: 73 7d 20 7b 0a 20 20 31 61 20 7b 20 53 45 4c 45  s} {.  1a { SELE
58e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f  CT * FROM t1 %JO
58f0: 49 4e 25 20 74 32 20 55 53 49 4e 47 20 28 61 29  IN% t2 USING (a)
5900: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 7b 61        } .     {a
5910: 20 6f 6e 65 20 49 20 62 20 74 77 6f 20 49 49 20   one I b two II 
5920: 63 20 74 68 72 65 65 20 49 49 49 7d 0a 20 20 31  c three III}.  1
5930: 62 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  b { SELECT * FRO
5940: 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f  M t1 %JOIN% t2 O
5950: 4e 20 28 74 31 2e 61 3d 74 32 2e 61 29 20 7d 0a  N (t1.a=t2.a) }.
5960: 20 20 20 20 20 7b 61 20 6f 6e 65 20 61 20 49 20       {a one a I 
5970: 62 20 74 77 6f 20 62 20 49 49 20 63 20 74 68 72  b two b II c thr
5980: 65 65 20 63 20 49 49 49 7d 0a 0a 20 20 32 61 20  ee c III}..  2a 
5990: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
59a0: 74 33 20 25 4a 4f 49 4e 25 20 74 34 20 55 53 49  t3 %JOIN% t4 USI
59b0: 4e 47 20 28 61 29 20 20 20 20 20 20 7d 20 20 0a  NG (a)      }  .
59c0: 20 20 20 20 20 7b 61 20 31 20 7b 7d 20 62 20 32       {a 1 {} b 2
59d0: 20 32 7d 0a 20 20 32 62 20 7b 20 53 45 4c 45 43   2}.  2b { SELEC
59e0: 54 20 2a 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49  T * FROM t3 %JOI
59f0: 4e 25 20 74 34 20 4f 4e 20 28 74 33 2e 61 3d 74  N% t4 ON (t3.a=t
5a00: 34 2e 61 29 20 7d 20 0a 20 20 20 20 20 7b 61 20  4.a) } .     {a 
5a10: 31 20 61 20 7b 7d 20 62 20 32 20 62 20 32 7d 0a  1 a {} b 2 b 2}.
5a20: 0a 20 20 33 61 20 7b 20 53 45 4c 45 43 54 20 2a  .  3a { SELECT *
5a30: 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49 4e 25 20   FROM t3 %JOIN% 
5a40: 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 20 20  t4 USING (a,c)  
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 7d 20 7b 62 20 32 7d 0a 20 20 33 62 20 7b 20 53  } {b 2}.  3b { S
5a70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
5a80: 25 4a 4f 49 4e 25 20 74 34 20 4f 4e 20 28 74 33  %JOIN% t4 ON (t3
5a90: 2e 61 3d 74 34 2e 61 20 41 4e 44 20 74 33 2e 63  .a=t4.a AND t3.c
5aa0: 3d 74 34 2e 63 29 20 7d 20 7b 62 20 32 20 62 20  =t4.c) } {b 2 b 
5ab0: 32 7d 0a 0a 20 20 34 61 20 7b 20 53 45 4c 45 43  2}..  4a { SELEC
5ac0: 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
5ad0: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
5ae0: 65 2c 20 62 20 46 52 4f 4d 20 74 36 29 20 41 53  e, b FROM t6) AS
5af0: 20 78 20 0a 20 20 20 20 20 20 20 25 4a 4f 49 4e   x .       %JOIN
5b00: 25 20 74 35 20 55 53 49 4e 47 20 28 61 29 20 7d  % t5 USING (a) }
5b10: 20 0a 20 20 20 20 20 7b 61 61 20 63 63 20 63 63   .     {aa cc cc
5b20: 20 62 62 20 44 44 20 64 64 7d 0a 20 20 34 62 20   bb DD dd}.  4b 
5b30: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5b40: 28 53 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54  (SELECT a COLLAT
5b50: 45 20 6e 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d  E nocase, b FROM
5b60: 20 74 36 29 20 41 53 20 78 0a 20 20 20 20 20 20   t6) AS x.      
5b70: 20 25 4a 4f 49 4e 25 20 74 35 20 4f 4e 20 28 78   %JOIN% t5 ON (x
5b80: 2e 61 3d 74 35 2e 61 29 20 7d 20 0a 20 20 20 20  .a=t5.a) } .    
5b90: 20 7b 61 61 20 63 63 20 41 41 20 63 63 20 62 62   {aa cc AA cc bb
5ba0: 20 44 44 20 42 42 20 64 64 7d 0a 7d 20 7b 0a 20   DD BB dd}.} {. 
5bb0: 20 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f   do_join_test e_
5bc0: 73 65 6c 65 63 74 2d 31 2e 37 2e 24 74 6e 20 24  select-1.7.$tn $
5bd0: 73 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a 23  select $res.}..#
5be0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5bf0: 34 31 34 33 34 2d 31 32 34 34 38 20 49 66 20 74  41434-12448 If t
5c00: 68 65 20 6a 6f 69 6e 2d 6f 70 20 69 73 20 61 20  he join-op is a 
5c10: 22 4c 45 46 54 20 4a 4f 49 4e 22 20 6f 72 20 22  "LEFT JOIN" or "
5c20: 4c 45 46 54 0a 23 20 4f 55 54 45 52 20 4a 4f 49  LEFT.# OUTER JOI
5c30: 4e 22 2c 20 74 68 65 6e 20 61 66 74 65 72 20 74  N", then after t
5c40: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 66  he ON or USING f
5c50: 69 6c 74 65 72 69 6e 67 20 63 6c 61 75 73 65 73  iltering clauses
5c60: 20 68 61 76 65 20 62 65 65 6e 0a 23 20 61 70 70   have been.# app
5c70: 6c 69 65 64 2c 20 61 6e 20 65 78 74 72 61 20 72  lied, an extra r
5c80: 6f 77 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ow is added to t
5c90: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 65 61  he output for ea
5ca0: 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a 23 20  ch row in the.# 
5cb0: 6f 72 69 67 69 6e 61 6c 20 6c 65 66 74 2d 68 61  original left-ha
5cc0: 6e 64 20 69 6e 70 75 74 20 64 61 74 61 73 65 74  nd input dataset
5cd0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
5ce0: 73 20 74 6f 20 6e 6f 20 72 6f 77 73 20 61 74 20  s to no rows at 
5cf0: 61 6c 6c 20 69 6e 0a 23 20 74 68 65 20 63 6f 6d  all in.# the com
5d00: 70 6f 73 69 74 65 20 64 61 74 61 73 65 74 20 28  posite dataset (
5d10: 69 66 20 61 6e 79 29 2e 0a 23 0a 64 6f 5f 65 78  if any)..#.do_ex
5d20: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
5d30: 65 63 74 2d 31 2e 38 2e 30 20 7b 0a 20 20 43 52  ect-1.8.0 {.  CR
5d40: 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c  EATE TABLE t7(a,
5d50: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
5d60: 20 54 41 42 4c 45 20 74 38 28 61 2c 20 64 2c 20   TABLE t8(a, d, 
5d70: 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  e);..  INSERT IN
5d80: 54 4f 20 74 37 20 56 41 4c 55 45 53 28 27 78 27  TO t7 VALUES('x'
5d90: 2c 20 27 65 78 27 2c 20 20 32 34 29 3b 0a 20 20  , 'ex',  24);.  
5da0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
5db0: 41 4c 55 45 53 28 27 79 27 2c 20 27 77 68 79 27  ALUES('y', 'why'
5dc0: 2c 20 32 35 29 3b 0a 0a 20 20 49 4e 53 45 52 54  , 25);..  INSERT
5dd0: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
5de0: 27 78 27 2c 20 27 61 62 63 27 2c 20 32 34 29 3b  'x', 'abc', 24);
5df0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
5e00: 38 20 56 41 4c 55 45 53 28 27 7a 27 2c 20 27 67  8 VALUES('z', 'g
5e10: 68 69 27 2c 20 32 36 29 3b 0a 7d 20 7b 7d 0a 0a  hi', 26);.} {}..
5e20: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
5e30: 65 5f 73 65 6c 65 63 74 2d 31 2e 38 20 7b 0a 20  e_select-1.8 {. 
5e40: 20 31 61 20 22 53 45 4c 45 43 54 20 63 6f 75 6e   1a "SELECT coun
5e50: 74 28 2a 29 20 46 52 4f 4d 20 74 37 20 4a 4f 49  t(*) FROM t7 JOI
5e60: 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38  N t8 ON (t7.a=t8
5e70: 2e 61 29 22 20 7b 31 7d 0a 20 20 31 62 20 22 53  .a)" {1}.  1b "S
5e80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
5e90: 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49 4e  ROM t7 LEFT JOIN
5ea0: 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38 2e   t8 ON (t7.a=t8.
5eb0: 61 29 22 20 7b 32 7d 0a 20 20 32 61 20 22 53 45  a)" {2}.  2a "SE
5ec0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5ed0: 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 55 53  OM t7 JOIN t8 US
5ee0: 49 4e 47 20 28 61 29 22 20 7b 31 7d 0a 20 20 32  ING (a)" {1}.  2
5ef0: 62 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  b "SELECT count(
5f00: 2a 29 20 46 52 4f 4d 20 74 37 20 4c 45 46 54 20  *) FROM t7 LEFT 
5f10: 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20 28 61  JOIN t8 USING (a
5f20: 29 22 20 7b 32 7d 0a 7d 0a 0a 0a 23 20 45 56 49  )" {2}.}...# EVI
5f30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 36 30  DENCE-OF: R-1560
5f40: 37 2d 35 32 39 38 38 20 54 68 65 20 61 64 64 65  7-52988 The adde
5f50: 64 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 20 4e  d rows contain N
5f60: 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20 74 68  ULL values in th
5f70: 65 0a 23 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  e.# columns that
5f80: 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20   would normally 
5f90: 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73 20 63  contain values c
5fa0: 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 72  opied from the r
5fb0: 69 67 68 74 2d 68 61 6e 64 0a 23 20 69 6e 70 75  ight-hand.# inpu
5fc0: 74 20 64 61 74 61 73 65 74 2e 0a 23 0a 64 6f 5f  t dataset..#.do_
5fd0: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
5fe0: 65 6c 65 63 74 2d 31 2e 39 20 7b 0a 20 20 31 61  elect-1.9 {.  1a
5ff0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
6000: 74 37 20 4a 4f 49 4e 20 74 38 20 4f 4e 20 28 74  t7 JOIN t8 ON (t
6010: 37 2e 61 3d 74 38 2e 61 29 22 20 7b 78 20 65 78  7.a=t8.a)" {x ex
6020: 20 32 34 20 78 20 61 62 63 20 32 34 7d 0a 20 20   24 x abc 24}.  
6030: 31 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  1b "SELECT * FRO
6040: 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t7 LEFT JOIN t
6050: 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38 2e 61 29  8 ON (t7.a=t8.a)
6060: 22 20 0a 20 20 20 20 20 7b 78 20 65 78 20 32 34  " .     {x ex 24
6070: 20 78 20 61 62 63 20 32 34 20 79 20 77 68 79 20   x abc 24 y why 
6080: 32 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20 32  25 {} {} {}}.  2
6090: 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  a "SELECT * FROM
60a0: 20 74 37 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e   t7 JOIN t8 USIN
60b0: 47 20 28 61 29 22 20 7b 78 20 65 78 20 32 34 20  G (a)" {x ex 24 
60c0: 61 62 63 20 32 34 7d 0a 20 20 32 62 20 22 53 45  abc 24}.  2b "SE
60d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 4c  LECT * FROM t7 L
60e0: 45 46 54 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e  EFT JOIN t8 USIN
60f0: 47 20 28 61 29 22 20 7b 78 20 65 78 20 32 34 20  G (a)" {x ex 24 
6100: 61 62 63 20 32 34 20 79 20 77 68 79 20 32 35 20  abc 24 y why 25 
6110: 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44  {} {}}.}..# EVID
6120: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 30 39  ENCE-OF: R-01809
6130: 2d 35 32 31 33 34 20 49 66 20 74 68 65 20 4e 41  -52134 If the NA
6140: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
6150: 20 61 64 64 65 64 20 74 6f 20 61 6e 79 20 6f 66   added to any of
6160: 0a 23 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 73 2c  .# the join-ops,
6170: 20 74 68 65 6e 20 61 6e 20 69 6d 70 6c 69 63 69   then an implici
6180: 74 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  t USING clause i
6190: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a 23  s added to the.#
61a0: 20 6a 6f 69 6e 2d 63 6f 6e 73 74 72 61 69 6e 74   join-constraint
61b0: 73 2e 20 54 68 65 20 69 6d 70 6c 69 63 69 74 20  s. The implicit 
61c0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 63 6f 6e  USING clause con
61d0: 74 61 69 6e 73 20 65 61 63 68 20 6f 66 20 74 68  tains each of th
61e0: 65 0a 23 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  e.# column names
61f0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
6200: 62 6f 74 68 20 74 68 65 20 6c 65 66 74 20 61 6e  both the left an
6210: 64 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70  d right-hand inp
6220: 75 74 0a 23 20 64 61 74 61 73 65 74 73 2e 0a 23  ut.# datasets..#
6230: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
6240: 20 65 5f 73 65 6c 65 63 74 2d 31 2d 31 30 20 7b   e_select-1-10 {
6250: 0a 20 20 31 61 20 22 53 45 4c 45 43 54 20 2a 20  .  1a "SELECT * 
6260: 46 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20  FROM t7 JOIN t8 
6270: 55 53 49 4e 47 20 28 61 29 22 20 20 20 20 20 20  USING (a)"      
6280: 20 20 7b 78 20 65 78 20 32 34 20 61 62 63 20 32    {x ex 24 abc 2
6290: 34 7d 0a 20 20 31 62 20 22 53 45 4c 45 43 54 20  4}.  1b "SELECT 
62a0: 2a 20 46 52 4f 4d 20 74 37 20 4e 41 54 55 52 41  * FROM t7 NATURA
62b0: 4c 20 4a 4f 49 4e 20 74 38 22 20 20 20 20 20 20  L JOIN t8"      
62c0: 20 20 20 20 7b 78 20 65 78 20 32 34 20 61 62 63      {x ex 24 abc
62d0: 20 32 34 7d 0a 0a 20 20 32 61 20 22 53 45 4c 45   24}..  2a "SELE
62e0: 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4a 4f 49  CT * FROM t8 JOI
62f0: 4e 20 74 37 20 55 53 49 4e 47 20 28 61 29 22 20  N t7 USING (a)" 
6300: 20 20 20 20 20 20 20 7b 78 20 61 62 63 20 32 34         {x abc 24
6310: 20 65 78 20 32 34 7d 0a 20 20 32 62 20 22 53 45   ex 24}.  2b "SE
6320: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4e  LECT * FROM t8 N
6330: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 37 22 20  ATURAL JOIN t7" 
6340: 20 20 20 20 20 20 20 20 20 7b 78 20 61 62 63 20           {x abc 
6350: 32 34 20 65 78 20 32 34 7d 0a 0a 20 20 33 61 20  24 ex 24}..  3a 
6360: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6370: 37 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38 20 55  7 LEFT JOIN t8 U
6380: 53 49 4e 47 20 28 61 29 22 20 20 20 7b 78 20 65  SING (a)"   {x e
6390: 78 20 32 34 20 61 62 63 20 32 34 20 79 20 77 68  x 24 abc 24 y wh
63a0: 79 20 32 35 20 7b 7d 20 7b 7d 7d 0a 20 20 33 62  y 25 {} {}}.  3b
63b0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
63c0: 74 37 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  t7 NATURAL LEFT 
63d0: 4a 4f 49 4e 20 74 38 22 20 20 20 20 20 7b 78 20  JOIN t8"     {x 
63e0: 65 78 20 32 34 20 61 62 63 20 32 34 20 79 20 77  ex 24 abc 24 y w
63f0: 68 79 20 32 35 20 7b 7d 20 7b 7d 7d 0a 0a 20 20  hy 25 {} {}}..  
6400: 34 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  4a "SELECT * FRO
6410: 4d 20 74 38 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t8 LEFT JOIN t
6420: 37 20 55 53 49 4e 47 20 28 61 29 22 20 20 20 7b  7 USING (a)"   {
6430: 78 20 61 62 63 20 32 34 20 65 78 20 32 34 20 7a  x abc 24 ex 24 z
6440: 20 67 68 69 20 32 36 20 7b 7d 20 7b 7d 7d 0a 20   ghi 26 {} {}}. 
6450: 20 34 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52   4b "SELECT * FR
6460: 4f 4d 20 74 38 20 4e 41 54 55 52 41 4c 20 4c 45  OM t8 NATURAL LE
6470: 46 54 20 4a 4f 49 4e 20 74 37 22 20 20 20 20 20  FT JOIN t7"     
6480: 7b 78 20 61 62 63 20 32 34 20 65 78 20 32 34 20  {x abc 24 ex 24 
6490: 7a 20 67 68 69 20 32 36 20 7b 7d 20 7b 7d 7d 0a  z ghi 26 {} {}}.
64a0: 0a 20 20 35 61 20 22 53 45 4c 45 43 54 20 2a 20  .  5a "SELECT * 
64b0: 46 52 4f 4d 20 74 33 20 4a 4f 49 4e 20 74 34 20  FROM t3 JOIN t4 
64c0: 55 53 49 4e 47 20 28 61 2c 63 29 22 20 20 20 20  USING (a,c)"    
64d0: 20 20 7b 62 20 32 7d 0a 20 20 35 62 20 22 53 45    {b 2}.  5b "SE
64e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4e  LECT * FROM t3 N
64f0: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 34 22 20  ATURAL JOIN t4" 
6500: 20 20 20 20 20 20 20 20 20 7b 62 20 32 7d 0a 0a           {b 2}..
6510: 20 20 36 61 20 22 53 45 4c 45 43 54 20 2a 20 46    6a "SELECT * F
6520: 52 4f 4d 20 74 33 20 4c 45 46 54 20 4a 4f 49 4e  ROM t3 LEFT JOIN
6530: 20 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 22   t4 USING (a,c)"
6540: 20 7b 61 20 31 20 62 20 32 7d 0a 20 20 36 62 20   {a 1 b 2}.  6b 
6550: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6560: 33 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a  3 NATURAL LEFT J
6570: 4f 49 4e 20 74 34 22 20 20 20 20 20 7b 61 20 31  OIN t4"     {a 1
6580: 20 62 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49 44   b 2}.} ..# EVID
6590: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 35 36 36  ENCE-OF: R-49566
65a0: 2d 30 31 35 37 30 20 49 66 20 74 68 65 20 6c 65  -01570 If the le
65b0: 66 74 20 61 6e 64 20 72 69 67 68 74 2d 68 61 6e  ft and right-han
65c0: 64 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 73  d input datasets
65d0: 0a 23 20 66 65 61 74 75 72 65 20 6e 6f 20 63 6f  .# feature no co
65e0: 6d 6d 6f 6e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  mmon column name
65f0: 73 2c 20 74 68 65 6e 20 74 68 65 20 4e 41 54 55  s, then the NATU
6600: 52 41 4c 20 6b 65 79 77 6f 72 64 20 68 61 73 20  RAL keyword has 
6610: 6e 6f 20 65 66 66 65 63 74 0a 23 20 6f 6e 20 74  no effect.# on t
6620: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
6630: 65 20 6a 6f 69 6e 2e 0a 23 0a 64 6f 5f 65 78 65  e join..#.do_exe
6640: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
6650: 63 74 2d 31 2e 31 31 2e 30 20 7b 0a 20 20 43 52  ct-1.11.0 {.  CR
6660: 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 78  EATE TABLE t10(x
6670: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
6680: 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31  NTO t10 VALUES(1
6690: 2c 20 27 74 72 75 65 27 29 3b 0a 20 20 49 4e 53  , 'true');.  INS
66a0: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
66b0: 55 45 53 28 30 2c 20 27 66 61 6c 73 65 27 29 3b  UES(0, 'false');
66c0: 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f  .} {}.do_select_
66d0: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31  tests e_select-1
66e0: 2d 31 31 20 7b 0a 20 20 31 61 20 22 53 45 4c 45  -11 {.  1a "SELE
66f0: 43 54 20 61 2c 20 78 20 46 52 4f 4d 20 74 31 20  CT a, x FROM t1 
6700: 43 52 4f 53 53 20 4a 4f 49 4e 20 74 31 30 22 20  CROSS JOIN t10" 
6710: 7b 61 20 31 20 61 20 30 20 62 20 31 20 62 20 30  {a 1 a 0 b 1 b 0
6720: 20 63 20 31 20 63 20 30 7d 0a 20 20 31 62 20 22   c 1 c 0}.  1b "
6730: 53 45 4c 45 43 54 20 61 2c 20 78 20 46 52 4f 4d  SELECT a, x FROM
6740: 20 74 31 20 4e 41 54 55 52 41 4c 20 43 52 4f 53   t1 NATURAL CROS
6750: 53 20 4a 4f 49 4e 20 74 31 30 22 20 7b 61 20 31  S JOIN t10" {a 1
6760: 20 61 20 30 20 62 20 31 20 62 20 30 20 63 20 31   a 0 b 1 b 0 c 1
6770: 20 63 20 30 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   c 0}.}..# EVIDE
6780: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 36 32 35 2d  NCE-OF: R-39625-
6790: 35 39 31 33 33 20 41 20 55 53 49 4e 47 20 6f 72  59133 A USING or
67a0: 20 4f 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   ON clause may n
67b0: 6f 74 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  ot be added to a
67c0: 0a 23 20 6a 6f 69 6e 20 74 68 61 74 20 73 70 65  .# join that spe
67d0: 63 69 66 69 65 73 20 74 68 65 20 4e 41 54 55 52  cifies the NATUR
67e0: 41 4c 20 6b 65 79 77 6f 72 64 2e 0a 23 0a 66 6f  AL keyword..#.fo
67f0: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b  reach {tn sql} {
6800: 0a 20 20 31 20 7b 53 45 4c 45 43 54 20 2a 20 46  .  1 {SELECT * F
6810: 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 4c  ROM t1 NATURAL L
6820: 45 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e  EFT JOIN t2 USIN
6830: 47 20 28 61 29 7d 0a 20 20 32 20 7b 53 45 4c 45  G (a)}.  2 {SELE
6840: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54  CT * FROM t1 NAT
6850: 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74  URAL LEFT JOIN t
6860: 32 20 4f 4e 20 28 74 31 2e 61 3d 74 32 2e 61 29  2 ON (t1.a=t2.a)
6870: 7d 0a 20 20 33 20 7b 53 45 4c 45 43 54 20 2a 20  }.  3 {SELECT * 
6880: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
6890: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
68a0: 28 34 35 29 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 63  (45)}.} {.  do_c
68b0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 73  atchsql_test e_s
68c0: 65 6c 65 63 74 2d 31 2e 31 32 2e 24 74 6e 20 22  elect-1.12.$tn "
68d0: 0a 20 20 20 20 24 73 71 6c 0a 20 20 22 20 7b 31  .    $sql.  " {1
68e0: 20 7b 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   {a NATURAL join
68f0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e   may not have an
6900: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6910: 75 73 65 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  use}}.}..#------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62  ---.# The next b
6970: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
6980: 65 5f 73 65 6c 65 63 74 2d 33 2e 2a 20 2d 20 63  e_select-3.* - c
6990: 6f 6e 63 65 6e 74 72 61 74 65 20 6f 6e 20 76 65  oncentrate on ve
69a0: 72 69 66 79 69 6e 67 20 0a 23 20 73 74 61 74 65  rifying .# state
69b0: 6d 65 6e 74 73 20 6d 61 64 65 20 72 65 67 61 72  ments made regar
69c0: 64 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ding WHERE claus
69d0: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23 0a  e processing..#.
69e0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
69f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6a00: 65 5f 73 65 6c 65 63 74 2d 33 2e 30 20 7b 0a 20  e_select-3.0 {. 
6a10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
6a20: 28 6b 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 20 20  (k, x, y, z);.  
6a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
6a40: 41 4c 55 45 53 28 31 2c 20 27 72 65 6c 69 6e 71  ALUES(1, 'relinq
6a50: 75 69 73 68 65 64 27 2c 20 27 61 70 68 61 73 69  uished', 'aphasi
6a60: 61 27 2c 20 37 38 2e 34 33 29 3b 0a 20 20 49 4e  a', 78.43);.  IN
6a70: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
6a80: 55 45 53 28 32 2c 20 58 27 41 38 45 38 44 36 36  UES(2, X'A8E8D66
6a90: 46 27 2c 20 20 20 20 58 27 30 37 43 46 27 2c 20  F',    X'07CF', 
6aa0: 20 20 2d 38 31 29 3b 0a 20 20 49 4e 53 45 52 54    -81);.  INSERT
6ab0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
6ac0: 33 2c 20 2d 32 32 2c 20 20 20 20 20 20 20 20 20  3, -22,         
6ad0: 20 20 20 2d 32 37 2e 35 37 2c 20 20 20 20 4e 55     -27.57,    NU
6ae0: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  LL);.  INSERT IN
6af0: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 34 2c 20  TO x1 VALUES(4, 
6b00: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20  NULL,           
6b10: 27 62 79 67 6f 6e 65 27 2c 20 20 27 70 69 63 6b  'bygone',  'pick
6b20: 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  y');.  INSERT IN
6b30: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 35 2c 20  TO x1 VALUES(5, 
6b40: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20  NULL,           
6b50: 39 36 2e 32 38 2c 20 20 20 20 20 4e 55 4c 4c 29  96.28,     NULL)
6b60: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6b70: 78 31 20 56 41 4c 55 45 53 28 36 2c 20 30 2c 20  x1 VALUES(6, 0, 
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
6b90: 20 20 20 20 20 20 20 20 32 29 3b 0a 0a 20 20 43          2);..  C
6ba0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 6b  REATE TABLE x2(k
6bb0: 2c 20 78 2c 20 79 32 29 3b 0a 20 20 49 4e 53 45  , x, y2);.  INSE
6bc0: 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45  RT INTO x2 VALUE
6bd0: 53 28 31 2c 20 35 30 2c 20 58 27 42 38 32 38 33  S(1, 50, X'B8283
6be0: 38 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  8');.  INSERT IN
6bf0: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 35 2c 20  TO x2 VALUES(5, 
6c00: 38 34 2e 37 39 2c 20 36 35 2e 38 38 29 3b 0a 20  84.79, 65.88);. 
6c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
6c20: 56 41 4c 55 45 53 28 33 2c 20 2d 32 32 2c 20 58  VALUES(3, -22, X
6c30: 27 30 45 31 42 45 34 35 32 41 33 39 33 27 29 3b  '0E1BE452A393');
6c40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
6c50: 32 20 56 41 4c 55 45 53 28 37 2c 20 27 6d 69 73  2 VALUES(7, 'mis
6c60: 74 72 75 73 74 65 64 27 2c 20 27 73 74 61 6e 64  trusted', 'stand
6c70: 61 72 64 69 7a 65 64 27 29 3b 0a 7d 20 7b 7d 0a  ardized');.} {}.
6c80: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
6c90: 52 2d 30 36 39 39 39 2d 31 34 33 33 30 20 49 66  R-06999-14330 If
6ca0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
6cb0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  is specified, th
6cc0: 65 20 57 48 45 52 45 0a 23 20 65 78 70 72 65 73  e WHERE.# expres
6cd0: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
6ce0: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  d for each row i
6cf0: 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61  n the input data
6d00: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 0a 23 20   as a boolean.# 
6d10: 65 78 70 72 65 73 73 69 6f 6e 2e 20 41 6c 6c 20  expression. All 
6d20: 72 6f 77 73 20 66 6f 72 20 77 68 69 63 68 20 74  rows for which t
6d30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6d40: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
6d50: 61 74 65 73 0a 23 20 74 6f 20 66 61 6c 73 65 20  ates.# to false 
6d60: 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
6d70: 6d 20 74 68 65 20 64 61 74 61 73 65 74 20 62 65  m the dataset be
6d80: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
6d90: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
6da0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e  st e_select-3.1.
6db0: 31 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f  1 { SELECT k FRO
6dc0: 4d 20 78 31 20 57 48 45 52 45 20 78 20 7d 20 20  M x1 WHERE x }  
6dd0: 20 20 20 20 20 20 20 7b 33 7d 0a 64 6f 5f 65 78         {3}.do_ex
6de0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
6df0: 65 63 74 2d 33 2e 31 2e 32 20 7b 20 53 45 4c 45  ect-3.1.2 { SELE
6e00: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45  CT k FROM x1 WHE
6e10: 52 45 20 79 20 7d 20 20 20 20 20 20 20 20 20 7b  RE y }         {
6e20: 33 20 35 20 36 7d 0a 64 6f 5f 65 78 65 63 73 71  3 5 6}.do_execsq
6e30: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
6e40: 33 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 6b  3.1.3 { SELECT k
6e50: 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 7a   FROM x1 WHERE z
6e60: 20 7d 20 20 20 20 20 20 20 20 20 7b 31 20 32 20   }         {1 2 
6e70: 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  6}.do_execsql_te
6e80: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e  st e_select-3.1.
6e90: 34 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f  4 { SELECT k FRO
6ea0: 4d 20 78 31 20 57 48 45 52 45 20 27 31 27 7c 7c  M x1 WHERE '1'||
6eb0: 7a 20 20 20 20 7d 20 7b 31 20 32 20 34 20 36 7d  z    } {1 2 4 6}
6ec0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6ed0: 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e 35 20   e_select-3.1.5 
6ee0: 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20  { SELECT k FROM 
6ef0: 78 31 20 57 48 45 52 45 20 78 20 49 53 20 4e 55  x1 WHERE x IS NU
6f00: 4c 4c 20 7d 20 7b 34 20 35 7d 0a 64 6f 5f 65 78  LL } {4 5}.do_ex
6f10: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
6f20: 65 63 74 2d 33 2e 31 2e 36 20 7b 20 53 45 4c 45  ect-3.1.6 { SELE
6f30: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45  CT k FROM x1 WHE
6f40: 52 45 20 7a 20 2d 20 37 38 2e 34 33 20 7d 20 7b  RE z - 78.43 } {
6f50: 32 20 34 20 36 7d 0a 0a 64 6f 5f 65 78 65 63 73  2 4 6}..do_execs
6f60: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
6f70: 2d 33 2e 32 2e 31 61 20 7b 0a 20 20 53 45 4c 45  -3.2.1a {.  SELE
6f80: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4c 45 46  CT k FROM x1 LEF
6f90: 54 20 4a 4f 49 4e 20 78 32 20 55 53 49 4e 47 28  T JOIN x2 USING(
6fa0: 6b 29 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  k).} {1 2 3 4 5 
6fb0: 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  6}.do_execsql_te
6fc0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e  st e_select-3.2.
6fd0: 31 62 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20  1b {.  SELECT k 
6fe0: 46 52 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49  FROM x1 LEFT JOI
6ff0: 4e 20 78 32 20 55 53 49 4e 47 28 6b 29 20 57 48  N x2 USING(k) WH
7000: 45 52 45 20 78 32 2e 6b 0a 7d 20 7b 31 20 33 20  ERE x2.k.} {1 3 
7010: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
7020: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e  st e_select-3.2.
7030: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20 46  2 {.  SELECT k F
7040: 52 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM x1 LEFT JOIN
7050: 20 78 32 20 55 53 49 4e 47 28 6b 29 20 57 48 45   x2 USING(k) WHE
7060: 52 45 20 78 32 2e 6b 20 49 53 20 4e 55 4c 4c 0a  RE x2.k IS NULL.
7070: 7d 20 7b 32 20 34 20 36 7d 0a 0a 64 6f 5f 65 78  } {2 4 6}..do_ex
7080: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
7090: 65 63 74 2d 33 2e 32 2e 33 20 7b 0a 20 20 53 45  ect-3.2.3 {.  SE
70a0: 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4e  LECT k FROM x1 N
70b0: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 78 32 20 57  ATURAL JOIN x2 W
70c0: 48 45 52 45 20 78 32 2e 6b 0a 7d 20 7b 33 7d 0a  HERE x2.k.} {3}.
70d0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
70e0: 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e 34 20 7b  e_select-3.2.4 {
70f0: 0a 20 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d  .  SELECT k FROM
7100: 20 78 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   x1 NATURAL JOIN
7110: 20 78 32 20 57 48 45 52 45 20 78 32 2e 6b 2d 33   x2 WHERE x2.k-3
7120: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7170: 2d 0a 23 20 54 65 73 74 73 20 62 65 6c 6f 77 20  -.# Tests below 
7180: 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 66  this point are f
7190: 6f 63 75 73 65 64 20 6f 6e 20 76 65 72 69 66 79  ocused on verify
71a0: 69 6e 67 20 74 68 65 20 74 65 73 74 61 62 6c 65  ing the testable
71b0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 23 20 72 65   statements.# re
71c0: 6c 61 74 65 64 20 74 6f 20 63 61 63 75 6c 61 74  lated to caculat
71d0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 72  ing the result r
71e0: 6f 77 73 20 6f 66 20 61 20 73 69 6d 70 6c 65 20  ows of a simple 
71f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7200: 2e 0a 23 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  ..#..drop_all_ta
7210: 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  bles.do_execsql_
7220: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e  test e_select-4.
7230: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
7240: 4c 45 20 7a 31 28 61 2c 20 62 2c 20 63 29 3b 0a  LE z1(a, b, c);.
7250: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
7260: 32 28 64 2c 20 65 29 3b 0a 20 20 43 52 45 41 54  2(d, e);.  CREAT
7270: 45 20 54 41 42 4c 45 20 7a 33 28 61 2c 20 62 29  E TABLE z3(a, b)
7280: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
7290: 20 7a 31 20 56 41 4c 55 45 53 28 35 31 2e 36 35   z1 VALUES(51.65
72a0: 2c 20 2d 35 39 2e 35 38 2c 20 27 62 65 6c 66 72  , -59.58, 'belfr
72b0: 69 65 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ies');.  INSERT 
72c0: 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 2d  INTO z1 VALUES(-
72d0: 35 2c 20 4e 55 4c 4c 2c 20 37 35 29 3b 0a 20 20  5, NULL, 75);.  
72e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20 56  INSERT INTO z1 V
72f0: 41 4c 55 45 53 28 2d 32 2e 32 2c 20 2d 32 33 2e  ALUES(-2.2, -23.
7300: 31 38 2c 20 27 73 75 69 74 65 72 73 27 29 3b 0a  18, 'suiters');.
7310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31    INSERT INTO z1
7320: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 36 37   VALUES(NULL, 67
7330: 2c 20 27 71 75 61 72 74 65 74 73 27 29 3b 0a 20  , 'quartets');. 
7340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20   INSERT INTO z1 
7350: 56 41 4c 55 45 53 28 2d 31 2e 30 34 2c 20 2d 33  VALUES(-1.04, -3
7360: 32 2e 33 2c 20 27 61 73 70 65 6e 27 29 3b 0a 20  2.3, 'aspen');. 
7370: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20   INSERT INTO z1 
7380: 56 41 4c 55 45 53 28 36 33 2c 20 27 62 6f 72 6e  VALUES(63, 'born
7390: 27 2c 20 2d 32 36 29 3b 0a 0a 20 20 49 4e 53 45  ', -26);..  INSE
73a0: 52 54 20 49 4e 54 4f 20 7a 32 20 56 41 4c 55 45  RT INTO z2 VALUE
73b0: 53 28 4e 55 4c 4c 2c 20 32 31 29 3b 0a 20 20 49  S(NULL, 21);.  I
73c0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 32 20 56 41  NSERT INTO z2 VA
73d0: 4c 55 45 53 28 33 36 2c 20 36 29 3b 0a 0a 20 20  LUES(36, 6);..  
73e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 33 20 56  INSERT INTO z3 V
73f0: 41 4c 55 45 53 28 27 73 75 62 73 69 73 74 65 6e  ALUES('subsisten
7400: 63 65 27 2c 20 27 67 61 75 7a 65 27 29 3b 0a 20  ce', 'gauze');. 
7410: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 33 20   INSERT INTO z3 
7420: 56 41 4c 55 45 53 28 34 39 2e 31 37 2c 20 2d 36  VALUES(49.17, -6
7430: 37 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  7);.} {}..# EVID
7440: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 33 32 37  ENCE-OF: R-36327
7450: 2d 31 37 32 32 34 20 49 66 20 61 20 72 65 73 75  -17224 If a resu
7460: 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  lt expression is
7470: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 23 20 65   the special.# e
7480: 78 70 72 65 73 73 69 6f 6e 20 22 2a 22 20 74 68  xpression "*" th
7490: 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  en all columns i
74a0: 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61  n the input data
74b0: 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64   are substituted
74c0: 20 66 6f 72 0a 23 20 74 68 61 74 20 6f 6e 65 20   for.# that one 
74d0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
74e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
74f0: 33 36 39 33 2d 33 30 35 32 32 20 49 66 20 74 68  3693-30522 If th
7500: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7510: 74 68 65 20 61 6c 69 61 73 20 6f 66 20 61 20 74  the alias of a t
7520: 61 62 6c 65 0a 23 20 6f 72 20 73 75 62 71 75 65  able.# or subque
7530: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
7540: 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 65 64 20 62  lause followed b
7550: 79 20 22 2e 2a 22 20 74 68 65 6e 20 61 6c 6c 20  y ".*" then all 
7560: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 23 20 74  columns from.# t
7570: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 6f  he named table o
7580: 72 20 73 75 62 71 75 65 72 79 20 61 72 65 20 73  r subquery are s
7590: 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20 74  ubstituted for t
75a0: 68 65 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73  he single expres
75b0: 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  sion..#.do_selec
75c0: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
75d0: 2d 34 2e 31 20 7b 0a 20 20 31 20 20 22 53 45 4c  -4.1 {.  1  "SEL
75e0: 45 43 54 20 2a 20 46 52 4f 4d 20 7a 31 20 4c 49  ECT * FROM z1 LI
75f0: 4d 49 54 20 31 22 20 20 20 20 20 20 20 20 20 20  MIT 1"          
7600: 20 20 20 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38     {51.65 -59.58
7610: 20 62 65 6c 66 72 69 65 73 7d 0a 20 20 32 20 20   belfries}.  2  
7620: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 7a  "SELECT * FROM z
7630: 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22 20 20 20  1,z2 LIMIT 1"   
7640: 20 20 20 20 20 20 20 7b 35 31 2e 36 35 20 2d 35         {51.65 -5
7650: 39 2e 35 38 20 62 65 6c 66 72 69 65 73 20 7b 7d  9.58 belfries {}
7660: 20 32 31 7d 0a 20 20 33 20 20 22 53 45 4c 45 43   21}.  3  "SELEC
7670: 54 20 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 2c 7a  T z1.* FROM z1,z
7680: 32 20 4c 49 4d 49 54 20 31 22 20 20 20 20 20 20  2 LIMIT 1"      
7690: 20 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62   {51.65 -59.58 b
76a0: 65 6c 66 72 69 65 73 7d 0a 20 20 34 20 20 22 53  elfries}.  4  "S
76b0: 45 4c 45 43 54 20 7a 32 2e 2a 20 46 52 4f 4d 20  ELECT z2.* FROM 
76c0: 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22 20 20  z1,z2 LIMIT 1"  
76d0: 20 20 20 20 20 7b 7b 7d 20 32 31 7d 0a 20 20 35       {{} 21}.  5
76e0: 20 20 22 53 45 4c 45 43 54 20 7a 32 2e 2a 2c 20    "SELECT z2.*, 
76f0: 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 2c 7a 32 20  z1.* FROM z1,z2 
7700: 4c 49 4d 49 54 20 31 22 20 7b 7b 7d 20 32 31 20  LIMIT 1" {{} 21 
7710: 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c  51.65 -59.58 bel
7720: 66 72 69 65 73 7d 0a 0a 20 20 36 20 20 22 53 45  fries}..  6  "SE
7730: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a  LECT count(*), *
7740: 20 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20   FROM z1"       
7750: 20 20 20 20 7b 36 20 36 33 20 62 6f 72 6e 20 2d      {6 63 born -
7760: 32 36 7d 0a 20 20 37 20 20 22 53 45 4c 45 43 54  26}.  7  "SELECT
7770: 20 6d 61 78 28 61 29 2c 20 2a 20 46 52 4f 4d 20   max(a), * FROM 
7780: 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20  z1"             
7790: 7b 36 33 20 36 33 20 62 6f 72 6e 20 2d 32 36 7d  {63 63 born -26}
77a0: 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20 2a 2c  .  8  "SELECT *,
77b0: 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 7a 31 22   min(a) FROM z1"
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d 35               {-5
77d0: 20 7b 7d 20 37 35 20 2d 35 7d 0a 0a 20 20 39 20   {} 75 -5}..  9 
77e0: 20 22 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f   "SELECT *,* FRO
77f0: 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22  M z1,z2 LIMIT 1"
7800: 20 7b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20   {        .     
7810: 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c  51.65 -59.58 bel
7820: 66 72 69 65 73 20 7b 7d 20 32 31 20 35 31 2e 36  fries {} 21 51.6
7830: 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65  5 -59.58 belfrie
7840: 73 20 7b 7d 20 32 31 0a 20 20 7d 0a 20 20 31 30  s {} 21.  }.  10
7850: 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a 2c 7a 31   "SELECT z1.*,z1
7860: 2e 2a 20 46 52 4f 4d 20 7a 32 2c 7a 31 20 4c 49  .* FROM z2,z1 LI
7870: 4d 49 54 20 31 22 20 7b 20 20 20 20 20 20 20 20  MIT 1" {        
7880: 0a 20 20 20 20 20 35 31 2e 36 35 20 2d 35 39 2e  .     51.65 -59.
7890: 35 38 20 62 65 6c 66 72 69 65 73 20 35 31 2e 36  58 belfries 51.6
78a0: 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72 69 65  5 -59.58 belfrie
78b0: 73 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  s.  }.}..# EVIDE
78c0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 38 36 39 2d  NCE-OF: R-61869-
78d0: 32 32 35 37 38 20 49 74 20 69 73 20 61 6e 20 65  22578 It is an e
78e0: 72 72 6f 72 20 74 6f 20 75 73 65 20 61 20 22 2a  rror to use a "*
78f0: 22 20 6f 72 20 22 61 6c 69 61 73 2e 2a 22 0a 23  " or "alias.*".#
7900: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
7910: 6e 79 20 63 6f 6e 74 65 78 74 20 6f 74 68 65 72  ny context other
7920: 20 74 68 61 6e 20 74 68 61 6e 20 61 20 72 65 73   than than a res
7930: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ult expression l
7940: 69 73 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ist..#.# EVIDENC
7950: 45 2d 4f 46 3a 20 52 2d 34 34 33 32 34 2d 34 31  E-OF: R-44324-41
7960: 31 36 36 20 49 74 20 69 73 20 61 6c 73 6f 20 61  166 It is also a
7970: 6e 20 65 72 72 6f 72 20 74 6f 20 75 73 65 20 61  n error to use a
7980: 20 22 2a 22 20 6f 72 0a 23 20 22 61 6c 69 61 73   "*" or.# "alias
7990: 2e 2a 22 20 65 78 70 72 65 73 73 69 6f 6e 20 69  .*" expression i
79a0: 6e 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  n a simple SELEC
79b0: 54 20 71 75 65 72 79 20 74 68 61 74 20 64 6f 65  T query that doe
79c0: 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 23 20 46  s not have a.# F
79d0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 23 0a 66 6f  ROM clause..#.fo
79e0: 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74  reach {tn select
79f0: 20 65 72 72 7d 20 7b 0a 20 20 31 2e 31 20 20 22   err} {.  1.1  "
7a00: 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
7a10: 52 4f 4d 20 7a 31 20 57 48 45 52 45 20 2a 22 20  ROM z1 WHERE *" 
7a20: 20 20 20 7b 6e 65 61 72 20 22 2a 22 3a 20 73 79     {near "*": sy
7a30: 6e 74 61 78 20 65 72 72 6f 72 7d 0a 20 20 31 2e  ntax error}.  1.
7a40: 32 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 2c  2  "SELECT a, b,
7a50: 20 63 20 46 52 4f 4d 20 7a 31 20 47 52 4f 55 50   c FROM z1 GROUP
7a60: 20 42 59 20 2a 22 20 7b 6e 65 61 72 20 22 2a 22   BY *" {near "*"
7a70: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a  : syntax error}.
7a80: 20 20 31 2e 33 20 20 22 53 45 4c 45 43 54 20 31    1.3  "SELECT 1
7a90: 20 2b 20 2a 20 46 52 4f 4d 20 7a 31 22 20 20 20   + * FROM z1"   
7aa0: 20 20 20 20 20 20 20 20 20 20 20 7b 6e 65 61 72             {near
7ab0: 20 22 2a 22 3a 20 73 79 6e 74 61 78 20 65 72 72   "*": syntax err
7ac0: 6f 72 7d 0a 20 20 31 2e 34 20 20 22 53 45 4c 45  or}.  1.4  "SELE
7ad0: 43 54 20 2a 20 2b 20 31 20 46 52 4f 4d 20 7a 31  CT * + 1 FROM z1
7ae0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  "              {
7af0: 6e 65 61 72 20 22 2b 22 3a 20 73 79 6e 74 61 78  near "+": syntax
7b00: 20 65 72 72 6f 72 7d 0a 0a 20 20 32 2e 31 20 22   error}..  2.1 "
7b10: 53 45 4c 45 43 54 20 2a 22 20 7b 6e 6f 20 74 61  SELECT *" {no ta
7b20: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 7d 0a  bles specified}.
7b30: 20 20 32 2e 32 20 22 53 45 4c 45 43 54 20 2a 20    2.2 "SELECT * 
7b40: 57 48 45 52 45 20 31 22 20 7b 6e 6f 20 74 61 62  WHERE 1" {no tab
7b50: 6c 65 73 20 73 70 65 63 69 66 69 65 64 7d 0a 20  les specified}. 
7b60: 20 32 2e 33 20 22 53 45 4c 45 43 54 20 2a 20 57   2.3 "SELECT * W
7b70: 48 45 52 45 20 30 22 20 7b 6e 6f 20 74 61 62 6c  HERE 0" {no tabl
7b80: 65 73 20 73 70 65 63 69 66 69 65 64 7d 0a 20 20  es specified}.  
7b90: 32 2e 34 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  2.4 "SELECT coun
7ba0: 74 28 2a 29 2c 20 2a 22 20 7b 6e 6f 20 74 61 62  t(*), *" {no tab
7bb0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 7d 0a 7d  les specified}.}
7bc0: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
7bd0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34  _test e_select-4
7be0: 2e 32 2e 24 74 6e 20 24 73 65 6c 65 63 74 20 5b  .2.$tn $select [
7bf0: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a 0a  list 1 $err].}..
7c00: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7c10: 2d 30 38 36 36 39 2d 32 32 33 39 37 20 54 68 65  -08669-22397 The
7c20: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7c30: 6e 73 20 69 6e 20 74 68 65 20 72 6f 77 73 20 72  ns in the rows r
7c40: 65 74 75 72 6e 65 64 0a 23 20 62 79 20 61 20 73  eturned.# by a s
7c50: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
7c60: 74 65 6d 65 6e 74 20 69 73 20 65 71 75 61 6c 20  tement is equal 
7c70: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7c80: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a   expressions in.
7c90: 23 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70  # the result exp
7ca0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 61 66 74  ression list aft
7cb0: 65 72 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  er substitution 
7cc0: 6f 66 20 2a 20 61 6e 64 20 61 6c 69 61 73 2e 2a  of * and alias.*
7cd0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  .# expressions..
7ce0: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  #.foreach {tn se
7cf0: 6c 65 63 74 20 6e 43 6f 6c 7d 20 7b 0a 20 20 31  lect nCol} {.  1
7d00: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
7d10: 4d 20 7a 31 22 20 20 20 33 0a 20 20 32 20 20 20  M z1"   3.  2   
7d20: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 7a  "SELECT * FROM z
7d30: 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 7a  1 NATURAL JOIN z
7d40: 33 22 20 20 20 20 20 20 20 20 20 20 20 20 33 0a  3"            3.
7d50: 20 20 33 20 20 20 22 53 45 4c 45 43 54 20 7a 31    3   "SELECT z1
7d60: 2e 2a 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52  .* FROM z1 NATUR
7d70: 41 4c 20 4a 4f 49 4e 20 7a 33 22 20 20 20 20 20  AL JOIN z3"     
7d80: 20 20 20 20 33 0a 20 20 34 20 20 20 22 53 45 4c      3.  4   "SEL
7d90: 45 43 54 20 7a 33 2e 2a 20 46 52 4f 4d 20 7a 31  ECT z3.* FROM z1
7da0: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 7a 33   NATURAL JOIN z3
7db0: 22 20 20 20 20 20 20 20 20 20 32 0a 20 20 35 20  "         2.  5 
7dc0: 20 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a 2c 20    "SELECT z1.*, 
7dd0: 7a 33 2e 2a 20 46 52 4f 4d 20 7a 31 20 4e 41 54  z3.* FROM z1 NAT
7de0: 55 52 41 4c 20 4a 4f 49 4e 20 7a 33 22 20 20 20  URAL JOIN z3"   
7df0: 35 0a 20 20 36 20 20 20 22 53 45 4c 45 43 54 20  5.  6   "SELECT 
7e00: 31 2c 20 32 2c 20 7a 31 2e 2a 20 46 52 4f 4d 20  1, 2, z1.* FROM 
7e10: 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20  z1"             
7e20: 20 20 20 20 20 20 35 0a 20 20 37 20 20 20 22 53        5.  7   "S
7e30: 45 4c 45 43 54 20 61 2c 20 2a 2c 20 62 2c 20 63  ELECT a, *, b, c
7e40: 20 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20   FROM z1"       
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 36 0a 7d 20              6.} 
7e60: 7b 0a 20 20 73 65 74 20 3a 3a 73 74 6d 74 20 5b  {.  set ::stmt [
7e70: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7e80: 76 32 20 64 62 20 24 73 65 6c 65 63 74 20 2d 31  v2 db $select -1
7e90: 20 44 55 4d 4d 59 5d 0a 20 20 64 6f 5f 74 65 73   DUMMY].  do_tes
7ea0: 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 33 2e 24  t e_select-4.3.$
7eb0: 74 6e 20 7b 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tn { sqlite3_col
7ec0: 75 6d 6e 5f 63 6f 75 6e 74 20 24 3a 3a 73 74 6d  umn_count $::stm
7ed0: 74 20 7d 20 24 6e 43 6f 6c 0a 20 20 73 71 6c 69  t } $nCol.  sqli
7ee0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a  te3_finalize $::
7ef0: 73 74 6d 74 0a 7d 0a 0a 0a 0a 23 20 49 6e 20 6c  stmt.}....# In l
7f00: 61 6e 67 5f 73 65 6c 65 63 74 2e 68 74 6d 6c 2c  ang_select.html,
7f10: 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
7f20: 20 71 75 65 72 79 20 69 73 20 64 65 66 69 6e 65   query is define
7f30: 64 20 61 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  d as any simple 
7f40: 53 45 4c 45 43 54 0a 23 20 74 68 61 74 20 68 61  SELECT.# that ha
7f50: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
7f60: 61 75 73 65 20 61 6e 64 20 6e 6f 20 61 67 67 72  ause and no aggr
7f70: 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  egate expression
7f80: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  s in the result.
7f90: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  # expression lis
7fa0: 74 2e 20 4f 74 68 65 72 20 71 75 65 72 69 65 73  t. Other queries
7fb0: 20 61 72 65 20 61 67 67 72 65 67 61 74 65 20 71   are aggregate q
7fc0: 75 65 72 69 65 73 2e 20 54 65 73 74 20 63 61 73  ueries. Test cas
7fd0: 65 73 0a 23 20 65 5f 73 65 6c 65 63 74 2d 34 2e  es.# e_select-4.
7fe0: 34 2e 2a 20 74 68 72 6f 75 67 68 20 65 5f 73 65  4.* through e_se
7ff0: 6c 65 63 74 2d 34 2e 31 32 2e 2a 2c 20 69 6e 63  lect-4.12.*, inc
8000: 6c 75 73 69 76 65 2c 20 77 68 69 63 68 20 74 65  lusive, which te
8010: 73 74 20 74 68 65 20 70 61 72 74 20 6f 66 0a 23  st the part of.#
8020: 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 74   simple SELECT t
8030: 68 61 74 20 69 73 20 64 69 66 66 65 72 65 6e 74  hat is different
8040: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 61   for aggregate a
8050: 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
8060: 20 71 75 65 72 69 65 73 0a 23 20 76 65 72 69 66   queries.# verif
8070: 79 20 28 69 6e 20 61 20 77 61 79 29 20 74 68 61  y (in a way) tha
8080: 74 20 74 68 65 73 65 20 64 65 66 69 6e 69 74 69  t these definiti
8090: 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69 73 74 65  ons are consiste
80a0: 6e 74 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  nt:.#.# EVIDENCE
80b0: 2d 4f 46 3a 20 52 2d 32 30 36 33 37 2d 34 33 34  -OF: R-20637-434
80c0: 36 33 20 41 20 73 69 6d 70 6c 65 20 53 45 4c 45  63 A simple SELE
80d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
80e0: 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20 71  an aggregate.# q
80f0: 75 65 72 79 20 69 66 20 69 74 20 63 6f 6e 74 61  uery if it conta
8100: 69 6e 73 20 65 69 74 68 65 72 20 61 20 47 52 4f  ins either a GRO
8110: 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  UP BY clause or 
8120: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 67 67 72  one or more aggr
8130: 65 67 61 74 65 0a 23 20 66 75 6e 63 74 69 6f 6e  egate.# function
8140: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
8150: 73 65 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  set..#.# EVIDENC
8160: 45 2d 4f 46 3a 20 52 2d 32 33 31 35 35 2d 35 35  E-OF: R-23155-55
8170: 35 39 37 20 4f 74 68 65 72 77 69 73 65 2c 20 69  597 Otherwise, i
8180: 66 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  f a simple SELEC
8190: 54 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 23 20  T contains no.# 
81a0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
81b0: 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
81c0: 59 20 63 6c 61 75 73 65 2c 20 69 74 20 69 73 20  Y clause, it is 
81d0: 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
81e0: 71 75 65 72 79 2e 0a 23 0a 0a 23 20 45 56 49 44  query..#..# EVID
81f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 30 35 30  ENCE-OF: R-44050
8200: 2d 34 37 33 36 32 20 49 66 20 74 68 65 20 53 45  -47362 If the SE
8210: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
8220: 73 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  s a non-aggregat
8230: 65 0a 23 20 71 75 65 72 79 2c 20 74 68 65 6e 20  e.# query, then 
8240: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
8250: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 65 78  in the result ex
8260: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 73  pression list is
8270: 20 65 76 61 6c 75 61 74 65 64 0a 23 20 66 6f 72   evaluated.# for
8280: 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
8290: 20 64 61 74 61 73 65 74 20 66 69 6c 74 65 72 65   dataset filtere
82a0: 64 20 62 79 20 74 68 65 20 57 48 45 52 45 20 63  d by the WHERE c
82b0: 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 73 65 6c 65  lause..#.do_sele
82c0: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
82d0: 74 2d 34 2e 34 20 7b 0a 20 20 31 20 22 53 45 4c  t-4.4 {.  1 "SEL
82e0: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 7a 31  ECT a, b FROM z1
82f0: 22 0a 20 20 20 20 7b 35 31 2e 36 35 20 2d 35 39  ".    {51.65 -59
8300: 2e 35 38 20 2d 35 20 7b 7d 20 2d 32 2e 32 20 2d  .58 -5 {} -2.2 -
8310: 32 33 2e 31 38 20 7b 7d 20 36 37 20 2d 31 2e 30  23.18 {} 67 -1.0
8320: 34 20 2d 33 32 2e 33 20 36 33 20 62 6f 72 6e 7d  4 -32.3 63 born}
8330: 0a 0a 20 20 32 20 22 53 45 4c 45 43 54 20 61 20  ..  2 "SELECT a 
8340: 49 53 20 4e 55 4c 4c 2c 20 62 2b 31 2c 20 2a 20  IS NULL, b+1, * 
8350: 46 52 4f 4d 20 7a 31 22 20 7b 0a 20 20 20 20 20  FROM z1" {.     
8360: 20 20 20 30 20 2d 35 38 2e 35 38 20 20 20 35 31     0 -58.58   51
8370: 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66 72  .65 -59.58 belfr
8380: 69 65 73 0a 20 20 20 20 20 20 20 20 30 20 7b 7d  ies.        0 {}
8390: 20 20 20 20 20 20 20 2d 35 20 7b 7d 20 37 35 20         -5 {} 75 
83a0: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
83b0: 20 20 20 20 30 20 2d 32 32 2e 31 38 20 20 20 2d      0 -22.18   -
83c0: 32 2e 32 20 2d 32 33 2e 31 38 20 73 75 69 74 65  2.2 -23.18 suite
83d0: 72 73 0a 20 20 20 20 20 20 20 20 31 20 36 38 20  rs.        1 68 
83e0: 20 20 20 20 20 20 7b 7d 20 36 37 20 71 75 61 72        {} 67 quar
83f0: 74 65 74 73 20 20 20 20 0a 20 20 20 20 20 20 20  tets    .       
8400: 20 30 20 2d 33 31 2e 33 20 20 20 20 2d 31 2e 30   0 -31.3    -1.0
8410: 34 20 2d 33 32 2e 33 20 61 73 70 65 6e 0a 20 20  4 -32.3 aspen.  
8420: 20 20 20 20 20 20 30 20 31 20 20 20 20 20 20 20        0 1       
8430: 20 36 33 20 62 6f 72 6e 20 2d 32 36 0a 20 20 7d   63 born -26.  }
8440: 0a 0a 20 20 33 20 22 53 45 4c 45 43 54 20 33 32  ..  3 "SELECT 32
8450: 2a 33 32 2c 20 64 7c 7c 65 20 46 52 4f 4d 20 7a  *32, d||e FROM z
8460: 32 22 20 7b 31 30 32 34 20 7b 7d 20 31 30 32 34  2" {1024 {} 1024
8470: 20 33 36 36 7d 0a 7d 0a 0a 0a 23 20 54 65 73 74   366}.}...# Test
8480: 20 63 61 73 65 73 20 65 5f 73 65 6c 65 63 74 2d   cases e_select-
8490: 34 2e 35 2e 2a 20 61 6e 64 20 65 5f 73 65 6c 65  4.5.* and e_sele
84a0: 63 74 2d 34 2e 36 2e 2a 20 74 6f 67 65 74 68 65  ct-4.6.* togethe
84b0: 72 20 73 68 6f 77 20 74 68 61 74 3a 0a 23 0a 23  r show that:.#.#
84c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
84d0: 35 31 39 38 38 2d 30 31 31 32 34 20 54 68 65 20  51988-01124 The 
84e0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 72 65  single row of re
84f0: 73 75 6c 74 2d 73 65 74 20 64 61 74 61 20 63 72  sult-set data cr
8500: 65 61 74 65 64 0a 23 20 62 79 20 65 76 61 6c 75  eated.# by evalu
8510: 61 74 69 6e 67 20 74 68 65 20 61 67 67 72 65 67  ating the aggreg
8520: 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72  ate and non-aggr
8530: 65 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  egate expression
8540: 73 20 69 6e 20 74 68 65 0a 23 20 72 65 73 75 6c  s in the.# resul
8550: 74 2d 73 65 74 20 66 6f 72 6d 73 20 74 68 65 20  t-set forms the 
8560: 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 61 67 67  result of an agg
8570: 72 65 67 61 74 65 20 71 75 65 72 79 20 77 69 74  regate query wit
8580: 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 0a  hout a GROUP BY.
8590: 23 20 63 6c 61 75 73 65 2e 0a 23 0a 0a 23 20 45  # clause..#..# E
85a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
85b0: 36 32 39 2d 32 35 32 35 33 20 49 66 20 74 68 65  629-25253 If the
85c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
85d0: 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
85e0: 65 0a 23 20 71 75 65 72 79 20 77 69 74 68 6f 75  e.# query withou
85f0: 74 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  t a GROUP BY cla
8600: 75 73 65 2c 20 74 68 65 6e 20 65 61 63 68 20 61  use, then each a
8610: 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
8620: 69 6f 6e 20 69 6e 20 74 68 65 0a 23 20 72 65 73  ion in the.# res
8630: 75 6c 74 2d 73 65 74 20 69 73 20 65 76 61 6c 75  ult-set is evalu
8640: 61 74 65 64 20 6f 6e 63 65 20 61 63 72 6f 73 73  ated once across
8650: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8660: 73 65 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  set..#.do_select
8670: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
8680: 34 2e 35 20 7b 0a 20 20 31 20 22 53 45 4c 45 43  4.5 {.  1 "SELEC
8690: 54 20 63 6f 75 6e 74 28 61 29 2c 20 6d 61 78 28  T count(a), max(
86a0: 61 29 2c 20 63 6f 75 6e 74 28 62 29 2c 20 6d 61  a), count(b), ma
86b0: 78 28 62 29 20 46 52 4f 4d 20 7a 31 22 20 20 20  x(b) FROM z1"   
86c0: 20 20 20 7b 35 20 36 33 20 35 20 62 6f 72 6e 7d     {5 63 5 born}
86d0: 0a 20 20 32 20 22 53 45 4c 45 43 54 20 63 6f 75  .  2 "SELECT cou
86e0: 6e 74 28 2a 29 2c 20 6d 61 78 28 31 29 22 20 20  nt(*), max(1)"  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
8710: 20 31 7d 0a 0a 20 20 33 20 22 53 45 4c 45 43 54   1}..  3 "SELECT
8720: 20 73 75 6d 28 62 2b 31 29 20 46 52 4f 4d 20 7a   sum(b+1) FROM z
8730: 31 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a  1 NATURAL LEFT J
8740: 4f 49 4e 20 7a 33 22 20 20 20 20 20 20 20 20 20  OIN z3"         
8750: 20 20 7b 2d 34 33 2e 30 36 7d 0a 20 20 34 20 22    {-43.06}.  4 "
8760: 53 45 4c 45 43 54 20 73 75 6d 28 62 2b 32 29 20  SELECT sum(b+2) 
8770: 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20  FROM z1 NATURAL 
8780: 4c 45 46 54 20 4a 4f 49 4e 20 7a 33 22 20 20 20  LEFT JOIN z3"   
8790: 20 20 20 20 20 20 20 20 7b 2d 33 38 2e 30 36 7d          {-38.06}
87a0: 0a 20 20 35 20 22 53 45 4c 45 43 54 20 73 75 6d  .  5 "SELECT sum
87b0: 28 62 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 29 20  (b IS NOT NULL) 
87c0: 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20  FROM z1 NATURAL 
87d0: 4c 45 46 54 20 4a 4f 49 4e 20 7a 33 22 20 7b 35  LEFT JOIN z3" {5
87e0: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
87f0: 4f 46 3a 20 52 2d 32 36 36 38 34 2d 34 30 35 37  OF: R-26684-4057
8800: 36 20 45 61 63 68 20 6e 6f 6e 2d 61 67 67 72 65  6 Each non-aggre
8810: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  gate expression 
8820: 69 6e 20 74 68 65 0a 23 20 72 65 73 75 6c 74 2d  in the.# result-
8830: 73 65 74 20 69 73 20 65 76 61 6c 75 61 74 65 64  set is evaluated
8840: 20 6f 6e 63 65 20 66 6f 72 20 61 6e 20 61 72 62   once for an arb
8850: 69 74 72 61 72 69 6c 79 20 73 65 6c 65 63 74 65  itrarily selecte
8860: 64 20 72 6f 77 20 6f 66 20 74 68 65 0a 23 20 64  d row of the.# d
8870: 61 74 61 73 65 74 2e 0a 23 0a 23 20 45 56 49 44  ataset..#.# EVID
8880: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 39 39 34  ENCE-OF: R-27994
8890: 2d 36 30 33 37 36 20 54 68 65 20 73 61 6d 65 20  -60376 The same 
88a0: 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65  arbitrarily sele
88b0: 63 74 65 64 20 72 6f 77 20 69 73 20 75 73 65 64  cted row is used
88c0: 0a 23 20 66 6f 72 20 65 61 63 68 20 6e 6f 6e 2d  .# for each non-
88d0: 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
88e0: 73 69 6f 6e 2e 0a 23 0a 23 20 20 20 4e 6f 74 65  sion..#.#   Note
88f0: 3a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  : The results of
8900: 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 71 75 65   many of the que
8910: 72 69 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f  ries in this blo
8920: 63 6b 20 6f 66 20 74 65 73 74 73 20 61 72 65 0a  ck of tests are.
8930: 23 20 20 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  #   technically 
8940: 75 6e 64 65 66 69 6e 65 64 2c 20 61 73 20 74 68  undefined, as th
8950: 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
8960: 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69 66 79  does not specify
8970: 20 77 68 69 63 68 20 72 6f 77 0a 23 20 20 20 53   which row.#   S
8980: 51 4c 69 74 65 20 77 69 6c 6c 20 61 72 62 69 74  QLite will arbit
8990: 72 61 72 69 6c 79 20 73 65 6c 65 63 74 20 74 6f  rarily select to
89a0: 20 75 73 65 20 66 6f 72 20 74 68 65 20 65 76 61   use for the eva
89b0: 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 23  luation of the.#
89c0: 20 20 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65     non-aggregate
89d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a   expressions..#.
89e0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
89f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8a00: 65 5f 73 65 6c 65 63 74 2d 34 2e 36 2e 30 20 7b  e_select-4.6.0 {
8a10: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
8a20: 61 31 28 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b  a1(one PRIMARY K
8a30: 45 59 2c 20 74 77 6f 29 3b 0a 20 20 49 4e 53 45  EY, two);.  INSE
8a40: 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c 55 45  RT INTO a1 VALUE
8a50: 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  S(1, 1);.  INSER
8a60: 54 20 49 4e 54 4f 20 61 31 20 56 41 4c 55 45 53  T INTO a1 VALUES
8a70: 28 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54  (2, 3);.  INSERT
8a80: 20 49 4e 54 4f 20 61 31 20 56 41 4c 55 45 53 28   INTO a1 VALUES(
8a90: 33 2c 20 36 29 3b 0a 20 20 49 4e 53 45 52 54 20  3, 6);.  INSERT 
8aa0: 49 4e 54 4f 20 61 31 20 56 41 4c 55 45 53 28 34  INTO a1 VALUES(4
8ab0: 2c 20 31 30 29 3b 0a 0a 20 20 43 52 45 41 54 45  , 10);..  CREATE
8ac0: 20 54 41 42 4c 45 20 61 32 28 6f 6e 65 20 50 52   TABLE a2(one PR
8ad0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 72 65 65  IMARY KEY, three
8ae0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
8af0: 20 61 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29   a2 VALUES(1, 1)
8b00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
8b10: 61 32 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b  a2 VALUES(3, 2);
8b20: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
8b30: 32 20 56 41 4c 55 45 53 28 36 2c 20 33 29 3b 0a  2 VALUES(6, 3);.
8b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 32    INSERT INTO a2
8b50: 20 56 41 4c 55 45 53 28 31 30 2c 20 34 29 3b 0a   VALUES(10, 4);.
8b60: 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  } {}.do_select_t
8b70: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e  ests e_select-4.
8b80: 36 20 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20  6 {.  1 "SELECT 
8b90: 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f 75 6e 74 28  one, two, count(
8ba0: 2a 29 20 46 52 4f 4d 20 61 31 22 20 20 20 20 20  *) FROM a1"     
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 7b 34 20 31 30 20 34 7d 20 0a 20 20 32     {4 10 4} .  2
8bd0: 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20 74 77   "SELECT one, tw
8be0: 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  o, count(*) FROM
8bf0: 20 61 31 20 57 48 45 52 45 20 6f 6e 65 3c 33 22   a1 WHERE one<3"
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 32 20 33              {2 3
8c10: 20 32 7d 20 0a 20 20 33 20 22 53 45 4c 45 43 54   2} .  3 "SELECT
8c20: 20 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f 75 6e 74   one, two, count
8c30: 28 2a 29 20 46 52 4f 4d 20 61 31 20 57 48 45 52  (*) FROM a1 WHER
8c40: 45 20 6f 6e 65 3e 33 22 20 20 20 20 20 20 20 20  E one>3"        
8c50: 20 20 20 20 7b 34 20 31 30 20 31 7d 20 0a 20 20      {4 10 1} .  
8c60: 34 20 22 53 45 4c 45 43 54 20 2a 2c 20 63 6f 75  4 "SELECT *, cou
8c70: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 20 4a 4f  nt(*) FROM a1 JO
8c80: 49 4e 20 61 32 22 20 20 20 20 20 20 20 20 20 20  IN a2"          
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 34 20               {4 
8ca0: 31 30 20 31 30 20 34 20 31 36 7d 20 0a 20 20 35  10 10 4 16} .  5
8cb0: 20 22 53 45 4c 45 43 54 20 2a 2c 20 73 75 6d 28   "SELECT *, sum(
8cc0: 74 68 72 65 65 29 20 46 52 4f 4d 20 61 31 20 4e  three) FROM a1 N
8cd0: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 61 32 22 20  ATURAL JOIN a2" 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 33 20 36              {3 6
8cf0: 20 32 20 33 7d 0a 20 20 36 20 22 53 45 4c 45 43   2 3}.  6 "SELEC
8d00: 54 20 2a 2c 20 73 75 6d 28 74 68 72 65 65 29 20  T *, sum(three) 
8d10: 46 52 4f 4d 20 61 31 20 4e 41 54 55 52 41 4c 20  FROM a1 NATURAL 
8d20: 4a 4f 49 4e 20 61 32 22 20 20 20 20 20 20 20 20  JOIN a2"        
8d30: 20 20 20 20 20 7b 33 20 36 20 32 20 33 7d 0a 20       {3 6 2 3}. 
8d40: 20 37 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70   7 "SELECT group
8d50: 5f 63 6f 6e 63 61 74 28 74 68 72 65 65 2c 20 27  _concat(three, '
8d60: 27 29 2c 20 61 31 2e 2a 20 46 52 4f 4d 20 61 31  '), a1.* FROM a1
8d70: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 61 32   NATURAL JOIN a2
8d80: 22 20 7b 31 32 20 33 20 36 7d 0a 7d 0a 0a 23 20  " {12 3 6}.}..# 
8d90: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
8da0: 34 34 38 36 2d 30 37 32 36 36 20 4f 72 2c 20 69  4486-07266 Or, i
8db0: 66 20 74 68 65 20 64 61 74 61 73 65 74 20 63 6f  f the dataset co
8dc0: 6e 74 61 69 6e 73 20 7a 65 72 6f 20 72 6f 77 73  ntains zero rows
8dd0: 2c 20 74 68 65 6e 0a 23 20 65 61 63 68 20 6e 6f  , then.# each no
8de0: 6e 2d 61 67 67 72 65 67 61 74 65 20 65 78 70 72  n-aggregate expr
8df0: 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
8e00: 74 65 64 20 61 67 61 69 6e 73 74 20 61 20 72 6f  ted against a ro
8e10: 77 20 63 6f 6e 73 69 73 74 69 6e 67 0a 23 20 65  w consisting.# e
8e20: 6e 74 69 72 65 6c 79 20 6f 66 20 4e 55 4c 4c 20  ntirely of NULL 
8e30: 76 61 6c 75 65 73 2e 0a 23 0a 64 6f 5f 73 65 6c  values..#.do_sel
8e40: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
8e50: 63 74 2d 34 2e 37 20 7b 0a 20 20 31 20 20 22 53  ct-4.7 {.  1  "S
8e60: 45 4c 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20  ELECT one, two, 
8e70: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31  count(*) FROM a1
8e80: 20 57 48 45 52 45 20 30 22 20 20 20 20 20 20 20   WHERE 0"       
8e90: 20 20 20 20 7b 7b 7d 20 7b 7d 20 30 7d 0a 20 20      {{} {} 0}.  
8ea0: 32 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 74  2  "SELECT sum(t
8eb0: 77 6f 29 2c 20 2a 20 46 52 4f 4d 20 61 31 2c 20  wo), * FROM a1, 
8ec0: 61 32 20 57 48 45 52 45 20 74 68 72 65 65 3e 35  a2 WHERE three>5
8ed0: 22 20 20 20 20 20 20 20 20 7b 7b 7d 20 7b 7d 20  "        {{} {} 
8ee0: 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20 33 20 20 22  {} {} {}}.  3  "
8ef0: 53 45 4c 45 43 54 20 6d 61 78 28 6f 6e 65 29 20  SELECT max(one) 
8f00: 49 53 20 4e 55 4c 4c 2c 20 6f 6e 65 20 49 53 20  IS NULL, one IS 
8f10: 4e 55 4c 4c 2c 20 74 77 6f 20 49 53 20 4e 55 4c  NULL, two IS NUL
8f20: 4c 20 46 52 4f 4d 20 61 31 20 57 48 45 52 45 20  L FROM a1 WHERE 
8f30: 74 77 6f 3d 37 22 20 7b 0a 20 20 20 20 31 20 31  two=7" {.    1 1
8f40: 20 31 0a 20 20 7d 0a 7d 20 0a 0a 23 20 45 56 49   1.  }.} ..# EVI
8f50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 31 33  DENCE-OF: R-6413
8f60: 38 2d 32 38 37 37 34 20 41 6e 20 61 67 67 72 65  8-28774 An aggre
8f70: 67 61 74 65 20 71 75 65 72 79 20 77 69 74 68 6f  gate query witho
8f80: 75 74 20 61 20 47 52 4f 55 50 20 42 59 0a 23 20  ut a GROUP BY.# 
8f90: 63 6c 61 75 73 65 20 61 6c 77 61 79 73 20 72 65  clause always re
8fa0: 74 75 72 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e  turns exactly on
8fb0: 65 20 72 6f 77 20 6f 66 20 64 61 74 61 2c 20 65  e row of data, e
8fc0: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
8fd0: 20 7a 65 72 6f 0a 23 20 72 6f 77 73 20 6f 66 20   zero.# rows of 
8fe0: 69 6e 70 75 74 20 64 61 74 61 2e 0a 23 0a 66 6f  input data..#.fo
8ff0: 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74  reach {tn select
9000: 7d 20 7b 0a 20 20 38 2e 31 20 20 22 53 45 4c 45  } {.  8.1  "SELE
9010: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9020: 20 61 31 22 0a 20 20 38 2e 32 20 20 22 53 45 4c   a1".  8.2  "SEL
9030: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9040: 4d 20 61 31 20 57 48 45 52 45 20 30 22 0a 20 20  M a1 WHERE 0".  
9050: 38 2e 33 20 20 22 53 45 4c 45 43 54 20 63 6f 75  8.3  "SELECT cou
9060: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 20 57 48  nt(*) FROM a1 WH
9070: 45 52 45 20 31 22 0a 20 20 38 2e 34 20 20 22 53  ERE 1".  8.4  "S
9080: 45 4c 45 43 54 20 6d 61 78 28 61 31 2e 6f 6e 65  ELECT max(a1.one
9090: 29 2b 6d 69 6e 28 74 77 6f 29 2c 20 61 31 2e 6f  )+min(two), a1.o
90a0: 6e 65 2c 20 74 77 6f 2c 20 2a 20 46 52 4f 4d 20  ne, two, * FROM 
90b0: 61 31 2c 20 61 32 20 57 48 45 52 45 20 31 22 0a  a1, a2 WHERE 1".
90c0: 20 20 38 2e 35 20 20 22 53 45 4c 45 43 54 20 6d    8.5  "SELECT m
90d0: 61 78 28 61 31 2e 6f 6e 65 29 2b 6d 69 6e 28 74  ax(a1.one)+min(t
90e0: 77 6f 29 2c 20 61 31 2e 6f 6e 65 2c 20 74 77 6f  wo), a1.one, two
90f0: 2c 20 2a 20 46 52 4f 4d 20 61 31 2c 20 61 32 20  , * FROM a1, a2 
9100: 57 48 45 52 45 20 30 22 0a 7d 20 7b 0a 20 20 23  WHERE 0".} {.  #
9110: 20 53 65 74 20 24 6e 52 6f 77 20 74 6f 20 74 68   Set $nRow to th
9120: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
9130: 20 72 65 74 75 72 6e 65 64 20 62 79 20 24 73 65   returned by $se
9140: 6c 65 63 74 3a 0a 20 20 73 65 74 20 3a 3a 73 74  lect:.  set ::st
9150: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
9160: 61 72 65 5f 76 32 20 64 62 20 24 73 65 6c 65 63  are_v2 db $selec
9170: 74 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 65  t -1 DUMMY].  se
9180: 74 20 6e 52 6f 77 20 30 0a 20 20 77 68 69 6c 65  t nRow 0.  while
9190: 20 7b 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 3d   {"SQLITE_ROW" =
91a0: 3d 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20  = [sqlite3_step 
91b0: 24 3a 3a 73 74 6d 74 5d 7d 20 7b 20 69 6e 63 72  $::stmt]} { incr
91c0: 20 6e 52 6f 77 20 7d 0a 20 20 73 65 74 20 72 63   nRow }.  set rc
91d0: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   [sqlite3_finali
91e0: 7a 65 20 24 3a 3a 73 74 6d 74 5d 0a 0a 20 20 23  ze $::stmt]..  #
91f0: 20 54 65 73 74 20 74 68 61 74 20 24 6e 52 6f 77   Test that $nRow
9200: 3d 3d 31 20 61 6e 64 20 74 68 61 74 20 73 74 61  ==1 and that sta
9210: 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69 6f 6e  tement execution
9220: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
9230: 0a 20 20 23 20 28 72 63 3d 3d 53 51 4c 49 54 45  .  # (rc==SQLITE
9240: 5f 4f 4b 29 2e 0a 20 20 64 6f 5f 74 65 73 74 20  _OK)..  do_test 
9250: 65 5f 73 65 6c 65 63 74 2d 34 2e 24 74 6e 20 5b  e_select-4.$tn [
9260: 6c 69 73 74 20 6c 69 73 74 20 24 72 63 20 24 6e  list list $rc $n
9270: 52 6f 77 5d 20 7b 53 51 4c 49 54 45 5f 4f 4b 20  Row] {SQLITE_OK 
9280: 31 7d 0a 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74  1}.}..drop_all_t
9290: 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c  ables.do_execsql
92a0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34  _test e_select-4
92b0: 2e 39 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .9.0 {.  CREATE 
92c0: 54 41 42 4c 45 20 62 31 28 6f 6e 65 20 50 52 49  TABLE b1(one PRI
92d0: 4d 41 52 59 20 4b 45 59 2c 20 74 77 6f 29 3b 0a  MARY KEY, two);.
92e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 31    INSERT INTO b1
92f0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 27 29 3b   VALUES(1, 'o');
9300: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62  .  INSERT INTO b
9310: 31 20 56 41 4c 55 45 53 28 34 2c 20 27 66 27 29  1 VALUES(4, 'f')
9320: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
9330: 62 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74 27  b1 VALUES(3, 't'
9340: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
9350: 20 62 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   b1 VALUES(2, 't
9360: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
9370: 4f 20 62 31 20 56 41 4c 55 45 53 28 35 2c 20 27  O b1 VALUES(5, '
9380: 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  f');.  INSERT IN
9390: 54 4f 20 62 31 20 56 41 4c 55 45 53 28 37 2c 20  TO b1 VALUES(7, 
93a0: 27 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  's');.  INSERT I
93b0: 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 36 2c  NTO b1 VALUES(6,
93c0: 20 27 73 27 29 3b 0a 0a 20 20 43 52 45 41 54 45   's');..  CREATE
93d0: 20 54 41 42 4c 45 20 62 32 28 78 2c 20 79 29 3b   TABLE b2(x, y);
93e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62  .  INSERT INTO b
93f0: 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 30  2 VALUES(NULL, 0
9400: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
9410: 20 62 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   b2 VALUES(NULL,
9420: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
9430: 54 4f 20 62 32 20 56 41 4c 55 45 53 28 27 78 79  TO b2 VALUES('xy
9440: 7a 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  z', 2);.  INSERT
9450: 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28   INTO b2 VALUES(
9460: 27 61 62 63 27 2c 20 33 29 3b 0a 20 20 49 4e 53  'abc', 3);.  INS
9470: 45 52 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55  ERT INTO b2 VALU
9480: 45 53 28 27 78 79 7a 27 2c 20 34 29 3b 0a 0a 20  ES('xyz', 4);.. 
9490: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 33   CREATE TABLE b3
94a0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
94b0: 65 2c 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  e, b COLLATE bin
94c0: 61 72 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ary);.  INSERT I
94d0: 4e 54 4f 20 62 33 20 56 41 4c 55 45 53 28 27 61  NTO b3 VALUES('a
94e0: 62 63 27 2c 20 27 61 62 63 27 29 3b 0a 20 20 49  bc', 'abc');.  I
94f0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 33 20 56 41  NSERT INTO b3 VA
9500: 4c 55 45 53 28 27 61 42 43 27 2c 20 27 61 42 43  LUES('aBC', 'aBC
9510: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
9520: 4f 20 62 33 20 56 41 4c 55 45 53 28 27 44 65 66  O b3 VALUES('Def
9530: 27 2c 20 27 44 65 66 27 29 3b 0a 20 20 49 4e 53  ', 'Def');.  INS
9540: 45 52 54 20 49 4e 54 4f 20 62 33 20 56 41 4c 55  ERT INTO b3 VALU
9550: 45 53 28 27 64 45 46 27 2c 20 27 64 45 46 27 29  ES('dEF', 'dEF')
9560: 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  ;.} {}..# EVIDEN
9570: 43 45 2d 4f 46 3a 20 52 2d 35 37 37 35 34 2d 35  CE-OF: R-57754-5
9580: 37 31 30 39 20 49 66 20 74 68 65 20 53 45 4c 45  7109 If the SELE
9590: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
95a0: 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20 71  an aggregate.# q
95b0: 75 65 72 79 20 77 69 74 68 20 61 20 47 52 4f 55  uery with a GROU
95c0: 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  P BY clause, the
95d0: 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 65 78  n each of the ex
95e0: 70 72 65 73 73 69 6f 6e 73 20 73 70 65 63 69 66  pressions specif
95f0: 69 65 64 0a 23 20 61 73 20 70 61 72 74 20 6f 66  ied.# as part of
9600: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
9610: 61 75 73 65 20 69 73 20 65 76 61 6c 75 61 74 65  ause is evaluate
9620: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  d for each row o
9630: 66 20 74 68 65 0a 23 20 64 61 74 61 73 65 74 2e  f the.# dataset.
9640: 20 45 61 63 68 20 72 6f 77 20 69 73 20 74 68 65   Each row is the
9650: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 20  n assigned to a 
9660: 22 67 72 6f 75 70 22 20 62 61 73 65 64 20 6f 6e  "group" based on
9670: 20 74 68 65 20 72 65 73 75 6c 74 73 3b 0a 23 20   the results;.# 
9680: 72 6f 77 73 20 66 6f 72 20 77 68 69 63 68 20 74  rows for which t
9690: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65 76  he results of ev
96a0: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 47 52 4f  aluating the GRO
96b0: 55 50 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  UP BY expression
96c0: 73 20 61 72 65 0a 23 20 74 68 65 20 73 61 6d 65  s are.# the same
96d0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
96e0: 20 74 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e   the same group.
96f0: 0a 23 0a 23 20 20 20 54 68 65 73 65 20 74 65 73  .#.#   These tes
9700: 74 73 20 61 6c 73 6f 20 73 68 6f 77 20 74 68 61  ts also show tha
9710: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
9720: 69 73 20 6e 6f 74 20 75 6e 74 72 75 65 3a 0a 23  is not untrue:.#
9730: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9740: 52 2d 32 35 38 38 33 2d 35 35 30 36 33 20 54 68  R-25883-55063 Th
9750: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
9760: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
9770: 61 75 73 65 20 64 6f 0a 23 20 6e 6f 74 20 68 61  ause do.# not ha
9780: 76 65 20 74 6f 20 62 65 20 65 78 70 72 65 73 73  ve to be express
9790: 69 6f 6e 73 20 74 68 61 74 20 61 70 70 65 61 72  ions that appear
97a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   in the result..
97b0: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
97c0: 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 39 20 7b  s e_select-4.9 {
97d0: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 67 72  .  1  "SELECT gr
97e0: 6f 75 70 5f 63 6f 6e 63 61 74 28 6f 6e 65 29 2c  oup_concat(one),
97f0: 20 74 77 6f 20 46 52 4f 4d 20 62 31 20 47 52 4f   two FROM b1 GRO
9800: 55 50 20 42 59 20 74 77 6f 22 20 7b 0a 20 20 20  UP BY two" {.   
9810: 20 2f 23 2c 23 20 66 20 20 20 31 20 6f 20 20 20   /#,# f   1 o   
9820: 23 2c 23 20 20 20 73 20 23 2c 23 20 74 2f 0a 20  #,#   s #,# t/. 
9830: 20 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20   }.  2  "SELECT 
9840: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 6f 6e 65  group_concat(one
9850: 29 2c 20 73 75 6d 28 6f 6e 65 29 20 46 52 4f 4d  ), sum(one) FROM
9860: 20 62 31 20 47 52 4f 55 50 20 42 59 20 28 6f 6e   b1 GROUP BY (on
9870: 65 3e 34 29 22 20 7b 0a 20 20 20 20 31 2c 32 2c  e>4)" {.    1,2,
9880: 33 2c 34 20 31 30 20 20 20 20 35 2c 36 2c 37 20  3,4 10    5,6,7 
9890: 31 38 0a 20 20 7d 0a 20 20 33 20 20 22 53 45 4c  18.  }.  3  "SEL
98a0: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
98b0: 28 6f 6e 65 29 20 46 52 4f 4d 20 62 31 20 47 52  (one) FROM b1 GR
98c0: 4f 55 50 20 42 59 20 28 74 77 6f 3e 27 6f 27 29  OUP BY (two>'o')
98d0: 2c 20 6f 6e 65 25 32 22 20 7b 0a 20 20 20 20 34  , one%2" {.    4
98e0: 20 20 31 2c 35 20 20 20 20 32 2c 36 20 20 20 33    1,5    2,6   3
98f0: 2c 37 0a 20 20 7d 0a 20 20 34 20 20 22 53 45 4c  ,7.  }.  4  "SEL
9900: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
9910: 28 6f 6e 65 29 20 46 52 4f 4d 20 62 31 20 47 52  (one) FROM b1 GR
9920: 4f 55 50 20 42 59 20 28 6f 6e 65 3d 3d 32 20 4f  OUP BY (one==2 O
9930: 52 20 74 77 6f 3d 3d 27 6f 27 29 22 20 7b 0a 20  R two=='o')" {. 
9940: 20 20 20 34 2c 33 2c 35 2c 37 2c 36 20 20 20 20     4,3,5,7,6    
9950: 31 2c 32 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49  1,2.  }.}..# EVI
9960: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 39 32  DENCE-OF: R-1492
9970: 36 2d 35 30 31 32 39 20 46 6f 72 20 74 68 65 20  6-50129 For the 
9980: 70 75 72 70 6f 73 65 73 20 6f 66 20 67 72 6f 75  purposes of grou
9990: 70 69 6e 67 20 72 6f 77 73 2c 20 4e 55 4c 4c 0a  ping rows, NULL.
99a0: 23 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  # values are con
99b0: 73 69 64 65 72 65 64 20 65 71 75 61 6c 2e 0a 23  sidered equal..#
99c0: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
99d0: 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 30 20 7b   e_select-4.10 {
99e0: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 67 72  .  1  "SELECT gr
99f0: 6f 75 70 5f 63 6f 6e 63 61 74 28 79 29 20 46 52  oup_concat(y) FR
9a00: 4f 4d 20 62 32 20 47 52 4f 55 50 20 42 59 20 78  OM b2 GROUP BY x
9a10: 22 20 7b 2f 23 2c 23 20 20 20 33 20 20 20 23 2c  " {/#,#   3   #,
9a20: 23 2f 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54  #/}.  2  "SELECT
9a30: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62   count(*) FROM b
9a40: 32 20 47 52 4f 55 50 20 42 59 20 43 41 53 45 20  2 GROUP BY CASE 
9a50: 57 48 45 4e 20 79 3c 34 20 54 48 45 4e 20 4e 55  WHEN y<4 THEN NU
9a60: 4c 4c 20 45 4c 53 45 20 30 20 45 4e 44 22 20 7b  LL ELSE 0 END" {
9a70: 34 20 31 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45  4 1}.} ..# EVIDE
9a80: 4e 43 45 2d 4f 46 3a 20 52 2d 31 30 34 37 30 2d  NCE-OF: R-10470-
9a90: 33 30 33 31 38 20 54 68 65 20 75 73 75 61 6c 20  30318 The usual 
9aa0: 72 75 6c 65 73 20 66 6f 72 20 73 65 6c 65 63 74  rules for select
9ab0: 69 6e 67 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 0a  ing a collation.
9ac0: 23 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  # sequence with 
9ad0: 77 68 69 63 68 20 74 6f 20 63 6f 6d 70 61 72 65  which to compare
9ae0: 20 74 65 78 74 20 76 61 6c 75 65 73 20 61 70 70   text values app
9af0: 6c 79 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69  ly when evaluati
9b00: 6e 67 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 73  ng.# expressions
9b10: 20 69 6e 20 61 20 47 52 4f 55 50 20 42 59 20 63   in a GROUP BY c
9b20: 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 73 65 6c 65  lause..#.do_sele
9b30: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
9b40: 74 2d 34 2e 31 31 20 7b 0a 20 20 31 20 20 22 53  t-4.11 {.  1  "S
9b50: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9b60: 52 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20  ROM b3 GROUP BY 
9b70: 62 22 20 20 20 20 20 20 7b 31 20 31 20 31 20 31  b"      {1 1 1 1
9b80: 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 63  }.  2  "SELECT c
9b90: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 33 20  ount(*) FROM b3 
9ba0: 47 52 4f 55 50 20 42 59 20 61 22 20 20 20 20 20  GROUP BY a"     
9bb0: 20 7b 32 20 32 7d 0a 20 20 33 20 20 22 53 45 4c   {2 2}.  3  "SEL
9bc0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9bd0: 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20 2b 62  M b3 GROUP BY +b
9be0: 22 20 20 20 20 20 7b 31 20 31 20 31 20 31 7d 0a  "     {1 1 1 1}.
9bf0: 20 20 34 20 20 22 53 45 4c 45 43 54 20 63 6f 75    4  "SELECT cou
9c00: 6e 74 28 2a 29 20 46 52 4f 4d 20 62 33 20 47 52  nt(*) FROM b3 GR
9c10: 4f 55 50 20 42 59 20 2b 61 22 20 20 20 20 20 7b  OUP BY +a"     {
9c20: 32 20 32 7d 0a 20 20 35 20 20 22 53 45 4c 45 43  2 2}.  5  "SELEC
9c30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9c40: 62 33 20 47 52 4f 55 50 20 42 59 20 62 7c 7c 27  b3 GROUP BY b||'
9c50: 27 22 20 20 7b 31 20 31 20 31 20 31 7d 0a 20 20  '"  {1 1 1 1}.  
9c60: 36 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  6  "SELECT count
9c70: 28 2a 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55  (*) FROM b3 GROU
9c80: 50 20 42 59 20 61 7c 7c 27 27 22 20 20 7b 31 20  P BY a||''"  {1 
9c90: 31 20 31 20 31 7d 0a 7d 0a 0a 23 20 45 56 49 44  1 1 1}.}..# EVID
9ca0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 35 37 33  ENCE-OF: R-63573
9cb0: 2d 35 30 37 33 30 20 54 68 65 20 65 78 70 72 65  -50730 The expre
9cc0: 73 73 69 6f 6e 73 20 69 6e 20 61 20 47 52 4f 55  ssions in a GROU
9cd0: 50 20 42 59 20 63 6c 61 75 73 65 20 6d 61 79 0a  P BY clause may.
9ce0: 23 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61  # not be aggrega
9cf0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  te expressions..
9d00: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  #.foreach {tn se
9d10: 6c 65 63 74 7d 20 7b 0a 20 20 31 32 2e 31 20 20  lect} {.  12.1  
9d20: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62  "SELECT * FROM b
9d30: 33 20 47 52 4f 55 50 20 42 59 20 63 6f 75 6e 74  3 GROUP BY count
9d40: 28 2a 29 22 0a 20 20 31 32 2e 32 20 20 22 53 45  (*)".  12.2  "SE
9d50: 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
9d60: 20 62 33 20 47 52 4f 55 50 20 42 59 20 6d 61 78   b3 GROUP BY max
9d70: 28 62 29 22 0a 20 20 31 32 2e 33 20 20 22 53 45  (b)".  12.3  "SE
9d80: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
9d90: 74 28 61 29 20 46 52 4f 4d 20 62 33 20 47 52 4f  t(a) FROM b3 GRO
9da0: 55 50 20 42 59 20 61 2c 20 6d 61 78 28 62 29 22  UP BY a, max(b)"
9db0: 0a 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 7b  .} {.  set res {
9dc0: 31 20 7b 61 67 67 72 65 67 61 74 65 20 66 75 6e  1 {aggregate fun
9dd0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
9de0: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 47 52  llowed in the GR
9df0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 7d 7d 0a  OUP BY clause}}.
9e00: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
9e10: 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 24 74  st e_select-4.$t
9e20: 6e 20 24 73 65 6c 65 63 74 20 24 72 65 73 0a 7d  n $select $res.}
9e30: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
9e40: 20 52 2d 33 31 35 33 37 2d 30 30 31 30 31 20 49   R-31537-00101 I
9e50: 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  f a HAVING claus
9e60: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
9e70: 69 74 20 69 73 0a 23 20 65 76 61 6c 75 61 74 65  it is.# evaluate
9e80: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
9e90: 67 72 6f 75 70 20 6f 66 20 72 6f 77 73 20 61 73  group of rows as
9ea0: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
9eb0: 73 73 69 6f 6e 2e 20 49 66 20 74 68 65 0a 23 20  ssion. If the.# 
9ec0: 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61  result of evalua
9ed0: 74 69 6e 67 20 74 68 65 20 48 41 56 49 4e 47 20  ting the HAVING 
9ee0: 63 6c 61 75 73 65 20 69 73 20 66 61 6c 73 65 2c  clause is false,
9ef0: 20 74 68 65 20 67 72 6f 75 70 20 69 73 0a 23 20   the group is.# 
9f00: 64 69 73 63 61 72 64 65 64 2e 0a 23 0a 23 20 20  discarded..#.#  
9f10: 20 54 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e   This requiremen
9f20: 74 20 69 73 20 74 65 73 74 65 64 20 62 79 20 61  t is tested by a
9f30: 6c 6c 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33  ll e_select-4.13
9f40: 2e 2a 20 74 65 73 74 73 2e 0a 23 0a 23 20 45 56  .* tests..#.# EV
9f50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 31  IDENCE-OF: R-041
9f60: 33 32 2d 30 39 34 37 34 20 49 66 20 74 68 65 20  32-09474 If the 
9f70: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
9f80: 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20   an aggregate.# 
9f90: 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 74 20 69  expression, it i
9fa0: 73 20 65 76 61 6c 75 61 74 65 64 20 61 63 72 6f  s evaluated acro
9fb0: 73 73 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  ss all rows in t
9fc0: 68 65 20 67 72 6f 75 70 2e 0a 23 0a 23 20 20 20  he group..#.#   
9fd0: 54 65 73 74 65 64 20 62 79 20 65 5f 73 65 6c 65  Tested by e_sele
9fe0: 63 74 2d 34 2e 31 33 2e 31 2e 2a 0a 23 0a 23 20  ct-4.13.1.*.#.# 
9ff0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
a000: 38 32 36 32 2d 34 37 34 34 37 20 49 66 20 61 20  8262-47447 If a 
a010: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
a020: 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
a030: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  .# expression, i
a040: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 77  t is evaluated w
a050: 69 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 61  ith respect to a
a060: 6e 20 61 72 62 69 74 72 61 72 69 6c 79 20 73 65  n arbitrarily se
a070: 6c 65 63 74 65 64 0a 23 20 72 6f 77 20 66 72 6f  lected.# row fro
a080: 6d 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a 23  m the group..#.#
a090: 20 20 20 54 65 73 74 65 64 20 62 79 20 65 5f 73     Tested by e_s
a0a0: 65 6c 65 63 74 2d 34 2e 31 33 2e 32 2e 2a 0a 23  elect-4.13.2.*.#
a0b0: 0a 23 20 20 20 54 65 73 74 73 20 69 6e 20 74 68  .#   Tests in th
a0c0: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 73 68  is block also sh
a0d0: 6f 77 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ow that this is 
a0e0: 6e 6f 74 20 75 6e 74 72 75 65 3a 0a 23 0a 23 20  not untrue:.#.# 
a0f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
a100: 35 34 30 33 2d 31 33 34 35 30 20 54 68 65 20 48  5403-13450 The H
a110: 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
a120: 20 6d 61 79 20 72 65 66 65 72 20 74 6f 20 76 61   may refer to va
a130: 6c 75 65 73 2c 0a 23 20 65 76 65 6e 20 61 67 67  lues,.# even agg
a140: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
a150: 2c 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69  , that are not i
a160: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 23 0a  n the result..#.
a170: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
a180: 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e 30 20  e_select-4.13.0 
a190: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
a1a0: 20 63 31 28 75 70 2c 20 64 6f 77 6e 29 3b 0a 20   c1(up, down);. 
a1b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
a1c0: 56 41 4c 55 45 53 28 27 78 27 2c 20 31 29 3b 0a  VALUES('x', 1);.
a1d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
a1e0: 20 56 41 4c 55 45 53 28 27 78 27 2c 20 32 29 3b   VALUES('x', 2);
a1f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a200: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 34 29  1 VALUES('x', 4)
a210: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a220: 63 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 38  c1 VALUES('x', 8
a230: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
a240: 20 63 31 20 56 41 4c 55 45 53 28 27 79 27 2c 20   c1 VALUES('y', 
a250: 31 36 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  16);.  INSERT IN
a260: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 79 27  TO c1 VALUES('y'
a270: 2c 20 33 32 29 3b 0a 0a 20 20 43 52 45 41 54 45  , 32);..  CREATE
a280: 20 54 41 42 4c 45 20 63 32 28 69 2c 20 6a 29 3b   TABLE c2(i, j);
a290: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a2a0: 32 20 56 41 4c 55 45 53 28 31 2c 20 30 29 3b 0a  2 VALUES(1, 0);.
a2b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32    INSERT INTO c2
a2c0: 20 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20   VALUES(2, 1);. 
a2d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20   INSERT INTO c2 
a2e0: 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a 20 20  VALUES(3, 3);.  
a2f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
a300: 41 4c 55 45 53 28 34 2c 20 36 29 3b 0a 20 20 49  ALUES(4, 6);.  I
a310: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a320: 4c 55 45 53 28 35 2c 20 31 30 29 3b 0a 20 20 49  LUES(5, 10);.  I
a330: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a340: 4c 55 45 53 28 36 2c 20 31 35 29 3b 0a 20 20 49  LUES(6, 15);.  I
a350: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a360: 4c 55 45 53 28 37 2c 20 32 31 29 3b 0a 20 20 49  LUES(7, 21);.  I
a370: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a380: 4c 55 45 53 28 38 2c 20 32 38 29 3b 0a 20 20 49  LUES(8, 28);.  I
a390: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a3a0: 4c 55 45 53 28 39 2c 20 33 36 29 3b 0a 0a 20 20  LUES(9, 36);..  
a3b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
a3c0: 69 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6b  i PRIMARY KEY, k
a3d0: 20 54 45 58 54 29 3b 0a 20 20 49 4e 53 45 52 54   TEXT);.  INSERT
a3e0: 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28   INTO c3 VALUES(
a3f0: 31 2c 20 20 27 68 79 64 72 6f 67 65 6e 27 29 3b  1,  'hydrogen');
a400: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a410: 33 20 56 41 4c 55 45 53 28 32 2c 20 20 27 68 65  3 VALUES(2,  'he
a420: 6c 69 75 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54  lium');.  INSERT
a430: 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28   INTO c3 VALUES(
a440: 33 2c 20 20 27 6c 69 74 68 69 75 6d 27 29 3b 0a  3,  'lithium');.
a450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33    INSERT INTO c3
a460: 20 56 41 4c 55 45 53 28 34 2c 20 20 27 62 65 72   VALUES(4,  'ber
a470: 79 6c 6c 69 75 6d 27 29 3b 0a 20 20 49 4e 53 45  yllium');.  INSE
a480: 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
a490: 53 28 35 2c 20 20 27 62 6f 72 6f 6e 27 29 3b 0a  S(5,  'boron');.
a4a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33    INSERT INTO c3
a4b0: 20 56 41 4c 55 45 53 28 39 34 2c 20 27 70 6c 75   VALUES(94, 'plu
a4c0: 74 6f 6e 69 75 6d 27 29 3b 0a 7d 20 7b 7d 0a 0a  tonium');.} {}..
a4d0: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
a4e0: 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33 20 7b 0a  e_select-4.13 {.
a4f0: 20 20 31 2e 31 20 20 22 53 45 4c 45 43 54 20 75    1.1  "SELECT u
a500: 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50 20  p FROM c1 GROUP 
a510: 42 59 20 75 70 20 48 41 56 49 4e 47 20 63 6f 75  BY up HAVING cou
a520: 6e 74 28 2a 29 3e 33 22 20 7b 78 7d 0a 20 20 31  nt(*)>3" {x}.  1
a530: 2e 32 20 20 22 53 45 4c 45 43 54 20 75 70 20 46  .2  "SELECT up F
a540: 52 4f 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20  ROM c1 GROUP BY 
a550: 75 70 20 48 41 56 49 4e 47 20 73 75 6d 28 64 6f  up HAVING sum(do
a560: 77 6e 29 3e 31 36 22 20 7b 79 7d 0a 20 20 31 2e  wn)>16" {y}.  1.
a570: 33 20 20 22 53 45 4c 45 43 54 20 75 70 20 46 52  3  "SELECT up FR
a580: 4f 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20 75  OM c1 GROUP BY u
a590: 70 20 48 41 56 49 4e 47 20 73 75 6d 28 64 6f 77  p HAVING sum(dow
a5a0: 6e 29 3c 31 36 22 20 7b 78 7d 0a 20 20 31 2e 34  n)<16" {x}.  1.4
a5b0: 20 20 22 53 45 4c 45 43 54 20 75 70 7c 7c 64 6f    "SELECT up||do
a5c0: 77 6e 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50  wn FROM c1 GROUP
a5d0: 20 42 59 20 28 64 6f 77 6e 3c 35 29 20 48 41 56   BY (down<5) HAV
a5e0: 49 4e 47 20 6d 61 78 28 64 6f 77 6e 29 3c 31 30  ING max(down)<10
a5f0: 22 20 7b 78 34 7d 0a 0a 20 20 32 2e 31 20 20 22  " {x4}..  2.1  "
a600: 53 45 4c 45 43 54 20 75 70 20 46 52 4f 4d 20 63  SELECT up FROM c
a610: 31 20 47 52 4f 55 50 20 42 59 20 75 70 20 48 41  1 GROUP BY up HA
a620: 56 49 4e 47 20 64 6f 77 6e 3e 31 30 22 20 7b 79  VING down>10" {y
a630: 7d 0a 20 20 32 2e 32 20 20 22 53 45 4c 45 43 54  }.  2.2  "SELECT
a640: 20 75 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55   up FROM c1 GROU
a650: 50 20 42 59 20 75 70 20 48 41 56 49 4e 47 20 75  P BY up HAVING u
a660: 70 3d 27 79 27 22 20 20 7b 79 7d 0a 0a 20 20 32  p='y'"  {y}..  2
a670: 2e 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a  .3  "SELECT i, j
a680: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
a690: 59 20 69 3e 34 20 48 41 56 49 4e 47 20 69 3e 36  Y i>4 HAVING i>6
a6a0: 22 20 20 7b 39 20 33 36 7d 0a 7d 0a 0a 23 20 45  "  {9 36}.}..# E
a6b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
a6c0: 39 32 37 2d 35 34 30 38 31 20 45 61 63 68 20 65  927-54081 Each e
a6d0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
a6e0: 20 72 65 73 75 6c 74 2d 73 65 74 20 69 73 20 74   result-set is t
a6f0: 68 65 6e 0a 23 20 65 76 61 6c 75 61 74 65 64 20  hen.# evaluated 
a700: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 67 72  once for each gr
a710: 6f 75 70 20 6f 66 20 72 6f 77 73 2e 0a 23 0a 23  oup of rows..#.#
a720: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a730: 35 33 37 33 35 2d 34 37 30 31 37 20 49 66 20 74  53735-47017 If t
a740: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a750: 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20   an aggregate.# 
a760: 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 74 20 69  expression, it i
a770: 73 20 65 76 61 6c 75 61 74 65 64 20 61 63 72 6f  s evaluated acro
a780: 73 73 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  ss all rows in t
a790: 68 65 20 67 72 6f 75 70 2e 0a 23 0a 64 6f 5f 73  he group..#.do_s
a7a0: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
a7b0: 6c 65 63 74 2d 34 2e 31 35 20 7b 0a 20 20 31 20  lect-4.15 {.  1 
a7c0: 20 22 53 45 4c 45 43 54 20 73 75 6d 28 64 6f 77   "SELECT sum(dow
a7d0: 6e 29 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50  n) FROM c1 GROUP
a7e0: 20 42 59 20 75 70 22 20 7b 31 35 20 34 38 7d 0a   BY up" {15 48}.
a7f0: 20 20 32 20 20 22 53 45 4c 45 43 54 20 73 75 6d    2  "SELECT sum
a800: 28 6a 29 2c 20 6d 61 78 28 6a 29 20 46 52 4f 4d  (j), max(j) FROM
a810: 20 63 32 20 47 52 4f 55 50 20 42 59 20 28 69 25   c2 GROUP BY (i%
a820: 33 29 22 20 20 20 20 20 7b 35 34 20 33 36 20 32  3)"     {54 36 2
a830: 37 20 32 31 20 33 39 20 32 38 7d 0a 20 20 33 20  7 21 39 28}.  3 
a840: 20 22 53 45 4c 45 43 54 20 73 75 6d 28 6a 29 2c   "SELECT sum(j),
a850: 20 6d 61 78 28 6a 29 20 46 52 4f 4d 20 63 32 20   max(j) FROM c2 
a860: 47 52 4f 55 50 20 42 59 20 28 6a 25 32 29 22 20  GROUP BY (j%2)" 
a870: 20 20 20 20 7b 38 30 20 33 36 20 34 30 20 32 31      {80 36 40 21
a880: 7d 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20 31  }.  4  "SELECT 1
a890: 2b 73 75 6d 28 6a 29 2c 20 6d 61 78 28 6a 29 2b  +sum(j), max(j)+
a8a0: 31 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20  1 FROM c2 GROUP 
a8b0: 42 59 20 28 6a 25 32 29 22 20 7b 38 31 20 33 37  BY (j%2)" {81 37
a8c0: 20 34 31 20 32 32 7d 0a 20 20 35 20 20 22 53 45   41 22}.  5  "SE
a8d0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 72  LECT count(*), r
a8e0: 6f 75 6e 64 28 61 76 67 28 69 29 2c 32 29 20 46  ound(avg(i),2) F
a8f0: 52 4f 4d 20 63 31 2c 20 63 32 20 4f 4e 20 28 69  ROM c1, c2 ON (i
a900: 3d 64 6f 77 6e 29 20 47 52 4f 55 50 20 42 59 20  =down) GROUP BY 
a910: 6a 25 32 22 0a 20 20 20 20 20 20 20 20 7b 33 20  j%2".        {3 
a920: 34 2e 33 33 20 31 20 32 2e 30 7d 0a 7d 20 0a 0a  4.33 1 2.0}.} ..
a930: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
a940: 2d 36 32 39 31 33 2d 31 39 38 33 30 20 4f 74 68  -62913-19830 Oth
a950: 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 65 76  erwise, it is ev
a960: 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20  aluated against 
a970: 61 20 73 69 6e 67 6c 65 0a 23 20 61 72 62 69 74  a single.# arbit
a980: 72 61 72 69 6c 79 20 63 68 6f 73 65 6e 20 72 6f  rarily chosen ro
a990: 77 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  w from within th
a9a0: 65 20 67 72 6f 75 70 2e 0a 23 0a 23 20 45 56 49  e group..#.# EVI
a9b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 32  DENCE-OF: R-5392
a9c0: 34 2d 30 38 38 30 39 20 49 66 20 74 68 65 72 65  4-08809 If there
a9d0: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
a9e0: 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 0a  e non-aggregate.
a9f0: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  # expression in 
aa00: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
aa10: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 65 78  then all such ex
aa20: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 76  pressions are ev
aa30: 61 6c 75 61 74 65 64 0a 23 20 66 6f 72 20 74 68  aluated.# for th
aa40: 65 20 73 61 6d 65 20 72 6f 77 2e 0a 23 0a 64 6f  e same row..#.do
aa50: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
aa60: 73 65 6c 65 63 74 2d 34 2e 31 35 20 7b 0a 20 20  select-4.15 {.  
aa70: 31 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20  1  "SELECT i, j 
aa80: 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59  FROM c2 GROUP BY
aa90: 20 69 25 32 22 20 20 20 20 20 20 20 20 20 20 20   i%2"           
aaa0: 20 20 7b 38 20 32 38 20 20 20 39 20 33 36 7d 0a    {8 28   9 36}.
aab0: 20 20 32 20 20 22 53 45 4c 45 43 54 20 69 2c 20    2  "SELECT i, 
aac0: 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20  j FROM c2 GROUP 
aad0: 42 59 20 69 25 32 20 48 41 56 49 4e 47 20 6a 3c  BY i%2 HAVING j<
aae0: 33 30 22 20 7b 38 20 32 38 7d 0a 20 20 33 20 20  30" {8 28}.  3  
aaf0: 22 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f  "SELECT i, j FRO
ab00: 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20 69 25  M c2 GROUP BY i%
ab10: 32 20 48 41 56 49 4e 47 20 6a 3e 33 30 22 20 7b  2 HAVING j>30" {
ab20: 39 20 33 36 7d 0a 20 20 34 20 20 22 53 45 4c 45  9 36}.  4  "SELE
ab30: 43 54 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20  CT i, j FROM c2 
ab40: 47 52 4f 55 50 20 42 59 20 69 25 32 20 48 41 56  GROUP BY i%2 HAV
ab50: 49 4e 47 20 6a 3e 33 30 22 20 7b 39 20 33 36 7d  ING j>30" {9 36}
ab60: 0a 20 20 35 20 20 22 53 45 4c 45 43 54 20 63 6f  .  5  "SELECT co
ab70: 75 6e 74 28 2a 29 2c 20 69 2c 20 6b 20 46 52 4f  unt(*), i, k FRO
ab80: 4d 20 63 32 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M c2 NATURAL JOI
ab90: 4e 20 63 33 20 47 52 4f 55 50 20 42 59 20 73 75  N c3 GROUP BY su
aba0: 62 73 74 72 28 6b 2c 20 31 2c 20 31 29 22 0a 20  bstr(k, 1, 1)". 
abb0: 20 20 20 20 20 20 20 7b 32 20 35 20 62 6f 72 6f         {2 5 boro
abc0: 6e 20 20 20 32 20 32 20 68 65 6c 69 75 6d 20 20  n   2 2 helium  
abd0: 20 31 20 33 20 6c 69 74 68 69 75 6d 7d 0a 7d 20   1 3 lithium}.} 
abe0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
abf0: 20 52 2d 31 39 33 33 34 2d 31 32 38 31 31 20 45   R-19334-12811 E
ac00: 61 63 68 20 67 72 6f 75 70 20 6f 66 20 69 6e 70  ach group of inp
ac10: 75 74 20 64 61 74 61 73 65 74 20 72 6f 77 73 0a  ut dataset rows.
ac20: 23 20 63 6f 6e 74 72 69 62 75 74 65 73 20 61 20  # contributes a 
ac30: 73 69 6e 67 6c 65 20 72 6f 77 20 74 6f 20 74 68  single row to th
ac40: 65 20 73 65 74 20 6f 66 20 72 65 73 75 6c 74 20  e set of result 
ac50: 72 6f 77 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  rows..#.# EVIDEN
ac60: 43 45 2d 4f 46 3a 20 52 2d 30 32 32 32 33 2d 34  CE-OF: R-02223-4
ac70: 39 32 37 39 20 53 75 62 6a 65 63 74 20 74 6f 20  9279 Subject to 
ac80: 66 69 6c 74 65 72 69 6e 67 20 61 73 73 6f 63 69  filtering associ
ac90: 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 23 20  ated with the.# 
aca0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
acb0: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
acc0: 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79  rows returned by
acd0: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
ace0: 65 72 79 0a 23 20 77 69 74 68 20 61 20 47 52 4f  ery.# with a GRO
acf0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
ad00: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
ad10: 6e 75 6d 62 65 72 20 6f 66 20 67 72 6f 75 70 73  number of groups
ad20: 20 6f 66 20 72 6f 77 73 0a 23 20 70 72 6f 64 75   of rows.# produ
ad30: 63 65 64 20 62 79 20 61 70 70 6c 79 69 6e 67 20  ced by applying 
ad40: 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
ad50: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
ad60: 74 6f 20 74 68 65 20 66 69 6c 74 65 72 65 64 0a  to the filtered.
ad70: 23 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 2e  # input dataset.
ad80: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
ad90: 74 73 20 65 5f 73 65 6c 65 63 74 2e 34 2e 31 36  ts e_select.4.16
ada0: 20 2d 63 6f 75 6e 74 20 7b 0a 20 20 31 20 20 22   -count {.  1  "
adb0: 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f 4d  SELECT i, j FROM
adc0: 20 63 32 20 47 52 4f 55 50 20 42 59 20 69 25 32   c2 GROUP BY i%2
add0: 22 20 20 20 20 20 20 20 20 20 20 32 0a 20 20 32  "          2.  2
ade0: 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20 46    "SELECT i, j F
adf0: 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20  ROM c2 GROUP BY 
ae00: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 39 0a  i"            9.
ae10: 20 20 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20    3  "SELECT i, 
ae20: 6a 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20  j FROM c2 GROUP 
ae30: 42 59 20 69 20 48 41 56 49 4e 47 20 69 3c 35 22  BY i HAVING i<5"
ae40: 20 34 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   4.} ..#--------
ae50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
aea0: 67 20 74 65 73 74 73 20 61 74 74 65 6d 70 74 20  g tests attempt 
aeb0: 74 6f 20 76 65 72 69 66 79 20 73 74 61 74 65 6d  to verify statem
aec0: 65 6e 74 73 20 6d 61 64 65 20 72 65 67 61 72 64  ents made regard
aed0: 69 6e 67 20 74 68 65 20 41 4c 4c 0a 23 20 61 6e  ing the ALL.# an
aee0: 64 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  d DISTINCT keywo
aef0: 72 64 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  rds..#.drop_all_
af00: 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71  tables.do_execsq
af10: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
af20: 35 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  5.1.0 {.  CREATE
af30: 20 54 41 42 4c 45 20 68 31 28 61 2c 20 62 29 3b   TABLE h1(a, b);
af40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68  .  INSERT INTO h
af50: 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  1 VALUES(1, 'one
af60: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
af70: 4f 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O h1 VALUES(1, '
af80: 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  I');.  INSERT IN
af90: 54 4f 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20  TO h1 VALUES(1, 
afa0: 27 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'i');.  INSERT I
afb0: 4e 54 4f 20 68 31 20 56 41 4c 55 45 53 28 34 2c  NTO h1 VALUES(4,
afc0: 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45   'four');.  INSE
afd0: 52 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45  RT INTO h1 VALUE
afe0: 53 28 34 2c 20 27 49 56 27 29 3b 0a 20 20 49 4e  S(4, 'IV');.  IN
aff0: 53 45 52 54 20 49 4e 54 4f 20 68 31 20 56 41 4c  SERT INTO h1 VAL
b000: 55 45 53 28 34 2c 20 27 69 76 27 29 3b 0a 0a 20  UES(4, 'iv');.. 
b010: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 68 32   CREATE TABLE h2
b020: 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (x COLLATE nocas
b030: 65 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  e);.  INSERT INT
b040: 4f 20 68 32 20 56 41 4c 55 45 53 28 27 4f 6e 65  O h2 VALUES('One
b050: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
b060: 4f 20 68 32 20 56 41 4c 55 45 53 28 27 54 77 6f  O h2 VALUES('Two
b070: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
b080: 4f 20 68 32 20 56 41 4c 55 45 53 28 27 54 68 72  O h2 VALUES('Thr
b090: 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ee');.  INSERT I
b0a0: 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 46  NTO h2 VALUES('F
b0b0: 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  our');.  INSERT 
b0c0: 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27  INTO h2 VALUES('
b0d0: 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  one');.  INSERT 
b0e0: 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27  INTO h2 VALUES('
b0f0: 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  two');.  INSERT 
b100: 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27  INTO h2 VALUES('
b110: 74 68 72 65 65 27 29 3b 0a 20 20 49 4e 53 45 52  three');.  INSER
b120: 54 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53  T INTO h2 VALUES
b130: 28 27 66 6f 75 72 27 29 3b 0a 0a 20 20 43 52 45  ('four');..  CRE
b140: 41 54 45 20 54 41 42 4c 45 20 68 33 28 63 2c 20  ATE TABLE h3(c, 
b150: 64 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  d);.  INSERT INT
b160: 4f 20 68 33 20 56 41 4c 55 45 53 28 31 2c 20 4e  O h3 VALUES(1, N
b170: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
b180: 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28 32 2c  NTO h3 VALUES(2,
b190: 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54   NULL);.  INSERT
b1a0: 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28   INTO h3 VALUES(
b1b0: 33 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45  3, NULL);.  INSE
b1c0: 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45  RT INTO h3 VALUE
b1d0: 53 28 34 2c 20 27 32 27 29 3b 0a 20 20 49 4e 53  S(4, '2');.  INS
b1e0: 45 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55  ERT INTO h3 VALU
b1f0: 45 53 28 35 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  ES(5, NULL);.  I
b200: 4e 53 45 52 54 20 49 4e 54 4f 20 68 33 20 56 41  NSERT INTO h3 VA
b210: 4c 55 45 53 28 36 2c 20 27 32 2c 33 27 29 3b 0a  LUES(6, '2,3');.
b220: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33    INSERT INTO h3
b230: 20 56 41 4c 55 45 53 28 37 2c 20 4e 55 4c 4c 29   VALUES(7, NULL)
b240: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
b250: 68 33 20 56 41 4c 55 45 53 28 38 2c 20 27 32 2c  h3 VALUES(8, '2,
b260: 34 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  4');.  INSERT IN
b270: 54 4f 20 68 33 20 56 41 4c 55 45 53 28 39 2c 20  TO h3 VALUES(9, 
b280: 27 33 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56  '3');.} {}..# EV
b290: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37  IDENCE-OF: R-607
b2a0: 37 30 2d 31 30 36 31 32 20 4f 6e 65 20 6f 66 20  70-10612 One of 
b2b0: 74 68 65 20 41 4c 4c 20 6f 72 20 44 49 53 54 49  the ALL or DISTI
b2c0: 4e 43 54 20 6b 65 79 77 6f 72 64 73 20 6d 61 79  NCT keywords may
b2d0: 0a 23 20 66 6f 6c 6c 6f 77 20 74 68 65 20 53 45  .# follow the SE
b2e0: 4c 45 43 54 20 6b 65 79 77 6f 72 64 20 69 6e 20  LECT keyword in 
b2f0: 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  a simple SELECT 
b300: 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f  statement..#.do_
b310: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
b320: 65 6c 65 63 74 2d 35 2e 31 20 7b 0a 20 20 31 20  elect-5.1 {.  1 
b330: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 61 20    "SELECT ALL a 
b340: 46 52 4f 4d 20 68 31 22 20 20 20 20 20 20 7b 31  FROM h1"      {1
b350: 20 31 20 31 20 34 20 34 20 34 7d 0a 20 20 32 20   1 1 4 4 4}.  2 
b360: 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e    "SELECT DISTIN
b370: 43 54 20 61 20 46 52 4f 4d 20 68 31 22 20 7b 31  CT a FROM h1" {1
b380: 20 34 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   4}.}..# EVIDENC
b390: 45 2d 4f 46 3a 20 52 2d 30 38 38 36 31 2d 33 34  E-OF: R-08861-34
b3a0: 32 38 30 20 49 66 20 74 68 65 20 73 69 6d 70 6c  280 If the simpl
b3b0: 65 20 53 45 4c 45 43 54 20 69 73 20 61 20 53 45  e SELECT is a SE
b3c0: 4c 45 43 54 20 41 4c 4c 2c 20 74 68 65 6e 0a 23  LECT ALL, then.#
b3d0: 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 74 20   the entire set 
b3e0: 6f 66 20 72 65 73 75 6c 74 20 72 6f 77 73 20 61  of result rows a
b3f0: 72 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  re returned by t
b400: 68 65 20 53 45 4c 45 43 54 2e 0a 23 0a 23 20 45  he SELECT..#.# E
b410: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
b420: 39 31 31 2d 30 32 30 38 36 20 49 66 20 6e 65 69  911-02086 If nei
b430: 74 68 65 72 20 41 4c 4c 20 6f 72 20 44 49 53 54  ther ALL or DIST
b440: 49 4e 43 54 20 61 72 65 20 70 72 65 73 65 6e 74  INCT are present
b450: 2c 0a 23 20 74 68 65 6e 20 74 68 65 20 62 65 68  ,.# then the beh
b460: 61 76 69 6f 75 72 20 69 73 20 61 73 20 69 66 20  aviour is as if 
b470: 41 4c 4c 20 77 65 72 65 20 73 70 65 63 69 66 69  ALL were specifi
b480: 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ed..#.# EVIDENCE
b490: 2d 4f 46 3a 20 52 2d 31 34 34 34 32 2d 34 31 33  -OF: R-14442-413
b4a0: 30 35 20 49 66 20 74 68 65 20 73 69 6d 70 6c 65  05 If the simple
b4b0: 20 53 45 4c 45 43 54 20 69 73 20 61 20 53 45 4c   SELECT is a SEL
b4c0: 45 43 54 20 44 49 53 54 49 4e 43 54 2c 0a 23 20  ECT DISTINCT,.# 
b4d0: 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 20 72  then duplicate r
b4e0: 6f 77 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20  ows are removed 
b4f0: 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
b500: 72 65 73 75 6c 74 20 72 6f 77 73 20 62 65 66 6f  result rows befo
b510: 72 65 20 69 74 0a 23 20 69 73 20 72 65 74 75 72  re it.# is retur
b520: 6e 65 64 2e 0a 23 0a 23 20 20 20 54 68 65 20 74  ned..#.#   The t
b530: 68 72 65 65 20 74 65 73 74 61 62 6c 65 20 73 74  hree testable st
b540: 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 61  atements above a
b550: 72 65 20 74 65 73 74 65 64 20 62 79 20 65 5f 73  re tested by e_s
b560: 65 6c 65 63 74 2d 35 2e 32 2e 2a 2c 0a 23 20 20  elect-5.2.*,.#  
b570: 20 35 2e 33 2e 2a 20 61 6e 64 20 35 2e 34 2e 2a   5.3.* and 5.4.*
b580: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23   respectively..#
b590: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
b5a0: 20 65 5f 73 65 6c 65 63 74 2d 35 20 7b 0a 20 20   e_select-5 {.  
b5b0: 33 2e 31 20 22 53 45 4c 45 43 54 20 41 4c 4c 20  3.1 "SELECT ALL 
b5c0: 78 20 46 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20  x FROM h2" {One 
b5d0: 54 77 6f 20 54 68 72 65 65 20 46 6f 75 72 20 6f  Two Three Four o
b5e0: 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75  ne two three fou
b5f0: 72 7d 0a 20 20 33 2e 32 20 22 53 45 4c 45 43 54  r}.  3.2 "SELECT
b600: 20 41 4c 4c 20 78 20 46 52 4f 4d 20 68 31 2c 20   ALL x FROM h1, 
b610: 68 32 20 4f 4e 20 28 78 3d 62 29 22 20 7b 4f 6e  h2 ON (x=b)" {On
b620: 65 20 6f 6e 65 20 46 6f 75 72 20 66 6f 75 72 7d  e one Four four}
b630: 0a 0a 20 20 33 2e 31 20 22 53 45 4c 45 43 54 20  ..  3.1 "SELECT 
b640: 78 20 46 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20  x FROM h2" {One 
b650: 54 77 6f 20 54 68 72 65 65 20 46 6f 75 72 20 6f  Two Three Four o
b660: 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75  ne two three fou
b670: 72 7d 0a 20 20 33 2e 32 20 22 53 45 4c 45 43 54  r}.  3.2 "SELECT
b680: 20 78 20 46 52 4f 4d 20 68 31 2c 20 68 32 20 4f   x FROM h1, h2 O
b690: 4e 20 28 78 3d 62 29 22 20 7b 4f 6e 65 20 6f 6e  N (x=b)" {One on
b6a0: 65 20 46 6f 75 72 20 66 6f 75 72 7d 0a 0a 20 20  e Four four}..  
b6b0: 34 2e 31 20 22 53 45 4c 45 43 54 20 44 49 53 54  4.1 "SELECT DIST
b6c0: 49 4e 43 54 20 78 20 46 52 4f 4d 20 68 32 22 20  INCT x FROM h2" 
b6d0: 7b 4f 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46  {One Two Three F
b6e0: 6f 75 72 7d 0a 20 20 34 2e 32 20 22 53 45 4c 45  our}.  4.2 "SELE
b6f0: 43 54 20 44 49 53 54 49 4e 43 54 20 78 20 46 52  CT DISTINCT x FR
b700: 4f 4d 20 68 31 2c 20 68 32 20 4f 4e 20 28 78 3d  OM h1, h2 ON (x=
b710: 62 29 22 20 7b 4f 6e 65 20 46 6f 75 72 7d 0a 7d  b)" {One Four}.}
b720: 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46   ..# EVIDENCE-OF
b730: 3a 20 52 2d 30 32 30 35 34 2d 31 35 33 34 33 20  : R-02054-15343 
b740: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
b750: 20 6f 66 20 64 65 74 65 63 74 69 6e 67 20 64 75   of detecting du
b760: 70 6c 69 63 61 74 65 0a 23 20 72 6f 77 73 2c 20  plicate.# rows, 
b770: 74 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  two NULL values 
b780: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
b790: 6f 20 62 65 20 65 71 75 61 6c 2e 0a 23 0a 64 6f  o be equal..#.do
b7a0: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
b7b0: 73 65 6c 65 63 74 2d 35 2e 35 20 7b 0a 20 20 31  select-5.5 {.  1
b7c0: 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e    "SELECT DISTIN
b7d0: 43 54 20 64 20 46 52 4f 4d 20 68 33 22 20 7b 7b  CT d FROM h3" {{
b7e0: 7d 20 32 20 32 2c 33 20 32 2c 34 20 33 7d 0a 7d  } 2 2,3 2,4 3}.}
b7f0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b800: 20 52 2d 35 38 33 35 39 2d 35 32 31 31 32 20 54   R-58359-52112 T
b810: 68 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65 73 20  he normal rules 
b820: 66 6f 72 20 73 65 6c 65 63 74 69 6e 67 20 61 20  for selecting a 
b830: 63 6f 6c 6c 61 74 69 6f 6e 0a 23 20 73 65 71 75  collation.# sequ
b840: 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20  ence to compare 
b850: 74 65 78 74 20 76 61 6c 75 65 73 20 77 69 74 68  text values with
b860: 20 61 70 70 6c 79 2e 0a 23 0a 64 6f 5f 73 65 6c   apply..#.do_sel
b870: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
b880: 63 74 2d 35 2e 36 20 7b 0a 20 20 31 20 20 22 53  ct-5.6 {.  1  "S
b890: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 62  ELECT DISTINCT b
b8a0: 20 46 52 4f 4d 20 68 31 22 20 20 20 20 20 20 20   FROM h1"       
b8b0: 20 20 20 20 20 20 20 20 20 20 20 7b 6f 6e 65 20             {one 
b8c0: 49 20 69 20 66 6f 75 72 20 49 56 20 69 76 7d 0a  I i four IV iv}.
b8d0: 20 20 32 20 20 22 53 45 4c 45 43 54 20 44 49 53    2  "SELECT DIS
b8e0: 54 49 4e 43 54 20 62 20 43 4f 4c 4c 41 54 45 20  TINCT b COLLATE 
b8f0: 6e 6f 63 61 73 65 20 46 52 4f 4d 20 68 31 22 20  nocase FROM h1" 
b900: 20 20 7b 6f 6e 65 20 49 20 66 6f 75 72 20 49 56    {one I four IV
b910: 7d 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20 44  }.  3  "SELECT D
b920: 49 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20 68  ISTINCT x FROM h
b930: 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2"              
b940: 20 20 20 20 7b 4f 6e 65 20 54 77 6f 20 54 68 72      {One Two Thr
b950: 65 65 20 46 6f 75 72 7d 0a 20 20 34 20 20 22 53  ee Four}.  4  "S
b960: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
b970: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20   COLLATE binary 
b980: 46 52 4f 4d 20 68 32 22 20 20 20 7b 0a 20 20 20  FROM h2"   {.   
b990: 20 4f 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46   One Two Three F
b9a0: 6f 75 72 20 6f 6e 65 20 74 77 6f 20 74 68 72 65  our one two thre
b9b0: 65 20 66 6f 75 72 0a 20 20 7d 0a 7d 0a 0a 23 2d  e four.  }.}..#-
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
ba10: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
ba20: 20 65 5f 73 65 6c 65 63 74 2d 37 2e 2a 20 2d 20   e_select-7.* - 
ba30: 74 65 73 74 20 74 68 61 74 20 73 74 61 74 65 6d  test that statem
ba40: 65 6e 74 73 20 6d 61 64 65 20 74 6f 20 64 6f 0a  ents made to do.
ba50: 23 20 77 69 74 68 20 63 6f 6d 70 6f 75 6e 64 20  # with compound 
ba60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ba70: 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 23  s are correct..#
ba80: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
ba90: 20 52 2d 33 39 33 36 38 2d 36 34 33 33 33 20 49   R-39368-64333 I
baa0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  n a compound SEL
bab0: 45 43 54 2c 20 61 6c 6c 20 74 68 65 20 63 6f 6e  ECT, all the con
bac0: 73 74 69 74 75 65 6e 74 0a 23 20 53 45 4c 45 43  stituent.# SELEC
bad0: 54 73 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  Ts must return t
bae0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
baf0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
bb00: 2e 0a 23 0a 23 20 20 20 41 6c 6c 20 74 68 65 20  ..#.#   All the 
bb10: 6f 74 68 65 72 20 74 65 73 74 73 20 69 6e 20 74  other tests in t
bb20: 68 69 73 20 73 65 63 74 69 6f 6e 20 75 73 65 20  his section use 
bb30: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
bb40: 20 63 72 65 61 74 65 64 0a 23 20 20 20 75 73 69   created.#   usi
bb50: 6e 67 20 63 6f 6d 70 6f 6e 65 6e 74 20 53 45 4c  ng component SEL
bb60: 45 43 54 73 20 74 68 61 74 20 64 6f 20 72 65 74  ECTs that do ret
bb70: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
bb80: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0a  ber of columns..
bb90: 23 20 20 20 53 6f 20 74 68 65 20 74 65 73 74 73  #   So the tests
bba0: 20 68 65 72 65 20 6a 75 73 74 20 73 68 6f 77 20   here just show 
bbb0: 74 68 61 74 20 69 74 20 69 73 20 61 6e 20 65 72  that it is an er
bbc0: 72 6f 72 20 74 6f 20 61 74 74 65 6d 70 74 20 6f  ror to attempt o
bbd0: 74 68 65 72 77 69 73 65 2e 0a 23 0a 64 72 6f 70  therwise..#.drop
bbe0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
bbf0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
bc00: 6c 65 63 74 2d 37 2e 31 2e 30 20 7b 0a 20 20 43  lect-7.1.0 {.  C
bc10: 52 45 41 54 45 20 54 41 42 4c 45 20 6a 31 28 61  REATE TABLE j1(a
bc20: 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
bc30: 45 20 54 41 42 4c 45 20 6a 32 28 65 2c 20 66 29  E TABLE j2(e, f)
bc40: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
bc50: 20 6a 33 28 67 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f   j3(g);.} {}.do_
bc60: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
bc70: 65 6c 65 63 74 2d 37 2e 31 20 2d 65 72 72 6f 72  elect-7.1 -error
bc80: 20 7b 0a 20 20 53 45 4c 45 43 54 73 20 74 6f 20   {.  SELECTs to 
bc90: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
bca0: 68 74 20 6f 66 20 25 73 20 64 6f 20 6e 6f 74 20  ht of %s do not 
bcb0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
bcc0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
bcd0: 6f 6c 75 6d 6e 73 0a 7d 20 7b 0a 20 20 31 20 20  olumns.} {.  1  
bce0: 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52   "SELECT a, b FR
bcf0: 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 41  OM j1    UNION A
bd00: 4c 4c 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d  LL SELECT g FROM
bd10: 20 6a 33 22 20 20 20 20 7b 7b 55 4e 49 4f 4e 20   j3"    {{UNION 
bd20: 41 4c 4c 7d 7d 0a 20 20 32 20 20 20 22 53 45 4c  ALL}}.  2   "SEL
bd30: 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 31  ECT *    FROM j1
bd40: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45      UNION ALL SE
bd50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20  LECT * FROM j3" 
bd60: 20 20 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d     {{UNION ALL}}
bd70: 0a 20 20 33 20 20 20 22 53 45 4c 45 43 54 20 61  .  3   "SELECT a
bd80: 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 55  , b FROM j1    U
bd90: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
bda0: 67 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b 7b  g FROM j3"    {{
bdb0: 55 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a 20 20 34 20  UNION ALL}}.  4 
bdc0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46    "SELECT a, b F
bdd0: 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20  ROM j1    UNION 
bde0: 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ALL SELECT * FRO
bdf0: 4d 20 6a 33 2c 6a 32 22 20 7b 7b 55 4e 49 4f 4e  M j3,j2" {{UNION
be00: 20 41 4c 4c 7d 7d 0a 20 20 35 20 20 20 22 53 45   ALL}}.  5   "SE
be10: 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a  LECT *    FROM j
be20: 33 2c 6a 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  3,j2 UNION ALL S
be30: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
be40: 6a 31 22 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d  j1" {{UNION ALL}
be50: 7d 0a 0a 20 20 36 20 20 20 22 53 45 4c 45 43 54  }..  6   "SELECT
be60: 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20   a, b FROM j1   
be70: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 67 20   UNION SELECT g 
be80: 46 52 4f 4d 20 6a 33 22 20 20 20 20 20 20 20 20  FROM j3"        
be90: 7b 55 4e 49 4f 4e 7d 0a 20 20 37 20 20 20 22 53  {UNION}.  7   "S
bea0: 45 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20  ELECT *    FROM 
beb0: 6a 31 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45  j1    UNION SELE
bec0: 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20 20 20  CT * FROM j3"   
bed0: 20 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 20 20 38       {UNION}.  8
bee0: 20 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20     "SELECT a, b 
bef0: 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e  FROM j1    UNION
bf00: 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a   SELECT g FROM j
bf10: 33 22 20 20 20 20 20 20 20 20 7b 55 4e 49 4f 4e  3"        {UNION
bf20: 7d 0a 20 20 39 20 20 20 22 53 45 4c 45 43 54 20  }.  9   "SELECT 
bf30: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20  a, b FROM j1    
bf40: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46  UNION SELECT * F
bf50: 52 4f 4d 20 6a 33 2c 6a 32 22 20 20 20 20 20 7b  ROM j3,j2"     {
bf60: 55 4e 49 4f 4e 7d 0a 20 20 31 30 20 20 22 53 45  UNION}.  10  "SE
bf70: 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a  LECT *    FROM j
bf80: 33 2c 6a 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  3,j2 UNION SELEC
bf90: 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20  T a, b FROM j1" 
bfa0: 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 0a 20 20 31      {UNION}..  1
bfb0: 31 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20  1  "SELECT a, b 
bfc0: 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54 45 52  FROM j1    INTER
bfd0: 53 45 43 54 20 53 45 4c 45 43 54 20 67 20 46 52  SECT SELECT g FR
bfe0: 4f 4d 20 6a 33 22 20 20 20 20 7b 49 4e 54 45 52  OM j3"    {INTER
bff0: 53 45 43 54 7d 0a 20 20 31 32 20 20 22 53 45 4c  SECT}.  12  "SEL
c000: 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 31  ECT *    FROM j1
c010: 20 20 20 20 49 4e 54 45 52 53 45 43 54 20 53 45      INTERSECT SE
c020: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20  LECT * FROM j3" 
c030: 20 20 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20     {INTERSECT}. 
c040: 20 31 33 20 20 22 53 45 4c 45 43 54 20 61 2c 20   13  "SELECT a, 
c050: 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54  b FROM j1    INT
c060: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 67 20  ERSECT SELECT g 
c070: 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b 49 4e 54  FROM j3"    {INT
c080: 45 52 53 45 43 54 7d 0a 20 20 31 34 20 20 22 53  ERSECT}.  14  "S
c090: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
c0a0: 6a 31 20 20 20 20 49 4e 54 45 52 53 45 43 54 20  j1    INTERSECT 
c0b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33  SELECT * FROM j3
c0c0: 2c 6a 32 22 20 7b 49 4e 54 45 52 53 45 43 54 7d  ,j2" {INTERSECT}
c0d0: 0a 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 2a  .  15  "SELECT *
c0e0: 20 20 20 20 46 52 4f 4d 20 6a 33 2c 6a 32 20 49      FROM j3,j2 I
c0f0: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
c100: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20 7b 49  a, b FROM j1" {I
c110: 4e 54 45 52 53 45 43 54 7d 0a 0a 20 20 31 36 20  NTERSECT}..  16 
c120: 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52   "SELECT a, b FR
c130: 4f 4d 20 6a 31 20 20 20 20 45 58 43 45 50 54 20  OM j1    EXCEPT 
c140: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33  SELECT g FROM j3
c150: 22 20 20 20 20 20 20 20 7b 45 58 43 45 50 54 7d  "       {EXCEPT}
c160: 0a 20 20 31 37 20 20 22 53 45 4c 45 43 54 20 2a  .  17  "SELECT *
c170: 20 20 20 20 46 52 4f 4d 20 6a 31 20 20 20 20 45      FROM j1    E
c180: 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46  XCEPT SELECT * F
c190: 52 4f 4d 20 6a 33 22 20 20 20 20 20 20 20 7b 45  ROM j3"       {E
c1a0: 58 43 45 50 54 7d 0a 20 20 31 38 20 20 22 53 45  XCEPT}.  18  "SE
c1b0: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a  LECT a, b FROM j
c1c0: 31 20 20 20 20 45 58 43 45 50 54 20 53 45 4c 45  1    EXCEPT SELE
c1d0: 43 54 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20  CT g FROM j3"   
c1e0: 20 20 20 20 7b 45 58 43 45 50 54 7d 0a 20 20 31      {EXCEPT}.  1
c1f0: 39 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20  9  "SELECT a, b 
c200: 46 52 4f 4d 20 6a 31 20 20 20 20 45 58 43 45 50  FROM j1    EXCEP
c210: 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  T SELECT * FROM 
c220: 6a 33 2c 6a 32 22 20 20 20 20 7b 45 58 43 45 50  j3,j2"    {EXCEP
c230: 54 7d 0a 20 20 32 30 20 20 22 53 45 4c 45 43 54  T}.  20  "SELECT
c240: 20 2a 20 20 20 20 46 52 4f 4d 20 6a 33 2c 6a 32   *    FROM j3,j2
c250: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 61   EXCEPT SELECT a
c260: 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20 20 20 20  , b FROM j1"    
c270: 7b 45 58 43 45 50 54 7d 0a 7d 20 0a 0a 23 20 45  {EXCEPT}.} ..# E
c280: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
c290: 34 35 30 2d 31 31 31 35 32 20 41 73 20 74 68 65  450-11152 As the
c2a0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61   components of a
c2b0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
c2c0: 20 6d 75 73 74 0a 23 20 62 65 20 73 69 6d 70 6c   must.# be simpl
c2d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c2e0: 6e 74 73 2c 20 74 68 65 79 20 6d 61 79 20 6e 6f  nts, they may no
c2f0: 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
c300: 42 59 20 6f 72 20 4c 49 4d 49 54 0a 23 20 63 6c  BY or LIMIT.# cl
c310: 61 75 73 65 73 2e 0a 23 20 0a 66 6f 72 65 61 63  auses..# .foreac
c320: 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 6f 70 31  h {tn select op1
c330: 20 6f 70 32 7d 20 7b 0a 20 20 31 20 20 20 22 53   op2} {.  1   "S
c340: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
c350: 4f 52 44 45 52 20 42 59 20 61 20 55 4e 49 4f 4e  ORDER BY a UNION
c360: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52   ALL SELECT * FR
c370: 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20  OM j2,j3" .     
c380: 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 55 4e 49   {ORDER BY} {UNI
c390: 4f 4e 20 41 4c 4c 7d 0a 20 20 32 20 20 20 22 53  ON ALL}.  2   "S
c3a0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
c3b0: 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20  ROM j1 ORDER BY 
c3c0: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
c3d0: 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a  CT max(e) FROM j
c3e0: 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20  2".      {ORDER 
c3f0: 42 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a  BY} {UNION ALL}.
c400: 20 20 33 20 20 20 22 53 45 4c 45 43 54 20 63 6f    3   "SELECT co
c410: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a  unt(*), * FROM j
c420: 31 20 4f 52 44 45 52 20 42 59 20 31 2c 32 2c 33  1 ORDER BY 1,2,3
c430: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
c440: 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 22 0a 20  T *,* FROM j2". 
c450: 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20       {ORDER BY} 
c460: 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20 34 20  {UNION ALL}.  4 
c470: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
c480: 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 55 4e 49   j1 LIMIT 10 UNI
c490: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20  ON ALL SELECT * 
c4a0: 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20  FROM j2,j3" .   
c4b0: 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 20     LIMIT {UNION 
c4c0: 41 4c 4c 7d 0a 20 20 35 20 20 20 22 53 45 4c 45  ALL}.  5   "SELE
c4d0: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d  CT * FROM j1 LIM
c4e0: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 20 55  IT 10 OFFSET 5 U
c4f0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
c500: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20  * FROM j2,j3" . 
c510: 20 20 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f       LIMIT {UNIO
c520: 4e 20 41 4c 4c 7d 0a 20 20 36 20 20 20 22 53 45  N ALL}.  6   "SE
c530: 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a 31 20 4c  LECT a FROM j1 L
c540: 49 4d 49 54 20 28 53 45 4c 45 43 54 20 65 20 46  IMIT (SELECT e F
c550: 52 4f 4d 20 6a 32 29 20 55 4e 49 4f 4e 20 41 4c  ROM j2) UNION AL
c560: 4c 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  L SELECT g FROM 
c570: 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49  j2,j3" .      LI
c580: 4d 49 54 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a  MIT {UNION ALL}.
c590: 0a 20 20 37 20 20 20 22 53 45 4c 45 43 54 20 2a  .  7   "SELECT *
c5a0: 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42   FROM j1 ORDER B
c5b0: 59 20 61 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  Y a UNION SELECT
c5c0: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a   * FROM j2,j3" .
c5d0: 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d        {ORDER BY}
c5e0: 20 7b 55 4e 49 4f 4e 7d 0a 20 20 38 20 20 20 22   {UNION}.  8   "
c5f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
c600: 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59  FROM j1 ORDER BY
c610: 20 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20   1 UNION SELECT 
c620: 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 22 0a  max(e) FROM j2".
c630: 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d        {ORDER BY}
c640: 20 7b 55 4e 49 4f 4e 7d 0a 20 20 39 20 20 20 22   {UNION}.  9   "
c650: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
c660: 20 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52   * FROM j1 ORDER
c670: 20 42 59 20 31 2c 32 2c 33 20 55 4e 49 4f 4e 20   BY 1,2,3 UNION 
c680: 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20  SELECT *,* FROM 
c690: 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52  j2".      {ORDER
c6a0: 20 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a 20 20 31   BY} {UNION}.  1
c6b0: 30 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  0  "SELECT * FRO
c6c0: 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 55 4e  M j1 LIMIT 10 UN
c6d0: 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ION SELECT * FRO
c6e0: 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20  M j2,j3" .      
c6f0: 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 7d 0a 20 20  LIMIT {UNION}.  
c700: 31 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  11  "SELECT * FR
c710: 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f  OM j1 LIMIT 10 O
c720: 46 46 53 45 54 20 35 20 55 4e 49 4f 4e 20 53 45  FFSET 5 UNION SE
c730: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a  LECT * FROM j2,j
c740: 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20  3" .      LIMIT 
c750: 7b 55 4e 49 4f 4e 7d 0a 20 20 31 32 20 20 22 53  {UNION}.  12  "S
c760: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a 31 20  ELECT a FROM j1 
c770: 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20 65 20  LIMIT (SELECT e 
c780: 46 52 4f 4d 20 6a 32 29 20 55 4e 49 4f 4e 20 53  FROM j2) UNION S
c790: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c  ELECT g FROM j2,
c7a0: 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54  j3" .      LIMIT
c7b0: 20 7b 55 4e 49 4f 4e 7d 0a 0a 20 20 31 33 20 20   {UNION}..  13  
c7c0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
c7d0: 31 20 4f 52 44 45 52 20 42 59 20 61 20 45 58 43  1 ORDER BY a EXC
c7e0: 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  EPT SELECT * FRO
c7f0: 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20  M j2,j3" .      
c800: 7b 4f 52 44 45 52 20 42 59 7d 20 7b 45 58 43 45  {ORDER BY} {EXCE
c810: 50 54 7d 0a 20 20 31 34 20 20 22 53 45 4c 45 43  PT}.  14  "SELEC
c820: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
c830: 6a 31 20 4f 52 44 45 52 20 42 59 20 31 20 45 58  j1 ORDER BY 1 EX
c840: 43 45 50 54 20 53 45 4c 45 43 54 20 6d 61 78 28  CEPT SELECT max(
c850: 65 29 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20  e) FROM j2".    
c860: 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 45 58    {ORDER BY} {EX
c870: 43 45 50 54 7d 0a 20 20 31 35 20 20 22 53 45 4c  CEPT}.  15  "SEL
c880: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20  ECT count(*), * 
c890: 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59  FROM j1 ORDER BY
c8a0: 20 31 2c 32 2c 33 20 45 58 43 45 50 54 20 53 45   1,2,3 EXCEPT SE
c8b0: 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32  LECT *,* FROM j2
c8c0: 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42  ".      {ORDER B
c8d0: 59 7d 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 36  Y} {EXCEPT}.  16
c8e0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
c8f0: 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 45 58 43   j1 LIMIT 10 EXC
c900: 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  EPT SELECT * FRO
c910: 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20  M j2,j3" .      
c920: 4c 49 4d 49 54 20 7b 45 58 43 45 50 54 7d 0a 20  LIMIT {EXCEPT}. 
c930: 20 31 37 20 20 22 53 45 4c 45 43 54 20 2a 20 46   17  "SELECT * F
c940: 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20  ROM j1 LIMIT 10 
c950: 4f 46 46 53 45 54 20 35 20 45 58 43 45 50 54 20  OFFSET 5 EXCEPT 
c960: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32  SELECT * FROM j2
c970: 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49  ,j3" .      LIMI
c980: 54 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 38 20  T {EXCEPT}.  18 
c990: 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   "SELECT a FROM 
c9a0: 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54  j1 LIMIT (SELECT
c9b0: 20 65 20 46 52 4f 4d 20 6a 32 29 20 45 58 43 45   e FROM j2) EXCE
c9c0: 50 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d  PT SELECT g FROM
c9d0: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c   j2,j3" .      L
c9e0: 49 4d 49 54 20 7b 45 58 43 45 50 54 7d 0a 0a 20  IMIT {EXCEPT}.. 
c9f0: 20 31 39 20 20 22 53 45 4c 45 43 54 20 2a 20 46   19  "SELECT * F
ca00: 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20  ROM j1 ORDER BY 
ca10: 61 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  a INTERSECT SELE
ca20: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22  CT * FROM j2,j3"
ca30: 20 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42   .      {ORDER B
ca40: 59 7d 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20  Y} {INTERSECT}. 
ca50: 20 32 30 20 20 22 53 45 4c 45 43 54 20 63 6f 75   20  "SELECT cou
ca60: 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 4f 52  nt(*) FROM j1 OR
ca70: 44 45 52 20 42 59 20 31 20 49 4e 54 45 52 53 45  DER BY 1 INTERSE
ca80: 43 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29  CT SELECT max(e)
ca90: 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20   FROM j2".      
caa0: 7b 4f 52 44 45 52 20 42 59 7d 20 7b 49 4e 54 45  {ORDER BY} {INTE
cab0: 52 53 45 43 54 7d 0a 20 20 32 31 20 20 22 53 45  RSECT}.  21  "SE
cac0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a  LECT count(*), *
cad0: 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42   FROM j1 ORDER B
cae0: 59 20 31 2c 32 2c 33 20 49 4e 54 45 52 53 45 43  Y 1,2,3 INTERSEC
caf0: 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f  T SELECT *,* FRO
cb00: 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44  M j2".      {ORD
cb10: 45 52 20 42 59 7d 20 7b 49 4e 54 45 52 53 45 43  ER BY} {INTERSEC
cb20: 54 7d 0a 20 20 32 32 20 20 22 53 45 4c 45 43 54  T}.  22  "SELECT
cb30: 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54   * FROM j1 LIMIT
cb40: 20 31 30 20 49 4e 54 45 52 53 45 43 54 20 53 45   10 INTERSECT SE
cb50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a  LECT * FROM j2,j
cb60: 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20  3" .      LIMIT 
cb70: 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20 32 33  {INTERSECT}.  23
cb80: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
cb90: 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f 46 46   j1 LIMIT 10 OFF
cba0: 53 45 54 20 35 20 49 4e 54 45 52 53 45 43 54 20  SET 5 INTERSECT 
cbb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32  SELECT * FROM j2
cbc0: 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49  ,j3" .      LIMI
cbd0: 54 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20  T {INTERSECT}.  
cbe0: 32 34 20 20 22 53 45 4c 45 43 54 20 61 20 46 52  24  "SELECT a FR
cbf0: 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c  OM j1 LIMIT (SEL
cc00: 45 43 54 20 65 20 46 52 4f 4d 20 6a 32 29 20 49  ECT e FROM j2) I
cc10: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
cc20: 67 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20  g FROM j2,j3" . 
cc30: 20 20 20 20 20 4c 49 4d 49 54 20 7b 49 4e 54 45       LIMIT {INTE
cc40: 52 53 45 43 54 7d 0a 7d 20 7b 0a 20 20 73 65 74  RSECT}.} {.  set
cc50: 20 65 72 72 20 22 24 6f 70 31 20 63 6c 61 75 73   err "$op1 claus
cc60: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
cc70: 74 65 72 20 24 6f 70 32 20 6e 6f 74 20 62 65 66  ter $op2 not bef
cc80: 6f 72 65 22 0a 20 20 64 6f 5f 63 61 74 63 68 73  ore".  do_catchs
cc90: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
cca0: 2d 37 2e 32 2e 24 74 6e 20 24 73 65 6c 65 63 74  -7.2.$tn $select
ccb0: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d   [list 1 $err].}
ccc0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
ccd0: 20 52 2d 32 32 38 37 34 2d 33 32 36 35 35 20 4f   R-22874-32655 O
cce0: 52 44 45 52 20 42 59 20 61 6e 64 20 4c 49 4d 49  RDER BY and LIMI
ccf0: 54 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6f 6e  T clauses may on
cd00: 6c 79 20 6f 63 63 75 72 0a 23 20 61 74 20 74 68  ly occur.# at th
cd10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 6e 74  e end of the ent
cd20: 69 72 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ire compound SEL
cd30: 45 43 54 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ECT..#.foreach {
cd40: 74 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31  tn select} {.  1
cd50: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
cd60: 4d 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M j1 UNION ALL S
cd70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
cd80: 6a 33 20 4f 52 44 45 52 20 42 59 20 61 22 0a 20  j3 ORDER BY a". 
cd90: 20 32 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75   2   "SELECT cou
cda0: 6e 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e  nt(*) FROM j1 UN
cdb0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 6d  ION ALL SELECT m
cdc0: 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 20 4f 52  ax(e) FROM j2 OR
cdd0: 44 45 52 20 42 59 20 31 22 0a 20 20 33 20 20 20  DER BY 1".  3   
cde0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
cdf0: 2c 20 2a 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  , * FROM j1 UNIO
ce00: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 2c 2a  N ALL SELECT *,*
ce10: 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42   FROM j2 ORDER B
ce20: 59 20 31 2c 32 2c 33 22 0a 20 20 34 20 20 20 22  Y 1,2,3".  4   "
ce30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
ce40: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
ce50: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c  T * FROM j2,j3 L
ce60: 49 4d 49 54 20 31 30 22 20 0a 20 20 35 20 20 20  IMIT 10" .  5   
ce70: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
ce80: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
ce90: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT * FROM j2,j3 
cea0: 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
ceb0: 35 22 20 0a 20 20 36 20 20 20 22 53 45 4c 45 43  5" .  6   "SELEC
cec0: 54 20 61 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  T a FROM j1 UNIO
ced0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 67 20 46  N ALL SELECT g F
cee0: 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20  ROM j2,j3 LIMIT 
cef0: 28 53 45 4c 45 43 54 20 31 30 29 22 20 0a 0a 20  (SELECT 10)" .. 
cf00: 20 37 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   7   "SELECT * F
cf10: 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM j1 UNION SEL
cf20: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
cf30: 20 4f 52 44 45 52 20 42 59 20 61 22 0a 20 20 38   ORDER BY a".  8
cf40: 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
cf50: 28 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f  (*) FROM j1 UNIO
cf60: 4e 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20  N SELECT max(e) 
cf70: 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59  FROM j2 ORDER BY
cf80: 20 31 22 0a 20 20 39 20 20 20 22 53 45 4c 45 43   1".  9   "SELEC
cf90: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46 52  T count(*), * FR
cfa0: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM j1 UNION SELE
cfb0: 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f  CT *,* FROM j2 O
cfc0: 52 44 45 52 20 42 59 20 31 2c 32 2c 33 22 0a 20  RDER BY 1,2,3". 
cfd0: 20 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20 46   10  "SELECT * F
cfe0: 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM j1 UNION SEL
cff0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
d000: 20 4c 49 4d 49 54 20 31 30 22 20 0a 20 20 31 31   LIMIT 10" .  11
d010: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
d020: 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   j1 UNION SELECT
d030: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49   * FROM j2,j3 LI
d040: 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22  MIT 10 OFFSET 5"
d050: 20 0a 20 20 31 32 20 20 22 53 45 4c 45 43 54 20   .  12  "SELECT 
d060: 61 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20  a FROM j1 UNION 
d070: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32  SELECT g FROM j2
d080: 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43  ,j3 LIMIT (SELEC
d090: 54 20 31 30 29 22 20 0a 0a 20 20 31 33 20 20 22  T 10)" ..  13  "
d0a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
d0b0: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
d0c0: 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f 52 44 45   FROM j2,j3 ORDE
d0d0: 52 20 42 59 20 61 22 0a 20 20 31 34 20 20 22 53  R BY a".  14  "S
d0e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
d0f0: 52 4f 4d 20 6a 31 20 45 58 43 45 50 54 20 53 45  ROM j1 EXCEPT SE
d100: 4c 45 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d  LECT max(e) FROM
d110: 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 22 0a   j2 ORDER BY 1".
d120: 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 63 6f    15  "SELECT co
d130: 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a  unt(*), * FROM j
d140: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
d150: 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45  *,* FROM j2 ORDE
d160: 52 20 42 59 20 31 2c 32 2c 33 22 0a 20 20 31 36  R BY 1,2,3".  16
d170: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
d180: 20 6a 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   j1 EXCEPT SELEC
d190: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c  T * FROM j2,j3 L
d1a0: 49 4d 49 54 20 31 30 22 20 0a 20 20 31 37 20 20  IMIT 10" .  17  
d1b0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a  "SELECT * FROM j
d1c0: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
d1d0: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d  * FROM j2,j3 LIM
d1e0: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
d1f0: 0a 20 20 31 38 20 20 22 53 45 4c 45 43 54 20 61  .  18  "SELECT a
d200: 20 46 52 4f 4d 20 6a 31 20 45 58 43 45 50 54 20   FROM j1 EXCEPT 
d210: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32  SELECT g FROM j2
d220: 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43  ,j3 LIMIT (SELEC
d230: 54 20 31 30 29 22 20 0a 0a 20 20 31 39 20 20 22  T 10)" ..  19  "
d240: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
d250: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
d260: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f  T * FROM j2,j3 O
d270: 52 44 45 52 20 42 59 20 61 22 0a 20 20 32 30 20  RDER BY a".  20 
d280: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
d290: 29 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53  ) FROM j1 INTERS
d2a0: 45 43 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65  ECT SELECT max(e
d2b0: 29 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20  ) FROM j2 ORDER 
d2c0: 42 59 20 31 22 0a 20 20 32 31 20 20 22 53 45 4c  BY 1".  21  "SEL
d2d0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20  ECT count(*), * 
d2e0: 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43  FROM j1 INTERSEC
d2f0: 54 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f  T SELECT *,* FRO
d300: 4d 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 2c  M j2 ORDER BY 1,
d310: 32 2c 33 22 0a 20 20 32 32 20 20 22 53 45 4c 45  2,3".  22  "SELE
d320: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54  CT * FROM j1 INT
d330: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
d340: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54  FROM j2,j3 LIMIT
d350: 20 31 30 22 20 0a 20 20 32 33 20 20 22 53 45 4c   10" .  23  "SEL
d360: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e  ECT * FROM j1 IN
d370: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a  TERSECT SELECT *
d380: 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49   FROM j2,j3 LIMI
d390: 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 0a  T 10 OFFSET 5" .
d3a0: 20 20 32 34 20 20 22 53 45 4c 45 43 54 20 61 20    24  "SELECT a 
d3b0: 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43  FROM j1 INTERSEC
d3c0: 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  T SELECT g FROM 
d3d0: 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c  j2,j3 LIMIT (SEL
d3e0: 45 43 54 20 31 30 29 22 20 0a 7d 20 7b 0a 20 20  ECT 10)" .} {.  
d3f0: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
d400: 2d 37 2e 33 2e 24 74 6e 20 7b 20 63 61 74 63 68  -7.3.$tn { catch
d410: 20 7b 65 78 65 63 73 71 6c 20 24 73 65 6c 65 63   {execsql $selec
d420: 74 7d 20 6d 73 67 20 7d 20 30 0a 7d 0a 0a 23 20  t} msg } 0.}..# 
d430: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
d440: 38 35 33 31 2d 33 36 35 34 33 20 41 20 63 6f 6d  8531-36543 A com
d450: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 63 72 65  pound SELECT cre
d460: 61 74 65 64 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ated using UNION
d470: 20 41 4c 4c 0a 23 20 6f 70 65 72 61 74 6f 72 20   ALL.# operator 
d480: 72 65 74 75 72 6e 73 20 61 6c 6c 20 74 68 65 20  returns all the 
d490: 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 53 45  rows from the SE
d4a0: 4c 45 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74  LECT to the left
d4b0: 20 6f 66 20 74 68 65 20 55 4e 49 4f 4e 0a 23 20   of the UNION.# 
d4c0: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2c 20 61 6e  ALL operator, an
d4d0: 64 20 61 6c 6c 20 74 68 65 20 72 6f 77 73 20 66  d all the rows f
d4e0: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 74  rom the SELECT t
d4f0: 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 69  o the right of i
d500: 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  t..#.drop_all_ta
d510: 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  bles.do_execsql_
d520: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e  test e_select-7.
d530: 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  4.0 {.  CREATE T
d540: 41 42 4c 45 20 71 31 28 61 20 54 45 58 54 2c 20  ABLE q1(a TEXT, 
d550: 62 20 49 4e 54 45 47 45 52 2c 20 63 29 3b 0a 20  b INTEGER, c);. 
d560: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 71 32   CREATE TABLE q2
d570: 28 64 20 4e 55 4d 42 45 52 2c 20 65 20 42 4c 4f  (d NUMBER, e BLO
d580: 42 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  B);.  CREATE TAB
d590: 4c 45 20 71 33 28 66 20 52 45 41 4c 2c 20 67 29  LE q3(f REAL, g)
d5a0: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
d5b0: 20 71 31 20 56 41 4c 55 45 53 28 31 36 2c 20 2d   q1 VALUES(16, -
d5c0: 38 37 2e 36 36 2c 20 4e 55 4c 4c 29 3b 0a 20 20  87.66, NULL);.  
d5d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 31 20 56  INSERT INTO q1 V
d5e0: 41 4c 55 45 53 28 27 6c 65 67 69 62 6c 65 27 2c  ALUES('legible',
d5f0: 20 39 34 2c 20 2d 34 32 2e 34 37 29 3b 0a 20 20   94, -42.47);.  
d600: 49 4e 53 45 52 54 20 49 4e 54 4f 20 71 31 20 56  INSERT INTO q1 V
d610: 41 4c 55 45 53 28 27 62 65 61 75 74 79 27 2c 20  ALUES('beauty', 
d620: 33 36 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 49 4e  36, NULL);..  IN
d630: 53 45 52 54 20 49 4e 54 4f 20 71 32 20 56 41 4c  SERT INTO q2 VAL
d640: 55 45 53 28 27 6c 65 67 69 62 6c 65 27 2c 20 31  UES('legible', 1
d650: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
d660: 20 71 32 20 56 41 4c 55 45 53 28 27 62 65 61 75   q2 VALUES('beau
d670: 74 79 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  ty', 2);.  INSER
d680: 54 20 49 4e 54 4f 20 71 32 20 56 41 4c 55 45 53  T INTO q2 VALUES
d690: 28 2d 36 35 2e 39 31 2c 20 34 29 3b 0a 20 20 49  (-65.91, 4);.  I
d6a0: 4e 53 45 52 54 20 49 4e 54 4f 20 71 32 20 56 41  NSERT INTO q2 VA
d6b0: 4c 55 45 53 28 27 65 6d 61 6e 61 74 69 6e 67 27  LUES('emanating'
d6c0: 2c 20 2d 31 36 2e 35 36 29 3b 0a 0a 20 20 49 4e  , -16.56);..  IN
d6d0: 53 45 52 54 20 49 4e 54 4f 20 71 33 20 56 41 4c  SERT INTO q3 VAL
d6e0: 55 45 53 28 27 62 65 61 75 74 79 27 2c 20 32 29  UES('beauty', 2)
d6f0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d700: 71 33 20 56 41 4c 55 45 53 28 27 62 65 61 75 74  q3 VALUES('beaut
d710: 79 27 2c 20 32 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f  y', 2);.} {}.do_
d720: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
d730: 65 6c 65 63 74 2d 37 2e 34 20 7b 0a 20 20 31 20  elect-7.4 {.  1 
d740: 20 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    {SELECT a FROM
d750: 20 71 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   q1 UNION ALL SE
d760: 4c 45 43 54 20 64 20 46 52 4f 4d 20 71 32 7d 0a  LECT d FROM q2}.
d770: 20 20 20 20 20 20 7b 31 36 20 6c 65 67 69 62 6c        {16 legibl
d780: 65 20 62 65 61 75 74 79 20 6c 65 67 69 62 6c 65  e beauty legible
d790: 20 62 65 61 75 74 79 20 2d 36 35 2e 39 31 20 65   beauty -65.91 e
d7a0: 6d 61 6e 61 74 69 6e 67 7d 0a 0a 20 20 32 20 20  manating}..  2  
d7b0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
d7c0: 71 31 20 57 48 45 52 45 20 61 3d 31 36 20 55 4e  q1 WHERE a=16 UN
d7d0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
d7e0: 78 27 2c 20 2a 20 46 52 4f 4d 20 71 32 20 57 48  x', * FROM q2 WH
d7f0: 45 52 45 20 6f 69 64 3d 31 7d 0a 20 20 20 20 20  ERE oid=1}.     
d800: 20 7b 31 36 20 2d 38 37 2e 36 36 20 7b 7d 20 78   {16 -87.66 {} x
d810: 20 6c 65 67 69 62 6c 65 20 31 7d 0a 0a 20 20 33   legible 1}..  3
d820: 20 20 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74     {SELECT count
d830: 28 2a 29 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f  (*) FROM q1 UNIO
d840: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 6d 69 6e  N ALL SELECT min
d850: 28 65 29 20 46 52 4f 4d 20 71 32 7d 20 0a 20 20  (e) FROM q2} .  
d860: 20 20 20 20 7b 33 20 2d 31 36 2e 35 36 7d 0a 0a      {3 -16.56}..
d870: 20 20 34 20 20 20 7b 53 45 4c 45 43 54 20 2a 20    4   {SELECT * 
d880: 46 52 4f 4d 20 71 32 20 55 4e 49 4f 4e 20 41 4c  FROM q2 UNION AL
d890: 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  L SELECT * FROM 
d8a0: 71 33 7d 20 0a 20 20 20 20 20 20 7b 6c 65 67 69  q3} .      {legi
d8b0: 62 6c 65 20 31 20 62 65 61 75 74 79 20 32 20 2d  ble 1 beauty 2 -
d8c0: 36 35 2e 39 31 20 34 20 65 6d 61 6e 61 74 69 6e  65.91 4 emanatin
d8d0: 67 20 2d 31 36 2e 35 36 20 62 65 61 75 74 79 20  g -16.56 beauty 
d8e0: 32 20 62 65 61 75 74 79 20 32 7d 0a 7d 20 0a 0a  2 beauty 2}.} ..
d8f0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d900: 2d 32 30 35 36 30 2d 33 39 31 36 32 20 54 68 65  -20560-39162 The
d910: 20 55 4e 49 4f 4e 20 6f 70 65 72 61 74 6f 72 20   UNION operator 
d920: 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 77  works the same w
d930: 61 79 20 61 73 0a 23 20 55 4e 49 4f 4e 20 41 4c  ay as.# UNION AL
d940: 4c 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 64  L, except that d
d950: 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
d960: 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  e removed from t
d970: 68 65 20 66 69 6e 61 6c 0a 23 20 72 65 73 75 6c  he final.# resul
d980: 74 20 73 65 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65  t set..#.do_sele
d990: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
d9a0: 74 2d 37 2e 35 20 7b 0a 20 20 31 20 20 20 7b 53  t-7.5 {.  1   {S
d9b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31 20  ELECT a FROM q1 
d9c0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 20 46  UNION SELECT d F
d9d0: 52 4f 4d 20 71 32 7d 0a 20 20 20 20 20 20 7b 2d  ROM q2}.      {-
d9e0: 36 35 2e 39 31 20 31 36 20 62 65 61 75 74 79 20  65.91 16 beauty 
d9f0: 65 6d 61 6e 61 74 69 6e 67 20 6c 65 67 69 62 6c  emanating legibl
da00: 65 7d 0a 0a 20 20 32 20 20 20 7b 53 45 4c 45 43  e}..  2   {SELEC
da10: 54 20 2a 20 46 52 4f 4d 20 71 31 20 57 48 45 52  T * FROM q1 WHER
da20: 45 20 61 3d 31 36 20 55 4e 49 4f 4e 20 53 45 4c  E a=16 UNION SEL
da30: 45 43 54 20 27 78 27 2c 20 2a 20 46 52 4f 4d 20  ECT 'x', * FROM 
da40: 71 32 20 57 48 45 52 45 20 6f 69 64 3d 31 7d 0a  q2 WHERE oid=1}.
da50: 20 20 20 20 20 20 7b 31 36 20 2d 38 37 2e 36 36        {16 -87.66
da60: 20 7b 7d 20 78 20 6c 65 67 69 62 6c 65 20 31 7d   {} x legible 1}
da70: 0a 0a 20 20 33 20 20 20 7b 53 45 4c 45 43 54 20  ..  3   {SELECT 
da80: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 71 31  count(*) FROM q1
da90: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 6d 69   UNION SELECT mi
daa0: 6e 28 65 29 20 46 52 4f 4d 20 71 32 7d 20 0a 20  n(e) FROM q2} . 
dab0: 20 20 20 20 20 7b 2d 31 36 2e 35 36 20 33 7d 0a       {-16.56 3}.
dac0: 0a 20 20 34 20 20 20 7b 53 45 4c 45 43 54 20 2a  .  4   {SELECT *
dad0: 20 46 52 4f 4d 20 71 32 20 55 4e 49 4f 4e 20 53   FROM q2 UNION S
dae0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d  ELECT * FROM q3}
daf0: 20 0a 20 20 20 20 20 20 7b 2d 36 35 2e 39 31 20   .      {-65.91 
db00: 34 20 62 65 61 75 74 79 20 32 20 65 6d 61 6e 61  4 beauty 2 emana
db10: 74 69 6e 67 20 2d 31 36 2e 35 36 20 6c 65 67 69  ting -16.56 legi
db20: 62 6c 65 20 31 7d 0a 7d 20 0a 0a 23 20 45 56 49  ble 1}.} ..# EVI
db30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 37 36  DENCE-OF: R-4576
db40: 34 2d 33 31 37 33 37 20 54 68 65 20 49 4e 54 45  4-31737 The INTE
db50: 52 53 45 43 54 20 6f 70 65 72 61 74 6f 72 20 72  RSECT operator r
db60: 65 74 75 72 6e 73 20 74 68 65 0a 23 20 69 6e 74  eturns the.# int
db70: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
db80: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
db90: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
dba0: 45 4c 45 43 54 73 2e 0a 23 0a 64 6f 5f 73 65 6c  ELECTs..#.do_sel
dbb0: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
dbc0: 63 74 2d 37 2e 36 20 7b 0a 20 20 31 20 20 20 7b  ct-7.6 {.  1   {
dbd0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31  SELECT a FROM q1
dbe0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
dbf0: 54 20 64 20 46 52 4f 4d 20 71 32 7d 20 7b 62 65  T d FROM q2} {be
dc00: 61 75 74 79 20 6c 65 67 69 62 6c 65 7d 0a 20 20  auty legible}.  
dc10: 32 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  2   {SELECT * FR
dc20: 4f 4d 20 71 32 20 49 4e 54 45 52 53 45 43 54 20  OM q2 INTERSECT 
dc30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33  SELECT * FROM q3
dc40: 7d 20 7b 62 65 61 75 74 79 20 32 7d 0a 7d 0a 0a  } {beauty 2}.}..
dc50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
dc60: 2d 32 35 37 38 37 2d 32 38 39 34 39 20 54 68 65  -25787-28949 The
dc70: 20 45 58 43 45 50 54 20 6f 70 65 72 61 74 6f 72   EXCEPT operator
dc80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 75 62   returns the sub
dc90: 73 65 74 20 6f 66 0a 23 20 72 6f 77 73 20 72 65  set of.# rows re
dca0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6c 65  turned by the le
dcb0: 66 74 20 53 45 4c 45 43 54 20 74 68 61 74 20 61  ft SELECT that a
dcc0: 72 65 20 6e 6f 74 20 61 6c 73 6f 20 72 65 74 75  re not also retu
dcd0: 72 6e 65 64 20 62 79 20 74 68 65 0a 23 20 72 69  rned by the.# ri
dce0: 67 68 74 2d 68 61 6e 64 20 53 45 4c 45 43 54 2e  ght-hand SELECT.
dcf0: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
dd00: 74 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 37 20  ts e_select-7.7 
dd10: 7b 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54 20  {.  1   {SELECT 
dd20: 61 20 46 52 4f 4d 20 71 31 20 45 58 43 45 50 54  a FROM q1 EXCEPT
dd30: 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 71   SELECT d FROM q
dd40: 32 7d 20 7b 31 36 7d 0a 0a 20 20 32 20 20 20 7b  2} {16}..  2   {
dd50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 32  SELECT * FROM q2
dd60: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
dd70: 20 46 52 4f 4d 20 71 33 7d 20 0a 20 20 20 20 20   FROM q3} .     
dd80: 20 7b 2d 36 35 2e 39 31 20 34 20 65 6d 61 6e 61   {-65.91 4 emana
dd90: 74 69 6e 67 20 2d 31 36 2e 35 36 20 6c 65 67 69  ting -16.56 legi
dda0: 62 6c 65 20 31 7d 0a 7d 0a 0a 23 20 45 56 49 44  ble 1}.}..# EVID
ddb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 37 32 39  ENCE-OF: R-40729
ddc0: 2d 35 36 34 34 37 20 44 75 70 6c 69 63 61 74 65  -56447 Duplicate
ddd0: 20 72 6f 77 73 20 61 72 65 20 72 65 6d 6f 76 65   rows are remove
dde0: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  d from the resul
ddf0: 74 73 0a 23 20 6f 66 20 49 4e 54 45 52 53 45 43  ts.# of INTERSEC
de00: 54 20 61 6e 64 20 45 58 43 45 50 54 20 6f 70 65  T and EXCEPT ope
de10: 72 61 74 6f 72 73 20 62 65 66 6f 72 65 20 74 68  rators before th
de20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
de30: 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 73  returned..#.do_s
de40: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
de50: 6c 65 63 74 2d 37 2e 38 20 7b 0a 20 20 30 20 20  lect-7.8 {.  0  
de60: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
de70: 71 33 7d 20 7b 62 65 61 75 74 79 20 32 20 62 65  q3} {beauty 2 be
de80: 61 75 74 79 20 32 7d 0a 0a 20 20 31 20 20 20 7b  auty 2}..  1   {
de90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33  SELECT * FROM q3
dea0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
deb0: 54 20 2a 20 46 52 4f 4d 20 71 33 7d 20 7b 62 65  T * FROM q3} {be
dec0: 61 75 74 79 20 32 7d 0a 20 20 32 20 20 20 7b 53  auty 2}.  2   {S
ded0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 20  ELECT * FROM q3 
dee0: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 61 2c  EXCEPT SELECT a,
def0: 62 20 46 52 4f 4d 20 71 31 7d 20 20 7b 62 65 61  b FROM q1}  {bea
df00: 75 74 79 20 32 7d 0a 7d 0a 0a 23 20 45 56 49 44  uty 2}.}..# EVID
df10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 37 36 35  ENCE-OF: R-46765
df20: 2d 34 33 33 36 32 20 46 6f 72 20 74 68 65 20 70  -43362 For the p
df30: 75 72 70 6f 73 65 73 20 6f 66 20 64 65 74 65 72  urposes of deter
df40: 6d 69 6e 69 6e 67 20 64 75 70 6c 69 63 61 74 65  mining duplicate
df50: 0a 23 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20  .# rows for the 
df60: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 6f  results of compo
df70: 75 6e 64 20 53 45 4c 45 43 54 20 6f 70 65 72 61  und SELECT opera
df80: 74 6f 72 73 2c 20 4e 55 4c 4c 20 76 61 6c 75 65  tors, NULL value
df90: 73 20 61 72 65 0a 23 20 63 6f 6e 73 69 64 65 72  s are.# consider
dfa0: 65 64 20 65 71 75 61 6c 20 74 6f 20 6f 74 68 65  ed equal to othe
dfb0: 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 6e  r NULL values an
dfc0: 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  d distinct from 
dfd0: 61 6c 6c 20 6e 6f 6e 2d 4e 55 4c 4c 0a 23 20 76  all non-NULL.# v
dfe0: 61 6c 75 65 73 2e 0a 23 0a 64 62 20 6e 75 6c 6c  alues..#.db null
dff0: 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 73 65  value null.do_se
e000: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
e010: 65 63 74 2d 37 2e 39 20 7b 0a 20 20 31 20 20 20  ect-7.9 {.  1   
e020: 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49  {SELECT NULL UNI
e030: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 4e 55  ON ALL SELECT NU
e040: 4c 4c 7d 20 7b 6e 75 6c 6c 20 6e 75 6c 6c 7d 0a  LL} {null null}.
e050: 20 20 32 20 20 20 7b 53 45 4c 45 43 54 20 4e 55    2   {SELECT NU
e060: 4c 4c 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c  LL UNION     SEL
e070: 45 43 54 20 4e 55 4c 4c 7d 20 7b 6e 75 6c 6c 7d  ECT NULL} {null}
e080: 0a 20 20 33 20 20 20 7b 53 45 4c 45 43 54 20 4e  .  3   {SELECT N
e090: 55 4c 4c 20 49 4e 54 45 52 53 45 43 54 20 53 45  ULL INTERSECT SE
e0a0: 4c 45 43 54 20 4e 55 4c 4c 7d 20 7b 6e 75 6c 6c  LECT NULL} {null
e0b0: 7d 0a 20 20 34 20 20 20 7b 53 45 4c 45 43 54 20  }.  4   {SELECT 
e0c0: 4e 55 4c 4c 20 45 58 43 45 50 54 20 20 20 20 53  NULL EXCEPT    S
e0d0: 45 4c 45 43 54 20 4e 55 4c 4c 7d 20 7b 7d 0a 0a  ELECT NULL} {}..
e0e0: 20 20 35 20 20 20 7b 53 45 4c 45 43 54 20 4e 55    5   {SELECT NU
e0f0: 4c 4c 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  LL UNION ALL SEL
e100: 45 43 54 20 27 61 62 27 7d 20 7b 6e 75 6c 6c 20  ECT 'ab'} {null 
e110: 61 62 7d 0a 20 20 36 20 20 20 7b 53 45 4c 45 43  ab}.  6   {SELEC
e120: 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 20 20 20  T NULL UNION    
e130: 20 53 45 4c 45 43 54 20 27 61 62 27 7d 20 7b 6e   SELECT 'ab'} {n
e140: 75 6c 6c 20 61 62 7d 0a 20 20 37 20 20 20 7b 53  ull ab}.  7   {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 27 61 62 27  SECT SELECT 'ab'
e170: 7d 20 7b 7d 0a 20 20 38 20 20 20 7b 53 45 4c 45  } {}.  8   {SELE
e180: 43 54 20 4e 55 4c 4c 20 45 58 43 45 50 54 20 20  CT NULL EXCEPT  
e190: 20 20 53 45 4c 45 43 54 20 27 61 62 27 7d 20 7b    SELECT 'ab'} {
e1a0: 6e 75 6c 6c 7d 0a 0a 20 20 39 20 20 20 7b 53 45  null}..  9   {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 30 7d 20 7b 6e  ALL SELECT 0} {n
e1d0: 75 6c 6c 20 30 7d 0a 20 20 31 30 20 20 7b 53 45  ull 0}.  10  {SE
e1e0: 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20  LECT NULL UNION 
e1f0: 20 20 20 20 53 45 4c 45 43 54 20 30 7d 20 7b 6e      SELECT 0} {n
e200: 75 6c 6c 20 30 7d 0a 20 20 31 31 20 20 7b 53 45  ull 0}.  11  {SE
e210: 4c 45 43 54 20 4e 55 4c 4c 20 49 4e 54 45 52 53  LECT NULL INTERS
e220: 45 43 54 20 53 45 4c 45 43 54 20 30 7d 20 7b 7d  ECT SELECT 0} {}
e230: 0a 20 20 31 32 20 20 7b 53 45 4c 45 43 54 20 4e  .  12  {SELECT N
e240: 55 4c 4c 20 45 58 43 45 50 54 20 20 20 20 53 45  ULL EXCEPT    SE
e250: 4c 45 43 54 20 30 7d 20 7b 6e 75 6c 6c 7d 0a 0a  LECT 0} {null}..
e260: 20 20 31 33 20 20 7b 53 45 4c 45 43 54 20 63 20    13  {SELECT c 
e270: 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20 41 4c  FROM q1 UNION AL
e280: 4c 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  L SELECT g FROM 
e290: 71 33 7d 20 7b 6e 75 6c 6c 20 2d 34 32 2e 34 37  q3} {null -42.47
e2a0: 20 6e 75 6c 6c 20 32 20 32 7d 0a 20 20 31 34 20   null 2 2}.  14 
e2b0: 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20   {SELECT c FROM 
e2c0: 71 31 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c  q1 UNION     SEL
e2d0: 45 43 54 20 67 20 46 52 4f 4d 20 71 33 7d 20 7b  ECT g FROM q3} {
e2e0: 6e 75 6c 6c 20 2d 34 32 2e 34 37 20 32 7d 0a 20  null -42.47 2}. 
e2f0: 20 31 35 20 20 7b 53 45 4c 45 43 54 20 63 20 46   15  {SELECT c F
e300: 52 4f 4d 20 71 31 20 49 4e 54 45 52 53 45 43 54  ROM q1 INTERSECT
e310: 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 71   SELECT g FROM q
e320: 33 7d 20 7b 7d 0a 20 20 31 36 20 20 7b 53 45 4c  3} {}.  16  {SEL
e330: 45 43 54 20 63 20 46 52 4f 4d 20 71 31 20 45 58  ECT c FROM q1 EX
e340: 43 45 50 54 20 20 20 20 53 45 4c 45 43 54 20 67  CEPT    SELECT g
e350: 20 46 52 4f 4d 20 71 33 7d 20 7b 6e 75 6c 6c 20   FROM q3} {null 
e360: 2d 34 32 2e 34 37 7d 0a 7d 0a 64 62 20 6e 75 6c  -42.47}.}.db nul
e370: 6c 76 61 6c 75 65 20 7b 7d 20 0a 0a 23 20 45 56  lvalue {} ..# EV
e380: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32  IDENCE-OF: R-512
e390: 33 32 2d 35 30 32 32 34 20 54 68 65 20 63 6f 6c  32-50224 The col
e3a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
e3b0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
e3c0: 74 77 6f 0a 23 20 74 65 78 74 20 76 61 6c 75 65  two.# text value
e3d0: 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
e3e0: 61 73 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  as if the column
e3f0: 73 20 6f 66 20 74 68 65 20 6c 65 66 74 20 61 6e  s of the left an
e400: 64 20 72 69 67 68 74 2d 68 61 6e 64 0a 23 20 53  d right-hand.# S
e410: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e420: 20 77 65 72 65 20 74 68 65 20 6c 65 66 74 20 61   were the left a
e430: 6e 64 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70  nd right-hand op
e440: 65 72 61 6e 64 73 20 6f 66 20 74 68 65 20 65 71  erands of the eq
e450: 75 61 6c 73 0a 23 20 28 3d 29 20 6f 70 65 72 61  uals.# (=) opera
e460: 74 6f 72 2c 20 65 78 63 65 70 74 20 74 68 61 74  tor, except that
e470: 20 67 72 65 61 74 65 72 20 70 72 65 63 65 64 65   greater precede
e480: 6e 63 65 20 69 73 20 6e 6f 74 20 61 73 73 69 67  nce is not assig
e490: 6e 65 64 20 74 6f 20 61 0a 23 20 63 6f 6c 6c 61  ned to a.# colla
e4a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 70  tion sequence sp
e4b0: 65 63 69 66 69 65 64 20 77 69 74 68 20 74 68 65  ecified with the
e4c0: 20 70 6f 73 74 66 69 78 20 43 4f 4c 4c 41 54 45   postfix COLLATE
e4d0: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 64 72 6f   operator..#.dro
e4e0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
e4f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
e500: 65 6c 65 63 74 2d 37 2e 31 30 2e 30 20 7b 0a 20  elect-7.10.0 {. 
e510: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 31   CREATE TABLE y1
e520: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
e530: 65 2c 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  e, b COLLATE bin
e540: 61 72 79 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52  ary, c);.  INSER
e550: 54 20 49 4e 54 4f 20 79 31 20 56 41 4c 55 45 53  T INTO y1 VALUES
e560: 28 27 41 62 63 27 2c 20 27 61 62 63 27 2c 20 27  ('Abc', 'abc', '
e570: 61 42 43 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73  aBC');.} {}.do_s
e580: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
e590: 6c 65 63 74 2d 37 2e 31 30 20 7b 0a 20 20 31 20  lect-7.10 {.  1 
e5a0: 20 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27 20    {SELECT 'abc' 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
e5c0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42 43  NION SELECT 'ABC
e5d0: 27 7d 20 7b 41 42 43 20 61 62 63 7d 0a 20 20 32  '} {ABC abc}.  2
e5e0: 20 20 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27     {SELECT 'abc'
e5f0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
e600: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42  UNION SELECT 'AB
e610: 43 27 7d 20 7b 41 42 43 7d 0a 20 20 33 20 20 20  C'} {ABC}.  3   
e620: 7b 53 45 4c 45 43 54 20 27 61 62 63 27 20 20 20  {SELECT 'abc'   
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
e640: 4f 4e 20 53 45 4c 45 43 54 20 27 41 42 43 27 20  ON SELECT 'ABC' 
e650: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 7d 20  COLLATE nocase} 
e660: 7b 41 42 43 7d 0a 20 20 34 20 20 20 7b 53 45 4c  {ABC}.  4   {SEL
e670: 45 43 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54  ECT 'abc' COLLAT
e680: 45 20 62 69 6e 61 72 79 20 55 4e 49 4f 4e 20 53  E binary UNION S
e690: 45 4c 45 43 54 20 27 41 42 43 27 20 43 4f 4c 4c  ELECT 'ABC' COLL
e6a0: 41 54 45 20 6e 6f 63 61 73 65 7d 20 7b 41 42 43  ATE nocase} {ABC
e6b0: 20 61 62 63 7d 0a 20 20 35 20 20 20 7b 53 45 4c   abc}.  5   {SEL
e6c0: 45 43 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54  ECT 'abc' COLLAT
e6d0: 45 20 6e 6f 63 61 73 65 20 55 4e 49 4f 4e 20 53  E nocase UNION S
e6e0: 45 4c 45 43 54 20 27 41 42 43 27 20 43 4f 4c 4c  ELECT 'ABC' COLL
e6f0: 41 54 45 20 62 69 6e 61 72 79 7d 20 7b 41 42 43  ATE binary} {ABC
e700: 7d 0a 0a 20 20 36 20 20 20 7b 53 45 4c 45 43 54  }..  6   {SELECT
e710: 20 61 20 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e   a FROM y1 UNION
e720: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 79   SELECT b FROM y
e730: 31 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1}              
e740: 20 20 7b 61 62 63 7d 0a 20 20 37 20 20 20 7b 53    {abc}.  7   {S
e750: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 79 31 20  ELECT b FROM y1 
e760: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 20 46  UNION SELECT a F
e770: 52 4f 4d 20 79 31 7d 20 20 20 20 20 20 20 20 20  ROM y1}         
e780: 20 20 20 20 20 20 20 7b 41 62 63 20 61 62 63 7d         {Abc abc}
e790: 0a 20 20 38 20 20 20 7b 53 45 4c 45 43 54 20 61  .  8   {SELECT a
e7a0: 20 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e 20 53   FROM y1 UNION S
e7b0: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 79 31 7d  ELECT c FROM y1}
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 7b 61 42 43 7d 0a 0a 20 20 39 20 20 20 7b 53 45  {aBC}..  9   {SE
e7e0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 79 31 20 55  LECT a FROM y1 U
e7f0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 43 4f  NION SELECT c CO
e800: 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52 4f  LLATE binary FRO
e810: 4d 20 79 31 7d 20 7b 61 42 43 7d 0a 7d 0a 0a 23  M y1} {aBC}.}..#
e820: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e830: 33 32 37 30 36 2d 30 37 34 30 33 20 4e 6f 20 61  32706-07403 No a
e840: 66 66 69 6e 69 74 79 20 74 72 61 6e 73 66 6f 72  ffinity transfor
e850: 6d 61 74 69 6f 6e 73 20 61 72 65 20 61 70 70 6c  mations are appl
e860: 69 65 64 20 74 6f 0a 23 20 61 6e 79 20 76 61 6c  ied to.# any val
e870: 75 65 73 20 77 68 65 6e 20 63 6f 6d 70 61 72 69  ues when compari
e880: 6e 67 20 72 6f 77 73 20 61 73 20 70 61 72 74 20  ng rows as part 
e890: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  of a compound SE
e8a0: 4c 45 43 54 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  LECT..#.drop_all
e8b0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73  _tables.do_execs
e8c0: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
e8d0: 2d 37 2e 31 30 2e 30 20 7b 0a 20 20 43 52 45 41  -7.10.0 {.  CREA
e8e0: 54 45 20 54 41 42 4c 45 20 77 31 28 61 20 54 45  TE TABLE w1(a TE
e8f0: 58 54 2c 20 62 20 4e 55 4d 42 45 52 29 3b 0a 20  XT, b NUMBER);. 
e900: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 77 32   CREATE TABLE w2
e910: 28 61 2c 20 62 20 54 45 58 54 29 3b 0a 0a 20 20  (a, b TEXT);..  
e920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 77 31 20 56  INSERT INTO w1 V
e930: 41 4c 55 45 53 28 27 31 27 2c 20 34 2e 31 29 3b  ALUES('1', 4.1);
e940: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 77  .  INSERT INTO w
e950: 32 20 56 41 4c 55 45 53 28 31 2c 20 34 2e 31 29  2 VALUES(1, 4.1)
e960: 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 73 65 6c 65 63  ;.} {}..do_selec
e970: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
e980: 2d 37 2e 31 31 20 7b 0a 20 20 31 20 20 7b 20 53  -7.11 {.  1  { S
e990: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20  ELECT a FROM w1 
e9a0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 20 46  UNION SELECT a F
e9b0: 52 4f 4d 20 77 32 20 7d 20 7b 31 20 31 7d 0a 20  ROM w2 } {1 1}. 
e9c0: 20 32 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46   2  { SELECT a F
e9d0: 52 4f 4d 20 77 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM w2 UNION SEL
e9e0: 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20 7d 20  ECT a FROM w1 } 
e9f0: 7b 31 20 31 7d 0a 20 20 33 20 20 7b 20 53 45 4c  {1 1}.  3  { SEL
ea00: 45 43 54 20 62 20 46 52 4f 4d 20 77 31 20 55 4e  ECT b FROM w1 UN
ea10: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
ea20: 4d 20 77 32 20 7d 20 7b 34 2e 31 20 34 2e 31 7d  M w2 } {4.1 4.1}
ea30: 0a 20 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62  .  4  { SELECT b
ea40: 20 46 52 4f 4d 20 77 32 20 55 4e 49 4f 4e 20 53   FROM w2 UNION S
ea50: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31 20  ELECT b FROM w1 
ea60: 7d 20 7b 34 2e 31 20 34 2e 31 7d 0a 0a 20 20 35  } {4.1 4.1}..  5
ea70: 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f    { SELECT a FRO
ea80: 4d 20 77 31 20 49 4e 54 45 52 53 45 43 54 20 53  M w1 INTERSECT S
ea90: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 32 20  ELECT a FROM w2 
eaa0: 7d 20 7b 7d 0a 20 20 36 20 20 7b 20 53 45 4c 45  } {}.  6  { SELE
eab0: 43 54 20 61 20 46 52 4f 4d 20 77 32 20 49 4e 54  CT a FROM w2 INT
eac0: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 61 20  ERSECT SELECT a 
ead0: 46 52 4f 4d 20 77 31 20 7d 20 7b 7d 0a 20 20 37  FROM w1 } {}.  7
eae0: 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
eaf0: 4d 20 77 31 20 49 4e 54 45 52 53 45 43 54 20 53  M w1 INTERSECT S
eb00: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32 20  ELECT b FROM w2 
eb10: 7d 20 7b 7d 0a 20 20 38 20 20 7b 20 53 45 4c 45  } {}.  8  { SELE
eb20: 43 54 20 62 20 46 52 4f 4d 20 77 32 20 49 4e 54  CT b FROM w2 INT
eb30: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 62 20  ERSECT SELECT b 
eb40: 46 52 4f 4d 20 77 31 20 7d 20 7b 7d 0a 0a 20 20  FROM w1 } {}..  
eb50: 39 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52  9  { SELECT a FR
eb60: 4f 4d 20 77 31 20 45 58 43 45 50 54 20 53 45 4c  OM w1 EXCEPT SEL
eb70: 45 43 54 20 61 20 46 52 4f 4d 20 77 32 20 7d 20  ECT a FROM w2 } 
eb80: 7b 31 7d 0a 20 20 31 30 20 7b 20 53 45 4c 45 43  {1}.  10 { SELEC
eb90: 54 20 61 20 46 52 4f 4d 20 77 32 20 45 58 43 45  T a FROM w2 EXCE
eba0: 50 54 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  PT SELECT a FROM
ebb0: 20 77 31 20 7d 20 7b 31 7d 0a 20 20 31 31 20 7b   w1 } {1}.  11 {
ebc0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77   SELECT b FROM w
ebd0: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
ebe0: 62 20 46 52 4f 4d 20 77 32 20 7d 20 7b 34 2e 31  b FROM w2 } {4.1
ebf0: 7d 0a 20 20 31 32 20 7b 20 53 45 4c 45 43 54 20  }.  12 { SELECT 
ec00: 62 20 46 52 4f 4d 20 77 32 20 45 58 43 45 50 54  b FROM w2 EXCEPT
ec10: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77   SELECT b FROM w
ec20: 31 20 7d 20 7b 34 2e 31 7d 0a 7d 0a 0a 0a 23 20  1 } {4.1}.}...# 
ec30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
ec40: 32 35 36 32 2d 32 30 35 36 36 20 57 68 65 6e 20  2562-20566 When 
ec50: 74 68 72 65 65 20 6f 72 20 6d 6f 72 65 20 73 69  three or more si
ec60: 6d 70 6c 65 20 53 45 4c 45 43 54 73 20 61 72 65  mple SELECTs are
ec70: 0a 23 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 74  .# connected int
ec80: 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  o a compound SEL
ec90: 45 43 54 2c 20 74 68 65 79 20 67 72 6f 75 70 20  ECT, they group 
eca0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
ecb0: 68 74 2e 20 49 6e 0a 23 20 6f 74 68 65 72 20 77  ht. In.# other w
ecc0: 6f 72 64 73 2c 20 69 66 20 22 41 22 2c 20 22 42  ords, if "A", "B
ecd0: 22 20 61 6e 64 20 22 43 22 20 61 72 65 20 61 6c  " and "C" are al
ece0: 6c 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  l simple SELECT 
ecf0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 28 41 0a 23  statements, (A.#
ed00: 20 6f 70 20 42 20 6f 70 20 43 29 20 69 73 20 70   op B op C) is p
ed10: 72 6f 63 65 73 73 65 64 20 61 73 20 28 28 41 20  rocessed as ((A 
ed20: 6f 70 20 42 29 20 6f 70 20 43 29 2e 0a 23 0a 23  op B) op C)..#.#
ed30: 20 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32     e_select-7.12
ed40: 2e 31 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f  .1: Precedence o
ed50: 66 20 55 4e 49 4f 4e 20 76 73 2e 20 49 4e 54 45  f UNION vs. INTE
ed60: 52 53 45 43 54 20 0a 23 20 20 20 65 5f 73 65 6c  RSECT .#   e_sel
ed70: 65 63 74 2d 37 2e 31 32 2e 32 3a 20 50 72 65 63  ect-7.12.2: Prec
ed80: 65 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20  edence of UNION 
ed90: 76 73 2e 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 23  vs. UNION ALL .#
eda0: 20 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32     e_select-7.12
edb0: 2e 33 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f  .3: Precedence o
edc0: 66 20 55 4e 49 4f 4e 20 76 73 2e 20 45 58 43 45  f UNION vs. EXCE
edd0: 50 54 0a 23 20 20 20 65 5f 73 65 6c 65 63 74 2d  PT.#   e_select-
ede0: 37 2e 31 32 2e 34 3a 20 50 72 65 63 65 64 65 6e  7.12.4: Preceden
edf0: 63 65 20 6f 66 20 49 4e 54 45 52 53 45 43 54 20  ce of INTERSECT 
ee00: 76 73 2e 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 23  vs. UNION ALL .#
ee10: 20 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32     e_select-7.12
ee20: 2e 35 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f  .5: Precedence o
ee30: 66 20 49 4e 54 45 52 53 45 43 54 20 76 73 2e 20  f INTERSECT vs. 
ee40: 45 58 43 45 50 54 0a 23 20 20 20 65 5f 73 65 6c  EXCEPT.#   e_sel
ee50: 65 63 74 2d 37 2e 31 32 2e 36 3a 20 50 72 65 63  ect-7.12.6: Prec
ee60: 65 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20  edence of UNION 
ee70: 41 4c 4c 20 76 73 2e 20 45 58 43 45 50 54 0a 23  ALL vs. EXCEPT.#
ee80: 20 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32     e_select-7.12
ee90: 2e 37 3a 20 43 68 65 63 6b 20 74 68 61 74 20 22  .7: Check that "
eea0: 61 20 45 58 43 45 50 54 20 62 20 45 58 43 45 50  a EXCEPT b EXCEP
eeb0: 54 20 63 22 20 69 73 20 70 72 6f 63 65 73 73 65  T c" is processe
eec0: 64 20 61 73 20 0a 23 20 20 20 20 20 20 20 20 20  d as .#         
eed0: 20 20 20 20 20 20 20 20 20 20 22 28 61 20 45 58            "(a EX
eee0: 43 45 50 54 20 62 29 20 45 58 43 45 50 54 20 63  CEPT b) EXCEPT c
eef0: 22 2e 0a 23 0a 23 20 54 68 65 20 49 4e 54 45 52  "..#.# The INTER
ef00: 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20  SECT and EXCEPT 
ef10: 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 6d  operations are m
ef20: 75 74 75 61 6c 6c 79 20 63 6f 6d 6d 75 74 61 74  utually commutat
ef30: 69 76 65 2e 20 53 6f 0a 23 20 74 68 65 20 65 5f  ive. So.# the e_
ef40: 73 65 6c 65 63 74 2d 37 2e 31 32 2e 35 20 74 65  select-7.12.5 te
ef50: 73 74 20 63 61 73 65 73 20 64 6f 20 6e 6f 74 20  st cases do not 
ef60: 70 72 6f 76 65 20 76 65 72 79 20 6d 75 63 68 2e  prove very much.
ef70: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
ef80: 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  es.do_execsql_te
ef90: 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32  st e_select-7.12
efa0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
efb0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 49 4e 53  BLE t1(x);.  INS
efc0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
efd0: 45 53 28 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  ES(1);.  INSERT 
efe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
eff0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f000: 20 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 7d   t1 VALUES(3);.}
f010: 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20   {}.foreach {tn 
f020: 73 65 6c 65 63 74 20 72 65 73 7d 20 7b 0a 20 20  select res} {.  
f030: 31 61 20 22 28 31 2c 32 29 20 49 4e 54 45 52 53  1a "(1,2) INTERS
f040: 45 43 54 20 28 31 29 20 20 20 55 4e 49 4f 4e 20  ECT (1)   UNION 
f050: 20 20 20 20 28 33 29 22 20 20 20 7b 31 20 33 7d      (3)"   {1 3}
f060: 0a 20 20 31 62 20 22 28 33 29 20 20 20 55 4e 49  .  1b "(3)   UNI
f070: 4f 4e 20 20 20 20 20 28 31 2c 32 29 20 49 4e 54  ON     (1,2) INT
f080: 45 52 53 45 43 54 20 28 31 29 22 20 20 20 7b 31  ERSECT (1)"   {1
f090: 7d 0a 0a 20 20 32 61 20 22 28 31 2c 32 29 20 55  }..  2a "(1,2) U
f0a0: 4e 49 4f 4e 20 20 20 20 20 28 33 29 20 20 20 55  NION     (3)   U
f0b0: 4e 49 4f 4e 20 41 4c 4c 20 28 31 29 22 20 20 20  NION ALL (1)"   
f0c0: 7b 31 20 32 20 33 20 31 7d 0a 20 20 32 62 20 22  {1 2 3 1}.  2b "
f0d0: 28 31 29 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20  (1)   UNION ALL 
f0e0: 28 33 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20  (3)   UNION     
f0f0: 28 31 2c 32 29 22 20 7b 31 20 32 20 33 7d 0a 0a  (1,2)" {1 2 3}..
f100: 20 20 33 61 20 22 28 31 2c 32 29 20 55 4e 49 4f    3a "(1,2) UNIO
f110: 4e 20 20 20 20 20 28 33 29 20 20 20 45 58 43 45  N     (3)   EXCE
f120: 50 54 20 20 20 20 28 31 29 22 20 20 20 7b 32 20  PT    (1)"   {2 
f130: 33 7d 0a 20 20 33 62 20 22 28 31 2c 32 29 20 45  3}.  3b "(1,2) E
f140: 58 43 45 50 54 20 20 20 20 28 33 29 20 20 20 55  XCEPT    (3)   U
f150: 4e 49 4f 4e 20 20 20 20 20 28 31 29 22 20 20 20  NION     (1)"   
f160: 7b 31 20 32 7d 0a 0a 20 20 34 61 20 22 28 31 2c  {1 2}..  4a "(1,
f170: 32 29 20 49 4e 54 45 52 53 45 43 54 20 28 31 29  2) INTERSECT (1)
f180: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 28 33 29     UNION ALL (3)
f190: 22 20 20 20 7b 31 20 33 7d 0a 20 20 34 62 20 22  "   {1 3}.  4b "
f1a0: 28 33 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20  (3)   UNION     
f1b0: 28 31 2c 32 29 20 49 4e 54 45 52 53 45 43 54 20  (1,2) INTERSECT 
f1c0: 28 31 29 22 20 20 20 7b 31 7d 0a 0a 20 20 35 61  (1)"   {1}..  5a
f1d0: 20 22 28 31 2c 32 29 20 49 4e 54 45 52 53 45 43   "(1,2) INTERSEC
f1e0: 54 20 28 32 29 20 20 20 45 58 43 45 50 54 20 20  T (2)   EXCEPT  
f1f0: 20 20 28 32 29 22 20 20 20 7b 7d 0a 20 20 35 62    (2)"   {}.  5b
f200: 20 22 28 32 2c 33 29 20 45 58 43 45 50 54 20 20   "(2,3) EXCEPT  
f210: 20 20 28 32 29 20 20 20 49 4e 54 45 52 53 45 43    (2)   INTERSEC
f220: 54 20 28 32 29 22 20 20 20 7b 7d 0a 0a 20 20 36  T (2)"   {}..  6
f230: 61 20 22 28 32 29 20 20 20 55 4e 49 4f 4e 20 41  a "(2)   UNION A
f240: 4c 4c 20 28 32 29 20 20 20 45 58 43 45 50 54 20  LL (2)   EXCEPT 
f250: 20 20 20 28 32 29 22 20 20 20 7b 7d 0a 20 20 36     (2)"   {}.  6
f260: 62 20 22 28 32 29 20 20 20 45 58 43 45 50 54 20  b "(2)   EXCEPT 
f270: 20 20 20 28 32 29 20 20 20 55 4e 49 4f 4e 20 41     (2)   UNION A
f280: 4c 4c 20 28 32 29 22 20 20 20 7b 32 7d 0a 0a 20  LL (2)"   {2}.. 
f290: 20 37 20 20 22 28 32 2c 33 29 20 45 58 43 45 50   7  "(2,3) EXCEP
f2a0: 54 20 20 20 20 28 32 29 20 20 20 45 58 43 45 50  T    (2)   EXCEP
f2b0: 54 20 20 20 20 28 33 29 22 20 20 20 7b 7d 0a 7d  T    (3)"   {}.}
f2c0: 20 7b 0a 20 20 73 65 74 20 73 65 6c 65 63 74 20   {.  set select 
f2d0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 28 20 7b  [string map {( {
f2e0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
f2f0: 20 57 48 45 52 45 20 78 20 49 4e 20 28 7d 7d 20   WHERE x IN (}} 
f300: 24 73 65 6c 65 63 74 5d 0a 20 20 64 6f 5f 65 78  $select].  do_ex
f310: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
f320: 65 63 74 2d 37 2e 31 32 2e 24 74 6e 20 24 73 65  ect-7.12.$tn $se
f330: 6c 65 63 74 20 5b 6c 69 73 74 20 7b 2a 7d 24 72  lect [list {*}$r
f340: 65 73 5d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  es].}...#-------
f350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f390: 2d 2d 0a 23 20 4f 52 44 45 52 20 42 59 20 63 6c  --.# ORDER BY cl
f3a0: 61 75 73 65 73 0a 23 0a 0a 64 72 6f 70 5f 61 6c  auses.#..drop_al
f3b0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63  l_tables.do_exec
f3c0: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
f3d0: 74 2d 38 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41  t-8.1.0 {.  CREA
f3e0: 54 45 20 54 41 42 4c 45 20 64 31 28 78 2c 20 79  TE TABLE d1(x, y
f3f0: 2c 20 7a 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  , z);..  INSERT 
f400: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31  INTO d1 VALUES(1
f410: 2c 20 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52  , 2, 3);.  INSER
f420: 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53  T INTO d1 VALUES
f430: 28 32 2c 20 35 2c 20 2d 31 29 3b 0a 20 20 49 4e  (2, 5, -1);.  IN
f440: 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56 41 4c  SERT INTO d1 VAL
f450: 55 45 53 28 31 2c 20 32 2c 20 38 29 3b 0a 20 20  UES(1, 2, 8);.  
f460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56  INSERT INTO d1 V
f470: 41 4c 55 45 53 28 31 2c 20 32 2c 20 37 29 3b 0a  ALUES(1, 2, 7);.
f480: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31    INSERT INTO d1
f490: 20 56 41 4c 55 45 53 28 32 2c 20 34 2c 20 39 33   VALUES(2, 4, 93
f4a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f4b0: 20 64 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   d1 VALUES(1, 2,
f4c0: 20 2d 32 30 29 3b 0a 20 20 49 4e 53 45 52 54 20   -20);.  INSERT 
f4d0: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31  INTO d1 VALUES(1
f4e0: 2c 20 34 2c 20 39 33 29 3b 0a 20 20 49 4e 53 45  , 4, 93);.  INSE
f4f0: 52 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45  RT INTO d1 VALUE
f500: 53 28 31 2c 20 35 2c 20 2d 31 29 3b 0a 0a 20 20  S(1, 5, -1);..  
f510: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 32 28  CREATE TABLE d2(
f520: 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  a, b);.  INSERT 
f530: 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27  INTO d2 VALUES('
f540: 67 65 6e 74 6c 79 27 2c 20 27 66 61 69 6c 69 6e  gently', 'failin
f550: 67 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  gs');.  INSERT I
f560: 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 63  NTO d2 VALUES('c
f570: 6f 6d 6d 65 72 63 69 61 6c 73 27 2c 20 27 62 61  ommercials', 'ba
f580: 74 68 72 6f 62 65 27 29 3b 0a 20 20 49 4e 53 45  throbe');.  INSE
f590: 52 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45  RT INTO d2 VALUE
f5a0: 53 28 27 69 74 65 72 61 74 65 27 2c 20 27 73 65  S('iterate', 'se
f5b0: 78 74 6f 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54  xton');.  INSERT
f5c0: 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28   INTO d2 VALUES(
f5d0: 27 62 61 62 69 65 64 27 2c 20 27 63 68 61 72 69  'babied', 'chari
f5e0: 74 61 62 6c 65 6e 65 73 73 27 29 3b 0a 20 20 49  tableness');.  I
f5f0: 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56 41  NSERT INTO d2 VA
f600: 4c 55 45 53 28 27 73 6f 6c 65 6d 6e 6e 65 73 73  LUES('solemnness
f610: 27 2c 20 27 61 6e 6e 65 78 65 64 27 29 3b 0a 20  ', 'annexed');. 
f620: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20   INSERT INTO d2 
f630: 56 41 4c 55 45 53 28 27 72 65 6a 6f 69 63 69 6e  VALUES('rejoicin
f640: 67 27 2c 20 27 6c 69 61 62 69 6c 69 74 69 65 73  g', 'liabilities
f650: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
f660: 4f 20 64 32 20 56 41 4c 55 45 53 28 27 70 72 61  O d2 VALUES('pra
f670: 67 6d 61 74 69 73 74 27 2c 20 27 67 75 61 72 64  gmatist', 'guard
f680: 65 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ed');.  INSERT I
f690: 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 62  NTO d2 VALUES('b
f6a0: 61 72 6b 65 64 27 2c 20 27 69 6e 74 65 72 72 75  arked', 'interru
f6b0: 70 74 65 64 27 29 3b 0a 20 20 49 4e 53 45 52 54  pted');.  INSERT
f6c0: 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28   INTO d2 VALUES(
f6d0: 27 72 65 65 6d 70 68 61 73 69 7a 65 73 27 2c 20  'reemphasizes', 
f6e0: 27 72 65 70 6c 79 27 29 3b 0a 20 20 49 4e 53 45  'reply');.  INSE
f6f0: 52 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45  RT INTO d2 VALUE
f700: 53 28 27 6c 61 64 27 2c 20 27 72 65 6c 65 6e 74  S('lad', 'relent
f710: 69 6e 67 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45  ing');.} {}..# E
f720: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
f730: 39 38 38 2d 34 31 30 36 34 20 52 6f 77 73 20 61  988-41064 Rows a
f740: 72 65 20 66 69 72 73 74 20 73 6f 72 74 65 64 20  re first sorted 
f750: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 73  based on the res
f760: 75 6c 74 73 0a 23 20 6f 66 20 65 76 61 6c 75 61  ults.# of evalua
f770: 74 69 6e 67 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ting the left-mo
f780: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  st expression in
f790: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
f7a0: 73 74 2c 20 74 68 65 6e 20 74 69 65 73 0a 23 20  st, then ties.# 
f7b0: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 65 76  are broken by ev
f7c0: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 73 65 63  aluating the sec
f7d0: 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 65 78  ond left-most ex
f7e0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 6f 20  pression and so 
f7f0: 6f 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  on..#.do_select_
f800: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38  tests e_select-8
f810: 2e 31 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43  .1 {.  1  "SELEC
f820: 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  T * FROM d1 ORDE
f830: 52 20 42 59 20 78 2c 20 79 2c 20 7a 22 20 7b 0a  R BY x, y, z" {.
f840: 20 20 20 20 20 31 20 32 20 2d 32 30 20 20 20 20       1 2 -20    
f850: 31 20 32 20 33 20 20 20 20 31 20 32 20 37 20 20  1 2 3    1 2 7  
f860: 20 20 31 20 32 20 38 20 20 20 20 0a 20 20 20 20    1 2 8    .    
f870: 20 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20   1 4  93    1 5 
f880: 2d 31 20 20 20 32 20 34 20 39 33 20 20 20 32 20  -1   2 4 93   2 
f890: 35 20 2d 31 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56  5 -1.  }.}..# EV
f8a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36  IDENCE-OF: R-066
f8b0: 31 37 2d 35 34 35 38 38 20 45 61 63 68 20 4f 52  17-54588 Each OR
f8c0: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
f8d0: 6e 20 6d 61 79 20 62 65 20 6f 70 74 69 6f 6e 61  n may be optiona
f8e0: 6c 6c 79 0a 23 20 66 6f 6c 6c 6f 77 65 64 20 62  lly.# followed b
f8f0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  y one of the key
f900: 77 6f 72 64 73 20 41 53 43 20 28 73 6d 61 6c 6c  words ASC (small
f910: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 72 65  er values are re
f920: 74 75 72 6e 65 64 0a 23 20 66 69 72 73 74 29 20  turned.# first) 
f930: 6f 72 20 44 45 53 43 20 28 6c 61 72 67 65 72 20  or DESC (larger 
f940: 76 61 6c 75 65 73 20 61 72 65 20 72 65 74 75 72  values are retur
f950: 6e 65 64 20 66 69 72 73 74 29 2e 0a 23 0a 23 20  ned first)..#.# 
f960: 20 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 73    Test cases e_s
f970: 65 6c 65 63 74 2d 38 2e 32 2e 2a 20 74 65 73 74  elect-8.2.* test
f980: 20 74 68 65 20 61 62 6f 76 65 2e 0a 23 0a 23 20   the above..#.# 
f990: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
f9a0: 38 37 30 35 2d 33 33 33 39 33 20 49 66 20 6e 65  8705-33393 If ne
f9b0: 69 74 68 65 72 20 41 53 43 20 6f 72 20 44 45 53  ither ASC or DES
f9c0: 43 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  C are specified,
f9d0: 20 72 6f 77 73 0a 23 20 61 72 65 20 73 6f 72 74   rows.# are sort
f9e0: 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
f9f0: 28 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 20  (smaller values 
fa00: 66 69 72 73 74 29 20 6f 72 64 65 72 20 62 79 20  first) order by 
fa10: 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 20 20 54  default..#.#   T
fa20: 65 73 74 20 63 61 73 65 73 20 65 5f 73 65 6c 65  est cases e_sele
fa30: 63 74 2d 38 2e 33 2e 2a 20 74 65 73 74 20 74 68  ct-8.3.* test th
fa40: 65 20 61 62 6f 76 65 2e 20 41 6c 6c 20 38 2e 33  e above. All 8.3
fa50: 20 74 65 73 74 20 63 61 73 65 73 20 61 72 65 0a   test cases are.
fa60: 23 20 20 20 63 6f 70 69 65 73 20 6f 66 20 38 2e  #   copies of 8.
fa70: 32 20 74 65 73 74 20 63 61 73 65 73 20 77 69 74  2 test cases wit
fa80: 68 20 74 68 65 20 65 78 70 6c 69 63 69 74 20 22  h the explicit "
fa90: 41 53 43 22 20 72 65 6d 6f 76 65 64 2e 0a 23 0a  ASC" removed..#.
faa0: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
fab0: 65 5f 73 65 6c 65 63 74 2d 38 20 7b 0a 20 20 32  e_select-8 {.  2
fac0: 2e 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .1  "SELECT * FR
fad0: 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78  OM d1 ORDER BY x
fae0: 20 41 53 43 2c 20 79 20 41 53 43 2c 20 7a 20 41   ASC, y ASC, z A
faf0: 53 43 22 20 7b 0a 20 20 20 20 20 31 20 32 20 2d  SC" {.     1 2 -
fb00: 32 30 20 20 20 20 31 20 32 20 33 20 20 20 20 31  20    1 2 3    1
fb10: 20 32 20 37 20 20 20 20 31 20 32 20 38 20 20 20   2 7    1 2 8   
fb20: 20 0a 20 20 20 20 20 31 20 34 20 20 39 33 20 20   .     1 4  93  
fb30: 20 20 31 20 35 20 2d 31 20 20 20 32 20 34 20 39    1 5 -1   2 4 9
fb40: 33 20 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a 20  3   2 5 -1.  }. 
fb50: 20 32 2e 32 20 20 22 53 45 4c 45 43 54 20 2a 20   2.2  "SELECT * 
fb60: 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59  FROM d1 ORDER BY
fb70: 20 78 20 44 45 53 43 2c 20 79 20 44 45 53 43 2c   x DESC, y DESC,
fb80: 20 7a 20 44 45 53 43 22 20 7b 0a 20 20 20 20 20   z DESC" {.     
fb90: 32 20 35 20 2d 31 20 20 20 20 20 32 20 34 20 39  2 5 -1     2 4 9
fba0: 33 20 20 20 31 20 35 20 2d 31 20 20 20 31 20 34  3   1 5 -1   1 4
fbb0: 20 20 39 33 20 20 20 20 0a 20 20 20 20 20 31 20    93    .     1 
fbc0: 32 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20  2 8      1 2 7  
fbd0: 20 20 31 20 32 20 33 20 20 20 20 31 20 32 20 2d    1 2 3    1 2 -
fbe0: 32 30 20 20 20 20 0a 20 20 7d 0a 20 20 32 2e 33  20    .  }.  2.3
fbf0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
fc00: 64 31 20 4f 52 44 45 52 20 42 59 20 78 20 44 45  d1 ORDER BY x DE
fc10: 53 43 2c 20 79 20 41 53 43 2c 20 7a 20 44 45 53  SC, y ASC, z DES
fc20: 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33  C" {.     2 4 93
fc30: 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20     2 5 -1     1 
fc40: 32 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20  2 8      1 2 7  
fc50: 20 20 0a 20 20 20 20 20 31 20 32 20 33 20 20 20    .     1 2 3   
fc60: 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 34 20   1 2 -20    1 4 
fc70: 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
fc80: 0a 20 20 7d 0a 20 20 32 2e 34 20 20 22 53 45 4c  .  }.  2.4  "SEL
fc90: 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
fca0: 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20 79  DER BY x DESC, y
fcb0: 20 41 53 43 2c 20 7a 20 41 53 43 22 20 7b 0a 20   ASC, z ASC" {. 
fcc0: 20 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35      2 4 93   2 5
fcd0: 20 2d 31 20 20 20 20 20 31 20 32 20 2d 32 30 20   -1     1 2 -20 
fce0: 20 20 20 31 20 32 20 33 20 20 20 20 0a 20 20 20     1 2 3    .   
fcf0: 20 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38    1 2 7    1 2 8
fd00: 20 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20        1 4  93   
fd10: 20 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 0a   1 5 -1   .  }..
fd20: 20 20 33 2e 31 20 20 22 53 45 4c 45 43 54 20 2a    3.1  "SELECT *
fd30: 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42   FROM d1 ORDER B
fd40: 59 20 78 2c 20 79 2c 20 7a 22 20 7b 0a 20 20 20  Y x, y, z" {.   
fd50: 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 32    1 2 -20    1 2
fd60: 20 33 20 20 20 20 31 20 32 20 37 20 20 20 20 31   3    1 2 7    1
fd70: 20 32 20 38 20 20 20 20 0a 20 20 20 20 20 31 20   2 8    .     1 
fd80: 34 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20  4  93    1 5 -1 
fd90: 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
fda0: 31 0a 20 20 7d 0a 20 20 33 2e 33 20 20 22 53 45  1.  }.  3.3  "SE
fdb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f  LECT * FROM d1 O
fdc0: 52 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20  RDER BY x DESC, 
fdd0: 79 2c 20 7a 20 44 45 53 43 22 20 7b 0a 20 20 20  y, z DESC" {.   
fde0: 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
fdf0: 31 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20  1     1 2 8     
fe00: 20 31 20 32 20 37 20 20 20 20 0a 20 20 20 20 20   1 2 7    .     
fe10: 31 20 32 20 33 20 20 20 20 31 20 32 20 2d 32 30  1 2 3    1 2 -20
fe20: 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31      1 4  93    1
fe30: 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20 33   5 -1   .  }.  3
fe40: 2e 34 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  .4 "SELECT * FRO
fe50: 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 20  M d1 ORDER BY x 
fe60: 44 45 53 43 2c 20 79 2c 20 7a 22 20 7b 0a 20 20  DESC, y, z" {.  
fe70: 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20     2 4 93   2 5 
fe80: 2d 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20  -1     1 2 -20  
fe90: 20 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20    1 2 3    .    
fea0: 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
feb0: 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
fec0: 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 7d 0a  1 5 -1   .  }.}.
fed0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
fee0: 52 2d 32 39 37 37 39 2d 30 34 32 38 31 20 49 66  R-29779-04281 If
fef0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
ff00: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
ff10: 6e 73 74 61 6e 74 0a 23 20 69 6e 74 65 67 65 72  nstant.# integer
ff20: 20 4b 20 74 68 65 6e 20 74 68 65 20 65 78 70 72   K then the expr
ff30: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  ession is consid
ff40: 65 72 65 64 20 61 6e 20 61 6c 69 61 73 20 66 6f  ered an alias fo
ff50: 72 20 74 68 65 20 4b 2d 74 68 0a 23 20 63 6f 6c  r the K-th.# col
ff60: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
ff70: 74 20 73 65 74 20 28 63 6f 6c 75 6d 6e 73 20 61  t set (columns a
ff80: 72 65 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  re numbered from
ff90: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 0a 23   left to right.#
ffa0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31   starting with 1
ffb0: 29 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  )..#.do_select_t
ffc0: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e  ests e_select-8.
ffd0: 34 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54  4 {.  1  "SELECT
ffe0: 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   * FROM d1 ORDER
fff0: 20 42 59 20 31 20 41 53 43 2c 20 32 20 41 53 43   BY 1 ASC, 2 ASC
10000 2c 20 33 20 41 53 43 22 20 7b 0a 20 20 20 20 20  , 3 ASC" {.     
10010 31 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33  1 2 -20    1 2 3
10020 20 20 20 20 31 20 32 20 37 20 20 20 20 31 20 32      1 2 7    1 2
10030 20 38 20 20 20 20 0a 20 20 20 20 20 31 20 34 20   8    .     1 4 
10040 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
10050 32 20 34 20 39 33 20 20 20 32 20 35 20 2d 31 0a  2 4 93   2 5 -1.
10060 20 20 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54    }.  2  "SELECT
10070 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   * FROM d1 ORDER
10080 20 42 59 20 31 20 44 45 53 43 2c 20 32 20 44 45   BY 1 DESC, 2 DE
10090 53 43 2c 20 33 20 44 45 53 43 22 20 7b 0a 20 20  SC, 3 DESC" {.  
100a0 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 32 20     2 5 -1     2 
100b0 34 20 39 33 20 20 20 31 20 35 20 2d 31 20 20 20  4 93   1 5 -1   
100c0 31 20 34 20 20 39 33 20 20 20 20 0a 20 20 20 20  1 4  93    .    
100d0 20 31 20 32 20 38 20 20 20 20 20 20 31 20 32 20   1 2 8      1 2 
100e0 37 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20  7    1 2 3    1 
100f0 32 20 2d 32 30 20 20 20 20 0a 20 20 7d 0a 20 20  2 -20    .  }.  
10100 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  3 "SELECT * FROM
10110 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 20 44   d1 ORDER BY 1 D
10120 45 53 43 2c 20 32 20 41 53 43 2c 20 33 20 44 45  ESC, 2 ASC, 3 DE
10130 53 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39  SC" {.     2 4 9
10140 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31  3   2 5 -1     1
10150 20 32 20 38 20 20 20 20 20 20 31 20 32 20 37 20   2 8      1 2 7 
10160 20 20 20 0a 20 20 20 20 20 31 20 32 20 33 20 20     .     1 2 3  
10170 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 34    1 2 -20    1 4
10180 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20    93    1 5 -1  
10190 20 0a 20 20 7d 0a 20 20 34 20 20 22 53 45 4c 45   .  }.  4  "SELE
101a0 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
101b0 45 52 20 42 59 20 31 20 44 45 53 43 2c 20 32 20  ER BY 1 DESC, 2 
101c0 41 53 43 2c 20 33 20 41 53 43 22 20 7b 0a 20 20  ASC, 3 ASC" {.  
101d0 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20     2 4 93   2 5 
101e0 2d 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20  -1     1 2 -20  
101f0 20 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20    1 2 3    .    
10200 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
10210 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
10220 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20  1 5 -1   .  }.  
10230 35 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  5  "SELECT * FRO
10240 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 2c  M d1 ORDER BY 1,
10250 20 32 2c 20 33 22 20 7b 0a 20 20 20 20 20 31 20   2, 3" {.     1 
10260 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20 20  2 -20    1 2 3  
10270 20 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38    1 2 7    1 2 8
10280 20 20 20 20 0a 20 20 20 20 20 31 20 34 20 20 39      .     1 4  9
10290 33 20 20 20 20 31 20 35 20 2d 31 20 20 20 32 20  3    1 5 -1   2 
102a0 34 20 39 33 20 20 20 32 20 35 20 2d 31 0a 20 20  4 93   2 5 -1.  
102b0 7d 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 2a  }.  6  "SELECT *
102c0 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42   FROM d1 ORDER B
102d0 59 20 31 20 44 45 53 43 2c 20 32 2c 20 33 20 44  Y 1 DESC, 2, 3 D
102e0 45 53 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20  ESC" {.     2 4 
102f0 39 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20  93   2 5 -1     
10300 31 20 32 20 38 20 20 20 20 20 20 31 20 32 20 37  1 2 8      1 2 7
10310 20 20 20 20 0a 20 20 20 20 20 31 20 32 20 33 20      .     1 2 3 
10320 20 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20     1 2 -20    1 
10330 34 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20  4  93    1 5 -1 
10340 20 20 0a 20 20 7d 0a 20 20 37 20 20 22 53 45 4c    .  }.  7  "SEL
10350 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
10360 44 45 52 20 42 59 20 31 20 44 45 53 43 2c 20 32  DER BY 1 DESC, 2
10370 2c 20 33 22 20 7b 0a 20 20 20 20 20 32 20 34 20  , 3" {.     2 4 
10380 39 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20  93   2 5 -1     
10390 31 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33  1 2 -20    1 2 3
103a0 20 20 20 20 0a 20 20 20 20 20 31 20 32 20 37 20      .     1 2 7 
103b0 20 20 20 31 20 32 20 38 20 20 20 20 20 20 31 20     1 2 8      1 
103c0 34 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20  4  93    1 5 -1 
103d0 20 20 0a 20 20 7d 0a 20 20 38 20 20 22 53 45 4c    .  }.  8  "SEL
103e0 45 43 54 20 7a 2c 20 78 20 46 52 4f 4d 20 64 31  ECT z, x FROM d1
103f0 20 4f 52 44 45 52 20 42 59 20 32 22 20 7b 0a 20   ORDER BY 2" {. 
10400 20 20 20 20 2f 23 20 31 20 20 20 20 23 20 31 20      /# 1    # 1 
10410 20 20 20 23 20 31 20 20 20 23 20 31 20 0a 20 20     # 1   # 1 .  
10420 20 20 20 20 23 20 31 20 20 20 20 23 20 31 20 20      # 1    # 1  
10430 20 20 23 20 32 20 20 20 23 20 32 2f 0a 20 20 7d    # 2   # 2/.  }
10440 0a 20 20 39 20 20 22 53 45 4c 45 43 54 20 7a 2c  .  9  "SELECT z,
10450 20 78 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   x FROM d1 ORDER
10460 20 42 59 20 31 22 20 7b 0a 20 20 20 20 20 2f 2d   BY 1" {.     /-
10470 32 30 20 31 20 20 2d 31 20 23 20 20 20 2d 31 20  20 1  -1 #   -1 
10480 23 20 20 20 33 20 31 0a 20 20 20 20 20 37 20 31  #   3 1.     7 1
10490 20 20 20 20 20 38 20 31 20 20 20 39 33 20 23 20       8 1   93 # 
104a0 20 20 39 33 20 23 2f 20 20 20 0a 20 20 7d 0a 7d    93 #/   .  }.}
104b0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
104c0 20 52 2d 36 33 32 38 36 2d 35 31 39 37 37 20 49   R-63286-51977 I
104d0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  f the ORDER BY e
104e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
104f0 69 64 65 6e 74 69 66 69 65 72 0a 23 20 74 68 61  identifier.# tha
10500 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
10510 20 74 68 65 20 61 6c 69 61 73 20 6f 66 20 6f 6e   the alias of on
10520 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
10530 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
10540 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69  e.# expression i
10550 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  s considered an 
10560 61 6c 69 61 73 20 66 6f 72 20 74 68 61 74 20 63  alias for that c
10570 6f 6c 75 6d 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65  olumn..#.do_sele
10580 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
10590 74 2d 38 2e 35 20 7b 0a 20 20 31 20 20 20 22 53  t-8.5 {.  1   "S
105a0 45 4c 45 43 54 20 7a 2b 31 20 41 53 20 61 62 63  ELECT z+1 AS abc
105b0 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42   FROM d1 ORDER B
105c0 59 20 61 62 63 22 20 7b 0a 20 20 20 20 2d 31 39  Y abc" {.    -19
105d0 20 30 20 30 20 34 20 38 20 39 20 39 34 20 39 34   0 0 4 8 9 94 94
105e0 0a 20 20 7d 0a 20 20 32 20 20 20 22 53 45 4c 45  .  }.  2   "SELE
105f0 43 54 20 7a 2b 31 20 41 53 20 61 62 63 20 46 52  CT z+1 AS abc FR
10600 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 61  OM d1 ORDER BY a
10610 62 63 20 44 45 53 43 22 20 7b 0a 20 20 20 20 39  bc DESC" {.    9
10620 34 20 39 34 20 39 20 38 20 34 20 30 20 30 20 2d  4 94 9 8 4 0 0 -
10630 31 39 0a 20 20 7d 0a 20 20 33 20 20 22 53 45 4c  19.  }.  3  "SEL
10640 45 43 54 20 7a 20 41 53 20 78 2c 20 78 20 41 53  ECT z AS x, x AS
10650 20 7a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   z FROM d1 ORDER
10660 20 42 59 20 7a 22 20 7b 0a 20 20 20 20 2f 23 20   BY z" {.    /# 
10670 31 20 20 20 20 23 20 31 20 20 20 20 23 20 31 20  1    # 1    # 1 
10680 20 20 20 23 20 31 20 20 20 20 23 20 31 20 20 20     # 1    # 1   
10690 20 23 20 31 20 20 20 20 23 20 32 20 20 20 20 23   # 1    # 2    #
106a0 20 32 2f 0a 20 20 7d 0a 20 20 34 20 20 22 53 45   2/.  }.  4  "SE
106b0 4c 45 43 54 20 7a 20 41 53 20 78 2c 20 78 20 41  LECT z AS x, x A
106c0 53 20 7a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  S z FROM d1 ORDE
106d0 52 20 42 59 20 78 22 20 7b 0a 20 20 20 20 2f 2d  R BY x" {.    /-
106e0 32 30 20 31 20 20 20 20 2d 31 20 23 20 20 20 20  20 1    -1 #    
106f0 2d 31 20 23 20 20 20 20 33 20 31 20 20 20 20 37  -1 #    3 1    7
10700 20 31 20 20 20 20 38 20 31 20 20 20 20 39 33 20   1    8 1    93 
10710 23 20 20 20 20 39 33 20 23 2f 0a 20 20 7d 0a 7d  #    93 #/.  }.}
10720 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
10730 20 52 2d 36 35 30 36 38 2d 32 37 32 30 37 20 4f   R-65068-27207 O
10740 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
10750 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
10760 73 69 6f 6e 20 69 73 0a 23 20 61 6e 79 20 6f 74  sion is.# any ot
10770 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  her expression, 
10780 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  it is evaluated 
10790 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  and the returned
107a0 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f 0a 23   value used to.#
107b0 20 6f 72 64 65 72 20 74 68 65 20 6f 75 74 70 75   order the outpu
107c0 74 20 72 6f 77 73 2e 0a 23 0a 23 20 45 56 49 44  t rows..#.# EVID
107d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 34 32 31  ENCE-OF: R-03421
107e0 2d 35 37 39 38 38 20 49 66 20 74 68 65 20 53 45  -57988 If the SE
107f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
10800 73 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  s a simple SELEC
10810 54 2c 0a 23 20 74 68 65 6e 20 61 6e 20 4f 52 44  T,.# then an ORD
10820 45 52 20 42 59 20 6d 61 79 20 63 6f 6e 74 61 69  ER BY may contai
10830 6e 20 61 6e 79 20 61 72 62 69 74 72 61 72 79 20  n any arbitrary 
10840 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 64  expressions..#.d
10850 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
10860 5f 73 65 6c 65 63 74 2d 38 2e 36 20 7b 0a 20 20  _select-8.6 {.  
10870 31 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  1   "SELECT * FR
10880 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78  OM d1 ORDER BY x
10890 2b 79 2b 7a 22 20 7b 0a 20 20 20 20 31 20 32 20  +y+z" {.    1 2 
108a0 2d 32 30 20 20 20 20 31 20 35 20 2d 31 20 20 20  -20    1 5 -1   
108b0 20 31 20 32 20 33 20 20 20 20 32 20 35 20 2d 31   1 2 3    2 5 -1
108c0 20 0a 20 20 20 20 31 20 32 20 37 20 20 20 20 20   .    1 2 7     
108d0 20 31 20 32 20 38 20 20 20 20 20 31 20 34 20 39   1 2 8     1 4 9
108e0 33 20 20 20 32 20 34 20 39 33 0a 20 20 7d 0a 20  3   2 4 93.  }. 
108f0 20 32 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   2   "SELECT * F
10900 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20  ROM d1 ORDER BY 
10910 78 2a 7a 22 20 7b 0a 20 20 20 20 31 20 32 20 2d  x*z" {.    1 2 -
10920 32 30 20 20 20 20 32 20 35 20 2d 31 20 20 20 20  20    2 5 -1    
10930 31 20 35 20 2d 31 20 20 20 20 31 20 32 20 33 20  1 5 -1    1 2 3 
10940 0a 20 20 20 20 31 20 32 20 37 20 20 20 20 20 20  .    1 2 7      
10950 31 20 32 20 38 20 20 20 20 20 31 20 34 20 39 33  1 2 8     1 4 93
10960 20 20 20 20 32 20 34 20 39 33 0a 20 20 7d 0a 20      2 4 93.  }. 
10970 20 33 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46   3   "SELECT * F
10980 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20  ROM d1 ORDER BY 
10990 79 2a 7a 22 20 7b 0a 20 20 20 20 31 20 32 20 2d  y*z" {.    1 2 -
109a0 32 30 20 20 20 20 32 20 35 20 2d 31 20 20 20 20  20    2 5 -1    
109b0 31 20 35 20 2d 31 20 20 20 20 31 20 32 20 33 20  1 5 -1    1 2 3 
109c0 0a 20 20 20 20 31 20 32 20 37 20 20 20 20 20 20  .    1 2 7      
109d0 31 20 32 20 38 20 20 20 20 20 32 20 34 20 39 33  1 2 8     2 4 93
109e0 20 20 20 20 31 20 34 20 39 33 0a 20 20 7d 0a 7d      1 4 93.  }.}
109f0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
10a00 20 52 2d 32 38 38 35 33 2d 30 38 31 34 37 20 48   R-28853-08147 H
10a10 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 53  owever, if the S
10a20 45 4c 45 43 54 20 69 73 20 61 20 63 6f 6d 70 6f  ELECT is a compo
10a30 75 6e 64 0a 23 20 53 45 4c 45 43 54 2c 20 74 68  und.# SELECT, th
10a40 65 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  en ORDER BY expr
10a50 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
10a60 20 6e 6f 74 20 61 6c 69 61 73 65 73 20 74 6f 20   not aliases to 
10a70 6f 75 74 70 75 74 0a 23 20 63 6f 6c 75 6d 6e 73  output.# columns
10a80 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
10a90 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 6e 20   the same as an 
10aa0 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
10ab0 61 73 20 61 6e 20 6f 75 74 70 75 74 0a 23 20 63  as an output.# c
10ac0 6f 6c 75 6d 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65  olumn..#.do_sele
10ad0 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
10ae0 74 2d 38 2e 37 2e 31 20 2d 65 72 72 6f 72 20 7b  t-8.7.1 -error {
10af0 0a 20 20 25 73 20 4f 52 44 45 52 20 42 59 20 74  .  %s ORDER BY t
10b00 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  erm does not mat
10b10 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 6e  ch any column in
10b20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
10b30 7d 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45 43  } {.  1   "SELEC
10b40 54 20 78 20 46 52 4f 4d 20 64 31 20 55 4e 49 4f  T x FROM d1 UNIO
10b50 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20 46  N ALL SELECT a F
10b60 52 4f 4d 20 64 32 20 4f 52 44 45 52 20 42 59 20  ROM d2 ORDER BY 
10b70 78 2a 7a 22 20 20 20 20 20 20 20 20 31 73 74 0a  x*z"        1st.
10b80 20 20 32 20 20 20 22 53 45 4c 45 43 54 20 78 2c    2   "SELECT x,
10b90 7a 20 46 52 4f 4d 20 64 31 20 55 4e 49 4f 4e 20  z FROM d1 UNION 
10ba0 41 4c 4c 20 53 45 4c 45 43 54 20 61 2c 62 20 46  ALL SELECT a,b F
10bb0 52 4f 4d 20 64 32 20 4f 52 44 45 52 20 42 59 20  ROM d2 ORDER BY 
10bc0 78 2c 20 78 2f 7a 22 20 32 6e 64 0a 7d 20 0a 0a  x, x/z" 2nd.} ..
10bd0 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
10be0 65 5f 73 65 6c 65 63 74 2d 38 2e 37 2e 32 20 7b  e_select-8.7.2 {
10bf0 0a 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 78  .  1   "SELECT x
10c00 2a 7a 20 46 52 4f 4d 20 64 31 20 55 4e 49 4f 4e  *z FROM d1 UNION
10c10 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20 46 52   ALL SELECT a FR
10c20 4f 4d 20 64 32 20 4f 52 44 45 52 20 42 59 20 78  OM d2 ORDER BY x
10c30 2a 7a 22 20 7b 0a 20 20 20 20 2d 32 30 20 2d 32  *z" {.    -20 -2
10c40 20 2d 31 20 33 20 37 20 38 20 39 33 20 31 38 36   -1 3 7 8 93 186
10c50 20 62 61 62 69 65 64 20 62 61 72 6b 65 64 20 63   babied barked c
10c60 6f 6d 6d 65 72 63 69 61 6c 73 20 67 65 6e 74 6c  ommercials gentl
10c70 79 20 0a 20 20 20 20 69 74 65 72 61 74 65 20 6c  y .    iterate l
10c80 61 64 20 70 72 61 67 6d 61 74 69 73 74 20 72 65  ad pragmatist re
10c90 65 6d 70 68 61 73 69 7a 65 73 20 72 65 6a 6f 69  emphasizes rejoi
10ca0 63 69 6e 67 20 73 6f 6c 65 6d 6e 6e 65 73 73 0a  cing solemnness.
10cb0 20 20 7d 0a 20 20 32 20 20 20 22 53 45 4c 45 43    }.  2   "SELEC
10cc0 54 20 78 2c 20 78 2f 7a 20 46 52 4f 4d 20 64 31  T x, x/z FROM d1
10cd0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
10ce0 54 20 61 2c 62 20 46 52 4f 4d 20 64 32 20 4f 52  T a,b FROM d2 OR
10cf0 44 45 52 20 42 59 20 78 2c 20 78 2f 7a 22 20 7b  DER BY x, x/z" {
10d00 0a 20 20 20 20 31 20 2d 31 20 31 20 30 20 31 20  .    1 -1 1 0 1 
10d10 30 20 31 20 30 20 31 20 30 20 31 20 30 20 32 20  0 1 0 1 0 1 0 2 
10d20 2d 32 20 32 20 30 20 0a 20 20 20 20 62 61 62 69  -2 2 0 .    babi
10d30 65 64 20 63 68 61 72 69 74 61 62 6c 65 6e 65 73  ed charitablenes
10d40 73 20 62 61 72 6b 65 64 20 69 6e 74 65 72 72 75  s barked interru
10d50 70 74 65 64 20 63 6f 6d 6d 65 72 63 69 61 6c 73  pted commercials
10d60 20 62 61 74 68 72 6f 62 65 20 67 65 6e 74 6c 79   bathrobe gently
10d70 0a 20 20 20 20 66 61 69 6c 69 6e 67 73 20 69 74  .    failings it
10d80 65 72 61 74 65 20 73 65 78 74 6f 6e 20 6c 61 64  erate sexton lad
10d90 20 72 65 6c 65 6e 74 69 6e 67 20 70 72 61 67 6d   relenting pragm
10da0 61 74 69 73 74 20 67 75 61 72 64 65 64 20 72 65  atist guarded re
10db0 65 6d 70 68 61 73 69 7a 65 73 20 72 65 70 6c 79  emphasizes reply
10dc0 0a 20 20 20 20 72 65 6a 6f 69 63 69 6e 67 20 6c  .    rejoicing l
10dd0 69 61 62 69 6c 69 74 69 65 73 20 73 6f 6c 65 6d  iabilities solem
10de0 6e 6e 65 73 73 20 61 6e 6e 65 78 65 64 0a 20 20  nness annexed.  
10df0 7d 0a 7d 20 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  }.} ..do_execsql
10e00 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38  _test e_select-8
10e10 2e 38 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .8.0 {.  CREATE 
10e20 54 41 42 4c 45 20 64 33 28 61 29 3b 0a 20 20 49  TABLE d3(a);.  I
10e30 4e 53 45 52 54 20 49 4e 54 4f 20 64 33 20 56 41  NSERT INTO d3 VA
10e40 4c 55 45 53 28 27 74 65 78 74 27 29 3b 0a 20 20  LUES('text');.  
10e50 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 33 20 56  INSERT INTO d3 V
10e60 41 4c 55 45 53 28 31 34 2e 31 29 3b 0a 20 20 49  ALUES(14.1);.  I
10e70 4e 53 45 52 54 20 49 4e 54 4f 20 64 33 20 56 41  NSERT INTO d3 VA
10e80 4c 55 45 53 28 31 33 29 3b 0a 20 20 49 4e 53 45  LUES(13);.  INSE
10e90 52 54 20 49 4e 54 4f 20 64 33 20 56 41 4c 55 45  RT INTO d3 VALUE
10ea0 53 28 58 27 37 38 37 38 37 38 37 38 27 29 3b 0a  S(X'78787878');.
10eb0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 33    INSERT INTO d3
10ec0 20 56 41 4c 55 45 53 28 31 35 29 3b 0a 20 20 49   VALUES(15);.  I
10ed0 4e 53 45 52 54 20 49 4e 54 4f 20 64 33 20 56 41  NSERT INTO d3 VA
10ee0 4c 55 45 53 28 31 32 2e 39 29 3b 0a 20 20 49 4e  LUES(12.9);.  IN
10ef0 53 45 52 54 20 49 4e 54 4f 20 64 33 20 56 41 4c  SERT INTO d3 VAL
10f00 55 45 53 28 6e 75 6c 6c 29 3b 0a 0a 20 20 43 52  UES(null);..  CR
10f10 45 41 54 45 20 54 41 42 4c 45 20 64 34 28 78 20  EATE TABLE d4(x 
10f20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b  COLLATE nocase);
10f30 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
10f40 34 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 3b  4 VALUES('abc');
10f50 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
10f60 34 20 56 41 4c 55 45 53 28 27 67 68 69 27 29 3b  4 VALUES('ghi');
10f70 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
10f80 34 20 56 41 4c 55 45 53 28 27 44 45 46 27 29 3b  4 VALUES('DEF');
10f90 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
10fa0 34 20 56 41 4c 55 45 53 28 27 4a 4b 4c 27 29 3b  4 VALUES('JKL');
10fb0 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  .} {}..# EVIDENC
10fc0 45 2d 4f 46 3a 20 52 2d 31 30 38 38 33 2d 31 37  E-OF: R-10883-17
10fd0 36 39 37 20 46 6f 72 20 74 68 65 20 70 75 72 70  697 For the purp
10fe0 6f 73 65 73 20 6f 66 20 73 6f 72 74 69 6e 67 20  oses of sorting 
10ff0 72 6f 77 73 2c 20 76 61 6c 75 65 73 0a 23 20 61  rows, values.# a
11000 72 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20 74  re compared in t
11010 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 66  he same way as f
11020 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78  or comparison ex
11030 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 20  pressions..#.#  
11040 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
11050 65 73 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ests verify that
11060 20 76 61 6c 75 65 73 20 6f 66 20 64 69 66 66 65   values of diffe
11070 72 65 6e 74 20 74 79 70 65 73 20 61 72 65 20 73  rent types are s
11080 6f 72 74 65 64 0a 23 20 20 20 63 6f 72 72 65 63  orted.#   correc
11090 74 6c 79 2c 20 61 6e 64 20 74 68 61 74 20 6d 69  tly, and that mi
110a0 78 65 64 20 72 65 61 6c 20 61 6e 64 20 69 6e 74  xed real and int
110b0 65 67 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  eger values are 
110c0 63 6f 6d 70 61 72 65 64 20 70 72 6f 70 65 72 6c  compared properl
110d0 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  y..#.do_execsql_
110e0 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e  test e_select-8.
110f0 38 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  8.1 {.  SELECT a
11100 20 46 52 4f 4d 20 64 33 20 4f 52 44 45 52 20 42   FROM d3 ORDER B
11110 59 20 61 0a 7d 20 7b 7b 7d 20 31 32 2e 39 20 31  Y a.} {{} 12.9 1
11120 33 20 31 34 2e 31 20 31 35 20 74 65 78 74 20 78  3 14.1 15 text x
11130 78 78 78 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  xxx}.do_execsql_
11140 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e  test e_select-8.
11150 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  8.2 {.  SELECT a
11160 20 46 52 4f 4d 20 64 33 20 4f 52 44 45 52 20 42   FROM d3 ORDER B
11170 59 20 61 20 44 45 53 43 0a 7d 20 7b 78 78 78 78  Y a DESC.} {xxxx
11180 20 74 65 78 74 20 31 35 20 31 34 2e 31 20 31 33   text 15 14.1 13
11190 20 31 32 2e 39 20 7b 7d 7d 0a 0a 0a 23 20 45 56   12.9 {}}...# EV
111a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 31  IDENCE-OF: R-641
111b0 39 39 2d 32 32 34 37 31 20 49 66 20 74 68 65 20  99-22471 If the 
111c0 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
111d0 69 6f 6e 20 69 73 20 61 73 73 69 67 6e 65 64 20  ion is assigned 
111e0 61 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  a.# collation se
111f0 71 75 65 6e 63 65 20 75 73 69 6e 67 20 74 68 65  quence using the
11200 20 70 6f 73 74 66 69 78 20 43 4f 4c 4c 41 54 45   postfix COLLATE
11210 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
11220 74 68 65 0a 23 20 73 70 65 63 69 66 69 65 64 20  the.# specified 
11230 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
11240 63 65 20 69 73 20 75 73 65 64 2e 0a 23 0a 64 6f  ce is used..#.do
11250 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
11260 73 65 6c 65 63 74 2d 38 2e 39 2e 31 20 7b 0a 20  select-8.9.1 {. 
11270 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 64   SELECT x FROM d
11280 34 20 4f 52 44 45 52 20 42 59 20 31 20 43 4f 4c  4 ORDER BY 1 COL
11290 4c 41 54 45 20 62 69 6e 61 72 79 0a 7d 20 7b 44  LATE binary.} {D
112a0 45 46 20 4a 4b 4c 20 61 62 63 20 67 68 69 7d 0a  EF JKL abc ghi}.
112b0 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
112c0 65 5f 73 65 6c 65 63 74 2d 38 2e 39 2e 32 20 7b  e_select-8.9.2 {
112d0 0a 20 20 53 45 4c 45 43 54 20 78 20 43 4f 4c 4c  .  SELECT x COLL
112e0 41 54 45 20 62 69 6e 61 72 79 20 46 52 4f 4d 20  ATE binary FROM 
112f0 64 34 20 4f 52 44 45 52 20 42 59 20 31 20 43 4f  d4 ORDER BY 1 CO
11300 4c 4c 41 54 45 20 6e 6f 63 61 73 65 0a 7d 20 7b  LLATE nocase.} {
11310 61 62 63 20 44 45 46 20 67 68 69 20 4a 4b 4c 7d  abc DEF ghi JKL}
11320 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
11330 20 52 2d 30 39 33 39 38 2d 32 36 31 30 32 20 4f   R-09398-26102 O
11340 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
11350 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
11360 73 69 6f 6e 20 69 73 20 0a 23 20 61 6e 20 61 6c  sion is .# an al
11370 69 61 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ias to an expres
11380 73 69 6f 6e 20 74 68 61 74 20 68 61 73 20 62 65  sion that has be
11390 65 6e 20 61 73 73 69 67 6e 65 64 20 61 20 63 6f  en assigned a co
113a0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
113b0 20 0a 23 20 75 73 69 6e 67 20 74 68 65 20 70 6f   .# using the po
113c0 73 74 66 69 78 20 43 4f 4c 4c 41 54 45 20 6f 70  stfix COLLATE op
113d0 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 74 68 65  erator, then the
113e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
113f0 6e 63 65 20 0a 23 20 61 73 73 69 67 6e 65 64 20  nce .# assigned 
11400 74 6f 20 74 68 65 20 61 6c 69 61 73 65 64 20 65  to the aliased e
11410 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 73 65  xpression is use
11420 64 2e 0a 23 0a 23 20 20 20 49 6e 20 74 68 65 20  d..#.#   In the 
11430 74 65 73 74 20 38 2e 31 30 2e 32 2c 20 74 68 65  test 8.10.2, the
11440 20 6f 6e 6c 79 20 72 65 73 75 6c 74 2d 63 6f 6c   only result-col
11450 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 68  umn expression h
11460 61 73 20 6e 6f 20 61 6c 69 61 73 2e 20 53 6f 20  as no alias. So 
11470 74 68 65 0a 23 20 20 20 4f 52 44 45 52 20 42 59  the.#   ORDER BY
11480 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
11490 6f 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ot a reference t
114a0 6f 20 69 74 20 61 6e 64 20 74 68 65 72 65 66 6f  o it and therefo
114b0 72 65 20 64 6f 65 73 20 6e 6f 74 20 69 6e 68 65  re does not inhe
114c0 72 69 74 0a 23 20 20 20 74 68 65 20 63 6f 6c 6c  rit.#   the coll
114d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
114e0 49 6e 20 74 65 73 74 20 38 2e 31 30 2e 33 2c 20  In test 8.10.3, 
114f0 22 78 22 20 69 73 20 74 68 65 20 61 6c 69 61 73  "x" is the alias
11500 20 28 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65   (as well as the
11510 0a 23 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  .#   column name
11520 29 2c 20 73 6f 20 74 68 65 20 4f 52 44 45 52 20  ), so the ORDER 
11530 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  BY expression is
11540 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
11550 61 6e 20 61 6c 69 61 73 20 61 6e 64 20 74 68 65  an alias and the
11560 0a 23 20 20 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  .#   collation s
11570 65 71 75 65 6e 63 65 20 61 74 74 61 63 68 65 64  equence attached
11580 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 63   to the result c
11590 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 66 6f  olumn is used fo
115a0 72 20 73 6f 72 74 69 6e 67 2e 0a 23 0a 64 6f 5f  r sorting..#.do_
115b0 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73  execsql_test e_s
115c0 65 6c 65 63 74 2d 38 2e 31 30 2e 31 20 7b 0a 20  elect-8.10.1 {. 
115d0 20 53 45 4c 45 43 54 20 78 20 43 4f 4c 4c 41 54   SELECT x COLLAT
115e0 45 20 62 69 6e 61 72 79 20 46 52 4f 4d 20 64 34  E binary FROM d4
115f0 20 4f 52 44 45 52 20 42 59 20 31 0a 7d 20 7b 44   ORDER BY 1.} {D
11600 45 46 20 4a 4b 4c 20 61 62 63 20 67 68 69 7d 0a  EF JKL abc ghi}.
11610 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
11620 65 5f 73 65 6c 65 63 74 2d 38 2e 31 30 2e 32 20  e_select-8.10.2 
11630 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 43 4f 4c  {.  SELECT x COL
11640 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52 4f 4d  LATE binary FROM
11650 20 64 34 20 4f 52 44 45 52 20 42 59 20 78 0a 7d   d4 ORDER BY x.}
11660 20 7b 61 62 63 20 44 45 46 20 67 68 69 20 4a 4b   {abc DEF ghi JK
11670 4c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  L}.do_execsql_te
11680 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 30  st e_select-8.10
11690 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20  .3 {.  SELECT x 
116a0 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 41  COLLATE binary A
116b0 53 20 78 20 46 52 4f 4d 20 64 34 20 4f 52 44 45  S x FROM d4 ORDE
116c0 52 20 42 59 20 78 0a 7d 20 7b 44 45 46 20 4a 4b  R BY x.} {DEF JK
116d0 4c 20 61 62 63 20 67 68 69 7d 0a 0a 23 20 45 56  L abc ghi}..# EV
116e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 33  IDENCE-OF: R-273
116f0 30 31 2d 30 39 36 35 38 20 4f 74 68 65 72 77 69  01-09658 Otherwi
11700 73 65 2c 20 69 66 20 74 68 65 20 4f 52 44 45 52  se, if the ORDER
11710 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69   BY expression i
11720 73 20 61 0a 23 20 63 6f 6c 75 6d 6e 20 6f 72 20  s a.# column or 
11730 61 6e 20 61 6c 69 61 73 20 6f 66 20 61 6e 20 65  an alias of an e
11740 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
11750 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
11760 20 74 68 65 20 64 65 66 61 75 6c 74 0a 23 20 63   the default.# c
11770 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
11780 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
11790 20 69 73 20 75 73 65 64 2e 0a 23 0a 64 6f 5f 65   is used..#.do_e
117a0 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
117b0 6c 65 63 74 2d 38 2e 31 31 2e 31 20 7b 0a 20 20  lect-8.11.1 {.  
117c0 53 45 4c 45 43 54 20 78 20 41 53 20 79 20 46 52  SELECT x AS y FR
117d0 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59 20 79  OM d4 ORDER BY y
117e0 0a 7d 20 7b 61 62 63 20 44 45 46 20 67 68 69 20  .} {abc DEF ghi 
117f0 4a 4b 4c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  JKL}.do_execsql_
11800 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e  test e_select-8.
11810 31 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  11.2 {.  SELECT 
11820 78 7c 7c 27 27 20 46 52 4f 4d 20 64 34 20 4f 52  x||'' FROM d4 OR
11830 44 45 52 20 42 59 20 78 0a 7d 20 7b 61 62 63 20  DER BY x.} {abc 
11840 44 45 46 20 67 68 69 20 4a 4b 4c 7d 0a 0a 23 20  DEF ghi JKL}..# 
11850 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
11860 39 39 32 35 2d 35 35 39 30 35 20 4f 74 68 65 72  9925-55905 Other
11870 77 69 73 65 2c 20 74 68 65 20 42 49 4e 41 52 59  wise, the BINARY
11880 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
11890 6e 63 65 20 69 73 0a 23 20 75 73 65 64 2e 0a 23  nce is.# used..#
118a0 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
118b0 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 32 2e 31   e_select-8.12.1
118c0 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52   {.  SELECT x FR
118d0 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59 20 78  OM d4 ORDER BY x
118e0 7c 7c 27 27 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20  ||''.} {DEF JKL 
118f0 61 62 63 20 67 68 69 7d 0a 0a 23 20 45 56 49 44  abc ghi}..# EVID
11900 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 31 33 30  ENCE-OF: R-44130
11910 2d 33 32 35 39 33 20 49 66 20 61 6e 20 4f 52 44  -32593 If an ORD
11920 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
11930 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
11940 65 72 0a 23 20 61 6c 69 61 73 2c 20 74 68 65 6e  er.# alias, then
11950 20 53 51 4c 69 74 65 20 73 65 61 72 63 68 65 73   SQLite searches
11960 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53   the left-most S
11970 45 4c 45 43 54 20 69 6e 20 74 68 65 20 63 6f 6d  ELECT in the com
11980 70 6f 75 6e 64 20 66 6f 72 20 61 0a 23 20 72 65  pound for a.# re
11990 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 74 68 61 74  sult column that
119a0 20 6d 61 74 63 68 65 73 20 65 69 74 68 65 72 20   matches either 
119b0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 74 68  the second or th
119c0 69 72 64 20 72 75 6c 65 73 20 61 62 6f 76 65 2e  ird rules above.
119d0 20 49 66 0a 23 20 61 20 6d 61 74 63 68 20 69 73   If.# a match is
119e0 20 66 6f 75 6e 64 2c 20 74 68 65 20 73 65 61 72   found, the sear
119f0 63 68 20 73 74 6f 70 73 20 61 6e 64 20 74 68 65  ch stops and the
11a00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 68   expression is h
11a10 61 6e 64 6c 65 64 20 61 73 20 61 6e 0a 23 20 61  andled as an.# a
11a20 6c 69 61 73 20 66 6f 72 20 74 68 65 20 72 65 73  lias for the res
11a30 75 6c 74 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ult column that 
11a40 69 74 20 68 61 73 20 62 65 65 6e 20 6d 61 74 63  it has been matc
11a50 68 65 64 20 61 67 61 69 6e 73 74 2e 0a 23 20 4f  hed against..# O
11a60 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6e 65  therwise, the ne
11a70 78 74 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  xt SELECT to the
11a80 20 72 69 67 68 74 20 69 73 20 74 72 69 65 64 2c   right is tried,
11a90 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 23 0a 64 6f   and so on..#.do
11aa0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
11ab0 73 65 6c 65 63 74 2d 38 2e 31 33 2e 30 20 7b 0a  select-8.13.0 {.
11ac0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
11ad0 35 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  5(a, b);.  CREAT
11ae0 45 20 54 41 42 4c 45 20 64 36 28 63 2c 20 64 29  E TABLE d6(c, d)
11af0 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
11b00 20 64 37 28 65 2c 20 66 29 3b 0a 20 0a 20 20 49   d7(e, f);. .  I
11b10 4e 53 45 52 54 20 49 4e 54 4f 20 64 35 20 56 41  NSERT INTO d5 VA
11b20 4c 55 45 53 28 31 2c 20 27 66 27 29 3b 0a 20 20  LUES(1, 'f');.  
11b30 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 36 20 56  INSERT INTO d6 V
11b40 41 4c 55 45 53 28 32 2c 20 27 65 27 29 3b 0a 20  ALUES(2, 'e');. 
11b50 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 37 20   INSERT INTO d7 
11b60 56 41 4c 55 45 53 28 33 2c 20 27 64 27 29 3b 0a  VALUES(3, 'd');.
11b70 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 35    INSERT INTO d5
11b80 20 56 41 4c 55 45 53 28 34 2c 20 27 63 27 29 3b   VALUES(4, 'c');
11b90 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
11ba0 36 20 56 41 4c 55 45 53 28 35 2c 20 27 62 27 29  6 VALUES(5, 'b')
11bb0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
11bc0 64 37 20 56 41 4c 55 45 53 28 36 2c 20 27 61 27  d7 VALUES(6, 'a'
11bd0 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
11be0 4c 45 20 64 38 28 78 20 43 4f 4c 4c 41 54 45 20  LE d8(x COLLATE 
11bf0 6e 6f 63 61 73 65 29 3b 0a 20 20 43 52 45 41 54  nocase);.  CREAT
11c00 45 20 54 41 42 4c 45 20 64 39 28 79 20 43 4f 4c  E TABLE d9(y COL
11c10 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 0a 20  LATE nocase);.. 
11c20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 38 20   INSERT INTO d8 
11c30 56 41 4c 55 45 53 28 27 61 27 29 3b 0a 20 20 49  VALUES('a');.  I
11c40 4e 53 45 52 54 20 49 4e 54 4f 20 64 39 20 56 41  NSERT INTO d9 VA
11c50 4c 55 45 53 28 27 42 27 29 3b 0a 20 20 49 4e 53  LUES('B');.  INS
11c60 45 52 54 20 49 4e 54 4f 20 64 38 20 56 41 4c 55  ERT INTO d8 VALU
11c70 45 53 28 27 63 27 29 3b 0a 20 20 49 4e 53 45 52  ES('c');.  INSER
11c80 54 20 49 4e 54 4f 20 64 39 20 56 41 4c 55 45 53  T INTO d9 VALUES
11c90 28 27 44 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73  ('D');.} {}.do_s
11ca0 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
11cb0 6c 65 63 74 2d 38 2e 31 33 20 7b 0a 20 20 31 20  lect-8.13 {.  1 
11cc0 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f    { SELECT a FRO
11cd0 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  M d5 UNION ALL S
11ce0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64 36 20  ELECT c FROM d6 
11cf0 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
11d00 20 65 20 46 52 4f 4d 20 64 37 0a 20 20 20 20 20   e FROM d7.     
11d10 20 20 20 20 4f 52 44 45 52 20 42 59 20 61 0a 20      ORDER BY a. 
11d20 20 20 20 20 20 7d 20 7b 31 20 32 20 33 20 34 20       } {1 2 3 4 
11d30 35 20 36 7d 0a 20 20 32 20 20 20 7b 20 53 45 4c  5 6}.  2   { SEL
11d40 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20 55 4e  ECT a FROM d5 UN
11d50 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63  ION ALL SELECT c
11d60 20 46 52 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41   FROM d6 UNION A
11d70 4c 4c 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d  LL SELECT e FROM
11d80 20 64 37 0a 20 20 20 20 20 20 20 20 20 4f 52 44   d7.         ORD
11d90 45 52 20 42 59 20 63 0a 20 20 20 20 20 20 7d 20  ER BY c.      } 
11da0 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20  {1 2 3 4 5 6}.  
11db0 33 20 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46  3   { SELECT a F
11dc0 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
11dd0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64   SELECT c FROM d
11de0 36 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  6 UNION ALL SELE
11df0 43 54 20 65 20 46 52 4f 4d 20 64 37 0a 20 20 20  CT e FROM d7.   
11e00 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 65        ORDER BY e
11e10 0a 20 20 20 20 20 20 7d 20 7b 31 20 32 20 33 20  .      } {1 2 3 
11e20 34 20 35 20 36 7d 0a 20 20 34 20 20 20 7b 20 53  4 5 6}.  4   { S
11e30 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20  ELECT a FROM d5 
11e40 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
11e50 20 63 20 46 52 4f 4d 20 64 36 20 55 4e 49 4f 4e   c FROM d6 UNION
11e60 20 41 4c 4c 20 53 45 4c 45 43 54 20 65 20 46 52   ALL SELECT e FR
11e70 4f 4d 20 64 37 0a 20 20 20 20 20 20 20 20 20 4f  OM d7.         O
11e80 52 44 45 52 20 42 59 20 31 0a 20 20 20 20 20 20  RDER BY 1.      
11e90 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
11ea0 0a 20 20 35 20 20 20 7b 20 53 45 4c 45 43 54 20  .  5   { SELECT 
11eb0 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49  a, b FROM d5 UNI
11ec0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c  ON ALL SELECT b,
11ed0 20 61 20 46 52 4f 4d 20 64 35 20 4f 52 44 45 52   a FROM d5 ORDER
11ee0 20 42 59 20 62 20 7d 20 0a 20 20 20 20 20 20 7b   BY b } .      {
11ef0 66 20 31 20 20 20 63 20 34 20 20 20 34 20 63 20  f 1   c 4   4 c 
11f00 20 20 31 20 66 7d 0a 20 20 36 20 20 20 7b 20 53    1 f}.  6   { S
11f10 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
11f20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
11f30 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 64 35  ECT b, a FROM d5
11f40 20 4f 52 44 45 52 20 42 59 20 32 20 7d 20 0a 20   ORDER BY 2 } . 
11f50 20 20 20 20 20 7b 66 20 31 20 20 20 63 20 34 20       {f 1   c 4 
11f60 20 20 34 20 63 20 20 20 31 20 66 7d 0a 0a 20 20    4 c   1 f}..  
11f70 37 20 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20  7   { SELECT a, 
11f80 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20  b FROM d5 UNION 
11f90 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 20  ALL SELECT b, a 
11fa0 46 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59  FROM d5 ORDER BY
11fb0 20 61 20 7d 20 0a 20 20 20 20 20 20 7b 31 20 66   a } .      {1 f
11fc0 20 20 20 34 20 63 20 20 20 63 20 34 20 20 20 66     4 c   c 4   f
11fd0 20 31 7d 0a 20 20 38 20 20 20 7b 20 53 45 4c 45   1}.  8   { SELE
11fe0 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64 35 20  CT a, b FROM d5 
11ff0 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
12000 20 62 2c 20 61 20 46 52 4f 4d 20 64 35 20 4f 52   b, a FROM d5 OR
12010 44 45 52 20 42 59 20 31 20 7d 20 0a 20 20 20 20  DER BY 1 } .    
12020 20 20 7b 31 20 66 20 20 20 34 20 63 20 20 20 63    {1 f   4 c   c
12030 20 34 20 20 20 66 20 31 7d 0a 0a 20 20 39 20 20   4   f 1}..  9  
12040 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46   { SELECT a, b F
12050 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
12060 20 53 45 4c 45 43 54 20 62 2c 20 61 2b 31 20 46   SELECT b, a+1 F
12070 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20  ROM d5 ORDER BY 
12080 61 2b 31 20 7d 20 0a 20 20 20 20 20 20 7b 66 20  a+1 } .      {f 
12090 32 20 20 20 63 20 35 20 20 20 34 20 63 20 20 20  2   c 5   4 c   
120a0 31 20 66 7d 0a 20 20 31 30 20 20 7b 20 53 45 4c  1 f}.  10  { SEL
120b0 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64 35  ECT a, b FROM d5
120c0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
120d0 54 20 62 2c 20 61 2b 31 20 46 52 4f 4d 20 64 35  T b, a+1 FROM d5
120e0 20 4f 52 44 45 52 20 42 59 20 32 20 7d 20 0a 20   ORDER BY 2 } . 
120f0 20 20 20 20 20 7b 66 20 32 20 20 20 63 20 35 20       {f 2   c 5 
12100 20 20 34 20 63 20 20 20 31 20 66 7d 0a 0a 20 20    4 c   1 f}..  
12110 31 31 20 20 7b 20 53 45 4c 45 43 54 20 61 2b 31  11  { SELECT a+1
12120 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f  , b FROM d5 UNIO
12130 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20  N ALL SELECT b, 
12140 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f 52 44 45  a+1 FROM d5 ORDE
12150 52 20 42 59 20 61 2b 31 20 7d 20 0a 20 20 20 20  R BY a+1 } .    
12160 20 20 7b 32 20 66 20 20 20 35 20 63 20 20 20 63    {2 f   5 c   c
12170 20 35 20 20 20 66 20 32 7d 0a 20 20 31 32 20 20   5   f 2}.  12  
12180 7b 20 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 20  { SELECT a+1, b 
12190 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c  FROM d5 UNION AL
121a0 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 2b 31 20  L SELECT b, a+1 
121b0 46 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59  FROM d5 ORDER BY
121c0 20 31 20 7d 20 0a 20 20 20 20 20 20 7b 32 20 66   1 } .      {2 f
121d0 20 20 20 35 20 63 20 20 20 63 20 35 20 20 20 66     5 c   c 5   f
121e0 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e   2}.} ..# EVIDEN
121f0 43 45 2d 4f 46 3a 20 52 2d 33 39 32 36 35 2d 30  CE-OF: R-39265-0
12200 34 30 37 30 20 49 66 20 6e 6f 20 6d 61 74 63 68  4070 If no match
12210 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 63  ing expression c
12220 61 6e 20 62 65 20 66 6f 75 6e 64 20 69 6e 0a 23  an be found in.#
12230 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
12240 6d 6e 73 20 6f 66 20 61 6e 79 20 63 6f 6e 73 74  mns of any const
12250 69 74 75 65 6e 74 20 53 45 4c 45 43 54 2c 20 69  ituent SELECT, i
12260 74 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 23  t is an error..#
12270 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
12280 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 34 20 2d   e_select-8.14 -
12290 65 72 72 6f 72 20 7b 0a 20 20 25 73 20 4f 52 44  error {.  %s ORD
122a0 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
122b0 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  not match any co
122c0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
122d0 6c 74 20 73 65 74 0a 7d 20 7b 0a 20 20 31 20 20  lt set.} {.  1  
122e0 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
122f0 20 64 35 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   d5 UNION SELECT
12300 20 63 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52   c FROM d6 ORDER
12310 20 42 59 20 61 2b 31 20 7d 20 20 20 20 20 20 20   BY a+1 }       
12320 20 20 20 31 73 74 0a 20 20 32 20 20 20 7b 20 53     1st.  2   { S
12330 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 35 20  ELECT a FROM d5 
12340 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
12350 52 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20  ROM d6 ORDER BY 
12360 61 2c 20 61 2b 31 20 7d 20 20 20 20 20 20 20 32  a, a+1 }       2
12370 6e 64 0a 20 20 33 20 20 20 7b 20 53 45 4c 45 43  nd.  3   { SELEC
12380 54 20 2a 20 46 52 4f 4d 20 64 35 20 49 4e 54 45  T * FROM d5 INTE
12390 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46  RSECT SELECT * F
123a0 52 4f 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20  ROM d6 ORDER BY 
123b0 27 68 65 6c 6c 6f 27 20 7d 20 20 31 73 74 0a 20  'hello' }  1st. 
123c0 20 34 20 20 20 7b 20 53 45 4c 45 43 54 20 2a 20   4   { SELECT * 
123d0 46 52 4f 4d 20 64 35 20 49 4e 54 45 52 53 45 43  FROM d5 INTERSEC
123e0 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  T SELECT * FROM 
123f0 64 36 20 4f 52 44 45 52 20 42 59 20 62 6c 61 68  d6 ORDER BY blah
12400 20 20 20 20 7d 20 20 31 73 74 0a 20 20 35 20 20      }  1st.  5  
12410 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
12420 20 64 35 20 49 4e 54 45 52 53 45 43 54 20 53 45   d5 INTERSECT SE
12430 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 36 20 4f  LECT * FROM d6 O
12440 52 44 45 52 20 42 59 20 63 2c 64 2c 63 2b 64 20  RDER BY c,d,c+d 
12450 7d 20 20 33 72 64 0a 20 20 36 20 20 20 7b 20 53  }  3rd.  6   { S
12460 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 35 20  ELECT * FROM d5 
12470 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
12480 46 52 4f 4d 20 64 37 20 4f 52 44 45 52 20 42 59  FROM d7 ORDER BY
12490 20 31 2c 32 2c 62 2c 61 2f 62 20 20 7d 20 20 34   1,2,b,a/b  }  4
124a0 74 68 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43  th.} ..# EVIDENC
124b0 45 2d 4f 46 3a 20 52 2d 30 33 34 30 37 2d 31 31  E-OF: R-03407-11
124c0 34 38 33 20 45 61 63 68 20 74 65 72 6d 20 6f 66  483 Each term of
124d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
124e0 61 75 73 65 20 69 73 0a 23 20 70 72 6f 63 65 73  ause is.# proces
124f0 73 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 61  sed separately a
12500 6e 64 20 6d 61 79 20 62 65 20 6d 61 74 63 68 65  nd may be matche
12510 64 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  d against result
12520 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 23 20   columns from.# 
12530 64 69 66 66 65 72 65 6e 74 20 53 45 4c 45 43 54  different SELECT
12540 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
12550 68 65 20 63 6f 6d 70 6f 75 6e 64 2e 0a 23 20 0a  he compound..# .
12560 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
12570 65 5f 73 65 6c 65 63 74 2d 38 2e 31 35 20 7b 0a  e_select-8.15 {.
12580 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20 61 2c    1  { SELECT a,
12590 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   b FROM d5 UNION
125a0 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 2d 31 2c   ALL SELECT c-1,
125b0 20 64 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52   d FROM d6 ORDER
125c0 20 42 59 20 61 2c 20 64 20 7d 0a 20 20 20 20 20   BY a, d }.     
125d0 7b 31 20 65 20 20 20 31 20 66 20 20 20 34 20 62  {1 e   1 f   4 b
125e0 20 20 20 34 20 63 7d 0a 20 20 32 20 20 7b 20 53     4 c}.  2  { S
125f0 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
12600 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
12610 45 43 54 20 63 2d 31 2c 20 64 20 46 52 4f 4d 20  ECT c-1, d FROM 
12620 64 36 20 4f 52 44 45 52 20 42 59 20 63 2d 31 2c  d6 ORDER BY c-1,
12630 20 62 20 7d 0a 20 20 20 20 20 7b 31 20 65 20 20   b }.     {1 e  
12640 20 31 20 66 20 20 20 34 20 62 20 20 20 34 20 63   1 f   4 b   4 c
12650 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20  }.  3  { SELECT 
12660 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49  a, b FROM d5 UNI
12670 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 2d  ON ALL SELECT c-
12680 31 2c 20 64 20 46 52 4f 4d 20 64 36 20 4f 52 44  1, d FROM d6 ORD
12690 45 52 20 42 59 20 31 2c 20 32 20 7d 0a 20 20 20  ER BY 1, 2 }.   
126a0 20 20 7b 31 20 65 20 20 20 31 20 66 20 20 20 34    {1 e   1 f   4
126b0 20 62 20 20 20 34 20 63 7d 0a 7d 20 0a 0a 0a 23   b   4 c}.} ...#
126c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
12710 73 20 72 65 6c 61 74 65 64 20 74 6f 20 73 74 61  s related to sta
12720 74 65 6d 65 6e 74 73 20 6d 61 64 65 20 61 62 6f  tements made abo
12730 75 74 20 74 68 65 20 4c 49 4d 49 54 2f 4f 46 46  ut the LIMIT/OFF
12740 53 45 54 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f  SET clause..#.do
12750 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
12760 73 65 6c 65 63 74 2d 39 2e 30 20 7b 0a 20 20 43  select-9.0 {.  C
12770 52 45 41 54 45 20 54 41 42 4c 45 20 66 31 28 61  REATE TABLE f1(a
12780 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
12790 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 36  NTO f1 VALUES(26
127a0 2c 20 27 7a 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'z');.  INSERT
127b0 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
127c0 32 35 2c 20 27 79 27 29 3b 0a 20 20 49 4e 53 45  25, 'y');.  INSE
127d0 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
127e0 53 28 32 34 2c 20 27 78 27 29 3b 0a 20 20 49 4e  S(24, 'x');.  IN
127f0 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12800 55 45 53 28 32 33 2c 20 27 77 27 29 3b 0a 20 20  UES(23, 'w');.  
12810 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
12820 41 4c 55 45 53 28 32 32 2c 20 27 76 27 29 3b 0a  ALUES(22, 'v');.
12830 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
12840 20 56 41 4c 55 45 53 28 32 31 2c 20 27 75 27 29   VALUES(21, 'u')
12850 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
12860 66 31 20 56 41 4c 55 45 53 28 32 30 2c 20 27 74  f1 VALUES(20, 't
12870 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12880 4f 20 66 31 20 56 41 4c 55 45 53 28 31 39 2c 20  O f1 VALUES(19, 
12890 27 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  's');.  INSERT I
128a0 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 38  NTO f1 VALUES(18
128b0 2c 20 27 72 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'r');.  INSERT
128c0 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
128d0 31 37 2c 20 27 71 27 29 3b 0a 20 20 49 4e 53 45  17, 'q');.  INSE
128e0 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
128f0 53 28 31 36 2c 20 27 70 27 29 3b 0a 20 20 49 4e  S(16, 'p');.  IN
12900 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12910 55 45 53 28 31 35 2c 20 27 6f 27 29 3b 0a 20 20  UES(15, 'o');.  
12920 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
12930 41 4c 55 45 53 28 31 34 2c 20 27 6e 27 29 3b 0a  ALUES(14, 'n');.
12940 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
12950 20 56 41 4c 55 45 53 28 31 33 2c 20 27 6d 27 29   VALUES(13, 'm')
12960 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
12970 66 31 20 56 41 4c 55 45 53 28 31 32 2c 20 27 6c  f1 VALUES(12, 'l
12980 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12990 4f 20 66 31 20 56 41 4c 55 45 53 28 31 31 2c 20  O f1 VALUES(11, 
129a0 27 6b 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'k');.  INSERT I
129b0 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 30  NTO f1 VALUES(10
129c0 2c 20 27 6a 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'j');.  INSERT
129d0 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
129e0 39 2c 20 27 69 27 29 3b 0a 20 20 49 4e 53 45 52  9, 'i');.  INSER
129f0 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53  T INTO f1 VALUES
12a00 28 38 2c 20 27 68 27 29 3b 0a 20 20 49 4e 53 45  (8, 'h');.  INSE
12a10 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
12a20 53 28 37 2c 20 27 67 27 29 3b 0a 20 20 49 4e 53  S(7, 'g');.  INS
12a30 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55  ERT INTO f1 VALU
12a40 45 53 28 36 2c 20 27 66 27 29 3b 0a 20 20 49 4e  ES(6, 'f');.  IN
12a50 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12a60 55 45 53 28 35 2c 20 27 65 27 29 3b 0a 20 20 49  UES(5, 'e');.  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 34 2c 20 27 64 27 29 3b 0a 20 20  LUES(4, 'd');.  
12a90 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
12aa0 41 4c 55 45 53 28 33 2c 20 27 63 27 29 3b 0a 20  ALUES(3, 'c');. 
12ab0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
12ac0 56 41 4c 55 45 53 28 32 2c 20 27 62 27 29 3b 0a  VALUES(2, 'b');.
12ad0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
12ae0 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27 29 3b   VALUES(1, 'a');
12af0 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  .} {}..# EVIDENC
12b00 45 2d 4f 46 3a 20 52 2d 33 30 34 38 31 2d 35 36  E-OF: R-30481-56
12b10 36 32 37 20 41 6e 79 20 73 63 61 6c 61 72 20 65  627 Any scalar e
12b20 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 62 65  xpression may be
12b30 20 75 73 65 64 20 69 6e 20 74 68 65 0a 23 20 4c   used in the.# L
12b40 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 73 6f 20  IMIT clause, so 
12b50 6c 6f 6e 67 20 61 73 20 69 74 20 65 76 61 6c 75  long as it evalu
12b60 61 74 65 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  ates to an integ
12b70 65 72 20 6f 72 20 61 20 76 61 6c 75 65 20 74 68  er or a value th
12b80 61 74 0a 23 20 63 61 6e 20 62 65 20 6c 6f 73 73  at.# can be loss
12b90 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64  lessly converted
12ba0 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
12bb0 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
12bc0 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 31 20 7b  s e_select-9.1 {
12bd0 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62  .  1  { SELECT b
12be0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
12bf0 59 20 61 20 4c 49 4d 49 54 20 35 20 7d 20 7b 61  Y a LIMIT 5 } {a
12c00 20 62 20 63 20 64 20 65 7d 0a 20 20 32 20 20 7b   b c d e}.  2  {
12c10 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
12c20 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
12c30 49 54 20 32 2b 33 20 7d 20 7b 61 20 62 20 63 20  IT 2+3 } {a b c 
12c40 64 20 65 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45  d e}.  3  { SELE
12c50 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
12c60 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 28 53  ER BY a LIMIT (S
12c70 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20  ELECT a FROM f1 
12c80 57 48 45 52 45 20 62 20 3d 20 27 65 27 29 20 7d  WHERE b = 'e') }
12c90 20 0a 20 20 20 20 20 7b 61 20 62 20 63 20 64 20   .     {a b c d 
12ca0 65 7d 0a 20 20 34 20 20 7b 20 53 45 4c 45 43 54  e}.  4  { SELECT
12cb0 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
12cc0 20 42 59 20 61 20 4c 49 4d 49 54 20 35 2e 30 20   BY a LIMIT 5.0 
12cd0 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20  } {a b c d e}.  
12ce0 35 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  5  { SELECT b FR
12cf0 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
12d00 20 4c 49 4d 49 54 20 27 35 27 20 7d 20 7b 61 20   LIMIT '5' } {a 
12d10 62 20 63 20 64 20 65 7d 0a 7d 0a 0a 23 20 45 56  b c d e}.}..# EV
12d20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 31  IDENCE-OF: R-461
12d30 35 35 2d 34 37 32 31 39 20 49 66 20 74 68 65 20  55-47219 If the 
12d40 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
12d50 61 74 65 73 20 74 6f 20 61 20 4e 55 4c 4c 20 76  ates to a NULL v
12d60 61 6c 75 65 0a 23 20 6f 72 20 61 6e 79 20 6f 74  alue.# or any ot
12d70 68 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 63  her value that c
12d80 61 6e 6e 6f 74 20 62 65 20 6c 6f 73 73 6c 65 73  annot be lossles
12d90 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  sly converted to
12da0 20 61 6e 20 69 6e 74 65 67 65 72 2c 0a 23 20 61   an integer,.# a
12db0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
12dc0 6e 65 64 2e 0a 23 0a 0a 64 6f 5f 73 65 6c 65 63  ned..#..do_selec
12dd0 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
12de0 2d 39 2e 32 20 2d 65 72 72 6f 72 20 22 64 61 74  -9.2 -error "dat
12df0 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 20  atype mismatch" 
12e00 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20  {.  1  { SELECT 
12e10 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
12e20 42 59 20 61 20 4c 49 4d 49 54 20 27 68 65 6c 6c  BY a LIMIT 'hell
12e30 6f 27 20 7d 20 7b 7d 0a 20 20 32 20 20 7b 20 53  o' } {}.  2  { S
12e40 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
12e50 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
12e60 20 4e 55 4c 4c 20 7d 20 7b 7d 0a 20 20 33 20 20   NULL } {}.  3  
12e70 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
12e80 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
12e90 4d 49 54 20 58 27 41 42 43 44 27 20 7d 20 7b 7d  MIT X'ABCD' } {}
12ea0 0a 20 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62  .  4  { SELECT b
12eb0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
12ec0 59 20 61 20 4c 49 4d 49 54 20 35 2e 31 20 7d 20  Y a LIMIT 5.1 } 
12ed0 7b 7d 0a 20 20 35 20 20 7b 20 53 45 4c 45 43 54  {}.  5  { SELECT
12ee0 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
12ef0 20 42 59 20 61 20 4c 49 4d 49 54 20 28 53 45 4c   BY a LIMIT (SEL
12f00 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
12f10 28 62 29 20 46 52 4f 4d 20 66 31 29 20 7d 20 7b  (b) FROM f1) } {
12f20 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45  }.} ..# EVIDENCE
12f30 2d 4f 46 3a 20 52 2d 30 33 30 31 34 2d 32 36 34  -OF: R-03014-264
12f40 31 34 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  14 If the LIMIT 
12f50 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
12f60 61 74 65 73 20 74 6f 20 61 0a 23 20 6e 65 67 61  ates to a.# nega
12f70 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
12f80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 75 70 70   there is no upp
12f90 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
12fa0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 23  number of rows.#
12fb0 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f   returned..#.do_
12fc0 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
12fd0 65 6c 65 63 74 2d 39 2e 34 20 7b 0a 20 20 31 20  elect-9.4 {.  1 
12fe0 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
12ff0 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
13000 49 4d 49 54 20 2d 31 20 7d 20 0a 20 20 20 20 20  IMIT -1 } .     
13010 7b 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68  {a b c d e f g h
13020 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70   i j k l m n o p
13030 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78   q r s t u v w x
13040 20 79 20 7a 7d 0a 20 20 32 20 20 7b 20 53 45 4c   y z}.  2  { SEL
13050 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13060 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 6c  DER BY a LIMIT l
13070 65 6e 67 74 68 28 27 61 62 63 27 29 2d 31 30 30  ength('abc')-100
13080 20 7d 20 0a 20 20 20 20 20 7b 61 20 62 20 63 20   } .     {a b c 
13090 64 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20  d e f g h i j k 
130a0 6c 20 6d 20 6e 20 6f 20 70 20 71 20 72 20 73 20  l m n o p q r s 
130b0 74 20 75 20 76 20 77 20 78 20 79 20 7a 7d 0a 20  t u v w x y z}. 
130c0 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   3  { SELECT b F
130d0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
130e0 61 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20  a LIMIT (SELECT 
130f0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 66 31  count(*) FROM f1
13100 29 2f 32 20 2d 20 31 34 20 7d 0a 20 20 20 20 20  )/2 - 14 }.     
13110 7b 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68  {a b c d e f g h
13120 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70   i j k l m n o p
13130 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78   q r s t u v w x
13140 20 79 20 7a 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   y z}.}..# EVIDE
13150 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 37 35 30 2d  NCE-OF: R-33750-
13160 32 39 35 33 36 20 4f 74 68 65 72 77 69 73 65 2c  29536 Otherwise,
13170 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
13180 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 4e 0a  rns the first N.
13190 23 20 72 6f 77 73 20 6f 66 20 69 74 73 20 72 65  # rows of its re
131a0 73 75 6c 74 20 73 65 74 20 6f 6e 6c 79 2c 20 77  sult set only, w
131b0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 76 61  here N is the va
131c0 6c 75 65 20 74 68 61 74 20 74 68 65 20 4c 49 4d  lue that the LIM
131d0 49 54 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  IT.# expression 
131e0 65 76 61 6c 75 61 74 65 73 20 74 6f 2e 0a 23 0a  evaluates to..#.
131f0 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
13200 65 5f 73 65 6c 65 63 74 2d 39 2e 35 20 7b 0a 20  e_select-9.5 {. 
13210 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   1  { SELECT b F
13220 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13230 61 20 4c 49 4d 49 54 20 30 20 7d 20 7b 7d 0a 20  a LIMIT 0 } {}. 
13240 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   2  { SELECT b F
13250 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13260 61 20 44 45 53 43 20 4c 49 4d 49 54 20 34 20 7d  a DESC LIMIT 4 }
13270 20 7b 7a 20 79 20 78 20 77 7d 0a 20 20 33 20 20   {z y x w}.  3  
13280 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
13290 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 44 45  f1 ORDER BY a DE
132a0 53 43 20 4c 49 4d 49 54 20 38 20 7d 20 7b 7a 20  SC LIMIT 8 } {z 
132b0 79 20 78 20 77 20 76 20 75 20 74 20 73 7d 0a 20  y x w v u t s}. 
132c0 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   4  { SELECT b F
132d0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
132e0 61 20 44 45 53 43 20 4c 49 4d 49 54 20 27 31 32  a DESC LIMIT '12
132f0 2e 30 27 20 7d 20 7b 7a 20 79 20 78 20 77 20 76  .0' } {z y x w v
13300 20 75 20 74 20 73 20 72 20 71 20 70 20 6f 7d 0a   u t s r q p o}.
13310 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
13320 3a 20 52 2d 35 34 39 33 35 2d 31 39 30 35 37 20  : R-54935-19057 
13330 4f 72 2c 20 69 66 20 74 68 65 20 53 45 4c 45 43  Or, if the SELEC
13340 54 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  T statement woul
13350 64 20 72 65 74 75 72 6e 0a 23 20 6c 65 73 73 20  d return.# less 
13360 74 68 61 6e 20 4e 20 72 6f 77 73 20 77 69 74 68  than N rows with
13370 6f 75 74 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  out a LIMIT clau
13380 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  se, then the ent
13390 69 72 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ire result set i
133a0 73 0a 23 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a  s.# returned..#.
133b0 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
133c0 65 5f 73 65 6c 65 63 74 2d 39 2e 36 20 7b 0a 20  e_select-9.6 {. 
133d0 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   1  { SELECT b F
133e0 52 4f 4d 20 66 31 20 57 48 45 52 45 20 61 3e 32  ROM f1 WHERE a>2
133f0 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
13400 49 54 20 31 30 20 7d 20 7b 76 20 77 20 78 20 79  IT 10 } {v w x y
13410 20 7a 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43   z}.  2  { SELEC
13420 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
13430 66 31 20 47 52 4f 55 50 20 42 59 20 61 2f 35 20  f1 GROUP BY a/5 
13440 4f 52 44 45 52 20 42 59 20 31 20 4c 49 4d 49 54  ORDER BY 1 LIMIT
13450 20 31 30 20 7d 20 7b 32 20 34 20 35 20 35 20 35   10 } {2 4 5 5 5
13460 20 35 7d 0a 7d 20 0a 0a 0a 23 20 45 56 49 44 45   5}.} ...# EVIDE
13470 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 31 38 38 2d  NCE-OF: R-24188-
13480 32 34 33 34 39 20 54 68 65 20 65 78 70 72 65 73  24349 The expres
13490 73 69 6f 6e 20 61 74 74 61 63 68 65 64 20 74 6f  sion attached to
134a0 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 23 20   the optional.# 
134b0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 20 74 68  OFFSET clause th
134c0 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 61 20  at may follow a 
134d0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6d 75 73  LIMIT clause mus
134e0 74 20 61 6c 73 6f 20 65 76 61 6c 75 61 74 65 20  t also evaluate 
134f0 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 2c  to an.# integer,
13500 20 6f 72 20 61 20 76 61 6c 75 65 20 74 68 61 74   or a value that
13510 20 63 61 6e 20 62 65 20 6c 6f 73 73 6c 65 73 73   can be lossless
13520 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  ly converted to 
13530 61 6e 20 69 6e 74 65 67 65 72 2e 0a 23 0a 66 6f  an integer..#.fo
13540 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65 63 74  reach {tn select
13550 7d 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43  } {.  1  { SELEC
13560 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13570 52 20 42 59 20 61 20 4c 49 4d 49 54 20 32 20 4f  R BY a LIMIT 2 O
13580 46 46 53 45 54 20 27 68 65 6c 6c 6f 27 20 7d 20  FFSET 'hello' } 
13590 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62  .  2  { SELECT b
135a0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
135b0 59 20 61 20 4c 49 4d 49 54 20 32 20 4f 46 46 53  Y a LIMIT 2 OFFS
135c0 45 54 20 4e 55 4c 4c 20 7d 20 0a 20 20 33 20 20  ET NULL } .  3  
135d0 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
135e0 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
135f0 4d 49 54 20 32 20 4f 46 46 53 45 54 20 58 27 41  MIT 2 OFFSET X'A
13600 42 43 44 27 20 7d 20 0a 20 20 34 20 20 7b 20 53  BCD' } .  4  { S
13610 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13620 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13630 20 32 20 4f 46 46 53 45 54 20 35 2e 31 20 7d 20   2 OFFSET 5.1 } 
13640 0a 20 20 35 20 20 7b 20 53 45 4c 45 43 54 20 62  .  5  { SELECT b
13650 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13660 59 20 61 20 0a 20 20 20 20 20 20 20 4c 49 4d 49  Y a .       LIMI
13670 54 20 32 20 4f 46 46 53 45 54 20 28 53 45 4c 45  T 2 OFFSET (SELE
13680 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
13690 62 29 20 46 52 4f 4d 20 66 31 29 20 0a 20 20 7d  b) FROM f1) .  }
136a0 20 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68   .} {.  do_catch
136b0 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
136c0 74 2d 39 2e 37 2e 24 74 6e 20 24 73 65 6c 65 63  t-9.7.$tn $selec
136d0 74 20 7b 31 20 7b 64 61 74 61 74 79 70 65 20 6d  t {1 {datatype m
136e0 69 73 6d 61 74 63 68 7d 7d 0a 7d 0a 0a 23 20 45  ismatch}}.}..# E
136f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30  VIDENCE-OF: R-20
13700 34 36 37 2d 34 33 34 32 32 20 49 66 20 61 6e 20  467-43422 If an 
13710 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
13720 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 2c  n OFFSET clause,
13730 20 74 68 65 6e 0a 23 20 74 68 65 20 66 69 72 73   then.# the firs
13740 74 20 4d 20 72 6f 77 73 20 61 72 65 20 6f 6d 69  t M rows are omi
13750 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  tted from the re
13760 73 75 6c 74 20 73 65 74 20 72 65 74 75 72 6e 65  sult set returne
13770 64 20 62 79 20 74 68 65 0a 23 20 53 45 4c 45 43  d by the.# SELEC
13780 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
13790 74 68 65 20 6e 65 78 74 20 4e 20 72 6f 77 73 20  the next N rows 
137a0 61 72 65 20 72 65 74 75 72 6e 65 64 2c 20 77 68  are returned, wh
137b0 65 72 65 20 4d 20 61 6e 64 20 4e 20 61 72 65 0a  ere M and N are.
137c0 23 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  # the values tha
137d0 74 20 74 68 65 20 4f 46 46 53 45 54 20 61 6e 64  t the OFFSET and
137e0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 20 65   LIMIT clauses e
137f0 76 61 6c 75 61 74 65 20 74 6f 2c 0a 23 20 72 65  valuate to,.# re
13800 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a 64 6f  spectively..#.do
13810 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
13820 73 65 6c 65 63 74 2d 39 2e 38 20 7b 0a 20 20 31  select-9.8 {.  1
13830 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13840 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13850 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
13860 35 7d 20 7b 66 20 67 20 68 20 69 20 6a 20 6b 20  5} {f g h i j k 
13870 6c 20 6d 20 6e 20 6f 7d 0a 20 20 32 20 20 7b 20  l m n o}.  2  { 
13880 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
13890 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
138a0 54 20 32 2b 33 20 4f 46 46 53 45 54 20 31 30 7d  T 2+3 OFFSET 10}
138b0 20 7b 6b 20 6c 20 6d 20 6e 20 6f 7d 0a 20 20 33   {k l m n o}.  3
138c0 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
138d0 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
138e0 0a 20 20 20 20 20 20 20 4c 49 4d 49 54 20 20 28  .       LIMIT  (
138f0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31  SELECT a FROM f1
13900 20 57 48 45 52 45 20 62 3d 27 6a 27 29 20 0a 20   WHERE b='j') . 
13910 20 20 20 20 20 20 4f 46 46 53 45 54 20 28 53 45        OFFSET (SE
13920 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20 57  LECT a FROM f1 W
13930 48 45 52 45 20 62 3d 27 62 27 29 20 0a 20 20 20  HERE b='b') .   
13940 20 20 7d 20 7b 63 20 64 20 65 20 66 20 67 20 68    } {c d e f g h
13950 20 69 20 6a 20 6b 20 6c 7d 0a 20 20 34 20 20 7b   i j k l}.  4  {
13960 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13970 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
13980 49 54 20 27 35 27 20 4f 46 46 53 45 54 20 33 2e  IT '5' OFFSET 3.
13990 30 20 7d 20 7b 64 20 65 20 66 20 67 20 68 7d 0a  0 } {d e f g h}.
139a0 20 20 35 20 20 7b 20 53 45 4c 45 43 54 20 62 20    5  { SELECT b 
139b0 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59  FROM f1 ORDER BY
139c0 20 61 20 4c 49 4d 49 54 20 27 35 27 20 4f 46 46   a LIMIT '5' OFF
139d0 53 45 54 20 30 20 7d 20 7b 61 20 62 20 63 20 64  SET 0 } {a b c d
139e0 20 65 7d 0a 20 20 36 20 20 7b 20 53 45 4c 45 43   e}.  6  { SELEC
139f0 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13a00 52 20 42 59 20 61 20 4c 49 4d 49 54 20 30 20 4f  R BY a LIMIT 0 O
13a10 46 46 53 45 54 20 31 30 20 7d 20 7b 7d 0a 20 20  FFSET 10 } {}.  
13a20 37 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  7  { SELECT b FR
13a30 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
13a40 20 4c 49 4d 49 54 20 33 20 4f 46 46 53 45 54 20   LIMIT 3 OFFSET 
13a50 27 31 27 7c 7c 27 35 27 20 7d 20 7b 70 20 71 20  '1'||'5' } {p q 
13a60 72 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  r}.}..# EVIDENCE
13a70 2d 4f 46 3a 20 52 2d 33 34 36 34 38 2d 34 34 38  -OF: R-34648-448
13a80 37 35 20 4f 72 2c 20 69 66 20 74 68 65 20 53 45  75 Or, if the SE
13a90 4c 45 43 54 20 77 6f 75 6c 64 20 72 65 74 75 72  LECT would retur
13aa0 6e 20 6c 65 73 73 20 74 68 61 6e 0a 23 20 4d 2b  n less than.# M+
13ab0 4e 20 72 6f 77 73 20 69 66 20 69 74 20 64 69 64  N rows if it did
13ac0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
13ad0 54 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  T clause, then t
13ae0 68 65 20 66 69 72 73 74 20 4d 20 72 6f 77 73 20  he first M rows 
13af0 61 72 65 0a 23 20 73 6b 69 70 70 65 64 20 61 6e  are.# skipped an
13b00 64 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  d the remaining 
13b10 72 6f 77 73 20 28 69 66 20 61 6e 79 29 20 61 72  rows (if any) ar
13b20 65 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f  e returned..#.do
13b30 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
13b40 73 65 6c 65 63 74 2d 39 2e 39 20 7b 0a 20 20 31  select-9.9 {.  1
13b50 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13b60 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13b70 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
13b80 32 30 7d 20 7b 75 20 76 20 77 20 78 20 79 20 7a  20} {u v w x y z
13b90 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20  }.  2  { SELECT 
13ba0 61 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  a FROM f1 ORDER 
13bb0 42 59 20 61 20 44 45 53 43 20 4c 49 4d 49 54 20  BY a DESC LIMIT 
13bc0 31 30 30 20 4f 46 46 53 45 54 20 31 38 2b 34 7d  100 OFFSET 18+4}
13bd0 20 7b 34 20 33 20 32 20 31 7d 0a 7d 0a 0a 0a 23   {4 3 2 1}.}...#
13be0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13bf0 32 33 32 39 33 2d 36 32 34 34 37 20 49 66 20 74  23293-62447 If t
13c00 68 65 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  he OFFSET clause
13c10 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 0a   evaluates to a.
13c20 23 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  # negative value
13c30 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  , the results ar
13c40 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66  e the same as if
13c50 20 69 74 20 68 61 64 20 65 76 61 6c 75 61 74 65   it had evaluate
13c60 64 20 74 6f 0a 23 20 7a 65 72 6f 2e 0a 23 0a 64  d to.# zero..#.d
13c70 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
13c80 5f 73 65 6c 65 63 74 2d 39 2e 31 30 20 7b 0a 20  _select-9.10 {. 
13c90 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   1  { SELECT b F
13ca0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13cb0 61 20 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54  a LIMIT 5 OFFSET
13cc0 20 2d 31 20 7d 20 7b 61 20 62 20 63 20 64 20 65   -1 } {a b c d e
13cd0 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20  }.  2  { SELECT 
13ce0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
13cf0 42 59 20 61 20 4c 49 4d 49 54 20 35 20 4f 46 46  BY a LIMIT 5 OFF
13d00 53 45 54 20 2d 35 30 30 20 7d 20 7b 61 20 62 20  SET -500 } {a b 
13d10 63 20 64 20 65 7d 0a 20 20 33 20 20 7b 20 53 45  c d e}.  3  { SE
13d20 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
13d30 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
13d40 35 20 4f 46 46 53 45 54 20 30 20 20 7d 20 7b 61  5 OFFSET 0  } {a
13d50 20 62 20 63 20 64 20 65 7d 0a 7d 20 0a 0a 23 20   b c d e}.} ..# 
13d60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
13d70 39 35 30 39 2d 34 30 33 35 36 20 49 6e 73 74 65  9509-40356 Inste
13d80 61 64 20 6f 66 20 61 20 73 65 70 61 72 61 74 65  ad of a separate
13d90 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 2c 20   OFFSET clause, 
13da0 74 68 65 0a 23 20 4c 49 4d 49 54 20 63 6c 61 75  the.# LIMIT clau
13db0 73 65 20 6d 61 79 20 73 70 65 63 69 66 79 20 74  se may specify t
13dc0 77 6f 20 73 63 61 6c 61 72 20 65 78 70 72 65 73  wo scalar expres
13dd0 73 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20  sions separated 
13de0 62 79 20 61 20 63 6f 6d 6d 61 2e 0a 23 0a 23 20  by a comma..#.# 
13df0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
13e00 33 37 38 38 2d 34 36 32 34 33 20 49 6e 20 74 68  3788-46243 In th
13e10 69 73 20 63 61 73 65 2c 20 74 68 65 20 66 69 72  is case, the fir
13e20 73 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  st expression is
13e30 20 75 73 65 64 0a 23 20 61 73 20 74 68 65 20 4f   used.# as the O
13e40 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e  FFSET expression
13e50 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
13e60 61 73 20 74 68 65 20 4c 49 4d 49 54 20 65 78 70  as the LIMIT exp
13e70 72 65 73 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 73 65  ression..#.do_se
13e80 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
13e90 65 63 74 2d 39 2e 31 31 20 7b 0a 20 20 31 20 20  ect-9.11 {.  1  
13ea0 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
13eb0 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
13ec0 4d 49 54 20 35 2c 20 31 30 20 7d 20 7b 66 20 67  MIT 5, 10 } {f g
13ed0 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f   h i j k l m n o
13ee0 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20  }.  2  { SELECT 
13ef0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
13f00 42 59 20 61 20 4c 49 4d 49 54 20 31 30 2c 20 32  BY a LIMIT 10, 2
13f10 2b 33 20 7d 20 7b 6b 20 6c 20 6d 20 6e 20 6f 7d  +3 } {k l m n o}
13f20 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62  .  3  { SELECT b
13f30 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13f40 59 20 61 20 0a 20 20 20 20 20 20 20 4c 49 4d 49  Y a .       LIMI
13f50 54 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  T (SELECT a FROM
13f60 20 66 31 20 57 48 45 52 45 20 62 3d 27 62 27 29   f1 WHERE b='b')
13f70 2c 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  , (SELECT a FROM
13f80 20 66 31 20 57 48 45 52 45 20 62 3d 27 6a 27 29   f1 WHERE b='j')
13f90 20 0a 20 20 20 20 20 7d 20 7b 63 20 64 20 65 20   .     } {c d e 
13fa0 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 7d 0a 20  f g h i j k l}. 
13fb0 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   4  { SELECT b F
13fc0 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13fd0 61 20 4c 49 4d 49 54 20 33 2e 30 2c 20 27 35 27  a LIMIT 3.0, '5'
13fe0 20 7d 20 7b 64 20 65 20 66 20 67 20 68 7d 0a 20   } {d e f g h}. 
13ff0 20 35 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   5  { SELECT b F
14000 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
14010 61 20 4c 49 4d 49 54 20 30 2c 20 27 35 27 20 7d  a LIMIT 0, '5' }
14020 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20 36   {a b c d e}.  6
14030 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
14040 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
14050 4c 49 4d 49 54 20 31 30 2c 20 30 20 7d 20 7b 7d  LIMIT 10, 0 } {}
14060 0a 20 20 37 20 20 7b 20 53 45 4c 45 43 54 20 62  .  7  { SELECT b
14070 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
14080 59 20 61 20 4c 49 4d 49 54 20 27 31 27 7c 7c 27  Y a LIMIT '1'||'
14090 35 27 2c 20 33 20 7d 20 7b 70 20 71 20 72 7d 0a  5', 3 } {p q r}.
140a0 0a 20 20 38 20 20 7b 20 53 45 4c 45 43 54 20 62  .  8  { SELECT b
140b0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
140c0 59 20 61 20 4c 49 4d 49 54 20 32 30 2c 20 31 30  Y a LIMIT 20, 10
140d0 20 7d 20 7b 75 20 76 20 77 20 78 20 79 20 7a 7d   } {u v w x y z}
140e0 0a 20 20 39 20 20 7b 20 53 45 4c 45 43 54 20 61  .  9  { SELECT a
140f0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
14100 59 20 61 20 44 45 53 43 20 4c 49 4d 49 54 20 31  Y a DESC LIMIT 1
14110 38 2b 34 2c 20 31 30 30 20 7d 20 7b 34 20 33 20  8+4, 100 } {4 3 
14120 32 20 31 7d 0a 0a 20 20 31 30 20 7b 20 53 45 4c  2 1}..  10 { SEL
14130 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
14140 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 2d  DER BY a LIMIT -
14150 31 2c 20 35 20 7d 20 7b 61 20 62 20 63 20 64 20  1, 5 } {a b c d 
14160 65 7d 0a 20 20 31 31 20 7b 20 53 45 4c 45 43 54  e}.  11 { SELECT
14170 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
14180 20 42 59 20 61 20 4c 49 4d 49 54 20 2d 35 30 30   BY a LIMIT -500
14190 2c 20 35 20 7d 20 7b 61 20 62 20 63 20 64 20 65  , 5 } {a b c d e
141a0 7d 0a 20 20 31 32 20 7b 20 53 45 4c 45 43 54 20  }.  12 { SELECT 
141b0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
141c0 42 59 20 61 20 4c 49 4d 49 54 20 30 2c 20 35 20  BY a LIMIT 0, 5 
141d0 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 7d 0a  } {a b c d e}.}.
141e0 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.