/ Hex Artifact Content
Login

Artifact 8d7fac7a268eaeb80b9a7ba7964505b9d30f5458:


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 64  ir/tester.tcl..d
0220: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
0230: 5f 73 65 6c 65 63 74 2d 31 2e 30 20 7b 0a 20 20  _select-1.0 {.  
0240: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0250: 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  a, b);.  INSERT 
0260: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
0270: 61 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e  a', 'one');.  IN
0280: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0290: 55 45 53 28 27 62 27 2c 20 27 74 77 6f 27 29 3b  UES('b', 'two');
02a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
02b0: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 74  1 VALUES('c', 't
02c0: 68 72 65 65 27 29 3b 0a 0a 20 20 43 52 45 41 54  hree');..  CREAT
02d0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
02e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
02f0: 74 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t2 VALUES('a', '
0300: 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  I');.  INSERT IN
0310: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62 27  TO t2 VALUES('b'
0320: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
0330: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0340: 28 27 63 27 2c 20 27 49 49 49 27 29 3b 0a 0a 20  ('c', 'III');.. 
0350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
0360: 28 61 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54  (a, c);.  INSERT
0370: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
0380: 27 61 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  'a', 1);.  INSER
0390: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
03a0: 28 27 62 27 2c 20 32 29 3b 0a 0a 20 20 43 52 45  ('b', 2);..  CRE
03b0: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20  ATE TABLE t4(a, 
03c0: 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  c);.  INSERT INT
03d0: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 27 2c  O t4 VALUES('a',
03e0: 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54   NULL);.  INSERT
03f0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
0400: 27 62 27 2c 20 32 29 3b 0a 7d 20 7b 7d 0a 73 65  'b', 2);.} {}.se
0410: 74 20 74 31 5f 63 72 6f 73 73 5f 74 32 20 5b 6c  t t1_cross_t2 [l
0420: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
0430: 20 20 20 5c 0a 20 20 20 61 20 6f 6e 65 20 20 20     \.   a one   
0440: 61 20 49 20 20 20 20 20 20 61 20 6f 6e 65 20 20  a I      a one  
0450: 20 62 20 49 49 20 20 20 20 20 5c 0a 20 20 20 61   b II     \.   a
0460: 20 6f 6e 65 20 20 20 63 20 49 49 49 20 20 20 20   one   c III    
0470: 62 20 74 77 6f 20 20 20 61 20 49 20 20 20 20 20  b two   a I     
0480: 20 5c 0a 20 20 20 62 20 74 77 6f 20 20 20 62 20   \.   b two   b 
0490: 49 49 20 20 20 20 20 62 20 74 77 6f 20 20 20 63  II     b two   c
04a0: 20 49 49 49 20 20 20 20 5c 0a 20 20 20 63 20 74   III    \.   c t
04b0: 68 72 65 65 20 61 20 49 20 20 20 20 20 20 63 20  hree a I      c 
04c0: 74 68 72 65 65 20 62 20 49 49 20 20 20 20 20 5c  three b II     \
04d0: 0a 20 20 20 63 20 74 68 72 65 65 20 63 20 49 49  .   c three c II
04e0: 49 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  I               
04f0: 20 20 20 20 20 20 5c 0a 5d 0a 73 65 74 20 74 31        \.].set t1
0500: 5f 63 72 6f 73 73 5f 74 31 20 5b 6c 69 73 74 20  _cross_t1 [list 
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0520: 20 5c 0a 20 20 20 61 20 6f 6e 65 20 20 20 61 20   \.   a one   a 
0530: 6f 6e 65 20 20 20 20 20 20 61 20 6f 6e 65 20 20  one      a one  
0540: 20 62 20 74 77 6f 20 20 20 20 5c 0a 20 20 20 61   b two    \.   a
0550: 20 6f 6e 65 20 20 20 63 20 74 68 72 65 65 20 20   one   c three  
0560: 20 20 62 20 74 77 6f 20 20 20 61 20 6f 6e 65 20    b two   a one 
0570: 20 20 20 5c 0a 20 20 20 62 20 74 77 6f 20 20 20     \.   b two   
0580: 62 20 74 77 6f 20 20 20 20 20 20 62 20 74 77 6f  b two      b two
0590: 20 20 20 63 20 74 68 72 65 65 20 20 5c 0a 20 20     c three  \.  
05a0: 20 63 20 74 68 72 65 65 20 61 20 6f 6e 65 20 20   c three a one  
05b0: 20 20 20 20 63 20 74 68 72 65 65 20 62 20 74 77      c three b tw
05c0: 6f 20 20 20 20 5c 0a 20 20 20 63 20 74 68 72 65  o    \.   c thre
05d0: 65 20 63 20 74 68 72 65 65 20 20 20 20 20 20 20  e c three       
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
05f0: 5d 0a 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 20  ]...# This proc 
0600: 69 73 20 61 20 73 70 65 63 69 61 6c 69 7a 65 64  is a specialized
0610: 20 76 65 72 73 69 6f 6e 20 6f 66 20 5b 64 6f 5f   version of [do_
0620: 65 78 65 63 73 71 6c 5f 74 65 73 74 5d 2e 0a 23  execsql_test]..#
0630: 0a 23 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  .# The second ar
0640: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 70  gument to this p
0650: 72 6f 63 20 6d 75 73 74 20 62 65 20 61 20 53 45  roc must be a SE
0660: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
0670: 68 61 74 20 0a 23 20 66 65 61 74 75 72 65 73 20  hat .# features 
0680: 61 20 63 72 6f 73 73 20 6a 6f 69 6e 20 6f 66 20  a cross join of 
0690: 73 6f 6d 65 20 74 69 6d 65 2e 20 49 6e 73 74 65  some time. Inste
06a0: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  ad of the usual 
06b0: 22 2c 22 2c 20 0a 23 20 22 43 52 4f 53 53 20 4a  ",", .# "CROSS J
06c0: 4f 49 4e 22 20 6f 72 20 22 49 4e 4e 45 52 20 4a  OIN" or "INNER J
06d0: 4f 49 4e 22 20 6a 6f 69 6e 2d 6f 70 2c 20 74 68  OIN" join-op, th
06e0: 65 20 73 74 72 69 6e 67 20 25 4a 4f 49 4e 25 20  e string %JOIN% 
06f0: 6d 75 73 74 20 62 65 20 0a 23 20 73 75 62 73 74  must be .# subst
0700: 69 74 75 74 65 64 2e 0a 23 0a 23 20 54 68 69 73  ituted..#.# This
0710: 20 74 65 73 74 20 72 75 6e 73 20 74 68 65 20 53   test runs the S
0720: 45 4c 45 43 54 20 74 68 72 65 65 20 74 69 6d 65  ELECT three time
0730: 73 20 2d 20 6f 6e 63 65 20 77 69 74 68 3a 0a 23  s - once with:.#
0740: 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e 25 2f  .#   * s/%JOIN%/
0750: 2c 2f 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e  ,/.#   * s/%JOIN
0760: 25 2f 4a 4f 49 4e 2f 0a 23 20 20 20 2a 20 73 2f  %/JOIN/.#   * s/
0770: 25 4a 4f 49 4e 25 2f 49 4e 4e 45 52 20 4a 4f 49  %JOIN%/INNER JOI
0780: 4e 2f 0a 23 20 20 20 2a 20 73 2f 25 4a 4f 49 4e  N/.#   * s/%JOIN
0790: 25 2f 43 52 4f 53 53 20 4a 4f 49 4e 2f 0a 23 0a  %/CROSS JOIN/.#.
07a0: 23 20 61 6e 64 20 63 68 65 63 6b 73 20 74 68 61  # and checks tha
07b0: 74 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  t each time the 
07c0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
07d0: 45 4c 45 43 54 20 61 72 65 20 24 72 65 73 2e 0a  ELECT are $res..
07e0: 23 0a 70 72 6f 63 20 64 6f 5f 6a 6f 69 6e 5f 74  #.proc do_join_t
07f0: 65 73 74 20 7b 74 6e 20 73 65 6c 65 63 74 20 72  est {tn select r
0800: 65 73 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20  es} {.  foreach 
0810: 7b 74 6e 32 20 6a 6f 69 6e 6f 70 7d 20 5b 6c 69  {tn2 joinop} [li
0820: 73 74 20 20 20 20 31 20 2c 20 20 20 20 32 20 22  st    1 ,    2 "
0830: 43 52 4f 53 53 20 4a 4f 49 4e 22 20 20 20 20 33  CROSS JOIN"    3
0840: 20 22 49 4e 4e 45 52 20 4a 4f 49 4e 22 5d 20 7b   "INNER JOIN"] {
0850: 0a 20 20 20 20 73 65 74 20 53 20 5b 73 74 72 69  .    set S [stri
0860: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 4a 4f  ng map [list %JO
0870: 49 4e 25 20 24 6a 6f 69 6e 6f 70 5d 20 24 73 65  IN% $joinop] $se
0880: 6c 65 63 74 5d 0a 20 20 20 20 75 70 6c 65 76 65  lect].    upleve
0890: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
08a0: 74 20 24 74 6e 2e 24 74 6e 32 20 5b 6c 69 73 74  t $tn.$tn2 [list
08b0: 20 24 53 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d   $S] [list $res]
08c0: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
0920: 6e 67 20 74 65 73 74 73 20 63 68 65 63 6b 20 74  ng tests check t
0930: 68 61 74 20 61 6c 6c 20 70 61 74 68 73 20 6f 6e  hat all paths on
0940: 20 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67   the syntax diag
0950: 72 61 6d 73 20 6f 6e 0a 23 20 74 68 65 20 6c 61  rams on.# the la
0960: 6e 67 5f 73 65 6c 65 63 74 2e 68 74 6d 6c 20 70  ng_select.html p
0970: 61 67 65 20 6d 61 79 20 62 65 20 74 61 6b 65 6e  age may be taken
0980: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
0990: 46 3a 20 52 2d 31 38 34 32 38 2d 32 32 31 31 31  F: R-18428-22111
09a0: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
09b0: 61 6d 20 6a 6f 69 6e 2d 63 6f 6e 73 74 72 61 69  am join-constrai
09c0: 6e 74 0a 23 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73  nt.#.do_join_tes
09d0: 74 20 65 5f 73 65 6c 65 63 74 2d 30 2e 31 2e 31  t e_select-0.1.1
09e0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e   {.  SELECT coun
09f0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 25 4a 4f  t(*) FROM t1 %JO
0a00: 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d  IN% t2 ON (t1.a=
0a10: 74 32 2e 61 29 0a 7d 20 7b 33 7d 0a 64 6f 5f 6a  t2.a).} {3}.do_j
0a20: 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  oin_test e_selec
0a30: 74 2d 30 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45  t-0.1.2 {.  SELE
0a40: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0a50: 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 55 53   t1 %JOIN% t2 US
0a60: 49 4e 47 20 28 61 29 0a 7d 20 7b 33 7d 0a 64 6f  ING (a).} {3}.do
0a70: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
0a80: 65 63 74 2d 30 2e 31 2e 33 20 7b 0a 20 20 53 45  ect-0.1.3 {.  SE
0a90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
0aa0: 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 0a  OM t1 %JOIN% t2.
0ab0: 7d 20 7b 39 7d 0a 64 6f 5f 63 61 74 63 68 73 71  } {9}.do_catchsq
0ac0: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
0ad0: 30 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  0.1.4 {.  SELECT
0ae0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0af0: 31 2c 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d 74  1, t2 ON (t1.a=t
0b00: 32 2e 61 29 20 55 53 49 4e 47 20 28 61 29 0a 7d  2.a) USING (a).}
0b10: 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 68 61 76 65   {1 {cannot have
0b20: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
0b30: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
0b40: 65 20 73 61 6d 65 20 6a 6f 69 6e 7d 7d 0a 64 6f  e same join}}.do
0b50: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
0b60: 5f 73 65 6c 65 63 74 2d 30 2e 31 2e 35 20 7b 0a  _select-0.1.5 {.
0b70: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
0b80: 29 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 55 53  ) FROM t1, t2 US
0b90: 49 4e 47 20 28 61 29 20 4f 4e 20 28 74 31 2e 61  ING (a) ON (t1.a
0ba0: 3d 74 32 2e 61 29 0a 7d 20 7b 31 20 7b 6e 65 61  =t2.a).} {1 {nea
0bb0: 72 20 22 4f 4e 22 3a 20 73 79 6e 74 61 78 20 65  r "ON": syntax e
0bc0: 72 72 6f 72 7d 7d 0a 0a 23 20 45 56 49 44 45 4e  rror}}..# EVIDEN
0bd0: 43 45 2d 4f 46 3a 20 52 2d 34 34 38 35 34 2d 31  CE-OF: R-44854-1
0be0: 31 37 33 39 20 2d 2d 20 73 79 6e 74 61 78 20 64  1739 -- syntax d
0bf0: 69 61 67 72 61 6d 20 73 65 6c 65 63 74 2d 63 6f  iagram select-co
0c00: 72 65 0a 23 0a 23 20 20 20 30 3a 20 53 45 4c 45  re.#.#   0: SELE
0c10: 43 54 20 2e 2e 2e 0a 23 20 20 20 31 3a 20 53 45  CT ....#   1: SE
0c20: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 2e 2e  LECT DISTINCT ..
0c30: 2e 0a 23 20 20 20 32 3a 20 53 45 4c 45 43 54 20  ..#   2: SELECT 
0c40: 41 4c 4c 20 2e 2e 2e 0a 23 0a 23 20 20 20 30 3a  ALL ....#.#   0:
0c50: 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
0c60: 23 20 20 20 31 3a 20 48 61 73 20 46 52 4f 4d 20  #   1: Has FROM 
0c70: 63 6c 61 75 73 65 0a 23 0a 23 20 20 20 30 3a 20  clause.#.#   0: 
0c80: 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  No WHERE clause.
0c90: 23 20 20 20 31 3a 20 48 61 73 20 57 48 45 52 45  #   1: Has WHERE
0ca0: 20 63 6c 61 75 73 65 0a 23 0a 23 20 20 20 30 3a   clause.#.#   0:
0cb0: 20 4e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   No GROUP BY cla
0cc0: 75 73 65 0a 23 20 20 20 31 3a 20 48 61 73 20 47  use.#   1: Has G
0cd0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 23  ROUP BY clause.#
0ce0: 20 20 20 32 3a 20 48 61 73 20 47 52 4f 55 50 20     2: Has GROUP 
0cf0: 42 59 20 61 6e 64 20 48 41 56 49 4e 47 20 63 6c  BY and HAVING cl
0d00: 61 75 73 65 73 0a 23 0a 64 6f 5f 73 65 6c 65 63  auses.#.do_selec
0d10: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
0d20: 2d 30 2e 32 20 7b 0a 20 20 30 30 30 30 2e 31 20  -0.2 {.  0000.1 
0d30: 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33   "SELECT 1, 2, 3
0d40: 20 22 20 7b 31 20 32 20 33 7d 0a 20 20 31 30 30   " {1 2 3}.  100
0d50: 30 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  0.1  "SELECT DIS
0d60: 54 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 22 20  TINCT 1, 2, 3 " 
0d70: 7b 31 20 32 20 33 7d 0a 20 20 32 30 30 30 2e 31  {1 2 3}.  2000.1
0d80: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c    "SELECT ALL 1,
0d90: 20 32 2c 20 33 20 22 20 7b 31 20 32 20 33 7d 0a   2, 3 " {1 2 3}.
0da0: 20 20 0a 20 20 30 31 30 30 2e 31 20 20 22 53 45    .  0100.1  "SE
0db0: 4c 45 43 54 20 61 2c 20 62 2c 20 61 7c 7c 62 20  LECT a, b, a||b 
0dc0: 46 52 4f 4d 20 74 31 20 22 20 7b 0a 20 20 20 20  FROM t1 " {.    
0dd0: 61 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74 77 6f  a one aone b two
0de0: 20 62 74 77 6f 20 63 20 74 68 72 65 65 20 63 74   btwo c three ct
0df0: 68 72 65 65 0a 20 20 7d 0a 20 20 31 31 30 30 2e  hree.  }.  1100.
0e00: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
0e10: 4e 43 54 20 61 2c 20 62 2c 20 61 7c 7c 62 20 46  NCT a, b, a||b F
0e20: 52 4f 4d 20 74 31 20 22 20 7b 0a 20 20 20 20 61  ROM t1 " {.    a
0e30: 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74 77 6f 20   one aone b two 
0e40: 62 74 77 6f 20 63 20 74 68 72 65 65 20 63 74 68  btwo c three cth
0e50: 72 65 65 0a 20 20 7d 0a 20 20 31 32 30 30 2e 31  ree.  }.  1200.1
0e60: 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 61 2c    "SELECT ALL a,
0e70: 20 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31   b, a||b FROM t1
0e80: 20 22 20 7b 0a 20 20 20 20 61 20 6f 6e 65 20 61   " {.    a one a
0e90: 6f 6e 65 20 62 20 74 77 6f 20 62 74 77 6f 20 63  one b two btwo c
0ea0: 20 74 68 72 65 65 20 63 74 68 72 65 65 0a 20 20   three cthree.  
0eb0: 7d 0a 0a 20 20 30 30 31 30 2e 31 20 20 22 53 45  }..  0010.1  "SE
0ec0: 4c 45 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45  LECT 1, 2, 3 WHE
0ed0: 52 45 20 31 20 22 20 7b 31 20 32 20 33 7d 0a 20  RE 1 " {1 2 3}. 
0ee0: 20 30 30 31 30 2e 32 20 20 22 53 45 4c 45 43 54   0010.2  "SELECT
0ef0: 20 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20 30   1, 2, 3 WHERE 0
0f00: 20 22 20 7b 7d 0a 20 20 30 30 31 30 2e 33 20 20   " {}.  0010.3  
0f10: 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 20  "SELECT 1, 2, 3 
0f20: 57 48 45 52 45 20 4e 55 4c 4c 20 22 20 7b 7d 0a  WHERE NULL " {}.
0f30: 0a 20 20 31 30 31 30 2e 31 20 20 22 53 45 4c 45  .  1010.1  "SELE
0f40: 43 54 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32  CT DISTINCT 1, 2
0f50: 2c 20 33 20 57 48 45 52 45 20 31 20 22 20 7b 31  , 3 WHERE 1 " {1
0f60: 20 32 20 33 7d 0a 0a 20 20 32 30 31 30 2e 31 20   2 3}..  2010.1 
0f70: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20   "SELECT ALL 1, 
0f80: 32 2c 20 33 20 57 48 45 52 45 20 31 20 22 20 7b  2, 3 WHERE 1 " {
0f90: 31 20 32 20 33 7d 0a 0a 20 20 30 31 31 30 2e 31  1 2 3}..  0110.1
0fa0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 2c 20    "SELECT a, b, 
0fb0: 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a||b FROM t1 WHE
0fc0: 52 45 20 61 21 3d 27 78 27 20 22 20 7b 0a 20 20  RE a!='x' " {.  
0fd0: 20 20 61 20 6f 6e 65 20 61 6f 6e 65 20 62 20 74    a one aone b t
0fe0: 77 6f 20 62 74 77 6f 20 63 20 74 68 72 65 65 20  wo btwo c three 
0ff0: 63 74 68 72 65 65 0a 20 20 7d 0a 20 20 30 31 31  cthree.  }.  011
1000: 30 2e 32 20 20 22 53 45 4c 45 43 54 20 61 2c 20  0.2  "SELECT a, 
1010: 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20  b, a||b FROM t1 
1020: 57 48 45 52 45 20 61 3d 3d 27 78 27 22 20 7b 7d  WHERE a=='x'" {}
1030: 0a 0a 20 20 31 31 31 30 2e 31 20 20 22 53 45 4c  ..  1110.1  "SEL
1040: 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c 20  ECT DISTINCT a, 
1050: 62 2c 20 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20  b, a||b FROM t1 
1060: 57 48 45 52 45 20 61 21 3d 27 78 27 20 22 20 7b  WHERE a!='x' " {
1070: 0a 20 20 20 20 61 20 6f 6e 65 20 61 6f 6e 65 20  .    a one aone 
1080: 62 20 74 77 6f 20 62 74 77 6f 20 63 20 74 68 72  b two btwo c thr
1090: 65 65 20 63 74 68 72 65 65 0a 20 20 7d 0a 0a 20  ee cthree.  }.. 
10a0: 20 32 31 31 30 2e 30 20 20 22 53 45 4c 45 43 54   2110.0  "SELECT
10b0: 20 41 4c 4c 20 61 2c 20 62 2c 20 61 7c 7c 62 20   ALL a, b, a||b 
10c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
10d0: 3d 27 78 27 22 20 7b 7d 0a 0a 20 20 30 30 30 31  ='x'" {}..  0001
10e0: 2e 31 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32  .1  "SELECT 1, 2
10f0: 2c 20 33 20 47 52 4f 55 50 20 42 59 20 32 22 20  , 3 GROUP BY 2" 
1100: 7b 31 20 32 20 33 7d 0a 20 20 30 30 30 32 2e 31  {1 2 3}.  0002.1
1110: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
1120: 33 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56  3 GROUP BY 2 HAV
1130: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20  ING count(*)=1" 
1140: 7b 31 20 32 20 33 7d 0a 20 20 30 30 30 32 2e 32  {1 2 3}.  0002.2
1150: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
1160: 33 20 47 52 4f 55 50 20 42 59 20 32 20 48 41 56  3 GROUP BY 2 HAV
1170: 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20  ING count(*)>1" 
1180: 7b 7d 0a 0a 20 20 31 30 30 31 2e 31 20 20 22 53  {}..  1001.1  "S
1190: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 31  ELECT DISTINCT 1
11a0: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
11b0: 32 22 20 7b 31 20 32 20 33 7d 0a 20 20 31 30 30  2" {1 2 3}.  100
11c0: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 44 49 53  2.1  "SELECT DIS
11d0: 54 49 4e 43 54 20 31 2c 20 32 2c 20 33 20 47 52  TINCT 1, 2, 3 GR
11e0: 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20  OUP BY 2 HAVING 
11f0: 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20 32  count(*)=1" {1 2
1200: 20 33 7d 0a 20 20 31 30 30 32 2e 32 20 20 22 53   3}.  1002.2  "S
1210: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 31  ELECT DISTINCT 1
1220: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
1230: 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  2 HAVING count(*
1240: 29 3e 31 22 20 7b 7d 0a 0a 20 20 32 30 30 31 2e  )>1" {}..  2001.
1250: 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 31  1  "SELECT ALL 1
1260: 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42 59 20  , 2, 3 GROUP BY 
1270: 32 22 20 7b 31 20 32 20 33 7d 0a 20 20 32 30 30  2" {1 2 3}.  200
1280: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c  2.1  "SELECT ALL
1290: 20 31 2c 20 32 2c 20 33 20 47 52 4f 55 50 20 42   1, 2, 3 GROUP B
12a0: 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e 74  Y 2 HAVING count
12b0: 28 2a 29 3d 31 22 20 7b 31 20 32 20 33 7d 0a 20  (*)=1" {1 2 3}. 
12c0: 20 32 30 30 32 2e 32 20 20 22 53 45 4c 45 43 54   2002.2  "SELECT
12d0: 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 47 52 4f   ALL 1, 2, 3 GRO
12e0: 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63  UP BY 2 HAVING c
12f0: 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20  ount(*)>1" {}.. 
1300: 20 30 31 30 31 2e 31 20 20 22 53 45 4c 45 43 54   0101.1  "SELECT
1310: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61   count(*), max(a
1320: 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  ) FROM t1 GROUP 
1330: 42 59 20 62 22 20 7b 31 20 61 20 31 20 63 20 31  BY b" {1 a 1 c 1
1340: 20 62 7d 0a 20 20 30 31 30 32 2e 31 20 20 22 53   b}.  0102.1  "S
1350: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
1360: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47  max(a) FROM t1 G
1370: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1380: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
1390: 20 20 20 31 20 61 20 31 20 63 20 31 20 62 0a 20     1 a 1 c 1 b. 
13a0: 20 7d 0a 20 20 30 31 30 32 2e 32 20 20 22 53 45   }.  0102.2  "SE
13b0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
13c0: 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20 47 52  ax(a) FROM t1 GR
13d0: 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
13e0: 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b 20 7d 0a  count(*)=2" { }.
13f0: 0a 20 20 31 31 30 31 2e 31 20 20 22 53 45 4c 45  .  1101.1  "SELE
1400: 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e  CT DISTINCT coun
1410: 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f  t(*), max(a) FRO
1420: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 62 22  M t1 GROUP BY b"
1430: 20 7b 31 20 61 20 31 20 63 20 31 20 62 7d 0a 20   {1 a 1 c 1 b}. 
1440: 20 31 31 30 32 2e 31 20 20 22 53 45 4c 45 43 54   1102.1  "SELECT
1450: 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28   DISTINCT count(
1460: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
1470: 74 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 47  t1 .           G
1480: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1490: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
14a0: 20 20 20 31 20 61 20 31 20 63 20 31 20 62 0a 20     1 a 1 c 1 b. 
14b0: 20 7d 0a 20 20 31 31 30 32 2e 32 20 20 22 53 45   }.  1102.2  "SE
14c0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f  LECT DISTINCT co
14d0: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
14e0: 52 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20  ROM t1 .        
14f0: 20 20 20 47 52 4f 55 50 20 42 59 20 62 20 48 41     GROUP BY b HA
1500: 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22  VING count(*)=2"
1510: 20 7b 20 0a 20 20 7d 0a 0a 20 20 32 31 30 31 2e   { .  }..  2101.
1520: 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 63  1  "SELECT ALL c
1530: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
1540: 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
1550: 20 62 22 20 7b 31 20 61 20 31 20 63 20 31 20 62   b" {1 a 1 c 1 b
1560: 7d 0a 20 20 32 31 30 32 2e 31 20 20 22 53 45 4c  }.  2102.1  "SEL
1570: 45 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29  ECT ALL count(*)
1580: 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31  , max(a) FROM t1
1590: 20 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f   .           GRO
15a0: 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
15b0: 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20 20 20  ount(*)=1" {.   
15c0: 20 31 20 61 20 31 20 63 20 31 20 62 0a 20 20 7d   1 a 1 c 1 b.  }
15d0: 0a 20 20 32 31 30 32 2e 32 20 20 22 53 45 4c 45  .  2102.2  "SELE
15e0: 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c  CT ALL count(*),
15f0: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55  .           GROU
1610: 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 6f  P BY b HAVING co
1620: 75 6e 74 28 2a 29 3d 32 22 20 7b 20 0a 20 20 7d  unt(*)=2" { .  }
1630: 0a 0a 20 20 30 30 31 31 2e 31 20 20 22 53 45 4c  ..  0011.1  "SEL
1640: 45 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52  ECT 1, 2, 3 WHER
1650: 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 22 20  E 1 GROUP BY 2" 
1660: 7b 31 20 32 20 33 7d 0a 20 20 30 30 31 32 2e 31  {1 2 3}.  0012.1
1670: 20 20 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20    "SELECT 1, 2, 
1680: 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50 20  3 WHERE 0 GROUP 
1690: 42 59 20 32 20 48 41 56 49 4e 47 20 63 6f 75 6e  BY 2 HAVING coun
16a0: 74 28 2a 29 3d 31 22 20 7b 7d 0a 20 20 30 30 31  t(*)=1" {}.  001
16b0: 32 2e 32 20 20 22 53 45 4c 45 43 54 20 31 2c 20  2.2  "SELECT 1, 
16c0: 32 2c 20 33 20 57 48 45 52 45 20 30 20 47 52 4f  2, 3 WHERE 0 GRO
16d0: 55 50 20 42 59 20 32 20 48 41 56 49 4e 47 20 63  UP BY 2 HAVING c
16e0: 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d 0a 0a 20  ount(*)>1" {}.. 
16f0: 20 31 30 31 31 2e 31 20 20 22 53 45 4c 45 43 54   1011.1  "SELECT
1700: 20 44 49 53 54 49 4e 43 54 20 31 2c 20 32 2c 20   DISTINCT 1, 2, 
1710: 33 20 57 48 45 52 45 20 30 20 47 52 4f 55 50 20  3 WHERE 0 GROUP 
1720: 42 59 20 32 22 20 7b 7d 0a 20 20 31 30 31 32 2e  BY 2" {}.  1012.
1730: 31 20 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  1  "SELECT DISTI
1740: 4e 43 54 20 31 2c 20 32 2c 20 33 20 57 48 45 52  NCT 1, 2, 3 WHER
1750: 45 20 31 20 47 52 4f 55 50 20 42 59 20 32 20 48  E 1 GROUP BY 2 H
1760: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31  AVING count(*)=1
1770: 22 20 0a 20 20 20 20 20 20 20 20 20 20 7b 31 20  " .          {1 
1780: 32 20 33 7d 0a 20 20 31 30 31 32 2e 32 20 20 22  2 3}.  1012.2  "
1790: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
17a0: 31 2c 20 32 2c 20 33 20 57 48 45 52 45 20 4e 55  1, 2, 3 WHERE NU
17b0: 4c 4c 20 47 52 4f 55 50 20 42 59 20 32 20 48 41  LL GROUP BY 2 HA
17c0: 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22  VING count(*)>1"
17d0: 20 7b 7d 0a 0a 20 20 32 30 31 31 2e 31 20 20 22   {}..  2011.1  "
17e0: 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32 2c  SELECT ALL 1, 2,
17f0: 20 33 20 57 48 45 52 45 20 31 20 47 52 4f 55 50   3 WHERE 1 GROUP
1800: 20 42 59 20 32 22 20 7b 31 20 32 20 33 7d 0a 20   BY 2" {1 2 3}. 
1810: 20 32 30 31 32 2e 31 20 20 22 53 45 4c 45 43 54   2012.1  "SELECT
1820: 20 41 4c 4c 20 31 2c 20 32 2c 20 33 20 57 48 45   ALL 1, 2, 3 WHE
1830: 52 45 20 30 20 47 52 4f 55 50 20 42 59 20 32 20  RE 0 GROUP BY 2 
1840: 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d  HAVING count(*)=
1850: 31 22 20 7b 7d 0a 20 20 32 30 31 32 2e 32 20 20  1" {}.  2012.2  
1860: 22 53 45 4c 45 43 54 20 41 4c 4c 20 31 2c 20 32  "SELECT ALL 1, 2
1870: 2c 20 33 20 57 48 45 52 45 20 27 61 62 63 27 20  , 3 WHERE 'abc' 
1880: 47 52 4f 55 50 20 42 59 20 32 20 48 41 56 49 4e  GROUP BY 2 HAVIN
1890: 47 20 63 6f 75 6e 74 28 2a 29 3e 31 22 20 7b 7d  G count(*)>1" {}
18a0: 0a 0a 20 20 30 31 31 31 2e 31 20 20 22 53 45 4c  ..  0111.1  "SEL
18b0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  ECT count(*), ma
18c0: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45  x(a) FROM t1 WHE
18d0: 52 45 20 61 3d 27 61 27 20 47 52 4f 55 50 20 42  RE a='a' GROUP B
18e0: 59 20 62 22 20 7b 31 20 61 7d 0a 20 20 30 31 31  Y b" {1 a}.  011
18f0: 32 2e 31 20 20 22 53 45 4c 45 43 54 20 63 6f 75  2.1  "SELECT cou
1900: 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46 52  nt(*), max(a) FR
1910: 4f 4d 20 74 31 20 0a 20 20 20 20 20 20 20 20 20  OM t1 .         
1920: 20 20 57 48 45 52 45 20 61 3d 27 63 27 20 47 52    WHERE a='c' GR
1930: 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
1940: 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 31 20 63  count(*)=1" {1 c
1950: 7d 0a 20 20 30 31 31 32 2e 32 20 20 22 53 45 4c  }.  0112.2  "SEL
1960: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61  ECT count(*), ma
1970: 78 28 61 29 20 46 52 4f 4d 20 74 31 20 0a 20 20  x(a) FROM t1 .  
1980: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 30           WHERE 0
1990: 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
19a0: 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32 22 20 7b  NG count(*)=2" {
19b0: 20 7d 0a 20 20 31 31 31 31 2e 31 20 20 22 53 45   }.  1111.1  "SE
19c0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 6f  LECT DISTINCT co
19d0: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20 46  unt(*), max(a) F
19e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c 27  ROM t1 WHERE a<'
19f0: 63 27 20 47 52 4f 55 50 20 42 59 20 62 22 20 0a  c' GROUP BY b" .
1a00: 20 20 20 20 20 20 20 20 20 20 7b 31 20 61 20 31            {1 a 1
1a10: 20 62 7d 0a 20 20 31 31 31 32 2e 31 20 20 22 53   b}.  1112.1  "S
1a20: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63  ELECT DISTINCT c
1a30: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29 20  ount(*), max(a) 
1a40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
1a50: 27 61 27 0a 20 20 20 20 20 20 20 20 20 20 20 47  'a'.           G
1a60: 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
1a70: 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b 0a 20   count(*)=1" {. 
1a80: 20 20 20 31 20 63 20 31 20 62 0a 20 20 7d 0a 20     1 c 1 b.  }. 
1a90: 20 31 31 31 32 2e 32 20 20 22 53 45 4c 45 43 54   1112.2  "SELECT
1aa0: 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74 28   DISTINCT count(
1ab0: 2a 29 2c 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  *), max(a) FROM 
1ac0: 74 31 20 57 48 45 52 45 20 30 0a 20 20 20 20 20  t1 WHERE 0.     
1ad0: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
1ae0: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
1af0: 3d 32 22 20 7b 20 0a 20 20 7d 0a 0a 20 20 32 31  =2" { .  }..  21
1b00: 31 31 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c  11.1  "SELECT AL
1b10: 4c 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28  L count(*), max(
1b20: 61 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  a) FROM t1 WHERE
1b30: 20 62 3e 27 6f 6e 65 27 20 47 52 4f 55 50 20 42   b>'one' GROUP B
1b40: 59 20 62 22 20 0a 20 20 20 20 20 20 20 20 20 20  Y b" .          
1b50: 7b 31 20 63 20 31 20 62 7d 0a 20 20 32 31 31 32  {1 c 1 b}.  2112
1b60: 2e 31 20 20 22 53 45 4c 45 43 54 20 41 4c 4c 20  .1  "SELECT ALL 
1b70: 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 61 29  count(*), max(a)
1b80: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1b90: 21 3d 27 62 27 0a 20 20 20 20 20 20 20 20 20 20  !='b'.          
1ba0: 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
1bb0: 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 31 22 20 7b  NG count(*)=1" {
1bc0: 0a 20 20 20 20 31 20 61 20 31 20 63 0a 20 20 7d  .    1 a 1 c.  }
1bd0: 0a 20 20 32 31 31 32 2e 32 20 20 22 53 45 4c 45  .  2112.2  "SELE
1be0: 43 54 20 41 4c 4c 20 63 6f 75 6e 74 28 2a 29 2c  CT ALL count(*),
1bf0: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 31 20   max(a) FROM t1 
1c00: 0a 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52  .           WHER
1c10: 45 20 30 20 47 52 4f 55 50 20 42 59 20 62 20 48  E 0 GROUP BY b H
1c20: 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3d 32  AVING count(*)=2
1c30: 22 20 7b 20 7d 0a 7d 0a 0a 0a 23 20 45 56 49 44  " { }.}...# EVID
1c40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 33 31 36  ENCE-OF: R-23316
1c50: 2d 32 30 31 36 39 20 2d 2d 20 73 79 6e 74 61 78  -20169 -- syntax
1c60: 20 64 69 61 67 72 61 6d 20 72 65 73 75 6c 74 2d   diagram result-
1c70: 63 6f 6c 75 6d 6e 0a 23 0a 64 6f 5f 73 65 6c 65  column.#.do_sele
1c80: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
1c90: 74 2d 30 2e 33 20 7b 0a 20 20 31 20 20 22 53 45  t-0.3 {.  1  "SE
1ca0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20  LECT * FROM t1" 
1cb0: 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20 74  {a one b two c t
1cc0: 68 72 65 65 7d 0a 20 20 32 20 20 22 53 45 4c 45  hree}.  2  "SELE
1cd0: 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 22  CT t1.* FROM t1"
1ce0: 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f 20 63 20   {a one b two c 
1cf0: 74 68 72 65 65 7d 0a 20 20 33 20 20 22 53 45 4c  three}.  3  "SEL
1d00: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1d10: 46 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62  FROM t1" {xax xb
1d20: 78 20 78 63 78 7d 0a 20 20 34 20 20 22 53 45 4c  x xcx}.  4  "SEL
1d30: 45 43 54 20 27 78 27 7c 7c 61 7c 7c 27 78 27 20  ECT 'x'||a||'x' 
1d40: 61 6c 69 61 73 20 46 52 4f 4d 20 74 31 22 20 7b  alias FROM t1" {
1d50: 78 61 78 20 78 62 78 20 78 63 78 7d 0a 20 20 35  xax xbx xcx}.  5
1d60: 20 20 22 53 45 4c 45 43 54 20 27 78 27 7c 7c 61    "SELECT 'x'||a
1d70: 7c 7c 27 78 27 20 41 53 20 61 6c 69 61 73 20 46  ||'x' AS alias F
1d80: 52 4f 4d 20 74 31 22 20 7b 78 61 78 20 78 62 78  ROM t1" {xax xbx
1d90: 20 78 63 78 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   xcx}.}..# EVIDE
1da0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 33 33 2d  NCE-OF: R-41233-
1db0: 32 31 33 39 37 20 2d 2d 20 73 79 6e 74 61 78 20  21397 -- syntax 
1dc0: 64 69 61 67 72 61 6d 20 6a 6f 69 6e 2d 73 6f 75  diagram join-sou
1dd0: 72 63 65 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  rce.#.# EVIDENCE
1de0: 2d 4f 46 3a 20 52 2d 34 35 30 34 30 2d 31 31 31  -OF: R-45040-111
1df0: 32 31 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61  21 -- syntax dia
1e00: 67 72 61 6d 20 6a 6f 69 6e 2d 6f 70 0a 23 0a 64  gram join-op.#.d
1e10: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
1e20: 5f 73 65 6c 65 63 74 2d 30 2e 34 20 7b 0a 20 20  _select-0.4 {.  
1e30: 31 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  1  "SELECT t1.ro
1e40: 77 69 64 20 46 52 4f 4d 20 74 31 22 20 7b 31 20  wid FROM t1" {1 
1e50: 32 20 33 7d 0a 20 20 32 20 20 22 53 45 4c 45 43  2 3}.  2  "SELEC
1e60: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1e70: 74 31 2c 74 32 22 20 7b 31 20 31 20 31 20 32 20  t1,t2" {1 1 1 2 
1e80: 32 20 32 20 33 20 33 20 33 7d 0a 20 20 33 20 20  2 2 3 3 3}.  3  
1e90: 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64  "SELECT t1.rowid
1ea0: 20 46 52 4f 4d 20 74 31 2c 74 32 2c 74 33 22 20   FROM t1,t2,t3" 
1eb0: 7b 31 20 31 20 31 20 31 20 31 20 31 20 32 20 32  {1 1 1 1 1 1 2 2
1ec0: 20 32 20 32 20 32 20 32 20 33 20 33 20 33 20 33   2 2 2 2 3 3 3 3
1ed0: 20 33 20 33 7d 0a 0a 20 20 34 20 20 22 53 45 4c   3 3}..  4  "SEL
1ee0: 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f  ECT t1.rowid FRO
1ef0: 4d 20 74 31 22 20 7b 31 20 32 20 33 7d 0a 20 20  M t1" {1 2 3}.  
1f00: 35 20 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  5  "SELECT t1.ro
1f10: 77 69 64 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  wid FROM t1 JOIN
1f20: 20 74 32 22 20 7b 31 20 31 20 31 20 32 20 32 20   t2" {1 1 1 2 2 
1f30: 32 20 33 20 33 20 33 7d 0a 20 20 36 20 20 22 53  2 3 3 3}.  6  "S
1f40: 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46  ELECT t1.rowid F
1f50: 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 74 32 20 4a  ROM t1 JOIN t2 J
1f60: 4f 49 4e 20 74 33 22 20 0a 20 20 20 20 20 7b 31  OIN t3" .     {1
1f70: 20 31 20 31 20 31 20 31 20 31 20 32 20 32 20 32   1 1 1 1 1 2 2 2
1f80: 20 32 20 32 20 32 20 33 20 33 20 33 20 33 20 33   2 2 2 3 3 3 3 3
1f90: 20 33 7d 0a 0a 20 20 37 20 20 22 53 45 4c 45 43   3}..  7  "SELEC
1fa0: 54 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20  T t1.rowid FROM 
1fb0: 74 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20  t1 NATURAL JOIN 
1fc0: 74 33 22 20 7b 31 20 32 7d 0a 20 20 38 20 20 22  t3" {1 2}.  8  "
1fd0: 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20  SELECT t1.rowid 
1fe0: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
1ff0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2000: 74 33 22 20 7b 31 20 32 20 33 7d 0a 20 20 39 20  t3" {1 2 3}.  9 
2010: 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f 77 69   "SELECT t1.rowi
2020: 64 20 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41  d FROM t1 NATURA
2030: 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 22 20  L LEFT JOIN t3" 
2040: 7b 31 20 32 20 33 7d 0a 20 20 31 30 20 22 53 45  {1 2 3}.  10 "SE
2050: 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46 52  LECT t1.rowid FR
2060: 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 49 4e  OM t1 NATURAL IN
2070: 4e 45 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20  NER JOIN t3" {1 
2080: 32 7d 0a 20 20 31 31 20 22 53 45 4c 45 43 54 20  2}.  11 "SELECT 
2090: 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  t1.rowid FROM t1
20a0: 20 4e 41 54 55 52 41 4c 20 43 52 4f 53 53 20 4a   NATURAL CROSS J
20b0: 4f 49 4e 20 74 33 22 20 7b 31 20 32 7d 0a 0a 20  OIN t3" {1 2}.. 
20c0: 20 31 32 20 22 53 45 4c 45 43 54 20 74 31 2e 72   12 "SELECT t1.r
20d0: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 4a 4f 49  owid FROM t1 JOI
20e0: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
20f0: 20 33 7d 0a 20 20 31 33 20 22 53 45 4c 45 43 54   3}.  13 "SELECT
2100: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
2110: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
2120: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
2130: 20 33 7d 0a 20 20 31 34 20 22 53 45 4c 45 43 54   3}.  14 "SELECT
2140: 20 74 31 2e 72 6f 77 69 64 20 46 52 4f 4d 20 74   t1.rowid FROM t
2150: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 22 20  1 LEFT JOIN t3" 
2160: 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 20 20  {1 1 2 2 3 3}.  
2170: 31 35 20 22 53 45 4c 45 43 54 20 74 31 2e 72 6f  15 "SELECT t1.ro
2180: 77 69 64 20 46 52 4f 4d 20 74 31 20 49 4e 4e 45  wid FROM t1 INNE
2190: 52 20 4a 4f 49 4e 20 74 33 22 20 7b 31 20 31 20  R JOIN t3" {1 1 
21a0: 32 20 32 20 33 20 33 7d 0a 20 20 31 36 20 22 53  2 2 3 3}.  16 "S
21b0: 45 4c 45 43 54 20 74 31 2e 72 6f 77 69 64 20 46  ELECT t1.rowid F
21c0: 52 4f 4d 20 74 31 20 43 52 4f 53 53 20 4a 4f 49  ROM t1 CROSS JOI
21d0: 4e 20 74 33 22 20 7b 31 20 31 20 32 20 32 20 33  N t3" {1 1 2 2 3
21e0: 20 33 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   3}.}..# EVIDENC
21f0: 45 2d 4f 46 3a 20 52 2d 35 36 39 31 31 2d 36 33  E-OF: R-56911-63
2200: 35 33 33 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  533 -- syntax di
2210: 61 67 72 61 6d 20 63 6f 6d 70 6f 75 6e 64 2d 6f  agram compound-o
2220: 70 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 73 65 6c  perator.#.do_sel
2230: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
2240: 63 74 2d 30 2e 35 20 7b 0a 20 20 31 20 20 22 53  ct-0.5 {.  1  "S
2250: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2260: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
2270: 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f  LECT rowid+2 FRO
2280: 4d 20 74 34 22 20 7b 31 20 32 20 33 20 33 20 34  M t4" {1 2 3 3 4
2290: 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 72  }.  2  "SELECT r
22a0: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 55 4e 49  owid FROM t1 UNI
22b0: 4f 4e 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f  ON     SELECT ro
22c0: 77 69 64 2b 32 20 46 52 4f 4d 20 74 34 22 20 7b  wid+2 FROM t4" {
22d0: 31 20 32 20 33 20 34 7d 0a 20 20 33 20 20 22 53  1 2 3 4}.  3  "S
22e0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
22f0: 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   t1 INTERSECT SE
2300: 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52 4f  LECT rowid+2 FRO
2310: 4d 20 74 34 22 20 7b 33 7d 0a 20 20 34 20 20 22  M t4" {3}.  4  "
2320: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2330: 4d 20 74 31 20 45 58 43 45 50 54 20 20 20 20 53  M t1 EXCEPT    S
2340: 45 4c 45 43 54 20 72 6f 77 69 64 2b 32 20 46 52  ELECT rowid+2 FR
2350: 4f 4d 20 74 34 22 20 7b 31 20 32 7d 0a 7d 0a 0a  OM t4" {1 2}.}..
2360: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2370: 2d 36 30 33 38 38 2d 32 37 34 35 38 20 2d 2d 20  -60388-27458 -- 
2380: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6f  syntax diagram o
2390: 72 64 65 72 69 6e 67 2d 74 65 72 6d 0a 23 0a 64  rdering-term.#.d
23a0: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
23b0: 5f 73 65 6c 65 63 74 2d 30 2e 36 20 7b 0a 20 20  _select-0.6 {.  
23c0: 31 20 20 22 53 45 4c 45 43 54 20 62 7c 7c 61 20  1  "SELECT b||a 
23d0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
23e0: 20 62 7c 7c 61 22 20 20 20 20 20 20 20 20 20 20   b||a"          
23f0: 20 20 20 20 20 20 20 20 7b 6f 6e 65 61 20 74 68          {onea th
2400: 72 65 65 63 20 74 77 6f 62 7d 0a 20 20 32 20 20  reec twob}.  2  
2410: 22 53 45 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f  "SELECT b||a FRO
2420: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 62  M t1 ORDER BY (b
2430: 7c 7c 61 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ||a) COLLATE noc
2440: 61 73 65 22 20 7b 6f 6e 65 61 20 74 68 72 65 65  ase" {onea three
2450: 63 20 74 77 6f 62 7d 0a 20 20 33 20 20 22 53 45  c twob}.  3  "SE
2460: 4c 45 43 54 20 62 7c 7c 61 20 46 52 4f 4d 20 74  LECT b||a FROM t
2470: 31 20 4f 52 44 45 52 20 42 59 20 28 62 7c 7c 61  1 ORDER BY (b||a
2480: 29 20 41 53 43 22 20 20 20 20 20 20 20 20 20 20  ) ASC"          
2490: 20 20 7b 6f 6e 65 61 20 74 68 72 65 65 63 20 74    {onea threec t
24a0: 77 6f 62 7d 0a 20 20 34 20 20 22 53 45 4c 45 43  wob}.  4  "SELEC
24b0: 54 20 62 7c 7c 61 20 46 52 4f 4d 20 74 31 20 4f  T b||a FROM t1 O
24c0: 52 44 45 52 20 42 59 20 28 62 7c 7c 61 29 20 44  RDER BY (b||a) D
24d0: 45 53 43 22 20 20 20 20 20 20 20 20 20 20 20 7b  ESC"           {
24e0: 74 77 6f 62 20 74 68 72 65 65 63 20 6f 6e 65 61  twob threec onea
24f0: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
2500: 4f 46 3a 20 52 2d 33 36 34 39 34 2d 33 33 35 31  OF: R-36494-3351
2510: 39 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67  9 -- syntax diag
2520: 72 61 6d 20 73 65 6c 65 63 74 2d 73 74 6d 74 0a  ram select-stmt.
2530: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
2540: 73 20 65 5f 73 65 6c 65 63 74 2d 30 2e 37 20 7b  s e_select-0.7 {
2550: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 2a 20  .  1  "SELECT * 
2560: 46 52 4f 4d 20 74 31 22 20 7b 61 20 6f 6e 65 20  FROM t1" {a one 
2570: 62 20 74 77 6f 20 63 20 74 68 72 65 65 7d 0a 20  b two c three}. 
2580: 20 32 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52   2  "SELECT * FR
2590: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 62  OM t1 ORDER BY b
25a0: 22 20 7b 61 20 6f 6e 65 20 63 20 74 68 72 65 65  " {a one c three
25b0: 20 62 20 74 77 6f 7d 0a 20 20 33 20 20 22 53 45   b two}.  3  "SE
25c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f  LECT * FROM t1 O
25d0: 52 44 45 52 20 42 59 20 62 2c 20 61 22 20 7b 61  RDER BY b, a" {a
25e0: 20 6f 6e 65 20 63 20 74 68 72 65 65 20 62 20 74   one c three b t
25f0: 77 6f 7d 0a 0a 20 20 34 20 20 22 53 45 4c 45 43  wo}..  4  "SELEC
2600: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  T * FROM t1 LIMI
2610: 54 20 31 30 22 20 7b 61 20 6f 6e 65 20 62 20 74  T 10" {a one b t
2620: 77 6f 20 63 20 74 68 72 65 65 7d 0a 20 20 35 20  wo c three}.  5 
2630: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2640: 74 31 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53  t1 LIMIT 10 OFFS
2650: 45 54 20 35 22 20 7b 7d 0a 20 20 36 20 20 22 53  ET 5" {}.  6  "S
2660: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2670: 4c 49 4d 49 54 20 31 30 2c 20 35 22 20 7b 7d 0a  LIMIT 10, 5" {}.
2680: 0a 20 20 37 20 20 22 53 45 4c 45 43 54 20 2a 20  .  7  "SELECT * 
2690: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
26a0: 20 61 20 4c 49 4d 49 54 20 31 30 22 20 7b 61 20   a LIMIT 10" {a 
26b0: 6f 6e 65 20 62 20 74 77 6f 20 63 20 74 68 72 65  one b two c thre
26c0: 65 7d 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20  e}.  8  "SELECT 
26d0: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
26e0: 42 59 20 62 20 4c 49 4d 49 54 20 31 30 20 4f 46  BY b LIMIT 10 OF
26f0: 46 53 45 54 20 35 22 20 7b 7d 0a 20 20 39 20 20  FSET 5" {}.  9  
2700: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2710: 31 20 4f 52 44 45 52 20 42 59 20 61 2c 62 20 4c  1 ORDER BY a,b L
2720: 49 4d 49 54 20 31 30 2c 20 35 22 20 7b 7d 0a 0a  IMIT 10, 5" {}..
2730: 20 20 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20    10  "SELECT * 
2740: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
2750: 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74  LECT b, a FROM t
2760: 31 22 20 0a 20 20 20 20 20 7b 61 20 6f 6e 65 20  1" .     {a one 
2770: 62 20 74 77 6f 20 63 20 74 68 72 65 65 20 6f 6e  b two c three on
2780: 65 20 61 20 74 68 72 65 65 20 63 20 74 77 6f 20  e a three c two 
2790: 62 7d 0a 20 20 31 31 20 20 22 53 45 4c 45 43 54  b}.  11  "SELECT
27a0: 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   * FROM t1 UNION
27b0: 20 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f   SELECT b, a FRO
27c0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 62 22  M t1 ORDER BY b"
27d0: 20 0a 20 20 20 20 20 7b 6f 6e 65 20 61 20 74 77   .     {one a tw
27e0: 6f 20 62 20 74 68 72 65 65 20 63 20 61 20 6f 6e  o b three c a on
27f0: 65 20 63 20 74 68 72 65 65 20 62 20 74 77 6f 7d  e c three b two}
2800: 0a 20 20 31 32 20 20 22 53 45 4c 45 43 54 20 2a  .  12  "SELECT *
2810: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
2820: 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
2830: 74 31 20 4f 52 44 45 52 20 42 59 20 62 2c 20 61  t1 ORDER BY b, a
2840: 22 20 0a 20 20 20 20 20 7b 6f 6e 65 20 61 20 74  " .     {one a t
2850: 77 6f 20 62 20 74 68 72 65 65 20 63 20 61 20 6f  wo b three c a o
2860: 6e 65 20 63 20 74 68 72 65 65 20 62 20 74 77 6f  ne c three b two
2870: 7d 0a 20 20 31 33 20 20 22 53 45 4c 45 43 54 20  }.  13  "SELECT 
2880: 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  * FROM t1 UNION 
2890: 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d  SELECT b, a FROM
28a0: 20 74 31 20 4c 49 4d 49 54 20 31 30 22 20 0a 20   t1 LIMIT 10" . 
28b0: 20 20 20 20 7b 61 20 6f 6e 65 20 62 20 74 77 6f      {a one b two
28c0: 20 63 20 74 68 72 65 65 20 6f 6e 65 20 61 20 74   c three one a t
28d0: 68 72 65 65 20 63 20 74 77 6f 20 62 7d 0a 20 20  hree c two b}.  
28e0: 31 34 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  14  "SELECT * FR
28f0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
2900: 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20  CT b, a FROM t1 
2910: 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20  LIMIT 10 OFFSET 
2920: 35 22 20 0a 20 20 20 20 20 7b 74 77 6f 20 62 7d  5" .     {two b}
2930: 0a 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 2a  .  15  "SELECT *
2940: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
2950: 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20  ELECT b, a FROM 
2960: 74 31 20 4c 49 4d 49 54 20 31 30 2c 20 35 22 20  t1 LIMIT 10, 5" 
2970: 0a 20 20 20 20 20 7b 7d 0a 20 20 31 36 20 20 22  .     {}.  16  "
2980: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2990: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 2c   UNION SELECT b,
29a0: 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   a FROM t1 ORDER
29b0: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 22 20   BY a LIMIT 10" 
29c0: 0a 20 20 20 20 20 7b 61 20 6f 6e 65 20 62 20 74  .     {a one b t
29d0: 77 6f 20 63 20 74 68 72 65 65 20 6f 6e 65 20 61  wo c three one a
29e0: 20 74 68 72 65 65 20 63 20 74 77 6f 20 62 7d 0a   three c two b}.
29f0: 20 20 31 37 20 20 22 53 45 4c 45 43 54 20 2a 20    17  "SELECT * 
2a00: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
2a10: 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74  LECT b, a FROM t
2a20: 31 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49 4d  1 ORDER BY b LIM
2a30: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
2a40: 0a 20 20 20 20 20 7b 62 20 74 77 6f 7d 0a 20 20  .     {b two}.  
2a50: 31 38 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  18  "SELECT * FR
2a60: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
2a70: 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20  CT b, a FROM t1 
2a80: 4f 52 44 45 52 20 42 59 20 61 2c 62 20 4c 49 4d  ORDER BY a,b LIM
2a90: 49 54 20 31 30 2c 20 35 22 20 0a 20 20 20 20 20  IT 10, 5" .     
2aa0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 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: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
2b00: 20 74 65 73 74 73 20 66 6f 63 75 73 20 6f 6e 20   tests focus on 
2b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 6a 6f 69  FROM clause (joi
2b20: 6e 29 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23  n) processing..#
2b30: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
2b40: 20 52 2d 31 36 30 37 34 2d 35 34 31 39 36 20 49   R-16074-54196 I
2b50: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b60: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  e is omitted fro
2b70: 6d 20 61 20 73 69 6d 70 6c 65 0a 23 20 53 45 4c  m a simple.# SEL
2b80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
2b90: 68 65 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61  hen the input da
2ba0: 74 61 20 69 73 20 69 6d 70 6c 69 63 69 74 6c 79  ta is implicitly
2bb0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 7a 65   a single row ze
2bc0: 72 6f 0a 23 20 63 6f 6c 75 6d 6e 73 20 77 69 64  ro.# columns wid
2bd0: 65 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  e.#.do_select_te
2be0: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 31  sts e_select-1.1
2bf0: 20 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 27   {.  1 "SELECT '
2c00: 61 62 63 27 22 20 20 20 20 20 20 20 20 20 20 20  abc'"           
2c10: 20 7b 61 62 63 7d 0a 20 20 32 20 22 53 45 4c 45   {abc}.  2 "SELE
2c20: 43 54 20 27 61 62 63 27 20 57 48 45 52 45 20 4e  CT 'abc' WHERE N
2c30: 55 4c 4c 22 20 7b 7d 0a 20 20 33 20 22 53 45 4c  ULL" {}.  3 "SEL
2c40: 45 43 54 20 4e 55 4c 4c 22 20 20 20 20 20 20 20  ECT NULL"       
2c50: 20 20 20 20 20 20 7b 7b 7d 7d 0a 20 20 34 20 22        {{}}.  4 "
2c60: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 22  SELECT count(*)"
2c70: 20 20 20 20 20 20 20 20 20 7b 31 7d 0a 20 20 35           {1}.  5
2c80: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
2c90: 29 20 57 48 45 52 45 20 30 22 20 7b 30 7d 0a 20  ) WHERE 0" {0}. 
2ca0: 20 36 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74   6 "SELECT count
2cb0: 28 2a 29 20 57 48 45 52 45 20 31 22 20 7b 31 7d  (*) WHERE 1" {1}
2cc0: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
2cd0: 46 3a 20 52 2d 34 38 31 31 34 2d 33 33 32 35 35  F: R-48114-33255
2ce0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c   If there is onl
2cf0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2d00: 20 69 6e 20 74 68 65 0a 23 20 6a 6f 69 6e 2d 73   in the.# join-s
2d10: 6f 75 72 63 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  ource following 
2d20: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
2d30: 20 74 68 65 6e 20 74 68 65 20 69 6e 70 75 74 20   then the input 
2d40: 64 61 74 61 20 75 73 65 64 20 62 79 20 74 68 65  data used by the
2d50: 0a 23 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  .# SELECT statem
2d60: 65 6e 74 20 69 73 20 74 68 65 20 63 6f 6e 74 65  ent is the conte
2d70: 6e 74 73 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  nts of the named
2d80: 20 74 61 62 6c 65 2e 0a 23 0a 23 20 20 20 54 68   table..#.#   Th
2d90: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
2da0: 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20   SELECT queries 
2db0: 73 75 67 67 65 73 74 20 74 68 61 74 20 74 68 65  suggest that the
2dc0: 79 20 61 72 65 20 6f 70 65 72 61 74 69 6e 67 20  y are operating 
2dd0: 6f 6e 20 74 68 65 0a 23 20 20 20 63 6f 6e 74 65  on the.#   conte
2de0: 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  nts of the table
2df0: 20 27 78 78 27 2e 0a 23 0a 64 6f 5f 65 78 65 63   'xx'..#.do_exec
2e00: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
2e10: 74 2d 31 2e 32 2e 30 20 7b 0a 20 20 43 52 45 41  t-1.2.0 {.  CREA
2e20: 54 45 20 54 41 42 4c 45 20 78 78 28 78 2c 20 79  TE TABLE xx(x, y
2e30: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2e40: 20 78 78 20 56 41 4c 55 45 53 28 27 49 69 4a 6c   xx VALUES('IiJl
2e50: 73 49 50 65 70 4d 75 41 68 55 27 2c 20 58 27 31  sIPepMuAhU', X'1
2e60: 30 42 30 30 42 38 39 37 41 31 35 42 41 41 30 32  0B00B897A15BAA02
2e70: 45 33 46 39 38 44 43 45 38 46 32 27 29 3b 0a 20  E3F98DCE8F2');. 
2e80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 78 20   INSERT INTO xx 
2e90: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 2d 31 36  VALUES(NULL, -16
2ea0: 2e 38 37 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  .87);.  INSERT I
2eb0: 4e 54 4f 20 78 78 20 56 41 4c 55 45 53 28 2d 31  NTO xx VALUES(-1
2ec0: 37 2e 38 39 2c 20 27 6c 69 6e 67 75 69 73 74 69  7.89, 'linguisti
2ed0: 63 61 6c 6c 79 27 29 3b 0a 7d 20 7b 7d 0a 64 6f  cally');.} {}.do
2ee0: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
2ef0: 73 65 6c 65 63 74 2d 31 2e 32 20 7b 0a 20 20 31  select-1.2 {.  1
2f00: 20 20 22 53 45 4c 45 43 54 20 71 75 6f 74 65 28    "SELECT quote(
2f10: 78 29 2c 20 71 75 6f 74 65 28 79 29 20 46 52 4f  x), quote(y) FRO
2f20: 4d 20 78 78 22 20 7b 0a 20 20 20 20 20 27 49 69  M xx" {.     'Ii
2f30: 4a 6c 73 49 50 65 70 4d 75 41 68 55 27 20 58 27  JlsIPepMuAhU' X'
2f40: 31 30 42 30 30 42 38 39 37 41 31 35 42 41 41 30  10B00B897A15BAA0
2f50: 32 45 33 46 39 38 44 43 45 38 46 32 27 20 0a 20  2E3F98DCE8F2' . 
2f60: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
2f70: 20 20 20 20 20 2d 31 36 2e 38 37 20 20 20 20 20       -16.87     
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 20 0a 20 20 20 20 20 2d 31 37 2e 38       .     -17.8
2fa0: 39 20 20 20 20 20 20 20 20 20 20 20 27 6c 69 6e  9           'lin
2fb0: 67 75 69 73 74 69 63 61 6c 6c 79 27 20 20 20 20  guistically'    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d              .  }
2fd0: 0a 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 63  ..  2  "SELECT c
2fe0: 6f 75 6e 74 28 2a 29 2c 20 63 6f 75 6e 74 28 78  ount(*), count(x
2ff0: 29 2c 20 63 6f 75 6e 74 28 79 29 20 46 52 4f 4d  ), count(y) FROM
3000: 20 78 78 22 20 7b 33 20 32 20 33 7d 0a 20 20 33   xx" {3 2 3}.  3
3010: 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 78 29    "SELECT sum(x)
3020: 2c 20 73 75 6d 28 79 29 20 46 52 4f 4d 20 78 78  , sum(y) FROM xx
3030: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3040: 7b 2d 31 37 2e 38 39 20 2d 31 36 2e 38 37 7d 0a  {-17.89 -16.87}.
3050: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
3060: 3a 20 52 2d 32 33 35 39 33 2d 31 32 34 35 36 20  : R-23593-12456 
3070: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
3080: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
3090: 73 70 65 63 69 66 69 65 64 0a 23 20 61 73 20 70  specified.# as p
30a0: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2d  art of the join-
30b0: 73 6f 75 72 63 65 20 66 6f 6c 6c 6f 77 69 6e 67  source following
30c0: 20 74 68 65 20 46 52 4f 4d 20 6b 65 79 77 6f 72   the FROM keywor
30d0: 64 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 63 6f  d, then the.# co
30e0: 6e 74 65 6e 74 73 20 6f 66 20 65 61 63 68 20 6e  ntents of each n
30f0: 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20 6a  amed table are j
3100: 6f 69 6e 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  oined into a sin
3110: 67 6c 65 20 64 61 74 61 73 65 74 20 66 6f 72 20  gle dataset for 
3120: 74 68 65 0a 23 20 73 69 6d 70 6c 65 20 53 45 4c  the.# simple SEL
3130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
3140: 20 6f 70 65 72 61 74 65 20 6f 6e 2e 0a 23 0a 23   operate on..#.#
3150: 20 20 20 54 68 65 72 65 20 61 72 65 20 6d 6f 72     There are mor
3160: 65 20 64 65 74 61 69 6c 65 64 20 74 65 73 74 73  e detailed tests
3170: 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
3180: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 68 61  requirements tha
3190: 74 20 61 64 64 20 0a 23 20 20 20 6d 6f 72 65 20  t add .#   more 
31a0: 64 65 74 61 69 6c 20 74 6f 20 74 68 69 73 20 69  detail to this i
31b0: 64 65 61 2e 20 57 65 20 6a 75 73 74 20 61 64 64  dea. We just add
31c0: 20 61 20 73 69 6e 67 6c 65 20 74 65 73 74 20 74   a single test t
31d0: 68 61 74 20 73 68 6f 77 73 20 74 68 61 74 0a 23  hat shows that.#
31e0: 20 20 20 64 61 74 61 20 69 73 20 63 6f 6d 69 6e     data is comin
31f0: 67 20 66 72 6f 6d 20 65 61 63 68 20 6f 66 20 74  g from each of t
3200: 68 65 20 74 68 72 65 65 20 74 61 62 6c 65 73 20  he three tables 
3210: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 46 52  following the FR
3220: 4f 4d 20 63 6c 61 75 73 65 0a 23 20 20 20 68 65  OM clause.#   he
3230: 72 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  re to show that 
3240: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 76  the statement, v
3250: 61 67 75 65 20 61 73 20 69 74 20 69 73 2c 20 69  ague as it is, i
3260: 73 20 6e 6f 74 20 69 6e 63 6f 72 72 65 63 74 2e  s not incorrect.
3270: 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
3280: 74 73 20 65 5f 73 65 6c 65 63 74 2d 31 2e 33 20  ts e_select-1.3 
3290: 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 2a 20  {.  1 "SELECT * 
32a0: 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 22  FROM t1, t2, t3"
32b0: 20 7b 0a 20 20 20 20 20 20 61 20 6f 6e 65 20 61   {.      a one a
32c0: 20 49 20 61 20 31 20 61 20 6f 6e 65 20 61 20 49   I a 1 a one a I
32d0: 20 62 20 32 20 61 20 6f 6e 65 20 62 20 49 49 20   b 2 a one b II 
32e0: 61 20 31 20 0a 20 20 20 20 20 20 61 20 6f 6e 65  a 1 .      a one
32f0: 20 62 20 49 49 20 62 20 32 20 61 20 6f 6e 65 20   b II b 2 a one 
3300: 63 20 49 49 49 20 61 20 31 20 61 20 6f 6e 65 20  c III a 1 a one 
3310: 63 20 49 49 49 20 62 20 32 20 0a 20 20 20 20 20  c III b 2 .     
3320: 20 62 20 74 77 6f 20 61 20 49 20 61 20 31 20 62   b two a I a 1 b
3330: 20 74 77 6f 20 61 20 49 20 62 20 32 20 62 20 74   two a I b 2 b t
3340: 77 6f 20 62 20 49 49 20 61 20 31 20 0a 20 20 20  wo b II a 1 .   
3350: 20 20 20 62 20 74 77 6f 20 62 20 49 49 20 62 20     b two b II b 
3360: 32 20 62 20 74 77 6f 20 63 20 49 49 49 20 61 20  2 b two c III a 
3370: 31 20 62 20 74 77 6f 20 63 20 49 49 49 20 62 20  1 b two c III b 
3380: 32 20 0a 20 20 20 20 20 20 63 20 74 68 72 65 65  2 .      c three
3390: 20 61 20 49 20 61 20 31 20 63 20 74 68 72 65 65   a I a 1 c three
33a0: 20 61 20 49 20 62 20 32 20 63 20 74 68 72 65 65   a I b 2 c three
33b0: 20 62 20 49 49 20 61 20 31 20 0a 20 20 20 20 20   b II a 1 .     
33c0: 20 63 20 74 68 72 65 65 20 62 20 49 49 20 62 20   c three b II b 
33d0: 32 20 63 20 74 68 72 65 65 20 63 20 49 49 49 20  2 c three c III 
33e0: 61 20 31 20 63 20 74 68 72 65 65 20 63 20 49 49  a 1 c three c II
33f0: 49 20 62 20 32 0a 20 20 7d 0a 7d 0a 0a 23 0a 23  I b 2.  }.}..#.#
3400: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3410: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
3420: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 2a 20 2d  e_select-1.4.* -
3430: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20 64   test that the d
3440: 65 73 63 72 69 70 74 69 6f 6e 0a 23 20 6f 66 20  escription.# of 
3450: 63 61 72 74 65 73 69 61 6e 20 6a 6f 69 6e 73 20  cartesian joins 
3460: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 64 6f  in the SELECT do
3470: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 63  cumentation is c
3480: 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 53  onsistent with S
3490: 51 4c 69 74 65 2e 0a 23 20 49 6e 20 64 6f 69 6e  QLite..# In doin
34a0: 67 20 73 6f 2c 20 77 65 20 74 65 73 74 20 74 68  g so, we test th
34b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
34c0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 61  e requirements a
34d0: 73 20 61 20 73 69 64 65 2d 65 66 66 65 63 74 3a  s a side-effect:
34e0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
34f0: 3a 20 52 2d 34 36 31 32 32 2d 31 34 39 33 30 20  : R-46122-14930 
3500: 49 66 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 20 69  If the join-op i
3510: 73 20 22 43 52 4f 53 53 20 4a 4f 49 4e 22 2c 20  s "CROSS JOIN", 
3520: 22 49 4e 4e 45 52 0a 23 20 4a 4f 49 4e 22 2c 20  "INNER.# JOIN", 
3530: 22 4a 4f 49 4e 22 20 6f 72 20 61 20 63 6f 6d 6d  "JOIN" or a comm
3540: 61 20 28 22 2c 22 29 20 61 6e 64 20 74 68 65 72  a (",") and ther
3550: 65 20 69 73 20 6e 6f 20 4f 4e 20 6f 72 20 55 53  e is no ON or US
3560: 49 4e 47 20 63 6c 61 75 73 65 2c 0a 23 20 74 68  ING clause,.# th
3570: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
3580: 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 73 69 6d   the join is sim
3590: 70 6c 79 20 74 68 65 20 63 61 72 74 65 73 69 61  ply the cartesia
35a0: 6e 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  n product of the
35b0: 0a 23 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  .# left and righ
35c0: 74 2d 68 61 6e 64 20 64 61 74 61 73 65 74 73 2e  t-hand datasets.
35d0: 0a 23 0a 23 20 20 20 20 54 68 65 20 74 65 73 74  .#.#    The test
35e0: 73 20 61 72 65 20 62 75 69 6c 74 20 6f 6e 20 74  s are built on t
35f0: 68 69 73 20 61 73 73 65 72 74 69 6f 6e 2e 20 52  his assertion. R
3600: 65 61 6c 6c 79 2c 20 74 68 65 79 20 74 65 73 74  eally, they test
3610: 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
3620: 0a 23 20 20 20 20 6f 66 20 61 20 43 52 4f 53 53  .#    of a CROSS
3630: 20 4a 4f 49 4e 2c 20 4a 4f 49 4e 2c 20 49 4e 4e   JOIN, JOIN, INN
3640: 45 52 20 4a 4f 49 4e 20 6f 72 20 22 2c 22 20 6a  ER JOIN or "," j
3650: 6f 69 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20  oin matches the 
3660: 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 0a  expected result.
3670: 23 20 20 20 20 6f 66 20 63 61 6c 63 75 6c 61 74  #    of calculat
3680: 69 6e 67 20 74 68 65 20 63 61 72 74 65 73 69 61  ing the cartesia
3690: 6e 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  n product of the
36a0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 2d   left and right-
36b0: 68 61 6e 64 20 64 61 74 61 73 65 74 73 2e 20 0a  hand datasets. .
36c0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
36d0: 20 52 2d 34 36 32 35 36 2d 35 37 32 34 33 20 54   R-46256-57243 T
36e0: 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
36f0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
3700: 65 20 22 49 4e 4e 45 52 0a 23 20 4a 4f 49 4e 22  e "INNER.# JOIN"
3710: 2c 20 22 4a 4f 49 4e 22 20 61 6e 64 20 22 2c 22  , "JOIN" and ","
3720: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 2e   join operators.
3730: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3740: 3a 20 52 2d 30 37 35 34 34 2d 32 34 31 35 35 20  : R-07544-24155 
3750: 54 68 65 20 22 43 52 4f 53 53 20 4a 4f 49 4e 22  The "CROSS JOIN"
3760: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 70   join operator p
3770: 72 6f 64 75 63 65 73 20 74 68 65 0a 23 20 73 61  roduces the.# sa
3780: 6d 65 20 64 61 74 61 20 61 73 20 74 68 65 20 22  me data as the "
3790: 49 4e 4e 45 52 20 4a 4f 49 4e 22 2c 20 22 4a 4f  INNER JOIN", "JO
37a0: 49 4e 22 20 61 6e 64 20 22 2c 22 20 6f 70 65 72  IN" and "," oper
37b0: 61 74 6f 72 73 0a 23 0a 23 20 20 20 20 41 6c 6c  ators.#.#    All
37c0: 20 74 65 73 74 73 20 61 72 65 20 72 75 6e 20 34   tests are run 4
37d0: 20 74 69 6d 65 73 2c 20 77 69 74 68 20 74 68 65   times, with the
37e0: 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
37f0: 20 69 6e 20 65 61 63 68 20 72 75 6e 20 62 65 69   in each run bei
3800: 6e 67 0a 23 20 20 20 20 77 68 69 63 68 20 6f 66  ng.#    which of
3810: 20 74 68 65 20 34 20 65 71 75 69 76 61 6c 65 6e   the 4 equivalen
3820: 74 20 63 61 72 74 65 73 69 61 6e 20 70 72 6f 64  t cartesian prod
3830: 75 63 74 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  uct join operato
3840: 72 73 20 61 72 65 20 75 73 65 64 2e 0a 23 20 20  rs are used..#  
3850: 20 20 53 69 6e 63 65 20 74 68 65 20 6f 75 74 70    Since the outp
3860: 75 74 20 64 61 74 61 20 69 73 20 74 68 65 20 73  ut data is the s
3870: 61 6d 65 20 69 6e 20 61 6c 6c 20 63 61 73 65 73  ame in all cases
3880: 2c 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  , we consider th
3890: 61 74 20 74 68 69 73 0a 23 20 20 20 20 71 75 61  at this.#    qua
38a0: 6c 69 66 69 65 73 20 61 73 20 74 65 73 74 69 6e  lifies as testin
38b0: 67 20 74 68 65 20 74 77 6f 20 73 74 61 74 65 6d  g the two statem
38c0: 65 6e 74 73 20 61 62 6f 76 65 2e 0a 23 0a 64 6f  ents above..#.do
38d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
38e0: 73 65 6c 65 63 74 2d 31 2e 34 2e 30 20 7b 0a 20  select-1.4.0 {. 
38f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
3900: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
3910: 20 54 41 42 4c 45 20 78 32 28 63 2c 20 64 2c 20   TABLE x2(c, d, 
3920: 65 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  e);.  CREATE TAB
3930: 4c 45 20 78 33 28 66 2c 20 67 2c 20 68 2c 20 69  LE x3(f, g, h, i
3940: 29 3b 0a 0a 20 20 2d 2d 20 78 31 3a 20 33 20 72  );..  -- x1: 3 r
3950: 6f 77 73 2c 20 32 20 63 6f 6c 75 6d 6e 73 0a 20  ows, 2 columns. 
3960: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
3970: 56 41 4c 55 45 53 28 32 34 2c 20 27 63 6f 6e 76  VALUES(24, 'conv
3980: 65 72 67 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45  erging');.  INSE
3990: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
39a0: 53 28 4e 55 4c 4c 2c 20 58 27 43 42 37 31 27 29  S(NULL, X'CB71')
39b0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
39c0: 78 31 20 56 41 4c 55 45 53 28 27 62 6c 6f 6e 64  x1 VALUES('blond
39d0: 73 27 2c 20 27 70 72 6f 70 72 69 65 74 61 72 79  s', 'proprietary
39e0: 27 29 3b 0a 0a 20 20 2d 2d 20 78 32 3a 20 32 20  ');..  -- x2: 2 
39f0: 72 6f 77 73 2c 20 33 20 63 6f 6c 75 6d 6e 73 0a  rows, 3 columns.
3a00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
3a10: 20 56 41 4c 55 45 53 28 2d 36 30 2e 30 36 2c 20   VALUES(-60.06, 
3a20: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  NULL, NULL);.  I
3a30: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
3a40: 4c 55 45 53 28 2d 35 38 2c 20 4e 55 4c 4c 2c 20  LUES(-58, NULL, 
3a50: 31 2e 32 31 29 3b 0a 0a 20 20 2d 2d 20 78 33 3a  1.21);..  -- x3:
3a60: 20 35 20 72 6f 77 73 2c 20 34 20 63 6f 6c 75 6d   5 rows, 4 colum
3a70: 6e 73 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ns.  INSERT INTO
3a80: 20 78 33 20 56 41 4c 55 45 53 28 2d 33 39 2e 32   x3 VALUES(-39.2
3a90: 34 2c 20 4e 55 4c 4c 2c 20 27 65 6e 63 6f 6d 70  4, NULL, 'encomp
3aa0: 61 73 73 27 2c 20 2d 31 29 3b 0a 20 20 49 4e 53  ass', -1);.  INS
3ab0: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
3ac0: 45 53 28 27 70 72 65 73 65 6e 74 69 6e 67 27 2c  ES('presenting',
3ad0: 20 35 31 2c 20 27 72 65 66 6f 72 6d 61 74 69 6f   51, 'reformatio
3ae0: 6e 27 2c 20 27 64 69 67 6e 69 66 69 65 64 27 29  n', 'dignified')
3af0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3b00: 78 33 20 56 41 4c 55 45 53 28 27 63 6f 6e 64 75  x3 VALUES('condu
3b10: 63 74 69 6e 67 27 2c 20 2d 38 37 2e 32 34 2c 20  cting', -87.24, 
3b20: 33 37 2e 35 36 2c 20 4e 55 4c 4c 29 3b 0a 20 20  37.56, NULL);.  
3b30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 33 20 56  INSERT INTO x3 V
3b40: 41 4c 55 45 53 28 27 63 6f 6c 64 65 73 74 27 2c  ALUES('coldest',
3b50: 20 2d 39 36 2c 20 27 64 72 61 6d 61 74 69 73 74   -96, 'dramatist
3b60: 73 27 2c 20 38 32 2e 33 29 3b 0a 20 20 49 4e 53  s', 82.3);.  INS
3b70: 45 52 54 20 49 4e 54 4f 20 78 33 20 56 41 4c 55  ERT INTO x3 VALU
3b80: 45 53 28 27 61 6c 65 72 74 69 6e 67 27 2c 20 4e  ES('alerting', N
3b90: 55 4c 4c 2c 20 2d 39 33 2e 37 39 2c 20 4e 55 4c  ULL, -93.79, NUL
3ba0: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
3bb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 30 38 39  ENCE-OF: R-59089
3bc0: 2d 32 35 38 32 38 20 54 68 65 20 63 6f 6c 75 6d  -25828 The colum
3bd0: 6e 73 20 6f 66 20 74 68 65 20 63 61 72 74 65 73  ns of the cartes
3be0: 69 61 6e 20 70 72 6f 64 75 63 74 0a 23 20 64 61  ian product.# da
3bf0: 74 61 73 65 74 20 61 72 65 2c 20 69 6e 20 6f 72  taset are, in or
3c00: 64 65 72 2c 20 61 6c 6c 20 74 68 65 20 63 6f 6c  der, all the col
3c10: 75 6d 6e 73 20 6f 66 20 74 68 65 20 6c 65 66 74  umns of the left
3c20: 2d 68 61 6e 64 20 64 61 74 61 73 65 74 0a 23 20  -hand dataset.# 
3c30: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6c 6c 20  followed by all 
3c40: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
3c50: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 64 61  he right-hand da
3c60: 74 61 73 65 74 2e 0a 23 0a 64 6f 5f 6a 6f 69 6e  taset..#.do_join
3c70: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3c80: 2e 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  .4.1.1 {.  SELEC
3c90: 54 20 2a 20 46 52 4f 4d 20 78 31 20 25 4a 4f 49  T * FROM x1 %JOI
3ca0: 4e 25 20 78 32 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x2 LIMIT 1.} 
3cb0: 5b 63 6f 6e 63 61 74 20 7b 32 34 20 63 6f 6e 76  [concat {24 conv
3cc0: 65 72 67 69 6e 67 7d 20 7b 2d 36 30 2e 30 36 20  erging} {-60.06 
3cd0: 7b 7d 20 7b 7d 7d 5d 0a 0a 64 6f 5f 6a 6f 69 6e  {} {}}]..do_join
3ce0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3cf0: 2e 34 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  .4.1.2 {.  SELEC
3d00: 54 20 2a 20 46 52 4f 4d 20 78 32 20 25 4a 4f 49  T * FROM x2 %JOI
3d10: 4e 25 20 78 31 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x1 LIMIT 1.} 
3d20: 5b 63 6f 6e 63 61 74 20 7b 2d 36 30 2e 30 36 20  [concat {-60.06 
3d30: 7b 7d 20 7b 7d 7d 20 7b 32 34 20 63 6f 6e 76 65  {} {}} {24 conve
3d40: 72 67 69 6e 67 7d 5d 0a 0a 64 6f 5f 6a 6f 69 6e  rging}]..do_join
3d50: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 31  _test e_select-1
3d60: 2e 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  .4.1.3 {.  SELEC
3d70: 54 20 2a 20 46 52 4f 4d 20 78 33 20 25 4a 4f 49  T * FROM x3 %JOI
3d80: 4e 25 20 78 32 20 4c 49 4d 49 54 20 31 0a 7d 20  N% x2 LIMIT 1.} 
3d90: 5b 63 6f 6e 63 61 74 20 7b 2d 33 39 2e 32 34 20  [concat {-39.24 
3da0: 7b 7d 20 65 6e 63 6f 6d 70 61 73 73 20 2d 31 7d  {} encompass -1}
3db0: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 5d   {-60.06 {} {}}]
3dc0: 0a 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65  ..do_join_test e
3dd0: 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 31 2e 34 20  _select-1.4.1.4 
3de0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3df0: 4d 20 78 32 20 25 4a 4f 49 4e 25 20 78 33 20 4c  M x2 %JOIN% x3 L
3e00: 49 4d 49 54 20 31 0a 7d 20 5b 63 6f 6e 63 61 74  IMIT 1.} [concat
3e10: 20 7b 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 7d 20   {-60.06 {} {}} 
3e20: 7b 2d 33 39 2e 32 34 20 7b 7d 20 65 6e 63 6f 6d  {-39.24 {} encom
3e30: 70 61 73 73 20 2d 31 7d 5d 0a 0a 23 20 45 56 49  pass -1}]..# EVI
3e40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 34 31  DENCE-OF: R-4441
3e50: 34 2d 35 34 37 31 30 20 54 68 65 72 65 20 69 73  4-54710 There is
3e60: 20 61 20 72 6f 77 20 69 6e 20 74 68 65 20 63 61   a row in the ca
3e70: 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63 74 0a  rtesian product.
3e80: 23 20 64 61 74 61 73 65 74 20 66 6f 72 6d 65 64  # dataset formed
3e90: 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 65 61   by combining ea
3ea0: 63 68 20 75 6e 69 71 75 65 20 63 6f 6d 62 69 6e  ch unique combin
3eb0: 61 74 69 6f 6e 20 6f 66 20 61 20 72 6f 77 20 66  ation of a row f
3ec0: 72 6f 6d 20 74 68 65 0a 23 20 6c 65 66 74 2d 68  rom the.# left-h
3ed0: 61 6e 64 20 61 6e 64 20 72 69 67 68 74 2d 68 61  and and right-ha
3ee0: 6e 64 20 64 61 74 61 73 65 74 73 2e 0a 23 0a 64  nd datasets..#.d
3ef0: 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65  o_join_test e_se
3f00: 6c 65 63 74 2d 31 2e 34 2e 32 2e 31 20 7b 0a 20  lect-1.4.2.1 {. 
3f10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
3f20: 32 20 25 4a 4f 49 4e 25 20 78 33 0a 7d 20 5b 6c  2 %JOIN% x3.} [l
3f30: 69 73 74 20 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d  ist -60.06 {} {}
3f40: 20 20 20 20 20 20 2d 33 39 2e 32 34 20 7b 7d 20        -39.24 {} 
3f50: 65 6e 63 6f 6d 70 61 73 73 20 2d 31 20 20 20 20  encompass -1    
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3f70: 20 20 20 20 20 20 20 2d 36 30 2e 30 36 20 7b 7d         -60.06 {}
3f80: 20 7b 7d 20 20 20 20 20 20 70 72 65 73 65 6e 74   {}      present
3f90: 69 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74 69  ing 51 reformati
3fa0: 6f 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20 20  on dignified    
3fb0: 5c 0a 20 20 20 20 20 20 20 20 2d 36 30 2e 30 36  \.        -60.06
3fc0: 20 7b 7d 20 7b 7d 20 20 20 20 20 20 63 6f 6e 64   {} {}      cond
3fd0: 75 63 74 69 6e 67 20 2d 38 37 2e 32 34 20 33 37  ucting -87.24 37
3fe0: 2e 35 36 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .56 {}          
3ff0: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 36 30     \.        -60
4000: 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20 20 20 63  .06 {} {}      c
4010: 6f 6c 64 65 73 74 20 2d 39 36 20 64 72 61 6d 61  oldest -96 drama
4020: 74 69 73 74 73 20 38 32 2e 33 20 20 20 20 20 20  tists 82.3      
4030: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
4040: 2d 36 30 2e 30 36 20 7b 7d 20 7b 7d 20 20 20 20  -60.06 {} {}    
4050: 20 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39    alerting {} -9
4060: 33 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20  3.79 {}         
4070: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
4080: 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32 31 20 20     -58 {} 1.21  
4090: 20 20 20 20 20 2d 33 39 2e 32 34 20 7b 7d 20 65       -39.24 {} e
40a0: 6e 63 6f 6d 70 61 73 73 20 2d 31 20 20 20 20 20  ncompass -1     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
40c0: 20 20 20 20 20 20 2d 35 38 20 7b 7d 20 31 2e 32        -58 {} 1.2
40d0: 31 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 69  1       presenti
40e0: 6e 67 20 35 31 20 72 65 66 6f 72 6d 61 74 69 6f  ng 51 reformatio
40f0: 6e 20 64 69 67 6e 69 66 69 65 64 20 20 20 20 5c  n dignified    \
4100: 0a 20 20 20 20 20 20 20 20 2d 35 38 20 7b 7d 20  .        -58 {} 
4110: 31 2e 32 31 20 20 20 20 20 20 20 63 6f 6e 64 75  1.21       condu
4120: 63 74 69 6e 67 20 2d 38 37 2e 32 34 20 33 37 2e  cting -87.24 37.
4130: 35 36 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20  56 {}           
4140: 20 20 5c 0a 20 20 20 20 20 20 20 20 2d 35 38 20    \.        -58 
4150: 7b 7d 20 31 2e 32 31 20 20 20 20 20 20 20 63 6f  {} 1.21       co
4160: 6c 64 65 73 74 20 2d 39 36 20 64 72 61 6d 61 74  ldest -96 dramat
4170: 69 73 74 73 20 38 32 2e 33 20 20 20 20 20 20 20  ists 82.3       
4180: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 2d       \.        -
4190: 35 38 20 7b 7d 20 31 2e 32 31 20 20 20 20 20 20  58 {} 1.21      
41a0: 20 61 6c 65 72 74 69 6e 67 20 7b 7d 20 2d 39 33   alerting {} -93
41b0: 2e 37 39 20 7b 7d 20 20 20 20 20 20 20 20 20 20  .79 {}          
41c0: 20 20 20 20 20 20 20 20 5c 0a 5d 0a 23 20 54 4f          \.].# TO
41d0: 44 4f 3a 20 43 6f 6d 65 20 62 61 63 6b 20 61 6e  DO: Come back an
41e0: 64 20 61 64 64 20 61 20 66 65 77 20 6d 6f 72 65  d add a few more
41f0: 20 6c 69 6b 65 20 74 68 65 20 61 62 6f 76 65 2e   like the above.
4200: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
4210: 20 52 2d 32 30 36 35 39 2d 34 33 32 36 37 20 49   R-20659-43267 I
4220: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
4230: 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  f the left-hand 
4240: 64 61 74 61 73 65 74 0a 23 20 63 6f 6e 73 69 73  dataset.# consis
4250: 74 73 20 6f 66 20 4e 6c 68 73 20 72 6f 77 73 20  ts of Nlhs rows 
4260: 6f 66 20 4d 6c 68 73 20 63 6f 6c 75 6d 6e 73 2c  of Mlhs columns,
4270: 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 2d 68   and the right-h
4280: 61 6e 64 20 64 61 74 61 73 65 74 20 6f 66 0a 23  and dataset of.#
4290: 20 4e 72 68 73 20 72 6f 77 73 20 6f 66 20 4d 72   Nrhs rows of Mr
42a0: 68 73 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  hs columns, then
42b0: 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20 70   the cartesian p
42c0: 72 6f 64 75 63 74 20 69 73 20 61 20 64 61 74 61  roduct is a data
42d0: 73 65 74 20 6f 66 0a 23 20 4e 6c 68 73 2e 4e 72  set of.# Nlhs.Nr
42e0: 68 73 20 72 6f 77 73 2c 20 65 61 63 68 20 63 6f  hs rows, each co
42f0: 6e 74 61 69 6e 69 6e 67 20 4d 6c 68 73 2b 4d 72  ntaining Mlhs+Mr
4300: 68 73 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20  hs columns..#.# 
4310: 78 31 2c 20 78 32 20 20 20 20 28 4e 6c 68 73 3d  x1, x2    (Nlhs=
4320: 33 2c 20 4e 72 68 73 3d 32 29 20 20 20 28 4d 6c  3, Nrhs=2)   (Ml
4330: 68 73 3d 32 2c 20 4d 72 68 73 3d 33 29 0a 64 6f  hs=2, Mrhs=3).do
4340: 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c  _join_test e_sel
4350: 65 63 74 2d 31 2e 34 2e 33 2e 31 20 7b 20 0a 20  ect-1.4.3.1 { . 
4360: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
4370: 20 46 52 4f 4d 20 78 31 20 25 4a 4f 49 4e 25 20   FROM x1 %JOIN% 
4380: 78 32 20 0a 7d 20 5b 65 78 70 72 20 33 2a 32 5d  x2 .} [expr 3*2]
4390: 0a 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  .do_test e_selec
43a0: 74 2d 31 2e 34 2e 33 2e 32 20 7b 20 0a 20 20 65  t-1.4.3.2 { .  e
43b0: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65  xpr {[llength [e
43c0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
43d0: 20 46 52 4f 4d 20 78 31 2c 20 78 32 7d 5d 5d 20   FROM x1, x2}]] 
43e0: 2f 20 36 7d 0a 7d 20 5b 65 78 70 72 20 32 2b 33  / 6}.} [expr 2+3
43f0: 5d 0a 0a 23 20 78 32 2c 20 78 33 20 20 20 20 28  ]..# x2, x3    (
4400: 4e 6c 68 73 3d 32 2c 20 4e 72 68 73 3d 35 29 20  Nlhs=2, Nrhs=5) 
4410: 20 20 28 4d 6c 68 73 3d 33 2c 20 4d 72 68 73 3d    (Mlhs=3, Mrhs=
4420: 34 29 0a 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20  4).do_join_test 
4430: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 33 2e 33  e_select-1.4.3.3
4440: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 63 6f 75   { .  SELECT cou
4450: 6e 74 28 2a 29 20 46 52 4f 4d 20 78 32 20 25 4a  nt(*) FROM x2 %J
4460: 4f 49 4e 25 20 78 33 20 0a 7d 20 5b 65 78 70 72  OIN% x3 .} [expr
4470: 20 32 2a 35 5d 0a 64 6f 5f 74 65 73 74 20 65 5f   2*5].do_test e_
4480: 73 65 6c 65 63 74 2d 31 2e 34 2e 33 2e 34 20 7b  select-1.4.3.4 {
4490: 20 0a 20 20 65 78 70 72 20 7b 5b 6c 6c 65 6e 67   .  expr {[lleng
44a0: 74 68 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  th [execsql {SEL
44b0: 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 4a 4f  ECT * FROM x2 JO
44c0: 49 4e 20 78 33 7d 5d 5d 20 2f 20 31 30 7d 0a 7d  IN x3}]] / 10}.}
44d0: 20 5b 65 78 70 72 20 33 2b 34 5d 0a 0a 23 20 78   [expr 3+4]..# x
44e0: 33 2c 20 78 31 20 20 20 20 28 4e 6c 68 73 3d 35  3, x1    (Nlhs=5
44f0: 2c 20 4e 72 68 73 3d 33 29 20 20 20 28 4d 6c 68  , Nrhs=3)   (Mlh
4500: 73 3d 34 2c 20 4d 72 68 73 3d 32 29 0a 64 6f 5f  s=4, Mrhs=2).do_
4510: 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65  join_test e_sele
4520: 63 74 2d 31 2e 34 2e 33 2e 35 20 7b 20 0a 20 20  ct-1.4.3.5 { .  
4530: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4540: 46 52 4f 4d 20 78 33 20 25 4a 4f 49 4e 25 20 78  FROM x3 %JOIN% x
4550: 31 20 0a 7d 20 5b 65 78 70 72 20 35 2a 33 5d 0a  1 .} [expr 5*3].
4560: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
4570: 2d 31 2e 34 2e 33 2e 36 20 7b 20 0a 20 20 65 78  -1.4.3.6 { .  ex
4580: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65 78  pr {[llength [ex
4590: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
45a0: 46 52 4f 4d 20 78 33 20 43 52 4f 53 53 20 4a 4f  FROM x3 CROSS JO
45b0: 49 4e 20 78 31 7d 5d 5d 20 2f 20 31 35 7d 0a 7d  IN x1}]] / 15}.}
45c0: 20 5b 65 78 70 72 20 34 2b 32 5d 0a 0a 23 20 78   [expr 4+2]..# x
45d0: 33 2c 20 78 33 20 20 20 20 28 4e 6c 68 73 3d 35  3, x3    (Nlhs=5
45e0: 2c 20 4e 72 68 73 3d 35 29 20 20 20 28 4d 6c 68  , Nrhs=5)   (Mlh
45f0: 73 3d 34 2c 20 4d 72 68 73 3d 34 29 0a 64 6f 5f  s=4, Mrhs=4).do_
4600: 6a 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65  join_test e_sele
4610: 63 74 2d 31 2e 34 2e 33 2e 37 20 7b 20 0a 20 20  ct-1.4.3.7 { .  
4620: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4630: 46 52 4f 4d 20 78 33 20 25 4a 4f 49 4e 25 20 78  FROM x3 %JOIN% x
4640: 33 20 0a 7d 20 5b 65 78 70 72 20 35 2a 35 5d 0a  3 .} [expr 5*5].
4650: 64 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  do_test e_select
4660: 2d 31 2e 34 2e 33 2e 38 20 7b 20 0a 20 20 65 78  -1.4.3.8 { .  ex
4670: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 65 78  pr {[llength [ex
4680: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  ecsql {SELECT * 
4690: 46 52 4f 4d 20 78 33 20 49 4e 4e 45 52 20 4a 4f  FROM x3 INNER JO
46a0: 49 4e 20 78 33 20 41 53 20 78 34 7d 5d 5d 20 2f  IN x3 AS x4}]] /
46b0: 20 32 35 7d 0a 7d 20 5b 65 78 70 72 20 34 2b 34   25}.} [expr 4+4
46c0: 5d 0a 0a 23 20 53 6f 6d 65 20 65 78 74 72 61 20  ]..# Some extra 
46d0: 63 61 72 74 65 73 69 61 6e 20 70 72 6f 64 75 63  cartesian produc
46e0: 74 20 74 65 73 74 73 20 75 73 69 6e 67 20 74 61  t tests using ta
46f0: 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 2e 0a  bles t1 and t2..
4700: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
4710: 74 20 65 5f 73 65 6c 65 63 74 2d 31 2e 34 2e 34  t e_select-1.4.4
4720: 2e 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .1 { SELECT * FR
4730: 4f 4d 20 74 31 2c 20 74 32 20 7d 20 24 74 31 5f  OM t1, t2 } $t1_
4740: 63 72 6f 73 73 5f 74 32 0a 64 6f 5f 65 78 65 63  cross_t2.do_exec
4750: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
4760: 74 2d 31 2e 34 2e 34 2e 32 20 7b 20 53 45 4c 45  t-1.4.4.2 { SELE
4770: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 41 53 20  CT * FROM t1 AS 
4780: 78 2c 20 74 31 20 41 53 20 79 7d 20 24 74 31 5f  x, t1 AS y} $t1_
4790: 63 72 6f 73 73 5f 74 31 0a 0a 64 6f 5f 73 65 6c  cross_t1..do_sel
47a0: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
47b0: 63 74 2d 31 2e 34 2e 35 20 5b 6c 69 73 74 20 20  ct-1.4.5 [list  
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 5c 0a 20 20 20 20 31 20 7b 20 53 45 4c 45 43   \.    1 { SELEC
47f0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 43 52 4f 53  T * FROM t1 CROS
4800: 53 20 4a 4f 49 4e 20 74 32 20 7d 20 20 20 20 20  S JOIN t2 }     
4810: 20 20 20 20 20 20 24 74 31 5f 63 72 6f 73 73 5f        $t1_cross_
4820: 74 32 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20  t2        \.    
4830: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
4840: 4d 20 74 31 20 41 53 20 79 20 43 52 4f 53 53 20  M t1 AS y CROSS 
4850: 4a 4f 49 4e 20 74 31 20 41 53 20 78 20 7d 20 24  JOIN t1 AS x } $
4860: 74 31 5f 63 72 6f 73 73 5f 74 31 20 20 20 20 20  t1_cross_t1     
4870: 20 20 20 5c 0a 20 20 20 20 33 20 7b 20 53 45 4c     \.    3 { SEL
4880: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e  ECT * FROM t1 IN
4890: 4e 45 52 20 4a 4f 49 4e 20 74 32 20 7d 20 20 20  NER JOIN t2 }   
48a0: 20 20 20 20 20 20 20 20 24 74 31 5f 63 72 6f 73          $t1_cros
48b0: 73 5f 74 32 20 20 20 20 20 20 20 20 5c 0a 20 20  s_t2        \.  
48c0: 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46    4 { SELECT * F
48d0: 52 4f 4d 20 74 31 20 41 53 20 79 20 49 4e 4e 45  ROM t1 AS y INNE
48e0: 52 20 4a 4f 49 4e 20 74 31 20 41 53 20 78 20 7d  R JOIN t1 AS x }
48f0: 20 24 74 31 5f 63 72 6f 73 73 5f 74 31 20 20 20   $t1_cross_t1   
4900: 20 20 20 20 20 5c 0a 5d 0a 0a 0a 23 20 45 56 49       \.]...# EVI
4910: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 37  DENCE-OF: R-2277
4920: 35 2d 35 36 34 39 36 20 49 66 20 74 68 65 72 65  5-56496 If there
4930: 20 69 73 20 61 6e 20 4f 4e 20 63 6c 61 75 73 65   is an ON clause
4940: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
4950: 0a 23 20 74 68 65 20 4f 4e 20 65 78 70 72 65 73  .# the ON expres
4960: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
4970: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  d for each row o
4980: 66 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 20  f the cartesian 
4990: 70 72 6f 64 75 63 74 0a 23 20 61 73 20 61 20 62  product.# as a b
49a0: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
49b0: 6e 2e 20 41 6c 6c 20 72 6f 77 73 20 66 6f 72 20  n. All rows for 
49c0: 77 68 69 63 68 20 74 68 65 20 65 78 70 72 65 73  which the expres
49d0: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 0a 23  sion evaluates.#
49e0: 20 74 6f 20 66 61 6c 73 65 20 61 72 65 20 65 78   to false are ex
49f0: 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
4a00: 64 61 74 61 73 65 74 2e 0a 23 0a 66 6f 72 65 61  dataset..#.forea
4a10: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65  ch {tn select re
4a20: 73 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  s} [list        
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 20 20 5c 0a 20 20 20 20 31 20 7b 20        \.    1 { 
4a60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4a70: 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 31   %JOIN% t2 ON (1
4a80: 29 20 7d 20 20 20 20 20 20 20 24 74 31 5f 63 72  ) }       $t1_cr
4a90: 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20 20 20  oss_t2          
4aa0: 20 20 20 5c 0a 20 20 20 20 32 20 7b 20 53 45 4c     \.    2 { SEL
4ab0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a  ECT * FROM t1 %J
4ac0: 4f 49 4e 25 20 74 32 20 4f 4e 20 28 30 29 20 7d  OIN% t2 ON (0) }
4ad0: 20 20 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20         [list]   
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 5c 0a 20 20 20 20 33 20 7b 20 53 45 4c 45 43 54  \.    3 { SELECT
4b00: 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e   * FROM t1 %JOIN
4b10: 25 20 74 32 20 4f 4e 20 28 4e 55 4c 4c 29 20 7d  % t2 ON (NULL) }
4b20: 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20 20      [list]      
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4b40: 20 20 20 34 20 7b 20 53 45 4c 45 43 54 20 2a 20     4 { SELECT * 
4b50: 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74  FROM t1 %JOIN% t
4b60: 32 20 4f 4e 20 28 27 61 62 63 27 29 20 7d 20 20  2 ON ('abc') }  
4b70: 20 5b 6c 69 73 74 5d 20 20 20 20 20 20 20 20 20   [list]         
4b80: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
4b90: 35 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  5 { SELECT * FRO
4ba0: 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f  M t1 %JOIN% t2 O
4bb0: 4e 20 28 27 31 61 62 27 29 20 7d 20 20 20 24 74  N ('1ab') }   $t
4bc0: 31 5f 63 72 6f 73 73 5f 74 32 20 20 20 20 20 20  1_cross_t2      
4bd0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 36 20 7b         \.    6 {
4be0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4bf0: 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28  1 %JOIN% t2 ON (
4c00: 30 2e 39 29 20 7d 20 20 20 20 20 24 74 31 5f 63  0.9) }     $t1_c
4c10: 72 6f 73 73 5f 74 32 20 20 20 20 20 20 20 20 20  ross_t2         
4c20: 20 20 20 20 5c 0a 20 20 20 20 37 20 7b 20 53 45      \.    7 { SE
4c30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25  LECT * FROM t1 %
4c40: 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 27 30 2e  JOIN% t2 ON ('0.
4c50: 39 27 29 20 7d 20 20 20 24 74 31 5f 63 72 6f 73  9') }   $t1_cros
4c60: 73 5f 74 32 20 20 20 20 20 20 20 20 20 20 20 20  s_t2            
4c70: 20 5c 0a 20 20 20 20 38 20 7b 20 53 45 4c 45 43   \.    8 { SELEC
4c80: 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49  T * FROM t1 %JOI
4c90: 4e 25 20 74 32 20 4f 4e 20 28 30 2e 30 29 20 7d  N% t2 ON (0.0) }
4ca0: 20 20 20 20 20 5b 6c 69 73 74 5d 20 20 20 20 20       [list]     
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20             \.   
4d10: 20 39 20 7b 20 53 45 4c 45 43 54 20 74 31 2e 62   9 { SELECT t1.b
4d20: 2c 20 74 32 2e 62 20 46 52 4f 4d 20 74 31 20 25  , t2.b FROM t1 %
4d30: 4a 4f 49 4e 25 20 74 32 20 4f 4e 20 28 74 31 2e  JOIN% t2 ON (t1.
4d40: 61 20 3d 20 74 32 2e 61 29 20 7d 20 20 20 20 20  a = t2.a) }     
4d50: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
4d60: 7b 6f 6e 65 20 49 20 74 77 6f 20 49 49 20 74 68  {one I two II th
4d70: 72 65 65 20 49 49 49 7d 20 20 20 20 20 20 20 20  ree III}        
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 5c 0a 20 20 20 31 30 20 7b 20 53       \.   10 { S
4db0: 45 4c 45 43 54 20 74 31 2e 62 2c 20 74 32 2e 62  ELECT t1.b, t2.b
4dc0: 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49 4e 25 20   FROM t1 %JOIN% 
4dd0: 74 32 20 4f 4e 20 28 74 31 2e 61 20 3d 20 27 61  t2 ON (t1.a = 'a
4de0: 27 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  ') }            
4df0: 20 20 5c 0a 20 20 20 20 20 20 7b 6f 6e 65 20 49    \.      {one I
4e00: 20 6f 6e 65 20 49 49 20 6f 6e 65 20 49 49 49 7d   one II one III}
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4e40: 0a 20 20 20 31 31 20 7b 20 53 45 4c 45 43 54 20  .   11 { SELECT 
4e50: 74 31 2e 62 2c 20 74 32 2e 62 20 0a 20 20 20 20  t1.b, t2.b .    
4e60: 20 20 20 20 46 52 4f 4d 20 74 31 20 25 4a 4f 49      FROM t1 %JOI
4e70: 4e 25 20 74 32 20 4f 4e 20 28 43 41 53 45 20 57  N% t2 ON (CASE W
4e80: 48 45 4e 20 74 31 2e 61 20 3d 20 27 61 27 20 54  HEN t1.a = 'a' T
4e90: 48 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 31 20  HEN NULL ELSE 1 
4ea0: 45 4e 44 29 20 7d 20 5c 0a 20 20 20 20 20 20 7b  END) } \.      {
4eb0: 74 77 6f 20 49 20 74 77 6f 20 49 49 20 74 77 6f  two I two II two
4ec0: 20 49 49 49 20 74 68 72 65 65 20 49 20 74 68 72   III three I thr
4ed0: 65 65 20 49 49 20 74 68 72 65 65 20 49 49 49 7d  ee II three III}
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 6a      \.] {.  do_j
4f00: 6f 69 6e 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  oin_test e_selec
4f10: 74 2d 31 2e 33 2e 24 74 6e 20 24 73 65 6c 65 63  t-1.3.$tn $selec
4f20: 74 20 24 72 65 73 0a 7d 0a 0a 23 20 45 56 49 44  t $res.}..# EVID
4f30: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 35 38  ENCE-OF: R-63358
4f40: 2d 35 34 38 36 32 20 49 66 20 74 68 65 72 65 20  -54862 If there 
4f50: 69 73 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  is a USING claus
4f60: 65 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 23  e specified as.#
4f70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 69   part of the joi
4f80: 6e 2d 63 6f 6e 73 74 72 61 69 6e 74 2c 20 74 68  n-constraint, th
4f90: 65 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  en each of the c
4fa0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 73 70 65 63  olumn names spec
4fb0: 69 66 69 65 64 0a 23 20 6d 75 73 74 20 65 78 69  ified.# must exi
4fc0: 73 74 20 69 6e 20 74 68 65 20 64 61 74 61 73 65  st in the datase
4fd0: 74 73 20 74 6f 20 62 6f 74 68 20 74 68 65 20 6c  ts to both the l
4fe0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
4ff0: 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 2e 0a 23 0a   the join-op..#.
5000: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
5010: 65 5f 73 65 6c 65 63 74 2d 31 2e 34 20 2d 65 72  e_select-1.4 -er
5020: 72 6f 72 20 7b 0a 20 20 63 61 6e 6e 6f 74 20 6a  ror {.  cannot j
5030: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
5040: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74   %s - column not
5050: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
5060: 20 74 61 62 6c 65 73 0a 7d 20 7b 0a 20 20 31 20   tables.} {.  1 
5070: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5080: 74 31 2c 20 74 33 20 55 53 49 4e 47 20 28 62 29  t1, t3 USING (b)
5090: 20 7d 20 20 20 22 62 22 0a 20 20 32 20 7b 20 53   }   "b".  2 { S
50a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c  ELECT * FROM t3,
50b0: 20 74 31 20 55 53 49 4e 47 20 28 63 29 20 7d 20   t1 USING (c) } 
50c0: 20 20 22 63 22 0a 20 20 33 20 7b 20 53 45 4c 45    "c".  3 { SELE
50d0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c 20 28 53  CT * FROM t3, (S
50e0: 45 4c 45 43 54 20 61 20 41 53 20 62 2c 20 62 20  ELECT a AS b, b 
50f0: 41 53 20 63 20 46 52 4f 4d 20 74 31 29 20 55 53  AS c FROM t1) US
5100: 49 4e 47 20 28 61 29 20 7d 20 20 20 22 61 22 0a  ING (a) }   "a".
5110: 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
5120: 46 3a 20 52 2d 35 35 39 38 37 2d 30 34 35 38 34  F: R-55987-04584
5130: 20 46 6f 72 20 65 61 63 68 20 70 61 69 72 20 6f   For each pair o
5140: 66 20 6e 61 6d 65 73 61 6b 65 20 63 6f 6c 75 6d  f namesake colum
5150: 6e 73 2c 20 74 68 65 0a 23 20 65 78 70 72 65 73  ns, the.# expres
5160: 73 69 6f 6e 20 22 6c 68 73 2e 58 20 3d 20 72 68  sion "lhs.X = rh
5170: 73 2e 58 22 20 69 73 20 65 76 61 6c 75 61 74 65  s.X" is evaluate
5180: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  d for each row o
5190: 66 20 74 68 65 20 63 61 72 74 65 73 69 61 6e 0a  f the cartesian.
51a0: 23 20 70 72 6f 64 75 63 74 20 61 73 20 61 20 62  # product as a b
51b0: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
51c0: 6e 2e 20 41 6c 6c 20 72 6f 77 73 20 66 6f 72 20  n. All rows for 
51d0: 77 68 69 63 68 20 6f 6e 65 20 6f 72 20 6d 6f 72  which one or mor
51e0: 65 20 6f 66 20 74 68 65 0a 23 20 65 78 70 72 65  e of the.# expre
51f0: 73 73 69 6f 6e 73 20 65 76 61 6c 75 61 74 65 73  ssions evaluates
5200: 20 74 6f 20 66 61 6c 73 65 20 61 72 65 20 65 78   to false are ex
5210: 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
5220: 72 65 73 75 6c 74 20 73 65 74 2e 0a 23 0a 64 6f  result set..#.do
5230: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
5240: 73 65 6c 65 63 74 2d 31 2e 35 20 7b 0a 20 20 31  select-1.5 {.  1
5250: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5260: 20 74 31 2c 20 74 33 20 55 53 49 4e 47 20 28 61   t1, t3 USING (a
5270: 29 20 20 20 7d 20 20 7b 61 20 6f 6e 65 20 31 20  )   }  {a one 1 
5280: 62 20 74 77 6f 20 32 7d 0a 20 20 32 20 7b 20 53  b two 2}.  2 { S
5290: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 2c  ELECT * FROM t3,
52a0: 20 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 20   t4 USING (a,c) 
52b0: 7d 20 20 7b 62 20 32 7d 0a 7d 20 0a 0a 23 20 45  }  {b 2}.} ..# E
52c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34  VIDENCE-OF: R-54
52d0: 30 34 36 2d 34 38 36 30 30 20 57 68 65 6e 20 63  046-48600 When c
52e0: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 20  omparing values 
52f0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
5300: 0a 23 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c  .# USING clause,
5310: 20 74 68 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65   the normal rule
5320: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61  s for handling a
5330: 66 66 69 6e 69 74 69 65 73 2c 20 63 6f 6c 6c 61  ffinities, colla
5340: 74 69 6f 6e 0a 23 20 73 65 71 75 65 6e 63 65 73  tion.# sequences
5350: 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
5360: 20 69 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   in comparisons 
5370: 61 70 70 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45  apply..#.# EVIDE
5380: 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 34 36 36 2d  NCE-OF: R-35466-
5390: 31 38 35 37 38 20 54 68 65 20 63 6f 6c 75 6d 6e  18578 The column
53a0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 73 65   from the datase
53b0: 74 20 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74 2d  t on the.# left-
53c0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
53d0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69   join operator i
53e0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
53f0: 62 65 20 6f 6e 20 74 68 65 0a 23 20 6c 65 66 74  be on the.# left
5400: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
5410: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
5420: 72 61 74 6f 72 20 28 3d 29 20 66 6f 72 20 74 68  rator (=) for th
5430: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 0a 23 20  e purposes of.# 
5440: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
5450: 63 65 20 61 6e 64 20 61 66 66 69 6e 69 74 79 20  ce and affinity 
5460: 70 72 65 63 65 64 65 6e 63 65 2e 0a 23 0a 64 6f  precedence..#.do
5470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5480: 73 65 6c 65 63 74 2d 31 2e 36 2e 30 20 7b 0a 20  select-1.6.0 {. 
5490: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
54a0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
54b0: 65 2c 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  e, b COLLATE bin
54c0: 61 72 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ary);.  INSERT I
54d0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 41  NTO t5 VALUES('A
54e0: 41 27 2c 20 27 63 63 27 29 3b 0a 20 20 49 4e 53  A', 'cc');.  INS
54f0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
5500: 45 53 28 27 42 42 27 2c 20 27 64 64 27 29 3b 0a  ES('BB', 'dd');.
5510: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
5520: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
5530: 4c 4c 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  LL);.  CREATE TA
5540: 42 4c 45 20 74 36 28 61 20 43 4f 4c 4c 41 54 45  BLE t6(a COLLATE
5550: 20 62 69 6e 61 72 79 2c 20 62 20 43 4f 4c 4c 41   binary, b COLLA
5560: 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e  TE nocase);.  IN
5570: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
5580: 55 45 53 28 27 61 61 27 2c 20 27 63 63 27 29 3b  UES('aa', 'cc');
5590: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
55a0: 36 20 56 41 4c 55 45 53 28 27 62 62 27 2c 20 27  6 VALUES('bb', '
55b0: 44 44 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  DD');.  INSERT I
55c0: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 4e 55  NTO t6 VALUES(NU
55d0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 7b 7d 0a  LL, NULL);.} {}.
55e0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c 65  foreach {tn sele
55f0: 63 74 20 72 65 73 7d 20 7b 0a 20 20 31 20 7b 20  ct res} {.  1 { 
5600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35  SELECT * FROM t5
5610: 20 25 4a 4f 49 4e 25 20 74 36 20 55 53 49 4e 47   %JOIN% t6 USING
5620: 20 28 61 29 20 7d 20 7b 41 41 20 63 63 20 63 63   (a) } {AA cc cc
5630: 20 42 42 20 64 64 20 44 44 7d 0a 20 20 32 20 7b   BB dd DD}.  2 {
5640: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5650: 36 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e  6 %JOIN% t5 USIN
5660: 47 20 28 61 29 20 7d 20 7b 7d 0a 20 20 33 20 7b  G (a) } {}.  3 {
5670: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
5680: 53 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45  SELECT a COLLATE
5690: 20 6e 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d 20   nocase, b FROM 
56a0: 74 36 29 20 25 4a 4f 49 4e 25 20 74 35 20 55 53  t6) %JOIN% t5 US
56b0: 49 4e 47 20 28 61 29 20 7d 20 0a 20 20 20 20 7b  ING (a) } .    {
56c0: 61 61 20 63 63 20 63 63 20 62 62 20 44 44 20 64  aa cc cc bb DD d
56d0: 64 7d 0a 20 20 34 20 7b 20 53 45 4c 45 43 54 20  d}.  4 { SELECT 
56e0: 2a 20 46 52 4f 4d 20 74 35 20 25 4a 4f 49 4e 25  * FROM t5 %JOIN%
56f0: 20 74 36 20 55 53 49 4e 47 20 28 61 2c 62 29 20   t6 USING (a,b) 
5700: 7d 20 7b 41 41 20 63 63 7d 0a 20 20 35 20 7b 20  } {AA cc}.  5 { 
5710: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
5720: 20 25 4a 4f 49 4e 25 20 74 35 20 55 53 49 4e 47   %JOIN% t5 USING
5730: 20 28 61 2c 62 29 20 7d 20 7b 7d 0a 7d 20 7b 0a   (a,b) } {}.} {.
5740: 20 20 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65    do_join_test e
5750: 5f 73 65 6c 65 63 74 2d 31 2e 36 2e 24 74 6e 20  _select-1.6.$tn 
5760: 24 73 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a  $select $res.}..
5770: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5780: 2d 35 37 30 34 37 2d 31 30 34 36 31 20 46 6f 72  -57047-10461 For
5790: 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 63 6f   each pair of co
57a0: 6c 75 6d 6e 73 20 69 64 65 6e 74 69 66 69 65 64  lumns identified
57b0: 20 62 79 20 61 0a 23 20 55 53 49 4e 47 20 63 6c   by a.# USING cl
57c0: 61 75 73 65 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  ause, the column
57d0: 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 2d   from the right-
57e0: 68 61 6e 64 20 64 61 74 61 73 65 74 20 69 73 20  hand dataset is 
57f0: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 23 20 74  omitted from.# t
5800: 68 65 20 6a 6f 69 6e 65 64 20 64 61 74 61 73 65  he joined datase
5810: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
5820: 4f 46 3a 20 52 2d 35 36 31 33 32 2d 31 35 37 30  OF: R-56132-1570
5830: 30 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  0 This is the on
5840: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
5850: 74 77 65 65 6e 20 61 20 55 53 49 4e 47 0a 23 20  tween a USING.# 
5860: 63 6c 61 75 73 65 20 61 6e 64 20 69 74 73 20 65  clause and its e
5870: 71 75 69 76 61 6c 65 6e 74 20 4f 4e 20 63 6f 6e  quivalent ON con
5880: 73 74 72 61 69 6e 74 2e 0a 23 0a 66 6f 72 65 61  straint..#.forea
5890: 63 68 20 7b 74 6e 20 73 65 6c 65 63 74 20 72 65  ch {tn select re
58a0: 73 7d 20 7b 0a 20 20 31 61 20 7b 20 53 45 4c 45  s} {.  1a { SELE
58b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 25 4a 4f  CT * FROM t1 %JO
58c0: 49 4e 25 20 74 32 20 55 53 49 4e 47 20 28 61 29  IN% t2 USING (a)
58d0: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 7b 61        } .     {a
58e0: 20 6f 6e 65 20 49 20 62 20 74 77 6f 20 49 49 20   one I b two II 
58f0: 63 20 74 68 72 65 65 20 49 49 49 7d 0a 20 20 31  c three III}.  1
5900: 62 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  b { SELECT * FRO
5910: 4d 20 74 31 20 25 4a 4f 49 4e 25 20 74 32 20 4f  M t1 %JOIN% t2 O
5920: 4e 20 28 74 31 2e 61 3d 74 32 2e 61 29 20 7d 0a  N (t1.a=t2.a) }.
5930: 20 20 20 20 20 7b 61 20 6f 6e 65 20 61 20 49 20       {a one a I 
5940: 62 20 74 77 6f 20 62 20 49 49 20 63 20 74 68 72  b two b II c thr
5950: 65 65 20 63 20 49 49 49 7d 0a 0a 20 20 32 61 20  ee c III}..  2a 
5960: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5970: 74 33 20 25 4a 4f 49 4e 25 20 74 34 20 55 53 49  t3 %JOIN% t4 USI
5980: 4e 47 20 28 61 29 20 20 20 20 20 20 7d 20 20 0a  NG (a)      }  .
5990: 20 20 20 20 20 7b 61 20 31 20 7b 7d 20 62 20 32       {a 1 {} b 2
59a0: 20 32 7d 0a 20 20 32 62 20 7b 20 53 45 4c 45 43   2}.  2b { SELEC
59b0: 54 20 2a 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49  T * FROM t3 %JOI
59c0: 4e 25 20 74 34 20 4f 4e 20 28 74 33 2e 61 3d 74  N% t4 ON (t3.a=t
59d0: 34 2e 61 29 20 7d 20 0a 20 20 20 20 20 7b 61 20  4.a) } .     {a 
59e0: 31 20 61 20 7b 7d 20 62 20 32 20 62 20 32 7d 0a  1 a {} b 2 b 2}.
59f0: 0a 20 20 33 61 20 7b 20 53 45 4c 45 43 54 20 2a  .  3a { SELECT *
5a00: 20 46 52 4f 4d 20 74 33 20 25 4a 4f 49 4e 25 20   FROM t3 %JOIN% 
5a10: 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 20 20  t4 USING (a,c)  
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 7d 20 7b 62 20 32 7d 0a 20 20 33 62 20 7b 20 53  } {b 2}.  3b { S
5a40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
5a50: 25 4a 4f 49 4e 25 20 74 34 20 4f 4e 20 28 74 33  %JOIN% t4 ON (t3
5a60: 2e 61 3d 74 34 2e 61 20 41 4e 44 20 74 33 2e 63  .a=t4.a AND t3.c
5a70: 3d 74 34 2e 63 29 20 7d 20 7b 62 20 32 20 62 20  =t4.c) } {b 2 b 
5a80: 32 7d 0a 0a 20 20 34 61 20 7b 20 53 45 4c 45 43  2}..  4a { SELEC
5a90: 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
5aa0: 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   a COLLATE nocas
5ab0: 65 2c 20 62 20 46 52 4f 4d 20 74 36 29 20 41 53  e, b FROM t6) AS
5ac0: 20 78 20 0a 20 20 20 20 20 20 20 25 4a 4f 49 4e   x .       %JOIN
5ad0: 25 20 74 35 20 55 53 49 4e 47 20 28 61 29 20 7d  % t5 USING (a) }
5ae0: 20 0a 20 20 20 20 20 7b 61 61 20 63 63 20 63 63   .     {aa cc cc
5af0: 20 62 62 20 44 44 20 64 64 7d 0a 20 20 34 62 20   bb DD dd}.  4b 
5b00: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5b10: 28 53 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54  (SELECT a COLLAT
5b20: 45 20 6e 6f 63 61 73 65 2c 20 62 20 46 52 4f 4d  E nocase, b FROM
5b30: 20 74 36 29 20 41 53 20 78 0a 20 20 20 20 20 20   t6) AS x.      
5b40: 20 25 4a 4f 49 4e 25 20 74 35 20 4f 4e 20 28 78   %JOIN% t5 ON (x
5b50: 2e 61 3d 74 35 2e 61 29 20 7d 20 0a 20 20 20 20  .a=t5.a) } .    
5b60: 20 7b 61 61 20 63 63 20 41 41 20 63 63 20 62 62   {aa cc AA cc bb
5b70: 20 44 44 20 42 42 20 64 64 7d 0a 7d 20 7b 0a 20   DD BB dd}.} {. 
5b80: 20 64 6f 5f 6a 6f 69 6e 5f 74 65 73 74 20 65 5f   do_join_test e_
5b90: 73 65 6c 65 63 74 2d 31 2e 37 2e 24 74 6e 20 24  select-1.7.$tn $
5ba0: 73 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a 0a 23  select $res.}..#
5bb0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5bc0: 34 31 34 33 34 2d 31 32 34 34 38 20 49 66 20 74  41434-12448 If t
5bd0: 68 65 20 6a 6f 69 6e 2d 6f 70 20 69 73 20 61 20  he join-op is a 
5be0: 22 4c 45 46 54 20 4a 4f 49 4e 22 20 6f 72 20 22  "LEFT JOIN" or "
5bf0: 4c 45 46 54 0a 23 20 4f 55 54 45 52 20 4a 4f 49  LEFT.# OUTER JOI
5c00: 4e 22 2c 20 74 68 65 6e 20 61 66 74 65 72 20 74  N", then after t
5c10: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 66  he ON or USING f
5c20: 69 6c 74 65 72 69 6e 67 20 63 6c 61 75 73 65 73  iltering clauses
5c30: 20 68 61 76 65 20 62 65 65 6e 0a 23 20 61 70 70   have been.# app
5c40: 6c 69 65 64 2c 20 61 6e 20 65 78 74 72 61 20 72  lied, an extra r
5c50: 6f 77 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ow is added to t
5c60: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 65 61  he output for ea
5c70: 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a 23 20  ch row in the.# 
5c80: 6f 72 69 67 69 6e 61 6c 20 6c 65 66 74 2d 68 61  original left-ha
5c90: 6e 64 20 69 6e 70 75 74 20 64 61 74 61 73 65 74  nd input dataset
5ca0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
5cb0: 73 20 74 6f 20 6e 6f 20 72 6f 77 73 20 61 74 20  s to no rows at 
5cc0: 61 6c 6c 20 69 6e 0a 23 20 74 68 65 20 63 6f 6d  all in.# the com
5cd0: 70 6f 73 69 74 65 20 64 61 74 61 73 65 74 20 28  posite dataset (
5ce0: 69 66 20 61 6e 79 29 2e 0a 23 0a 64 6f 5f 65 78  if any)..#.do_ex
5cf0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
5d00: 65 63 74 2d 31 2e 38 2e 30 20 7b 0a 20 20 43 52  ect-1.8.0 {.  CR
5d10: 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c  EATE TABLE t7(a,
5d20: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
5d30: 20 54 41 42 4c 45 20 74 38 28 61 2c 20 64 2c 20   TABLE t8(a, d, 
5d40: 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  e);..  INSERT IN
5d50: 54 4f 20 74 37 20 56 41 4c 55 45 53 28 27 78 27  TO t7 VALUES('x'
5d60: 2c 20 27 65 78 27 2c 20 20 32 34 29 3b 0a 20 20  , 'ex',  24);.  
5d70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
5d80: 41 4c 55 45 53 28 27 79 27 2c 20 27 77 68 79 27  ALUES('y', 'why'
5d90: 2c 20 32 35 29 3b 0a 0a 20 20 49 4e 53 45 52 54  , 25);..  INSERT
5da0: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
5db0: 27 78 27 2c 20 27 61 62 63 27 2c 20 32 34 29 3b  'x', 'abc', 24);
5dc0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
5dd0: 38 20 56 41 4c 55 45 53 28 27 7a 27 2c 20 27 67  8 VALUES('z', 'g
5de0: 68 69 27 2c 20 32 36 29 3b 0a 7d 20 7b 7d 0a 0a  hi', 26);.} {}..
5df0: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
5e00: 65 5f 73 65 6c 65 63 74 2d 31 2e 38 20 7b 0a 20  e_select-1.8 {. 
5e10: 20 31 61 20 22 53 45 4c 45 43 54 20 63 6f 75 6e   1a "SELECT coun
5e20: 74 28 2a 29 20 46 52 4f 4d 20 74 37 20 4a 4f 49  t(*) FROM t7 JOI
5e30: 4e 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38  N t8 ON (t7.a=t8
5e40: 2e 61 29 22 20 7b 31 7d 0a 20 20 31 62 20 22 53  .a)" {1}.  1b "S
5e50: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
5e60: 52 4f 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49 4e  ROM t7 LEFT JOIN
5e70: 20 74 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38 2e   t8 ON (t7.a=t8.
5e80: 61 29 22 20 7b 32 7d 0a 20 20 32 61 20 22 53 45  a)" {2}.  2a "SE
5e90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5ea0: 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20 55 53  OM t7 JOIN t8 US
5eb0: 49 4e 47 20 28 61 29 22 20 7b 31 7d 0a 20 20 32  ING (a)" {1}.  2
5ec0: 62 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  b "SELECT count(
5ed0: 2a 29 20 46 52 4f 4d 20 74 37 20 4c 45 46 54 20  *) FROM t7 LEFT 
5ee0: 4a 4f 49 4e 20 74 38 20 55 53 49 4e 47 20 28 61  JOIN t8 USING (a
5ef0: 29 22 20 7b 32 7d 0a 7d 0a 0a 0a 23 20 45 56 49  )" {2}.}...# EVI
5f00: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 36 30  DENCE-OF: R-1560
5f10: 37 2d 35 32 39 38 38 20 54 68 65 20 61 64 64 65  7-52988 The adde
5f20: 64 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 20 4e  d rows contain N
5f30: 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20 74 68  ULL values in th
5f40: 65 0a 23 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  e.# columns that
5f50: 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20   would normally 
5f60: 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73 20 63  contain values c
5f70: 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 72  opied from the r
5f80: 69 67 68 74 2d 68 61 6e 64 0a 23 20 69 6e 70 75  ight-hand.# inpu
5f90: 74 20 64 61 74 61 73 65 74 2e 0a 23 0a 64 6f 5f  t dataset..#.do_
5fa0: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
5fb0: 65 6c 65 63 74 2d 31 2e 39 20 7b 0a 20 20 31 61  elect-1.9 {.  1a
5fc0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
5fd0: 74 37 20 4a 4f 49 4e 20 74 38 20 4f 4e 20 28 74  t7 JOIN t8 ON (t
5fe0: 37 2e 61 3d 74 38 2e 61 29 22 20 7b 78 20 65 78  7.a=t8.a)" {x ex
5ff0: 20 32 34 20 78 20 61 62 63 20 32 34 7d 0a 20 20   24 x abc 24}.  
6000: 31 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  1b "SELECT * FRO
6010: 4d 20 74 37 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t7 LEFT JOIN t
6020: 38 20 4f 4e 20 28 74 37 2e 61 3d 74 38 2e 61 29  8 ON (t7.a=t8.a)
6030: 22 20 0a 20 20 20 20 20 7b 78 20 65 78 20 32 34  " .     {x ex 24
6040: 20 78 20 61 62 63 20 32 34 20 79 20 77 68 79 20   x abc 24 y why 
6050: 32 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20 32  25 {} {} {}}.  2
6060: 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  a "SELECT * FROM
6070: 20 74 37 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e   t7 JOIN t8 USIN
6080: 47 20 28 61 29 22 20 7b 78 20 65 78 20 32 34 20  G (a)" {x ex 24 
6090: 61 62 63 20 32 34 7d 0a 20 20 32 62 20 22 53 45  abc 24}.  2b "SE
60a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 20 4c  LECT * FROM t7 L
60b0: 45 46 54 20 4a 4f 49 4e 20 74 38 20 55 53 49 4e  EFT JOIN t8 USIN
60c0: 47 20 28 61 29 22 20 7b 78 20 65 78 20 32 34 20  G (a)" {x ex 24 
60d0: 61 62 63 20 32 34 20 79 20 77 68 79 20 32 35 20  abc 24 y why 25 
60e0: 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44  {} {}}.}..# EVID
60f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 30 39  ENCE-OF: R-01809
6100: 2d 35 32 31 33 34 20 49 66 20 74 68 65 20 4e 41  -52134 If the NA
6110: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
6120: 20 61 64 64 65 64 20 74 6f 20 61 6e 79 20 6f 66   added to any of
6130: 0a 23 20 74 68 65 20 6a 6f 69 6e 2d 6f 70 73 2c  .# the join-ops,
6140: 20 74 68 65 6e 20 61 6e 20 69 6d 70 6c 69 63 69   then an implici
6150: 74 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  t USING clause i
6160: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a 23  s added to the.#
6170: 20 6a 6f 69 6e 2d 63 6f 6e 73 74 72 61 69 6e 74   join-constraint
6180: 73 2e 20 54 68 65 20 69 6d 70 6c 69 63 69 74 20  s. The implicit 
6190: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 63 6f 6e  USING clause con
61a0: 74 61 69 6e 73 20 65 61 63 68 20 6f 66 20 74 68  tains each of th
61b0: 65 0a 23 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  e.# column names
61c0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
61d0: 62 6f 74 68 20 74 68 65 20 6c 65 66 74 20 61 6e  both the left an
61e0: 64 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70  d right-hand inp
61f0: 75 74 0a 23 20 64 61 74 61 73 65 74 73 2e 0a 23  ut.# datasets..#
6200: 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
6210: 20 65 5f 73 65 6c 65 63 74 2d 31 2d 31 30 20 7b   e_select-1-10 {
6220: 0a 20 20 31 61 20 22 53 45 4c 45 43 54 20 2a 20  .  1a "SELECT * 
6230: 46 52 4f 4d 20 74 37 20 4a 4f 49 4e 20 74 38 20  FROM t7 JOIN t8 
6240: 55 53 49 4e 47 20 28 61 29 22 20 20 20 20 20 20  USING (a)"      
6250: 20 20 7b 78 20 65 78 20 32 34 20 61 62 63 20 32    {x ex 24 abc 2
6260: 34 7d 0a 20 20 31 62 20 22 53 45 4c 45 43 54 20  4}.  1b "SELECT 
6270: 2a 20 46 52 4f 4d 20 74 37 20 4e 41 54 55 52 41  * FROM t7 NATURA
6280: 4c 20 4a 4f 49 4e 20 74 38 22 20 20 20 20 20 20  L JOIN t8"      
6290: 20 20 20 20 7b 78 20 65 78 20 32 34 20 61 62 63      {x ex 24 abc
62a0: 20 32 34 7d 0a 0a 20 20 32 61 20 22 53 45 4c 45   24}..  2a "SELE
62b0: 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4a 4f 49  CT * FROM t8 JOI
62c0: 4e 20 74 37 20 55 53 49 4e 47 20 28 61 29 22 20  N t7 USING (a)" 
62d0: 20 20 20 20 20 20 20 7b 78 20 61 62 63 20 32 34         {x abc 24
62e0: 20 65 78 20 32 34 7d 0a 20 20 32 62 20 22 53 45   ex 24}.  2b "SE
62f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 4e  LECT * FROM t8 N
6300: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 37 22 20  ATURAL JOIN t7" 
6310: 20 20 20 20 20 20 20 20 20 7b 78 20 61 62 63 20           {x abc 
6320: 32 34 20 65 78 20 32 34 7d 0a 0a 20 20 33 61 20  24 ex 24}..  3a 
6330: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6340: 37 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38 20 55  7 LEFT JOIN t8 U
6350: 53 49 4e 47 20 28 61 29 22 20 20 20 7b 78 20 65  SING (a)"   {x e
6360: 78 20 32 34 20 61 62 63 20 32 34 20 79 20 77 68  x 24 abc 24 y wh
6370: 79 20 32 35 20 7b 7d 20 7b 7d 7d 0a 20 20 33 62  y 25 {} {}}.  3b
6380: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
6390: 74 37 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20  t7 NATURAL LEFT 
63a0: 4a 4f 49 4e 20 74 38 22 20 20 20 20 20 7b 78 20  JOIN t8"     {x 
63b0: 65 78 20 32 34 20 61 62 63 20 32 34 20 79 20 77  ex 24 abc 24 y w
63c0: 68 79 20 32 35 20 7b 7d 20 7b 7d 7d 0a 0a 20 20  hy 25 {} {}}..  
63d0: 34 61 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  4a "SELECT * FRO
63e0: 4d 20 74 38 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t8 LEFT JOIN t
63f0: 37 20 55 53 49 4e 47 20 28 61 29 22 20 20 20 7b  7 USING (a)"   {
6400: 78 20 61 62 63 20 32 34 20 65 78 20 32 34 20 7a  x abc 24 ex 24 z
6410: 20 67 68 69 20 32 36 20 7b 7d 20 7b 7d 7d 0a 20   ghi 26 {} {}}. 
6420: 20 34 62 20 22 53 45 4c 45 43 54 20 2a 20 46 52   4b "SELECT * FR
6430: 4f 4d 20 74 38 20 4e 41 54 55 52 41 4c 20 4c 45  OM t8 NATURAL LE
6440: 46 54 20 4a 4f 49 4e 20 74 37 22 20 20 20 20 20  FT JOIN t7"     
6450: 7b 78 20 61 62 63 20 32 34 20 65 78 20 32 34 20  {x abc 24 ex 24 
6460: 7a 20 67 68 69 20 32 36 20 7b 7d 20 7b 7d 7d 0a  z ghi 26 {} {}}.
6470: 0a 20 20 35 61 20 22 53 45 4c 45 43 54 20 2a 20  .  5a "SELECT * 
6480: 46 52 4f 4d 20 74 33 20 4a 4f 49 4e 20 74 34 20  FROM t3 JOIN t4 
6490: 55 53 49 4e 47 20 28 61 2c 63 29 22 20 20 20 20  USING (a,c)"    
64a0: 20 20 7b 62 20 32 7d 0a 20 20 35 62 20 22 53 45    {b 2}.  5b "SE
64b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4e  LECT * FROM t3 N
64c0: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 34 22 20  ATURAL JOIN t4" 
64d0: 20 20 20 20 20 20 20 20 20 7b 62 20 32 7d 0a 0a           {b 2}..
64e0: 20 20 36 61 20 22 53 45 4c 45 43 54 20 2a 20 46    6a "SELECT * F
64f0: 52 4f 4d 20 74 33 20 4c 45 46 54 20 4a 4f 49 4e  ROM t3 LEFT JOIN
6500: 20 74 34 20 55 53 49 4e 47 20 28 61 2c 63 29 22   t4 USING (a,c)"
6510: 20 7b 61 20 31 20 62 20 32 7d 0a 20 20 36 62 20   {a 1 b 2}.  6b 
6520: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
6530: 33 20 4e 41 54 55 52 41 4c 20 4c 45 46 54 20 4a  3 NATURAL LEFT J
6540: 4f 49 4e 20 74 34 22 20 20 20 20 20 7b 61 20 31  OIN t4"     {a 1
6550: 20 62 20 32 7d 0a 7d 20 0a 0a 23 20 45 56 49 44   b 2}.} ..# EVID
6560: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 35 36 36  ENCE-OF: R-49566
6570: 2d 30 31 35 37 30 20 49 66 20 74 68 65 20 6c 65  -01570 If the le
6580: 66 74 20 61 6e 64 20 72 69 67 68 74 2d 68 61 6e  ft and right-han
6590: 64 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 73  d input datasets
65a0: 0a 23 20 66 65 61 74 75 72 65 20 6e 6f 20 63 6f  .# feature no co
65b0: 6d 6d 6f 6e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  mmon column name
65c0: 73 2c 20 74 68 65 6e 20 74 68 65 20 4e 41 54 55  s, then the NATU
65d0: 52 41 4c 20 6b 65 79 77 6f 72 64 20 68 61 73 20  RAL keyword has 
65e0: 6e 6f 20 65 66 66 65 63 74 0a 23 20 6f 6e 20 74  no effect.# on t
65f0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
6600: 65 20 6a 6f 69 6e 2e 0a 23 0a 64 6f 5f 65 78 65  e join..#.do_exe
6610: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
6620: 63 74 2d 31 2e 31 31 2e 30 20 7b 0a 20 20 43 52  ct-1.11.0 {.  CR
6630: 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 78  EATE TABLE t10(x
6640: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
6650: 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31  NTO t10 VALUES(1
6660: 2c 20 27 74 72 75 65 27 29 3b 0a 20 20 49 4e 53  , 'true');.  INS
6670: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
6680: 55 45 53 28 30 2c 20 27 66 61 6c 73 65 27 29 3b  UES(0, 'false');
6690: 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f  .} {}.do_select_
66a0: 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 31  tests e_select-1
66b0: 2d 31 31 20 7b 0a 20 20 31 61 20 22 53 45 4c 45  -11 {.  1a "SELE
66c0: 43 54 20 61 2c 20 78 20 46 52 4f 4d 20 74 31 20  CT a, x FROM t1 
66d0: 43 52 4f 53 53 20 4a 4f 49 4e 20 74 31 30 22 20  CROSS JOIN t10" 
66e0: 7b 61 20 31 20 61 20 30 20 62 20 31 20 62 20 30  {a 1 a 0 b 1 b 0
66f0: 20 63 20 31 20 63 20 30 7d 0a 20 20 31 62 20 22   c 1 c 0}.  1b "
6700: 53 45 4c 45 43 54 20 61 2c 20 78 20 46 52 4f 4d  SELECT a, x FROM
6710: 20 74 31 20 4e 41 54 55 52 41 4c 20 43 52 4f 53   t1 NATURAL CROS
6720: 53 20 4a 4f 49 4e 20 74 31 30 22 20 7b 61 20 31  S JOIN t10" {a 1
6730: 20 61 20 30 20 62 20 31 20 62 20 30 20 63 20 31   a 0 b 1 b 0 c 1
6740: 20 63 20 30 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   c 0}.}..# EVIDE
6750: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 36 32 35 2d  NCE-OF: R-39625-
6760: 35 39 31 33 33 20 41 20 55 53 49 4e 47 20 6f 72  59133 A USING or
6770: 20 4f 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   ON clause may n
6780: 6f 74 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  ot be added to a
6790: 0a 23 20 6a 6f 69 6e 20 74 68 61 74 20 73 70 65  .# join that spe
67a0: 63 69 66 69 65 73 20 74 68 65 20 4e 41 54 55 52  cifies the NATUR
67b0: 41 4c 20 6b 65 79 77 6f 72 64 2e 0a 23 0a 66 6f  AL keyword..#.fo
67c0: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b  reach {tn sql} {
67d0: 0a 20 20 31 20 7b 53 45 4c 45 43 54 20 2a 20 46  .  1 {SELECT * F
67e0: 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20 4c  ROM t1 NATURAL L
67f0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e  EFT JOIN t2 USIN
6800: 47 20 28 61 29 7d 0a 20 20 32 20 7b 53 45 4c 45  G (a)}.  2 {SELE
6810: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 41 54  CT * FROM t1 NAT
6820: 55 52 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 74  URAL LEFT JOIN t
6830: 32 20 4f 4e 20 28 74 31 2e 61 3d 74 32 2e 61 29  2 ON (t1.a=t2.a)
6840: 7d 0a 20 20 33 20 7b 53 45 4c 45 43 54 20 2a 20  }.  3 {SELECT * 
6850: 46 52 4f 4d 20 74 31 20 4e 41 54 55 52 41 4c 20  FROM t1 NATURAL 
6860: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
6870: 28 34 35 29 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 63  (45)}.} {.  do_c
6880: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 73  atchsql_test e_s
6890: 65 6c 65 63 74 2d 31 2e 31 32 2e 24 74 6e 20 22  elect-1.12.$tn "
68a0: 0a 20 20 20 20 24 73 71 6c 0a 20 20 22 20 7b 31  .    $sql.  " {1
68b0: 20 7b 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   {a NATURAL join
68c0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e   may not have an
68d0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
68e0: 75 73 65 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  use}}.}..#------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62  ---.# The next b
6940: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
6950: 65 5f 73 65 6c 65 63 74 2d 33 2e 2a 20 2d 20 63  e_select-3.* - c
6960: 6f 6e 63 65 6e 74 72 61 74 65 20 6f 6e 20 76 65  oncentrate on ve
6970: 72 69 66 79 69 6e 67 20 0a 23 20 73 74 61 74 65  rifying .# state
6980: 6d 65 6e 74 73 20 6d 61 64 65 20 72 65 67 61 72  ments made regar
6990: 64 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ding WHERE claus
69a0: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23 0a  e processing..#.
69b0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
69c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
69d0: 65 5f 73 65 6c 65 63 74 2d 33 2e 30 20 7b 0a 20  e_select-3.0 {. 
69e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
69f0: 28 6b 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 20 20  (k, x, y, z);.  
6a00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
6a10: 41 4c 55 45 53 28 31 2c 20 27 72 65 6c 69 6e 71  ALUES(1, 'relinq
6a20: 75 69 73 68 65 64 27 2c 20 27 61 70 68 61 73 69  uished', 'aphasi
6a30: 61 27 2c 20 37 38 2e 34 33 29 3b 0a 20 20 49 4e  a', 78.43);.  IN
6a40: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
6a50: 55 45 53 28 32 2c 20 58 27 41 38 45 38 44 36 36  UES(2, X'A8E8D66
6a60: 46 27 2c 20 20 20 20 58 27 30 37 43 46 27 2c 20  F',    X'07CF', 
6a70: 20 20 2d 38 31 29 3b 0a 20 20 49 4e 53 45 52 54    -81);.  INSERT
6a80: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
6a90: 33 2c 20 2d 32 32 2c 20 20 20 20 20 20 20 20 20  3, -22,         
6aa0: 20 20 20 2d 32 37 2e 35 37 2c 20 20 20 20 4e 55     -27.57,    NU
6ab0: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  LL);.  INSERT IN
6ac0: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 34 2c 20  TO x1 VALUES(4, 
6ad0: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20  NULL,           
6ae0: 27 62 79 67 6f 6e 65 27 2c 20 20 27 70 69 63 6b  'bygone',  'pick
6af0: 79 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  y');.  INSERT IN
6b00: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 35 2c 20  TO x1 VALUES(5, 
6b10: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20  NULL,           
6b20: 39 36 2e 32 38 2c 20 20 20 20 20 4e 55 4c 4c 29  96.28,     NULL)
6b30: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
6b40: 78 31 20 56 41 4c 55 45 53 28 36 2c 20 30 2c 20  x1 VALUES(6, 0, 
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
6b60: 20 20 20 20 20 20 20 20 32 29 3b 0a 0a 20 20 43          2);..  C
6b70: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 6b  REATE TABLE x2(k
6b80: 2c 20 78 2c 20 79 32 29 3b 0a 20 20 49 4e 53 45  , x, y2);.  INSE
6b90: 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45  RT INTO x2 VALUE
6ba0: 53 28 31 2c 20 35 30 2c 20 58 27 42 38 32 38 33  S(1, 50, X'B8283
6bb0: 38 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  8');.  INSERT IN
6bc0: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 35 2c 20  TO x2 VALUES(5, 
6bd0: 38 34 2e 37 39 2c 20 36 35 2e 38 38 29 3b 0a 20  84.79, 65.88);. 
6be0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
6bf0: 56 41 4c 55 45 53 28 33 2c 20 2d 32 32 2c 20 58  VALUES(3, -22, X
6c00: 27 30 45 31 42 45 34 35 32 41 33 39 33 27 29 3b  '0E1BE452A393');
6c10: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
6c20: 32 20 56 41 4c 55 45 53 28 37 2c 20 27 6d 69 73  2 VALUES(7, 'mis
6c30: 74 72 75 73 74 65 64 27 2c 20 27 73 74 61 6e 64  trusted', 'stand
6c40: 61 72 64 69 7a 65 64 27 29 3b 0a 7d 20 7b 7d 0a  ardized');.} {}.
6c50: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
6c60: 52 2d 30 36 39 39 39 2d 31 34 33 33 30 20 49 66  R-06999-14330 If
6c70: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
6c80: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  is specified, th
6c90: 65 20 57 48 45 52 45 0a 23 20 65 78 70 72 65 73  e WHERE.# expres
6ca0: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
6cb0: 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  d for each row i
6cc0: 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61  n the input data
6cd0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 0a 23 20   as a boolean.# 
6ce0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 41 6c 6c 20  expression. All 
6cf0: 72 6f 77 73 20 66 6f 72 20 77 68 69 63 68 20 74  rows for which t
6d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6d10: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
6d20: 61 74 65 73 0a 23 20 74 6f 20 66 61 6c 73 65 20  ates.# to false 
6d30: 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
6d40: 6d 20 74 68 65 20 64 61 74 61 73 65 74 20 62 65  m the dataset be
6d50: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
6d60: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
6d70: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e  st e_select-3.1.
6d80: 31 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f  1 { SELECT k FRO
6d90: 4d 20 78 31 20 57 48 45 52 45 20 78 20 7d 20 20  M x1 WHERE x }  
6da0: 20 20 20 20 20 20 20 7b 33 7d 0a 64 6f 5f 65 78         {3}.do_ex
6db0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
6dc0: 65 63 74 2d 33 2e 31 2e 32 20 7b 20 53 45 4c 45  ect-3.1.2 { SELE
6dd0: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45  CT k FROM x1 WHE
6de0: 52 45 20 79 20 7d 20 20 20 20 20 20 20 20 20 7b  RE y }         {
6df0: 33 20 35 20 36 7d 0a 64 6f 5f 65 78 65 63 73 71  3 5 6}.do_execsq
6e00: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
6e10: 33 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 6b  3.1.3 { SELECT k
6e20: 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 7a   FROM x1 WHERE z
6e30: 20 7d 20 20 20 20 20 20 20 20 20 7b 31 20 32 20   }         {1 2 
6e40: 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  6}.do_execsql_te
6e50: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e  st e_select-3.1.
6e60: 34 20 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f  4 { SELECT k FRO
6e70: 4d 20 78 31 20 57 48 45 52 45 20 27 31 27 7c 7c  M x1 WHERE '1'||
6e80: 7a 20 20 20 20 7d 20 7b 31 20 32 20 34 20 36 7d  z    } {1 2 4 6}
6e90: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6ea0: 20 65 5f 73 65 6c 65 63 74 2d 33 2e 31 2e 35 20   e_select-3.1.5 
6eb0: 7b 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d 20  { SELECT k FROM 
6ec0: 78 31 20 57 48 45 52 45 20 78 20 49 53 20 4e 55  x1 WHERE x IS NU
6ed0: 4c 4c 20 7d 20 7b 34 20 35 7d 0a 64 6f 5f 65 78  LL } {4 5}.do_ex
6ee0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
6ef0: 65 63 74 2d 33 2e 31 2e 36 20 7b 20 53 45 4c 45  ect-3.1.6 { SELE
6f00: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 57 48 45  CT k FROM x1 WHE
6f10: 52 45 20 7a 20 2d 20 37 38 2e 34 33 20 7d 20 7b  RE z - 78.43 } {
6f20: 32 20 34 20 36 7d 0a 0a 64 6f 5f 65 78 65 63 73  2 4 6}..do_execs
6f30: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
6f40: 2d 33 2e 32 2e 31 61 20 7b 0a 20 20 53 45 4c 45  -3.2.1a {.  SELE
6f50: 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4c 45 46  CT k FROM x1 LEF
6f60: 54 20 4a 4f 49 4e 20 78 32 20 55 53 49 4e 47 28  T JOIN x2 USING(
6f70: 6b 29 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  k).} {1 2 3 4 5 
6f80: 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  6}.do_execsql_te
6f90: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e  st e_select-3.2.
6fa0: 31 62 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20  1b {.  SELECT k 
6fb0: 46 52 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49  FROM x1 LEFT JOI
6fc0: 4e 20 78 32 20 55 53 49 4e 47 28 6b 29 20 57 48  N x2 USING(k) WH
6fd0: 45 52 45 20 78 32 2e 6b 0a 7d 20 7b 31 20 33 20  ERE x2.k.} {1 3 
6fe0: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
6ff0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e  st e_select-3.2.
7000: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6b 20 46  2 {.  SELECT k F
7010: 52 4f 4d 20 78 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM x1 LEFT JOIN
7020: 20 78 32 20 55 53 49 4e 47 28 6b 29 20 57 48 45   x2 USING(k) WHE
7030: 52 45 20 78 32 2e 6b 20 49 53 20 4e 55 4c 4c 0a  RE x2.k IS NULL.
7040: 7d 20 7b 32 20 34 20 36 7d 0a 0a 64 6f 5f 65 78  } {2 4 6}..do_ex
7050: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
7060: 65 63 74 2d 33 2e 32 2e 33 20 7b 0a 20 20 53 45  ect-3.2.3 {.  SE
7070: 4c 45 43 54 20 6b 20 46 52 4f 4d 20 78 31 20 4e  LECT k FROM x1 N
7080: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 78 32 20 57  ATURAL JOIN x2 W
7090: 48 45 52 45 20 78 32 2e 6b 0a 7d 20 7b 33 7d 0a  HERE x2.k.} {3}.
70a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
70b0: 65 5f 73 65 6c 65 63 74 2d 33 2e 32 2e 34 20 7b  e_select-3.2.4 {
70c0: 0a 20 20 53 45 4c 45 43 54 20 6b 20 46 52 4f 4d  .  SELECT k FROM
70d0: 20 78 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   x1 NATURAL JOIN
70e0: 20 78 32 20 57 48 45 52 45 20 78 32 2e 6b 2d 33   x2 WHERE x2.k-3
70f0: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74 73 20 62 65 6c 6f 77 20  -.# Tests below 
7150: 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 66  this point are f
7160: 6f 63 75 73 65 64 20 6f 6e 20 76 65 72 69 66 79  ocused on verify
7170: 69 6e 67 20 74 68 65 20 74 65 73 74 61 62 6c 65  ing the testable
7180: 20 73 74 61 74 65 6d 65 6e 74 73 0a 23 20 72 65   statements.# re
7190: 6c 61 74 65 64 20 74 6f 20 63 61 63 75 6c 61 74  lated to caculat
71a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 72  ing the result r
71b0: 6f 77 73 20 6f 66 20 61 20 73 69 6d 70 6c 65 20  ows of a simple 
71c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
71d0: 2e 0a 23 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  ..#..drop_all_ta
71e0: 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  bles.do_execsql_
71f0: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e  test e_select-4.
7200: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
7210: 4c 45 20 7a 31 28 61 2c 20 62 2c 20 63 29 3b 0a  LE z1(a, b, c);.
7220: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
7230: 32 28 64 2c 20 65 29 3b 0a 20 20 43 52 45 41 54  2(d, e);.  CREAT
7240: 45 20 54 41 42 4c 45 20 7a 33 28 61 2c 20 62 29  E TABLE z3(a, b)
7250: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
7260: 20 7a 31 20 56 41 4c 55 45 53 28 35 31 2e 36 35   z1 VALUES(51.65
7270: 2c 20 2d 35 39 2e 35 38 2c 20 27 62 65 6c 66 72  , -59.58, 'belfr
7280: 69 65 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ies');.  INSERT 
7290: 49 4e 54 4f 20 7a 31 20 56 41 4c 55 45 53 28 2d  INTO z1 VALUES(-
72a0: 35 2c 20 4e 55 4c 4c 2c 20 37 35 29 3b 0a 20 20  5, NULL, 75);.  
72b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20 56  INSERT INTO z1 V
72c0: 41 4c 55 45 53 28 2d 32 2e 32 2c 20 2d 32 33 2e  ALUES(-2.2, -23.
72d0: 31 38 2c 20 27 73 75 69 74 65 72 73 27 29 3b 0a  18, 'suiters');.
72e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31    INSERT INTO z1
72f0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 36 37   VALUES(NULL, 67
7300: 2c 20 27 71 75 61 72 74 65 74 73 27 29 3b 0a 20  , 'quartets');. 
7310: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 31 20   INSERT INTO z1 
7320: 56 41 4c 55 45 53 28 2d 31 2e 30 34 2c 20 2d 33  VALUES(-1.04, -3
7330: 32 2e 33 2c 20 27 61 73 70 65 6e 27 29 3b 0a 20  2.3, 'aspen');. 
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 36 33 2c 20 27 62 6f 72 6e  VALUES(63, 'born
7360: 27 2c 20 2d 32 36 29 3b 0a 0a 20 20 49 4e 53 45  ', -26);..  INSE
7370: 52 54 20 49 4e 54 4f 20 7a 32 20 56 41 4c 55 45  RT INTO z2 VALUE
7380: 53 28 4e 55 4c 4c 2c 20 32 31 29 3b 0a 20 20 49  S(NULL, 21);.  I
7390: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 32 20 56 41  NSERT INTO z2 VA
73a0: 4c 55 45 53 28 33 36 2c 20 36 29 3b 0a 0a 20 20  LUES(36, 6);..  
73b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 33 20 56  INSERT INTO z3 V
73c0: 41 4c 55 45 53 28 27 73 75 62 73 69 73 74 65 6e  ALUES('subsisten
73d0: 63 65 27 2c 20 27 67 61 75 7a 65 27 29 3b 0a 20  ce', 'gauze');. 
73e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 33 20   INSERT INTO z3 
73f0: 56 41 4c 55 45 53 28 34 39 2e 31 37 2c 20 2d 36  VALUES(49.17, -6
7400: 37 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  7);.} {}..# EVID
7410: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 33 32 37  ENCE-OF: R-36327
7420: 2d 31 37 32 32 34 20 49 66 20 61 20 72 65 73 75  -17224 If a resu
7430: 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  lt expression is
7440: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 23 20 65   the special.# e
7450: 78 70 72 65 73 73 69 6f 6e 20 22 2a 22 20 74 68  xpression "*" th
7460: 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  en all columns i
7470: 6e 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61  n the input data
7480: 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 64   are substituted
7490: 20 66 6f 72 0a 23 20 74 68 61 74 20 6f 6e 65 20   for.# that one 
74a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
74b0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
74c0: 33 36 39 33 2d 33 30 35 32 32 20 49 66 20 74 68  3693-30522 If th
74d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
74e0: 74 68 65 20 61 6c 69 61 73 20 6f 66 20 61 20 74  the alias of a t
74f0: 61 62 6c 65 0a 23 20 6f 72 20 73 75 62 71 75 65  able.# or subque
7500: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
7510: 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 65 64 20 62  lause followed b
7520: 79 20 22 2e 2a 22 20 74 68 65 6e 20 61 6c 6c 20  y ".*" then all 
7530: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 23 20 74  columns from.# t
7540: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 6f  he named table o
7550: 72 20 73 75 62 71 75 65 72 79 20 61 72 65 20 73  r subquery are s
7560: 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20 74  ubstituted for t
7570: 68 65 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73  he single expres
7580: 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  sion..#.do_selec
7590: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
75a0: 2d 34 2e 31 20 7b 0a 20 20 31 20 20 22 53 45 4c  -4.1 {.  1  "SEL
75b0: 45 43 54 20 2a 20 46 52 4f 4d 20 7a 31 20 4c 49  ECT * FROM z1 LI
75c0: 4d 49 54 20 31 22 20 20 20 20 20 20 20 20 20 20  MIT 1"          
75d0: 20 20 20 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38     {51.65 -59.58
75e0: 20 62 65 6c 66 72 69 65 73 7d 0a 20 20 32 20 20   belfries}.  2  
75f0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 7a  "SELECT * FROM z
7600: 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22 20 20 20  1,z2 LIMIT 1"   
7610: 20 20 20 20 20 20 20 7b 35 31 2e 36 35 20 2d 35         {51.65 -5
7620: 39 2e 35 38 20 62 65 6c 66 72 69 65 73 20 7b 7d  9.58 belfries {}
7630: 20 32 31 7d 0a 20 20 33 20 20 22 53 45 4c 45 43   21}.  3  "SELEC
7640: 54 20 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 2c 7a  T z1.* FROM z1,z
7650: 32 20 4c 49 4d 49 54 20 31 22 20 20 20 20 20 20  2 LIMIT 1"      
7660: 20 7b 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62   {51.65 -59.58 b
7670: 65 6c 66 72 69 65 73 7d 0a 20 20 34 20 20 22 53  elfries}.  4  "S
7680: 45 4c 45 43 54 20 7a 32 2e 2a 20 46 52 4f 4d 20  ELECT z2.* FROM 
7690: 7a 31 2c 7a 32 20 4c 49 4d 49 54 20 31 22 20 20  z1,z2 LIMIT 1"  
76a0: 20 20 20 20 20 7b 7b 7d 20 32 31 7d 0a 20 20 35       {{} 21}.  5
76b0: 20 20 22 53 45 4c 45 43 54 20 7a 32 2e 2a 2c 20    "SELECT z2.*, 
76c0: 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 2c 7a 32 20  z1.* FROM z1,z2 
76d0: 4c 49 4d 49 54 20 31 22 20 7b 7b 7d 20 32 31 20  LIMIT 1" {{} 21 
76e0: 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c  51.65 -59.58 bel
76f0: 66 72 69 65 73 7d 0a 0a 20 20 36 20 20 22 53 45  fries}..  6  "SE
7700: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a  LECT count(*), *
7710: 20 46 52 4f 4d 20 7a 31 22 20 20 20 20 20 20 20   FROM z1"       
7720: 20 20 20 20 7b 36 20 36 33 20 62 6f 72 6e 20 2d      {6 63 born -
7730: 32 36 7d 0a 20 20 37 20 20 22 53 45 4c 45 43 54  26}.  7  "SELECT
7740: 20 6d 61 78 28 61 29 2c 20 2a 20 46 52 4f 4d 20   max(a), * FROM 
7750: 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20  z1"             
7760: 7b 36 33 20 36 33 20 62 6f 72 6e 20 2d 32 36 7d  {63 63 born -26}
7770: 0a 20 20 38 20 20 22 53 45 4c 45 43 54 20 2a 2c  .  8  "SELECT *,
7780: 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 7a 31 22   min(a) FROM z1"
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 36 33               {63
77a0: 20 62 6f 72 6e 20 2d 32 36 20 2d 35 7d 0a 0a 20   born -26 -5}.. 
77b0: 20 39 20 20 22 53 45 4c 45 43 54 20 2a 2c 2a 20   9  "SELECT *,* 
77c0: 46 52 4f 4d 20 7a 31 2c 7a 32 20 4c 49 4d 49 54  FROM z1,z2 LIMIT
77d0: 20 31 22 20 7b 20 20 20 20 20 20 20 20 0a 20 20   1" {        .  
77e0: 20 20 20 35 31 2e 36 35 20 2d 35 39 2e 35 38 20     51.65 -59.58 
77f0: 62 65 6c 66 72 69 65 73 20 7b 7d 20 32 31 20 35  belfries {} 21 5
7800: 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66  1.65 -59.58 belf
7810: 72 69 65 73 20 7b 7d 20 32 31 0a 20 20 7d 0a 20  ries {} 21.  }. 
7820: 20 31 30 20 22 53 45 4c 45 43 54 20 7a 31 2e 2a   10 "SELECT z1.*
7830: 2c 7a 31 2e 2a 20 46 52 4f 4d 20 7a 32 2c 7a 31  ,z1.* FROM z2,z1
7840: 20 4c 49 4d 49 54 20 31 22 20 7b 20 20 20 20 20   LIMIT 1" {     
7850: 20 20 20 0a 20 20 20 20 20 35 31 2e 36 35 20 2d     .     51.65 -
7860: 35 39 2e 35 38 20 62 65 6c 66 72 69 65 73 20 35  59.58 belfries 5
7870: 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65 6c 66  1.65 -59.58 belf
7880: 72 69 65 73 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56  ries.  }.}..# EV
7890: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 38  IDENCE-OF: R-618
78a0: 36 39 2d 32 32 35 37 38 20 49 74 20 69 73 20 61  69-22578 It is a
78b0: 6e 20 65 72 72 6f 72 20 74 6f 20 75 73 65 20 61  n error to use a
78c0: 20 22 2a 22 20 6f 72 20 22 61 6c 69 61 73 2e 2a   "*" or "alias.*
78d0: 22 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ".# expression i
78e0: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 20 6f 74  n any context ot
78f0: 68 65 72 20 74 68 61 6e 20 74 68 61 6e 20 61 20  her than than a 
7900: 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f  result expressio
7910: 6e 20 6c 69 73 74 2e 0a 23 0a 23 20 45 56 49 44  n list..#.# EVID
7920: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 33 32 34  ENCE-OF: R-44324
7930: 2d 34 31 31 36 36 20 49 74 20 69 73 20 61 6c 73  -41166 It is als
7940: 6f 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 75 73  o an error to us
7950: 65 20 61 20 22 2a 22 20 6f 72 0a 23 20 22 61 6c  e a "*" or.# "al
7960: 69 61 73 2e 2a 22 20 65 78 70 72 65 73 73 69 6f  ias.*" expressio
7970: 6e 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53 45  n in a simple SE
7980: 4c 45 43 54 20 71 75 65 72 79 20 74 68 61 74 20  LECT query that 
7990: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a  does not have a.
79a0: 23 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 23  # FROM clause..#
79b0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c  .foreach {tn sel
79c0: 65 63 74 20 65 72 72 7d 20 7b 0a 20 20 31 2e 31  ect err} {.  1.1
79d0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 2c 20    "SELECT a, b, 
79e0: 63 20 46 52 4f 4d 20 7a 31 20 57 48 45 52 45 20  c FROM z1 WHERE 
79f0: 2a 22 20 20 20 20 7b 6e 65 61 72 20 22 2a 22 3a  *"    {near "*":
7a00: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a 20   syntax error}. 
7a10: 20 31 2e 32 20 20 22 53 45 4c 45 43 54 20 61 2c   1.2  "SELECT a,
7a20: 20 62 2c 20 63 20 46 52 4f 4d 20 7a 31 20 47 52   b, c FROM z1 GR
7a30: 4f 55 50 20 42 59 20 2a 22 20 7b 6e 65 61 72 20  OUP BY *" {near 
7a40: 22 2a 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  "*": syntax erro
7a50: 72 7d 0a 20 20 31 2e 33 20 20 22 53 45 4c 45 43  r}.  1.3  "SELEC
7a60: 54 20 31 20 2b 20 2a 20 46 52 4f 4d 20 7a 31 22  T 1 + * FROM z1"
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 6e                {n
7a80: 65 61 72 20 22 2a 22 3a 20 73 79 6e 74 61 78 20  ear "*": syntax 
7a90: 65 72 72 6f 72 7d 0a 20 20 31 2e 34 20 20 22 53  error}.  1.4  "S
7aa0: 45 4c 45 43 54 20 2a 20 2b 20 31 20 46 52 4f 4d  ELECT * + 1 FROM
7ab0: 20 7a 31 22 20 20 20 20 20 20 20 20 20 20 20 20   z1"            
7ac0: 20 20 7b 6e 65 61 72 20 22 2b 22 3a 20 73 79 6e    {near "+": syn
7ad0: 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 32 2e  tax error}..  2.
7ae0: 31 20 22 53 45 4c 45 43 54 20 2a 22 20 7b 6e 6f  1 "SELECT *" {no
7af0: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
7b00: 64 7d 0a 20 20 32 2e 32 20 22 53 45 4c 45 43 54  d}.  2.2 "SELECT
7b10: 20 2a 20 57 48 45 52 45 20 31 22 20 7b 6e 6f 20   * WHERE 1" {no 
7b20: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
7b30: 7d 0a 20 20 32 2e 33 20 22 53 45 4c 45 43 54 20  }.  2.3 "SELECT 
7b40: 2a 20 57 48 45 52 45 20 30 22 20 7b 6e 6f 20 74  * WHERE 0" {no t
7b50: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 7d  ables specified}
7b60: 0a 20 20 32 2e 34 20 22 53 45 4c 45 43 54 20 63  .  2.4 "SELECT c
7b70: 6f 75 6e 74 28 2a 29 2c 20 2a 22 20 7b 6e 6f 20  ount(*), *" {no 
7b80: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
7b90: 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  }.} {.  do_catch
7ba0: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
7bb0: 74 2d 34 2e 32 2e 24 74 6e 20 24 73 65 6c 65 63  t-4.2.$tn $selec
7bc0: 74 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a  t [list 1 $err].
7bd0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
7be0: 3a 20 52 2d 30 38 36 36 39 2d 32 32 33 39 37 20  : R-08669-22397 
7bf0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  The number of co
7c00: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 6f 77  lumns in the row
7c10: 73 20 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20  s returned.# by 
7c20: 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20  a simple SELECT 
7c30: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 71 75  statement is equ
7c40: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
7c50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
7c60: 69 6e 0a 23 20 74 68 65 20 72 65 73 75 6c 74 20  in.# the result 
7c70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
7c80: 61 66 74 65 72 20 73 75 62 73 74 69 74 75 74 69  after substituti
7c90: 6f 6e 20 6f 66 20 2a 20 61 6e 64 20 61 6c 69 61  on of * and alia
7ca0: 73 2e 2a 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  s.*.# expression
7cb0: 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
7cc0: 20 73 65 6c 65 63 74 20 6e 43 6f 6c 7d 20 7b 0a   select nCol} {.
7cd0: 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 2a 20    1   "SELECT * 
7ce0: 46 52 4f 4d 20 7a 31 22 20 20 20 33 0a 20 20 32  FROM z1"   3.  2
7cf0: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
7d00: 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49  M z1 NATURAL JOI
7d10: 4e 20 7a 33 22 20 20 20 20 20 20 20 20 20 20 20  N z3"           
7d20: 20 33 0a 20 20 33 20 20 20 22 53 45 4c 45 43 54   3.  3   "SELECT
7d30: 20 7a 31 2e 2a 20 46 52 4f 4d 20 7a 31 20 4e 41   z1.* FROM z1 NA
7d40: 54 55 52 41 4c 20 4a 4f 49 4e 20 7a 33 22 20 20  TURAL JOIN z3"  
7d50: 20 20 20 20 20 20 20 33 0a 20 20 34 20 20 20 22         3.  4   "
7d60: 53 45 4c 45 43 54 20 7a 33 2e 2a 20 46 52 4f 4d  SELECT z3.* FROM
7d70: 20 7a 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   z1 NATURAL JOIN
7d80: 20 7a 33 22 20 20 20 20 20 20 20 20 20 32 0a 20   z3"         2. 
7d90: 20 35 20 20 20 22 53 45 4c 45 43 54 20 7a 31 2e   5   "SELECT z1.
7da0: 2a 2c 20 7a 33 2e 2a 20 46 52 4f 4d 20 7a 31 20  *, z3.* FROM z1 
7db0: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 7a 33 22  NATURAL JOIN z3"
7dc0: 20 20 20 35 0a 20 20 36 20 20 20 22 53 45 4c 45     5.  6   "SELE
7dd0: 43 54 20 31 2c 20 32 2c 20 7a 31 2e 2a 20 46 52  CT 1, 2, z1.* FR
7de0: 4f 4d 20 7a 31 22 20 20 20 20 20 20 20 20 20 20  OM z1"          
7df0: 20 20 20 20 20 20 20 20 20 35 0a 20 20 37 20 20           5.  7  
7e00: 20 22 53 45 4c 45 43 54 20 61 2c 20 2a 2c 20 62   "SELECT a, *, b
7e10: 2c 20 63 20 46 52 4f 4d 20 7a 31 22 20 20 20 20  , c FROM z1"    
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
7e30: 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 74 6d  .} {.  set ::stm
7e40: 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  t [sqlite3_prepa
7e50: 72 65 5f 76 32 20 64 62 20 24 73 65 6c 65 63 74  re_v2 db $select
7e60: 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 64 6f 5f   -1 DUMMY].  do_
7e70: 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e  test e_select-4.
7e80: 33 2e 24 74 6e 20 7b 20 73 71 6c 69 74 65 33 5f  3.$tn { sqlite3_
7e90: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 24 3a 3a  column_count $::
7ea0: 73 74 6d 74 20 7d 20 24 6e 43 6f 6c 0a 20 20 73  stmt } $nCol.  s
7eb0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
7ec0: 24 3a 3a 73 74 6d 74 0a 7d 0a 0a 0a 0a 23 20 49  $::stmt.}....# I
7ed0: 6e 20 6c 61 6e 67 5f 73 65 6c 65 63 74 2e 68 74  n lang_select.ht
7ee0: 6d 6c 2c 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  ml, a non-aggreg
7ef0: 61 74 65 20 71 75 65 72 79 20 69 73 20 64 65 66  ate query is def
7f00: 69 6e 65 64 20 61 73 20 61 6e 79 20 73 69 6d 70  ined as any simp
7f10: 6c 65 20 53 45 4c 45 43 54 0a 23 20 74 68 61 74  le SELECT.# that
7f20: 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
7f30: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 61   clause and no a
7f40: 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
7f50: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
7f60: 6c 74 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  lt.# expression 
7f70: 6c 69 73 74 2e 20 4f 74 68 65 72 20 71 75 65 72  list. Other quer
7f80: 69 65 73 20 61 72 65 20 61 67 67 72 65 67 61 74  ies are aggregat
7f90: 65 20 71 75 65 72 69 65 73 2e 20 54 65 73 74 20  e queries. Test 
7fa0: 63 61 73 65 73 0a 23 20 65 5f 73 65 6c 65 63 74  cases.# e_select
7fb0: 2d 34 2e 34 2e 2a 20 74 68 72 6f 75 67 68 20 65  -4.4.* through e
7fc0: 5f 73 65 6c 65 63 74 2d 34 2e 31 32 2e 2a 2c 20  _select-4.12.*, 
7fd0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 68 69 63 68  inclusive, which
7fe0: 20 74 65 73 74 20 74 68 65 20 70 61 72 74 20 6f   test the part o
7ff0: 66 0a 23 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  f.# simple SELEC
8000: 54 20 74 68 61 74 20 69 73 20 64 69 66 66 65 72  T that is differ
8010: 65 6e 74 20 66 6f 72 20 61 67 67 72 65 67 61 74  ent for aggregat
8020: 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
8030: 61 74 65 20 71 75 65 72 69 65 73 0a 23 20 76 65  ate queries.# ve
8040: 72 69 66 79 20 28 69 6e 20 61 20 77 61 79 29 20  rify (in a way) 
8050: 74 68 61 74 20 74 68 65 73 65 20 64 65 66 69 6e  that these defin
8060: 69 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69  itions are consi
8070: 73 74 65 6e 74 3a 0a 23 0a 23 20 45 56 49 44 45  stent:.#.# EVIDE
8080: 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 36 33 37 2d  NCE-OF: R-20637-
8090: 34 33 34 36 33 20 41 20 73 69 6d 70 6c 65 20 53  43463 A simple S
80a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
80b0: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  is an aggregate.
80c0: 23 20 71 75 65 72 79 20 69 66 20 69 74 20 63 6f  # query if it co
80d0: 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20 61 20  ntains either a 
80e0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
80f0: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  or one or more a
8100: 67 67 72 65 67 61 74 65 0a 23 20 66 75 6e 63 74  ggregate.# funct
8110: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
8120: 6c 74 2d 73 65 74 2e 0a 23 0a 23 20 45 56 49 44  lt-set..#.# EVID
8130: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 31 35 35  ENCE-OF: R-23155
8140: 2d 35 35 35 39 37 20 4f 74 68 65 72 77 69 73 65  -55597 Otherwise
8150: 2c 20 69 66 20 61 20 73 69 6d 70 6c 65 20 53 45  , if a simple SE
8160: 4c 45 43 54 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  LECT contains no
8170: 0a 23 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  .# aggregate fun
8180: 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
8190: 50 20 42 59 20 63 6c 61 75 73 65 2c 20 69 74 20  P BY clause, it 
81a0: 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  is a non-aggrega
81b0: 74 65 20 71 75 65 72 79 2e 0a 23 0a 0a 23 20 45  te query..#..# E
81c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
81d0: 30 35 30 2d 34 37 33 36 32 20 49 66 20 74 68 65  050-47362 If the
81e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
81f0: 74 20 69 73 20 61 20 6e 6f 6e 2d 61 67 67 72 65  t is a non-aggre
8200: 67 61 74 65 0a 23 20 71 75 65 72 79 2c 20 74 68  gate.# query, th
8210: 65 6e 20 65 61 63 68 20 65 78 70 72 65 73 73 69  en each expressi
8220: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
8230: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8240: 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 23 20   is evaluated.# 
8250: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
8260: 74 68 65 20 64 61 74 61 73 65 74 20 66 69 6c 74  the dataset filt
8270: 65 72 65 64 20 62 79 20 74 68 65 20 57 48 45 52  ered by the WHER
8280: 45 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 73  E clause..#.do_s
8290: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
82a0: 6c 65 63 74 2d 34 2e 34 20 7b 0a 20 20 31 20 22  lect-4.4 {.  1 "
82b0: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
82c0: 20 7a 31 22 0a 20 20 20 20 7b 35 31 2e 36 35 20   z1".    {51.65 
82d0: 2d 35 39 2e 35 38 20 2d 35 20 7b 7d 20 2d 32 2e  -59.58 -5 {} -2.
82e0: 32 20 2d 32 33 2e 31 38 20 7b 7d 20 36 37 20 2d  2 -23.18 {} 67 -
82f0: 31 2e 30 34 20 2d 33 32 2e 33 20 36 33 20 62 6f  1.04 -32.3 63 bo
8300: 72 6e 7d 0a 0a 20 20 32 20 22 53 45 4c 45 43 54  rn}..  2 "SELECT
8310: 20 61 20 49 53 20 4e 55 4c 4c 2c 20 62 2b 31 2c   a IS NULL, b+1,
8320: 20 2a 20 46 52 4f 4d 20 7a 31 22 20 7b 0a 20 20   * FROM z1" {.  
8330: 20 20 20 20 20 20 30 20 2d 35 38 2e 35 38 20 20        0 -58.58  
8340: 20 35 31 2e 36 35 20 2d 35 39 2e 35 38 20 62 65   51.65 -59.58 be
8350: 6c 66 72 69 65 73 0a 20 20 20 20 20 20 20 20 30  lfries.        0
8360: 20 7b 7d 20 20 20 20 20 20 20 2d 35 20 7b 7d 20   {}       -5 {} 
8370: 37 35 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  75            . 
8380: 20 20 20 20 20 20 20 30 20 2d 32 32 2e 31 38 20         0 -22.18 
8390: 20 20 2d 32 2e 32 20 2d 32 33 2e 31 38 20 73 75    -2.2 -23.18 su
83a0: 69 74 65 72 73 0a 20 20 20 20 20 20 20 20 31 20  iters.        1 
83b0: 36 38 20 20 20 20 20 20 20 7b 7d 20 36 37 20 71  68       {} 67 q
83c0: 75 61 72 74 65 74 73 20 20 20 20 0a 20 20 20 20  uartets    .    
83d0: 20 20 20 20 30 20 2d 33 31 2e 33 20 20 20 20 2d      0 -31.3    -
83e0: 31 2e 30 34 20 2d 33 32 2e 33 20 61 73 70 65 6e  1.04 -32.3 aspen
83f0: 0a 20 20 20 20 20 20 20 20 30 20 31 20 20 20 20  .        0 1    
8400: 20 20 20 20 36 33 20 62 6f 72 6e 20 2d 32 36 0a      63 born -26.
8410: 20 20 7d 0a 0a 20 20 33 20 22 53 45 4c 45 43 54    }..  3 "SELECT
8420: 20 33 32 2a 33 32 2c 20 64 7c 7c 65 20 46 52 4f   32*32, d||e FRO
8430: 4d 20 7a 32 22 20 7b 31 30 32 34 20 7b 7d 20 31  M z2" {1024 {} 1
8440: 30 32 34 20 33 36 36 7d 0a 7d 0a 0a 0a 23 20 54  024 366}.}...# T
8450: 65 73 74 20 63 61 73 65 73 20 65 5f 73 65 6c 65  est cases e_sele
8460: 63 74 2d 34 2e 35 2e 2a 20 61 6e 64 20 65 5f 73  ct-4.5.* and e_s
8470: 65 6c 65 63 74 2d 34 2e 36 2e 2a 20 74 6f 67 65  elect-4.6.* toge
8480: 74 68 65 72 20 73 68 6f 77 20 74 68 61 74 3a 0a  ther show that:.
8490: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
84a0: 20 52 2d 35 31 39 38 38 2d 30 31 31 32 34 20 54   R-51988-01124 T
84b0: 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  he single row of
84c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 64 61 74 61   result-set data
84d0: 20 63 72 65 61 74 65 64 0a 23 20 62 79 20 65 76   created.# by ev
84e0: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 61 67 67  aluating the agg
84f0: 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
8500: 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
8510: 69 6f 6e 73 20 69 6e 20 74 68 65 0a 23 20 72 65  ions in the.# re
8520: 73 75 6c 74 2d 73 65 74 20 66 6f 72 6d 73 20 74  sult-set forms t
8530: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20  he result of an 
8540: 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
8550: 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
8560: 42 59 0a 23 20 63 6c 61 75 73 65 2e 0a 23 0a 0a  BY.# clause..#..
8570: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8580: 2d 35 37 36 32 39 2d 32 35 32 35 33 20 49 66 20  -57629-25253 If 
8590: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
85a0: 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
85b0: 67 61 74 65 0a 23 20 71 75 65 72 79 20 77 69 74  gate.# query wit
85c0: 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 20  hout a GROUP BY 
85d0: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 65 61 63  clause, then eac
85e0: 68 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  h aggregate expr
85f0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 23 20  ession in the.# 
8600: 72 65 73 75 6c 74 2d 73 65 74 20 69 73 20 65 76  result-set is ev
8610: 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 63 72  aluated once acr
8620: 6f 73 73 20 74 68 65 20 65 6e 74 69 72 65 20 64  oss the entire d
8630: 61 74 61 73 65 74 2e 0a 23 0a 64 6f 5f 73 65 6c  ataset..#.do_sel
8640: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
8650: 63 74 2d 34 2e 35 20 7b 0a 20 20 31 20 22 53 45  ct-4.5 {.  1 "SE
8660: 4c 45 43 54 20 63 6f 75 6e 74 28 61 29 2c 20 6d  LECT count(a), m
8670: 61 78 28 61 29 2c 20 63 6f 75 6e 74 28 62 29 2c  ax(a), count(b),
8680: 20 6d 61 78 28 62 29 20 46 52 4f 4d 20 7a 31 22   max(b) FROM z1"
8690: 20 20 20 20 20 20 7b 35 20 36 33 20 35 20 62 6f        {5 63 5 bo
86a0: 72 6e 7d 0a 20 20 32 20 22 53 45 4c 45 43 54 20  rn}.  2 "SELECT 
86b0: 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 31 29  count(*), max(1)
86c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 7b 31 20 31 7d 0a 0a 20 20 33 20 22 53 45 4c   {1 1}..  3 "SEL
86f0: 45 43 54 20 73 75 6d 28 62 2b 31 29 20 46 52 4f  ECT sum(b+1) FRO
8700: 4d 20 7a 31 20 4e 41 54 55 52 41 4c 20 4c 45 46  M z1 NATURAL LEF
8710: 54 20 4a 4f 49 4e 20 7a 33 22 20 20 20 20 20 20  T JOIN z3"      
8720: 20 20 20 20 20 7b 2d 34 33 2e 30 36 7d 0a 20 20       {-43.06}.  
8730: 34 20 22 53 45 4c 45 43 54 20 73 75 6d 28 62 2b  4 "SELECT sum(b+
8740: 32 29 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52  2) FROM z1 NATUR
8750: 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 7a 33 22  AL LEFT JOIN z3"
8760: 20 20 20 20 20 20 20 20 20 20 20 7b 2d 33 38 2e             {-38.
8770: 30 36 7d 0a 20 20 35 20 22 53 45 4c 45 43 54 20  06}.  5 "SELECT 
8780: 73 75 6d 28 62 20 49 53 20 4e 4f 54 20 4e 55 4c  sum(b IS NOT NUL
8790: 4c 29 20 46 52 4f 4d 20 7a 31 20 4e 41 54 55 52  L) FROM z1 NATUR
87a0: 41 4c 20 4c 45 46 54 20 4a 4f 49 4e 20 7a 33 22  AL LEFT JOIN z3"
87b0: 20 7b 35 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e   {5}.}..# EVIDEN
87c0: 43 45 2d 4f 46 3a 20 52 2d 32 36 36 38 34 2d 34  CE-OF: R-26684-4
87d0: 30 35 37 36 20 45 61 63 68 20 6e 6f 6e 2d 61 67  0576 Each non-ag
87e0: 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
87f0: 6f 6e 20 69 6e 20 74 68 65 0a 23 20 72 65 73 75  on in the.# resu
8800: 6c 74 2d 73 65 74 20 69 73 20 65 76 61 6c 75 61  lt-set is evalua
8810: 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 61 6e 20  ted once for an 
8820: 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65  arbitrarily sele
8830: 63 74 65 64 20 72 6f 77 20 6f 66 20 74 68 65 0a  cted row of the.
8840: 23 20 64 61 74 61 73 65 74 2e 0a 23 0a 23 20 45  # dataset..#.# E
8850: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
8860: 39 39 34 2d 36 30 33 37 36 20 54 68 65 20 73 61  994-60376 The sa
8870: 6d 65 20 61 72 62 69 74 72 61 72 69 6c 79 20 73  me arbitrarily s
8880: 65 6c 65 63 74 65 64 20 72 6f 77 20 69 73 20 75  elected row is u
8890: 73 65 64 0a 23 20 66 6f 72 20 65 61 63 68 20 6e  sed.# for each n
88a0: 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 65 78 70  on-aggregate exp
88b0: 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20 20 20 4e  ression..#.#   N
88c0: 6f 74 65 3a 20 54 68 65 20 72 65 73 75 6c 74 73  ote: The results
88d0: 20 6f 66 20 6d 61 6e 79 20 6f 66 20 74 68 65 20   of many of the 
88e0: 71 75 65 72 69 65 73 20 69 6e 20 74 68 69 73 20  queries in this 
88f0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 61  block of tests a
8900: 72 65 0a 23 20 20 20 74 65 63 68 6e 69 63 61 6c  re.#   technical
8910: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2c 20 61 73  ly undefined, as
8920: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
8930: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63  on does not spec
8940: 69 66 79 20 77 68 69 63 68 20 72 6f 77 0a 23 20  ify which row.# 
8950: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 61 72    SQLite will ar
8960: 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65 63 74  bitrarily select
8970: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
8980: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
8990: 65 0a 23 20 20 20 6e 6f 6e 2d 61 67 67 72 65 67  e.#   non-aggreg
89a0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
89b0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
89c0: 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  es.do_execsql_te
89d0: 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 36 2e  st e_select-4.6.
89e0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
89f0: 4c 45 20 61 31 28 6f 6e 65 20 50 52 49 4d 41 52  LE a1(one PRIMAR
8a00: 59 20 4b 45 59 2c 20 74 77 6f 29 3b 0a 20 20 49  Y KEY, two);.  I
8a10: 4e 53 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41  NSERT INTO a1 VA
8a20: 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e  LUES(1, 1);.  IN
8a30: 53 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c  SERT INTO a1 VAL
8a40: 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 49 4e 53  UES(2, 3);.  INS
8a50: 45 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c 55  ERT INTO a1 VALU
8a60: 45 53 28 33 2c 20 36 29 3b 0a 20 20 49 4e 53 45  ES(3, 6);.  INSE
8a70: 52 54 20 49 4e 54 4f 20 61 31 20 56 41 4c 55 45  RT INTO a1 VALUE
8a80: 53 28 34 2c 20 31 30 29 3b 0a 0a 20 20 43 52 45  S(4, 10);..  CRE
8a90: 41 54 45 20 54 41 42 4c 45 20 61 32 28 6f 6e 65  ATE TABLE a2(one
8aa0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8ab0: 72 65 65 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ree);.  INSERT I
8ac0: 4e 54 4f 20 61 32 20 56 41 4c 55 45 53 28 31 2c  NTO a2 VALUES(1,
8ad0: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
8ae0: 54 4f 20 61 32 20 56 41 4c 55 45 53 28 33 2c 20  TO a2 VALUES(3, 
8af0: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
8b00: 4f 20 61 32 20 56 41 4c 55 45 53 28 36 2c 20 33  O a2 VALUES(6, 3
8b10: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
8b20: 20 61 32 20 56 41 4c 55 45 53 28 31 30 2c 20 34   a2 VALUES(10, 4
8b30: 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65 6c 65 63  );.} {}.do_selec
8b40: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
8b50: 2d 34 2e 36 20 7b 0a 20 20 31 20 22 53 45 4c 45  -4.6 {.  1 "SELE
8b60: 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f 75  CT one, two, cou
8b70: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 22 20 20  nt(*) FROM a1"  
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 20 7b 34 20 31 30 20 34 7d 20 0a        {4 10 4} .
8ba0: 20 20 32 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c    2 "SELECT one,
8bb0: 20 74 77 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46   two, count(*) F
8bc0: 52 4f 4d 20 61 31 20 57 48 45 52 45 20 6f 6e 65  ROM a1 WHERE one
8bd0: 3c 33 22 20 20 20 20 20 20 20 20 20 20 20 20 7b  <3"            {
8be0: 32 20 33 20 32 7d 20 0a 20 20 33 20 22 53 45 4c  2 3 2} .  3 "SEL
8bf0: 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 63 6f  ECT one, two, co
8c00: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31 20 57  unt(*) FROM a1 W
8c10: 48 45 52 45 20 6f 6e 65 3e 33 22 20 20 20 20 20  HERE one>3"     
8c20: 20 20 20 20 20 20 20 7b 34 20 31 30 20 31 7d 20         {4 10 1} 
8c30: 0a 20 20 34 20 22 53 45 4c 45 43 54 20 2a 2c 20  .  4 "SELECT *, 
8c40: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31  count(*) FROM a1
8c50: 20 4a 4f 49 4e 20 61 32 22 20 20 20 20 20 20 20   JOIN a2"       
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 7b 34 20 31 30 20 31 30 20 34 20 31 36 7d 20 0a  {4 10 10 4 16} .
8c80: 20 20 35 20 22 53 45 4c 45 43 54 20 2a 2c 20 73    5 "SELECT *, s
8c90: 75 6d 28 74 68 72 65 65 29 20 46 52 4f 4d 20 61  um(three) FROM a
8ca0: 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 61  1 NATURAL JOIN a
8cb0: 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  2"             {
8cc0: 33 20 36 20 32 20 33 7d 0a 20 20 36 20 22 53 45  3 6 2 3}.  6 "SE
8cd0: 4c 45 43 54 20 2a 2c 20 73 75 6d 28 74 68 72 65  LECT *, sum(thre
8ce0: 65 29 20 46 52 4f 4d 20 61 31 20 4e 41 54 55 52  e) FROM a1 NATUR
8cf0: 41 4c 20 4a 4f 49 4e 20 61 32 22 20 20 20 20 20  AL JOIN a2"     
8d00: 20 20 20 20 20 20 20 20 7b 33 20 36 20 32 20 33          {3 6 2 3
8d10: 7d 0a 20 20 37 20 22 53 45 4c 45 43 54 20 67 72  }.  7 "SELECT gr
8d20: 6f 75 70 5f 63 6f 6e 63 61 74 28 74 68 72 65 65  oup_concat(three
8d30: 2c 20 27 27 29 2c 20 61 31 2e 2a 20 46 52 4f 4d  , ''), a1.* FROM
8d40: 20 61 31 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   a1 NATURAL JOIN
8d50: 20 61 32 22 20 7b 31 32 20 33 20 36 7d 0a 7d 0a   a2" {12 3 6}.}.
8d60: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8d70: 52 2d 30 34 34 38 36 2d 30 37 32 36 36 20 4f 72  R-04486-07266 Or
8d80: 2c 20 69 66 20 74 68 65 20 64 61 74 61 73 65 74  , if the dataset
8d90: 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 72   contains zero r
8da0: 6f 77 73 2c 20 74 68 65 6e 0a 23 20 65 61 63 68  ows, then.# each
8db0: 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 65   non-aggregate e
8dc0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
8dd0: 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 61  luated against a
8de0: 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e 67 0a   row consisting.
8df0: 23 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 4e 55  # entirely of NU
8e00: 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 64 6f 5f  LL values..#.do_
8e10: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
8e20: 65 6c 65 63 74 2d 34 2e 37 20 7b 0a 20 20 31 20  elect-4.7 {.  1 
8e30: 20 22 53 45 4c 45 43 54 20 6f 6e 65 2c 20 74 77   "SELECT one, tw
8e40: 6f 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  o, count(*) FROM
8e50: 20 61 31 20 57 48 45 52 45 20 30 22 20 20 20 20   a1 WHERE 0"    
8e60: 20 20 20 20 20 20 20 7b 7b 7d 20 7b 7d 20 30 7d         {{} {} 0}
8e70: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 73 75  .  2  "SELECT su
8e80: 6d 28 74 77 6f 29 2c 20 2a 20 46 52 4f 4d 20 61  m(two), * FROM a
8e90: 31 2c 20 61 32 20 57 48 45 52 45 20 74 68 72 65  1, a2 WHERE thre
8ea0: 65 3e 35 22 20 20 20 20 20 20 20 20 7b 7b 7d 20  e>5"        {{} 
8eb0: 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 20 20 33  {} {} {} {}}.  3
8ec0: 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 6f 6e    "SELECT max(on
8ed0: 65 29 20 49 53 20 4e 55 4c 4c 2c 20 6f 6e 65 20  e) IS NULL, one 
8ee0: 49 53 20 4e 55 4c 4c 2c 20 74 77 6f 20 49 53 20  IS NULL, two IS 
8ef0: 4e 55 4c 4c 20 46 52 4f 4d 20 61 31 20 57 48 45  NULL FROM a1 WHE
8f00: 52 45 20 74 77 6f 3d 37 22 20 7b 0a 20 20 20 20  RE two=7" {.    
8f10: 31 20 31 20 31 0a 20 20 7d 0a 7d 20 0a 0a 23 20  1 1 1.  }.} ..# 
8f20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
8f30: 34 31 33 38 2d 32 38 37 37 34 20 41 6e 20 61 67  4138-28774 An ag
8f40: 67 72 65 67 61 74 65 20 71 75 65 72 79 20 77 69  gregate query wi
8f50: 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
8f60: 0a 23 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  .# clause always
8f70: 20 72 65 74 75 72 6e 73 20 65 78 61 63 74 6c 79   returns exactly
8f80: 20 6f 6e 65 20 72 6f 77 20 6f 66 20 64 61 74 61   one row of data
8f90: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  , even if there 
8fa0: 61 72 65 20 7a 65 72 6f 0a 23 20 72 6f 77 73 20  are zero.# rows 
8fb0: 6f 66 20 69 6e 70 75 74 20 64 61 74 61 2e 0a 23  of input data..#
8fc0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c  .foreach {tn sel
8fd0: 65 63 74 7d 20 7b 0a 20 20 38 2e 31 20 20 22 53  ect} {.  8.1  "S
8fe0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
8ff0: 52 4f 4d 20 61 31 22 0a 20 20 38 2e 32 20 20 22  ROM a1".  8.2  "
9000: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9010: 46 52 4f 4d 20 61 31 20 57 48 45 52 45 20 30 22  FROM a1 WHERE 0"
9020: 0a 20 20 38 2e 33 20 20 22 53 45 4c 45 43 54 20  .  8.3  "SELECT 
9030: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 31  count(*) FROM a1
9040: 20 57 48 45 52 45 20 31 22 0a 20 20 38 2e 34 20   WHERE 1".  8.4 
9050: 20 22 53 45 4c 45 43 54 20 6d 61 78 28 61 31 2e   "SELECT max(a1.
9060: 6f 6e 65 29 2b 6d 69 6e 28 74 77 6f 29 2c 20 61  one)+min(two), a
9070: 31 2e 6f 6e 65 2c 20 74 77 6f 2c 20 2a 20 46 52  1.one, two, * FR
9080: 4f 4d 20 61 31 2c 20 61 32 20 57 48 45 52 45 20  OM a1, a2 WHERE 
9090: 31 22 0a 20 20 38 2e 35 20 20 22 53 45 4c 45 43  1".  8.5  "SELEC
90a0: 54 20 6d 61 78 28 61 31 2e 6f 6e 65 29 2b 6d 69  T max(a1.one)+mi
90b0: 6e 28 74 77 6f 29 2c 20 61 31 2e 6f 6e 65 2c 20  n(two), a1.one, 
90c0: 74 77 6f 2c 20 2a 20 46 52 4f 4d 20 61 31 2c 20  two, * FROM a1, 
90d0: 61 32 20 57 48 45 52 45 20 30 22 0a 7d 20 7b 0a  a2 WHERE 0".} {.
90e0: 20 20 23 20 53 65 74 20 24 6e 52 6f 77 20 74 6f    # Set $nRow to
90f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
9100: 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ows returned by 
9110: 24 73 65 6c 65 63 74 3a 0a 20 20 73 65 74 20 3a  $select:.  set :
9120: 3a 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70  :stmt [sqlite3_p
9130: 72 65 70 61 72 65 5f 76 32 20 64 62 20 24 73 65  repare_v2 db $se
9140: 6c 65 63 74 20 2d 31 20 44 55 4d 4d 59 5d 0a 20  lect -1 DUMMY]. 
9150: 20 73 65 74 20 6e 52 6f 77 20 30 0a 20 20 77 68   set nRow 0.  wh
9160: 69 6c 65 20 7b 22 53 51 4c 49 54 45 5f 52 4f 57  ile {"SQLITE_ROW
9170: 22 20 3d 3d 20 5b 73 71 6c 69 74 65 33 5f 73 74  " == [sqlite3_st
9180: 65 70 20 24 3a 3a 73 74 6d 74 5d 7d 20 7b 20 69  ep $::stmt]} { i
9190: 6e 63 72 20 6e 52 6f 77 20 7d 0a 20 20 73 65 74  ncr nRow }.  set
91a0: 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e   rc [sqlite3_fin
91b0: 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74 5d 0a 0a  alize $::stmt]..
91c0: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 24 6e    # Test that $n
91d0: 52 6f 77 3d 3d 31 20 61 6e 64 20 74 68 61 74 20  Row==1 and that 
91e0: 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74  statement execut
91f0: 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
9200: 75 6c 20 0a 20 20 23 20 28 72 63 3d 3d 53 51 4c  ul .  # (rc==SQL
9210: 49 54 45 5f 4f 4b 29 2e 0a 20 20 64 6f 5f 74 65  ITE_OK)..  do_te
9220: 73 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 24 74  st e_select-4.$t
9230: 6e 20 5b 6c 69 73 74 20 6c 69 73 74 20 24 72 63  n [list list $rc
9240: 20 24 6e 52 6f 77 5d 20 7b 53 51 4c 49 54 45 5f   $nRow] {SQLITE_
9250: 4f 4b 20 31 7d 0a 7d 0a 0a 64 72 6f 70 5f 61 6c  OK 1}.}..drop_al
9260: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63  l_tables.do_exec
9270: 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
9280: 74 2d 34 2e 39 2e 30 20 7b 0a 20 20 43 52 45 41  t-4.9.0 {.  CREA
9290: 54 45 20 54 41 42 4c 45 20 62 31 28 6f 6e 65 20  TE TABLE b1(one 
92a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 77 6f  PRIMARY KEY, two
92b0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
92c0: 20 62 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   b1 VALUES(1, 'o
92d0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
92e0: 4f 20 62 31 20 56 41 4c 55 45 53 28 34 2c 20 27  O b1 VALUES(4, '
92f0: 66 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  f');.  INSERT IN
9300: 54 4f 20 62 31 20 56 41 4c 55 45 53 28 33 2c 20  TO b1 VALUES(3, 
9310: 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  't');.  INSERT I
9320: 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 32 2c  NTO b1 VALUES(2,
9330: 20 27 74 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   't');.  INSERT 
9340: 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 35  INTO b1 VALUES(5
9350: 2c 20 27 66 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'f');.  INSERT
9360: 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28   INTO b1 VALUES(
9370: 37 2c 20 27 73 27 29 3b 0a 20 20 49 4e 53 45 52  7, 's');.  INSER
9380: 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53  T INTO b1 VALUES
9390: 28 36 2c 20 27 73 27 29 3b 0a 0a 20 20 43 52 45  (6, 's');..  CRE
93a0: 41 54 45 20 54 41 42 4c 45 20 62 32 28 78 2c 20  ATE TABLE b2(x, 
93b0: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
93c0: 4f 20 62 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O b2 VALUES(NULL
93d0: 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 0);.  INSERT I
93e0: 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28 4e 55  NTO b2 VALUES(NU
93f0: 4c 4c 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54  LL, 1);.  INSERT
9400: 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28   INTO b2 VALUES(
9410: 27 78 79 7a 27 2c 20 32 29 3b 0a 20 20 49 4e 53  'xyz', 2);.  INS
9420: 45 52 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55  ERT INTO b2 VALU
9430: 45 53 28 27 61 62 63 27 2c 20 33 29 3b 0a 20 20  ES('abc', 3);.  
9440: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 32 20 56  INSERT INTO b2 V
9450: 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 34 29 3b  ALUES('xyz', 4);
9460: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
9470: 20 62 33 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f   b3(a COLLATE no
9480: 63 61 73 65 2c 20 62 20 43 4f 4c 4c 41 54 45 20  case, b COLLATE 
9490: 62 69 6e 61 72 79 29 3b 0a 20 20 49 4e 53 45 52  binary);.  INSER
94a0: 54 20 49 4e 54 4f 20 62 33 20 56 41 4c 55 45 53  T INTO b3 VALUES
94b0: 28 27 61 62 63 27 2c 20 27 61 62 63 27 29 3b 0a  ('abc', 'abc');.
94c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 33    INSERT INTO b3
94d0: 20 56 41 4c 55 45 53 28 27 61 42 43 27 2c 20 27   VALUES('aBC', '
94e0: 61 42 43 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  aBC');.  INSERT 
94f0: 49 4e 54 4f 20 62 33 20 56 41 4c 55 45 53 28 27  INTO b3 VALUES('
9500: 44 65 66 27 2c 20 27 44 65 66 27 29 3b 0a 20 20  Def', 'Def');.  
9510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 33 20 56  INSERT INTO b3 V
9520: 41 4c 55 45 53 28 27 64 45 46 27 2c 20 27 64 45  ALUES('dEF', 'dE
9530: 46 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49  F');.} {}..# EVI
9540: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 37 35  DENCE-OF: R-5775
9550: 34 2d 35 37 31 30 39 20 49 66 20 74 68 65 20 53  4-57109 If the S
9560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9570: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  is an aggregate.
9580: 23 20 71 75 65 72 79 20 77 69 74 68 20 61 20 47  # query with a G
9590: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20  ROUP BY clause, 
95a0: 74 68 65 6e 20 65 61 63 68 20 6f 66 20 74 68 65  then each of the
95b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 70 65   expressions spe
95c0: 63 69 66 69 65 64 0a 23 20 61 73 20 70 61 72 74  cified.# as part
95d0: 20 6f 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   of the GROUP BY
95e0: 20 63 6c 61 75 73 65 20 69 73 20 65 76 61 6c 75   clause is evalu
95f0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 6f  ated for each ro
9600: 77 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61 73  w of the.# datas
9610: 65 74 2e 20 45 61 63 68 20 72 6f 77 20 69 73 20  et. Each row is 
9620: 74 68 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  then assigned to
9630: 20 61 20 22 67 72 6f 75 70 22 20 62 61 73 65 64   a "group" based
9640: 20 6f 6e 20 74 68 65 20 72 65 73 75 6c 74 73 3b   on the results;
9650: 0a 23 20 72 6f 77 73 20 66 6f 72 20 77 68 69 63  .# rows for whic
9660: 68 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  h the results of
9670: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
9680: 47 52 4f 55 50 20 42 59 20 65 78 70 72 65 73 73  GROUP BY express
9690: 69 6f 6e 73 20 61 72 65 0a 23 20 74 68 65 20 73  ions are.# the s
96a0: 61 6d 65 20 61 72 65 20 61 73 73 69 67 6e 65 64  ame are assigned
96b0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 67 72 6f   to the same gro
96c0: 75 70 2e 0a 23 0a 23 20 20 20 54 68 65 73 65 20  up..#.#   These 
96d0: 74 65 73 74 73 20 61 6c 73 6f 20 73 68 6f 77 20  tests also show 
96e0: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  that the followi
96f0: 6e 67 20 69 73 20 6e 6f 74 20 75 6e 74 72 75 65  ng is not untrue
9700: 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  :.#.# EVIDENCE-O
9710: 46 3a 20 52 2d 32 35 38 38 33 2d 35 35 30 36 33  F: R-25883-55063
9720: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   The expressions
9730: 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
9740: 20 63 6c 61 75 73 65 20 64 6f 0a 23 20 6e 6f 74   clause do.# not
9750: 20 68 61 76 65 20 74 6f 20 62 65 20 65 78 70 72   have to be expr
9760: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 70 70  essions that app
9770: 65 61 72 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ear in the resul
9780: 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  t..#.do_select_t
9790: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e  ests e_select-4.
97a0: 39 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54  9 {.  1  "SELECT
97b0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 6f 6e   group_concat(on
97c0: 65 29 2c 20 74 77 6f 20 46 52 4f 4d 20 62 31 20  e), two FROM b1 
97d0: 47 52 4f 55 50 20 42 59 20 74 77 6f 22 20 7b 0a  GROUP BY two" {.
97e0: 20 20 20 20 34 2c 35 20 66 20 20 20 31 20 6f 20      4,5 f   1 o 
97f0: 20 20 37 2c 36 20 20 20 73 20 33 2c 32 20 74 0a    7,6   s 3,2 t.
9800: 20 20 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54    }.  2  "SELECT
9810: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 6f 6e   group_concat(on
9820: 65 29 2c 20 73 75 6d 28 6f 6e 65 29 20 46 52 4f  e), sum(one) FRO
9830: 4d 20 62 31 20 47 52 4f 55 50 20 42 59 20 28 6f  M b1 GROUP BY (o
9840: 6e 65 3e 34 29 22 20 7b 0a 20 20 20 20 31 2c 34  ne>4)" {.    1,4
9850: 2c 33 2c 32 20 31 30 20 20 20 20 35 2c 37 2c 36  ,3,2 10    5,7,6
9860: 20 31 38 0a 20 20 7d 0a 20 20 33 20 20 22 53 45   18.  }.  3  "SE
9870: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
9880: 74 28 6f 6e 65 29 20 46 52 4f 4d 20 62 31 20 47  t(one) FROM b1 G
9890: 52 4f 55 50 20 42 59 20 28 74 77 6f 3e 27 6f 27  ROUP BY (two>'o'
98a0: 29 2c 20 6f 6e 65 25 32 22 20 7b 0a 20 20 20 20  ), one%2" {.    
98b0: 34 20 20 31 2c 35 20 20 20 20 32 2c 36 20 20 20  4  1,5    2,6   
98c0: 33 2c 37 0a 20 20 7d 0a 20 20 34 20 20 22 53 45  3,7.  }.  4  "SE
98d0: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
98e0: 74 28 6f 6e 65 29 20 46 52 4f 4d 20 62 31 20 47  t(one) FROM b1 G
98f0: 52 4f 55 50 20 42 59 20 28 6f 6e 65 3d 3d 32 20  ROUP BY (one==2 
9900: 4f 52 20 74 77 6f 3d 3d 27 6f 27 29 22 20 7b 0a  OR two=='o')" {.
9910: 20 20 20 20 34 2c 33 2c 35 2c 37 2c 36 20 20 20      4,3,5,7,6   
9920: 20 31 2c 32 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56   1,2.  }.}..# EV
9930: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 39  IDENCE-OF: R-149
9940: 32 36 2d 35 30 31 32 39 20 46 6f 72 20 74 68 65  26-50129 For the
9950: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 67 72 6f   purposes of gro
9960: 75 70 69 6e 67 20 72 6f 77 73 2c 20 4e 55 4c 4c  uping rows, NULL
9970: 0a 23 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  .# values are co
9980: 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 2e 0a  nsidered equal..
9990: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
99a0: 73 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 30 20  s e_select-4.10 
99b0: 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 67  {.  1  "SELECT g
99c0: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 79 29 20 46  roup_concat(y) F
99d0: 52 4f 4d 20 62 32 20 47 52 4f 55 50 20 42 59 20  ROM b2 GROUP BY 
99e0: 78 22 20 7b 30 2c 31 20 20 20 33 20 20 20 32 2c  x" {0,1   3   2,
99f0: 34 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20  4}.  2  "SELECT 
9a00: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 32  count(*) FROM b2
9a10: 20 47 52 4f 55 50 20 42 59 20 43 41 53 45 20 57   GROUP BY CASE W
9a20: 48 45 4e 20 79 3c 34 20 54 48 45 4e 20 4e 55 4c  HEN y<4 THEN NUL
9a30: 4c 20 45 4c 53 45 20 30 20 45 4e 44 22 20 7b 34  L ELSE 0 END" {4
9a40: 20 31 7d 0a 7d 20 0a 0a 23 20 45 56 49 44 45 4e   1}.} ..# EVIDEN
9a50: 43 45 2d 4f 46 3a 20 52 2d 31 30 34 37 30 2d 33  CE-OF: R-10470-3
9a60: 30 33 31 38 20 54 68 65 20 75 73 75 61 6c 20 72  0318 The usual r
9a70: 75 6c 65 73 20 66 6f 72 20 73 65 6c 65 63 74 69  ules for selecti
9a80: 6e 67 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 0a 23  ng a collation.#
9a90: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 77   sequence with w
9aa0: 68 69 63 68 20 74 6f 20 63 6f 6d 70 61 72 65 20  hich to compare 
9ab0: 74 65 78 74 20 76 61 6c 75 65 73 20 61 70 70 6c  text values appl
9ac0: 79 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e  y when evaluatin
9ad0: 67 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 73 20  g.# expressions 
9ae0: 69 6e 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  in a GROUP BY cl
9af0: 61 75 73 65 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  ause..#.do_selec
9b00: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
9b10: 2d 34 2e 31 31 20 7b 0a 20 20 31 20 20 22 53 45  -4.11 {.  1  "SE
9b20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9b30: 4f 4d 20 62 33 20 47 52 4f 55 50 20 42 59 20 62  OM b3 GROUP BY b
9b40: 22 20 20 20 20 20 20 7b 31 20 31 20 31 20 31 7d  "      {1 1 1 1}
9b50: 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20 63 6f  .  2  "SELECT co
9b60: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62 33 20 47  unt(*) FROM b3 G
9b70: 52 4f 55 50 20 42 59 20 61 22 20 20 20 20 20 20  ROUP BY a"      
9b80: 7b 32 20 32 7d 0a 20 20 33 20 20 22 53 45 4c 45  {2 2}.  3  "SELE
9b90: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9ba0: 20 62 33 20 47 52 4f 55 50 20 42 59 20 2b 62 22   b3 GROUP BY +b"
9bb0: 20 20 20 20 20 7b 31 20 31 20 31 20 31 7d 0a 20       {1 1 1 1}. 
9bc0: 20 34 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e   4  "SELECT coun
9bd0: 74 28 2a 29 20 46 52 4f 4d 20 62 33 20 47 52 4f  t(*) FROM b3 GRO
9be0: 55 50 20 42 59 20 2b 61 22 20 20 20 20 20 7b 32  UP BY +a"     {2
9bf0: 20 32 7d 0a 20 20 35 20 20 22 53 45 4c 45 43 54   2}.  5  "SELECT
9c00: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 62   count(*) FROM b
9c10: 33 20 47 52 4f 55 50 20 42 59 20 62 7c 7c 27 27  3 GROUP BY b||''
9c20: 22 20 20 7b 31 20 31 20 31 20 31 7d 0a 20 20 36  "  {1 1 1 1}.  6
9c30: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
9c40: 2a 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55 50  *) FROM b3 GROUP
9c50: 20 42 59 20 61 7c 7c 27 27 22 20 20 7b 31 20 31   BY a||''"  {1 1
9c60: 20 31 20 31 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   1 1}.}..# EVIDE
9c70: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 35 37 33 2d  NCE-OF: R-63573-
9c80: 35 30 37 33 30 20 54 68 65 20 65 78 70 72 65 73  50730 The expres
9c90: 73 69 6f 6e 73 20 69 6e 20 61 20 47 52 4f 55 50  sions in a GROUP
9ca0: 20 42 59 20 63 6c 61 75 73 65 20 6d 61 79 0a 23   BY clause may.#
9cb0: 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
9cc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23  e expressions..#
9cd0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 6c  .foreach {tn sel
9ce0: 65 63 74 7d 20 7b 0a 20 20 31 32 2e 31 20 20 22  ect} {.  12.1  "
9cf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 33  SELECT * FROM b3
9d00: 20 47 52 4f 55 50 20 42 59 20 63 6f 75 6e 74 28   GROUP BY count(
9d10: 2a 29 22 0a 20 20 31 32 2e 32 20 20 22 53 45 4c  *)".  12.2  "SEL
9d20: 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
9d30: 62 33 20 47 52 4f 55 50 20 42 59 20 6d 61 78 28  b3 GROUP BY max(
9d40: 62 29 22 0a 20 20 31 32 2e 33 20 20 22 53 45 4c  b)".  12.3  "SEL
9d50: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
9d60: 28 61 29 20 46 52 4f 4d 20 62 33 20 47 52 4f 55  (a) FROM b3 GROU
9d70: 50 20 42 59 20 61 2c 20 6d 61 78 28 62 29 22 0a  P BY a, max(b)".
9d80: 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 7b 31  } {.  set res {1
9d90: 20 7b 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   {aggregate func
9da0: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
9db0: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 47 52 4f  lowed in the GRO
9dc0: 55 50 20 42 59 20 63 6c 61 75 73 65 7d 7d 0a 20  UP BY clause}}. 
9dd0: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
9de0: 74 20 65 5f 73 65 6c 65 63 74 2d 34 2e 24 74 6e  t e_select-4.$tn
9df0: 20 24 73 65 6c 65 63 74 20 24 72 65 73 0a 7d 0a   $select $res.}.
9e00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9e10: 52 2d 33 31 35 33 37 2d 30 30 31 30 31 20 49 66  R-31537-00101 If
9e20: 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
9e30: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 69   is specified, i
9e40: 74 20 69 73 0a 23 20 65 76 61 6c 75 61 74 65 64  t is.# evaluated
9e50: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 67   once for each g
9e60: 72 6f 75 70 20 6f 66 20 72 6f 77 73 20 61 73 20  roup of rows as 
9e70: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
9e80: 73 69 6f 6e 2e 20 49 66 20 74 68 65 0a 23 20 72  sion. If the.# r
9e90: 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74  esult of evaluat
9ea0: 69 6e 67 20 74 68 65 20 48 41 56 49 4e 47 20 63  ing the HAVING c
9eb0: 6c 61 75 73 65 20 69 73 20 66 61 6c 73 65 2c 20  lause is false, 
9ec0: 74 68 65 20 67 72 6f 75 70 20 69 73 0a 23 20 64  the group is.# d
9ed0: 69 73 63 61 72 64 65 64 2e 0a 23 0a 23 20 20 20  iscarded..#.#   
9ee0: 54 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  This requirement
9ef0: 20 69 73 20 74 65 73 74 65 64 20 62 79 20 61 6c   is tested by al
9f00: 6c 20 65 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e  l e_select-4.13.
9f10: 2a 20 74 65 73 74 73 2e 0a 23 0a 23 20 45 56 49  * tests..#.# EVI
9f20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 31 33  DENCE-OF: R-0413
9f30: 32 2d 30 39 34 37 34 20 49 66 20 74 68 65 20 48  2-09474 If the H
9f40: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
9f50: 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20 65  an aggregate.# e
9f60: 78 70 72 65 73 73 69 6f 6e 2c 20 69 74 20 69 73  xpression, it is
9f70: 20 65 76 61 6c 75 61 74 65 64 20 61 63 72 6f 73   evaluated acros
9f80: 73 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68  s all rows in th
9f90: 65 20 67 72 6f 75 70 2e 0a 23 0a 23 20 20 20 54  e group..#.#   T
9fa0: 65 73 74 65 64 20 62 79 20 65 5f 73 65 6c 65 63  ested by e_selec
9fb0: 74 2d 34 2e 31 33 2e 31 2e 2a 0a 23 0a 23 20 45  t-4.13.1.*.#.# E
9fc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
9fd0: 32 36 32 2d 34 37 34 34 37 20 49 66 20 61 20 48  262-47447 If a H
9fe0: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
9ff0: 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 0a  a non-aggregate.
a000: 23 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 74  # expression, it
a010: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 77 69   is evaluated wi
a020: 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 61 6e  th respect to an
a030: 20 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c   arbitrarily sel
a040: 65 63 74 65 64 0a 23 20 72 6f 77 20 66 72 6f 6d  ected.# row from
a050: 20 74 68 65 20 67 72 6f 75 70 2e 0a 23 0a 23 20   the group..#.# 
a060: 20 20 54 65 73 74 65 64 20 62 79 20 65 5f 73 65    Tested by e_se
a070: 6c 65 63 74 2d 34 2e 31 33 2e 32 2e 2a 0a 23 0a  lect-4.13.2.*.#.
a080: 23 20 20 20 54 65 73 74 73 20 69 6e 20 74 68 69  #   Tests in thi
a090: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 73 68 6f  s block also sho
a0a0: 77 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  w that this is n
a0b0: 6f 74 20 75 6e 74 72 75 65 3a 0a 23 0a 23 20 45  ot untrue:.#.# E
a0c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
a0d0: 34 30 33 2d 31 33 34 35 30 20 54 68 65 20 48 41  403-13450 The HA
a0e0: 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
a0f0: 6d 61 79 20 72 65 66 65 72 20 74 6f 20 76 61 6c  may refer to val
a100: 75 65 73 2c 0a 23 20 65 76 65 6e 20 61 67 67 72  ues,.# even aggr
a110: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c  egate functions,
a120: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e   that are not in
a130: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 23 0a 64   the result..#.d
a140: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a150: 5f 73 65 6c 65 63 74 2d 34 2e 31 33 2e 30 20 7b  _select-4.13.0 {
a160: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
a170: 63 31 28 75 70 2c 20 64 6f 77 6e 29 3b 0a 20 20  c1(up, down);.  
a180: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
a190: 41 4c 55 45 53 28 27 78 27 2c 20 31 29 3b 0a 20  ALUES('x', 1);. 
a1a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
a1b0: 56 41 4c 55 45 53 28 27 78 27 2c 20 32 29 3b 0a  VALUES('x', 2);.
a1c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
a1d0: 20 56 41 4c 55 45 53 28 27 78 27 2c 20 34 29 3b   VALUES('x', 4);
a1e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
a1f0: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 38 29  1 VALUES('x', 8)
a200: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
a210: 63 31 20 56 41 4c 55 45 53 28 27 79 27 2c 20 31  c1 VALUES('y', 1
a220: 36 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  6);.  INSERT INT
a230: 4f 20 63 31 20 56 41 4c 55 45 53 28 27 79 27 2c  O c1 VALUES('y',
a240: 20 33 32 29 3b 0a 0a 20 20 43 52 45 41 54 45 20   32);..  CREATE 
a250: 54 41 42 4c 45 20 63 32 28 69 2c 20 6a 29 3b 0a  TABLE c2(i, j);.
a260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32    INSERT INTO c2
a270: 20 56 41 4c 55 45 53 28 31 2c 20 30 29 3b 0a 20   VALUES(1, 0);. 
a280: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20   INSERT INTO c2 
a290: 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20  VALUES(2, 1);.  
a2a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
a2b0: 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a 20 20 49  ALUES(3, 3);.  I
a2c0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
a2d0: 4c 55 45 53 28 34 2c 20 36 29 3b 0a 20 20 49 4e  LUES(4, 6);.  IN
a2e0: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
a2f0: 55 45 53 28 35 2c 20 31 30 29 3b 0a 20 20 49 4e  UES(5, 10);.  IN
a300: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
a310: 55 45 53 28 36 2c 20 31 35 29 3b 0a 20 20 49 4e  UES(6, 15);.  IN
a320: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
a330: 55 45 53 28 37 2c 20 32 31 29 3b 0a 20 20 49 4e  UES(7, 21);.  IN
a340: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
a350: 55 45 53 28 38 2c 20 32 38 29 3b 0a 20 20 49 4e  UES(8, 28);.  IN
a360: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
a370: 55 45 53 28 39 2c 20 33 36 29 3b 0a 0a 20 20 43  UES(9, 36);..  C
a380: 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 69  REATE TABLE c3(i
a390: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6b 20   PRIMARY KEY, k 
a3a0: 54 45 58 54 29 3b 0a 20 20 49 4e 53 45 52 54 20  TEXT);.  INSERT 
a3b0: 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31  INTO c3 VALUES(1
a3c0: 2c 20 20 27 68 79 64 72 6f 67 65 6e 27 29 3b 0a  ,  'hydrogen');.
a3d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33    INSERT INTO c3
a3e0: 20 56 41 4c 55 45 53 28 32 2c 20 20 27 68 65 6c   VALUES(2,  'hel
a3f0: 69 75 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ium');.  INSERT 
a400: 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 33  INTO c3 VALUES(3
a410: 2c 20 20 27 6c 69 74 68 69 75 6d 27 29 3b 0a 20  ,  'lithium');. 
a420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
a430: 56 41 4c 55 45 53 28 34 2c 20 20 27 62 65 72 79  VALUES(4,  'bery
a440: 6c 6c 69 75 6d 27 29 3b 0a 20 20 49 4e 53 45 52  llium');.  INSER
a450: 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53  T INTO c3 VALUES
a460: 28 35 2c 20 20 27 62 6f 72 6f 6e 27 29 3b 0a 20  (5,  'boron');. 
a470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
a480: 56 41 4c 55 45 53 28 39 34 2c 20 27 70 6c 75 74  VALUES(94, 'plut
a490: 6f 6e 69 75 6d 27 29 3b 0a 7d 20 7b 7d 0a 0a 64  onium');.} {}..d
a4a0: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
a4b0: 5f 73 65 6c 65 63 74 2d 34 2e 31 33 20 7b 0a 20  _select-4.13 {. 
a4c0: 20 31 2e 31 20 20 22 53 45 4c 45 43 54 20 75 70   1.1  "SELECT up
a4d0: 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50 20 42   FROM c1 GROUP B
a4e0: 59 20 75 70 20 48 41 56 49 4e 47 20 63 6f 75 6e  Y up HAVING coun
a4f0: 74 28 2a 29 3e 33 22 20 7b 78 7d 0a 20 20 31 2e  t(*)>3" {x}.  1.
a500: 32 20 20 22 53 45 4c 45 43 54 20 75 70 20 46 52  2  "SELECT up FR
a510: 4f 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20 75  OM c1 GROUP BY u
a520: 70 20 48 41 56 49 4e 47 20 73 75 6d 28 64 6f 77  p HAVING sum(dow
a530: 6e 29 3e 31 36 22 20 7b 79 7d 0a 20 20 31 2e 33  n)>16" {y}.  1.3
a540: 20 20 22 53 45 4c 45 43 54 20 75 70 20 46 52 4f    "SELECT up FRO
a550: 4d 20 63 31 20 47 52 4f 55 50 20 42 59 20 75 70  M c1 GROUP BY up
a560: 20 48 41 56 49 4e 47 20 73 75 6d 28 64 6f 77 6e   HAVING sum(down
a570: 29 3c 31 36 22 20 7b 78 7d 0a 20 20 31 2e 34 20  )<16" {x}.  1.4 
a580: 20 22 53 45 4c 45 43 54 20 75 70 7c 7c 64 6f 77   "SELECT up||dow
a590: 6e 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50 20  n FROM c1 GROUP 
a5a0: 42 59 20 28 64 6f 77 6e 3c 35 29 20 48 41 56 49  BY (down<5) HAVI
a5b0: 4e 47 20 6d 61 78 28 64 6f 77 6e 29 3c 31 30 22  NG max(down)<10"
a5c0: 20 7b 78 34 7d 0a 0a 20 20 32 2e 31 20 20 22 53   {x4}..  2.1  "S
a5d0: 45 4c 45 43 54 20 75 70 20 46 52 4f 4d 20 63 31  ELECT up FROM c1
a5e0: 20 47 52 4f 55 50 20 42 59 20 75 70 20 48 41 56   GROUP BY up HAV
a5f0: 49 4e 47 20 64 6f 77 6e 3e 31 30 22 20 7b 79 7d  ING down>10" {y}
a600: 0a 20 20 32 2e 32 20 20 22 53 45 4c 45 43 54 20  .  2.2  "SELECT 
a610: 75 70 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50  up FROM c1 GROUP
a620: 20 42 59 20 75 70 20 48 41 56 49 4e 47 20 75 70   BY up HAVING up
a630: 3d 27 79 27 22 20 20 7b 79 7d 0a 0a 20 20 32 2e  ='y'"  {y}..  2.
a640: 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20  3  "SELECT i, j 
a650: 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59  FROM c2 GROUP BY
a660: 20 69 3e 34 20 48 41 56 49 4e 47 20 69 3e 36 22   i>4 HAVING i>6"
a670: 20 20 7b 39 20 33 36 7d 0a 7d 0a 0a 23 20 45 56    {9 36}.}..# EV
a680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39  IDENCE-OF: R-239
a690: 32 37 2d 35 34 30 38 31 20 45 61 63 68 20 65 78  27-54081 Each ex
a6a0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
a6b0: 72 65 73 75 6c 74 2d 73 65 74 20 69 73 20 74 68  result-set is th
a6c0: 65 6e 0a 23 20 65 76 61 6c 75 61 74 65 64 20 6f  en.# evaluated o
a6d0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 67 72 6f  nce for each gro
a6e0: 75 70 20 6f 66 20 72 6f 77 73 2e 0a 23 0a 23 20  up of rows..#.# 
a6f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
a700: 33 37 33 35 2d 34 37 30 31 37 20 49 66 20 74 68  3735-47017 If th
a710: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a720: 61 6e 20 61 67 67 72 65 67 61 74 65 0a 23 20 65  an aggregate.# e
a730: 78 70 72 65 73 73 69 6f 6e 2c 20 69 74 20 69 73  xpression, it is
a740: 20 65 76 61 6c 75 61 74 65 64 20 61 63 72 6f 73   evaluated acros
a750: 73 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68  s all rows in th
a760: 65 20 67 72 6f 75 70 2e 0a 23 0a 64 6f 5f 73 65  e group..#.do_se
a770: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
a780: 65 63 74 2d 34 2e 31 35 20 7b 0a 20 20 31 20 20  ect-4.15 {.  1  
a790: 22 53 45 4c 45 43 54 20 73 75 6d 28 64 6f 77 6e  "SELECT sum(down
a7a0: 29 20 46 52 4f 4d 20 63 31 20 47 52 4f 55 50 20  ) FROM c1 GROUP 
a7b0: 42 59 20 75 70 22 20 7b 31 35 20 34 38 7d 0a 20  BY up" {15 48}. 
a7c0: 20 32 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28   2  "SELECT sum(
a7d0: 6a 29 2c 20 6d 61 78 28 6a 29 20 46 52 4f 4d 20  j), max(j) FROM 
a7e0: 63 32 20 47 52 4f 55 50 20 42 59 20 28 69 25 33  c2 GROUP BY (i%3
a7f0: 29 22 20 20 20 20 20 7b 35 34 20 33 36 20 32 37  )"     {54 36 27
a800: 20 32 31 20 33 39 20 32 38 7d 0a 20 20 33 20 20   21 39 28}.  3  
a810: 22 53 45 4c 45 43 54 20 73 75 6d 28 6a 29 2c 20  "SELECT sum(j), 
a820: 6d 61 78 28 6a 29 20 46 52 4f 4d 20 63 32 20 47  max(j) FROM c2 G
a830: 52 4f 55 50 20 42 59 20 28 6a 25 32 29 22 20 20  ROUP BY (j%2)"  
a840: 20 20 20 7b 38 30 20 33 36 20 34 30 20 32 31 7d     {80 36 40 21}
a850: 0a 20 20 34 20 20 22 53 45 4c 45 43 54 20 31 2b  .  4  "SELECT 1+
a860: 73 75 6d 28 6a 29 2c 20 6d 61 78 28 6a 29 2b 31  sum(j), max(j)+1
a870: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
a880: 59 20 28 6a 25 32 29 22 20 7b 38 31 20 33 37 20  Y (j%2)" {81 37 
a890: 34 31 20 32 32 7d 0a 20 20 35 20 20 22 53 45 4c  41 22}.  5  "SEL
a8a0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 72 6f  ECT count(*), ro
a8b0: 75 6e 64 28 61 76 67 28 69 29 2c 32 29 20 46 52  und(avg(i),2) FR
a8c0: 4f 4d 20 63 31 2c 20 63 32 20 4f 4e 20 28 69 3d  OM c1, c2 ON (i=
a8d0: 64 6f 77 6e 29 20 47 52 4f 55 50 20 42 59 20 6a  down) GROUP BY j
a8e0: 25 32 22 0a 20 20 20 20 20 20 20 20 7b 33 20 34  %2".        {3 4
a8f0: 2e 33 33 20 31 20 32 2e 30 7d 0a 7d 20 0a 0a 23  .33 1 2.0}.} ..#
a900: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a910: 36 32 39 31 33 2d 31 39 38 33 30 20 4f 74 68 65  62913-19830 Othe
a920: 72 77 69 73 65 2c 20 69 74 20 69 73 20 65 76 61  rwise, it is eva
a930: 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 61  luated against a
a940: 20 73 69 6e 67 6c 65 0a 23 20 61 72 62 69 74 72   single.# arbitr
a950: 61 72 69 6c 79 20 63 68 6f 73 65 6e 20 72 6f 77  arily chosen row
a960: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
a970: 20 67 72 6f 75 70 2e 0a 23 0a 23 20 45 56 49 44   group..#.# EVID
a980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 32 34  ENCE-OF: R-53924
a990: 2d 30 38 38 30 39 20 49 66 20 74 68 65 72 65 20  -08809 If there 
a9a0: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
a9b0: 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 0a 23   non-aggregate.#
a9c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
a9d0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 74  he result-set, t
a9e0: 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 65 78 70  hen all such exp
a9f0: 72 65 73 73 69 6f 6e 73 20 61 72 65 20 65 76 61  ressions are eva
aa00: 6c 75 61 74 65 64 0a 23 20 66 6f 72 20 74 68 65  luated.# for the
aa10: 20 73 61 6d 65 20 72 6f 77 2e 0a 23 0a 64 6f 5f   same row..#.do_
aa20: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
aa30: 65 6c 65 63 74 2d 34 2e 31 35 20 7b 0a 20 20 31  elect-4.15 {.  1
aa40: 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20 46    "SELECT i, j F
aa50: 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20  ROM c2 GROUP BY 
aa60: 69 25 32 22 20 20 20 20 20 20 20 20 20 20 20 20  i%2"            
aa70: 20 7b 38 20 32 38 20 20 20 39 20 33 36 7d 0a 20   {8 28   9 36}. 
aa80: 20 32 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a   2  "SELECT i, j
aa90: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
aaa0: 59 20 69 25 32 20 48 41 56 49 4e 47 20 6a 3c 33  Y i%2 HAVING j<3
aab0: 30 22 20 7b 38 20 32 38 7d 0a 20 20 33 20 20 22  0" {8 28}.  3  "
aac0: 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f 4d  SELECT i, j FROM
aad0: 20 63 32 20 47 52 4f 55 50 20 42 59 20 69 25 32   c2 GROUP BY i%2
aae0: 20 48 41 56 49 4e 47 20 6a 3e 33 30 22 20 7b 39   HAVING j>30" {9
aaf0: 20 33 36 7d 0a 20 20 34 20 20 22 53 45 4c 45 43   36}.  4  "SELEC
ab00: 54 20 69 2c 20 6a 20 46 52 4f 4d 20 63 32 20 47  T i, j FROM c2 G
ab10: 52 4f 55 50 20 42 59 20 69 25 32 20 48 41 56 49  ROUP BY i%2 HAVI
ab20: 4e 47 20 6a 3e 33 30 22 20 7b 39 20 33 36 7d 0a  NG j>30" {9 36}.
ab30: 20 20 35 20 20 22 53 45 4c 45 43 54 20 63 6f 75    5  "SELECT cou
ab40: 6e 74 28 2a 29 2c 20 69 2c 20 6b 20 46 52 4f 4d  nt(*), i, k FROM
ab50: 20 63 32 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e   c2 NATURAL JOIN
ab60: 20 63 33 20 47 52 4f 55 50 20 42 59 20 73 75 62   c3 GROUP BY sub
ab70: 73 74 72 28 6b 2c 20 31 2c 20 31 29 22 0a 20 20  str(k, 1, 1)".  
ab80: 20 20 20 20 20 20 7b 32 20 35 20 62 6f 72 6f 6e        {2 5 boron
ab90: 20 20 20 32 20 32 20 68 65 6c 69 75 6d 20 20 20     2 2 helium   
aba0: 31 20 33 20 6c 69 74 68 69 75 6d 7d 0a 7d 20 0a  1 3 lithium}.} .
abb0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
abc0: 52 2d 31 39 33 33 34 2d 31 32 38 31 31 20 45 61  R-19334-12811 Ea
abd0: 63 68 20 67 72 6f 75 70 20 6f 66 20 69 6e 70 75  ch group of inpu
abe0: 74 20 64 61 74 61 73 65 74 20 72 6f 77 73 0a 23  t dataset rows.#
abf0: 20 63 6f 6e 74 72 69 62 75 74 65 73 20 61 20 73   contributes a s
ac00: 69 6e 67 6c 65 20 72 6f 77 20 74 6f 20 74 68 65  ingle row to the
ac10: 20 73 65 74 20 6f 66 20 72 65 73 75 6c 74 20 72   set of result r
ac20: 6f 77 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ows..#.# EVIDENC
ac30: 45 2d 4f 46 3a 20 52 2d 30 32 32 32 33 2d 34 39  E-OF: R-02223-49
ac40: 32 37 39 20 53 75 62 6a 65 63 74 20 74 6f 20 66  279 Subject to f
ac50: 69 6c 74 65 72 69 6e 67 20 61 73 73 6f 63 69 61  iltering associa
ac60: 74 65 64 20 77 69 74 68 20 74 68 65 0a 23 20 44  ted with the.# D
ac70: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c  ISTINCT keyword,
ac80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ac90: 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ows returned by 
aca0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
acb0: 72 79 0a 23 20 77 69 74 68 20 61 20 47 52 4f 55  ry.# with a GROU
acc0: 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 74  P BY clause is t
acd0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6e  he same as the n
ace0: 75 6d 62 65 72 20 6f 66 20 67 72 6f 75 70 73 20  umber of groups 
acf0: 6f 66 20 72 6f 77 73 0a 23 20 70 72 6f 64 75 63  of rows.# produc
ad00: 65 64 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74  ed by applying t
ad10: 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
ad20: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74  HAVING clauses t
ad30: 6f 20 74 68 65 20 66 69 6c 74 65 72 65 64 0a 23  o the filtered.#
ad40: 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 2e 0a   input dataset..
ad50: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
ad60: 73 20 65 5f 73 65 6c 65 63 74 2e 34 2e 31 36 20  s e_select.4.16 
ad70: 2d 63 6f 75 6e 74 20 7b 0a 20 20 31 20 20 22 53  -count {.  1  "S
ad80: 45 4c 45 43 54 20 69 2c 20 6a 20 46 52 4f 4d 20  ELECT i, j FROM 
ad90: 63 32 20 47 52 4f 55 50 20 42 59 20 69 25 32 22  c2 GROUP BY i%2"
ada0: 20 20 20 20 20 20 20 20 20 20 32 0a 20 20 32 20            2.  2 
adb0: 20 22 53 45 4c 45 43 54 20 69 2c 20 6a 20 46 52   "SELECT i, j FR
adc0: 4f 4d 20 63 32 20 47 52 4f 55 50 20 42 59 20 69  OM c2 GROUP BY i
add0: 22 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 20  "            9. 
ade0: 20 33 20 20 22 53 45 4c 45 43 54 20 69 2c 20 6a   3  "SELECT i, j
adf0: 20 46 52 4f 4d 20 63 32 20 47 52 4f 55 50 20 42   FROM c2 GROUP B
ae00: 59 20 69 20 48 41 56 49 4e 47 20 69 3c 35 22 20  Y i HAVING i<5" 
ae10: 34 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  4.} ..#---------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae60: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
ae70: 20 74 65 73 74 73 20 61 74 74 65 6d 70 74 20 74   tests attempt t
ae80: 6f 20 76 65 72 69 66 79 20 73 74 61 74 65 6d 65  o verify stateme
ae90: 6e 74 73 20 6d 61 64 65 20 72 65 67 61 72 64 69  nts made regardi
aea0: 6e 67 20 74 68 65 20 41 4c 4c 0a 23 20 61 6e 64  ng the ALL.# and
aeb0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
aec0: 64 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ds..#.drop_all_t
aed0: 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c  ables.do_execsql
aee0: 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 35  _test e_select-5
aef0: 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.0 {.  CREATE 
af00: 54 41 42 4c 45 20 68 31 28 61 2c 20 62 29 3b 0a  TABLE h1(a, b);.
af10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 31    INSERT INTO h1
af20: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
af30: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
af40: 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20 27 49   h1 VALUES(1, 'I
af50: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
af60: 4f 20 68 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O h1 VALUES(1, '
af70: 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  i');.  INSERT IN
af80: 54 4f 20 68 31 20 56 41 4c 55 45 53 28 34 2c 20  TO h1 VALUES(4, 
af90: 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52  'four');.  INSER
afa0: 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55 45 53  T INTO h1 VALUES
afb0: 28 34 2c 20 27 49 56 27 29 3b 0a 20 20 49 4e 53  (4, 'IV');.  INS
afc0: 45 52 54 20 49 4e 54 4f 20 68 31 20 56 41 4c 55  ERT INTO h1 VALU
afd0: 45 53 28 34 2c 20 27 69 76 27 29 3b 0a 0a 20 20  ES(4, 'iv');..  
afe0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 68 32 28  CREATE TABLE h2(
aff0: 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  x COLLATE nocase
b000: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b010: 20 68 32 20 56 41 4c 55 45 53 28 27 4f 6e 65 27   h2 VALUES('One'
b020: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b030: 20 68 32 20 56 41 4c 55 45 53 28 27 54 77 6f 27   h2 VALUES('Two'
b040: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b050: 20 68 32 20 56 41 4c 55 45 53 28 27 54 68 72 65   h2 VALUES('Thre
b060: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
b070: 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 46 6f  TO h2 VALUES('Fo
b080: 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ur');.  INSERT I
b090: 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 6f  NTO h2 VALUES('o
b0a0: 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ne');.  INSERT I
b0b0: 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 74  NTO h2 VALUES('t
b0c0: 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
b0d0: 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28 27 74  NTO h2 VALUES('t
b0e0: 68 72 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  hree');.  INSERT
b0f0: 20 49 4e 54 4f 20 68 32 20 56 41 4c 55 45 53 28   INTO h2 VALUES(
b100: 27 66 6f 75 72 27 29 3b 0a 0a 20 20 43 52 45 41  'four');..  CREA
b110: 54 45 20 54 41 42 4c 45 20 68 33 28 63 2c 20 64  TE TABLE h3(c, d
b120: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b130: 20 68 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55   h3 VALUES(1, NU
b140: 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  LL);.  INSERT IN
b150: 54 4f 20 68 33 20 56 41 4c 55 45 53 28 32 2c 20  TO h3 VALUES(2, 
b160: 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20  NULL);.  INSERT 
b170: 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53 28 33  INTO h3 VALUES(3
b180: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
b190: 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45 53  T INTO h3 VALUES
b1a0: 28 34 2c 20 27 32 27 29 3b 0a 20 20 49 4e 53 45  (4, '2');.  INSE
b1b0: 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c 55 45  RT INTO h3 VALUE
b1c0: 53 28 35 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e  S(5, NULL);.  IN
b1d0: 53 45 52 54 20 49 4e 54 4f 20 68 33 20 56 41 4c  SERT INTO h3 VAL
b1e0: 55 45 53 28 36 2c 20 27 32 2c 33 27 29 3b 0a 20  UES(6, '2,3');. 
b1f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 33 20   INSERT INTO h3 
b200: 56 41 4c 55 45 53 28 37 2c 20 4e 55 4c 4c 29 3b  VALUES(7, NULL);
b210: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68  .  INSERT INTO h
b220: 33 20 56 41 4c 55 45 53 28 38 2c 20 27 32 2c 34  3 VALUES(8, '2,4
b230: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
b240: 4f 20 68 33 20 56 41 4c 55 45 53 28 39 2c 20 27  O h3 VALUES(9, '
b250: 33 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49  3');.} {}..# EVI
b260: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37 37  DENCE-OF: R-6077
b270: 30 2d 31 30 36 31 32 20 4f 6e 65 20 6f 66 20 74  0-10612 One of t
b280: 68 65 20 41 4c 4c 20 6f 72 20 44 49 53 54 49 4e  he ALL or DISTIN
b290: 43 54 20 6b 65 79 77 6f 72 64 73 20 6d 61 79 0a  CT keywords may.
b2a0: 23 20 66 6f 6c 6c 6f 77 20 74 68 65 20 53 45 4c  # follow the SEL
b2b0: 45 43 54 20 6b 65 79 77 6f 72 64 20 69 6e 20 61  ECT keyword in a
b2c0: 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73   simple SELECT s
b2d0: 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f 73  tatement..#.do_s
b2e0: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
b2f0: 6c 65 63 74 2d 35 2e 31 20 7b 0a 20 20 31 20 20  lect-5.1 {.  1  
b300: 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 61 20 46   "SELECT ALL a F
b310: 52 4f 4d 20 68 31 22 20 20 20 20 20 20 7b 31 20  ROM h1"      {1 
b320: 31 20 31 20 34 20 34 20 34 7d 0a 20 20 32 20 20  1 1 4 4 4}.  2  
b330: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
b340: 54 20 61 20 46 52 4f 4d 20 68 31 22 20 7b 31 20  T a FROM h1" {1 
b350: 34 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  4}.}..# EVIDENCE
b360: 2d 4f 46 3a 20 52 2d 30 38 38 36 31 2d 33 34 32  -OF: R-08861-342
b370: 38 30 20 49 66 20 74 68 65 20 73 69 6d 70 6c 65  80 If the simple
b380: 20 53 45 4c 45 43 54 20 69 73 20 61 20 53 45 4c   SELECT is a SEL
b390: 45 43 54 20 41 4c 4c 2c 20 74 68 65 6e 0a 23 20  ECT ALL, then.# 
b3a0: 74 68 65 20 65 6e 74 69 72 65 20 73 65 74 20 6f  the entire set o
b3b0: 66 20 72 65 73 75 6c 74 20 72 6f 77 73 20 61 72  f result rows ar
b3c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
b3d0: 65 20 53 45 4c 45 43 54 2e 0a 23 0a 23 20 45 56  e SELECT..#.# EV
b3e0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39  IDENCE-OF: R-479
b3f0: 31 31 2d 30 32 30 38 36 20 49 66 20 6e 65 69 74  11-02086 If neit
b400: 68 65 72 20 41 4c 4c 20 6f 72 20 44 49 53 54 49  her ALL or DISTI
b410: 4e 43 54 20 61 72 65 20 70 72 65 73 65 6e 74 2c  NCT are present,
b420: 0a 23 20 74 68 65 6e 20 74 68 65 20 62 65 68 61  .# then the beha
b430: 76 69 6f 75 72 20 69 73 20 61 73 20 69 66 20 41  viour is as if A
b440: 4c 4c 20 77 65 72 65 20 73 70 65 63 69 66 69 65  LL were specifie
b450: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
b460: 4f 46 3a 20 52 2d 31 34 34 34 32 2d 34 31 33 30  OF: R-14442-4130
b470: 35 20 49 66 20 74 68 65 20 73 69 6d 70 6c 65 20  5 If the simple 
b480: 53 45 4c 45 43 54 20 69 73 20 61 20 53 45 4c 45  SELECT is a SELE
b490: 43 54 20 44 49 53 54 49 4e 43 54 2c 0a 23 20 74  CT DISTINCT,.# t
b4a0: 68 65 6e 20 64 75 70 6c 69 63 61 74 65 20 72 6f  hen duplicate ro
b4b0: 77 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66  ws are removed f
b4c0: 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 72  rom the set of r
b4d0: 65 73 75 6c 74 20 72 6f 77 73 20 62 65 66 6f 72  esult rows befor
b4e0: 65 20 69 74 0a 23 20 69 73 20 72 65 74 75 72 6e  e it.# is return
b4f0: 65 64 2e 0a 23 0a 23 20 20 20 54 68 65 20 74 68  ed..#.#   The th
b500: 72 65 65 20 74 65 73 74 61 62 6c 65 20 73 74 61  ree testable sta
b510: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 61 72  tements above ar
b520: 65 20 74 65 73 74 65 64 20 62 79 20 65 5f 73 65  e tested by e_se
b530: 6c 65 63 74 2d 35 2e 32 2e 2a 2c 0a 23 20 20 20  lect-5.2.*,.#   
b540: 35 2e 33 2e 2a 20 61 6e 64 20 35 2e 34 2e 2a 20  5.3.* and 5.4.* 
b550: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a  respectively..#.
b560: 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20  do_select_tests 
b570: 65 5f 73 65 6c 65 63 74 2d 35 20 7b 0a 20 20 33  e_select-5 {.  3
b580: 2e 31 20 22 53 45 4c 45 43 54 20 41 4c 4c 20 78  .1 "SELECT ALL x
b590: 20 46 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20 54   FROM h2" {One T
b5a0: 77 6f 20 54 68 72 65 65 20 46 6f 75 72 20 6f 6e  wo Three Four on
b5b0: 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72  e two three four
b5c0: 7d 0a 20 20 33 2e 32 20 22 53 45 4c 45 43 54 20  }.  3.2 "SELECT 
b5d0: 41 4c 4c 20 78 20 46 52 4f 4d 20 68 31 2c 20 68  ALL x FROM h1, h
b5e0: 32 20 4f 4e 20 28 78 3d 62 29 22 20 7b 4f 6e 65  2 ON (x=b)" {One
b5f0: 20 6f 6e 65 20 46 6f 75 72 20 66 6f 75 72 7d 0a   one Four four}.
b600: 0a 20 20 33 2e 31 20 22 53 45 4c 45 43 54 20 78  .  3.1 "SELECT x
b610: 20 46 52 4f 4d 20 68 32 22 20 7b 4f 6e 65 20 54   FROM h2" {One T
b620: 77 6f 20 54 68 72 65 65 20 46 6f 75 72 20 6f 6e  wo Three Four on
b630: 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72  e two three four
b640: 7d 0a 20 20 33 2e 32 20 22 53 45 4c 45 43 54 20  }.  3.2 "SELECT 
b650: 78 20 46 52 4f 4d 20 68 31 2c 20 68 32 20 4f 4e  x FROM h1, h2 ON
b660: 20 28 78 3d 62 29 22 20 7b 4f 6e 65 20 6f 6e 65   (x=b)" {One one
b670: 20 46 6f 75 72 20 66 6f 75 72 7d 0a 0a 20 20 34   Four four}..  4
b680: 2e 31 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  .1 "SELECT DISTI
b690: 4e 43 54 20 78 20 46 52 4f 4d 20 68 32 22 20 7b  NCT x FROM h2" {
b6a0: 4f 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46 6f  One Two Three Fo
b6b0: 75 72 7d 0a 20 20 34 2e 32 20 22 53 45 4c 45 43  ur}.  4.2 "SELEC
b6c0: 54 20 44 49 53 54 49 4e 43 54 20 78 20 46 52 4f  T DISTINCT x FRO
b6d0: 4d 20 68 31 2c 20 68 32 20 4f 4e 20 28 78 3d 62  M h1, h2 ON (x=b
b6e0: 29 22 20 7b 4f 6e 65 20 46 6f 75 72 7d 0a 7d 20  )" {One Four}.} 
b6f0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b700: 20 52 2d 30 32 30 35 34 2d 31 35 33 34 33 20 46   R-02054-15343 F
b710: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
b720: 6f 66 20 64 65 74 65 63 74 69 6e 67 20 64 75 70  of detecting dup
b730: 6c 69 63 61 74 65 0a 23 20 72 6f 77 73 2c 20 74  licate.# rows, t
b740: 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
b750: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
b760: 20 62 65 20 65 71 75 61 6c 2e 0a 23 0a 64 6f 5f   be equal..#.do_
b770: 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
b780: 65 6c 65 63 74 2d 35 2e 35 20 7b 0a 20 20 31 20  elect-5.5 {.  1 
b790: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
b7a0: 54 20 64 20 46 52 4f 4d 20 68 33 22 20 7b 7b 7d  T d FROM h3" {{}
b7b0: 20 32 20 32 2c 33 20 32 2c 34 20 33 7d 0a 7d 0a   2 2,3 2,4 3}.}.
b7c0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b7d0: 52 2d 35 38 33 35 39 2d 35 32 31 31 32 20 54 68  R-58359-52112 Th
b7e0: 65 20 6e 6f 72 6d 61 6c 20 72 75 6c 65 73 20 66  e normal rules f
b7f0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 20 61 20 63  or selecting a c
b800: 6f 6c 6c 61 74 69 6f 6e 0a 23 20 73 65 71 75 65  ollation.# seque
b810: 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  nce to compare t
b820: 65 78 74 20 76 61 6c 75 65 73 20 77 69 74 68 20  ext values with 
b830: 61 70 70 6c 79 2e 0a 23 0a 64 6f 5f 73 65 6c 65  apply..#.do_sele
b840: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
b850: 74 2d 35 2e 36 20 7b 0a 20 20 31 20 20 22 53 45  t-5.6 {.  1  "SE
b860: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 62 20  LECT DISTINCT b 
b870: 46 52 4f 4d 20 68 31 22 20 20 20 20 20 20 20 20  FROM h1"        
b880: 20 20 20 20 20 20 20 20 20 20 7b 6f 6e 65 20 49            {one I
b890: 20 69 20 66 6f 75 72 20 49 56 20 69 76 7d 0a 20   i four IV iv}. 
b8a0: 20 32 20 20 22 53 45 4c 45 43 54 20 44 49 53 54   2  "SELECT DIST
b8b0: 49 4e 43 54 20 62 20 43 4f 4c 4c 41 54 45 20 6e  INCT b COLLATE n
b8c0: 6f 63 61 73 65 20 46 52 4f 4d 20 68 31 22 20 20  ocase FROM h1"  
b8d0: 20 7b 6f 6e 65 20 49 20 66 6f 75 72 20 49 56 7d   {one I four IV}
b8e0: 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20 44 49  .  3  "SELECT DI
b8f0: 53 54 49 4e 43 54 20 78 20 46 52 4f 4d 20 68 32  STINCT x FROM h2
b900: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
b910: 20 20 20 7b 4f 6e 65 20 54 77 6f 20 54 68 72 65     {One Two Thre
b920: 65 20 46 6f 75 72 7d 0a 20 20 34 20 20 22 53 45  e Four}.  4  "SE
b930: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 20  LECT DISTINCT x 
b940: 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46  COLLATE binary F
b950: 52 4f 4d 20 68 32 22 20 20 20 7b 0a 20 20 20 20  ROM h2"   {.    
b960: 4f 6e 65 20 54 77 6f 20 54 68 72 65 65 20 46 6f  One Two Three Fo
b970: 75 72 20 6f 6e 65 20 74 77 6f 20 74 68 72 65 65  ur one two three
b980: 20 66 6f 75 72 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d   four.  }.}..#--
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65 20 66 6f  -------.# The fo
b9e0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
b9f0: 65 5f 73 65 6c 65 63 74 2d 37 2e 2a 20 2d 20 74  e_select-7.* - t
ba00: 65 73 74 20 74 68 61 74 20 73 74 61 74 65 6d 65  est that stateme
ba10: 6e 74 73 20 6d 61 64 65 20 74 6f 20 64 6f 0a 23  nts made to do.#
ba20: 20 77 69 74 68 20 63 6f 6d 70 6f 75 6e 64 20 53   with compound S
ba30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
ba40: 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a   are correct..#.
ba50: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ba60: 52 2d 33 39 33 36 38 2d 36 34 33 33 33 20 49 6e  R-39368-64333 In
ba70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ba80: 43 54 2c 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73  CT, all the cons
ba90: 74 69 74 75 65 6e 74 0a 23 20 53 45 4c 45 43 54  tituent.# SELECT
baa0: 73 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  s must return th
bab0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
bac0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
bad0: 0a 23 0a 23 20 20 20 41 6c 6c 20 74 68 65 20 6f  .#.#   All the o
bae0: 74 68 65 72 20 74 65 73 74 73 20 69 6e 20 74 68  ther tests in th
baf0: 69 73 20 73 65 63 74 69 6f 6e 20 75 73 65 20 63  is section use c
bb00: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
bb10: 63 72 65 61 74 65 64 0a 23 20 20 20 75 73 69 6e  created.#   usin
bb20: 67 20 63 6f 6d 70 6f 6e 65 6e 74 20 53 45 4c 45  g component SELE
bb30: 43 54 73 20 74 68 61 74 20 64 6f 20 72 65 74 75  CTs that do retu
bb40: 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
bb50: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0a 23  er of columns..#
bb60: 20 20 20 53 6f 20 74 68 65 20 74 65 73 74 73 20     So the tests 
bb70: 68 65 72 65 20 6a 75 73 74 20 73 68 6f 77 20 74  here just show t
bb80: 68 61 74 20 69 74 20 69 73 20 61 6e 20 65 72 72  hat it is an err
bb90: 6f 72 20 74 6f 20 61 74 74 65 6d 70 74 20 6f 74  or to attempt ot
bba0: 68 65 72 77 69 73 65 2e 0a 23 0a 64 72 6f 70 5f  herwise..#.drop_
bbb0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78  all_tables.do_ex
bbc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
bbd0: 65 63 74 2d 37 2e 31 2e 30 20 7b 0a 20 20 43 52  ect-7.1.0 {.  CR
bbe0: 45 41 54 45 20 54 41 42 4c 45 20 6a 31 28 61 2c  EATE TABLE j1(a,
bbf0: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
bc00: 20 54 41 42 4c 45 20 6a 32 28 65 2c 20 66 29 3b   TABLE j2(e, f);
bc10: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
bc20: 6a 33 28 67 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73  j3(g);.} {}.do_s
bc30: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
bc40: 6c 65 63 74 2d 37 2e 31 20 2d 65 72 72 6f 72 20  lect-7.1 -error 
bc50: 7b 0a 20 20 53 45 4c 45 43 54 73 20 74 6f 20 74  {.  SELECTs to t
bc60: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
bc70: 74 20 6f 66 20 25 73 20 64 6f 20 6e 6f 74 20 68  t of %s do not h
bc80: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
bc90: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
bca0: 6c 75 6d 6e 73 0a 7d 20 7b 0a 20 20 31 20 20 20  lumns.} {.  1   
bcb0: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
bcc0: 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 41 4c  M j1    UNION AL
bcd0: 4c 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  L SELECT g FROM 
bce0: 6a 33 22 20 20 20 20 7b 7b 55 4e 49 4f 4e 20 41  j3"    {{UNION A
bcf0: 4c 4c 7d 7d 0a 20 20 32 20 20 20 22 53 45 4c 45  LL}}.  2   "SELE
bd00: 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 31 20  CT *    FROM j1 
bd10: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c     UNION ALL SEL
bd20: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20 20  ECT * FROM j3"  
bd30: 20 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a    {{UNION ALL}}.
bd40: 20 20 33 20 20 20 22 53 45 4c 45 43 54 20 61 2c    3   "SELECT a,
bd50: 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 55 4e   b FROM j1    UN
bd60: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 67  ION ALL SELECT g
bd70: 20 46 52 4f 4d 20 6a 33 22 20 20 20 20 7b 7b 55   FROM j3"    {{U
bd80: 4e 49 4f 4e 20 41 4c 4c 7d 7d 0a 20 20 34 20 20  NION ALL}}.  4  
bd90: 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52   "SELECT a, b FR
bda0: 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20 41  OM j1    UNION A
bdb0: 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  LL SELECT * FROM
bdc0: 20 6a 33 2c 6a 32 22 20 7b 7b 55 4e 49 4f 4e 20   j3,j2" {{UNION 
bdd0: 41 4c 4c 7d 7d 0a 20 20 35 20 20 20 22 53 45 4c  ALL}}.  5   "SEL
bde0: 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 33  ECT *    FROM j3
bdf0: 2c 6a 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  ,j2 UNION ALL SE
be00: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a  LECT a, b FROM j
be10: 31 22 20 7b 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 7d  1" {{UNION ALL}}
be20: 0a 0a 20 20 36 20 20 20 22 53 45 4c 45 43 54 20  ..  6   "SELECT 
be30: 61 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20  a, b FROM j1    
be40: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 67 20 46  UNION SELECT g F
be50: 52 4f 4d 20 6a 33 22 20 20 20 20 20 20 20 20 7b  ROM j3"        {
be60: 55 4e 49 4f 4e 7d 0a 20 20 37 20 20 20 22 53 45  UNION}.  7   "SE
be70: 4c 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a  LECT *    FROM j
be80: 31 20 20 20 20 55 4e 49 4f 4e 20 53 45 4c 45 43  1    UNION SELEC
be90: 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20 20 20 20  T * FROM j3"    
bea0: 20 20 20 20 7b 55 4e 49 4f 4e 7d 0a 20 20 38 20      {UNION}.  8 
beb0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46    "SELECT a, b F
bec0: 52 4f 4d 20 6a 31 20 20 20 20 55 4e 49 4f 4e 20  ROM j1    UNION 
bed0: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33  SELECT g FROM j3
bee0: 22 20 20 20 20 20 20 20 20 7b 55 4e 49 4f 4e 7d  "        {UNION}
bef0: 0a 20 20 39 20 20 20 22 53 45 4c 45 43 54 20 61  .  9   "SELECT a
bf00: 2c 20 62 20 46 52 4f 4d 20 6a 31 20 20 20 20 55  , b FROM j1    U
bf10: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  NION SELECT * FR
bf20: 4f 4d 20 6a 33 2c 6a 32 22 20 20 20 20 20 7b 55  OM j3,j2"     {U
bf30: 4e 49 4f 4e 7d 0a 20 20 31 30 20 20 22 53 45 4c  NION}.  10  "SEL
bf40: 45 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 33  ECT *    FROM j3
bf50: 2c 6a 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  ,j2 UNION SELECT
bf60: 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20 20   a, b FROM j1"  
bf70: 20 20 20 7b 55 4e 49 4f 4e 7d 0a 0a 20 20 31 31     {UNION}..  11
bf80: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46    "SELECT a, b F
bf90: 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54 45 52 53  ROM j1    INTERS
bfa0: 45 43 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f  ECT SELECT g FRO
bfb0: 4d 20 6a 33 22 20 20 20 20 7b 49 4e 54 45 52 53  M j3"    {INTERS
bfc0: 45 43 54 7d 0a 20 20 31 32 20 20 22 53 45 4c 45  ECT}.  12  "SELE
bfd0: 43 54 20 2a 20 20 20 20 46 52 4f 4d 20 6a 31 20  CT *    FROM j1 
bfe0: 20 20 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c     INTERSECT SEL
bff0: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 22 20 20  ECT * FROM j3"  
c000: 20 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20    {INTERSECT}.  
c010: 31 33 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62  13  "SELECT a, b
c020: 20 46 52 4f 4d 20 6a 31 20 20 20 20 49 4e 54 45   FROM j1    INTE
c030: 52 53 45 43 54 20 53 45 4c 45 43 54 20 67 20 46  RSECT SELECT g F
c040: 52 4f 4d 20 6a 33 22 20 20 20 20 7b 49 4e 54 45  ROM j3"    {INTE
c050: 52 53 45 43 54 7d 0a 20 20 31 34 20 20 22 53 45  RSECT}.  14  "SE
c060: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a  LECT a, b FROM j
c070: 31 20 20 20 20 49 4e 54 45 52 53 45 43 54 20 53  1    INTERSECT S
c080: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 33 2c  ELECT * FROM j3,
c090: 6a 32 22 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a  j2" {INTERSECT}.
c0a0: 20 20 31 35 20 20 22 53 45 4c 45 43 54 20 2a 20    15  "SELECT * 
c0b0: 20 20 20 46 52 4f 4d 20 6a 33 2c 6a 32 20 49 4e     FROM j3,j2 IN
c0c0: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 61  TERSECT SELECT a
c0d0: 2c 20 62 20 46 52 4f 4d 20 6a 31 22 20 7b 49 4e  , b FROM j1" {IN
c0e0: 54 45 52 53 45 43 54 7d 0a 0a 20 20 31 36 20 20  TERSECT}..  16  
c0f0: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
c100: 4d 20 6a 31 20 20 20 20 45 58 43 45 50 54 20 53  M j1    EXCEPT S
c110: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 33 22  ELECT g FROM j3"
c120: 20 20 20 20 20 20 20 7b 45 58 43 45 50 54 7d 0a         {EXCEPT}.
c130: 20 20 31 37 20 20 22 53 45 4c 45 43 54 20 2a 20    17  "SELECT * 
c140: 20 20 20 46 52 4f 4d 20 6a 31 20 20 20 20 45 58     FROM j1    EX
c150: 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52  CEPT SELECT * FR
c160: 4f 4d 20 6a 33 22 20 20 20 20 20 20 20 7b 45 58  OM j3"       {EX
c170: 43 45 50 54 7d 0a 20 20 31 38 20 20 22 53 45 4c  CEPT}.  18  "SEL
c180: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 6a 31  ECT a, b FROM j1
c190: 20 20 20 20 45 58 43 45 50 54 20 53 45 4c 45 43      EXCEPT SELEC
c1a0: 54 20 67 20 46 52 4f 4d 20 6a 33 22 20 20 20 20  T g FROM j3"    
c1b0: 20 20 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 39     {EXCEPT}.  19
c1c0: 20 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46    "SELECT a, b F
c1d0: 52 4f 4d 20 6a 31 20 20 20 20 45 58 43 45 50 54  ROM j1    EXCEPT
c1e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a   SELECT * FROM j
c1f0: 33 2c 6a 32 22 20 20 20 20 7b 45 58 43 45 50 54  3,j2"    {EXCEPT
c200: 7d 0a 20 20 32 30 20 20 22 53 45 4c 45 43 54 20  }.  20  "SELECT 
c210: 2a 20 20 20 20 46 52 4f 4d 20 6a 33 2c 6a 32 20  *    FROM j3,j2 
c220: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 61 2c  EXCEPT SELECT a,
c230: 20 62 20 46 52 4f 4d 20 6a 31 22 20 20 20 20 7b   b FROM j1"    {
c240: 45 58 43 45 50 54 7d 0a 7d 20 0a 0a 23 20 45 56  EXCEPT}.} ..# EV
c250: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 34  IDENCE-OF: R-014
c260: 35 30 2d 31 31 31 35 32 20 41 73 20 74 68 65 20  50-11152 As the 
c270: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
c280: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
c290: 6d 75 73 74 0a 23 20 62 65 20 73 69 6d 70 6c 65  must.# be simple
c2a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c2b0: 74 73 2c 20 74 68 65 79 20 6d 61 79 20 6e 6f 74  ts, they may not
c2c0: 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
c2d0: 59 20 6f 72 20 4c 49 4d 49 54 0a 23 20 63 6c 61  Y or LIMIT.# cla
c2e0: 75 73 65 73 2e 0a 23 20 0a 66 6f 72 65 61 63 68  uses..# .foreach
c2f0: 20 7b 74 6e 20 73 65 6c 65 63 74 20 6f 70 31 20   {tn select op1 
c300: 6f 70 32 7d 20 7b 0a 20 20 31 20 20 20 22 53 45  op2} {.  1   "SE
c310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4f  LECT * FROM j1 O
c320: 52 44 45 52 20 42 59 20 61 20 55 4e 49 4f 4e 20  RDER BY a UNION 
c330: 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ALL SELECT * FRO
c340: 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20  M j2,j3" .      
c350: 7b 4f 52 44 45 52 20 42 59 7d 20 7b 55 4e 49 4f  {ORDER BY} {UNIO
c360: 4e 20 41 4c 4c 7d 0a 20 20 32 20 20 20 22 53 45  N ALL}.  2   "SE
c370: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
c380: 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 31  OM j1 ORDER BY 1
c390: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
c3a0: 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20 6a 32  T max(e) FROM j2
c3b0: 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42  ".      {ORDER B
c3c0: 59 7d 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20  Y} {UNION ALL}. 
c3d0: 20 33 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75   3   "SELECT cou
c3e0: 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31  nt(*), * FROM j1
c3f0: 20 4f 52 44 45 52 20 42 59 20 31 2c 32 2c 33 20   ORDER BY 1,2,3 
c400: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
c410: 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 22 0a 20 20   *,* FROM j2".  
c420: 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b      {ORDER BY} {
c430: 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 20 20 34 20 20  UNION ALL}.  4  
c440: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
c450: 6a 31 20 4c 49 4d 49 54 20 31 30 20 55 4e 49 4f  j1 LIMIT 10 UNIO
c460: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46  N ALL SELECT * F
c470: 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20  ROM j2,j3" .    
c480: 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e 20 41    LIMIT {UNION A
c490: 4c 4c 7d 0a 20 20 35 20 20 20 22 53 45 4c 45 43  LL}.  5   "SELEC
c4a0: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49  T * FROM j1 LIMI
c4b0: 54 20 31 30 20 4f 46 46 53 45 54 20 35 20 55 4e  T 10 OFFSET 5 UN
c4c0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
c4d0: 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20   FROM j2,j3" .  
c4e0: 20 20 20 20 4c 49 4d 49 54 20 7b 55 4e 49 4f 4e      LIMIT {UNION
c4f0: 20 41 4c 4c 7d 0a 20 20 36 20 20 20 22 53 45 4c   ALL}.  6   "SEL
c500: 45 43 54 20 61 20 46 52 4f 4d 20 6a 31 20 4c 49  ECT a FROM j1 LI
c510: 4d 49 54 20 28 53 45 4c 45 43 54 20 65 20 46 52  MIT (SELECT e FR
c520: 4f 4d 20 6a 32 29 20 55 4e 49 4f 4e 20 41 4c 4c  OM j2) UNION ALL
c530: 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a   SELECT g FROM j
c540: 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d  2,j3" .      LIM
c550: 49 54 20 7b 55 4e 49 4f 4e 20 41 4c 4c 7d 0a 0a  IT {UNION ALL}..
c560: 20 20 37 20 20 20 22 53 45 4c 45 43 54 20 2a 20    7   "SELECT * 
c570: 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59  FROM j1 ORDER BY
c580: 20 61 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20   a UNION SELECT 
c590: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20  * FROM j2,j3" . 
c5a0: 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20       {ORDER BY} 
c5b0: 7b 55 4e 49 4f 4e 7d 0a 20 20 38 20 20 20 22 53  {UNION}.  8   "S
c5c0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
c5d0: 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20  ROM j1 ORDER BY 
c5e0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 6d  1 UNION SELECT m
c5f0: 61 78 28 65 29 20 46 52 4f 4d 20 6a 32 22 0a 20  ax(e) FROM j2". 
c600: 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59 7d 20       {ORDER BY} 
c610: 7b 55 4e 49 4f 4e 7d 0a 20 20 39 20 20 20 22 53  {UNION}.  9   "S
c620: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
c630: 2a 20 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20  * FROM j1 ORDER 
c640: 42 59 20 31 2c 32 2c 33 20 55 4e 49 4f 4e 20 53  BY 1,2,3 UNION S
c650: 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a  ELECT *,* FROM j
c660: 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20  2".      {ORDER 
c670: 42 59 7d 20 7b 55 4e 49 4f 4e 7d 0a 20 20 31 30  BY} {UNION}.  10
c680: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
c690: 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 55 4e 49   j1 LIMIT 10 UNI
c6a0: 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ON SELECT * FROM
c6b0: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c   j2,j3" .      L
c6c0: 49 4d 49 54 20 7b 55 4e 49 4f 4e 7d 0a 20 20 31  IMIT {UNION}.  1
c6d0: 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  1  "SELECT * FRO
c6e0: 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f 46  M j1 LIMIT 10 OF
c6f0: 46 53 45 54 20 35 20 55 4e 49 4f 4e 20 53 45 4c  FSET 5 UNION SEL
c700: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
c710: 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b  " .      LIMIT {
c720: 55 4e 49 4f 4e 7d 0a 20 20 31 32 20 20 22 53 45  UNION}.  12  "SE
c730: 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a 31 20 4c  LECT a FROM j1 L
c740: 49 4d 49 54 20 28 53 45 4c 45 43 54 20 65 20 46  IMIT (SELECT e F
c750: 52 4f 4d 20 6a 32 29 20 55 4e 49 4f 4e 20 53 45  ROM j2) UNION SE
c760: 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c 6a  LECT g FROM j2,j
c770: 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20  3" .      LIMIT 
c780: 7b 55 4e 49 4f 4e 7d 0a 0a 20 20 31 33 20 20 22  {UNION}..  13  "
c790: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
c7a0: 20 4f 52 44 45 52 20 42 59 20 61 20 45 58 43 45   ORDER BY a EXCE
c7b0: 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  PT SELECT * FROM
c7c0: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 7b   j2,j3" .      {
c7d0: 4f 52 44 45 52 20 42 59 7d 20 7b 45 58 43 45 50  ORDER BY} {EXCEP
c7e0: 54 7d 0a 20 20 31 34 20 20 22 53 45 4c 45 43 54  T}.  14  "SELECT
c7f0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a   count(*) FROM j
c800: 31 20 4f 52 44 45 52 20 42 59 20 31 20 45 58 43  1 ORDER BY 1 EXC
c810: 45 50 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65  EPT SELECT max(e
c820: 29 20 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20  ) FROM j2".     
c830: 20 7b 4f 52 44 45 52 20 42 59 7d 20 7b 45 58 43   {ORDER BY} {EXC
c840: 45 50 54 7d 0a 20 20 31 35 20 20 22 53 45 4c 45  EPT}.  15  "SELE
c850: 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46  CT count(*), * F
c860: 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20  ROM j1 ORDER BY 
c870: 31 2c 32 2c 33 20 45 58 43 45 50 54 20 53 45 4c  1,2,3 EXCEPT SEL
c880: 45 43 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 22  ECT *,* FROM j2"
c890: 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59  .      {ORDER BY
c8a0: 7d 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 36 20  } {EXCEPT}.  16 
c8b0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
c8c0: 6a 31 20 4c 49 4d 49 54 20 31 30 20 45 58 43 45  j1 LIMIT 10 EXCE
c8d0: 50 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  PT SELECT * FROM
c8e0: 20 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c   j2,j3" .      L
c8f0: 49 4d 49 54 20 7b 45 58 43 45 50 54 7d 0a 20 20  IMIT {EXCEPT}.  
c900: 31 37 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  17  "SELECT * FR
c910: 4f 4d 20 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f  OM j1 LIMIT 10 O
c920: 46 46 53 45 54 20 35 20 45 58 43 45 50 54 20 53  FFSET 5 EXCEPT S
c930: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
c940: 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54  j3" .      LIMIT
c950: 20 7b 45 58 43 45 50 54 7d 0a 20 20 31 38 20 20   {EXCEPT}.  18  
c960: 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6a  "SELECT a FROM j
c970: 31 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20  1 LIMIT (SELECT 
c980: 65 20 46 52 4f 4d 20 6a 32 29 20 45 58 43 45 50  e FROM j2) EXCEP
c990: 54 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20  T SELECT g FROM 
c9a0: 6a 32 2c 6a 33 22 20 0a 20 20 20 20 20 20 4c 49  j2,j3" .      LI
c9b0: 4d 49 54 20 7b 45 58 43 45 50 54 7d 0a 0a 20 20  MIT {EXCEPT}..  
c9c0: 31 39 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  19  "SELECT * FR
c9d0: 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59 20 61  OM j1 ORDER BY a
c9e0: 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43   INTERSECT SELEC
c9f0: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20  T * FROM j2,j3" 
ca00: 0a 20 20 20 20 20 20 7b 4f 52 44 45 52 20 42 59  .      {ORDER BY
ca10: 7d 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20  } {INTERSECT}.  
ca20: 32 30 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  20  "SELECT coun
ca30: 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 4f 52 44  t(*) FROM j1 ORD
ca40: 45 52 20 42 59 20 31 20 49 4e 54 45 52 53 45 43  ER BY 1 INTERSEC
ca50: 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20  T SELECT max(e) 
ca60: 46 52 4f 4d 20 6a 32 22 0a 20 20 20 20 20 20 7b  FROM j2".      {
ca70: 4f 52 44 45 52 20 42 59 7d 20 7b 49 4e 54 45 52  ORDER BY} {INTER
ca80: 53 45 43 54 7d 0a 20 20 32 31 20 20 22 53 45 4c  SECT}.  21  "SEL
ca90: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20  ECT count(*), * 
caa0: 46 52 4f 4d 20 6a 31 20 4f 52 44 45 52 20 42 59  FROM j1 ORDER BY
cab0: 20 31 2c 32 2c 33 20 49 4e 54 45 52 53 45 43 54   1,2,3 INTERSECT
cac0: 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d   SELECT *,* FROM
cad0: 20 6a 32 22 0a 20 20 20 20 20 20 7b 4f 52 44 45   j2".      {ORDE
cae0: 52 20 42 59 7d 20 7b 49 4e 54 45 52 53 45 43 54  R BY} {INTERSECT
caf0: 7d 0a 20 20 32 32 20 20 22 53 45 4c 45 43 54 20  }.  22  "SELECT 
cb00: 2a 20 46 52 4f 4d 20 6a 31 20 4c 49 4d 49 54 20  * FROM j1 LIMIT 
cb10: 31 30 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  10 INTERSECT SEL
cb20: 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33  ECT * FROM j2,j3
cb30: 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54 20 7b  " .      LIMIT {
cb40: 49 4e 54 45 52 53 45 43 54 7d 0a 20 20 32 33 20  INTERSECT}.  23 
cb50: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
cb60: 6a 31 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53  j1 LIMIT 10 OFFS
cb70: 45 54 20 35 20 49 4e 54 45 52 53 45 43 54 20 53  ET 5 INTERSECT S
cb80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c  ELECT * FROM j2,
cb90: 6a 33 22 20 0a 20 20 20 20 20 20 4c 49 4d 49 54  j3" .      LIMIT
cba0: 20 7b 49 4e 54 45 52 53 45 43 54 7d 0a 20 20 32   {INTERSECT}.  2
cbb0: 34 20 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  4  "SELECT a FRO
cbc0: 4d 20 6a 31 20 4c 49 4d 49 54 20 28 53 45 4c 45  M j1 LIMIT (SELE
cbd0: 43 54 20 65 20 46 52 4f 4d 20 6a 32 29 20 49 4e  CT e FROM j2) IN
cbe0: 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 67  TERSECT SELECT g
cbf0: 20 46 52 4f 4d 20 6a 32 2c 6a 33 22 20 0a 20 20   FROM j2,j3" .  
cc00: 20 20 20 20 4c 49 4d 49 54 20 7b 49 4e 54 45 52      LIMIT {INTER
cc10: 53 45 43 54 7d 0a 7d 20 7b 0a 20 20 73 65 74 20  SECT}.} {.  set 
cc20: 65 72 72 20 22 24 6f 70 31 20 63 6c 61 75 73 65  err "$op1 clause
cc30: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
cc40: 65 72 20 24 6f 70 32 20 6e 6f 74 20 62 65 66 6f  er $op2 not befo
cc50: 72 65 22 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  re".  do_catchsq
cc60: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
cc70: 37 2e 32 2e 24 74 6e 20 24 73 65 6c 65 63 74 20  7.2.$tn $select 
cc80: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a  [list 1 $err].}.
cc90: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
cca0: 52 2d 32 32 38 37 34 2d 33 32 36 35 35 20 4f 52  R-22874-32655 OR
ccb0: 44 45 52 20 42 59 20 61 6e 64 20 4c 49 4d 49 54  DER BY and LIMIT
ccc0: 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6f 6e 6c   clauses may onl
ccd0: 79 20 6f 63 63 75 72 0a 23 20 61 74 20 74 68 65  y occur.# at the
cce0: 20 65 6e 64 20 6f 66 20 74 68 65 20 65 6e 74 69   end of the enti
ccf0: 72 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  re compound SELE
cd00: 43 54 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  CT..#.foreach {t
cd10: 6e 20 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31 20  n select} {.  1 
cd20: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
cd30: 20 6a 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   j1 UNION ALL SE
cd40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a  LECT * FROM j2,j
cd50: 33 20 4f 52 44 45 52 20 42 59 20 61 22 0a 20 20  3 ORDER BY a".  
cd60: 32 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  2   "SELECT coun
cd70: 74 28 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e 49  t(*) FROM j1 UNI
cd80: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 6d 61  ON ALL SELECT ma
cd90: 78 28 65 29 20 46 52 4f 4d 20 6a 32 20 4f 52 44  x(e) FROM j2 ORD
cda0: 45 52 20 42 59 20 31 22 0a 20 20 33 20 20 20 22  ER BY 1".  3   "
cdb0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
cdc0: 20 2a 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e   * FROM j1 UNION
cdd0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 2c 2a 20   ALL SELECT *,* 
cde0: 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59  FROM j2 ORDER BY
cdf0: 20 31 2c 32 2c 33 22 0a 20 20 34 20 20 20 22 53   1,2,3".  4   "S
ce00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
ce10: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
ce20: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49   * FROM j2,j3 LI
ce30: 4d 49 54 20 31 30 22 20 0a 20 20 35 20 20 20 22  MIT 10" .  5   "
ce40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
ce50: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
ce60: 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c  T * FROM j2,j3 L
ce70: 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 35  IMIT 10 OFFSET 5
ce80: 22 20 0a 20 20 36 20 20 20 22 53 45 4c 45 43 54  " .  6   "SELECT
ce90: 20 61 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e   a FROM j1 UNION
cea0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 67 20 46 52   ALL SELECT g FR
ceb0: 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20 28  OM j2,j3 LIMIT (
cec0: 53 45 4c 45 43 54 20 31 30 29 22 20 0a 0a 20 20  SELECT 10)" ..  
ced0: 37 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  7   "SELECT * FR
cee0: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM j1 UNION SELE
cef0: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT * FROM j2,j3 
cf00: 4f 52 44 45 52 20 42 59 20 61 22 0a 20 20 38 20  ORDER BY a".  8 
cf10: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
cf20: 2a 29 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e  *) FROM j1 UNION
cf30: 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29 20 46   SELECT max(e) F
cf40: 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42 59 20  ROM j2 ORDER BY 
cf50: 31 22 0a 20 20 39 20 20 20 22 53 45 4c 45 43 54  1".  9   "SELECT
cf60: 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46 52 4f   count(*), * FRO
cf70: 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M j1 UNION SELEC
cf80: 54 20 2a 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52  T *,* FROM j2 OR
cf90: 44 45 52 20 42 59 20 31 2c 32 2c 33 22 0a 20 20  DER BY 1,2,3".  
cfa0: 31 30 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  10  "SELECT * FR
cfb0: 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM j1 UNION SELE
cfc0: 43 54 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20  CT * FROM j2,j3 
cfd0: 4c 49 4d 49 54 20 31 30 22 20 0a 20 20 31 31 20  LIMIT 10" .  11 
cfe0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
cff0: 6a 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  j1 UNION SELECT 
d000: 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d  * FROM j2,j3 LIM
d010: 49 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20  IT 10 OFFSET 5" 
d020: 0a 20 20 31 32 20 20 22 53 45 4c 45 43 54 20 61  .  12  "SELECT a
d030: 20 46 52 4f 4d 20 6a 31 20 55 4e 49 4f 4e 20 53   FROM j1 UNION S
d040: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c  ELECT g FROM j2,
d050: 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54  j3 LIMIT (SELECT
d060: 20 31 30 29 22 20 0a 0a 20 20 31 33 20 20 22 53   10)" ..  13  "S
d070: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
d080: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
d090: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f 52 44 45 52  FROM j2,j3 ORDER
d0a0: 20 42 59 20 61 22 0a 20 20 31 34 20 20 22 53 45   BY a".  14  "SE
d0b0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
d0c0: 4f 4d 20 6a 31 20 45 58 43 45 50 54 20 53 45 4c  OM j1 EXCEPT SEL
d0d0: 45 43 54 20 6d 61 78 28 65 29 20 46 52 4f 4d 20  ECT max(e) FROM 
d0e0: 6a 32 20 4f 52 44 45 52 20 42 59 20 31 22 0a 20  j2 ORDER BY 1". 
d0f0: 20 31 35 20 20 22 53 45 4c 45 43 54 20 63 6f 75   15  "SELECT cou
d100: 6e 74 28 2a 29 2c 20 2a 20 46 52 4f 4d 20 6a 31  nt(*), * FROM j1
d110: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
d120: 2c 2a 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52  ,* FROM j2 ORDER
d130: 20 42 59 20 31 2c 32 2c 33 22 0a 20 20 31 36 20   BY 1,2,3".  16 
d140: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
d150: 6a 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  j1 EXCEPT SELECT
d160: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49   * FROM j2,j3 LI
d170: 4d 49 54 20 31 30 22 20 0a 20 20 31 37 20 20 22  MIT 10" .  17  "
d180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31  SELECT * FROM j1
d190: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
d1a0: 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49   FROM j2,j3 LIMI
d1b0: 54 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 0a  T 10 OFFSET 5" .
d1c0: 20 20 31 38 20 20 22 53 45 4c 45 43 54 20 61 20    18  "SELECT a 
d1d0: 46 52 4f 4d 20 6a 31 20 45 58 43 45 50 54 20 53  FROM j1 EXCEPT S
d1e0: 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a 32 2c  ELECT g FROM j2,
d1f0: 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54  j3 LIMIT (SELECT
d200: 20 31 30 29 22 20 0a 0a 20 20 31 39 20 20 22 53   10)" ..  19  "S
d210: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20  ELECT * FROM j1 
d220: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
d230: 20 2a 20 46 52 4f 4d 20 6a 32 2c 6a 33 20 4f 52   * FROM j2,j3 OR
d240: 44 45 52 20 42 59 20 61 22 0a 20 20 32 30 20 20  DER BY a".  20  
d250: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
d260: 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45   FROM j1 INTERSE
d270: 43 54 20 53 45 4c 45 43 54 20 6d 61 78 28 65 29  CT SELECT max(e)
d280: 20 46 52 4f 4d 20 6a 32 20 4f 52 44 45 52 20 42   FROM j2 ORDER B
d290: 59 20 31 22 0a 20 20 32 31 20 20 22 53 45 4c 45  Y 1".  21  "SELE
d2a0: 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 2a 20 46  CT count(*), * F
d2b0: 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43 54  ROM j1 INTERSECT
d2c0: 20 53 45 4c 45 43 54 20 2a 2c 2a 20 46 52 4f 4d   SELECT *,* FROM
d2d0: 20 6a 32 20 4f 52 44 45 52 20 42 59 20 31 2c 32   j2 ORDER BY 1,2
d2e0: 2c 33 22 0a 20 20 32 32 20 20 22 53 45 4c 45 43  ,3".  22  "SELEC
d2f0: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54 45  T * FROM j1 INTE
d300: 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46  RSECT SELECT * F
d310: 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54 20  ROM j2,j3 LIMIT 
d320: 31 30 22 20 0a 20 20 32 33 20 20 22 53 45 4c 45  10" .  23  "SELE
d330: 43 54 20 2a 20 46 52 4f 4d 20 6a 31 20 49 4e 54  CT * FROM j1 INT
d340: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20  ERSECT SELECT * 
d350: 46 52 4f 4d 20 6a 32 2c 6a 33 20 4c 49 4d 49 54  FROM j2,j3 LIMIT
d360: 20 31 30 20 4f 46 46 53 45 54 20 35 22 20 0a 20   10 OFFSET 5" . 
d370: 20 32 34 20 20 22 53 45 4c 45 43 54 20 61 20 46   24  "SELECT a F
d380: 52 4f 4d 20 6a 31 20 49 4e 54 45 52 53 45 43 54  ROM j1 INTERSECT
d390: 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 6a   SELECT g FROM j
d3a0: 32 2c 6a 33 20 4c 49 4d 49 54 20 28 53 45 4c 45  2,j3 LIMIT (SELE
d3b0: 43 54 20 31 30 29 22 20 0a 7d 20 7b 0a 20 20 64  CT 10)" .} {.  d
d3c0: 6f 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  o_test e_select-
d3d0: 37 2e 33 2e 24 74 6e 20 7b 20 63 61 74 63 68 20  7.3.$tn { catch 
d3e0: 7b 65 78 65 63 73 71 6c 20 24 73 65 6c 65 63 74  {execsql $select
d3f0: 7d 20 6d 73 67 20 7d 20 30 0a 7d 0a 0a 23 20 45  } msg } 0.}..# E
d400: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
d410: 35 33 31 2d 33 36 35 34 33 20 41 20 63 6f 6d 70  531-36543 A comp
d420: 6f 75 6e 64 20 53 45 4c 45 43 54 20 63 72 65 61  ound SELECT crea
d430: 74 65 64 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20  ted using UNION 
d440: 41 4c 4c 0a 23 20 6f 70 65 72 61 74 6f 72 20 72  ALL.# operator r
d450: 65 74 75 72 6e 73 20 61 6c 6c 20 74 68 65 20 72  eturns all the r
d460: 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 53 45 4c  ows from the SEL
d470: 45 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ECT to the left 
d480: 6f 66 20 74 68 65 20 55 4e 49 4f 4e 0a 23 20 41  of the UNION.# A
d490: 4c 4c 20 6f 70 65 72 61 74 6f 72 2c 20 61 6e 64  LL operator, and
d4a0: 20 61 6c 6c 20 74 68 65 20 72 6f 77 73 20 66 72   all the rows fr
d4b0: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f  om the SELECT to
d4c0: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 69 74   the right of it
d4d0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
d4e0: 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  les.do_execsql_t
d4f0: 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 34  est e_select-7.4
d500: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
d510: 42 4c 45 20 71 31 28 61 20 54 45 58 54 2c 20 62  BLE q1(a TEXT, b
d520: 20 49 4e 54 45 47 45 52 2c 20 63 29 3b 0a 20 20   INTEGER, c);.  
d530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 71 32 28  CREATE TABLE q2(
d540: 64 20 4e 55 4d 42 45 52 2c 20 65 20 42 4c 4f 42  d NUMBER, e BLOB
d550: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
d560: 45 20 71 33 28 66 20 52 45 41 4c 2c 20 67 29 3b  E q3(f REAL, g);
d570: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
d580: 71 31 20 56 41 4c 55 45 53 28 31 36 2c 20 2d 38  q1 VALUES(16, -8
d590: 37 2e 36 36 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  7.66, NULL);.  I
d5a0: 4e 53 45 52 54 20 49 4e 54 4f 20 71 31 20 56 41  NSERT INTO q1 VA
d5b0: 4c 55 45 53 28 27 6c 65 67 69 62 6c 65 27 2c 20  LUES('legible', 
d5c0: 39 34 2c 20 2d 34 32 2e 34 37 29 3b 0a 20 20 49  94, -42.47);.  I
d5d0: 4e 53 45 52 54 20 49 4e 54 4f 20 71 31 20 56 41  NSERT INTO q1 VA
d5e0: 4c 55 45 53 28 27 62 65 61 75 74 79 27 2c 20 33  LUES('beauty', 3
d5f0: 36 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 49 4e 53  6, NULL);..  INS
d600: 45 52 54 20 49 4e 54 4f 20 71 32 20 56 41 4c 55  ERT INTO q2 VALU
d610: 45 53 28 27 6c 65 67 69 62 6c 65 27 2c 20 31 29  ES('legible', 1)
d620: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d630: 71 32 20 56 41 4c 55 45 53 28 27 62 65 61 75 74  q2 VALUES('beaut
d640: 79 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  y', 2);.  INSERT
d650: 20 49 4e 54 4f 20 71 32 20 56 41 4c 55 45 53 28   INTO q2 VALUES(
d660: 2d 36 35 2e 39 31 2c 20 34 29 3b 0a 20 20 49 4e  -65.91, 4);.  IN
d670: 53 45 52 54 20 49 4e 54 4f 20 71 32 20 56 41 4c  SERT INTO q2 VAL
d680: 55 45 53 28 27 65 6d 61 6e 61 74 69 6e 67 27 2c  UES('emanating',
d690: 20 2d 31 36 2e 35 36 29 3b 0a 0a 20 20 49 4e 53   -16.56);..  INS
d6a0: 45 52 54 20 49 4e 54 4f 20 71 33 20 56 41 4c 55  ERT INTO q3 VALU
d6b0: 45 53 28 27 62 65 61 75 74 79 27 2c 20 32 29 3b  ES('beauty', 2);
d6c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 71  .  INSERT INTO q
d6d0: 33 20 56 41 4c 55 45 53 28 27 62 65 61 75 74 79  3 VALUES('beauty
d6e0: 27 2c 20 32 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73  ', 2);.} {}.do_s
d6f0: 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65  elect_tests e_se
d700: 6c 65 63 74 2d 37 2e 34 20 7b 0a 20 20 31 20 20  lect-7.4 {.  1  
d710: 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   {SELECT a FROM 
d720: 71 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  q1 UNION ALL SEL
d730: 45 43 54 20 64 20 46 52 4f 4d 20 71 32 7d 0a 20  ECT d FROM q2}. 
d740: 20 20 20 20 20 7b 31 36 20 6c 65 67 69 62 6c 65       {16 legible
d750: 20 62 65 61 75 74 79 20 6c 65 67 69 62 6c 65 20   beauty legible 
d760: 62 65 61 75 74 79 20 2d 36 35 2e 39 31 20 65 6d  beauty -65.91 em
d770: 61 6e 61 74 69 6e 67 7d 0a 0a 20 20 32 20 20 20  anating}..  2   
d780: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71  {SELECT * FROM q
d790: 31 20 57 48 45 52 45 20 61 3d 31 36 20 55 4e 49  1 WHERE a=16 UNI
d7a0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27 78  ON ALL SELECT 'x
d7b0: 27 2c 20 2a 20 46 52 4f 4d 20 71 32 20 57 48 45  ', * FROM q2 WHE
d7c0: 52 45 20 6f 69 64 3d 31 7d 0a 20 20 20 20 20 20  RE oid=1}.      
d7d0: 7b 31 36 20 2d 38 37 2e 36 36 20 7b 7d 20 78 20  {16 -87.66 {} x 
d7e0: 6c 65 67 69 62 6c 65 20 31 7d 0a 0a 20 20 33 20  legible 1}..  3 
d7f0: 20 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    {SELECT count(
d800: 2a 29 20 46 52 4f 4d 20 71 31 20 55 4e 49 4f 4e  *) FROM q1 UNION
d810: 20 41 4c 4c 20 53 45 4c 45 43 54 20 6d 69 6e 28   ALL SELECT min(
d820: 65 29 20 46 52 4f 4d 20 71 32 7d 20 0a 20 20 20  e) FROM q2} .   
d830: 20 20 20 7b 33 20 2d 31 36 2e 35 36 7d 0a 0a 20     {3 -16.56}.. 
d840: 20 34 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46   4   {SELECT * F
d850: 52 4f 4d 20 71 32 20 55 4e 49 4f 4e 20 41 4c 4c  ROM q2 UNION ALL
d860: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71   SELECT * FROM q
d870: 33 7d 20 0a 20 20 20 20 20 20 7b 6c 65 67 69 62  3} .      {legib
d880: 6c 65 20 31 20 62 65 61 75 74 79 20 32 20 2d 36  le 1 beauty 2 -6
d890: 35 2e 39 31 20 34 20 65 6d 61 6e 61 74 69 6e 67  5.91 4 emanating
d8a0: 20 2d 31 36 2e 35 36 20 62 65 61 75 74 79 20 32   -16.56 beauty 2
d8b0: 20 62 65 61 75 74 79 20 32 7d 0a 7d 20 0a 0a 23   beauty 2}.} ..#
d8c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d8d0: 32 30 35 36 30 2d 33 39 31 36 32 20 54 68 65 20  20560-39162 The 
d8e0: 55 4e 49 4f 4e 20 6f 70 65 72 61 74 6f 72 20 77  UNION operator w
d8f0: 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 77 61  orks the same wa
d900: 79 20 61 73 0a 23 20 55 4e 49 4f 4e 20 41 4c 4c  y as.# UNION ALL
d910: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 64 75  , except that du
d920: 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
d930: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
d940: 65 20 66 69 6e 61 6c 0a 23 20 72 65 73 75 6c 74  e final.# result
d950: 20 73 65 74 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63   set..#.do_selec
d960: 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
d970: 2d 37 2e 35 20 7b 0a 20 20 31 20 20 20 7b 53 45  -7.5 {.  1   {SE
d980: 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31 20 55  LECT a FROM q1 U
d990: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 20 46 52  NION SELECT d FR
d9a0: 4f 4d 20 71 32 7d 0a 20 20 20 20 20 20 7b 2d 36  OM q2}.      {-6
d9b0: 35 2e 39 31 20 31 36 20 62 65 61 75 74 79 20 65  5.91 16 beauty e
d9c0: 6d 61 6e 61 74 69 6e 67 20 6c 65 67 69 62 6c 65  manating legible
d9d0: 7d 0a 0a 20 20 32 20 20 20 7b 53 45 4c 45 43 54  }..  2   {SELECT
d9e0: 20 2a 20 46 52 4f 4d 20 71 31 20 57 48 45 52 45   * FROM q1 WHERE
d9f0: 20 61 3d 31 36 20 55 4e 49 4f 4e 20 53 45 4c 45   a=16 UNION SELE
da00: 43 54 20 27 78 27 2c 20 2a 20 46 52 4f 4d 20 71  CT 'x', * FROM q
da10: 32 20 57 48 45 52 45 20 6f 69 64 3d 31 7d 0a 20  2 WHERE oid=1}. 
da20: 20 20 20 20 20 7b 31 36 20 2d 38 37 2e 36 36 20       {16 -87.66 
da30: 7b 7d 20 78 20 6c 65 67 69 62 6c 65 20 31 7d 0a  {} x legible 1}.
da40: 0a 20 20 33 20 20 20 7b 53 45 4c 45 43 54 20 63  .  3   {SELECT c
da50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 71 31 20  ount(*) FROM q1 
da60: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 6d 69 6e  UNION SELECT min
da70: 28 65 29 20 46 52 4f 4d 20 71 32 7d 20 0a 20 20  (e) FROM q2} .  
da80: 20 20 20 20 7b 2d 31 36 2e 35 36 20 33 7d 0a 0a      {-16.56 3}..
da90: 20 20 34 20 20 20 7b 53 45 4c 45 43 54 20 2a 20    4   {SELECT * 
daa0: 46 52 4f 4d 20 71 32 20 55 4e 49 4f 4e 20 53 45  FROM q2 UNION SE
dab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d 20  LECT * FROM q3} 
dac0: 0a 20 20 20 20 20 20 7b 2d 36 35 2e 39 31 20 34  .      {-65.91 4
dad0: 20 62 65 61 75 74 79 20 32 20 65 6d 61 6e 61 74   beauty 2 emanat
dae0: 69 6e 67 20 2d 31 36 2e 35 36 20 6c 65 67 69 62  ing -16.56 legib
daf0: 6c 65 20 31 7d 0a 7d 20 0a 0a 23 20 45 56 49 44  le 1}.} ..# EVID
db00: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 37 36 34  ENCE-OF: R-45764
db10: 2d 33 31 37 33 37 20 54 68 65 20 49 4e 54 45 52  -31737 The INTER
db20: 53 45 43 54 20 6f 70 65 72 61 74 6f 72 20 72 65  SECT operator re
db30: 74 75 72 6e 73 20 74 68 65 0a 23 20 69 6e 74 65  turns the.# inte
db40: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
db50: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 6c  results of the l
db60: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
db70: 4c 45 43 54 73 2e 0a 23 0a 64 6f 5f 73 65 6c 65  LECTs..#.do_sele
db80: 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63  ct_tests e_selec
db90: 74 2d 37 2e 36 20 7b 0a 20 20 31 20 20 20 7b 53  t-7.6 {.  1   {S
dba0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 71 31 20  ELECT a FROM q1 
dbb0: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
dbc0: 20 64 20 46 52 4f 4d 20 71 32 7d 20 7b 62 65 61   d FROM q2} {bea
dbd0: 75 74 79 20 6c 65 67 69 62 6c 65 7d 0a 20 20 32  uty legible}.  2
dbe0: 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f     {SELECT * FRO
dbf0: 4d 20 71 32 20 49 4e 54 45 52 53 45 43 54 20 53  M q2 INTERSECT S
dc00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 7d  ELECT * FROM q3}
dc10: 20 7b 62 65 61 75 74 79 20 32 7d 0a 7d 0a 0a 23   {beauty 2}.}..#
dc20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dc30: 32 35 37 38 37 2d 32 38 39 34 39 20 54 68 65 20  25787-28949 The 
dc40: 45 58 43 45 50 54 20 6f 70 65 72 61 74 6f 72 20  EXCEPT operator 
dc50: 72 65 74 75 72 6e 73 20 74 68 65 20 73 75 62 73  returns the subs
dc60: 65 74 20 6f 66 0a 23 20 72 6f 77 73 20 72 65 74  et of.# rows ret
dc70: 75 72 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66  urned by the lef
dc80: 74 20 53 45 4c 45 43 54 20 74 68 61 74 20 61 72  t SELECT that ar
dc90: 65 20 6e 6f 74 20 61 6c 73 6f 20 72 65 74 75 72  e not also retur
dca0: 6e 65 64 20 62 79 20 74 68 65 0a 23 20 72 69 67  ned by the.# rig
dcb0: 68 74 2d 68 61 6e 64 20 53 45 4c 45 43 54 2e 0a  ht-hand SELECT..
dcc0: 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  #.do_select_test
dcd0: 73 20 65 5f 73 65 6c 65 63 74 2d 37 2e 37 20 7b  s e_select-7.7 {
dce0: 0a 20 20 31 20 20 20 7b 53 45 4c 45 43 54 20 61  .  1   {SELECT a
dcf0: 20 46 52 4f 4d 20 71 31 20 45 58 43 45 50 54 20   FROM q1 EXCEPT 
dd00: 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 71 32  SELECT d FROM q2
dd10: 7d 20 7b 31 36 7d 0a 0a 20 20 32 20 20 20 7b 53  } {16}..  2   {S
dd20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 32 20  ELECT * FROM q2 
dd30: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a 20  EXCEPT SELECT * 
dd40: 46 52 4f 4d 20 71 33 7d 20 0a 20 20 20 20 20 20  FROM q3} .      
dd50: 7b 2d 36 35 2e 39 31 20 34 20 65 6d 61 6e 61 74  {-65.91 4 emanat
dd60: 69 6e 67 20 2d 31 36 2e 35 36 20 6c 65 67 69 62  ing -16.56 legib
dd70: 6c 65 20 31 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  le 1}.}..# EVIDE
dd80: 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 37 32 39 2d  NCE-OF: R-40729-
dd90: 35 36 34 34 37 20 44 75 70 6c 69 63 61 74 65 20  56447 Duplicate 
dda0: 72 6f 77 73 20 61 72 65 20 72 65 6d 6f 76 65 64  rows are removed
ddb0: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
ddc0: 73 0a 23 20 6f 66 20 49 4e 54 45 52 53 45 43 54  s.# of INTERSECT
ddd0: 20 61 6e 64 20 45 58 43 45 50 54 20 6f 70 65 72   and EXCEPT oper
dde0: 61 74 6f 72 73 20 62 65 66 6f 72 65 20 74 68 65  ators before the
ddf0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 72   result set is r
de00: 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 73 65  eturned..#.do_se
de10: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
de20: 65 63 74 2d 37 2e 38 20 7b 0a 20 20 30 20 20 20  ect-7.8 {.  0   
de30: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71  {SELECT * FROM q
de40: 33 7d 20 7b 62 65 61 75 74 79 20 32 20 62 65 61  3} {beauty 2 bea
de50: 75 74 79 20 32 7d 0a 0a 20 20 31 20 20 20 7b 53  uty 2}..  1   {S
de60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 20  ELECT * FROM q3 
de70: 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54  INTERSECT SELECT
de80: 20 2a 20 46 52 4f 4d 20 71 33 7d 20 7b 62 65 61   * FROM q3} {bea
de90: 75 74 79 20 32 7d 0a 20 20 32 20 20 20 7b 53 45  uty 2}.  2   {SE
dea0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 71 33 20 45  LECT * FROM q3 E
deb0: 58 43 45 50 54 20 53 45 4c 45 43 54 20 61 2c 62  XCEPT SELECT a,b
dec0: 20 46 52 4f 4d 20 71 31 7d 20 20 7b 62 65 61 75   FROM q1}  {beau
ded0: 74 79 20 32 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  ty 2}.}..# EVIDE
dee0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 37 36 35 2d  NCE-OF: R-46765-
def0: 34 33 33 36 32 20 46 6f 72 20 74 68 65 20 70 75  43362 For the pu
df00: 72 70 6f 73 65 73 20 6f 66 20 64 65 74 65 72 6d  rposes of determ
df10: 69 6e 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a  ining duplicate.
df20: 23 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 72  # rows for the r
df30: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 6f 75  esults of compou
df40: 6e 64 20 53 45 4c 45 43 54 20 6f 70 65 72 61 74  nd SELECT operat
df50: 6f 72 73 2c 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ors, NULL values
df60: 20 61 72 65 0a 23 20 63 6f 6e 73 69 64 65 72 65   are.# considere
df70: 64 20 65 71 75 61 6c 20 74 6f 20 6f 74 68 65 72  d equal to other
df80: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 6e 64   NULL values and
df90: 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 61   distinct from a
dfa0: 6c 6c 20 6e 6f 6e 2d 4e 55 4c 4c 0a 23 20 76 61  ll non-NULL.# va
dfb0: 6c 75 65 73 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76  lues..#.db nullv
dfc0: 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 73 65 6c  alue null.do_sel
dfd0: 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65  ect_tests e_sele
dfe0: 63 74 2d 37 2e 39 20 7b 0a 20 20 31 20 20 20 7b  ct-7.9 {.  1   {
dff0: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f  SELECT NULL UNIO
e000: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 4e 55 4c  N ALL SELECT NUL
e010: 4c 7d 20 7b 6e 75 6c 6c 20 6e 75 6c 6c 7d 0a 20  L} {null null}. 
e020: 20 32 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c   2   {SELECT NUL
e030: 4c 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c 45  L UNION     SELE
e040: 43 54 20 4e 55 4c 4c 7d 20 7b 6e 75 6c 6c 7d 0a  CT NULL} {null}.
e050: 20 20 33 20 20 20 7b 53 45 4c 45 43 54 20 4e 55    3   {SELECT NU
e060: 4c 4c 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  LL INTERSECT 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 34 20 20 20 7b 53 45 4c 45 43 54 20 4e  .  4   {SELECT N
e090: 55 4c 4c 20 45 58 43 45 50 54 20 20 20 20 53 45  ULL EXCEPT    SE
e0a0: 4c 45 43 54 20 4e 55 4c 4c 7d 20 7b 7d 0a 0a 20  LECT NULL} {}.. 
e0b0: 20 35 20 20 20 7b 53 45 4c 45 43 54 20 4e 55 4c   5   {SELECT NUL
e0c0: 4c 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  L UNION ALL SELE
e0d0: 43 54 20 27 61 62 27 7d 20 7b 6e 75 6c 6c 20 61  CT 'ab'} {null a
e0e0: 62 7d 0a 20 20 36 20 20 20 7b 53 45 4c 45 43 54  b}.  6   {SELECT
e0f0: 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 20 20 20 20   NULL UNION     
e100: 53 45 4c 45 43 54 20 27 61 62 27 7d 20 7b 6e 75  SELECT 'ab'} {nu
e110: 6c 6c 20 61 62 7d 0a 20 20 37 20 20 20 7b 53 45  ll ab}.  7   {SE
e120: 4c 45 43 54 20 4e 55 4c 4c 20 49 4e 54 45 52 53  LECT NULL INTERS
e130: 45 43 54 20 53 45 4c 45 43 54 20 27 61 62 27 7d  ECT SELECT 'ab'}
e140: 20 7b 7d 0a 20 20 38 20 20 20 7b 53 45 4c 45 43   {}.  8   {SELEC
e150: 54 20 4e 55 4c 4c 20 45 58 43 45 50 54 20 20 20  T NULL EXCEPT   
e160: 20 53 45 4c 45 43 54 20 27 61 62 27 7d 20 7b 6e   SELECT 'ab'} {n
e170: 75 6c 6c 7d 0a 0a 20 20 39 20 20 20 7b 53 45 4c  ull}..  9   {SEL
e180: 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 41  ECT NULL UNION A
e190: 4c 4c 20 53 45 4c 45 43 54 20 30 7d 20 7b 6e 75  LL SELECT 0} {nu
e1a0: 6c 6c 20 30 7d 0a 20 20 31 30 20 20 7b 53 45 4c  ll 0}.  10  {SEL
e1b0: 45 43 54 20 4e 55 4c 4c 20 55 4e 49 4f 4e 20 20  ECT NULL UNION  
e1c0: 20 20 20 53 45 4c 45 43 54 20 30 7d 20 7b 6e 75     SELECT 0} {nu
e1d0: 6c 6c 20 30 7d 0a 20 20 31 31 20 20 7b 53 45 4c  ll 0}.  11  {SEL
e1e0: 45 43 54 20 4e 55 4c 4c 20 49 4e 54 45 52 53 45  ECT NULL INTERSE
e1f0: 43 54 20 53 45 4c 45 43 54 20 30 7d 20 7b 7d 0a  CT SELECT 0} {}.
e200: 20 20 31 32 20 20 7b 53 45 4c 45 43 54 20 4e 55    12  {SELECT NU
e210: 4c 4c 20 45 58 43 45 50 54 20 20 20 20 53 45 4c  LL EXCEPT    SEL
e220: 45 43 54 20 30 7d 20 7b 6e 75 6c 6c 7d 0a 0a 20  ECT 0} {null}.. 
e230: 20 31 33 20 20 7b 53 45 4c 45 43 54 20 63 20 46   13  {SELECT c F
e240: 52 4f 4d 20 71 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM q1 UNION ALL
e250: 20 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 71   SELECT g FROM q
e260: 33 7d 20 7b 6e 75 6c 6c 20 2d 34 32 2e 34 37 20  3} {null -42.47 
e270: 6e 75 6c 6c 20 32 20 32 7d 0a 20 20 31 34 20 20  null 2 2}.  14  
e280: 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 71  {SELECT c FROM q
e290: 31 20 55 4e 49 4f 4e 20 20 20 20 20 53 45 4c 45  1 UNION     SELE
e2a0: 43 54 20 67 20 46 52 4f 4d 20 71 33 7d 20 7b 6e  CT g FROM q3} {n
e2b0: 75 6c 6c 20 2d 34 32 2e 34 37 20 32 7d 0a 20 20  ull -42.47 2}.  
e2c0: 31 35 20 20 7b 53 45 4c 45 43 54 20 63 20 46 52  15  {SELECT c FR
e2d0: 4f 4d 20 71 31 20 49 4e 54 45 52 53 45 43 54 20  OM q1 INTERSECT 
e2e0: 53 45 4c 45 43 54 20 67 20 46 52 4f 4d 20 71 33  SELECT g FROM q3
e2f0: 7d 20 7b 7d 0a 20 20 31 36 20 20 7b 53 45 4c 45  } {}.  16  {SELE
e300: 43 54 20 63 20 46 52 4f 4d 20 71 31 20 45 58 43  CT c FROM q1 EXC
e310: 45 50 54 20 20 20 20 53 45 4c 45 43 54 20 67 20  EPT    SELECT g 
e320: 46 52 4f 4d 20 71 33 7d 20 7b 6e 75 6c 6c 20 2d  FROM q3} {null -
e330: 34 32 2e 34 37 7d 0a 7d 0a 64 62 20 6e 75 6c 6c  42.47}.}.db null
e340: 76 61 6c 75 65 20 7b 7d 20 0a 0a 23 20 45 56 49  value {} ..# EVI
e350: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 33  DENCE-OF: R-5123
e360: 32 2d 35 30 32 32 34 20 54 68 65 20 63 6f 6c 6c  2-50224 The coll
e370: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
e380: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
e390: 77 6f 0a 23 20 74 65 78 74 20 76 61 6c 75 65 73  wo.# text values
e3a0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 61   is determined a
e3b0: 73 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s if the columns
e3c0: 20 6f 66 20 74 68 65 20 6c 65 66 74 20 61 6e 64   of the left and
e3d0: 20 72 69 67 68 74 2d 68 61 6e 64 0a 23 20 53 45   right-hand.# SE
e3e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e3f0: 77 65 72 65 20 74 68 65 20 6c 65 66 74 20 61 6e  were the left an
e400: 64 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  d right-hand ope
e410: 72 61 6e 64 73 20 6f 66 20 74 68 65 20 65 71 75  rands of the equ
e420: 61 6c 73 0a 23 20 28 3d 29 20 6f 70 65 72 61 74  als.# (=) operat
e430: 6f 72 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  or, except that 
e440: 67 72 65 61 74 65 72 20 70 72 65 63 65 64 65 6e  greater preceden
e450: 63 65 20 69 73 20 6e 6f 74 20 61 73 73 69 67 6e  ce is not assign
e460: 65 64 20 74 6f 20 61 0a 23 20 63 6f 6c 6c 61 74  ed to a.# collat
e470: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 70 65  ion sequence spe
e480: 63 69 66 69 65 64 20 77 69 74 68 20 74 68 65 20  cified with the 
e490: 70 6f 73 74 66 69 78 20 43 4f 4c 4c 41 54 45 20  postfix COLLATE 
e4a0: 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 64 72 6f 70  operator..#.drop
e4b0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65  _all_tables.do_e
e4c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
e4d0: 6c 65 63 74 2d 37 2e 31 30 2e 30 20 7b 0a 20 20  lect-7.10.0 {.  
e4e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 31 28  CREATE TABLE y1(
e4f0: 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  a COLLATE nocase
e500: 2c 20 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  , b COLLATE bina
e510: 72 79 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54  ry, c);.  INSERT
e520: 20 49 4e 54 4f 20 79 31 20 56 41 4c 55 45 53 28   INTO y1 VALUES(
e530: 27 41 62 63 27 2c 20 27 61 62 63 27 2c 20 27 61  'Abc', 'abc', 'a
e540: 42 43 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 73 65  BC');.} {}.do_se
e550: 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73 65 6c  lect_tests e_sel
e560: 65 63 74 2d 37 2e 31 30 20 7b 0a 20 20 31 20 20  ect-7.10 {.  1  
e570: 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27 20 20   {SELECT 'abc'  
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e                UN
e590: 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42 43 27  ION SELECT 'ABC'
e5a0: 7d 20 7b 41 42 43 20 61 62 63 7d 0a 20 20 32 20  } {ABC abc}.  2 
e5b0: 20 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27 20    {SELECT 'abc' 
e5c0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 55  COLLATE nocase U
e5d0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 27 41 42 43  NION SELECT 'ABC
e5e0: 27 7d 20 7b 41 42 43 7d 0a 20 20 33 20 20 20 7b  '} {ABC}.  3   {
e5f0: 53 45 4c 45 43 54 20 27 61 62 63 27 20 20 20 20  SELECT 'abc'    
e600: 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
e610: 4e 20 53 45 4c 45 43 54 20 27 41 42 43 27 20 43  N SELECT 'ABC' C
e620: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 7d 20 7b  OLLATE nocase} {
e630: 41 42 43 7d 0a 20 20 34 20 20 20 7b 53 45 4c 45  ABC}.  4   {SELE
e640: 43 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45  CT 'abc' COLLATE
e650: 20 62 69 6e 61 72 79 20 55 4e 49 4f 4e 20 53 45   binary UNION SE
e660: 4c 45 43 54 20 27 41 42 43 27 20 43 4f 4c 4c 41  LECT 'ABC' COLLA
e670: 54 45 20 6e 6f 63 61 73 65 7d 20 7b 41 42 43 20  TE nocase} {ABC 
e680: 61 62 63 7d 0a 20 20 35 20 20 20 7b 53 45 4c 45  abc}.  5   {SELE
e690: 43 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45  CT 'abc' COLLATE
e6a0: 20 6e 6f 63 61 73 65 20 55 4e 49 4f 4e 20 53 45   nocase UNION SE
e6b0: 4c 45 43 54 20 27 41 42 43 27 20 43 4f 4c 4c 41  LECT 'ABC' COLLA
e6c0: 54 45 20 62 69 6e 61 72 79 7d 20 7b 41 42 43 7d  TE binary} {ABC}
e6d0: 0a 0a 20 20 36 20 20 20 7b 53 45 4c 45 43 54 20  ..  6   {SELECT 
e6e0: 61 20 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e 20  a FROM y1 UNION 
e6f0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 79 31  SELECT b FROM y1
e700: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
e710: 20 7b 61 62 63 7d 0a 20 20 37 20 20 20 7b 53 45   {abc}.  7   {SE
e720: 4c 45 43 54 20 62 20 46 52 4f 4d 20 79 31 20 55  LECT b FROM y1 U
e730: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 20 46 52  NION SELECT a FR
e740: 4f 4d 20 79 31 7d 20 20 20 20 20 20 20 20 20 20  OM y1}          
e750: 20 20 20 20 20 20 7b 41 62 63 20 61 62 63 7d 0a        {Abc abc}.
e760: 20 20 38 20 20 20 7b 53 45 4c 45 43 54 20 61 20    8   {SELECT a 
e770: 46 52 4f 4d 20 79 31 20 55 4e 49 4f 4e 20 53 45  FROM y1 UNION SE
e780: 4c 45 43 54 20 63 20 46 52 4f 4d 20 79 31 7d 20  LECT c FROM y1} 
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
e7a0: 61 42 43 7d 0a 0a 20 20 39 20 20 20 7b 53 45 4c  aBC}..  9   {SEL
e7b0: 45 43 54 20 61 20 46 52 4f 4d 20 79 31 20 55 4e  ECT a FROM y1 UN
e7c0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 43 4f 4c  ION SELECT c COL
e7d0: 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52 4f 4d  LATE binary FROM
e7e0: 20 79 31 7d 20 7b 61 42 43 7d 0a 7d 0a 0a 23 20   y1} {aBC}.}..# 
e7f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
e800: 32 37 30 36 2d 30 37 34 30 33 20 4e 6f 20 61 66  2706-07403 No af
e810: 66 69 6e 69 74 79 20 74 72 61 6e 73 66 6f 72 6d  finity transform
e820: 61 74 69 6f 6e 73 20 61 72 65 20 61 70 70 6c 69  ations are appli
e830: 65 64 20 74 6f 0a 23 20 61 6e 79 20 76 61 6c 75  ed to.# any valu
e840: 65 73 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e  es when comparin
e850: 67 20 72 6f 77 73 20 61 73 20 70 61 72 74 20 6f  g rows as part o
e860: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  f a compound SEL
e870: 45 43 54 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ECT..#.drop_all_
e880: 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73 71  tables.do_execsq
e890: 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
e8a0: 37 2e 31 30 2e 30 20 7b 0a 20 20 43 52 45 41 54  7.10.0 {.  CREAT
e8b0: 45 20 54 41 42 4c 45 20 77 31 28 61 20 54 45 58  E TABLE w1(a TEX
e8c0: 54 2c 20 62 20 4e 55 4d 42 45 52 29 3b 0a 20 20  T, b NUMBER);.  
e8d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 77 32 28  CREATE TABLE w2(
e8e0: 61 2c 20 62 20 54 45 58 54 29 3b 0a 0a 20 20 49  a, b TEXT);..  I
e8f0: 4e 53 45 52 54 20 49 4e 54 4f 20 77 31 20 56 41  NSERT INTO w1 VA
e900: 4c 55 45 53 28 27 31 27 2c 20 34 2e 31 29 3b 0a  LUES('1', 4.1);.
e910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 77 32    INSERT INTO w2
e920: 20 56 41 4c 55 45 53 28 31 2c 20 34 2e 31 29 3b   VALUES(1, 4.1);
e930: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 73 65 6c 65 63 74  .} {}..do_select
e940: 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
e950: 37 2e 31 31 20 7b 0a 20 20 31 20 20 7b 20 53 45  7.11 {.  1  { SE
e960: 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 31 20 55  LECT a FROM w1 U
e970: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 20 46 52  NION SELECT a FR
e980: 4f 4d 20 77 32 20 7d 20 7b 31 20 31 7d 0a 20 20  OM w2 } {1 1}.  
e990: 32 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52  2  { SELECT a FR
e9a0: 4f 4d 20 77 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM w2 UNION SELE
e9b0: 43 54 20 61 20 46 52 4f 4d 20 77 31 20 7d 20 7b  CT a FROM w1 } {
e9c0: 31 20 31 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45  1 1}.  3  { SELE
e9d0: 43 54 20 62 20 46 52 4f 4d 20 77 31 20 55 4e 49  CT b FROM w1 UNI
e9e0: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
e9f0: 20 77 32 20 7d 20 7b 34 2e 31 20 34 2e 31 7d 0a   w2 } {4.1 4.1}.
ea00: 20 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20    4  { SELECT b 
ea10: 46 52 4f 4d 20 77 32 20 55 4e 49 4f 4e 20 53 45  FROM w2 UNION SE
ea20: 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31 20 7d  LECT b FROM w1 }
ea30: 20 7b 34 2e 31 20 34 2e 31 7d 0a 0a 20 20 35 20   {4.1 4.1}..  5 
ea40: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
ea50: 20 77 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   w1 INTERSECT SE
ea60: 4c 45 43 54 20 61 20 46 52 4f 4d 20 77 32 20 7d  LECT a FROM w2 }
ea70: 20 7b 7d 0a 20 20 36 20 20 7b 20 53 45 4c 45 43   {}.  6  { SELEC
ea80: 54 20 61 20 46 52 4f 4d 20 77 32 20 49 4e 54 45  T a FROM w2 INTE
ea90: 52 53 45 43 54 20 53 45 4c 45 43 54 20 61 20 46  RSECT SELECT a F
eaa0: 52 4f 4d 20 77 31 20 7d 20 7b 7d 0a 20 20 37 20  ROM w1 } {}.  7 
eab0: 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
eac0: 20 77 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   w1 INTERSECT SE
ead0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 32 20 7d  LECT b FROM w2 }
eae0: 20 7b 7d 0a 20 20 38 20 20 7b 20 53 45 4c 45 43   {}.  8  { SELEC
eaf0: 54 20 62 20 46 52 4f 4d 20 77 32 20 49 4e 54 45  T b FROM w2 INTE
eb00: 52 53 45 43 54 20 53 45 4c 45 43 54 20 62 20 46  RSECT SELECT b F
eb10: 52 4f 4d 20 77 31 20 7d 20 7b 7d 0a 0a 20 20 39  ROM w1 } {}..  9
eb20: 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f    { SELECT a FRO
eb30: 4d 20 77 31 20 45 58 43 45 50 54 20 53 45 4c 45  M w1 EXCEPT SELE
eb40: 43 54 20 61 20 46 52 4f 4d 20 77 32 20 7d 20 7b  CT a FROM w2 } {
eb50: 31 7d 0a 20 20 31 30 20 7b 20 53 45 4c 45 43 54  1}.  10 { SELECT
eb60: 20 61 20 46 52 4f 4d 20 77 32 20 45 58 43 45 50   a FROM w2 EXCEP
eb70: 54 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  T SELECT a FROM 
eb80: 77 31 20 7d 20 7b 31 7d 0a 20 20 31 31 20 7b 20  w1 } {1}.  11 { 
eb90: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31  SELECT b FROM w1
eba0: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 62   EXCEPT SELECT b
ebb0: 20 46 52 4f 4d 20 77 32 20 7d 20 7b 34 2e 31 7d   FROM w2 } {4.1}
ebc0: 0a 20 20 31 32 20 7b 20 53 45 4c 45 43 54 20 62  .  12 { SELECT b
ebd0: 20 46 52 4f 4d 20 77 32 20 45 58 43 45 50 54 20   FROM w2 EXCEPT 
ebe0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 77 31  SELECT b FROM w1
ebf0: 20 7d 20 7b 34 2e 31 7d 0a 7d 0a 0a 0a 23 20 45   } {4.1}.}...# E
ec00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32  VIDENCE-OF: R-32
ec10: 35 36 32 2d 32 30 35 36 36 20 57 68 65 6e 20 74  562-20566 When t
ec20: 68 72 65 65 20 6f 72 20 6d 6f 72 65 20 73 69 6d  hree or more sim
ec30: 70 6c 65 20 53 45 4c 45 43 54 73 20 61 72 65 0a  ple SELECTs are.
ec40: 23 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 74 6f  # connected into
ec50: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ec60: 43 54 2c 20 74 68 65 79 20 67 72 6f 75 70 20 66  CT, they group f
ec70: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
ec80: 74 2e 20 49 6e 0a 23 20 6f 74 68 65 72 20 77 6f  t. In.# other wo
ec90: 72 64 73 2c 20 69 66 20 22 41 22 2c 20 22 42 22  rds, if "A", "B"
eca0: 20 61 6e 64 20 22 43 22 20 61 72 65 20 61 6c 6c   and "C" are all
ecb0: 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73   simple SELECT s
ecc0: 74 61 74 65 6d 65 6e 74 73 2c 20 28 41 0a 23 20  tatements, (A.# 
ecd0: 6f 70 20 42 20 6f 70 20 43 29 20 69 73 20 70 72  op B op C) is pr
ece0: 6f 63 65 73 73 65 64 20 61 73 20 28 28 41 20 6f  ocessed as ((A o
ecf0: 70 20 42 29 20 6f 70 20 43 29 2e 0a 23 0a 23 20  p B) op C)..#.# 
ed00: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
ed10: 31 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  1: Precedence of
ed20: 20 55 4e 49 4f 4e 20 76 73 2e 20 49 4e 54 45 52   UNION vs. INTER
ed30: 53 45 43 54 20 0a 23 20 20 20 65 5f 73 65 6c 65  SECT .#   e_sele
ed40: 63 74 2d 37 2e 31 32 2e 32 3a 20 50 72 65 63 65  ct-7.12.2: Prece
ed50: 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20 76  dence of UNION v
ed60: 73 2e 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 23 20  s. UNION ALL .# 
ed70: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
ed80: 33 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  3: Precedence of
ed90: 20 55 4e 49 4f 4e 20 76 73 2e 20 45 58 43 45 50   UNION vs. EXCEP
eda0: 54 0a 23 20 20 20 65 5f 73 65 6c 65 63 74 2d 37  T.#   e_select-7
edb0: 2e 31 32 2e 34 3a 20 50 72 65 63 65 64 65 6e 63  .12.4: Precedenc
edc0: 65 20 6f 66 20 49 4e 54 45 52 53 45 43 54 20 76  e of INTERSECT v
edd0: 73 2e 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 23 20  s. UNION ALL .# 
ede0: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
edf0: 35 3a 20 50 72 65 63 65 64 65 6e 63 65 20 6f 66  5: Precedence of
ee00: 20 49 4e 54 45 52 53 45 43 54 20 76 73 2e 20 45   INTERSECT vs. E
ee10: 58 43 45 50 54 0a 23 20 20 20 65 5f 73 65 6c 65  XCEPT.#   e_sele
ee20: 63 74 2d 37 2e 31 32 2e 36 3a 20 50 72 65 63 65  ct-7.12.6: Prece
ee30: 64 65 6e 63 65 20 6f 66 20 55 4e 49 4f 4e 20 41  dence of UNION A
ee40: 4c 4c 20 76 73 2e 20 45 58 43 45 50 54 0a 23 20  LL vs. EXCEPT.# 
ee50: 20 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e    e_select-7.12.
ee60: 37 3a 20 43 68 65 63 6b 20 74 68 61 74 20 22 61  7: Check that "a
ee70: 20 45 58 43 45 50 54 20 62 20 45 58 43 45 50 54   EXCEPT b EXCEPT
ee80: 20 63 22 20 69 73 20 70 72 6f 63 65 73 73 65 64   c" is processed
ee90: 20 61 73 20 0a 23 20 20 20 20 20 20 20 20 20 20   as .#          
eea0: 20 20 20 20 20 20 20 20 20 22 28 61 20 45 58 43           "(a EXC
eeb0: 45 50 54 20 62 29 20 45 58 43 45 50 54 20 63 22  EPT b) EXCEPT c"
eec0: 2e 0a 23 0a 23 20 54 68 65 20 49 4e 54 45 52 53  ..#.# The INTERS
eed0: 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20 6f  ECT and EXCEPT o
eee0: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 6d 75  perations are mu
eef0: 74 75 61 6c 6c 79 20 63 6f 6d 6d 75 74 61 74 69  tually commutati
ef00: 76 65 2e 20 53 6f 0a 23 20 74 68 65 20 65 5f 73  ve. So.# the e_s
ef10: 65 6c 65 63 74 2d 37 2e 31 32 2e 35 20 74 65 73  elect-7.12.5 tes
ef20: 74 20 63 61 73 65 73 20 64 6f 20 6e 6f 74 20 70  t cases do not p
ef30: 72 6f 76 65 20 76 65 72 79 20 6d 75 63 68 2e 0a  rove very much..
ef40: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
ef50: 73 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  s.do_execsql_tes
ef60: 74 20 65 5f 73 65 6c 65 63 74 2d 37 2e 31 32 2e  t e_select-7.12.
ef70: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
ef80: 4c 45 20 74 31 28 78 29 3b 0a 20 20 49 4e 53 45  LE t1(x);.  INSE
ef90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
efa0: 53 28 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  S(1);.  INSERT I
efb0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29  NTO t1 VALUES(2)
efc0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
efd0: 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 7d 20  t1 VALUES(3);.} 
efe0: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  {}.foreach {tn s
eff0: 65 6c 65 63 74 20 72 65 73 7d 20 7b 0a 20 20 31  elect res} {.  1
f000: 61 20 22 28 31 2c 32 29 20 49 4e 54 45 52 53 45  a "(1,2) INTERSE
f010: 43 54 20 28 31 29 20 20 20 55 4e 49 4f 4e 20 20  CT (1)   UNION  
f020: 20 20 20 28 33 29 22 20 20 20 7b 31 20 33 7d 0a     (3)"   {1 3}.
f030: 20 20 31 62 20 22 28 33 29 20 20 20 55 4e 49 4f    1b "(3)   UNIO
f040: 4e 20 20 20 20 20 28 31 2c 32 29 20 49 4e 54 45  N     (1,2) INTE
f050: 52 53 45 43 54 20 28 31 29 22 20 20 20 7b 31 7d  RSECT (1)"   {1}
f060: 0a 0a 20 20 32 61 20 22 28 31 2c 32 29 20 55 4e  ..  2a "(1,2) UN
f070: 49 4f 4e 20 20 20 20 20 28 33 29 20 20 20 55 4e  ION     (3)   UN
f080: 49 4f 4e 20 41 4c 4c 20 28 31 29 22 20 20 20 7b  ION ALL (1)"   {
f090: 31 20 32 20 33 20 31 7d 0a 20 20 32 62 20 22 28  1 2 3 1}.  2b "(
f0a0: 31 29 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 28  1)   UNION ALL (
f0b0: 33 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 28  3)   UNION     (
f0c0: 31 2c 32 29 22 20 7b 31 20 32 20 33 7d 0a 0a 20  1,2)" {1 2 3}.. 
f0d0: 20 33 61 20 22 28 31 2c 32 29 20 55 4e 49 4f 4e   3a "(1,2) UNION
f0e0: 20 20 20 20 20 28 33 29 20 20 20 45 58 43 45 50       (3)   EXCEP
f0f0: 54 20 20 20 20 28 31 29 22 20 20 20 7b 32 20 33  T    (1)"   {2 3
f100: 7d 0a 20 20 33 62 20 22 28 31 2c 32 29 20 45 58  }.  3b "(1,2) EX
f110: 43 45 50 54 20 20 20 20 28 33 29 20 20 20 55 4e  CEPT    (3)   UN
f120: 49 4f 4e 20 20 20 20 20 28 31 29 22 20 20 20 7b  ION     (1)"   {
f130: 31 20 32 7d 0a 0a 20 20 34 61 20 22 28 31 2c 32  1 2}..  4a "(1,2
f140: 29 20 49 4e 54 45 52 53 45 43 54 20 28 31 29 20  ) INTERSECT (1) 
f150: 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 28 33 29 22    UNION ALL (3)"
f160: 20 20 20 7b 31 20 33 7d 0a 20 20 34 62 20 22 28     {1 3}.  4b "(
f170: 33 29 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 28  3)   UNION     (
f180: 31 2c 32 29 20 49 4e 54 45 52 53 45 43 54 20 28  1,2) INTERSECT (
f190: 31 29 22 20 20 20 7b 31 7d 0a 0a 20 20 35 61 20  1)"   {1}..  5a 
f1a0: 22 28 31 2c 32 29 20 49 4e 54 45 52 53 45 43 54  "(1,2) INTERSECT
f1b0: 20 28 32 29 20 20 20 45 58 43 45 50 54 20 20 20   (2)   EXCEPT   
f1c0: 20 28 32 29 22 20 20 20 7b 7d 0a 20 20 35 62 20   (2)"   {}.  5b 
f1d0: 22 28 32 2c 33 29 20 45 58 43 45 50 54 20 20 20  "(2,3) EXCEPT   
f1e0: 20 28 32 29 20 20 20 49 4e 54 45 52 53 45 43 54   (2)   INTERSECT
f1f0: 20 28 32 29 22 20 20 20 7b 7d 0a 0a 20 20 36 61   (2)"   {}..  6a
f200: 20 22 28 32 29 20 20 20 55 4e 49 4f 4e 20 41 4c   "(2)   UNION AL
f210: 4c 20 28 32 29 20 20 20 45 58 43 45 50 54 20 20  L (2)   EXCEPT  
f220: 20 20 28 32 29 22 20 20 20 7b 7d 0a 20 20 36 62    (2)"   {}.  6b
f230: 20 22 28 32 29 20 20 20 45 58 43 45 50 54 20 20   "(2)   EXCEPT  
f240: 20 20 28 32 29 20 20 20 55 4e 49 4f 4e 20 41 4c    (2)   UNION AL
f250: 4c 20 28 32 29 22 20 20 20 7b 32 7d 0a 0a 20 20  L (2)"   {2}..  
f260: 37 20 20 22 28 32 2c 33 29 20 45 58 43 45 50 54  7  "(2,3) EXCEPT
f270: 20 20 20 20 28 32 29 20 20 20 45 58 43 45 50 54      (2)   EXCEPT
f280: 20 20 20 20 28 33 29 22 20 20 20 7b 7d 0a 7d 20      (3)"   {}.} 
f290: 7b 0a 20 20 73 65 74 20 73 65 6c 65 63 74 20 5b  {.  set select [
f2a0: 73 74 72 69 6e 67 20 6d 61 70 20 7b 28 20 7b 53  string map {( {S
f2b0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
f2c0: 57 48 45 52 45 20 78 20 49 4e 20 28 7d 7d 20 24  WHERE x IN (}} $
f2d0: 73 65 6c 65 63 74 5d 0a 20 20 64 6f 5f 65 78 65  select].  do_exe
f2e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65  csql_test e_sele
f2f0: 63 74 2d 37 2e 31 32 2e 24 74 6e 20 24 73 65 6c  ct-7.12.$tn $sel
f300: 65 63 74 20 5b 6c 69 73 74 20 7b 2a 7d 24 72 65  ect [list {*}$re
f310: 73 5d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  s].}...#--------
f320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f360: 2d 0a 23 20 4f 52 44 45 52 20 42 59 20 63 6c 61  -.# ORDER BY cla
f370: 75 73 65 73 0a 23 0a 0a 64 72 6f 70 5f 61 6c 6c  uses.#..drop_all
f380: 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63 73  _tables.do_execs
f390: 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74  ql_test e_select
f3a0: 2d 38 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41 54  -8.1.0 {.  CREAT
f3b0: 45 20 54 41 42 4c 45 20 64 31 28 78 2c 20 79 2c  E TABLE d1(x, y,
f3c0: 20 7a 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49   z);..  INSERT I
f3d0: 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31 2c  NTO d1 VALUES(1,
f3e0: 20 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54   2, 3);.  INSERT
f3f0: 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28   INTO d1 VALUES(
f400: 32 2c 20 35 2c 20 2d 31 29 3b 0a 20 20 49 4e 53  2, 5, -1);.  INS
f410: 45 52 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55  ERT INTO d1 VALU
f420: 45 53 28 31 2c 20 32 2c 20 38 29 3b 0a 20 20 49  ES(1, 2, 8);.  I
f430: 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56 41  NSERT INTO d1 VA
f440: 4c 55 45 53 28 31 2c 20 32 2c 20 37 29 3b 0a 20  LUES(1, 2, 7);. 
f450: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20   INSERT INTO d1 
f460: 56 41 4c 55 45 53 28 32 2c 20 34 2c 20 39 33 29  VALUES(2, 4, 93)
f470: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f480: 64 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  d1 VALUES(1, 2, 
f490: 2d 32 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  -20);.  INSERT I
f4a0: 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31 2c  NTO d1 VALUES(1,
f4b0: 20 34 2c 20 39 33 29 3b 0a 20 20 49 4e 53 45 52   4, 93);.  INSER
f4c0: 54 20 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53  T INTO d1 VALUES
f4d0: 28 31 2c 20 35 2c 20 2d 31 29 3b 0a 0a 20 20 43  (1, 5, -1);..  C
f4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 64 32 28 61  REATE TABLE d2(a
f4f0: 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
f500: 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 67  NTO d2 VALUES('g
f510: 65 6e 74 6c 79 27 2c 20 27 66 61 69 6c 69 6e 67  ently', 'failing
f520: 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  s');.  INSERT IN
f530: 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 63 6f  TO d2 VALUES('co
f540: 6d 6d 65 72 63 69 61 6c 73 27 2c 20 27 62 61 74  mmercials', 'bat
f550: 68 72 6f 62 65 27 29 3b 0a 20 20 49 4e 53 45 52  hrobe');.  INSER
f560: 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53  T INTO d2 VALUES
f570: 28 27 69 74 65 72 61 74 65 27 2c 20 27 73 65 78  ('iterate', 'sex
f580: 74 6f 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ton');.  INSERT 
f590: 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27  INTO d2 VALUES('
f5a0: 62 61 62 69 65 64 27 2c 20 27 63 68 61 72 69 74  babied', 'charit
f5b0: 61 62 6c 65 6e 65 73 73 27 29 3b 0a 20 20 49 4e  ableness');.  IN
f5c0: 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56 41 4c  SERT INTO d2 VAL
f5d0: 55 45 53 28 27 73 6f 6c 65 6d 6e 6e 65 73 73 27  UES('solemnness'
f5e0: 2c 20 27 61 6e 6e 65 78 65 64 27 29 3b 0a 20 20  , 'annexed');.  
f5f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 32 20 56  INSERT INTO d2 V
f600: 41 4c 55 45 53 28 27 72 65 6a 6f 69 63 69 6e 67  ALUES('rejoicing
f610: 27 2c 20 27 6c 69 61 62 69 6c 69 74 69 65 73 27  ', 'liabilities'
f620: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
f630: 20 64 32 20 56 41 4c 55 45 53 28 27 70 72 61 67   d2 VALUES('prag
f640: 6d 61 74 69 73 74 27 2c 20 27 67 75 61 72 64 65  matist', 'guarde
f650: 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  d');.  INSERT IN
f660: 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27 62 61  TO d2 VALUES('ba
f670: 72 6b 65 64 27 2c 20 27 69 6e 74 65 72 72 75 70  rked', 'interrup
f680: 74 65 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ted');.  INSERT 
f690: 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53 28 27  INTO d2 VALUES('
f6a0: 72 65 65 6d 70 68 61 73 69 7a 65 73 27 2c 20 27  reemphasizes', '
f6b0: 72 65 70 6c 79 27 29 3b 0a 20 20 49 4e 53 45 52  reply');.  INSER
f6c0: 54 20 49 4e 54 4f 20 64 32 20 56 41 4c 55 45 53  T INTO d2 VALUES
f6d0: 28 27 6c 61 64 27 2c 20 27 72 65 6c 65 6e 74 69  ('lad', 'relenti
f6e0: 6e 67 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56  ng');.} {}..# EV
f6f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 39  IDENCE-OF: R-449
f700: 38 38 2d 34 31 30 36 34 20 52 6f 77 73 20 61 72  88-41064 Rows ar
f710: 65 20 66 69 72 73 74 20 73 6f 72 74 65 64 20 62  e first sorted b
f720: 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 73 75  ased on the resu
f730: 6c 74 73 0a 23 20 6f 66 20 65 76 61 6c 75 61 74  lts.# of evaluat
f740: 69 6e 67 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  ing the left-mos
f750: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
f760: 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
f770: 74 2c 20 74 68 65 6e 20 74 69 65 73 0a 23 20 61  t, then ties.# a
f780: 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 65 76 61  re broken by eva
f790: 6c 75 61 74 69 6e 67 20 74 68 65 20 73 65 63 6f  luating the seco
f7a0: 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 65 78 70  nd left-most exp
f7b0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 6f 20 6f  ression and so o
f7c0: 6e 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  n..#.do_select_t
f7d0: 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e  ests e_select-8.
f7e0: 31 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54  1 {.  1  "SELECT
f7f0: 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52   * FROM d1 ORDER
f800: 20 42 59 20 78 2c 20 79 2c 20 7a 22 20 7b 0a 20   BY x, y, z" {. 
f810: 20 20 20 20 31 20 32 20 2d 32 30 20 20 20 20 31      1 2 -20    1
f820: 20 32 20 33 20 20 20 20 31 20 32 20 37 20 20 20   2 3    1 2 7   
f830: 20 31 20 32 20 38 20 20 20 20 0a 20 20 20 20 20   1 2 8    .     
f840: 31 20 34 20 20 39 33 20 20 20 20 31 20 35 20 2d  1 4  93    1 5 -
f850: 31 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35  1   2 4 93   2 5
f860: 20 2d 31 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49   -1.  }.}..# EVI
f870: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 31  DENCE-OF: R-0661
f880: 37 2d 35 34 35 38 38 20 45 61 63 68 20 4f 52 44  7-54588 Each ORD
f890: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
f8a0: 20 6d 61 79 20 62 65 20 6f 70 74 69 6f 6e 61 6c   may be optional
f8b0: 6c 79 0a 23 20 66 6f 6c 6c 6f 77 65 64 20 62 79  ly.# followed by
f8c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 77   one of the keyw
f8d0: 6f 72 64 73 20 41 53 43 20 28 73 6d 61 6c 6c 65  ords ASC (smalle
f8e0: 72 20 76 61 6c 75 65 73 20 61 72 65 20 72 65 74  r values are ret
f8f0: 75 72 6e 65 64 0a 23 20 66 69 72 73 74 29 20 6f  urned.# first) o
f900: 72 20 44 45 53 43 20 28 6c 61 72 67 65 72 20 76  r DESC (larger v
f910: 61 6c 75 65 73 20 61 72 65 20 72 65 74 75 72 6e  alues are return
f920: 65 64 20 66 69 72 73 74 29 2e 0a 23 0a 23 20 20  ed first)..#.#  
f930: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 73 65   Test cases e_se
f940: 6c 65 63 74 2d 38 2e 32 2e 2a 20 74 65 73 74 20  lect-8.2.* test 
f950: 74 68 65 20 61 62 6f 76 65 2e 0a 23 0a 23 20 45  the above..#.# E
f960: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
f970: 37 30 35 2d 33 33 33 39 33 20 49 66 20 6e 65 69  705-33393 If nei
f980: 74 68 65 72 20 41 53 43 20 6f 72 20 44 45 53 43  ther ASC or DESC
f990: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c 20   are specified, 
f9a0: 72 6f 77 73 0a 23 20 61 72 65 20 73 6f 72 74 65  rows.# are sorte
f9b0: 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 28  d in ascending (
f9c0: 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 20 66  smaller values f
f9d0: 69 72 73 74 29 20 6f 72 64 65 72 20 62 79 20 64  irst) order by d
f9e0: 65 66 61 75 6c 74 2e 0a 23 0a 23 20 20 20 54 65  efault..#.#   Te
f9f0: 73 74 20 63 61 73 65 73 20 65 5f 73 65 6c 65 63  st cases e_selec
fa00: 74 2d 38 2e 33 2e 2a 20 74 65 73 74 20 74 68 65  t-8.3.* test the
fa10: 20 61 62 6f 76 65 2e 20 41 6c 6c 20 38 2e 33 20   above. All 8.3 
fa20: 74 65 73 74 20 63 61 73 65 73 20 61 72 65 0a 23  test cases are.#
fa30: 20 20 20 63 6f 70 69 65 73 20 6f 66 20 38 2e 32     copies of 8.2
fa40: 20 74 65 73 74 20 63 61 73 65 73 20 77 69 74 68   test cases with
fa50: 20 74 68 65 20 65 78 70 6c 69 63 69 74 20 22 41   the explicit "A
fa60: 53 43 22 20 72 65 6d 6f 76 65 64 2e 0a 23 0a 64  SC" removed..#.d
fa70: 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
fa80: 5f 73 65 6c 65 63 74 2d 38 20 7b 0a 20 20 32 2e  _select-8 {.  2.
fa90: 31 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  1  "SELECT * FRO
faa0: 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 20  M d1 ORDER BY x 
fab0: 41 53 43 2c 20 79 20 41 53 43 2c 20 7a 20 41 53  ASC, y ASC, z AS
fac0: 43 22 20 7b 0a 20 20 20 20 20 31 20 32 20 2d 32  C" {.     1 2 -2
fad0: 30 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20  0    1 2 3    1 
fae0: 32 20 37 20 20 20 20 31 20 32 20 38 20 20 20 20  2 7    1 2 8    
faf0: 0a 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20  .     1 4  93   
fb00: 20 31 20 35 20 2d 31 20 20 20 32 20 34 20 39 33   1 5 -1   2 4 93
fb10: 20 20 20 32 20 35 20 2d 31 0a 20 20 7d 0a 20 20     2 5 -1.  }.  
fb20: 32 2e 32 20 20 22 53 45 4c 45 43 54 20 2a 20 46  2.2  "SELECT * F
fb30: 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59 20  ROM d1 ORDER BY 
fb40: 78 20 44 45 53 43 2c 20 79 20 44 45 53 43 2c 20  x DESC, y DESC, 
fb50: 7a 20 44 45 53 43 22 20 7b 0a 20 20 20 20 20 32  z DESC" {.     2
fb60: 20 35 20 2d 31 20 20 20 20 20 32 20 34 20 39 33   5 -1     2 4 93
fb70: 20 20 20 31 20 35 20 2d 31 20 20 20 31 20 34 20     1 5 -1   1 4 
fb80: 20 39 33 20 20 20 20 0a 20 20 20 20 20 31 20 32   93    .     1 2
fb90: 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20 20   8      1 2 7   
fba0: 20 31 20 32 20 33 20 20 20 20 31 20 32 20 2d 32   1 2 3    1 2 -2
fbb0: 30 20 20 20 20 0a 20 20 7d 0a 20 20 32 2e 33 20  0    .  }.  2.3 
fbc0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64  "SELECT * FROM d
fbd0: 31 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53  1 ORDER BY x DES
fbe0: 43 2c 20 79 20 41 53 43 2c 20 7a 20 44 45 53 43  C, y ASC, z DESC
fbf0: 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33 20  " {.     2 4 93 
fc00: 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20 32    2 5 -1     1 2
fc10: 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20 20   8      1 2 7   
fc20: 20 0a 20 20 20 20 20 31 20 32 20 33 20 20 20 20   .     1 2 3    
fc30: 31 20 32 20 2d 32 30 20 20 20 20 31 20 34 20 20  1 2 -20    1 4  
fc40: 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20 0a  93    1 5 -1   .
fc50: 20 20 7d 0a 20 20 32 2e 34 20 20 22 53 45 4c 45    }.  2.4  "SELE
fc60: 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
fc70: 45 52 20 42 59 20 78 20 44 45 53 43 2c 20 79 20  ER BY x DESC, y 
fc80: 41 53 43 2c 20 7a 20 41 53 43 22 20 7b 0a 20 20  ASC, z ASC" {.  
fc90: 20 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20     2 4 93   2 5 
fca0: 2d 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20  -1     1 2 -20  
fcb0: 20 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20    1 2 3    .    
fcc0: 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
fcd0: 20 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20       1 4  93    
fce0: 31 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 0a 20  1 5 -1   .  }.. 
fcf0: 20 33 2e 31 20 20 22 53 45 4c 45 43 54 20 2a 20   3.1  "SELECT * 
fd00: 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59  FROM d1 ORDER BY
fd10: 20 78 2c 20 79 2c 20 7a 22 20 7b 0a 20 20 20 20   x, y, z" {.    
fd20: 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 32 20   1 2 -20    1 2 
fd30: 33 20 20 20 20 31 20 32 20 37 20 20 20 20 31 20  3    1 2 7    1 
fd40: 32 20 38 20 20 20 20 0a 20 20 20 20 20 31 20 34  2 8    .     1 4
fd50: 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20    93    1 5 -1  
fd60: 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d 31   2 4 93   2 5 -1
fd70: 0a 20 20 7d 0a 20 20 33 2e 33 20 20 22 53 45 4c  .  }.  3.3  "SEL
fd80: 45 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52  ECT * FROM d1 OR
fd90: 44 45 52 20 42 59 20 78 20 44 45 53 43 2c 20 79  DER BY x DESC, y
fda0: 2c 20 7a 20 44 45 53 43 22 20 7b 0a 20 20 20 20  , z DESC" {.    
fdb0: 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d 31   2 4 93   2 5 -1
fdc0: 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20 20       1 2 8      
fdd0: 31 20 32 20 37 20 20 20 20 0a 20 20 20 20 20 31  1 2 7    .     1
fde0: 20 32 20 33 20 20 20 20 31 20 32 20 2d 32 30 20   2 3    1 2 -20 
fdf0: 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31 20     1 4  93    1 
fe00: 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20 33 2e  5 -1   .  }.  3.
fe10: 34 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  4 "SELECT * FROM
fe20: 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 20 44   d1 ORDER BY x D
fe30: 45 53 43 2c 20 79 2c 20 7a 22 20 7b 0a 20 20 20  ESC, y, z" {.   
fe40: 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
fe50: 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20 20  1     1 2 -20   
fe60: 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20 20   1 2 3    .     
fe70: 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20 20  1 2 7    1 2 8  
fe80: 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31      1 4  93    1
fe90: 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 7d 0a 0a   5 -1   .  }.}..
fea0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
feb0: 2d 32 39 37 37 39 2d 30 34 32 38 31 20 49 66 20  -29779-04281 If 
fec0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
fed0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
fee0: 73 74 61 6e 74 0a 23 20 69 6e 74 65 67 65 72 20  stant.# integer 
fef0: 4b 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  K then the expre
ff00: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ssion is conside
ff10: 72 65 64 20 61 6e 20 61 6c 69 61 73 20 66 6f 72  red an alias for
ff20: 20 74 68 65 20 4b 2d 74 68 0a 23 20 63 6f 6c 75   the K-th.# colu
ff30: 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  mn of the result
ff40: 20 73 65 74 20 28 63 6f 6c 75 6d 6e 73 20 61 72   set (columns ar
ff50: 65 20 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20  e numbered from 
ff60: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 0a 23 20  left to right.# 
ff70: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 29  starting with 1)
ff80: 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
ff90: 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 34  sts e_select-8.4
ffa0: 20 7b 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20   {.  1  "SELECT 
ffb0: 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20  * FROM d1 ORDER 
ffc0: 42 59 20 31 20 41 53 43 2c 20 32 20 41 53 43 2c  BY 1 ASC, 2 ASC,
ffd0: 20 33 20 41 53 43 22 20 7b 0a 20 20 20 20 20 31   3 ASC" {.     1
ffe0: 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20   2 -20    1 2 3 
fff0: 20 20 20 31 20 32 20 37 20 20 20 20 31 20 32 20     1 2 7    1 2 
10000 38 20 20 20 20 0a 20 20 20 20 20 31 20 34 20 20  8    .     1 4  
10010 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20 32  93    1 5 -1   2
10020 20 34 20 39 33 20 20 20 32 20 35 20 2d 31 0a 20   4 93   2 5 -1. 
10030 20 7d 0a 20 20 32 20 20 22 53 45 4c 45 43 54 20   }.  2  "SELECT 
10040 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20  * FROM d1 ORDER 
10050 42 59 20 31 20 44 45 53 43 2c 20 32 20 44 45 53  BY 1 DESC, 2 DES
10060 43 2c 20 33 20 44 45 53 43 22 20 7b 0a 20 20 20  C, 3 DESC" {.   
10070 20 20 32 20 35 20 2d 31 20 20 20 20 20 32 20 34    2 5 -1     2 4
10080 20 39 33 20 20 20 31 20 35 20 2d 31 20 20 20 31   93   1 5 -1   1
10090 20 34 20 20 39 33 20 20 20 20 0a 20 20 20 20 20   4  93    .     
100a0 31 20 32 20 38 20 20 20 20 20 20 31 20 32 20 37  1 2 8      1 2 7
100b0 20 20 20 20 31 20 32 20 33 20 20 20 20 31 20 32      1 2 3    1 2
100c0 20 2d 32 30 20 20 20 20 0a 20 20 7d 0a 20 20 33   -20    .  }.  3
100d0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
100e0 64 31 20 4f 52 44 45 52 20 42 59 20 31 20 44 45  d1 ORDER BY 1 DE
100f0 53 43 2c 20 32 20 41 53 43 2c 20 33 20 44 45 53  SC, 2 ASC, 3 DES
10100 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39 33  C" {.     2 4 93
10110 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31 20     2 5 -1     1 
10120 32 20 38 20 20 20 20 20 20 31 20 32 20 37 20 20  2 8      1 2 7  
10130 20 20 0a 20 20 20 20 20 31 20 32 20 33 20 20 20    .     1 2 3   
10140 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 34 20   1 2 -20    1 4 
10150 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20 20   93    1 5 -1   
10160 0a 20 20 7d 0a 20 20 34 20 20 22 53 45 4c 45 43  .  }.  4  "SELEC
10170 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  T * FROM d1 ORDE
10180 52 20 42 59 20 31 20 44 45 53 43 2c 20 32 20 41  R BY 1 DESC, 2 A
10190 53 43 2c 20 33 20 41 53 43 22 20 7b 0a 20 20 20  SC, 3 ASC" {.   
101a0 20 20 32 20 34 20 39 33 20 20 20 32 20 35 20 2d    2 4 93   2 5 -
101b0 31 20 20 20 20 20 31 20 32 20 2d 32 30 20 20 20  1     1 2 -20   
101c0 20 31 20 32 20 33 20 20 20 20 0a 20 20 20 20 20   1 2 3    .     
101d0 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20 20  1 2 7    1 2 8  
101e0 20 20 20 20 31 20 34 20 20 39 33 20 20 20 20 31      1 4  93    1
101f0 20 35 20 2d 31 20 20 20 0a 20 20 7d 0a 20 20 35   5 -1   .  }.  5
10200 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
10210 20 64 31 20 4f 52 44 45 52 20 42 59 20 31 2c 20   d1 ORDER BY 1, 
10220 32 2c 20 33 22 20 7b 0a 20 20 20 20 20 31 20 32  2, 3" {.     1 2
10230 20 2d 32 30 20 20 20 20 31 20 32 20 33 20 20 20   -20    1 2 3   
10240 20 31 20 32 20 37 20 20 20 20 31 20 32 20 38 20   1 2 7    1 2 8 
10250 20 20 20 0a 20 20 20 20 20 31 20 34 20 20 39 33     .     1 4  93
10260 20 20 20 20 31 20 35 20 2d 31 20 20 20 32 20 34      1 5 -1   2 4
10270 20 39 33 20 20 20 32 20 35 20 2d 31 0a 20 20 7d   93   2 5 -1.  }
10280 0a 20 20 36 20 20 22 53 45 4c 45 43 54 20 2a 20  .  6  "SELECT * 
10290 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20 42 59  FROM d1 ORDER BY
102a0 20 31 20 44 45 53 43 2c 20 32 2c 20 33 20 44 45   1 DESC, 2, 3 DE
102b0 53 43 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39  SC" {.     2 4 9
102c0 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31  3   2 5 -1     1
102d0 20 32 20 38 20 20 20 20 20 20 31 20 32 20 37 20   2 8      1 2 7 
102e0 20 20 20 0a 20 20 20 20 20 31 20 32 20 33 20 20     .     1 2 3  
102f0 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 34    1 2 -20    1 4
10300 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20    93    1 5 -1  
10310 20 0a 20 20 7d 0a 20 20 37 20 20 22 53 45 4c 45   .  }.  7  "SELE
10320 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
10330 45 52 20 42 59 20 31 20 44 45 53 43 2c 20 32 2c  ER BY 1 DESC, 2,
10340 20 33 22 20 7b 0a 20 20 20 20 20 32 20 34 20 39   3" {.     2 4 9
10350 33 20 20 20 32 20 35 20 2d 31 20 20 20 20 20 31  3   2 5 -1     1
10360 20 32 20 2d 32 30 20 20 20 20 31 20 32 20 33 20   2 -20    1 2 3 
10370 20 20 20 0a 20 20 20 20 20 31 20 32 20 37 20 20     .     1 2 7  
10380 20 20 31 20 32 20 38 20 20 20 20 20 20 31 20 34    1 2 8      1 4
10390 20 20 39 33 20 20 20 20 31 20 35 20 2d 31 20 20    93    1 5 -1  
103a0 20 0a 20 20 7d 0a 20 20 38 20 20 22 53 45 4c 45   .  }.  8  "SELE
103b0 43 54 20 7a 2c 20 78 20 46 52 4f 4d 20 64 31 20  CT z, x FROM d1 
103c0 4f 52 44 45 52 20 42 59 20 32 22 20 7b 0a 20 20  ORDER BY 2" {.  
103d0 20 20 20 33 20 31 20 20 20 20 20 38 20 31 20 20     3 1     8 1  
103e0 20 20 37 20 31 20 20 20 2d 32 30 20 31 20 0a 20    7 1   -20 1 . 
103f0 20 20 20 20 39 33 20 31 20 20 20 2d 31 20 31 20      93 1   -1 1 
10400 20 20 2d 31 20 32 20 20 20 39 33 20 32 0a 20 20    -1 2   93 2.  
10410 7d 0a 20 20 39 20 20 22 53 45 4c 45 43 54 20 7a  }.  9  "SELECT z
10420 2c 20 78 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  , x FROM d1 ORDE
10430 52 20 42 59 20 31 22 20 7b 0a 20 20 20 20 20 2d  R BY 1" {.     -
10440 32 30 20 31 20 20 2d 31 20 32 20 20 20 2d 31 20  20 1  -1 2   -1 
10450 31 20 20 20 33 20 31 20 20 20 20 20 0a 20 20 20  1   3 1     .   
10460 20 20 37 20 31 20 20 20 20 20 38 20 31 20 20 20    7 1     8 1   
10470 39 33 20 32 20 20 20 39 33 20 31 20 20 20 0a 20  93 2   93 1   . 
10480 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   }.}..# EVIDENCE
10490 2d 4f 46 3a 20 52 2d 36 33 32 38 36 2d 35 31 39  -OF: R-63286-519
104a0 37 37 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  77 If the ORDER 
104b0 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  BY expression is
104c0 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 0a 23   an identifier.#
104d0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
104e0 73 20 74 6f 20 74 68 65 20 61 6c 69 61 73 20 6f  s to the alias o
104f0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 75 74  f one of the out
10500 70 75 74 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  put columns, the
10510 6e 20 74 68 65 0a 23 20 65 78 70 72 65 73 73 69  n the.# expressi
10520 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  on is considered
10530 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68   an alias for th
10540 61 74 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 64 6f 5f  at column..#.do_
10550 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f 73  select_tests e_s
10560 65 6c 65 63 74 2d 38 2e 35 20 7b 0a 20 20 31 20  elect-8.5 {.  1 
10570 20 20 22 53 45 4c 45 43 54 20 7a 2b 31 20 41 53    "SELECT z+1 AS
10580 20 61 62 63 20 46 52 4f 4d 20 64 31 20 4f 52 44   abc FROM d1 ORD
10590 45 52 20 42 59 20 61 62 63 22 20 7b 0a 20 20 20  ER BY abc" {.   
105a0 20 2d 31 39 20 30 20 30 20 34 20 38 20 39 20 39   -19 0 0 4 8 9 9
105b0 34 20 39 34 0a 20 20 7d 0a 20 20 32 20 20 20 22  4 94.  }.  2   "
105c0 53 45 4c 45 43 54 20 7a 2b 31 20 41 53 20 61 62  SELECT z+1 AS ab
105d0 63 20 46 52 4f 4d 20 64 31 20 4f 52 44 45 52 20  c FROM d1 ORDER 
105e0 42 59 20 61 62 63 20 44 45 53 43 22 20 7b 0a 20  BY abc DESC" {. 
105f0 20 20 20 39 34 20 39 34 20 39 20 38 20 34 20 30     94 94 9 8 4 0
10600 20 30 20 2d 31 39 0a 20 20 7d 0a 20 20 33 20 20   0 -19.  }.  3  
10610 22 53 45 4c 45 43 54 20 7a 20 41 53 20 78 2c 20  "SELECT z AS x, 
10620 78 20 41 53 20 7a 20 46 52 4f 4d 20 64 31 20 4f  x AS z FROM d1 O
10630 52 44 45 52 20 42 59 20 7a 22 20 7b 0a 20 20 20  RDER BY z" {.   
10640 20 33 20 31 20 20 20 20 38 20 31 20 20 20 20 37   3 1    8 1    7
10650 20 31 20 20 20 20 2d 32 30 20 31 20 20 20 20 39   1    -20 1    9
10660 33 20 31 20 20 20 20 2d 31 20 31 20 20 20 20 2d  3 1    -1 1    -
10670 31 20 32 20 20 20 20 39 33 20 32 0a 20 20 7d 0a  1 2    93 2.  }.
10680 20 20 34 20 20 22 53 45 4c 45 43 54 20 7a 20 41    4  "SELECT z A
10690 53 20 78 2c 20 78 20 41 53 20 7a 20 46 52 4f 4d  S x, x AS z FROM
106a0 20 64 31 20 4f 52 44 45 52 20 42 59 20 78 22 20   d1 ORDER BY x" 
106b0 7b 0a 20 20 20 20 2d 32 30 20 31 20 20 20 20 2d  {.    -20 1    -
106c0 31 20 32 20 20 20 20 2d 31 20 31 20 20 20 20 33  1 2    -1 1    3
106d0 20 31 20 20 20 20 37 20 31 20 20 20 20 38 20 31   1    7 1    8 1
106e0 20 20 20 20 39 33 20 32 20 20 20 20 39 33 20 31      93 2    93 1
106f0 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  .  }.}..# EVIDEN
10700 43 45 2d 4f 46 3a 20 52 2d 36 35 30 36 38 2d 32  CE-OF: R-65068-2
10710 37 32 30 37 20 4f 74 68 65 72 77 69 73 65 2c 20  7207 Otherwise, 
10720 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
10730 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23 20  expression is.# 
10740 61 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  any other expres
10750 73 69 6f 6e 2c 20 69 74 20 69 73 20 65 76 61 6c  sion, it is eval
10760 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
10770 74 75 72 6e 65 64 20 76 61 6c 75 65 20 75 73 65  turned value use
10780 64 20 74 6f 0a 23 20 6f 72 64 65 72 20 74 68 65  d to.# order the
10790 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 23 0a   output rows..#.
107a0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
107b0 2d 30 33 34 32 31 2d 35 37 39 38 38 20 49 66 20  -03421-57988 If 
107c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
107d0 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 65  ment is a simple
107e0 20 53 45 4c 45 43 54 2c 0a 23 20 74 68 65 6e 20   SELECT,.# then 
107f0 61 6e 20 4f 52 44 45 52 20 42 59 20 6d 61 79 20  an ORDER BY may 
10800 63 6f 6e 74 61 69 6e 20 61 6e 79 20 61 72 62 69  contain any arbi
10810 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
10820 73 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  s..#.do_select_t
10830 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e  ests e_select-8.
10840 36 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45 43  6 {.  1   "SELEC
10850 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44 45  T * FROM d1 ORDE
10860 52 20 42 59 20 78 2b 79 2b 7a 22 20 7b 0a 20 20  R BY x+y+z" {.  
10870 20 20 31 20 32 20 2d 32 30 20 20 20 20 31 20 35    1 2 -20    1 5
10880 20 2d 31 20 20 20 20 31 20 32 20 33 20 20 20 20   -1    1 2 3    
10890 32 20 35 20 2d 31 20 0a 20 20 20 20 31 20 32 20  2 5 -1 .    1 2 
108a0 37 20 20 20 20 20 20 31 20 32 20 38 20 20 20 20  7      1 2 8    
108b0 20 31 20 34 20 39 33 20 20 20 32 20 34 20 39 33   1 4 93   2 4 93
108c0 0a 20 20 7d 0a 20 20 32 20 20 20 22 53 45 4c 45  .  }.  2   "SELE
108d0 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
108e0 45 52 20 42 59 20 78 2a 7a 22 20 7b 0a 20 20 20  ER BY x*z" {.   
108f0 20 31 20 32 20 2d 32 30 20 20 20 20 32 20 35 20   1 2 -20    2 5 
10900 2d 31 20 20 20 20 31 20 35 20 2d 31 20 20 20 20  -1    1 5 -1    
10910 31 20 32 20 33 20 0a 20 20 20 20 31 20 32 20 37  1 2 3 .    1 2 7
10920 20 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20        1 2 8     
10930 31 20 34 20 39 33 20 20 20 20 32 20 34 20 39 33  1 4 93    2 4 93
10940 0a 20 20 7d 0a 20 20 33 20 20 20 22 53 45 4c 45  .  }.  3   "SELE
10950 43 54 20 2a 20 46 52 4f 4d 20 64 31 20 4f 52 44  CT * FROM d1 ORD
10960 45 52 20 42 59 20 79 2a 7a 22 20 7b 0a 20 20 20  ER BY y*z" {.   
10970 20 31 20 32 20 2d 32 30 20 20 20 20 32 20 35 20   1 2 -20    2 5 
10980 2d 31 20 20 20 20 31 20 35 20 2d 31 20 20 20 20  -1    1 5 -1    
10990 31 20 32 20 33 20 0a 20 20 20 20 31 20 32 20 37  1 2 3 .    1 2 7
109a0 20 20 20 20 20 20 31 20 32 20 38 20 20 20 20 20        1 2 8     
109b0 32 20 34 20 39 33 20 20 20 20 31 20 34 20 39 33  2 4 93    1 4 93
109c0 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  .  }.}..# EVIDEN
109d0 43 45 2d 4f 46 3a 20 52 2d 32 38 38 35 33 2d 30  CE-OF: R-28853-0
109e0 38 31 34 37 20 48 6f 77 65 76 65 72 2c 20 69 66  8147 However, if
109f0 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 61   the SELECT is a
10a00 20 63 6f 6d 70 6f 75 6e 64 0a 23 20 53 45 4c 45   compound.# SELE
10a10 43 54 2c 20 74 68 65 6e 20 4f 52 44 45 52 20 42  CT, then ORDER B
10a20 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  Y expressions th
10a30 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 69 61 73  at are not alias
10a40 65 73 20 74 6f 20 6f 75 74 70 75 74 0a 23 20 63  es to output.# c
10a50 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 65  olumns must be e
10a60 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
10a70 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  as an expression
10a80 20 75 73 65 64 20 61 73 20 61 6e 20 6f 75 74 70   used as an outp
10a90 75 74 0a 23 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 64  ut.# column..#.d
10aa0 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65  o_select_tests e
10ab0 5f 73 65 6c 65 63 74 2d 38 2e 37 2e 31 20 2d 65  _select-8.7.1 -e
10ac0 72 72 6f 72 20 7b 0a 20 20 25 73 20 4f 52 44 45  rror {.  %s ORDE
10ad0 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e  R BY term does n
10ae0 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  ot match any col
10af0 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
10b00 74 20 73 65 74 0a 7d 20 7b 0a 20 20 31 20 20 20  t set.} {.  1   
10b10 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 64  "SELECT x FROM d
10b20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
10b30 43 54 20 61 20 46 52 4f 4d 20 64 32 20 4f 52 44  CT a FROM d2 ORD
10b40 45 52 20 42 59 20 78 2a 7a 22 20 20 20 20 20 20  ER BY x*z"      
10b50 20 20 31 73 74 0a 20 20 32 20 20 20 22 53 45 4c    1st.  2   "SEL
10b60 45 43 54 20 78 2c 7a 20 46 52 4f 4d 20 64 31 20  ECT x,z FROM d1 
10b70 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
10b80 20 61 2c 62 20 46 52 4f 4d 20 64 32 20 4f 52 44   a,b FROM d2 ORD
10b90 45 52 20 42 59 20 78 2c 20 78 2f 7a 22 20 32 6e  ER BY x, x/z" 2n
10ba0 64 0a 7d 20 0a 0a 64 6f 5f 73 65 6c 65 63 74 5f  d.} ..do_select_
10bb0 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38  tests e_select-8
10bc0 2e 37 2e 32 20 7b 0a 20 20 31 20 20 20 22 53 45  .7.2 {.  1   "SE
10bd0 4c 45 43 54 20 78 2a 7a 20 46 52 4f 4d 20 64 31  LECT x*z FROM d1
10be0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
10bf0 54 20 61 20 46 52 4f 4d 20 64 32 20 4f 52 44 45  T a FROM d2 ORDE
10c00 52 20 42 59 20 78 2a 7a 22 20 7b 0a 20 20 20 20  R BY x*z" {.    
10c10 2d 32 30 20 2d 32 20 2d 31 20 33 20 37 20 38 20  -20 -2 -1 3 7 8 
10c20 39 33 20 31 38 36 20 62 61 62 69 65 64 20 62 61  93 186 babied ba
10c30 72 6b 65 64 20 63 6f 6d 6d 65 72 63 69 61 6c 73  rked commercials
10c40 20 67 65 6e 74 6c 79 20 0a 20 20 20 20 69 74 65   gently .    ite
10c50 72 61 74 65 20 6c 61 64 20 70 72 61 67 6d 61 74  rate lad pragmat
10c60 69 73 74 20 72 65 65 6d 70 68 61 73 69 7a 65 73  ist reemphasizes
10c70 20 72 65 6a 6f 69 63 69 6e 67 20 73 6f 6c 65 6d   rejoicing solem
10c80 6e 6e 65 73 73 0a 20 20 7d 0a 20 20 32 20 20 20  nness.  }.  2   
10c90 22 53 45 4c 45 43 54 20 78 2c 20 78 2f 7a 20 46  "SELECT x, x/z F
10ca0 52 4f 4d 20 64 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d1 UNION ALL
10cb0 20 53 45 4c 45 43 54 20 61 2c 62 20 46 52 4f 4d   SELECT a,b FROM
10cc0 20 64 32 20 4f 52 44 45 52 20 42 59 20 78 2c 20   d2 ORDER BY x, 
10cd0 78 2f 7a 22 20 7b 0a 20 20 20 20 31 20 2d 31 20  x/z" {.    1 -1 
10ce0 31 20 30 20 31 20 30 20 31 20 30 20 31 20 30 20  1 0 1 0 1 0 1 0 
10cf0 31 20 30 20 32 20 2d 32 20 32 20 30 20 0a 20 20  1 0 2 -2 2 0 .  
10d00 20 20 62 61 62 69 65 64 20 63 68 61 72 69 74 61    babied charita
10d10 62 6c 65 6e 65 73 73 20 62 61 72 6b 65 64 20 69  bleness barked i
10d20 6e 74 65 72 72 75 70 74 65 64 20 63 6f 6d 6d 65  nterrupted comme
10d30 72 63 69 61 6c 73 20 62 61 74 68 72 6f 62 65 20  rcials bathrobe 
10d40 67 65 6e 74 6c 79 0a 20 20 20 20 66 61 69 6c 69  gently.    faili
10d50 6e 67 73 20 69 74 65 72 61 74 65 20 73 65 78 74  ngs iterate sext
10d60 6f 6e 20 6c 61 64 20 72 65 6c 65 6e 74 69 6e 67  on lad relenting
10d70 20 70 72 61 67 6d 61 74 69 73 74 20 67 75 61 72   pragmatist guar
10d80 64 65 64 20 72 65 65 6d 70 68 61 73 69 7a 65 73  ded reemphasizes
10d90 20 72 65 70 6c 79 0a 20 20 20 20 72 65 6a 6f 69   reply.    rejoi
10da0 63 69 6e 67 20 6c 69 61 62 69 6c 69 74 69 65 73  cing liabilities
10db0 20 73 6f 6c 65 6d 6e 6e 65 73 73 20 61 6e 6e 65   solemnness anne
10dc0 78 65 64 0a 20 20 7d 0a 7d 20 0a 0a 64 6f 5f 65  xed.  }.} ..do_e
10dd0 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65  xecsql_test e_se
10de0 6c 65 63 74 2d 38 2e 38 2e 30 20 7b 0a 20 20 43  lect-8.8.0 {.  C
10df0 52 45 41 54 45 20 54 41 42 4c 45 20 64 33 28 61  REATE TABLE d3(a
10e00 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10e10 20 64 33 20 56 41 4c 55 45 53 28 27 74 65 78 74   d3 VALUES('text
10e20 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
10e30 4f 20 64 33 20 56 41 4c 55 45 53 28 31 34 2e 31  O d3 VALUES(14.1
10e40 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10e50 20 64 33 20 56 41 4c 55 45 53 28 31 33 29 3b 0a   d3 VALUES(13);.
10e60 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 33    INSERT INTO d3
10e70 20 56 41 4c 55 45 53 28 58 27 37 38 37 38 37 38   VALUES(X'787878
10e80 37 38 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  78');.  INSERT I
10e90 4e 54 4f 20 64 33 20 56 41 4c 55 45 53 28 31 35  NTO d3 VALUES(15
10ea0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10eb0 20 64 33 20 56 41 4c 55 45 53 28 31 32 2e 39 29   d3 VALUES(12.9)
10ec0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
10ed0 64 33 20 56 41 4c 55 45 53 28 6e 75 6c 6c 29 3b  d3 VALUES(null);
10ee0 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
10ef0 20 64 34 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f   d4(x COLLATE no
10f00 63 61 73 65 29 3b 0a 20 20 49 4e 53 45 52 54 20  case);.  INSERT 
10f10 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28 27  INTO d4 VALUES('
10f20 61 62 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  abc');.  INSERT 
10f30 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28 27  INTO d4 VALUES('
10f40 67 68 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ghi');.  INSERT 
10f50 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28 27  INTO d4 VALUES('
10f60 44 45 46 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  DEF');.  INSERT 
10f70 49 4e 54 4f 20 64 34 20 56 41 4c 55 45 53 28 27  INTO d4 VALUES('
10f80 4a 4b 4c 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45  JKL');.} {}..# E
10f90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 30  VIDENCE-OF: R-10
10fa0 38 38 33 2d 31 37 36 39 37 20 46 6f 72 20 74 68  883-17697 For th
10fb0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 73 6f  e purposes of so
10fc0 72 74 69 6e 67 20 72 6f 77 73 2c 20 76 61 6c 75  rting rows, valu
10fd0 65 73 0a 23 20 61 72 65 20 63 6f 6d 70 61 72 65  es.# are compare
10fe0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  d in the same wa
10ff0 79 20 61 73 20 66 6f 72 20 63 6f 6d 70 61 72 69  y as for compari
11000 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  son expressions.
11010 0a 23 0a 23 20 20 20 54 68 65 20 66 6f 6c 6c 6f  .#.#   The follo
11020 77 69 6e 67 20 74 65 73 74 73 20 76 65 72 69 66  wing tests verif
11030 79 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  y that values of
11040 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
11050 20 61 72 65 20 73 6f 72 74 65 64 0a 23 20 20 20   are sorted.#   
11060 63 6f 72 72 65 63 74 6c 79 2c 20 61 6e 64 20 74  correctly, and t
11070 68 61 74 20 6d 69 78 65 64 20 72 65 61 6c 20 61  hat mixed real a
11080 6e 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  nd integer value
11090 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 70  s are compared p
110a0 72 6f 70 65 72 6c 79 2e 0a 23 0a 64 6f 5f 65 78  roperly..#.do_ex
110b0 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
110c0 65 63 74 2d 38 2e 38 2e 31 20 7b 0a 20 20 53 45  ect-8.8.1 {.  SE
110d0 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 33 20 4f  LECT a FROM d3 O
110e0 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 7b 7d 20  RDER BY a.} {{} 
110f0 31 32 2e 39 20 31 33 20 31 34 2e 31 20 31 35 20  12.9 13 14.1 15 
11100 74 65 78 74 20 78 78 78 78 7d 0a 64 6f 5f 65 78  text xxxx}.do_ex
11110 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
11120 65 63 74 2d 38 2e 38 2e 32 20 7b 0a 20 20 53 45  ect-8.8.2 {.  SE
11130 4c 45 43 54 20 61 20 46 52 4f 4d 20 64 33 20 4f  LECT a FROM d3 O
11140 52 44 45 52 20 42 59 20 61 20 44 45 53 43 0a 7d  RDER BY a DESC.}
11150 20 7b 78 78 78 78 20 74 65 78 74 20 31 35 20 31   {xxxx text 15 1
11160 34 2e 31 20 31 33 20 31 32 2e 39 20 7b 7d 7d 0a  4.1 13 12.9 {}}.
11170 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
11180 20 52 2d 36 34 31 39 39 2d 32 32 34 37 31 20 49   R-64199-22471 I
11190 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  f the ORDER BY e
111a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 73 73  xpression is ass
111b0 69 67 6e 65 64 20 61 0a 23 20 63 6f 6c 6c 61 74  igned a.# collat
111c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 69  ion sequence usi
111d0 6e 67 20 74 68 65 20 70 6f 73 74 66 69 78 20 43  ng the postfix C
111e0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c  OLLATE operator,
111f0 20 74 68 65 6e 20 74 68 65 0a 23 20 73 70 65 63   then the.# spec
11200 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
11210 73 65 71 75 65 6e 63 65 20 69 73 20 75 73 65 64  sequence is used
11220 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
11230 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 39  est e_select-8.9
11240 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20  .1 {.  SELECT x 
11250 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59  FROM d4 ORDER BY
11260 20 31 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   1 COLLATE binar
11270 79 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62 63  y.} {DEF JKL abc
11280 20 67 68 69 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   ghi}.do_execsql
11290 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38  _test e_select-8
112a0 2e 39 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .9.2 {.  SELECT 
112b0 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  x COLLATE binary
112c0 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42   FROM d4 ORDER B
112d0 59 20 31 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  Y 1 COLLATE noca
112e0 73 65 0a 7d 20 7b 61 62 63 20 44 45 46 20 67 68  se.} {abc DEF gh
112f0 69 20 4a 4b 4c 7d 0a 0a 23 20 45 56 49 44 45 4e  i JKL}..# EVIDEN
11300 43 45 2d 4f 46 3a 20 52 2d 30 39 33 39 38 2d 32  CE-OF: R-09398-2
11310 36 31 30 32 20 4f 74 68 65 72 77 69 73 65 2c 20  6102 Otherwise, 
11320 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
11330 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 0a 23  expression is .#
11340 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 61 6e 20   an alias to an 
11350 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
11360 68 61 73 20 62 65 65 6e 20 61 73 73 69 67 6e 65  has been assigne
11370 64 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  d a collation se
11380 71 75 65 6e 63 65 20 0a 23 20 75 73 69 6e 67 20  quence .# using 
11390 74 68 65 20 70 6f 73 74 66 69 78 20 43 4f 4c 4c  the postfix COLL
113a0 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74 68  ATE operator, th
113b0 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  en the collation
113c0 20 73 65 71 75 65 6e 63 65 20 0a 23 20 61 73 73   sequence .# ass
113d0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 61 6c 69  igned to the ali
113e0 61 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  ased expression 
113f0 69 73 20 75 73 65 64 2e 0a 23 0a 23 20 20 20 49  is used..#.#   I
11400 6e 20 74 68 65 20 74 65 73 74 20 38 2e 31 30 2e  n the test 8.10.
11410 32 2c 20 74 68 65 20 6f 6e 6c 79 20 72 65 73 75  2, the only resu
11420 6c 74 2d 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  lt-column expres
11430 73 69 6f 6e 20 68 61 73 20 6e 6f 20 61 6c 69 61  sion has no alia
11440 73 2e 20 53 6f 20 74 68 65 0a 23 20 20 20 4f 52  s. So the.#   OR
11450 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
11460 6e 20 69 73 20 6e 6f 74 20 61 20 72 65 66 65 72  n is not a refer
11470 65 6e 63 65 20 74 6f 20 69 74 20 61 6e 64 20 74  ence to it and t
11480 68 65 72 65 66 6f 72 65 20 64 6f 65 73 20 6e 6f  herefore does no
11490 74 20 69 6e 68 65 72 69 74 0a 23 20 20 20 74 68  t inherit.#   th
114a0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
114b0 65 6e 63 65 2e 20 49 6e 20 74 65 73 74 20 38 2e  ence. In test 8.
114c0 31 30 2e 33 2c 20 22 78 22 20 69 73 20 74 68 65  10.3, "x" is the
114d0 20 61 6c 69 61 73 20 28 61 73 20 77 65 6c 6c 20   alias (as well 
114e0 61 73 20 74 68 65 0a 23 20 20 20 63 6f 6c 75 6d  as the.#   colum
114f0 6e 20 6e 61 6d 65 29 2c 20 73 6f 20 74 68 65 20  n name), so the 
11500 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
11510 69 6f 6e 20 69 73 20 69 6e 74 65 72 70 72 65 74  ion is interpret
11520 65 64 20 61 73 20 61 6e 20 61 6c 69 61 73 20 61  ed as an alias a
11530 6e 64 20 74 68 65 0a 23 20 20 20 63 6f 6c 6c 61  nd the.#   colla
11540 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 74  tion sequence at
11550 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 65  tached to the re
11560 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 75  sult column is u
11570 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  sed for sorting.
11580 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
11590 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 30  st e_select-8.10
115a0 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20  .1 {.  SELECT x 
115b0 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46  COLLATE binary F
115c0 52 4f 4d 20 64 34 20 4f 52 44 45 52 20 42 59 20  ROM d4 ORDER BY 
115d0 31 0a 7d 20 7b 44 45 46 20 4a 4b 4c 20 61 62 63  1.} {DEF JKL abc
115e0 20 67 68 69 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   ghi}.do_execsql
115f0 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38  _test e_select-8
11600 2e 31 30 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  .10.2 {.  SELECT
11610 20 78 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   x COLLATE binar
11620 79 20 46 52 4f 4d 20 64 34 20 4f 52 44 45 52 20  y FROM d4 ORDER 
11630 42 59 20 78 0a 7d 20 7b 61 62 63 20 44 45 46 20  BY x.} {abc DEF 
11640 67 68 69 20 4a 4b 4c 7d 0a 64 6f 5f 65 78 65 63  ghi JKL}.do_exec
11650 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63  sql_test e_selec
11660 74 2d 38 2e 31 30 2e 33 20 7b 0a 20 20 53 45 4c  t-8.10.3 {.  SEL
11670 45 43 54 20 78 20 43 4f 4c 4c 41 54 45 20 62 69  ECT x COLLATE bi
11680 6e 61 72 79 20 41 53 20 78 20 46 52 4f 4d 20 64  nary AS x FROM d
11690 34 20 4f 52 44 45 52 20 42 59 20 78 0a 7d 20 7b  4 ORDER BY x.} {
116a0 44 45 46 20 4a 4b 4c 20 61 62 63 20 67 68 69 7d  DEF JKL abc ghi}
116b0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
116c0 20 52 2d 32 37 33 30 31 2d 30 39 36 35 38 20 4f   R-27301-09658 O
116d0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
116e0 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
116f0 73 69 6f 6e 20 69 73 20 61 0a 23 20 63 6f 6c 75  sion is a.# colu
11700 6d 6e 20 6f 72 20 61 6e 20 61 6c 69 61 73 20 6f  mn or an alias o
11710 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
11720 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  that is a column
11730 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75  , then the defau
11740 6c 74 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lt.# collation s
11750 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11760 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 2e 0a  column is used..
11770 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
11780 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 31 2e  t e_select-8.11.
11790 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 41  1 {.  SELECT x A
117a0 53 20 79 20 46 52 4f 4d 20 64 34 20 4f 52 44 45  S y FROM d4 ORDE
117b0 52 20 42 59 20 79 0a 7d 20 7b 61 62 63 20 44 45  R BY y.} {abc DE
117c0 46 20 67 68 69 20 4a 4b 4c 7d 0a 64 6f 5f 65 78  F ghi JKL}.do_ex
117d0 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 73 65 6c  ecsql_test e_sel
117e0 65 63 74 2d 38 2e 31 31 2e 32 20 7b 0a 20 20 53  ect-8.11.2 {.  S
117f0 45 4c 45 43 54 20 78 7c 7c 27 27 20 46 52 4f 4d  ELECT x||'' FROM
11800 20 64 34 20 4f 52 44 45 52 20 42 59 20 78 0a 7d   d4 ORDER BY x.}
11810 20 7b 61 62 63 20 44 45 46 20 67 68 69 20 4a 4b   {abc DEF ghi JK
11820 4c 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  L}..# EVIDENCE-O
11830 46 3a 20 52 2d 34 39 39 32 35 2d 35 35 39 30 35  F: R-49925-55905
11840 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
11850 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e  BINARY collation
11860 20 73 65 71 75 65 6e 63 65 20 69 73 0a 23 20 75   sequence is.# u
11870 73 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  sed..#.do_execsq
11880 6c 5f 74 65 73 74 20 65 5f 73 65 6c 65 63 74 2d  l_test e_select-
11890 38 2e 31 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43  8.12.1 {.  SELEC
118a0 54 20 78 20 46 52 4f 4d 20 64 34 20 4f 52 44 45  T x FROM d4 ORDE
118b0 52 20 42 59 20 78 7c 7c 27 27 0a 7d 20 7b 44 45  R BY x||''.} {DE
118c0 46 20 4a 4b 4c 20 61 62 63 20 67 68 69 7d 0a 0a  F JKL abc ghi}..
118d0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
118e0 2d 34 34 31 33 30 2d 33 32 35 39 33 20 49 66 20  -44130-32593 If 
118f0 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  an ORDER BY expr
11900 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
11910 20 69 6e 74 65 67 65 72 0a 23 20 61 6c 69 61 73   integer.# alias
11920 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 73 65  , then SQLite se
11930 61 72 63 68 65 73 20 74 68 65 20 6c 65 66 74 2d  arches the left-
11940 6d 6f 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74  most SELECT in t
11950 68 65 20 63 6f 6d 70 6f 75 6e 64 20 66 6f 72 20  he compound for 
11960 61 0a 23 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  a.# result colum
11970 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 65  n that matches e
11980 69 74 68 65 72 20 74 68 65 20 73 65 63 6f 6e 64  ither the second
11990 20 6f 72 20 74 68 69 72 64 20 72 75 6c 65 73 20   or third rules 
119a0 61 62 6f 76 65 2e 20 49 66 0a 23 20 61 20 6d 61  above. If.# a ma
119b0 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tch is found, th
119c0 65 20 73 65 61 72 63 68 20 73 74 6f 70 73 20 61  e search stops a
119d0 6e 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  nd the expressio
119e0 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  n is handled as 
119f0 61 6e 0a 23 20 61 6c 69 61 73 20 66 6f 72 20 74  an.# alias for t
11a00 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
11a10 20 74 68 61 74 20 69 74 20 68 61 73 20 62 65 65   that it has bee
11a20 6e 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  n matched agains
11a30 74 2e 0a 23 20 4f 74 68 65 72 77 69 73 65 2c 20  t..# Otherwise, 
11a40 74 68 65 20 6e 65 78 74 20 53 45 4c 45 43 54 20  the next SELECT 
11a50 74 6f 20 74 68 65 20 72 69 67 68 74 20 69 73 20  to the right is 
11a60 74 72 69 65 64 2c 20 61 6e 64 20 73 6f 20 6f 6e  tried, and so on
11a70 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
11a80 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31  est e_select-8.1
11a90 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  3.0 {.  CREATE T
11aa0 41 42 4c 45 20 64 35 28 61 2c 20 62 29 3b 0a 20  ABLE d5(a, b);. 
11ab0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 36   CREATE TABLE d6
11ac0 28 63 2c 20 64 29 3b 0a 20 20 43 52 45 41 54 45  (c, d);.  CREATE
11ad0 20 54 41 42 4c 45 20 64 37 28 65 2c 20 66 29 3b   TABLE d7(e, f);
11ae0 0a 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  . .  INSERT INTO
11af0 20 64 35 20 56 41 4c 55 45 53 28 31 2c 20 27 66   d5 VALUES(1, 'f
11b00 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
11b10 4f 20 64 36 20 56 41 4c 55 45 53 28 32 2c 20 27  O d6 VALUES(2, '
11b20 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
11b30 54 4f 20 64 37 20 56 41 4c 55 45 53 28 33 2c 20  TO d7 VALUES(3, 
11b40 27 64 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'd');.  INSERT I
11b50 4e 54 4f 20 64 35 20 56 41 4c 55 45 53 28 34 2c  NTO d5 VALUES(4,
11b60 20 27 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'c');.  INSERT 
11b70 49 4e 54 4f 20 64 36 20 56 41 4c 55 45 53 28 35  INTO d6 VALUES(5
11b80 2c 20 27 62 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'b');.  INSERT
11b90 20 49 4e 54 4f 20 64 37 20 56 41 4c 55 45 53 28   INTO d7 VALUES(
11ba0 36 2c 20 27 61 27 29 3b 0a 0a 20 20 43 52 45 41  6, 'a');..  CREA
11bb0 54 45 20 54 41 42 4c 45 20 64 38 28 78 20 43 4f  TE TABLE d8(x CO
11bc0 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20  LLATE nocase);. 
11bd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 39   CREATE TABLE d9
11be0 28 79 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (y COLLATE nocas
11bf0 65 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  e);..  INSERT IN
11c00 54 4f 20 64 38 20 56 41 4c 55 45 53 28 27 61 27  TO d8 VALUES('a'
11c10 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
11c20 20 64 39 20 56 41 4c 55 45 53 28 27 42 27 29 3b   d9 VALUES('B');
11c30 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
11c40 38 20 56 41 4c 55 45 53 28 27 63 27 29 3b 0a 20  8 VALUES('c');. 
11c50 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 39 20   INSERT INTO d9 
11c60 56 41 4c 55 45 53 28 27 44 27 29 3b 0a 7d 20 7b  VALUES('D');.} {
11c70 7d 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74  }.do_select_test
11c80 73 20 65 5f 73 65 6c 65 63 74 2d 38 2e 31 33 20  s e_select-8.13 
11c90 7b 0a 20 20 31 20 20 20 7b 20 53 45 4c 45 43 54  {.  1   { SELECT
11ca0 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e   a FROM d5 UNION
11cb0 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 20 46 52   ALL SELECT c FR
11cc0 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d6 UNION ALL 
11cd0 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 64 37  SELECT e FROM d7
11ce0 0a 20 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  .         ORDER 
11cf0 42 59 20 61 0a 20 20 20 20 20 20 7d 20 7b 31 20  BY a.      } {1 
11d00 32 20 33 20 34 20 35 20 36 7d 0a 20 20 32 20 20  2 3 4 5 6}.  2  
11d10 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
11d20 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   d5 UNION ALL SE
11d30 4c 45 43 54 20 63 20 46 52 4f 4d 20 64 36 20 55  LECT c FROM d6 U
11d40 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
11d50 65 20 46 52 4f 4d 20 64 37 0a 20 20 20 20 20 20  e FROM d7.      
11d60 20 20 20 4f 52 44 45 52 20 42 59 20 63 0a 20 20     ORDER BY c.  
11d70 20 20 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35      } {1 2 3 4 5
11d80 20 36 7d 0a 20 20 33 20 20 20 7b 20 53 45 4c 45   6}.  3   { SELE
11d90 43 54 20 61 20 46 52 4f 4d 20 64 35 20 55 4e 49  CT a FROM d5 UNI
11da0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 20  ON ALL SELECT c 
11db0 46 52 4f 4d 20 64 36 20 55 4e 49 4f 4e 20 41 4c  FROM d6 UNION AL
11dc0 4c 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20  L SELECT e FROM 
11dd0 64 37 0a 20 20 20 20 20 20 20 20 20 4f 52 44 45  d7.         ORDE
11de0 52 20 42 59 20 65 0a 20 20 20 20 20 20 7d 20 7b  R BY e.      } {
11df0 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 34  1 2 3 4 5 6}.  4
11e00 20 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52     { SELECT a FR
11e10 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d5 UNION ALL 
11e20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64 36  SELECT c FROM d6
11e30 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
11e40 54 20 65 20 46 52 4f 4d 20 64 37 0a 20 20 20 20  T e FROM d7.    
11e50 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
11e60 20 20 20 20 20 20 7d 20 7b 31 20 32 20 33 20 34        } {1 2 3 4
11e70 20 35 20 36 7d 0a 0a 20 20 35 20 20 20 7b 20 53   5 6}..  5   { S
11e80 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
11e90 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
11ea0 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 64 35  ECT b, a FROM d5
11eb0 20 4f 52 44 45 52 20 42 59 20 62 20 7d 20 0a 20   ORDER BY b } . 
11ec0 20 20 20 20 20 7b 66 20 31 20 20 20 63 20 34 20       {f 1   c 4 
11ed0 20 20 34 20 63 20 20 20 31 20 66 7d 0a 20 20 36    4 c   1 f}.  6
11ee0 20 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62     { SELECT a, b
11ef0 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41   FROM d5 UNION A
11f00 4c 4c 20 53 45 4c 45 43 54 20 62 2c 20 61 20 46  LL SELECT b, a F
11f10 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20  ROM d5 ORDER BY 
11f20 32 20 7d 20 0a 20 20 20 20 20 20 7b 66 20 31 20  2 } .      {f 1 
11f30 20 20 63 20 34 20 20 20 34 20 63 20 20 20 31 20    c 4   4 c   1 
11f40 66 7d 0a 0a 20 20 37 20 20 20 7b 20 53 45 4c 45  f}..  7   { SELE
11f50 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64 35 20  CT a, b FROM d5 
11f60 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
11f70 20 62 2c 20 61 20 46 52 4f 4d 20 64 35 20 4f 52   b, a FROM d5 OR
11f80 44 45 52 20 42 59 20 61 20 7d 20 0a 20 20 20 20  DER BY a } .    
11f90 20 20 7b 31 20 66 20 20 20 34 20 63 20 20 20 63    {1 f   4 c   c
11fa0 20 34 20 20 20 66 20 31 7d 0a 20 20 38 20 20 20   4   f 1}.  8   
11fb0 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  { SELECT a, b FR
11fc0 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM d5 UNION ALL 
11fd0 53 45 4c 45 43 54 20 62 2c 20 61 20 46 52 4f 4d  SELECT b, a FROM
11fe0 20 64 35 20 4f 52 44 45 52 20 42 59 20 31 20 7d   d5 ORDER BY 1 }
11ff0 20 0a 20 20 20 20 20 20 7b 31 20 66 20 20 20 34   .      {1 f   4
12000 20 63 20 20 20 63 20 34 20 20 20 66 20 31 7d 0a   c   c 4   f 1}.
12010 0a 20 20 39 20 20 20 7b 20 53 45 4c 45 43 54 20  .  9   { SELECT 
12020 61 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e 49  a, b FROM d5 UNI
12030 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 2c  ON ALL SELECT b,
12040 20 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f 52 44   a+1 FROM d5 ORD
12050 45 52 20 42 59 20 61 2b 31 20 7d 20 0a 20 20 20  ER BY a+1 } .   
12060 20 20 20 7b 66 20 32 20 20 20 63 20 35 20 20 20     {f 2   c 5   
12070 34 20 63 20 20 20 31 20 66 7d 0a 20 20 31 30 20  4 c   1 f}.  10 
12080 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46   { SELECT a, b F
12090 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41 4c 4c  ROM d5 UNION ALL
120a0 20 53 45 4c 45 43 54 20 62 2c 20 61 2b 31 20 46   SELECT b, a+1 F
120b0 52 4f 4d 20 64 35 20 4f 52 44 45 52 20 42 59 20  ROM d5 ORDER BY 
120c0 32 20 7d 20 0a 20 20 20 20 20 20 7b 66 20 32 20  2 } .      {f 2 
120d0 20 20 63 20 35 20 20 20 34 20 63 20 20 20 31 20    c 5   4 c   1 
120e0 66 7d 0a 0a 20 20 31 31 20 20 7b 20 53 45 4c 45  f}..  11  { SELE
120f0 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20 64  CT a+1, b FROM d
12100 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
12110 43 54 20 62 2c 20 61 2b 31 20 46 52 4f 4d 20 64  CT b, a+1 FROM d
12120 35 20 4f 52 44 45 52 20 42 59 20 61 2b 31 20 7d  5 ORDER BY a+1 }
12130 20 0a 20 20 20 20 20 20 7b 32 20 66 20 20 20 35   .      {2 f   5
12140 20 63 20 20 20 63 20 35 20 20 20 66 20 32 7d 0a   c   c 5   f 2}.
12150 20 20 31 32 20 20 7b 20 53 45 4c 45 43 54 20 61    12  { SELECT a
12160 2b 31 2c 20 62 20 46 52 4f 4d 20 64 35 20 55 4e  +1, b FROM d5 UN
12170 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62  ION ALL SELECT b
12180 2c 20 61 2b 31 20 46 52 4f 4d 20 64 35 20 4f 52  , a+1 FROM d5 OR
12190 44 45 52 20 42 59 20 31 20 7d 20 0a 20 20 20 20  DER BY 1 } .    
121a0 20 20 7b 32 20 66 20 20 20 35 20 63 20 20 20 63    {2 f   5 c   c
121b0 20 35 20 20 20 66 20 32 7d 0a 7d 20 0a 0a 23 20   5   f 2}.} ..# 
121c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
121d0 39 32 36 35 2d 30 34 30 37 30 20 49 66 20 6e 6f  9265-04070 If no
121e0 20 6d 61 74 63 68 69 6e 67 20 65 78 70 72 65 73   matching expres
121f0 73 69 6f 6e 20 63 61 6e 20 62 65 20 66 6f 75 6e  sion can be foun
12200 64 20 69 6e 0a 23 20 74 68 65 20 72 65 73 75 6c  d in.# the resul
12210 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 79  t columns of any
12220 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 53 45 4c   constituent SEL
12230 45 43 54 2c 20 69 74 20 69 73 20 61 6e 20 65 72  ECT, it is an er
12240 72 6f 72 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74  ror..#.do_select
12250 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d  _tests e_select-
12260 38 2e 31 34 20 2d 65 72 72 6f 72 20 7b 0a 20 20  8.14 -error {.  
12270 25 73 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  %s ORDER BY term
12280 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
12290 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  any column in th
122a0 65 20 72 65 73 75 6c 74 20 73 65 74 0a 7d 20 7b  e result set.} {
122b0 0a 20 20 31 20 20 20 7b 20 53 45 4c 45 43 54 20  .  1   { SELECT 
122c0 61 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20  a FROM d5 UNION 
122d0 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 64 36  SELECT c FROM d6
122e0 20 4f 52 44 45 52 20 42 59 20 61 2b 31 20 7d 20   ORDER BY a+1 } 
122f0 20 20 20 20 20 20 20 20 20 31 73 74 0a 20 20 32           1st.  2
12300 20 20 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52     { SELECT a FR
12310 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 53 45 4c 45  OM d5 UNION SELE
12320 43 54 20 63 20 46 52 4f 4d 20 64 36 20 4f 52 44  CT c FROM d6 ORD
12330 45 52 20 42 59 20 61 2c 20 61 2b 31 20 7d 20 20  ER BY a, a+1 }  
12340 20 20 20 20 20 32 6e 64 0a 20 20 33 20 20 20 7b       2nd.  3   {
12350 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
12360 35 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c 45  5 INTERSECT SELE
12370 43 54 20 2a 20 46 52 4f 4d 20 64 36 20 4f 52 44  CT * FROM d6 ORD
12380 45 52 20 42 59 20 27 68 65 6c 6c 6f 27 20 7d 20  ER BY 'hello' } 
12390 20 31 73 74 0a 20 20 34 20 20 20 7b 20 53 45 4c   1st.  4   { SEL
123a0 45 43 54 20 2a 20 46 52 4f 4d 20 64 35 20 49 4e  ECT * FROM d5 IN
123b0 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 2a  TERSECT SELECT *
123c0 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20 42   FROM d6 ORDER B
123d0 59 20 62 6c 61 68 20 20 20 20 7d 20 20 31 73 74  Y blah    }  1st
123e0 0a 20 20 35 20 20 20 7b 20 53 45 4c 45 43 54 20  .  5   { SELECT 
123f0 2a 20 46 52 4f 4d 20 64 35 20 49 4e 54 45 52 53  * FROM d5 INTERS
12400 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ECT SELECT * FRO
12410 4d 20 64 36 20 4f 52 44 45 52 20 42 59 20 63 2c  M d6 ORDER BY c,
12420 64 2c 63 2b 64 20 7d 20 20 33 72 64 0a 20 20 36  d,c+d }  3rd.  6
12430 20 20 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52     { SELECT * FR
12440 4f 4d 20 64 35 20 45 58 43 45 50 54 20 53 45 4c  OM d5 EXCEPT SEL
12450 45 43 54 20 2a 20 46 52 4f 4d 20 64 37 20 4f 52  ECT * FROM d7 OR
12460 44 45 52 20 42 59 20 31 2c 32 2c 62 2c 61 2f 62  DER BY 1,2,b,a/b
12470 20 20 7d 20 20 34 74 68 0a 7d 20 0a 0a 23 20 45    }  4th.} ..# E
12480 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
12490 34 30 37 2d 31 31 34 38 33 20 45 61 63 68 20 74  407-11483 Each t
124a0 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
124b0 20 42 59 20 63 6c 61 75 73 65 20 69 73 0a 23 20   BY clause is.# 
124c0 70 72 6f 63 65 73 73 65 64 20 73 65 70 61 72 61  processed separa
124d0 74 65 6c 79 20 61 6e 64 20 6d 61 79 20 62 65 20  tely and may be 
124e0 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
124f0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 66  result columns f
12500 72 6f 6d 0a 23 20 64 69 66 66 65 72 65 6e 74 20  rom.# different 
12510 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12520 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
12530 64 2e 0a 23 20 0a 64 6f 5f 73 65 6c 65 63 74 5f  d..# .do_select_
12540 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 38  tests e_select-8
12550 2e 31 35 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c  .15 {.  1  { SEL
12560 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 64 35  ECT a, b FROM d5
12570 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
12580 54 20 63 2d 31 2c 20 64 20 46 52 4f 4d 20 64 36  T c-1, d FROM d6
12590 20 4f 52 44 45 52 20 42 59 20 61 2c 20 64 20 7d   ORDER BY a, d }
125a0 0a 20 20 20 20 20 7b 31 20 65 20 20 20 31 20 66  .     {1 e   1 f
125b0 20 20 20 34 20 62 20 20 20 34 20 63 7d 0a 20 20     4 b   4 c}.  
125c0 32 20 20 7b 20 53 45 4c 45 43 54 20 61 2c 20 62  2  { SELECT a, b
125d0 20 46 52 4f 4d 20 64 35 20 55 4e 49 4f 4e 20 41   FROM d5 UNION A
125e0 4c 4c 20 53 45 4c 45 43 54 20 63 2d 31 2c 20 64  LL SELECT c-1, d
125f0 20 46 52 4f 4d 20 64 36 20 4f 52 44 45 52 20 42   FROM d6 ORDER B
12600 59 20 63 2d 31 2c 20 62 20 7d 0a 20 20 20 20 20  Y c-1, b }.     
12610 7b 31 20 65 20 20 20 31 20 66 20 20 20 34 20 62  {1 e   1 f   4 b
12620 20 20 20 34 20 63 7d 0a 20 20 33 20 20 7b 20 53     4 c}.  3  { S
12630 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
12640 64 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  d5 UNION ALL SEL
12650 45 43 54 20 63 2d 31 2c 20 64 20 46 52 4f 4d 20  ECT c-1, d FROM 
12660 64 36 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32  d6 ORDER BY 1, 2
12670 20 7d 0a 20 20 20 20 20 7b 31 20 65 20 20 20 31   }.     {1 e   1
12680 20 66 20 20 20 34 20 62 20 20 20 34 20 63 7d 0a   f   4 b   4 c}.
12690 7d 20 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  } ...#----------
126a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
126e0 23 20 54 65 73 74 73 20 72 65 6c 61 74 65 64 20  # Tests related 
126f0 74 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61  to statements ma
12700 64 65 20 61 62 6f 75 74 20 74 68 65 20 4c 49 4d  de about the LIM
12710 49 54 2f 4f 46 46 53 45 54 20 63 6c 61 75 73 65  IT/OFFSET clause
12720 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
12730 65 73 74 20 65 5f 73 65 6c 65 63 74 2d 39 2e 30  est e_select-9.0
12740 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
12750 45 20 66 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E f1(a, b);.  IN
12760 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12770 55 45 53 28 32 36 2c 20 27 7a 27 29 3b 0a 20 20  UES(26, 'z');.  
12780 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
12790 41 4c 55 45 53 28 32 35 2c 20 27 79 27 29 3b 0a  ALUES(25, 'y');.
127a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
127b0 20 56 41 4c 55 45 53 28 32 34 2c 20 27 78 27 29   VALUES(24, 'x')
127c0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
127d0 66 31 20 56 41 4c 55 45 53 28 32 33 2c 20 27 77  f1 VALUES(23, 'w
127e0 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
127f0 4f 20 66 31 20 56 41 4c 55 45 53 28 32 32 2c 20  O f1 VALUES(22, 
12800 27 76 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'v');.  INSERT I
12810 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 31  NTO f1 VALUES(21
12820 2c 20 27 75 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'u');.  INSERT
12830 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
12840 32 30 2c 20 27 74 27 29 3b 0a 20 20 49 4e 53 45  20, 't');.  INSE
12850 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
12860 53 28 31 39 2c 20 27 73 27 29 3b 0a 20 20 49 4e  S(19, 's');.  IN
12870 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12880 55 45 53 28 31 38 2c 20 27 72 27 29 3b 0a 20 20  UES(18, 'r');.  
12890 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
128a0 41 4c 55 45 53 28 31 37 2c 20 27 71 27 29 3b 0a  ALUES(17, 'q');.
128b0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
128c0 20 56 41 4c 55 45 53 28 31 36 2c 20 27 70 27 29   VALUES(16, 'p')
128d0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
128e0 66 31 20 56 41 4c 55 45 53 28 31 35 2c 20 27 6f  f1 VALUES(15, 'o
128f0 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12900 4f 20 66 31 20 56 41 4c 55 45 53 28 31 34 2c 20  O f1 VALUES(14, 
12910 27 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'n');.  INSERT I
12920 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 33  NTO f1 VALUES(13
12930 2c 20 27 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'm');.  INSERT
12940 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28   INTO f1 VALUES(
12950 31 32 2c 20 27 6c 27 29 3b 0a 20 20 49 4e 53 45  12, 'l');.  INSE
12960 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c 55 45  RT INTO f1 VALUE
12970 53 28 31 31 2c 20 27 6b 27 29 3b 0a 20 20 49 4e  S(11, 'k');.  IN
12980 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56 41 4c  SERT INTO f1 VAL
12990 55 45 53 28 31 30 2c 20 27 6a 27 29 3b 0a 20 20  UES(10, 'j');.  
129a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20 56  INSERT INTO f1 V
129b0 41 4c 55 45 53 28 39 2c 20 27 69 27 29 3b 0a 20  ALUES(9, 'i');. 
129c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31 20   INSERT INTO f1 
129d0 56 41 4c 55 45 53 28 38 2c 20 27 68 27 29 3b 0a  VALUES(8, 'h');.
129e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 31    INSERT INTO f1
129f0 20 56 41 4c 55 45 53 28 37 2c 20 27 67 27 29 3b   VALUES(7, 'g');
12a00 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66  .  INSERT INTO f
12a10 31 20 56 41 4c 55 45 53 28 36 2c 20 27 66 27 29  1 VALUES(6, 'f')
12a20 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
12a30 66 31 20 56 41 4c 55 45 53 28 35 2c 20 27 65 27  f1 VALUES(5, 'e'
12a40 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12a50 20 66 31 20 56 41 4c 55 45 53 28 34 2c 20 27 64   f1 VALUES(4, 'd
12a60 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
12a70 4f 20 66 31 20 56 41 4c 55 45 53 28 33 2c 20 27  O f1 VALUES(3, '
12a80 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  c');.  INSERT IN
12a90 54 4f 20 66 31 20 56 41 4c 55 45 53 28 32 2c 20  TO f1 VALUES(2, 
12aa0 27 62 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  'b');.  INSERT I
12ab0 4e 54 4f 20 66 31 20 56 41 4c 55 45 53 28 31 2c  NTO f1 VALUES(1,
12ac0 20 27 61 27 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45   'a');.} {}..# E
12ad0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
12ae0 34 38 31 2d 35 36 36 32 37 20 41 6e 79 20 73 63  481-56627 Any sc
12af0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
12b00 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20 74  may be used in t
12b10 68 65 0a 23 20 4c 49 4d 49 54 20 63 6c 61 75 73  he.# LIMIT claus
12b20 65 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20 69 74  e, so long as it
12b30 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 6e   evaluates to an
12b40 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 76 61   integer or a va
12b50 6c 75 65 20 74 68 61 74 0a 23 20 63 61 6e 20 62  lue that.# can b
12b60 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e  e losslessly con
12b70 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74  verted to an int
12b80 65 67 65 72 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63  eger..#.do_selec
12b90 74 5f 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74  t_tests e_select
12ba0 2d 39 2e 31 20 7b 0a 20 20 31 20 20 7b 20 53 45  -9.1 {.  1  { SE
12bb0 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
12bc0 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
12bd0 35 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a  5 } {a b c d e}.
12be0 20 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20    2  { SELECT b 
12bf0 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59  FROM f1 ORDER BY
12c00 20 61 20 4c 49 4d 49 54 20 32 2b 33 20 7d 20 7b   a LIMIT 2+3 } {
12c10 61 20 62 20 63 20 64 20 65 7d 0a 20 20 33 20 20  a b c d e}.  3  
12c20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
12c30 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  f1 ORDER BY a LI
12c40 4d 49 54 20 28 53 45 4c 45 43 54 20 61 20 46 52  MIT (SELECT a FR
12c50 4f 4d 20 66 31 20 57 48 45 52 45 20 62 20 3d 20  OM f1 WHERE b = 
12c60 27 65 27 29 20 7d 20 0a 20 20 20 20 20 7b 61 20  'e') } .     {a 
12c70 62 20 63 20 64 20 65 7d 0a 20 20 34 20 20 7b 20  b c d e}.  4  { 
12c80 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
12c90 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
12ca0 54 20 35 2e 30 20 7d 20 7b 61 20 62 20 63 20 64  T 5.0 } {a b c d
12cb0 20 65 7d 0a 20 20 35 20 20 7b 20 53 45 4c 45 43   e}.  5  { SELEC
12cc0 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
12cd0 52 20 42 59 20 61 20 4c 49 4d 49 54 20 27 35 27  R BY a LIMIT '5'
12ce0 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 7d   } {a b c d e}.}
12cf0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
12d00 20 52 2d 34 36 31 35 35 2d 34 37 32 31 39 20 49   R-46155-47219 I
12d10 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
12d20 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20   evaluates to a 
12d30 4e 55 4c 4c 20 76 61 6c 75 65 0a 23 20 6f 72 20  NULL value.# or 
12d40 61 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20  any other value 
12d50 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 6c  that cannot be l
12d60 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
12d70 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ted to an intege
12d80 72 2c 0a 23 20 61 6e 20 65 72 72 6f 72 20 69 73  r,.# an error is
12d90 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 0a 64 6f   returned..#..do
12da0 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 65 5f  _select_tests e_
12db0 73 65 6c 65 63 74 2d 39 2e 32 20 2d 65 72 72 6f  select-9.2 -erro
12dc0 72 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  r "datatype mism
12dd0 61 74 63 68 22 20 7b 0a 20 20 31 20 20 7b 20 53  atch" {.  1  { S
12de0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
12df0 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
12e00 20 27 68 65 6c 6c 6f 27 20 7d 20 7b 7d 0a 20 20   'hello' } {}.  
12e10 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  2  { SELECT b FR
12e20 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
12e30 20 4c 49 4d 49 54 20 4e 55 4c 4c 20 7d 20 7b 7d   LIMIT NULL } {}
12e40 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62  .  3  { SELECT b
12e50 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
12e60 59 20 61 20 4c 49 4d 49 54 20 58 27 41 42 43 44  Y a LIMIT X'ABCD
12e70 27 20 7d 20 7b 7d 0a 20 20 34 20 20 7b 20 53 45  ' } {}.  4  { SE
12e80 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
12e90 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
12ea0 35 2e 31 20 7d 20 7b 7d 0a 20 20 35 20 20 7b 20  5.1 } {}.  5  { 
12eb0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
12ec0 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
12ed0 54 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70 5f  T (SELECT group_
12ee0 63 6f 6e 63 61 74 28 62 29 20 46 52 4f 4d 20 66  concat(b) FROM f
12ef0 31 29 20 7d 20 7b 7d 0a 7d 20 0a 0a 23 20 45 56  1) } {}.} ..# EV
12f00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 30  IDENCE-OF: R-030
12f10 31 34 2d 32 36 34 31 34 20 49 66 20 74 68 65 20  14-26414 If the 
12f20 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69 6f 6e  LIMIT expression
12f30 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 0a   evaluates to a.
12f40 23 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  # negative value
12f50 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
12f60 6e 6f 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  no upper bound o
12f70 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12f80 72 6f 77 73 0a 23 20 72 65 74 75 72 6e 65 64 2e  rows.# returned.
12f90 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73  .#.do_select_tes
12fa0 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 34 20  ts e_select-9.4 
12fb0 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20  {.  1  { SELECT 
12fc0 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20  b FROM f1 ORDER 
12fd0 42 59 20 61 20 4c 49 4d 49 54 20 2d 31 20 7d 20  BY a LIMIT -1 } 
12fe0 0a 20 20 20 20 20 7b 61 20 62 20 63 20 64 20 65  .     {a b c d e
12ff0 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d   f g h i j k l m
13000 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74 20 75   n o p q r s t u
13010 20 76 20 77 20 78 20 79 20 7a 7d 0a 20 20 32 20   v w x y z}.  2 
13020 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
13030 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
13040 49 4d 49 54 20 6c 65 6e 67 74 68 28 27 61 62 63  IMIT length('abc
13050 27 29 2d 31 30 30 20 7d 20 0a 20 20 20 20 20 7b  ')-100 } .     {
13060 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20  a b c d e f g h 
13070 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70 20  i j k l m n o p 
13080 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78 20  q r s t u v w x 
13090 79 20 7a 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45  y z}.  3  { SELE
130a0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
130b0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 28 53  ER BY a LIMIT (S
130c0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
130d0 52 4f 4d 20 66 31 29 2f 32 20 2d 20 31 34 20 7d  ROM f1)/2 - 14 }
130e0 0a 20 20 20 20 20 7b 61 20 62 20 63 20 64 20 65  .     {a b c d e
130f0 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d   f g h i j k l m
13100 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74 20 75   n o p q r s t u
13110 20 76 20 77 20 78 20 79 20 7a 7d 0a 7d 0a 0a 23   v w x y z}.}..#
13120 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13130 33 33 37 35 30 2d 32 39 35 33 36 20 4f 74 68 65  33750-29536 Othe
13140 72 77 69 73 65 2c 20 74 68 65 20 53 45 4c 45 43  rwise, the SELEC
13150 54 20 72 65 74 75 72 6e 73 20 74 68 65 20 66 69  T returns the fi
13160 72 73 74 20 4e 0a 23 20 72 6f 77 73 20 6f 66 20  rst N.# rows of 
13170 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 20 6f  its result set o
13180 6e 6c 79 2c 20 77 68 65 72 65 20 4e 20 69 73 20  nly, where N is 
13190 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 74  the value that t
131a0 68 65 20 4c 49 4d 49 54 0a 23 20 65 78 70 72 65  he LIMIT.# expre
131b0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
131c0 74 6f 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  to..#.do_select_
131d0 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39  tests e_select-9
131e0 2e 35 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45  .5 {.  1  { SELE
131f0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13200 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 30 20  ER BY a LIMIT 0 
13210 7d 20 7b 7d 0a 20 20 32 20 20 7b 20 53 45 4c 45  } {}.  2  { SELE
13220 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13230 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49 4d  ER BY a DESC LIM
13240 49 54 20 34 20 7d 20 7b 7a 20 79 20 78 20 77 7d  IT 4 } {z y x w}
13250 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62  .  3  { SELECT b
13260 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13270 59 20 61 20 44 45 53 43 20 4c 49 4d 49 54 20 38  Y a DESC LIMIT 8
13280 20 7d 20 7b 7a 20 79 20 78 20 77 20 76 20 75 20   } {z y x w v u 
13290 74 20 73 7d 0a 20 20 34 20 20 7b 20 53 45 4c 45  t s}.  4  { SELE
132a0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
132b0 45 52 20 42 59 20 61 20 44 45 53 43 20 4c 49 4d  ER BY a DESC LIM
132c0 49 54 20 27 31 32 2e 30 27 20 7d 20 7b 7a 20 79  IT '12.0' } {z y
132d0 20 78 20 77 20 76 20 75 20 74 20 73 20 72 20 71   x w v u t s r q
132e0 20 70 20 6f 7d 0a 7d 0a 0a 23 20 45 56 49 44 45   p o}.}..# EVIDE
132f0 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 39 33 35 2d  NCE-OF: R-54935-
13300 31 39 30 35 37 20 4f 72 2c 20 69 66 20 74 68 65  19057 Or, if the
13310 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13320 74 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 0a 23  t would return.#
13330 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 72 6f 77   less than N row
13340 73 20 77 69 74 68 6f 75 74 20 61 20 4c 49 4d 49  s without a LIMI
13350 54 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  T clause, then t
13360 68 65 20 65 6e 74 69 72 65 20 72 65 73 75 6c 74  he entire result
13370 20 73 65 74 20 69 73 0a 23 20 72 65 74 75 72 6e   set is.# return
13380 65 64 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f  ed..#.do_select_
13390 74 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39  tests e_select-9
133a0 2e 36 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45  .6 {.  1  { SELE
133b0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 57 48 45  CT b FROM f1 WHE
133c0 52 45 20 61 3e 32 31 20 4f 52 44 45 52 20 42 59  RE a>21 ORDER BY
133d0 20 61 20 4c 49 4d 49 54 20 31 30 20 7d 20 7b 76   a LIMIT 10 } {v
133e0 20 77 20 78 20 79 20 7a 7d 0a 20 20 32 20 20 7b   w x y z}.  2  {
133f0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
13400 20 46 52 4f 4d 20 66 31 20 47 52 4f 55 50 20 42   FROM f1 GROUP B
13410 59 20 61 2f 35 20 4f 52 44 45 52 20 42 59 20 31  Y a/5 ORDER BY 1
13420 20 4c 49 4d 49 54 20 31 30 20 7d 20 7b 32 20 34   LIMIT 10 } {2 4
13430 20 35 20 35 20 35 20 35 7d 0a 7d 20 0a 0a 0a 23   5 5 5 5}.} ...#
13440 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13450 32 34 31 38 38 2d 32 34 33 34 39 20 54 68 65 20  24188-24349 The 
13460 65 78 70 72 65 73 73 69 6f 6e 20 61 74 74 61 63  expression attac
13470 68 65 64 20 74 6f 20 74 68 65 20 6f 70 74 69 6f  hed to the optio
13480 6e 61 6c 0a 23 20 4f 46 46 53 45 54 20 63 6c 61  nal.# OFFSET cla
13490 75 73 65 20 74 68 61 74 20 6d 61 79 20 66 6f 6c  use that may fol
134a0 6c 6f 77 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  low a LIMIT clau
134b0 73 65 20 6d 75 73 74 20 61 6c 73 6f 20 65 76 61  se must also eva
134c0 6c 75 61 74 65 20 74 6f 20 61 6e 0a 23 20 69 6e  luate to an.# in
134d0 74 65 67 65 72 2c 20 6f 72 20 61 20 76 61 6c 75  teger, or a valu
134e0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 6c 6f  e that can be lo
134f0 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
13500 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
13510 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ..#.foreach {tn 
13520 73 65 6c 65 63 74 7d 20 7b 0a 20 20 31 20 20 7b  select} {.  1  {
13530 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
13540 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
13550 49 54 20 32 20 4f 46 46 53 45 54 20 27 68 65 6c  IT 2 OFFSET 'hel
13560 6c 6f 27 20 7d 20 0a 20 20 32 20 20 7b 20 53 45  lo' } .  2  { SE
13570 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
13580 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
13590 32 20 4f 46 46 53 45 54 20 4e 55 4c 4c 20 7d 20  2 OFFSET NULL } 
135a0 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54 20 62  .  3  { SELECT b
135b0 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
135c0 59 20 61 20 4c 49 4d 49 54 20 32 20 4f 46 46 53  Y a LIMIT 2 OFFS
135d0 45 54 20 58 27 41 42 43 44 27 20 7d 20 0a 20 20  ET X'ABCD' } .  
135e0 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52  4  { SELECT b FR
135f0 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61  OM f1 ORDER BY a
13600 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54 20   LIMIT 2 OFFSET 
13610 35 2e 31 20 7d 20 0a 20 20 35 20 20 7b 20 53 45  5.1 } .  5  { SE
13620 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
13630 52 44 45 52 20 42 59 20 61 20 0a 20 20 20 20 20  RDER BY a .     
13640 20 20 4c 49 4d 49 54 20 32 20 4f 46 46 53 45 54    LIMIT 2 OFFSET
13650 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   (SELECT group_c
13660 6f 6e 63 61 74 28 62 29 20 46 52 4f 4d 20 66 31  oncat(b) FROM f1
13670 29 20 0a 20 20 7d 20 0a 7d 20 7b 0a 20 20 64 6f  ) .  } .} {.  do
13680 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
13690 5f 73 65 6c 65 63 74 2d 39 2e 37 2e 24 74 6e 20  _select-9.7.$tn 
136a0 24 73 65 6c 65 63 74 20 7b 31 20 7b 64 61 74 61  $select {1 {data
136b0 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a  type mismatch}}.
136c0 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
136d0 3a 20 52 2d 32 30 34 36 37 2d 34 33 34 32 32 20  : R-20467-43422 
136e0 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
136f0 20 68 61 73 20 61 6e 20 4f 46 46 53 45 54 20 63   has an OFFSET c
13700 6c 61 75 73 65 2c 20 74 68 65 6e 0a 23 20 74 68  lause, then.# th
13710 65 20 66 69 72 73 74 20 4d 20 72 6f 77 73 20 61  e first M rows a
13720 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  re omitted from 
13730 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72  the result set r
13740 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 23  eturned by the.#
13750 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13760 74 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 4e  t and the next N
13770 20 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e   rows are return
13780 65 64 2c 20 77 68 65 72 65 20 4d 20 61 6e 64 20  ed, where M and 
13790 4e 20 61 72 65 0a 23 20 74 68 65 20 76 61 6c 75  N are.# the valu
137a0 65 73 20 74 68 61 74 20 74 68 65 20 4f 46 46 53  es that the OFFS
137b0 45 54 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ET and LIMIT cla
137c0 75 73 65 73 20 65 76 61 6c 75 61 74 65 20 74 6f  uses evaluate to
137d0 2c 0a 23 20 72 65 73 70 65 63 74 69 76 65 6c 79  ,.# respectively
137e0 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
137f0 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 38  sts e_select-9.8
13800 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54   {.  1  { SELECT
13810 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
13820 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 20 4f   BY a LIMIT 10 O
13830 46 46 53 45 54 20 35 7d 20 7b 66 20 67 20 68 20  FFSET 5} {f g h 
13840 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 7d 0a 20  i j k l m n o}. 
13850 20 32 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46   2  { SELECT b F
13860 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20  ROM f1 ORDER BY 
13870 61 20 4c 49 4d 49 54 20 32 2b 33 20 4f 46 46 53  a LIMIT 2+3 OFFS
13880 45 54 20 31 30 7d 20 7b 6b 20 6c 20 6d 20 6e 20  ET 10} {k l m n 
13890 6f 7d 0a 20 20 33 20 20 7b 20 53 45 4c 45 43 54  o}.  3  { SELECT
138a0 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
138b0 20 42 59 20 61 20 0a 20 20 20 20 20 20 20 4c 49   BY a .       LI
138c0 4d 49 54 20 20 28 53 45 4c 45 43 54 20 61 20 46  MIT  (SELECT a F
138d0 52 4f 4d 20 66 31 20 57 48 45 52 45 20 62 3d 27  ROM f1 WHERE b='
138e0 6a 27 29 20 0a 20 20 20 20 20 20 20 4f 46 46 53  j') .       OFFS
138f0 45 54 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  ET (SELECT a FRO
13900 4d 20 66 31 20 57 48 45 52 45 20 62 3d 27 62 27  M f1 WHERE b='b'
13910 29 20 0a 20 20 20 20 20 7d 20 7b 63 20 64 20 65  ) .     } {c d e
13920 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 7d 0a   f g h i j k l}.
13930 20 20 34 20 20 7b 20 53 45 4c 45 43 54 20 62 20    4  { SELECT b 
13940 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42 59  FROM f1 ORDER BY
13950 20 61 20 4c 49 4d 49 54 20 27 35 27 20 4f 46 46   a LIMIT '5' OFF
13960 53 45 54 20 33 2e 30 20 7d 20 7b 64 20 65 20 66  SET 3.0 } {d e f
13970 20 67 20 68 7d 0a 20 20 35 20 20 7b 20 53 45 4c   g h}.  5  { SEL
13980 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52  ECT b FROM f1 OR
13990 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 27  DER BY a LIMIT '
139a0 35 27 20 4f 46 46 53 45 54 20 30 20 7d 20 7b 61  5' OFFSET 0 } {a
139b0 20 62 20 63 20 64 20 65 7d 0a 20 20 36 20 20 7b   b c d e}.  6  {
139c0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66   SELECT b FROM f
139d0 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
139e0 49 54 20 30 20 4f 46 46 53 45 54 20 31 30 20 7d  IT 0 OFFSET 10 }
139f0 20 7b 7d 0a 20 20 37 20 20 7b 20 53 45 4c 45 43   {}.  7  { SELEC
13a00 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45  T b FROM f1 ORDE
13a10 52 20 42 59 20 61 20 4c 49 4d 49 54 20 33 20 4f  R BY a LIMIT 3 O
13a20 46 46 53 45 54 20 27 31 27 7c 7c 27 35 27 20 7d  FFSET '1'||'5' }
13a30 20 7b 70 20 71 20 72 7d 0a 7d 0a 0a 23 20 45 56   {p q r}.}..# EV
13a40 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 36  IDENCE-OF: R-346
13a50 34 38 2d 34 34 38 37 35 20 4f 72 2c 20 69 66 20  48-44875 Or, if 
13a60 74 68 65 20 53 45 4c 45 43 54 20 77 6f 75 6c 64  the SELECT would
13a70 20 72 65 74 75 72 6e 20 6c 65 73 73 20 74 68 61   return less tha
13a80 6e 0a 23 20 4d 2b 4e 20 72 6f 77 73 20 69 66 20  n.# M+N rows if 
13a90 69 74 20 64 69 64 20 6e 6f 74 20 68 61 76 65 20  it did not have 
13aa0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
13ab0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4d  then the first M
13ac0 20 72 6f 77 73 20 61 72 65 0a 23 20 73 6b 69 70   rows are.# skip
13ad0 70 65 64 20 61 6e 64 20 74 68 65 20 72 65 6d 61  ped and the rema
13ae0 69 6e 69 6e 67 20 72 6f 77 73 20 28 69 66 20 61  ining rows (if a
13af0 6e 79 29 20 61 72 65 20 72 65 74 75 72 6e 65 64  ny) are returned
13b00 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65  ..#.do_select_te
13b10 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e 39  sts e_select-9.9
13b20 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54   {.  1  { SELECT
13b30 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
13b40 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 20 4f   BY a LIMIT 10 O
13b50 46 46 53 45 54 20 32 30 7d 20 7b 75 20 76 20 77  FFSET 20} {u v w
13b60 20 78 20 79 20 7a 7d 0a 20 20 32 20 20 7b 20 53   x y z}.  2  { S
13b70 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20  ELECT a FROM f1 
13b80 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 20  ORDER BY a DESC 
13b90 4c 49 4d 49 54 20 31 30 30 20 4f 46 46 53 45 54  LIMIT 100 OFFSET
13ba0 20 31 38 2b 34 7d 20 7b 34 20 33 20 32 20 31 7d   18+4} {4 3 2 1}
13bb0 0a 7d 0a 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .}...# EVIDENCE-
13bc0 4f 46 3a 20 52 2d 32 33 32 39 33 2d 36 32 34 34  OF: R-23293-6244
13bd0 37 20 49 66 20 74 68 65 20 4f 46 46 53 45 54 20  7 If the OFFSET 
13be0 63 6c 61 75 73 65 20 65 76 61 6c 75 61 74 65 73  clause evaluates
13bf0 20 74 6f 20 61 0a 23 20 6e 65 67 61 74 69 76 65   to a.# negative
13c00 20 76 61 6c 75 65 2c 20 74 68 65 20 72 65 73 75   value, the resu
13c10 6c 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  lts are the same
13c20 20 61 73 20 69 66 20 69 74 20 68 61 64 20 65 76   as if it had ev
13c30 61 6c 75 61 74 65 64 20 74 6f 0a 23 20 7a 65 72  aluated to.# zer
13c40 6f 2e 0a 23 0a 64 6f 5f 73 65 6c 65 63 74 5f 74  o..#.do_select_t
13c50 65 73 74 73 20 65 5f 73 65 6c 65 63 74 2d 39 2e  ests e_select-9.
13c60 31 30 20 7b 0a 20 20 31 20 20 7b 20 53 45 4c 45  10 {.  1  { SELE
13c70 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13c80 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 35 20  ER BY a LIMIT 5 
13c90 4f 46 46 53 45 54 20 2d 31 20 7d 20 7b 61 20 62  OFFSET -1 } {a b
13ca0 20 63 20 64 20 65 7d 0a 20 20 32 20 20 7b 20 53   c d e}.  2  { S
13cb0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13cc0 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13cd0 20 35 20 4f 46 46 53 45 54 20 2d 35 30 30 20 7d   5 OFFSET -500 }
13ce0 20 7b 61 20 62 20 63 20 64 20 65 7d 0a 20 20 33   {a b c d e}.  3
13cf0 20 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f    { SELECT b FRO
13d00 4d 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20  M f1 ORDER BY a 
13d10 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20 30  LIMIT 5 OFFSET 0
13d20 20 20 7d 20 7b 61 20 62 20 63 20 64 20 65 7d 0a    } {a b c d e}.
13d30 7d 20 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  } ..# EVIDENCE-O
13d40 46 3a 20 52 2d 31 39 35 30 39 2d 34 30 33 35 36  F: R-19509-40356
13d50 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 73 65   Instead of a se
13d60 70 61 72 61 74 65 20 4f 46 46 53 45 54 20 63 6c  parate OFFSET cl
13d70 61 75 73 65 2c 20 74 68 65 0a 23 20 4c 49 4d 49  ause, the.# LIMI
13d80 54 20 63 6c 61 75 73 65 20 6d 61 79 20 73 70 65  T clause may spe
13d90 63 69 66 79 20 74 77 6f 20 73 63 61 6c 61 72 20  cify two scalar 
13da0 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61  expressions sepa
13db0 72 61 74 65 64 20 62 79 20 61 20 63 6f 6d 6d 61  rated by a comma
13dc0 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
13dd0 46 3a 20 52 2d 33 33 37 38 38 2d 34 36 32 34 33  F: R-33788-46243
13de0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
13df0 68 65 20 66 69 72 73 74 20 65 78 70 72 65 73 73  he first express
13e00 69 6f 6e 20 69 73 20 75 73 65 64 0a 23 20 61 73  ion is used.# as
13e10 20 74 68 65 20 4f 46 46 53 45 54 20 65 78 70 72   the OFFSET expr
13e20 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 73  ession and the s
13e30 65 63 6f 6e 64 20 61 73 20 74 68 65 20 4c 49 4d  econd as the LIM
13e40 49 54 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23  IT expression..#
13e50 0a 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73  .do_select_tests
13e60 20 65 5f 73 65 6c 65 63 74 2d 39 2e 31 31 20 7b   e_select-9.11 {
13e70 0a 20 20 31 20 20 7b 20 53 45 4c 45 43 54 20 62  .  1  { SELECT b
13e80 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52 20 42   FROM f1 ORDER B
13e90 59 20 61 20 4c 49 4d 49 54 20 35 2c 20 31 30 20  Y a LIMIT 5, 10 
13ea0 7d 20 7b 66 20 67 20 68 20 69 20 6a 20 6b 20 6c  } {f g h i j k l
13eb0 20 6d 20 6e 20 6f 7d 0a 20 20 32 20 20 7b 20 53   m n o}.  2  { S
13ec0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
13ed0 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
13ee0 20 31 30 2c 20 32 2b 33 20 7d 20 7b 6b 20 6c 20   10, 2+3 } {k l 
13ef0 6d 20 6e 20 6f 7d 0a 20 20 33 20 20 7b 20 53 45  m n o}.  3  { SE
13f00 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
13f10 52 44 45 52 20 42 59 20 61 20 0a 20 20 20 20 20  RDER BY a .     
13f20 20 20 4c 49 4d 49 54 20 28 53 45 4c 45 43 54 20    LIMIT (SELECT 
13f30 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20  a FROM f1 WHERE 
13f40 62 3d 27 62 27 29 2c 20 28 53 45 4c 45 43 54 20  b='b'), (SELECT 
13f50 61 20 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20  a FROM f1 WHERE 
13f60 62 3d 27 6a 27 29 20 0a 20 20 20 20 20 7d 20 7b  b='j') .     } {
13f70 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 20  c d e f g h i j 
13f80 6b 20 6c 7d 0a 20 20 34 20 20 7b 20 53 45 4c 45  k l}.  4  { SELE
13f90 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13fa0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 33 2e  ER BY a LIMIT 3.
13fb0 30 2c 20 27 35 27 20 7d 20 7b 64 20 65 20 66 20  0, '5' } {d e f 
13fc0 67 20 68 7d 0a 20 20 35 20 20 7b 20 53 45 4c 45  g h}.  5  { SELE
13fd0 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44  CT b FROM f1 ORD
13fe0 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 30 2c  ER BY a LIMIT 0,
13ff0 20 27 35 27 20 7d 20 7b 61 20 62 20 63 20 64 20   '5' } {a b c d 
14000 65 7d 0a 20 20 36 20 20 7b 20 53 45 4c 45 43 54  e}.  6  { SELECT
14010 20 62 20 46 52 4f 4d 20 66 31 20 4f 52 44 45 52   b FROM f1 ORDER
14020 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 2c 20   BY a LIMIT 10, 
14030 30 20 7d 20 7b 7d 0a 20 20 37 20 20 7b 20 53 45  0 } {}.  7  { SE
14040 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
14050 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
14060 27 31 27 7c 7c 27 35 27 2c 20 33 20 7d 20 7b 70  '1'||'5', 3 } {p
14070 20 71 20 72 7d 0a 0a 20 20 38 20 20 7b 20 53 45   q r}..  8  { SE
14080 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20 4f  LECT b FROM f1 O
14090 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
140a0 32 30 2c 20 31 30 20 7d 20 7b 75 20 76 20 77 20  20, 10 } {u v w 
140b0 78 20 79 20 7a 7d 0a 20 20 39 20 20 7b 20 53 45  x y z}.  9  { SE
140c0 4c 45 43 54 20 61 20 46 52 4f 4d 20 66 31 20 4f  LECT a FROM f1 O
140d0 52 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4c  RDER BY a DESC L
140e0 49 4d 49 54 20 31 38 2b 34 2c 20 31 30 30 20 7d  IMIT 18+4, 100 }
140f0 20 7b 34 20 33 20 32 20 31 7d 0a 0a 20 20 31 30   {4 3 2 1}..  10
14100 20 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   { SELECT b FROM
14110 20 66 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c   f1 ORDER BY a L
14120 49 4d 49 54 20 2d 31 2c 20 35 20 7d 20 7b 61 20  IMIT -1, 5 } {a 
14130 62 20 63 20 64 20 65 7d 0a 20 20 31 31 20 7b 20  b c d e}.  11 { 
14140 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31  SELECT b FROM f1
14150 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
14160 54 20 2d 35 30 30 2c 20 35 20 7d 20 7b 61 20 62  T -500, 5 } {a b
14170 20 63 20 64 20 65 7d 0a 20 20 31 32 20 7b 20 53   c d e}.  12 { S
14180 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 66 31 20  ELECT b FROM f1 
14190 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
141a0 20 30 2c 20 35 20 7d 20 7b 61 20 62 20 63 20 64   0, 5 } {a b c d
141b0 20 65 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65   e}.}..finish_te
141c0 73 74 0a                                         st.