/ Hex Artifact Content
Login

Artifact aebc2bb0c3bc44606125033cbcaac2c8d1f33a95:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 32 34 0a 23  # 2008 June 24.#
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 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 0a 23 0a 23 20 24 49 64 3a 20 73 65 6c 65 63   .#.# $Id: selec
01b0: 74 39 2e 74 65 73 74 2c 76 20 31 2e 34 20 32 30  t9.test,v 1.4 20
01c0: 30 38 2f 30 37 2f 30 31 20 31 34 3a 33 39 3a 33  08/07/01 14:39:3
01d0: 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78  5 danielk1977 Ex
01e0: 70 20 24 0a 0a 23 20 54 68 65 20 74 65 73 74 73  p $..# The tests
01f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 61 72   in this file ar
0200: 65 20 66 6f 63 75 73 65 64 20 6f 6e 20 74 65 73  e focused on tes
0210: 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
0220: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 0a 23 20  T statements .# 
0230: 74 68 61 74 20 68 61 76 65 20 61 6e 79 20 6f 72  that have any or
0240: 20 61 6c 6c 20 6f 66 20 61 6e 20 4f 52 44 45 52   all of an ORDER
0250: 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 4f 46   BY, LIMIT or OF
0260: 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 41 73  FSET clauses. As
0270: 20 6f 66 0a 23 20 76 65 72 73 69 6f 6e 20 33 2e   of.# version 3.
0280: 36 2e 30 2c 20 53 51 4c 69 74 65 20 63 6f 6e 74  6.0, SQLite cont
0290: 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 75 73 65  ains code to use
02a0: 20 53 51 4c 20 69 6e 64 65 78 65 73 20 77 68 65   SQL indexes whe
02b0: 72 65 20 70 6f 73 73 69 62 6c 65 20 0a 23 20 74  re possible .# t
02c0: 6f 20 6f 70 74 69 6d 69 7a 65 20 73 75 63 68 20  o optimize such 
02d0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23 0a 0a 23  statements..#..#
02e0: 20 54 4f 44 4f 20 50 6f 69 6e 74 73 3a 0a 23 0a   TODO Points:.#.
02f0: 23 20 20 20 2a 20 41 72 65 20 74 68 65 72 65 20  #   * Are there 
0300: 61 6e 79 20 22 63 6f 6c 75 6d 6e 20 61 66 66 69  any "column affi
0310: 6e 69 74 79 22 20 69 73 73 75 65 73 20 74 6f 20  nity" issues to 
0320: 63 6f 6e 73 69 64 65 72 3f 0a 0a 73 65 74 20 74  consider?..set t
0330: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0340: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0350: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
0360: 74 65 72 2e 74 63 6c 0a 0a 23 2d 2d 2d 2d 2d 2d  ter.tcl..#------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 0a 23 20 74 65 73 74 5f 63 6f 6d 70 6f  ---.# test_compo
03c0: 75 6e 64 5f 73 65 6c 65 63 74 20 54 45 53 54 4e  und_select TESTN
03d0: 41 4d 45 20 53 45 4c 45 43 54 20 52 45 53 55 4c  AME SELECT RESUL
03e0: 54 0a 23 0a 23 20 20 20 54 68 69 73 20 63 6f 6d  T.#.#   This com
03f0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
0400: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 4c 49 4d  run multiple LIM
0410: 49 54 2f 4f 46 46 53 45 54 20 74 65 73 74 20 63  IT/OFFSET test c
0420: 61 73 65 73 20 62 61 73 65 64 20 6f 6e 20 0a 23  ases based on .#
0430: 20 20 20 74 68 65 20 73 69 6e 67 6c 65 20 53 45     the single SE
0440: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
0450: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
0460: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ond argument. Th
0470: 65 20 53 45 4c 45 43 54 0a 23 20 20 20 73 74 61  e SELECT.#   sta
0480: 74 65 6d 65 6e 74 20 6d 61 79 20 6e 6f 74 20 63  tement may not c
0490: 6f 6e 74 61 69 6e 20 61 20 4c 49 4d 49 54 20 6f  ontain a LIMIT o
04a0: 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 2e  r OFFSET clause.
04b0: 20 54 68 69 73 20 70 72 6f 63 20 74 65 73 74 73   This proc tests
04c0: 0a 23 20 20 20 6d 61 6e 79 20 73 74 61 74 65 6d  .#   many statem
04d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
04e0: 3a 0a 23 20 20 20 20 0a 23 20 20 20 20 20 22 24  :.#    .#     "$
04f0: 53 45 4c 45 43 54 20 6c 69 6d 69 74 20 24 58 20  SELECT limit $X 
0500: 6f 66 66 73 65 74 20 24 59 22 0a 23 20 20 20 20  offset $Y".#    
0510: 0a 23 20 20 20 66 6f 72 20 76 61 72 69 6f 75 73  .#   for various
0520: 20 76 61 6c 75 65 73 20 6f 66 20 24 58 20 61 6e   values of $X an
0530: 64 20 24 59 2e 0a 23 20 20 20 20 0a 23 20 20 20  d $Y..#    .#   
0540: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
0550: 6e 74 2c 20 24 52 45 53 55 4c 54 2c 20 73 68 6f  nt, $RESULT, sho
0560: 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  uld contain the 
0570: 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20  expected result 
0580: 6f 66 0a 23 20 20 20 74 68 65 20 63 6f 6d 6d 61  of.#   the comma
0590: 6e 64 20 5b 65 78 65 63 73 71 6c 20 24 53 45 4c  nd [execsql $SEL
05a0: 45 43 54 5d 2e 0a 23 20 20 20 20 0a 23 20 20 20  ECT]..#    .#   
05b0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
05c0: 6e 74 2c 20 24 54 45 53 54 4e 41 4d 45 2c 20 69  nt, $TESTNAME, i
05d0: 73 20 75 73 65 64 20 61 73 20 74 68 65 20 62 61  s used as the ba
05e0: 73 65 20 74 65 73 74 20 63 61 73 65 20 6e 61 6d  se test case nam
05f0: 65 20 74 6f 0a 23 20 20 20 70 61 73 73 20 74 6f  e to.#   pass to
0600: 20 5b 64 6f 5f 74 65 73 74 5d 20 66 6f 72 20 65   [do_test] for e
0610: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 4c  ach individual L
0620: 49 4d 49 54 20 4f 46 46 53 45 54 20 74 65 73 74  IMIT OFFSET test
0630: 20 63 61 73 65 2e 0a 23 20 0a 70 72 6f 63 20 74   case..# .proc t
0640: 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c  est_compound_sel
0650: 65 63 74 20 7b 74 65 73 74 6e 61 6d 65 20 73 71  ect {testname sq
0660: 6c 20 72 65 73 75 6c 74 7d 20 7b 0a 0a 20 20 73  l result} {..  s
0670: 65 74 20 6e 43 6f 6c 20 31 0a 20 20 64 62 20 65  et nCol 1.  db e
0680: 76 61 6c 20 24 73 71 6c 20 41 20 7b 0a 20 20 20  val $sql A {.   
0690: 20 73 65 74 20 6e 43 6f 6c 20 5b 6c 6c 65 6e 67   set nCol [lleng
06a0: 74 68 20 24 41 28 2a 29 5d 0a 20 20 20 20 62 72  th $A(*)].    br
06b0: 65 61 6b 0a 20 20 7d 0a 20 20 73 65 74 20 6e 52  eak.  }.  set nR
06c0: 6f 77 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  ow [expr {[lleng
06d0: 74 68 20 24 72 65 73 75 6c 74 5d 20 2f 20 24 6e  th $result] / $n
06e0: 43 6f 6c 7d 5d 0a 0a 20 20 73 65 74 20 3a 3a 63  Col}]..  set ::c
06f0: 6f 6d 70 6f 75 6e 64 5f 73 71 6c 20 24 73 71 6c  ompound_sql $sql
0700: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
0710: 6e 61 6d 65 20 7b 20 0a 20 20 20 20 65 78 65 63  name { .    exec
0720: 73 71 6c 20 24 3a 3a 63 6f 6d 70 6f 75 6e 64 5f  sql $::compound_
0730: 73 71 6c 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a  sql.  } $result.
0740: 23 72 65 74 75 72 6e 0a 0a 20 20 73 65 74 20 69  #return..  set i
0750: 4c 69 6d 69 74 49 6e 63 72 20 20 31 0a 20 20 73  LimitIncr  1.  s
0760: 65 74 20 69 4f 66 66 73 65 74 49 6e 63 72 20 31  et iOffsetIncr 1
0770: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
0780: 73 74 73 20 3a 3a 47 28 69 73 71 75 69 63 6b 29  sts ::G(isquick)
0790: 5d 20 26 26 20 24 3a 3a 47 28 69 73 71 75 69 63  ] && $::G(isquic
07a0: 6b 29 20 26 26 20 24 6e 52 6f 77 3e 3d 35 7d 20  k) && $nRow>=5} 
07b0: 7b 0a 20 20 20 20 73 65 74 20 69 4f 66 66 73 65  {.    set iOffse
07c0: 74 49 6e 63 72 20 5b 65 78 70 72 20 24 6e 52 6f  tIncr [expr $nRo
07d0: 77 20 2f 20 35 5d 0a 20 20 20 20 73 65 74 20 69  w / 5].    set i
07e0: 4c 69 6d 69 74 49 6e 63 72 20 5b 65 78 70 72 20  LimitIncr [expr 
07f0: 24 6e 52 6f 77 20 2f 20 35 5d 0a 20 20 7d 0a 0a  $nRow / 5].  }..
0800: 20 20 73 65 74 20 69 4c 69 6d 69 74 45 6e 64 20    set iLimitEnd 
0810: 20 20 5b 65 78 70 72 20 24 6e 52 6f 77 2b 24 69    [expr $nRow+$i
0820: 4c 69 6d 69 74 49 6e 63 72 5d 0a 20 20 73 65 74  LimitIncr].  set
0830: 20 69 4f 66 66 73 65 74 45 6e 64 20 20 5b 65 78   iOffsetEnd  [ex
0840: 70 72 20 24 6e 52 6f 77 2b 24 69 4f 66 66 73 65  pr $nRow+$iOffse
0850: 74 49 6e 63 72 5d 0a 0a 20 20 66 6f 72 20 7b 73  tIncr]..  for {s
0860: 65 74 20 69 4f 66 66 73 65 74 20 30 7d 20 7b 24  et iOffset 0} {$
0870: 69 4f 66 66 73 65 74 20 3c 20 24 69 4f 66 66 73  iOffset < $iOffs
0880: 65 74 45 6e 64 7d 20 7b 69 6e 63 72 20 69 4f 66  etEnd} {incr iOf
0890: 66 73 65 74 20 24 69 4f 66 66 73 65 74 49 6e 63  fset $iOffsetInc
08a0: 72 7d 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65  r} {.    for {se
08b0: 74 20 69 4c 69 6d 69 74 20 30 7d 20 7b 24 69 4c  t iLimit 0} {$iL
08c0: 69 6d 69 74 20 3c 20 24 69 4c 69 6d 69 74 45 6e  imit < $iLimitEn
08d0: 64 7d 20 7b 69 6e 63 72 20 69 4c 69 6d 69 74 7d  d} {incr iLimit}
08e0: 20 7b 0a 20 20 0a 20 20 20 20 20 20 73 65 74 20   {.  .      set 
08f0: 3a 3a 63 6f 6d 70 6f 75 6e 64 5f 73 71 6c 20 22  ::compound_sql "
0900: 24 73 71 6c 20 4c 49 4d 49 54 20 24 69 4c 69 6d  $sql LIMIT $iLim
0910: 69 74 22 0a 20 20 20 20 20 20 69 66 20 7b 24 69  it".      if {$i
0920: 4f 66 66 73 65 74 20 21 3d 20 30 7d 20 7b 0a 20  Offset != 0} {. 
0930: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 3a 3a         append ::
0940: 63 6f 6d 70 6f 75 6e 64 5f 73 71 6c 20 22 20 4f  compound_sql " O
0950: 46 46 53 45 54 20 24 69 4f 66 66 73 65 74 22 0a  FFSET $iOffset".
0960: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
0970: 20 73 65 74 20 69 53 74 61 72 74 20 5b 65 78 70   set iStart [exp
0980: 72 20 7b 24 69 4f 66 66 73 65 74 2a 24 6e 43 6f  r {$iOffset*$nCo
0990: 6c 7d 5d 0a 20 20 20 20 20 20 73 65 74 20 69 45  l}].      set iE
09a0: 6e 64 20 5b 65 78 70 72 20 7b 28 24 69 4f 66 66  nd [expr {($iOff
09b0: 73 65 74 2a 24 6e 43 6f 6c 29 20 2b 20 28 24 69  set*$nCol) + ($i
09c0: 4c 69 6d 69 74 2a 24 6e 43 6f 6c 29 20 2d 31 7d  Limit*$nCol) -1}
09d0: 5d 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65  ].  .      do_te
09e0: 73 74 20 24 74 65 73 74 6e 61 6d 65 2e 6c 69 6d  st $testname.lim
09f0: 69 74 3d 24 69 4c 69 6d 69 74 2e 6f 66 66 73 65  it=$iLimit.offse
0a00: 74 3d 24 69 4f 66 66 73 65 74 20 7b 20 0a 20 20  t=$iOffset { .  
0a10: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 24 3a        execsql $:
0a20: 3a 63 6f 6d 70 6f 75 6e 64 5f 73 71 6c 0a 20 20  :compound_sql.  
0a30: 20 20 20 20 7d 20 5b 6c 72 61 6e 67 65 20 24 72      } [lrange $r
0a40: 65 73 75 6c 74 20 24 69 53 74 61 72 74 20 24 69  esult $iStart $i
0a50: 45 6e 64 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  End].    }.  }.}
0a60: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 74  ------------.# t
0ab0: 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c  est_compound_sel
0ac0: 65 63 74 5f 66 6c 69 70 70 61 62 6c 65 20 54 45  ect_flippable TE
0ad0: 53 54 4e 41 4d 45 20 53 45 4c 45 43 54 20 52 45  STNAME SELECT RE
0ae0: 53 55 4c 54 0a 23 0a 23 20 20 20 54 68 69 73 20  SULT.#.#   This 
0af0: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 74  command is for t
0b00: 65 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  esting statement
0b10: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 23  s of the form:.#
0b20: 0a 23 20 20 20 20 20 3c 73 69 6d 70 6c 65 20 73  .#     <simple s
0b30: 65 6c 65 63 74 20 31 3e 20 3c 63 6f 6d 70 6f 75  elect 1> <compou
0b40: 6e 64 20 6f 70 3e 20 3c 73 69 6d 70 6c 65 20 73  nd op> <simple s
0b50: 65 6c 65 63 74 20 32 3e 20 4f 52 44 45 52 20 42  elect 2> ORDER B
0b60: 59 20 3c 6f 72 64 65 72 20 62 79 3e 0a 23 0a 23  Y <order by>.#.#
0b70: 20 20 20 77 68 65 72 65 20 65 61 63 68 20 3c 73     where each <s
0b80: 69 6d 70 6c 65 20 73 65 6c 65 63 74 3e 20 69 73  imple select> is
0b90: 20 61 20 73 69 6d 70 6c 65 20 28 6e 6f 6e 2d 63   a simple (non-c
0ba0: 6f 6d 70 6f 75 6e 64 29 20 73 65 6c 65 63 74 20  ompound) select 
0bb0: 73 74 61 74 65 6d 65 6e 74 0a 23 20 20 20 61 6e  statement.#   an
0bc0: 64 20 3c 63 6f 6d 70 6f 75 6e 64 20 6f 70 3e 20  d <compound op> 
0bd0: 69 73 20 6f 6e 65 20 6f 66 20 22 49 4e 54 45 52  is one of "INTER
0be0: 53 45 43 54 22 2c 20 22 55 4e 49 4f 4e 20 41 4c  SECT", "UNION AL
0bf0: 4c 22 20 6f 72 20 22 55 4e 49 4f 4e 22 2e 0a 23  L" or "UNION"..#
0c00: 0a 23 20 20 20 54 68 69 73 20 70 72 6f 63 20 63  .#   This proc c
0c10: 61 6c 6c 73 20 5b 74 65 73 74 5f 63 6f 6d 70 6f  alls [test_compo
0c20: 75 6e 64 5f 73 65 6c 65 63 74 5d 20 74 77 69 63  und_select] twic
0c30: 65 2c 20 6f 6e 63 65 20 77 69 74 68 20 74 68 65  e, once with the
0c40: 20 73 65 6c 65 63 74 0a 23 20 20 20 73 74 61 74   select.#   stat
0c50: 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 70  ement as it is p
0c60: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 63 6f  assed to this co
0c70: 6d 6d 61 6e 64 2c 20 61 6e 64 20 6f 6e 63 65 20  mmand, and once 
0c80: 77 69 74 68 20 74 68 65 20 70 6f 73 69 74 69 6f  with the positio
0c90: 6e 73 0a 23 20 20 20 6f 66 20 3c 73 65 6c 65 63  ns.#   of <selec
0ca0: 74 20 73 74 61 74 65 6d 65 6e 74 20 31 3e 20 61  t statement 1> a
0cb0: 6e 64 20 3c 73 65 6c 65 63 74 20 73 74 61 74 65  nd <select state
0cc0: 6d 65 6e 74 20 32 3e 20 65 78 63 68 61 6e 67 65  ment 2> exchange
0cd0: 64 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 63  d..#.proc test_c
0ce0: 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66  ompound_select_f
0cf0: 6c 69 70 70 61 62 6c 65 20 7b 74 65 73 74 6e 61  lippable {testna
0d00: 6d 65 20 73 71 6c 20 72 65 73 75 6c 74 7d 20 7b  me sql result} {
0d10: 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64  .  test_compound
0d20: 5f 73 65 6c 65 63 74 20 24 74 65 73 74 6e 61 6d  _select $testnam
0d30: 65 20 24 73 71 6c 20 24 72 65 73 75 6c 74 0a 0a  e $sql $result..
0d40: 20 20 73 65 74 20 73 65 6c 65 63 74 20 5b 73 74    set select [st
0d50: 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 0a  ring trim $sql].
0d60: 20 20 73 65 74 20 52 45 20 7b 28 2e 2a 29 28 55    set RE {(.*)(U
0d70: 4e 49 4f 4e 20 41 4c 4c 7c 49 4e 54 45 52 53 45  NION ALL|INTERSE
0d80: 43 54 7c 55 4e 49 4f 4e 29 28 2e 2a 29 28 4f 52  CT|UNION)(.*)(OR
0d90: 44 45 52 20 42 59 2e 2a 29 7d 0a 20 20 73 65 74  DER BY.*)}.  set
0da0: 20 72 63 20 5b 72 65 67 65 78 70 20 24 52 45 20   rc [regexp $RE 
0db0: 24 73 65 6c 65 63 74 20 2d 3e 20 73 31 20 6f 70  $select -> s1 op
0dc0: 20 73 32 20 6f 72 64 65 72 5f 62 79 5d 0a 20 20   s2 order_by].  
0dd0: 69 66 20 7b 21 24 72 63 7d 20 7b 65 72 72 6f 72  if {!$rc} {error
0de0: 20 22 53 74 61 74 65 6d 65 6e 74 20 69 73 20 75   "Statement is u
0df0: 6e 66 6c 69 70 70 61 62 6c 65 3a 20 24 73 65 6c  nflippable: $sel
0e00: 65 63 74 22 7d 0a 0a 20 20 73 65 74 20 66 6c 69  ect"}..  set fli
0e10: 70 73 71 6c 20 22 24 73 32 20 24 6f 70 20 24 73  psql "$s2 $op $s
0e20: 31 20 24 6f 72 64 65 72 5f 62 79 22 0a 20 20 74  1 $order_by".  t
0e30: 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c  est_compound_sel
0e40: 65 63 74 20 24 74 65 73 74 6e 61 6d 65 2e 66 6c  ect $testname.fl
0e50: 69 70 70 65 64 20 24 66 6c 69 70 73 71 6c 20 24  ipped $flipsql $
0e60: 72 65 73 75 6c 74 0a 7d 0a 0a 23 23 23 23 23 23  result.}..######
0e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0eb0: 23 23 23 23 23 23 23 0a 23 20 42 65 67 69 6e 20  #######.# Begin 
0ec0: 74 65 73 74 73 2e 0a 23 0a 0a 23 20 43 72 65 61  tests..#..# Crea
0ed0: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
0ee0: 61 20 73 61 6d 70 6c 65 20 64 61 74 61 62 61 73  a sample databas
0ef0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c  e..#.do_test sel
0f00: 65 63 74 39 2d 31 2e 30 20 7b 0a 20 20 65 78 65  ect9-1.0 {.  exe
0f10: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0f20: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
0f30: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
0f40: 54 41 42 4c 45 20 74 32 28 64 2c 20 65 2c 20 66  TABLE t2(d, e, f
0f50: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
0f60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0f70: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 20 27 6f  t1 VALUES(1,  'o
0f80: 6e 65 27 2c 20 20 20 27 49 27 29 3b 0a 20 20 20  ne',   'I');.   
0f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0fa0: 31 20 56 41 4c 55 45 53 28 33 2c 20 20 4e 55 4c  1 VALUES(3,  NUL
0fb0: 4c 2c 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20  L,    NULL);.   
0fc0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0fd0: 31 20 56 41 4c 55 45 53 28 35 2c 20 20 27 66 69  1 VALUES(5,  'fi
0fe0: 76 65 27 2c 20 20 27 56 27 29 3b 0a 20 20 20 20  ve',  'V');.    
0ff0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1000: 20 56 41 4c 55 45 53 28 37 2c 20 20 27 73 65 76   VALUES(7,  'sev
1010: 65 6e 27 2c 20 27 56 49 49 27 29 3b 0a 20 20 20  en', 'VII');.   
1020: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1030: 31 20 56 41 4c 55 45 53 28 39 2c 20 20 4e 55 4c  1 VALUES(9,  NUL
1040: 4c 2c 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20  L,    NULL);.   
1050: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1060: 31 20 56 41 4c 55 45 53 28 32 2c 20 20 27 74 77  1 VALUES(2,  'tw
1070: 6f 27 2c 20 20 20 27 49 49 27 29 3b 0a 20 20 20  o',   'II');.   
1080: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1090: 31 20 56 41 4c 55 45 53 28 34 2c 20 20 27 66 6f  1 VALUES(4,  'fo
10a0: 75 72 27 2c 20 20 27 49 56 27 29 3b 0a 20 20 20  ur',  'IV');.   
10b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10c0: 31 20 56 41 4c 55 45 53 28 36 2c 20 20 4e 55 4c  1 VALUES(6,  NUL
10d0: 4c 2c 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20  L,    NULL);.   
10e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10f0: 31 20 56 41 4c 55 45 53 28 38 2c 20 20 27 65 69  1 VALUES(8,  'ei
1100: 67 68 74 27 2c 20 27 56 49 49 49 27 29 3b 0a 20  ght', 'VIII');. 
1110: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1120: 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 27   t1 VALUES(10, '
1130: 74 65 6e 27 2c 20 20 20 27 58 27 29 3b 0a 0a 20  ten',   'X');.. 
1140: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1150: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 20 27   t2 VALUES(1,  '
1160: 74 77 6f 27 2c 20 20 20 20 20 20 27 49 56 27 29  two',      'IV')
1170: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1180: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c  NTO t2 VALUES(2,
1190: 20 20 27 66 6f 75 72 27 2c 20 20 20 20 20 27 56    'four',     'V
11a0: 49 49 49 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  III');.      INS
11b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
11c0: 45 53 28 33 2c 20 20 4e 55 4c 4c 2c 20 20 20 20  ES(3,  NULL,    
11d0: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
11e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
11f0: 41 4c 55 45 53 28 34 2c 20 20 27 65 69 67 68 74  ALUES(4,  'eight
1200: 27 2c 20 20 20 20 27 58 56 49 27 29 3b 0a 20 20  ',    'XVI');.  
1210: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1220: 74 32 20 56 41 4c 55 45 53 28 35 2c 20 20 27 74  t2 VALUES(5,  't
1230: 65 6e 27 2c 20 20 20 20 20 20 27 58 58 27 29 3b  en',      'XX');
1240: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1250: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 36 2c 20  TO t2 VALUES(6, 
1260: 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 4e 55 4c   NULL,       NUL
1270: 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  L);.      INSERT
1280: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1290: 37 2c 20 20 27 66 6f 75 72 74 65 65 6e 27 2c 20  7,  'fourteen', 
12a0: 27 58 58 56 49 49 49 27 29 3b 0a 20 20 20 20 20  'XXVIII');.     
12b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
12c0: 56 41 4c 55 45 53 28 38 2c 20 20 27 73 69 78 74  VALUES(8,  'sixt
12d0: 65 65 6e 27 2c 20 20 27 58 58 58 49 49 27 29 3b  een',  'XXXII');
12e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
12f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 39 2c 20  TO t2 VALUES(9, 
1300: 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 4e 55 4c   NULL,       NUL
1310: 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  L);.      INSERT
1320: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1330: 31 30 2c 20 27 74 77 65 6e 74 79 27 2c 20 20 20  10, 'twenty',   
1340: 27 58 4c 27 29 3b 0a 0a 20 20 20 20 43 4f 4d 4d  'XL');..    COMM
1350: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  IT;.  }.} {}..# 
1360: 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
1370: 66 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  f this loop runs
1380: 20 74 68 65 20 73 61 6d 65 20 74 65 73 74 73 20   the same tests 
1390: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
13a0: 20 73 65 74 0a 23 20 6f 66 20 69 6e 64 65 78 65   set.# of indexe
13b0: 73 20 70 72 65 73 65 6e 74 20 77 69 74 68 69 6e  s present within
13c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
13d0: 68 65 6d 61 2e 20 54 68 65 20 64 61 74 61 20 72  hema. The data r
13e0: 65 74 75 72 6e 65 64 20 62 79 0a 23 20 74 68 65  eturned by.# the
13f0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1410: 68 65 20 74 65 73 74 20 63 61 73 65 73 20 73 68  he test cases sh
1420: 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
1430: 20 0a 23 20 69 6e 20 65 61 63 68 20 63 61 73 65   .# in each case
1440: 2e 0a 23 0a 73 65 74 20 69 4f 75 74 65 72 4c 6f  ..#.set iOuterLo
1450: 6f 70 20 31 0a 66 6f 72 65 61 63 68 20 69 6e 64  op 1.foreach ind
1460: 65 78 65 73 20 5b 6c 69 73 74 20 7b 0a 20 20 2f  exes [list {.  /
1470: 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20  * Do not create 
1480: 61 6e 79 20 69 6e 64 65 78 65 73 2e 20 2a 2f 0a  any indexes. */.
1490: 7d 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  } {.  CREATE IND
14a0: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 0a 7d  EX i1 ON t1(a).}
14b0: 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45   {.  CREATE INDE
14c0: 58 20 69 32 20 4f 4e 20 74 31 28 62 29 0a 7d 20  X i2 ON t1(b).} 
14d0: 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  {.  CREATE INDEX
14e0: 20 69 33 20 4f 4e 20 74 32 28 64 29 0a 7d 20 7b   i3 ON t2(d).} {
14f0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
1500: 69 34 20 4f 4e 20 74 32 28 65 29 0a 7d 5d 20 7b  i4 ON t2(e).}] {
1510: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 65 6c 65  ..  do_test sele
1520: 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-1.$iOuterLoo
1530: 70 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.1 {.    execsq
1540: 6c 20 24 69 6e 64 65 78 65 73 0a 20 20 7d 20 7b  l $indexes.  } {
1550: 7d 0a 0a 20 20 23 20 54 65 73 74 20 73 6f 6d 65  }..  # Test some
1560: 20 32 2d 77 61 79 20 55 4e 49 4f 4e 20 41 4c 4c   2-way UNION ALL
1570: 20 71 75 65 72 69 65 73 2e 20 4e 6f 20 57 48 45   queries. No WHE
1580: 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 23 0a  RE clauses..  #.
1590: 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f    test_compound_
15a0: 73 65 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31  select select9-1
15b0: 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 32 20 7b  .$iOuterLoop.2 {
15c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
15d0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
15e0: 4c 4c 20 53 45 4c 45 43 54 20 64 2c 20 65 20 46  LL SELECT d, e F
15f0: 52 4f 4d 20 74 32 20 0a 20 20 7d 20 7b 31 20 6f  ROM t2 .  } {1 o
1600: 6e 65 20 33 20 7b 7d 20 35 20 66 69 76 65 20 37  ne 3 {} 5 five 7
1610: 20 73 65 76 65 6e 20 39 20 7b 7d 20 32 20 74 77   seven 9 {} 2 tw
1620: 6f 20 34 20 66 6f 75 72 20 36 20 7b 7d 20 38 20  o 4 four 6 {} 8 
1630: 65 69 67 68 74 20 31 30 20 74 65 6e 20 31 20 74  eight 10 ten 1 t
1640: 77 6f 20 32 20 66 6f 75 72 20 33 20 7b 7d 20 34  wo 2 four 3 {} 4
1650: 20 65 69 67 68 74 20 35 20 74 65 6e 20 36 20 7b   eight 5 ten 6 {
1660: 7d 20 37 20 66 6f 75 72 74 65 65 6e 20 38 20 73  } 7 fourteen 8 s
1670: 69 78 74 65 65 6e 20 39 20 7b 7d 20 31 30 20 74  ixteen 9 {} 10 t
1680: 77 65 6e 74 79 7d 0a 20 20 74 65 73 74 5f 63 6f  wenty}.  test_co
1690: 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20 73 65  mpound_select se
16a0: 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c  lect9-1.$iOuterL
16b0: 6f 6f 70 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45  oop.3 {.    SELE
16c0: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20  CT a, b FROM t1 
16d0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
16e0: 20 64 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f 52   d, e FROM t2 OR
16f0: 44 45 52 20 42 59 20 31 20 0a 20 20 7d 20 7b 31  DER BY 1 .  } {1
1700: 20 6f 6e 65 20 31 20 74 77 6f 20 32 20 74 77 6f   one 1 two 2 two
1710: 20 32 20 66 6f 75 72 20 33 20 7b 7d 20 33 20 7b   2 four 3 {} 3 {
1720: 7d 20 34 20 66 6f 75 72 20 34 20 65 69 67 68 74  } 4 four 4 eight
1730: 20 35 20 66 69 76 65 20 35 20 74 65 6e 20 36 20   5 five 5 ten 6 
1740: 7b 7d 20 36 20 7b 7d 20 37 20 73 65 76 65 6e 20  {} 6 {} 7 seven 
1750: 37 20 66 6f 75 72 74 65 65 6e 20 38 20 65 69 67  7 fourteen 8 eig
1760: 68 74 20 38 20 73 69 78 74 65 65 6e 20 39 20 7b  ht 8 sixteen 9 {
1770: 7d 20 39 20 7b 7d 20 31 30 20 74 65 6e 20 31 30  } 9 {} 10 ten 10
1780: 20 74 77 65 6e 74 79 7d 0a 20 20 74 65 73 74 5f   twenty}.  test_
1790: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20  compound_select 
17a0: 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65  select9-1.$iOute
17b0: 72 4c 6f 6f 70 2e 34 20 7b 0a 20 20 20 20 53 45  rLoop.4 {.    SE
17c0: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
17d0: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
17e0: 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32 20  CT d, e FROM t2 
17f0: 4f 52 44 45 52 20 42 59 20 32 20 0a 20 20 7d 20  ORDER BY 2 .  } 
1800: 7b 33 20 7b 7d 20 39 20 7b 7d 20 36 20 7b 7d 20  {3 {} 9 {} 6 {} 
1810: 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d 20 38  3 {} 6 {} 9 {} 8
1820: 20 65 69 67 68 74 20 34 20 65 69 67 68 74 20 35   eight 4 eight 5
1830: 20 66 69 76 65 20 34 20 66 6f 75 72 20 32 20 66   five 4 four 2 f
1840: 6f 75 72 20 37 20 66 6f 75 72 74 65 65 6e 20 31  our 7 fourteen 1
1850: 20 6f 6e 65 20 37 20 73 65 76 65 6e 20 38 20 73   one 7 seven 8 s
1860: 69 78 74 65 65 6e 20 31 30 20 74 65 6e 20 35 20  ixteen 10 ten 5 
1870: 74 65 6e 20 31 30 20 74 77 65 6e 74 79 20 32 20  ten 10 twenty 2 
1880: 74 77 6f 20 31 20 74 77 6f 7d 0a 20 20 74 65 73  two 1 two}.  tes
1890: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
18a0: 74 5f 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65  t_flippable sele
18b0: 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-1.$iOuterLoo
18c0: 70 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  p.5 {.    SELECT
18d0: 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 55 4e   a, b FROM t1 UN
18e0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 64  ION ALL SELECT d
18f0: 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  , e FROM t2 ORDE
1900: 52 20 42 59 20 31 2c 20 32 0a 20 20 7d 20 7b 31  R BY 1, 2.  } {1
1910: 20 6f 6e 65 20 31 20 74 77 6f 20 32 20 66 6f 75   one 1 two 2 fou
1920: 72 20 32 20 74 77 6f 20 33 20 7b 7d 20 33 20 7b  r 2 two 3 {} 3 {
1930: 7d 20 34 20 65 69 67 68 74 20 34 20 66 6f 75 72  } 4 eight 4 four
1940: 20 35 20 66 69 76 65 20 35 20 74 65 6e 20 36 20   5 five 5 ten 6 
1950: 7b 7d 20 36 20 7b 7d 20 37 20 66 6f 75 72 74 65  {} 6 {} 7 fourte
1960: 65 6e 20 37 20 73 65 76 65 6e 20 38 20 65 69 67  en 7 seven 8 eig
1970: 68 74 20 38 20 73 69 78 74 65 65 6e 20 39 20 7b  ht 8 sixteen 9 {
1980: 7d 20 39 20 7b 7d 20 31 30 20 74 65 6e 20 31 30  } 9 {} 10 ten 10
1990: 20 74 77 65 6e 74 79 7d 0a 20 20 74 65 73 74 5f   twenty}.  test_
19a0: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f  compound_select_
19b0: 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65 63 74  flippable select
19c0: 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e  9-1.$iOuterLoop.
19d0: 36 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  6 {.    SELECT a
19e0: 2c 20 62 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  , b FROM t1 UNIO
19f0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 64 2c 20  N ALL SELECT d, 
1a00: 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  e FROM t2 ORDER 
1a10: 42 59 20 32 2c 20 31 0a 20 20 7d 20 7b 33 20 7b  BY 2, 1.  } {3 {
1a20: 7d 20 33 20 7b 7d 20 36 20 7b 7d 20 36 20 7b 7d  } 3 {} 6 {} 6 {}
1a30: 20 39 20 7b 7d 20 39 20 7b 7d 20 34 20 65 69 67   9 {} 9 {} 4 eig
1a40: 68 74 20 38 20 65 69 67 68 74 20 35 20 66 69 76  ht 8 eight 5 fiv
1a50: 65 20 32 20 66 6f 75 72 20 34 20 66 6f 75 72 20  e 2 four 4 four 
1a60: 37 20 66 6f 75 72 74 65 65 6e 20 31 20 6f 6e 65  7 fourteen 1 one
1a70: 20 37 20 73 65 76 65 6e 20 38 20 73 69 78 74 65   7 seven 8 sixte
1a80: 65 6e 20 35 20 74 65 6e 20 31 30 20 74 65 6e 20  en 5 ten 10 ten 
1a90: 31 30 20 74 77 65 6e 74 79 20 31 20 74 77 6f 20  10 twenty 1 two 
1aa0: 32 20 74 77 6f 7d 0a 0a 20 20 23 20 54 65 73 74  2 two}..  # Test
1ab0: 20 73 6f 6d 65 20 32 2d 77 61 79 20 55 4e 49 4f   some 2-way UNIO
1ac0: 4e 20 71 75 65 72 69 65 73 2e 0a 20 20 23 0a 20  N queries..  #. 
1ad0: 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73   test_compound_s
1ae0: 65 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e  elect select9-1.
1af0: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 37 20 7b 0a  $iOuterLoop.7 {.
1b00: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
1b10: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
1b20: 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74  LECT d, e FROM t
1b30: 32 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 31 20  2 .  } {1 one 1 
1b40: 74 77 6f 20 32 20 66 6f 75 72 20 32 20 74 77 6f  two 2 four 2 two
1b50: 20 33 20 7b 7d 20 34 20 65 69 67 68 74 20 34 20   3 {} 4 eight 4 
1b60: 66 6f 75 72 20 35 20 66 69 76 65 20 35 20 74 65  four 5 five 5 te
1b70: 6e 20 36 20 7b 7d 20 37 20 66 6f 75 72 74 65 65  n 6 {} 7 fourtee
1b80: 6e 20 37 20 73 65 76 65 6e 20 38 20 65 69 67 68  n 7 seven 8 eigh
1b90: 74 20 38 20 73 69 78 74 65 65 6e 20 39 20 7b 7d  t 8 sixteen 9 {}
1ba0: 20 31 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74   10 ten 10 twent
1bb0: 79 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  y}..  test_compo
1bc0: 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63  und_select selec
1bd0: 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-1.$iOuterLoop
1be0: 2e 38 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .8 {.    SELECT 
1bf0: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 55 4e 49  a, b FROM t1 UNI
1c00: 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 65 20 46  ON SELECT d, e F
1c10: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1c20: 31 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 31 20  1 .  } {1 one 1 
1c30: 74 77 6f 20 32 20 66 6f 75 72 20 32 20 74 77 6f  two 2 four 2 two
1c40: 20 33 20 7b 7d 20 34 20 65 69 67 68 74 20 34 20   3 {} 4 eight 4 
1c50: 66 6f 75 72 20 35 20 66 69 76 65 20 35 20 74 65  four 5 five 5 te
1c60: 6e 20 36 20 7b 7d 20 37 20 66 6f 75 72 74 65 65  n 6 {} 7 fourtee
1c70: 6e 20 37 20 73 65 76 65 6e 20 38 20 65 69 67 68  n 7 seven 8 eigh
1c80: 74 20 38 20 73 69 78 74 65 65 6e 20 39 20 7b 7d  t 8 sixteen 9 {}
1c90: 20 31 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74   10 ten 10 twent
1ca0: 79 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  y}..  test_compo
1cb0: 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63  und_select selec
1cc0: 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-1.$iOuterLoop
1cd0: 2e 39 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .9 {.    SELECT 
1ce0: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 55 4e 49  a, b FROM t1 UNI
1cf0: 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 65 20 46  ON SELECT d, e F
1d00: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1d10: 32 20 0a 20 20 7d 20 7b 33 20 7b 7d 20 36 20 7b  2 .  } {3 {} 6 {
1d20: 7d 20 39 20 7b 7d 20 34 20 65 69 67 68 74 20 38  } 9 {} 4 eight 8
1d30: 20 65 69 67 68 74 20 35 20 66 69 76 65 20 32 20   eight 5 five 2 
1d40: 66 6f 75 72 20 34 20 66 6f 75 72 20 37 20 66 6f  four 4 four 7 fo
1d50: 75 72 74 65 65 6e 20 31 20 6f 6e 65 20 37 20 73  urteen 1 one 7 s
1d60: 65 76 65 6e 20 38 20 73 69 78 74 65 65 6e 20 35  even 8 sixteen 5
1d70: 20 74 65 6e 20 31 30 20 74 65 6e 20 31 30 20 74   ten 10 ten 10 t
1d80: 77 65 6e 74 79 20 31 20 74 77 6f 20 32 20 74 77  wenty 1 two 2 tw
1d90: 6f 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  o}..  test_compo
1da0: 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70  und_select_flipp
1db0: 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 31 2e 24  able select9-1.$
1dc0: 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 30 20 7b 0a  iOuterLoop.10 {.
1dd0: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
1de0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
1df0: 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74  LECT d, e FROM t
1e00: 32 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32 0a  2 ORDER BY 1, 2.
1e10: 20 20 7d 20 7b 31 20 6f 6e 65 20 31 20 74 77 6f    } {1 one 1 two
1e20: 20 32 20 66 6f 75 72 20 32 20 74 77 6f 20 33 20   2 four 2 two 3 
1e30: 7b 7d 20 34 20 65 69 67 68 74 20 34 20 66 6f 75  {} 4 eight 4 fou
1e40: 72 20 35 20 66 69 76 65 20 35 20 74 65 6e 20 36  r 5 five 5 ten 6
1e50: 20 7b 7d 20 37 20 66 6f 75 72 74 65 65 6e 20 37   {} 7 fourteen 7
1e60: 20 73 65 76 65 6e 20 38 20 65 69 67 68 74 20 38   seven 8 eight 8
1e70: 20 73 69 78 74 65 65 6e 20 39 20 7b 7d 20 31 30   sixteen 9 {} 10
1e80: 20 74 65 6e 20 31 30 20 74 77 65 6e 74 79 7d 0a   ten 10 twenty}.
1e90: 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64  .  test_compound
1ea0: 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c  _select_flippabl
1eb0: 65 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75  e select9-1.$iOu
1ec0: 74 65 72 4c 6f 6f 70 2e 31 31 20 7b 0a 20 20 20  terLoop.11 {.   
1ed0: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
1ee0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
1ef0: 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f  T d, e FROM t2 O
1f00: 52 44 45 52 20 42 59 20 32 2c 20 31 0a 20 20 7d  RDER BY 2, 1.  }
1f10: 20 7b 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d   {3 {} 6 {} 9 {}
1f20: 20 34 20 65 69 67 68 74 20 38 20 65 69 67 68 74   4 eight 8 eight
1f30: 20 35 20 66 69 76 65 20 32 20 66 6f 75 72 20 34   5 five 2 four 4
1f40: 20 66 6f 75 72 20 37 20 66 6f 75 72 74 65 65 6e   four 7 fourteen
1f50: 20 31 20 6f 6e 65 20 37 20 73 65 76 65 6e 20 38   1 one 7 seven 8
1f60: 20 73 69 78 74 65 65 6e 20 35 20 74 65 6e 20 31   sixteen 5 ten 1
1f70: 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74 79 20  0 ten 10 twenty 
1f80: 31 20 74 77 6f 20 32 20 74 77 6f 7d 0a 0a 20 20  1 two 2 two}..  
1f90: 23 20 54 65 73 74 20 73 6f 6d 65 20 32 2d 77 61  # Test some 2-wa
1fa0: 79 20 49 4e 54 45 52 53 45 43 54 20 71 75 65 72  y INTERSECT quer
1fb0: 69 65 73 2e 0a 20 20 23 0a 20 20 74 65 73 74 5f  ies..  #.  test_
1fc0: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20  compound_select 
1fd0: 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65  select9-1.$iOute
1fe0: 72 4c 6f 6f 70 2e 31 31 20 7b 0a 20 20 20 20 53  rLoop.11 {.    S
1ff0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2000: 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  t1 INTERSECT SEL
2010: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
2020: 20 0a 20 20 7d 20 7b 33 20 7b 7d 20 36 20 7b 7d   .  } {3 {} 6 {}
2030: 20 39 20 7b 7d 7d 0a 20 20 74 65 73 74 5f 63 6f   9 {}}.  test_co
2040: 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c  mpound_select_fl
2050: 69 70 70 61 62 6c 65 20 73 65 6c 65 63 74 39 2d  ippable select9-
2060: 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 32  1.$iOuterLoop.12
2070: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c   {.    SELECT a,
2080: 20 62 20 46 52 4f 4d 20 74 31 20 49 4e 54 45 52   b FROM t1 INTER
2090: 53 45 43 54 20 53 45 4c 45 43 54 20 64 2c 20 65  SECT SELECT d, e
20a0: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
20b0: 59 20 31 0a 20 20 7d 20 7b 33 20 7b 7d 20 36 20  Y 1.  } {3 {} 6 
20c0: 7b 7d 20 39 20 7b 7d 7d 0a 20 20 74 65 73 74 5f  {} 9 {}}.  test_
20d0: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20  compound_select 
20e0: 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65  select9-1.$iOute
20f0: 72 4c 6f 6f 70 2e 31 33 20 7b 0a 20 20 20 20 53  rLoop.13 {.    S
2100: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2110: 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45 4c  t1 INTERSECT SEL
2120: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
2130: 20 4f 52 44 45 52 20 42 59 20 32 0a 20 20 7d 20   ORDER BY 2.  } 
2140: 7b 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d 7d  {3 {} 6 {} 9 {}}
2150: 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64  .  test_compound
2160: 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c  _select_flippabl
2170: 65 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75  e select9-1.$iOu
2180: 74 65 72 4c 6f 6f 70 2e 31 34 20 7b 0a 20 20 20  terLoop.14 {.   
2190: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
21a0: 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53  M t1 INTERSECT S
21b0: 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20  ELECT d, e FROM 
21c0: 74 32 20 4f 52 44 45 52 20 42 59 20 32 2c 20 31  t2 ORDER BY 2, 1
21d0: 0a 20 20 7d 20 7b 33 20 7b 7d 20 36 20 7b 7d 20  .  } {3 {} 6 {} 
21e0: 39 20 7b 7d 7d 0a 20 20 74 65 73 74 5f 63 6f 6d  9 {}}.  test_com
21f0: 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69  pound_select_fli
2200: 70 70 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 31  ppable select9-1
2210: 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 35 20  .$iOuterLoop.15 
2220: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20  {.    SELECT a, 
2230: 62 20 46 52 4f 4d 20 74 31 20 49 4e 54 45 52 53  b FROM t1 INTERS
2240: 45 43 54 20 53 45 4c 45 43 54 20 64 2c 20 65 20  ECT SELECT d, e 
2250: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
2260: 20 31 2c 20 32 0a 20 20 7d 20 7b 33 20 7b 7d 20   1, 2.  } {3 {} 
2270: 36 20 7b 7d 20 39 20 7b 7d 7d 0a 0a 20 20 23 20  6 {} 9 {}}..  # 
2280: 54 65 73 74 20 73 6f 6d 65 20 32 2d 77 61 79 20  Test some 2-way 
2290: 45 58 43 45 50 54 20 71 75 65 72 69 65 73 2e 0a  EXCEPT queries..
22a0: 20 20 23 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f    #.  test_compo
22b0: 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63  und_select selec
22c0: 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-1.$iOuterLoop
22d0: 2e 31 36 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  .16 {.    SELECT
22e0: 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 45 58   a, b FROM t1 EX
22f0: 43 45 50 54 20 53 45 4c 45 43 54 20 64 2c 20 65  CEPT SELECT d, e
2300: 20 46 52 4f 4d 20 74 32 20 0a 20 20 7d 20 7b 31   FROM t2 .  } {1
2310: 20 6f 6e 65 20 32 20 74 77 6f 20 34 20 66 6f 75   one 2 two 4 fou
2320: 72 20 35 20 66 69 76 65 20 37 20 73 65 76 65 6e  r 5 five 7 seven
2330: 20 38 20 65 69 67 68 74 20 31 30 20 74 65 6e 7d   8 eight 10 ten}
2340: 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e  ..  test_compoun
2350: 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63 74 39  d_select select9
2360: 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 31  -1.$iOuterLoop.1
2370: 37 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  7 {.    SELECT a
2380: 2c 20 62 20 46 52 4f 4d 20 74 31 20 45 58 43 45  , b FROM t1 EXCE
2390: 50 54 20 53 45 4c 45 43 54 20 64 2c 20 65 20 46  PT SELECT d, e F
23a0: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
23b0: 31 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20  1 .  } {1 one 2 
23c0: 74 77 6f 20 34 20 66 6f 75 72 20 35 20 66 69 76  two 4 four 5 fiv
23d0: 65 20 37 20 73 65 76 65 6e 20 38 20 65 69 67 68  e 7 seven 8 eigh
23e0: 74 20 31 30 20 74 65 6e 7d 0a 0a 20 20 74 65 73  t 10 ten}..  tes
23f0: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
2400: 74 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75  t select9-1.$iOu
2410: 74 65 72 4c 6f 6f 70 2e 31 38 20 7b 0a 20 20 20  terLoop.18 {.   
2420: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
2430: 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
2440: 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32 20  CT d, e FROM t2 
2450: 4f 52 44 45 52 20 42 59 20 32 20 0a 20 20 7d 20  ORDER BY 2 .  } 
2460: 7b 38 20 65 69 67 68 74 20 35 20 66 69 76 65 20  {8 eight 5 five 
2470: 34 20 66 6f 75 72 20 31 20 6f 6e 65 20 37 20 73  4 four 1 one 7 s
2480: 65 76 65 6e 20 31 30 20 74 65 6e 20 32 20 74 77  even 10 ten 2 tw
2490: 6f 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  o}..  test_compo
24a0: 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63  und_select selec
24b0: 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-1.$iOuterLoop
24c0: 2e 31 39 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  .19 {.    SELECT
24d0: 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 45 58   a, b FROM t1 EX
24e0: 43 45 50 54 20 53 45 4c 45 43 54 20 64 2c 20 65  CEPT SELECT d, e
24f0: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
2500: 59 20 31 2c 20 32 0a 20 20 7d 20 7b 31 20 6f 6e  Y 1, 2.  } {1 on
2510: 65 20 32 20 74 77 6f 20 34 20 66 6f 75 72 20 35  e 2 two 4 four 5
2520: 20 66 69 76 65 20 37 20 73 65 76 65 6e 20 38 20   five 7 seven 8 
2530: 65 69 67 68 74 20 31 30 20 74 65 6e 7d 0a 0a 20  eight 10 ten}.. 
2540: 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73   test_compound_s
2550: 65 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e  elect select9-1.
2560: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 32 30 20 7b  $iOuterLoop.20 {
2570: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
2580: 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
2590: 53 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d  SELECT d, e FROM
25a0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 32 2c 20   t2 ORDER BY 2, 
25b0: 31 0a 20 20 7d 20 7b 38 20 65 69 67 68 74 20 35  1.  } {8 eight 5
25c0: 20 66 69 76 65 20 34 20 66 6f 75 72 20 31 20 6f   five 4 four 1 o
25d0: 6e 65 20 37 20 73 65 76 65 6e 20 31 30 20 74 65  ne 7 seven 10 te
25e0: 6e 20 32 20 74 77 6f 7d 0a 0a 20 20 69 6e 63 72  n 2 two}..  incr
25f0: 20 69 4f 75 74 65 72 4c 6f 6f 70 0a 7d 0a 0a 64   iOuterLoop.}..d
2600: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 32  o_test select9-2
2610: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
2620: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
2630: 69 31 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  i1;.    DROP IND
2640: 45 58 20 69 32 3b 0a 20 20 20 20 44 52 4f 50 20  EX i2;.    DROP 
2650: 49 4e 44 45 58 20 69 33 3b 0a 20 20 20 20 44 52  INDEX i3;.    DR
2660: 4f 50 20 49 4e 44 45 58 20 69 34 3b 0a 20 20 7d  OP INDEX i4;.  }
2670: 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 72 65 76 65  .} {}..proc reve
2680: 72 73 65 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a  rse {lhs rhs} {.
2690: 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67    return [string
26a0: 20 63 6f 6d 70 61 72 65 20 24 72 68 73 20 24 6c   compare $rhs $l
26b0: 68 73 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65  hs].}.db collate
26c0: 20 72 65 76 65 72 73 65 20 72 65 76 65 72 73 65   reverse reverse
26d0: 0a 0a 23 20 54 68 69 73 20 6c 6f 6f 70 20 69 73  ..# This loop is
26e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
26f0: 70 72 65 76 69 6f 75 73 20 6f 6e 65 20 28 74 65  previous one (te
2700: 73 74 20 63 61 73 65 73 20 73 65 6c 65 63 74 39  st cases select9
2710: 2d 31 2e 2a 29 20 0a 23 20 65 78 63 65 70 74 20  -1.*) .# except 
2720: 74 68 61 74 20 74 68 65 20 73 69 6d 70 6c 65 20  that the simple 
2730: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
2740: 73 20 68 61 76 65 20 57 48 45 52 45 20 63 6c 61  s have WHERE cla
2750: 75 73 65 73 20 61 74 74 61 63 68 65 64 0a 23 20  uses attached.# 
2760: 74 6f 20 74 68 65 6d 2e 20 53 6f 6d 65 74 69 6d  to them. Sometim
2770: 65 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  es the WHERE cla
2780: 75 73 65 20 6d 61 79 20 62 65 20 73 61 74 69 73  use may be satis
2790: 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  fied using the s
27a0: 61 6d 65 0a 23 20 69 6e 64 65 78 20 75 73 65 64  ame.# index used
27b0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2c 20 73   for ORDER BY, s
27c0: 6f 6d 65 74 69 6d 65 73 20 6e 6f 74 2e 0a 23 0a  ometimes not..#.
27d0: 73 65 74 20 69 4f 75 74 65 72 4c 6f 6f 70 20 31  set iOuterLoop 1
27e0: 0a 66 6f 72 65 61 63 68 20 69 6e 64 65 78 65 73  .foreach indexes
27f0: 20 5b 6c 69 73 74 20 7b 0a 20 20 2f 2a 20 44 6f   [list {.  /* Do
2800: 20 6e 6f 74 20 63 72 65 61 74 65 20 61 6e 79 20   not create any 
2810: 69 6e 64 65 78 65 73 2e 20 2a 2f 0a 7d 20 7b 0a  indexes. */.} {.
2820: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
2830: 31 20 4f 4e 20 74 31 28 61 29 0a 7d 20 7b 0a 20  1 ON t1(a).} {. 
2840: 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b 0a   DROP INDEX i1;.
2850: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
2860: 31 20 4f 4e 20 74 31 28 62 2c 20 61 29 0a 7d 20  1 ON t1(b, a).} 
2870: 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  {.  CREATE INDEX
2880: 20 69 32 20 4f 4e 20 74 32 28 64 20 44 45 53 43   i2 ON t2(d DESC
2890: 2c 20 65 20 43 4f 4c 4c 41 54 45 20 52 45 56 45  , e COLLATE REVE
28a0: 52 53 45 20 41 53 43 29 3b 0a 7d 20 7b 0a 20 20  RSE ASC);.} {.  
28b0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
28c0: 4f 4e 20 74 31 28 61 20 44 45 53 43 29 3b 0a 7d  ON t1(a DESC);.}
28d0: 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 65  ] {.  do_test se
28e0: 6c 65 63 74 39 2d 32 2e 24 69 4f 75 74 65 72 4c  lect9-2.$iOuterL
28f0: 6f 6f 70 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  oop.1 {.    exec
2900: 73 71 6c 20 24 69 6e 64 65 78 65 73 0a 20 20 7d  sql $indexes.  }
2910: 20 7b 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70   {}..  test_comp
2920: 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70  ound_select_flip
2930: 70 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 32 2e  pable select9-2.
2940: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 32 20 7b 0a  $iOuterLoop.2 {.
2950: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2960: 4d 20 74 31 20 57 48 45 52 45 20 61 3c 35 20 55  M t1 WHERE a<5 U
2970: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  NION SELECT * FR
2980: 4f 4d 20 74 32 20 57 48 45 52 45 20 64 3e 3d 35  OM t2 WHERE d>=5
2990: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 20   ORDER BY 1.  } 
29a0: 7b 31 20 6f 6e 65 20 49 20 32 20 74 77 6f 20 49  {1 one I 2 two I
29b0: 49 20 33 20 7b 7d 20 7b 7d 20 34 20 66 6f 75 72  I 3 {} {} 4 four
29c0: 20 49 56 20 35 20 74 65 6e 20 58 58 20 36 20 7b   IV 5 ten XX 6 {
29d0: 7d 20 7b 7d 20 37 20 66 6f 75 72 74 65 65 6e 20  } {} 7 fourteen 
29e0: 58 58 56 49 49 49 20 38 20 73 69 78 74 65 65 6e  XXVIII 8 sixteen
29f0: 20 58 58 58 49 49 20 39 20 7b 7d 20 7b 7d 20 31   XXXII 9 {} {} 1
2a00: 30 20 74 77 65 6e 74 79 20 58 4c 7d 0a 0a 20 20  0 twenty XL}..  
2a10: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
2a20: 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c 65 20 73  lect_flippable s
2a30: 65 6c 65 63 74 39 2d 32 2e 24 69 4f 75 74 65 72  elect9-2.$iOuter
2a40: 4c 6f 6f 70 2e 32 20 7b 0a 20 20 20 20 53 45 4c  Loop.2 {.    SEL
2a50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2a60: 45 52 45 20 61 3c 35 20 55 4e 49 4f 4e 20 53 45  ERE a<5 UNION SE
2a70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
2a80: 48 45 52 45 20 64 3e 3d 35 20 4f 52 44 45 52 20  HERE d>=5 ORDER 
2a90: 42 59 20 32 2c 20 31 0a 20 20 7d 20 7b 33 20 7b  BY 2, 1.  } {3 {
2aa0: 7d 20 7b 7d 20 36 20 7b 7d 20 7b 7d 20 39 20 7b  } {} 6 {} {} 9 {
2ab0: 7d 20 7b 7d 20 34 20 66 6f 75 72 20 49 56 20 37  } {} 4 four IV 7
2ac0: 20 66 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49   fourteen XXVIII
2ad0: 20 31 20 6f 6e 65 20 49 20 38 20 73 69 78 74 65   1 one I 8 sixte
2ae0: 65 6e 20 58 58 58 49 49 20 35 20 74 65 6e 20 58  en XXXII 5 ten X
2af0: 58 20 31 30 20 74 77 65 6e 74 79 20 58 4c 20 32  X 10 twenty XL 2
2b00: 20 74 77 6f 20 49 49 7d 0a 0a 20 20 74 65 73 74   two II}..  test
2b10: 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  _compound_select
2b20: 5f 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65 63  _flippable selec
2b30: 74 39 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-2.$iOuterLoop
2b40: 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .3 {.    SELECT 
2b50: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
2b60: 61 3c 35 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  a<5 UNION SELECT
2b70: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
2b80: 20 64 3e 3d 35 20 0a 20 20 20 20 4f 52 44 45 52   d>=5 .    ORDER
2b90: 20 42 59 20 32 20 43 4f 4c 4c 41 54 45 20 72 65   BY 2 COLLATE re
2ba0: 76 65 72 73 65 2c 20 31 0a 20 20 7d 20 7b 33 20  verse, 1.  } {3 
2bb0: 7b 7d 20 7b 7d 20 36 20 7b 7d 20 7b 7d 20 39 20  {} {} 6 {} {} 9 
2bc0: 7b 7d 20 7b 7d 20 32 20 74 77 6f 20 49 49 20 31  {} {} 2 two II 1
2bd0: 30 20 74 77 65 6e 74 79 20 58 4c 20 35 20 74 65  0 twenty XL 5 te
2be0: 6e 20 58 58 20 38 20 73 69 78 74 65 65 6e 20 58  n XX 8 sixteen X
2bf0: 58 58 49 49 20 31 20 6f 6e 65 20 49 20 37 20 66  XXII 1 one I 7 f
2c00: 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49 20 34  ourteen XXVIII 4
2c10: 20 66 6f 75 72 20 49 56 7d 0a 0a 20 20 74 65 73   four IV}..  tes
2c20: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
2c30: 74 5f 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65  t_flippable sele
2c40: 63 74 39 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-2.$iOuterLoo
2c50: 70 2e 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  p.4 {.    SELECT
2c60: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2c70: 20 61 3c 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53   a<5 UNION ALL S
2c80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
2c90: 57 48 45 52 45 20 64 3e 3d 35 20 4f 52 44 45 52  WHERE d>=5 ORDER
2ca0: 20 42 59 20 31 0a 20 20 7d 20 7b 31 20 6f 6e 65   BY 1.  } {1 one
2cb0: 20 49 20 32 20 74 77 6f 20 49 49 20 33 20 7b 7d   I 2 two II 3 {}
2cc0: 20 7b 7d 20 34 20 66 6f 75 72 20 49 56 20 35 20   {} 4 four IV 5 
2cd0: 74 65 6e 20 58 58 20 36 20 7b 7d 20 7b 7d 20 37  ten XX 6 {} {} 7
2ce0: 20 66 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49   fourteen XXVIII
2cf0: 20 38 20 73 69 78 74 65 65 6e 20 58 58 58 49 49   8 sixteen XXXII
2d00: 20 39 20 7b 7d 20 7b 7d 20 31 30 20 74 77 65 6e   9 {} {} 10 twen
2d10: 74 79 20 58 4c 7d 0a 0a 20 20 74 65 73 74 5f 63  ty XL}..  test_c
2d20: 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66  ompound_select_f
2d30: 6c 69 70 70 61 62 6c 65 20 73 65 6c 65 63 74 39  lippable select9
2d40: 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 35  -2.$iOuterLoop.5
2d50: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2d60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c  FROM t1 WHERE a<
2d70: 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
2d80: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
2d90: 52 45 20 64 3e 3d 35 20 4f 52 44 45 52 20 42 59  RE d>=5 ORDER BY
2da0: 20 32 2c 20 31 0a 20 20 7d 20 7b 33 20 7b 7d 20   2, 1.  } {3 {} 
2db0: 7b 7d 20 36 20 7b 7d 20 7b 7d 20 39 20 7b 7d 20  {} 6 {} {} 9 {} 
2dc0: 7b 7d 20 34 20 66 6f 75 72 20 49 56 20 37 20 66  {} 4 four IV 7 f
2dd0: 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49 20 31  ourteen XXVIII 1
2de0: 20 6f 6e 65 20 49 20 38 20 73 69 78 74 65 65 6e   one I 8 sixteen
2df0: 20 58 58 58 49 49 20 35 20 74 65 6e 20 58 58 20   XXXII 5 ten XX 
2e00: 31 30 20 74 77 65 6e 74 79 20 58 4c 20 32 20 74  10 twenty XL 2 t
2e10: 77 6f 20 49 49 7d 0a 0a 20 20 74 65 73 74 5f 63  wo II}..  test_c
2e20: 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66  ompound_select_f
2e30: 6c 69 70 70 61 62 6c 65 20 73 65 6c 65 63 74 39  lippable select9
2e40: 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 36  -2.$iOuterLoop.6
2e50: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2e60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c  FROM t1 WHERE a<
2e70: 35 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  5 UNION ALL SELE
2e80: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
2e90: 52 45 20 64 3e 3d 35 20 0a 20 20 20 20 4f 52 44  RE d>=5 .    ORD
2ea0: 45 52 20 42 59 20 32 20 43 4f 4c 4c 41 54 45 20  ER BY 2 COLLATE 
2eb0: 72 65 76 65 72 73 65 2c 20 31 0a 20 20 7d 20 7b  reverse, 1.  } {
2ec0: 33 20 7b 7d 20 7b 7d 20 36 20 7b 7d 20 7b 7d 20  3 {} {} 6 {} {} 
2ed0: 39 20 7b 7d 20 7b 7d 20 32 20 74 77 6f 20 49 49  9 {} {} 2 two II
2ee0: 20 31 30 20 74 77 65 6e 74 79 20 58 4c 20 35 20   10 twenty XL 5 
2ef0: 74 65 6e 20 58 58 20 38 20 73 69 78 74 65 65 6e  ten XX 8 sixteen
2f00: 20 58 58 58 49 49 20 31 20 6f 6e 65 20 49 20 37   XXXII 1 one I 7
2f10: 20 66 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49   fourteen XXVIII
2f20: 20 34 20 66 6f 75 72 20 49 56 7d 0a 0a 20 20 74   4 four IV}..  t
2f30: 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c  est_compound_sel
2f40: 65 63 74 20 73 65 6c 65 63 74 39 2d 32 2e 24 69  ect select9-2.$i
2f50: 4f 75 74 65 72 4c 6f 6f 70 2e 34 20 7b 0a 20 20  OuterLoop.4 {.  
2f60: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
2f70: 74 31 20 57 48 45 52 45 20 61 3c 38 20 45 58 43  t1 WHERE a<8 EXC
2f80: 45 50 54 20 53 45 4c 45 43 54 20 64 20 46 52 4f  EPT SELECT d FRO
2f90: 4d 20 74 32 20 57 48 45 52 45 20 64 3c 3d 33 20  M t2 WHERE d<=3 
2fa0: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 20 7b  ORDER BY 1.  } {
2fb0: 34 20 35 20 36 20 37 7d 0a 0a 20 20 74 65 73 74  4 5 6 7}..  test
2fc0: 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  _compound_select
2fd0: 20 73 65 6c 65 63 74 39 2d 32 2e 24 69 4f 75 74   select9-2.$iOut
2fe0: 65 72 4c 6f 6f 70 2e 34 20 7b 0a 20 20 20 20 53  erLoop.4 {.    S
2ff0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
3000: 57 48 45 52 45 20 61 3c 38 20 49 4e 54 45 52 53  WHERE a<8 INTERS
3010: 45 43 54 20 53 45 4c 45 43 54 20 64 20 46 52 4f  ECT SELECT d FRO
3020: 4d 20 74 32 20 57 48 45 52 45 20 64 3c 3d 33 20  M t2 WHERE d<=3 
3030: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 20 7b  ORDER BY 1.  } {
3040: 31 20 32 20 33 7d 0a 0a 7d 0a 0a 64 6f 5f 74 65  1 2 3}..}..do_te
3050: 73 74 20 73 65 6c 65 63 74 39 2d 32 2e 58 20 7b  st select9-2.X {
3060: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3070: 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b 0a   DROP INDEX i1;.
3080: 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69      DROP INDEX i
3090: 32 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45  2;.    DROP INDE
30a0: 58 20 69 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  X i3;.  }.} {}..
30b0: 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  # This procedure
30c0: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 53 51   executes the SQ
30d0: 4c 2e 20 20 54 68 65 6e 20 69 74 20 63 68 65 63  L.  Then it chec
30e0: 6b 73 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  ks the generated
30f0: 20 70 72 6f 67 72 61 6d 0a 23 20 66 6f 72 20 74   program.# for t
3100: 68 65 20 53 51 4c 20 61 6e 64 20 61 70 70 65 6e  he SQL and appen
3110: 64 73 20 61 20 22 6e 6f 73 6f 72 74 22 20 74 6f  ds a "nosort" to
3120: 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 74   the result if t
3130: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 6e 74 61  he program conta
3140: 69 6e 73 20 74 68 65 0a 23 20 53 6f 72 74 43 61  ins the.# SortCa
3150: 6c 6c 62 61 63 6b 20 6f 70 63 6f 64 65 2e 20 20  llback opcode.  
3160: 49 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 64  If the program d
3170: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
3180: 74 68 65 20 53 6f 72 74 43 61 6c 6c 62 61 63 6b  the SortCallback
3190: 0a 23 20 6f 70 63 6f 64 65 20 69 74 20 61 70 70  .# opcode it app
31a0: 65 6e 64 73 20 22 73 6f 72 74 22 0a 23 0a 70 72  ends "sort".#.pr
31b0: 6f 63 20 63 6b 73 6f 72 74 20 7b 73 71 6c 7d 20  oc cksort {sql} 
31c0: 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65  {.  set ::sqlite
31d0: 5f 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20  _sort_count 0.  
31e0: 73 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71  set data [execsq
31f0: 6c 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a  l $sql].  if {$:
3200: 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75  :sqlite_sort_cou
3210: 6e 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d  nt} {set x sort}
3220: 20 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a   {set x nosort}.
3230: 20 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24    lappend data $
3240: 78 0a 20 20 72 65 74 75 72 6e 20 24 64 61 74 61  x.  return $data
3250: 0a 7d 0a 0a 23 20 49 66 20 74 68 65 20 72 69 67  .}..# If the rig
3260: 68 74 20 69 6e 64 65 78 65 73 20 65 78 69 73 74  ht indexes exist
3270: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
3280: 71 75 65 72 79 3a 0a 23 0a 23 20 20 20 20 20 53  query:.#.#     S
3290: 45 4c 45 43 54 20 74 31 2e 61 20 46 52 4f 4d 20  ELECT t1.a FROM 
32a0: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
32b0: 45 43 54 20 74 32 2e 64 20 46 52 4f 4d 20 74 32  ECT t2.d FROM t2
32c0: 20 4f 52 44 45 52 20 42 59 20 31 0a 23 0a 23 20   ORDER BY 1.#.# 
32d0: 63 61 6e 20 75 73 65 20 69 6e 64 65 78 65 73 20  can use indexes 
32e0: 74 6f 20 72 75 6e 20 77 69 74 68 6f 75 74 20 64  to run without d
32f0: 6f 69 6e 67 20 61 20 69 6e 2d 6d 65 6d 6f 72 79  oing a in-memory
3300: 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e   sort operation.
3310: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
3320: 20 74 65 73 74 73 20 28 73 65 6c 65 63 74 39 2d   tests (select9-
3330: 33 2e 2a 29 20 69 73 20 75 73 65 64 20 74 6f 20  3.*) is used to 
3340: 63 68 65 63 6b 20 69 66 20 74 68 65 20 73 61 6d  check if the sam
3350: 65 20 0a 23 20 69 73 20 70 6f 73 73 69 62 6c 65  e .# is possible
3360: 20 77 69 74 68 3a 0a 23 0a 23 20 20 20 20 20 43   with:.#.#     C
3370: 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53  REATE VIEW v1 AS
3380: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
3390: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
33a0: 43 54 20 64 20 46 52 4f 4d 20 74 32 0a 23 20 20  CT d FROM t2.#  
33b0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
33c0: 20 76 31 20 4f 52 44 45 52 20 42 59 20 31 0a 23   v1 ORDER BY 1.#
33d0: 0a 23 20 49 74 20 74 75 72 6e 73 20 6f 75 74 20  .# It turns out 
33e0: 74 68 61 74 20 69 74 20 69 73 2e 0a 23 0a 64 6f  that it is..#.do
33f0: 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 33 2e  _test select9-3.
3400: 31 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53  1 {.  cksort { S
3410: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
3420: 4f 52 44 45 52 20 42 59 20 31 20 7d 0a 7d 20 7b  ORDER BY 1 }.} {
3430: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3440: 39 20 31 30 20 73 6f 72 74 7d 0a 64 6f 5f 74 65  9 10 sort}.do_te
3450: 73 74 20 73 65 6c 65 63 74 39 2d 33 2e 32 20 7b  st select9-3.2 {
3460: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
3470: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
3480: 74 31 28 61 29 20 7d 0a 20 20 63 6b 73 6f 72 74  t1(a) }.  cksort
3490: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
34a0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 7d   t1 ORDER BY 1 }
34b0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
34c0: 37 20 38 20 39 20 31 30 20 6e 6f 73 6f 72 74 7d  7 8 9 10 nosort}
34d0: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39  .do_test select9
34e0: 2d 33 2e 33 20 7b 0a 20 20 63 6b 73 6f 72 74 20  -3.3 {.  cksort 
34f0: 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  { SELECT a FROM 
3500: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
3510: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 4f 52  ECT d FROM t2 OR
3520: 44 45 52 20 42 59 20 31 20 4c 49 4d 49 54 20 35  DER BY 1 LIMIT 5
3530: 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20   }.} {1 1 2 2 3 
3540: 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65  sort}.do_test se
3550: 6c 65 63 74 39 2d 33 2e 34 20 7b 0a 20 20 65 78  lect9-3.4 {.  ex
3560: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 49  ecsql { CREATE I
3570: 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28 64 29  NDEX i2 ON t2(d)
3580: 20 7d 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53 45   }.  cksort { SE
3590: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
35a0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
35b0: 64 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  d FROM t2 ORDER 
35c0: 42 59 20 31 20 4c 49 4d 49 54 20 35 20 7d 0a 7d  BY 1 LIMIT 5 }.}
35d0: 20 7b 31 20 31 20 32 20 32 20 33 20 6e 6f 73 6f   {1 1 2 2 3 noso
35e0: 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65  rt}.do_test sele
35f0: 63 74 39 2d 33 2e 35 20 7b 0a 20 20 65 78 65 63  ct9-3.5 {.  exec
3600: 73 71 6c 20 7b 20 43 52 45 41 54 45 20 56 49 45  sql { CREATE VIE
3610: 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 61  W v1 AS SELECT a
3620: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
3630: 4c 4c 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d  LL SELECT d FROM
3640: 20 74 32 20 7d 0a 20 20 63 6b 73 6f 72 74 20 7b   t2 }.  cksort {
3650: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 76   SELECT a FROM v
3660: 31 20 4f 52 44 45 52 20 42 59 20 31 20 4c 49 4d  1 ORDER BY 1 LIM
3670: 49 54 20 35 20 7d 0a 7d 20 7b 31 20 31 20 32 20  IT 5 }.} {1 1 2 
3680: 32 20 33 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74  2 3 nosort}.do_t
3690: 65 73 74 20 73 65 6c 65 63 74 39 2d 33 2e 58 20  est select9-3.X 
36a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
36b0: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b    DROP INDEX i1;
36c0: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
36d0: 69 32 3b 0a 20 20 20 20 44 52 4f 50 20 56 49 45  i2;.    DROP VIE
36e0: 57 20 76 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  W v1;.  }.} {}..
36f0: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20  # This block of 
3700: 74 65 73 74 73 20 69 73 20 74 68 65 20 73 61 6d  tests is the sam
3710: 65 20 61 73 20 74 68 65 20 70 72 65 63 65 64 69  e as the precedi
3720: 6e 67 20 6f 6e 65 2c 20 65 78 63 65 70 74 20 74  ng one, except t
3730: 68 61 74 0a 23 20 22 55 4e 49 4f 4e 22 20 69 73  hat.# "UNION" is
3740: 20 74 65 73 74 65 64 20 69 6e 73 74 65 61 64 20   tested instead 
3750: 6f 66 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 2e 0a  of "UNION ALL"..
3760: 23 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  #.do_test select
3770: 39 2d 34 2e 31 20 7b 0a 20 20 63 6b 73 6f 72 74  9-4.1 {.  cksort
3780: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
3790: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 7d   t1 ORDER BY 1 }
37a0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
37b0: 37 20 38 20 39 20 31 30 20 73 6f 72 74 7d 0a 64  7 8 9 10 sort}.d
37c0: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 34  o_test select9-4
37d0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
37e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
37f0: 20 4f 4e 20 74 31 28 61 29 20 7d 0a 20 20 63 6b   ON t1(a) }.  ck
3800: 73 6f 72 74 20 7b 20 53 45 4c 45 43 54 20 61 20  sort { SELECT a 
3810: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
3820: 20 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20   1 }.} {1 2 3 4 
3830: 35 20 36 20 37 20 38 20 39 20 31 30 20 6e 6f 73  5 6 7 8 9 10 nos
3840: 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  ort}.do_test sel
3850: 65 63 74 39 2d 34 2e 33 20 7b 0a 20 20 63 6b 73  ect9-4.3 {.  cks
3860: 6f 72 74 20 7b 20 53 45 4c 45 43 54 20 61 20 46  ort { SELECT a F
3870: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
3880: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 4f 52  ECT d FROM t2 OR
3890: 44 45 52 20 42 59 20 31 20 4c 49 4d 49 54 20 35  DER BY 1 LIMIT 5
38a0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
38b0: 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65  sort}.do_test se
38c0: 6c 65 63 74 39 2d 34 2e 34 20 7b 0a 20 20 65 78  lect9-4.4 {.  ex
38d0: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 49  ecsql { CREATE I
38e0: 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28 64 29  NDEX i2 ON t2(d)
38f0: 20 7d 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53 45   }.  cksort { SE
3900: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
3910: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 20 46 52  NION SELECT d FR
3920: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31  OM t2 ORDER BY 1
3930: 20 4c 49 4d 49 54 20 35 20 7d 0a 7d 20 7b 31 20   LIMIT 5 }.} {1 
3940: 32 20 33 20 34 20 35 20 6e 6f 73 6f 72 74 7d 0a  2 3 4 5 nosort}.
3950: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d  do_test select9-
3960: 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.5 {.  execsql 
3970: 7b 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31  { CREATE VIEW v1
3980: 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
3990: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
39a0: 54 20 64 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20  T d FROM t2 }.  
39b0: 63 6b 73 6f 72 74 20 7b 20 53 45 4c 45 43 54 20  cksort { SELECT 
39c0: 61 20 46 52 4f 4d 20 76 31 20 4f 52 44 45 52 20  a FROM v1 ORDER 
39d0: 42 59 20 31 20 4c 49 4d 49 54 20 35 20 7d 0a 7d  BY 1 LIMIT 5 }.}
39e0: 20 7b 31 20 32 20 33 20 34 20 35 20 73 6f 72 74   {1 2 3 4 5 sort
39f0: 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74  }.do_test select
3a00: 39 2d 34 2e 58 20 7b 0a 20 20 65 78 65 63 73 71  9-4.X {.  execsq
3a10: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  l {.    DROP IND
3a20: 45 58 20 69 31 3b 0a 20 20 20 20 44 52 4f 50 20  EX i1;.    DROP 
3a30: 49 4e 44 45 58 20 69 32 3b 0a 20 20 20 20 44 52  INDEX i2;.    DR
3a40: 4f 50 20 56 49 45 57 20 76 31 3b 0a 20 20 7d 0a  OP VIEW v1;.  }.
3a50: 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 69 6e 67 20  } {}..# Testing 
3a60: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
3a70: 74 20 71 75 65 72 69 65 73 20 69 6e 76 6f 6c 76  t queries involv
3a80: 69 6e 67 20 61 20 76 69 65 77 20 6f 66 20 61 20  ing a view of a 
3a90: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a  compound select.
3aa0: 23 20 61 72 65 20 70 6c 61 6e 6e 65 64 20 65 66  # are planned ef
3ab0: 66 69 63 69 65 6e 74 6c 79 2e 20 20 54 68 69 73  ficiently.  This
3ac0: 20 64 65 74 65 63 74 73 20 61 20 70 72 6f 62 6c   detects a probl
3ad0: 65 6d 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74  em reported on t
3ae0: 68 65 20 6d 61 69 6c 69 6e 67 0a 23 20 6c 69 73  he mailing.# lis
3af0: 74 20 6f 6e 20 32 30 31 32 2d 30 34 2d 32 36 2e  t on 2012-04-26.
3b00: 20 20 53 65 65 0a 23 0a 23 20 20 68 74 74 70 3a    See.#.#  http:
3b10: 2f 2f 77 77 77 2e 6d 61 69 6c 2d 61 72 63 68 69  //www.mail-archi
3b20: 76 65 2e 63 6f 6d 2f 73 71 6c 69 74 65 2d 75 73  ve.com/sqlite-us
3b30: 65 72 73 25 34 30 73 71 6c 69 74 65 2e 6f 72 67  ers%40sqlite.org
3b40: 2f 6d 73 67 36 39 37 34 36 2e 68 74 6d 6c 0a 23  /msg69746.html.#
3b50: 0a 23 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  .# For additiona
3b60: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 23  l information..#
3b70: 0a 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39  .do_test select9
3b80: 2d 35 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c  -5.1 {.  db eval
3b90: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
3ba0: 42 4c 45 20 74 35 31 28 78 2c 20 79 29 3b 0a 20  BLE t51(x, y);. 
3bb0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3bc0: 74 35 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 43  t52(x, y);.    C
3bd0: 52 45 41 54 45 20 56 49 45 57 20 76 35 20 61 73  REATE VIEW v5 as
3be0: 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78  .       SELECT x
3bf0: 2c 20 79 20 46 52 4f 4d 20 74 35 31 0a 20 20 20  , y FROM t51.   
3c00: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
3c10: 20 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 79       SELECT x, y
3c20: 20 46 52 4f 4d 20 74 35 32 3b 0a 20 20 20 20 43   FROM t52;.    C
3c30: 52 45 41 54 45 20 49 4e 44 45 58 20 74 35 31 78  REATE INDEX t51x
3c40: 20 4f 4e 20 74 35 31 28 78 29 3b 0a 20 20 20 20   ON t51(x);.    
3c50: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 35 32  CREATE INDEX t52
3c60: 78 20 4f 4e 20 74 35 32 28 78 29 3b 0a 20 20 20  x ON t52(x);.   
3c70: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
3c80: 4c 41 4e 0a 20 20 20 20 20 20 20 53 45 4c 45 43  LAN.       SELEC
3c90: 54 20 2a 20 46 52 4f 4d 20 76 35 20 57 48 45 52  T * FROM v5 WHER
3ca0: 45 20 78 3d 27 31 32 33 34 35 27 20 4f 52 44 45  E x='12345' ORDE
3cb0: 52 20 42 59 20 79 3b 0a 20 20 7d 0a 7d 20 7b 7e  R BY y;.  }.} {~
3cc0: 2f 53 43 41 4e 20 54 41 42 4c 45 2f 7d 20 20 3b  /SCAN TABLE/}  ;
3cd0: 23 20 55 73 65 73 20 69 6e 64 69 63 65 73 20 77  # Uses indices w
3ce0: 69 74 68 20 22 2a 22 0a 64 6f 5f 74 65 73 74 20  ith "*".do_test 
3cf0: 73 65 6c 65 63 74 39 2d 35 2e 32 20 7b 0a 20 20  select9-5.2 {.  
3d00: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45 58  db eval {.    EX
3d10: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
3d20: 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78  .       SELECT x
3d30: 2c 20 79 20 46 52 4f 4d 20 76 35 20 57 48 45 52  , y FROM v5 WHER
3d40: 45 20 78 3d 27 31 32 33 34 35 27 20 4f 52 44 45  E x='12345' ORDE
3d50: 52 20 42 59 20 79 3b 0a 20 20 7d 0a 7d 20 7b 7e  R BY y;.  }.} {~
3d60: 2f 53 43 41 4e 20 54 41 42 4c 45 2f 7d 20 20 3b  /SCAN TABLE/}  ;
3d70: 23 20 55 73 65 73 20 69 6e 64 69 63 65 73 20 77  # Uses indices w
3d80: 69 74 68 20 22 78 2c 20 79 22 0a 64 6f 5f 74 65  ith "x, y".do_te
3d90: 73 74 20 73 65 6c 65 63 74 39 2d 35 2e 33 20 7b  st select9-5.3 {
3da0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
3db0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
3dc0: 4c 41 4e 0a 20 20 20 20 20 20 20 53 45 4c 45 43  LAN.       SELEC
3dd0: 54 20 78 2c 20 79 20 46 52 4f 4d 20 76 35 20 57  T x, y FROM v5 W
3de0: 48 45 52 45 20 2b 78 3d 27 31 32 33 34 35 27 20  HERE +x='12345' 
3df0: 4f 52 44 45 52 20 42 59 20 79 3b 0a 20 20 7d 0a  ORDER BY y;.  }.
3e00: 7d 20 7b 2f 53 43 41 4e 20 54 41 42 4c 45 2f 7d  } {/SCAN TABLE/}
3e10: 20 20 20 3b 23 20 46 75 6c 6c 20 74 61 62 6c 65     ;# Full table
3e20: 20 73 63 61 6e 20 69 66 20 74 68 65 20 22 2b 78   scan if the "+x
3e30: 22 20 70 72 65 76 65 6e 74 73 20 69 6e 64 65 78  " prevents index
3e40: 20 75 73 61 67 65 2e 0a 0a 23 20 32 30 31 33 2d   usage...# 2013-
3e50: 30 37 2d 30 39 3a 20 20 54 69 63 6b 65 74 20 5b  07-09:  Ticket [
3e60: 34 39 30 61 34 62 37 32 33 35 36 32 34 32 39 38  490a4b7235624298
3e70: 5d 3a 20 0a 23 20 22 57 48 45 52 45 20 30 22 20  ]: .# "WHERE 0" 
3e80: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
3e90: 6d 65 6e 74 20 6f 66 20 61 20 55 4e 49 4f 4e 20  ment of a UNION 
3ea0: 63 61 75 73 65 73 20 61 6e 20 61 73 73 65 72 74  causes an assert
3eb0: 69 6f 6e 20 66 61 75 6c 74 0a 23 0a 64 6f 5f 65  ion fault.#.do_e
3ec0: 78 65 63 73 71 6c 5f 74 65 73 74 20 73 65 6c 65  xecsql_test sele
3ed0: 63 74 39 2d 36 2e 31 20 7b 0a 20 20 43 52 45 41  ct9-6.1 {.  CREA
3ee0: 54 45 20 54 41 42 4c 45 20 74 36 31 28 61 29 3b  TE TABLE t61(a);
3ef0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
3f00: 74 36 32 28 62 29 3b 0a 20 20 49 4e 53 45 52 54  t62(b);.  INSERT
3f10: 20 49 4e 54 4f 20 74 36 31 20 56 41 4c 55 45 53   INTO t61 VALUES
3f20: 28 31 31 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  (111);.  INSERT 
3f30: 49 4e 54 4f 20 74 36 32 20 56 41 4c 55 45 53 28  INTO t62 VALUES(
3f40: 32 32 32 29 3b 0a 20 20 53 45 4c 45 43 54 20 61  222);.  SELECT a
3f50: 20 46 52 4f 4d 20 74 36 31 20 57 48 45 52 45 20   FROM t61 WHERE 
3f60: 30 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  0 UNION SELECT b
3f70: 20 46 52 4f 4d 20 74 36 32 3b 0a 7d 20 7b 32 32   FROM t62;.} {22
3f80: 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  2}.do_execsql_te
3f90: 73 74 20 73 65 6c 65 63 74 39 2d 36 2e 32 20 7b  st select9-6.2 {
3fa0: 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  .  SELECT a FROM
3fb0: 20 74 36 31 20 57 48 45 52 45 20 30 20 55 4e 49   t61 WHERE 0 UNI
3fc0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 62 20  ON ALL SELECT b 
3fd0: 46 52 4f 4d 20 74 36 32 3b 0a 7d 20 7b 32 32 32  FROM t62;.} {222
3fe0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
3ff0: 74 20 73 65 6c 65 63 74 39 2d 36 2e 33 20 7b 0a  t select9-6.3 {.
4000: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
4010: 74 36 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  t61 UNION SELECT
4020: 20 62 20 46 52 4f 4d 20 74 36 32 20 57 48 45 52   b FROM t62 WHER
4030: 45 20 30 3b 0a 7d 20 7b 31 31 31 7d 0a 0a 0a 0a  E 0;.} {111}....
4040: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.