/ Hex Artifact Content
Login

Artifact b4007b15396cb7ba2615cab31e1973b572e43210:


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 73 65 74 20 49 53  ter.tcl..#set IS
0370: 51 55 49 43 4b 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d  QUICK 1..#------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 2d 2d 0a 23 20 74 65 73 74 5f 63 6f 6d 70 6f  ---.# test_compo
03d0: 75 6e 64 5f 73 65 6c 65 63 74 20 54 45 53 54 4e  und_select TESTN
03e0: 41 4d 45 20 53 45 4c 45 43 54 20 52 45 53 55 4c  AME SELECT RESUL
03f0: 54 0a 23 0a 23 20 20 20 54 68 69 73 20 63 6f 6d  T.#.#   This com
0400: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
0410: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 4c 49 4d  run multiple LIM
0420: 49 54 2f 4f 46 46 53 45 54 20 74 65 73 74 20 63  IT/OFFSET test c
0430: 61 73 65 73 20 62 61 73 65 64 20 6f 6e 20 0a 23  ases based on .#
0440: 20 20 20 74 68 65 20 73 69 6e 67 6c 65 20 53 45     the single SE
0450: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
0460: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
0470: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ond argument. Th
0480: 65 20 53 45 4c 45 43 54 0a 23 20 20 20 73 74 61  e SELECT.#   sta
0490: 74 65 6d 65 6e 74 20 6d 61 79 20 6e 6f 74 20 63  tement may not c
04a0: 6f 6e 74 61 69 6e 20 61 20 4c 49 4d 49 54 20 6f  ontain a LIMIT o
04b0: 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 2e  r OFFSET clause.
04c0: 20 54 68 69 73 20 70 72 6f 63 20 74 65 73 74 73   This proc tests
04d0: 0a 23 20 20 20 6d 61 6e 79 20 73 74 61 74 65 6d  .#   many statem
04e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
04f0: 3a 0a 23 20 20 20 20 0a 23 20 20 20 20 20 22 24  :.#    .#     "$
0500: 53 45 4c 45 43 54 20 6c 69 6d 69 74 20 24 58 20  SELECT limit $X 
0510: 6f 66 66 73 65 74 20 24 59 22 0a 23 20 20 20 20  offset $Y".#    
0520: 0a 23 20 20 20 66 6f 72 20 76 61 72 69 6f 75 73  .#   for various
0530: 20 76 61 6c 75 65 73 20 6f 66 20 24 58 20 61 6e   values of $X an
0540: 64 20 24 59 2e 0a 23 20 20 20 20 0a 23 20 20 20  d $Y..#    .#   
0550: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
0560: 6e 74 2c 20 24 52 45 53 55 4c 54 2c 20 73 68 6f  nt, $RESULT, sho
0570: 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  uld contain the 
0580: 65 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20  expected result 
0590: 6f 66 0a 23 20 20 20 74 68 65 20 63 6f 6d 6d 61  of.#   the comma
05a0: 6e 64 20 5b 65 78 65 63 73 71 6c 20 24 53 45 4c  nd [execsql $SEL
05b0: 45 43 54 5d 2e 0a 23 20 20 20 20 0a 23 20 20 20  ECT]..#    .#   
05c0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
05d0: 6e 74 2c 20 24 54 45 53 54 4e 41 4d 45 2c 20 69  nt, $TESTNAME, i
05e0: 73 20 75 73 65 64 20 61 73 20 74 68 65 20 62 61  s used as the ba
05f0: 73 65 20 74 65 73 74 20 63 61 73 65 20 6e 61 6d  se test case nam
0600: 65 20 74 6f 0a 23 20 20 20 70 61 73 73 20 74 6f  e to.#   pass to
0610: 20 5b 64 6f 5f 74 65 73 74 5d 20 66 6f 72 20 65   [do_test] for e
0620: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 4c  ach individual L
0630: 49 4d 49 54 20 4f 46 46 53 45 54 20 74 65 73 74  IMIT OFFSET test
0640: 20 63 61 73 65 2e 0a 23 20 0a 70 72 6f 63 20 74   case..# .proc t
0650: 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c  est_compound_sel
0660: 65 63 74 20 7b 74 65 73 74 6e 61 6d 65 20 73 71  ect {testname sq
0670: 6c 20 72 65 73 75 6c 74 7d 20 7b 0a 0a 20 20 73  l result} {..  s
0680: 65 74 20 6e 43 6f 6c 20 31 0a 20 20 64 62 20 65  et nCol 1.  db e
0690: 76 61 6c 20 24 73 71 6c 20 41 20 7b 0a 20 20 20  val $sql A {.   
06a0: 20 73 65 74 20 6e 43 6f 6c 20 5b 6c 6c 65 6e 67   set nCol [lleng
06b0: 74 68 20 24 41 28 2a 29 5d 0a 20 20 20 20 62 72  th $A(*)].    br
06c0: 65 61 6b 0a 20 20 7d 0a 20 20 73 65 74 20 6e 52  eak.  }.  set nR
06d0: 6f 77 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  ow [expr {[lleng
06e0: 74 68 20 24 72 65 73 75 6c 74 5d 20 2f 20 24 6e  th $result] / $n
06f0: 43 6f 6c 7d 5d 0a 0a 20 20 73 65 74 20 3a 3a 63  Col}]..  set ::c
0700: 6f 6d 70 6f 75 6e 64 5f 73 71 6c 20 24 73 71 6c  ompound_sql $sql
0710: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
0720: 6e 61 6d 65 20 7b 20 0a 20 20 20 20 65 78 65 63  name { .    exec
0730: 73 71 6c 20 24 3a 3a 63 6f 6d 70 6f 75 6e 64 5f  sql $::compound_
0740: 73 71 6c 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a  sql.  } $result.
0750: 23 72 65 74 75 72 6e 0a 0a 20 20 73 65 74 20 69  #return..  set i
0760: 4c 69 6d 69 74 49 6e 63 72 20 20 31 0a 20 20 73  LimitIncr  1.  s
0770: 65 74 20 69 4f 66 66 73 65 74 49 6e 63 72 20 31  et iOffsetIncr 1
0780: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
0790: 73 74 73 20 3a 3a 49 53 51 55 49 43 4b 5d 20 26  sts ::ISQUICK] &
07a0: 26 20 24 3a 3a 49 53 51 55 49 43 4b 20 26 26 20  & $::ISQUICK && 
07b0: 24 6e 52 6f 77 3e 3d 35 7d 20 7b 0a 20 20 20 20  $nRow>=5} {.    
07c0: 73 65 74 20 69 4f 66 66 73 65 74 49 6e 63 72 20  set iOffsetIncr 
07d0: 5b 65 78 70 72 20 24 6e 52 6f 77 20 2f 20 35 5d  [expr $nRow / 5]
07e0: 0a 20 20 20 20 73 65 74 20 69 4c 69 6d 69 74 49  .    set iLimitI
07f0: 6e 63 72 20 5b 65 78 70 72 20 24 6e 52 6f 77 20  ncr [expr $nRow 
0800: 2f 20 35 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20  / 5].  }..  set 
0810: 69 4c 69 6d 69 74 45 6e 64 20 20 20 5b 65 78 70  iLimitEnd   [exp
0820: 72 20 24 6e 52 6f 77 2b 24 69 4c 69 6d 69 74 49  r $nRow+$iLimitI
0830: 6e 63 72 5d 0a 20 20 73 65 74 20 69 4f 66 66 73  ncr].  set iOffs
0840: 65 74 45 6e 64 20 20 5b 65 78 70 72 20 24 6e 52  etEnd  [expr $nR
0850: 6f 77 2b 24 69 4f 66 66 73 65 74 49 6e 63 72 5d  ow+$iOffsetIncr]
0860: 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 4f 66  ..  for {set iOf
0870: 66 73 65 74 20 30 7d 20 7b 24 69 4f 66 66 73 65  fset 0} {$iOffse
0880: 74 20 3c 20 24 69 4f 66 66 73 65 74 45 6e 64 7d  t < $iOffsetEnd}
0890: 20 7b 69 6e 63 72 20 69 4f 66 66 73 65 74 20 24   {incr iOffset $
08a0: 69 4f 66 66 73 65 74 49 6e 63 72 7d 20 7b 0a 20  iOffsetIncr} {. 
08b0: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 4c 69 6d     for {set iLim
08c0: 69 74 20 30 7d 20 7b 24 69 4c 69 6d 69 74 20 3c  it 0} {$iLimit <
08d0: 20 24 69 4c 69 6d 69 74 45 6e 64 7d 20 7b 69 6e   $iLimitEnd} {in
08e0: 63 72 20 69 4c 69 6d 69 74 7d 20 7b 0a 20 20 0a  cr iLimit} {.  .
08f0: 20 20 20 20 20 20 73 65 74 20 3a 3a 63 6f 6d 70        set ::comp
0900: 6f 75 6e 64 5f 73 71 6c 20 22 24 73 71 6c 20 4c  ound_sql "$sql L
0910: 49 4d 49 54 20 24 69 4c 69 6d 69 74 22 0a 20 20  IMIT $iLimit".  
0920: 20 20 20 20 69 66 20 7b 24 69 4f 66 66 73 65 74      if {$iOffset
0930: 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 20   != 0} {.       
0940: 20 61 70 70 65 6e 64 20 3a 3a 63 6f 6d 70 6f 75   append ::compou
0950: 6e 64 5f 73 71 6c 20 22 20 4f 46 46 53 45 54 20  nd_sql " OFFSET 
0960: 24 69 4f 66 66 73 65 74 22 0a 20 20 20 20 20 20  $iOffset".      
0970: 7d 0a 20 20 0a 20 20 20 20 20 20 73 65 74 20 69  }.  .      set i
0980: 53 74 61 72 74 20 5b 65 78 70 72 20 7b 24 69 4f  Start [expr {$iO
0990: 66 66 73 65 74 2a 24 6e 43 6f 6c 7d 5d 0a 20 20  ffset*$nCol}].  
09a0: 20 20 20 20 73 65 74 20 69 45 6e 64 20 5b 65 78      set iEnd [ex
09b0: 70 72 20 7b 28 24 69 4f 66 66 73 65 74 2a 24 6e  pr {($iOffset*$n
09c0: 43 6f 6c 29 20 2b 20 28 24 69 4c 69 6d 69 74 2a  Col) + ($iLimit*
09d0: 24 6e 43 6f 6c 29 20 2d 31 7d 5d 0a 20 20 0a 20  $nCol) -1}].  . 
09e0: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65       do_test $te
09f0: 73 74 6e 61 6d 65 2e 6c 69 6d 69 74 3d 24 69 4c  stname.limit=$iL
0a00: 69 6d 69 74 2e 6f 66 66 73 65 74 3d 24 69 4f 66  imit.offset=$iOf
0a10: 66 73 65 74 20 7b 20 0a 20 20 20 20 20 20 20 20  fset { .        
0a20: 65 78 65 63 73 71 6c 20 24 3a 3a 63 6f 6d 70 6f  execsql $::compo
0a30: 75 6e 64 5f 73 71 6c 0a 20 20 20 20 20 20 7d 20  und_sql.      } 
0a40: 5b 6c 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20  [lrange $result 
0a50: 24 69 53 74 61 72 74 20 24 69 45 6e 64 5d 0a 20  $iStart $iEnd]. 
0a60: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 0a 23 20 74 65 73 74 5f 63 6f  ------.# test_co
0ac0: 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c  mpound_select_fl
0ad0: 69 70 70 61 62 6c 65 20 54 45 53 54 4e 41 4d 45  ippable TESTNAME
0ae0: 20 53 45 4c 45 43 54 20 52 45 53 55 4c 54 0a 23   SELECT RESULT.#
0af0: 0a 23 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  .#   This comman
0b00: 64 20 69 73 20 66 6f 72 20 74 65 73 74 69 6e 67  d is for testing
0b10: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
0b20: 68 65 20 66 6f 72 6d 3a 0a 23 0a 23 20 20 20 20  he form:.#.#    
0b30: 20 3c 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20   <simple select 
0b40: 31 3e 20 3c 63 6f 6d 70 6f 75 6e 64 20 6f 70 3e  1> <compound op>
0b50: 20 3c 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20   <simple select 
0b60: 32 3e 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  2> ORDER BY <ord
0b70: 65 72 20 62 79 3e 0a 23 0a 23 20 20 20 77 68 65  er by>.#.#   whe
0b80: 72 65 20 65 61 63 68 20 3c 73 69 6d 70 6c 65 20  re each <simple 
0b90: 73 65 6c 65 63 74 3e 20 69 73 20 61 20 73 69 6d  select> is a sim
0ba0: 70 6c 65 20 28 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e  ple (non-compoun
0bb0: 64 29 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  d) select statem
0bc0: 65 6e 74 0a 23 20 20 20 61 6e 64 20 3c 63 6f 6d  ent.#   and <com
0bd0: 70 6f 75 6e 64 20 6f 70 3e 20 69 73 20 6f 6e 65  pound op> is one
0be0: 20 6f 66 20 22 49 4e 54 45 52 53 45 43 54 22 2c   of "INTERSECT",
0bf0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 20 6f 72 20   "UNION ALL" or 
0c00: 22 55 4e 49 4f 4e 22 2e 0a 23 0a 23 20 20 20 54  "UNION"..#.#   T
0c10: 68 69 73 20 70 72 6f 63 20 63 61 6c 6c 73 20 5b  his proc calls [
0c20: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
0c30: 6c 65 63 74 5d 20 74 77 69 63 65 2c 20 6f 6e 63  lect] twice, onc
0c40: 65 20 77 69 74 68 20 74 68 65 20 73 65 6c 65 63  e with the selec
0c50: 74 0a 23 20 20 20 73 74 61 74 65 6d 65 6e 74 20  t.#   statement 
0c60: 61 73 20 69 74 20 69 73 20 70 61 73 73 65 64 20  as it is passed 
0c70: 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 2c  to this command,
0c80: 20 61 6e 64 20 6f 6e 63 65 20 77 69 74 68 20 74   and once with t
0c90: 68 65 20 70 6f 73 69 74 69 6f 6e 73 0a 23 20 20  he positions.#  
0ca0: 20 6f 66 20 3c 73 65 6c 65 63 74 20 73 74 61 74   of <select stat
0cb0: 65 6d 65 6e 74 20 31 3e 20 61 6e 64 20 3c 73 65  ement 1> and <se
0cc0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 32  lect statement 2
0cd0: 3e 20 65 78 63 68 61 6e 67 65 64 2e 0a 23 0a 70  > exchanged..#.p
0ce0: 72 6f 63 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e  roc test_compoun
0cf0: 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62  d_select_flippab
0d00: 6c 65 20 7b 74 65 73 74 6e 61 6d 65 20 73 71 6c  le {testname sql
0d10: 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 74 65 73   result} {.  tes
0d20: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
0d30: 74 20 24 74 65 73 74 6e 61 6d 65 20 24 73 71 6c  t $testname $sql
0d40: 20 24 72 65 73 75 6c 74 0a 0a 20 20 73 65 74 20   $result..  set 
0d50: 73 65 6c 65 63 74 20 5b 73 74 72 69 6e 67 20 74  select [string t
0d60: 72 69 6d 20 24 73 71 6c 5d 0a 20 20 73 65 74 20  rim $sql].  set 
0d70: 52 45 20 7b 28 2e 2a 29 28 55 4e 49 4f 4e 20 41  RE {(.*)(UNION A
0d80: 4c 4c 7c 49 4e 54 45 52 53 45 43 54 7c 55 4e 49  LL|INTERSECT|UNI
0d90: 4f 4e 29 28 2e 2a 29 28 4f 52 44 45 52 20 42 59  ON)(.*)(ORDER BY
0da0: 2e 2a 29 7d 0a 20 20 73 65 74 20 72 63 20 5b 72  .*)}.  set rc [r
0db0: 65 67 65 78 70 20 24 52 45 20 24 73 65 6c 65 63  egexp $RE $selec
0dc0: 74 20 2d 3e 20 73 31 20 6f 70 20 73 32 20 6f 72  t -> s1 op s2 or
0dd0: 64 65 72 5f 62 79 5d 0a 20 20 69 66 20 7b 21 24  der_by].  if {!$
0de0: 72 63 7d 20 7b 65 72 72 6f 72 20 22 53 74 61 74  rc} {error "Stat
0df0: 65 6d 65 6e 74 20 69 73 20 75 6e 66 6c 69 70 70  ement is unflipp
0e00: 61 62 6c 65 3a 20 24 73 65 6c 65 63 74 22 7d 0a  able: $select"}.
0e10: 0a 20 20 73 65 74 20 66 6c 69 70 73 71 6c 20 22  .  set flipsql "
0e20: 24 73 32 20 24 6f 70 20 24 73 31 20 24 6f 72 64  $s2 $op $s1 $ord
0e30: 65 72 5f 62 79 22 0a 20 20 74 65 73 74 5f 63 6f  er_by".  test_co
0e40: 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20 24 74  mpound_select $t
0e50: 65 73 74 6e 61 6d 65 2e 66 6c 69 70 70 65 64 20  estname.flipped 
0e60: 24 66 6c 69 70 73 71 6c 20 24 72 65 73 75 6c 74  $flipsql $result
0e70: 0a 7d 0a 0a 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 23 23 23 23 23 23 23 23 23  ################
0ec0: 23 0a 23 20 42 65 67 69 6e 20 74 65 73 74 73 2e  #.# Begin tests.
0ed0: 0a 23 0a 0a 23 20 43 72 65 61 74 65 20 61 6e 64  .#..# Create and
0ee0: 20 70 6f 70 75 6c 61 74 65 20 61 20 73 61 6d 70   populate a samp
0ef0: 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 64  le database..#.d
0f00: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 31  o_test select9-1
0f10: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
0f20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0f30: 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E t1(a, b, c);. 
0f40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0f50: 74 32 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  t2(d, e, f);.   
0f60: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
0f70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0f80: 55 45 53 28 31 2c 20 20 27 6f 6e 65 27 2c 20 20  UES(1,  'one',  
0f90: 20 27 49 27 29 3b 0a 20 20 20 20 20 20 49 4e 53   'I');.      INS
0fa0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0fb0: 45 53 28 33 2c 20 20 4e 55 4c 4c 2c 20 20 20 20  ES(3,  NULL,    
0fc0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53  NULL);.      INS
0fd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0fe0: 45 53 28 35 2c 20 20 27 66 69 76 65 27 2c 20 20  ES(5,  'five',  
0ff0: 27 56 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  'V');.      INSE
1000: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1010: 53 28 37 2c 20 20 27 73 65 76 65 6e 27 2c 20 27  S(7,  'seven', '
1020: 56 49 49 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  VII');.      INS
1030: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1040: 45 53 28 39 2c 20 20 4e 55 4c 4c 2c 20 20 20 20  ES(9,  NULL,    
1050: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53  NULL);.      INS
1060: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1070: 45 53 28 32 2c 20 20 27 74 77 6f 27 2c 20 20 20  ES(2,  'two',   
1080: 27 49 49 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  'II');.      INS
1090: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10a0: 45 53 28 34 2c 20 20 27 66 6f 75 72 27 2c 20 20  ES(4,  'four',  
10b0: 27 49 56 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  'IV');.      INS
10c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10d0: 45 53 28 36 2c 20 20 4e 55 4c 4c 2c 20 20 20 20  ES(6,  NULL,    
10e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53  NULL);.      INS
10f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1100: 45 53 28 38 2c 20 20 27 65 69 67 68 74 27 2c 20  ES(8,  'eight', 
1110: 27 56 49 49 49 27 29 3b 0a 20 20 20 20 20 20 49  'VIII');.      I
1120: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1130: 4c 55 45 53 28 31 30 2c 20 27 74 65 6e 27 2c 20  LUES(10, 'ten', 
1140: 20 20 27 58 27 29 3b 0a 0a 20 20 20 20 20 20 49    'X');..      I
1150: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1160: 4c 55 45 53 28 31 2c 20 20 27 74 77 6f 27 2c 20  LUES(1,  'two', 
1170: 20 20 20 20 20 27 49 56 27 29 3b 0a 20 20 20 20       'IV');.    
1180: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1190: 20 56 41 4c 55 45 53 28 32 2c 20 20 27 66 6f 75   VALUES(2,  'fou
11a0: 72 27 2c 20 20 20 20 20 27 56 49 49 49 27 29 3b  r',     'VIII');
11b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
11c0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
11d0: 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 4e 55 4c   NULL,       NUL
11e0: 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  L);.      INSERT
11f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1200: 34 2c 20 20 27 65 69 67 68 74 27 2c 20 20 20 20  4,  'eight',    
1210: 27 58 56 49 27 29 3b 0a 20 20 20 20 20 20 49 4e  'XVI');.      IN
1220: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1230: 55 45 53 28 35 2c 20 20 27 74 65 6e 27 2c 20 20  UES(5,  'ten',  
1240: 20 20 20 20 27 58 58 27 29 3b 0a 20 20 20 20 20      'XX');.     
1250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1260: 56 41 4c 55 45 53 28 36 2c 20 20 4e 55 4c 4c 2c  VALUES(6,  NULL,
1270: 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20         NULL);.  
1280: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1290: 74 32 20 56 41 4c 55 45 53 28 37 2c 20 20 27 66  t2 VALUES(7,  'f
12a0: 6f 75 72 74 65 65 6e 27 2c 20 27 58 58 56 49 49  ourteen', 'XXVII
12b0: 49 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  I');.      INSER
12c0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
12d0: 28 38 2c 20 20 27 73 69 78 74 65 65 6e 27 2c 20  (8,  'sixteen', 
12e0: 20 27 58 58 58 49 49 27 29 3b 0a 20 20 20 20 20   'XXXII');.     
12f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1300: 56 41 4c 55 45 53 28 39 2c 20 20 4e 55 4c 4c 2c  VALUES(9,  NULL,
1310: 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20         NULL);.  
1320: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1330: 74 32 20 56 41 4c 55 45 53 28 31 30 2c 20 27 74  t2 VALUES(10, 't
1340: 77 65 6e 74 79 27 2c 20 20 20 27 58 4c 27 29 3b  wenty',   'XL');
1350: 0a 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ..    COMMIT;.  
1360: 7d 0a 7d 20 7b 7d 0a 0a 23 20 45 61 63 68 20 69  }.} {}..# Each i
1370: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  teration of this
1380: 20 6c 6f 6f 70 20 72 75 6e 73 20 74 68 65 20 73   loop runs the s
1390: 61 6d 65 20 74 65 73 74 73 20 77 69 74 68 20 61  ame tests with a
13a0: 20 64 69 66 66 65 72 65 6e 74 20 73 65 74 0a 23   different set.#
13b0: 20 6f 66 20 69 6e 64 65 78 65 73 20 70 72 65 73   of indexes pres
13c0: 65 6e 74 20 77 69 74 68 69 6e 20 74 68 65 20 64  ent within the d
13d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
13e0: 54 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  The data returne
13f0: 64 20 62 79 0a 23 20 74 68 65 20 63 6f 6d 70 6f  d by.# the compo
1400: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1410: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74 65 73  ments in the tes
1420: 74 20 63 61 73 65 73 20 73 68 6f 75 6c 64 20 62  t cases should b
1430: 65 20 74 68 65 20 73 61 6d 65 20 0a 23 20 69 6e  e the same .# in
1440: 20 65 61 63 68 20 63 61 73 65 2e 0a 23 0a 73 65   each case..#.se
1450: 74 20 69 4f 75 74 65 72 4c 6f 6f 70 20 31 0a 66  t iOuterLoop 1.f
1460: 6f 72 65 61 63 68 20 69 6e 64 65 78 65 73 20 5b  oreach indexes [
1470: 6c 69 73 74 20 7b 0a 20 20 2f 2a 20 44 6f 20 6e  list {.  /* Do n
1480: 6f 74 20 63 72 65 61 74 65 20 61 6e 79 20 69 6e  ot create any in
1490: 64 65 78 65 73 2e 20 2a 2f 0a 7d 20 7b 0a 20 20  dexes. */.} {.  
14a0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
14b0: 4f 4e 20 74 31 28 61 29 0a 7d 20 7b 0a 20 20 43  ON t1(a).} {.  C
14c0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
14d0: 4e 20 74 31 28 62 29 0a 7d 20 7b 0a 20 20 43 52  N t1(b).} {.  CR
14e0: 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
14f0: 20 74 32 28 64 29 0a 7d 20 7b 0a 20 20 43 52 45   t2(d).} {.  CRE
1500: 41 54 45 20 49 4e 44 45 58 20 69 34 20 4f 4e 20  ATE INDEX i4 ON 
1510: 74 32 28 65 29 0a 7d 5d 20 7b 0a 0a 20 20 64 6f  t2(e).}] {..  do
1520: 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 31 2e  _test select9-1.
1530: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 20 7b 0a  $iOuterLoop.1 {.
1540: 20 20 20 20 65 78 65 63 73 71 6c 20 24 69 6e 64      execsql $ind
1550: 65 78 65 73 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23  exes.  } {}..  #
1560: 20 54 65 73 74 20 73 6f 6d 65 20 32 2d 77 61 79   Test some 2-way
1570: 20 55 4e 49 4f 4e 20 41 4c 4c 20 71 75 65 72 69   UNION ALL queri
1580: 65 73 2e 20 4e 6f 20 57 48 45 52 45 20 63 6c 61  es. No WHERE cla
1590: 75 73 65 73 2e 0a 20 20 23 0a 20 20 74 65 73 74  uses..  #.  test
15a0: 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  _compound_select
15b0: 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74   select9-1.$iOut
15c0: 65 72 4c 6f 6f 70 2e 32 20 7b 0a 20 20 20 20 53  erLoop.2 {.    S
15d0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
15e0: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
15f0: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
1600: 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 33 20 7b   .  } {1 one 3 {
1610: 7d 20 35 20 66 69 76 65 20 37 20 73 65 76 65 6e  } 5 five 7 seven
1620: 20 39 20 7b 7d 20 32 20 74 77 6f 20 34 20 66 6f   9 {} 2 two 4 fo
1630: 75 72 20 36 20 7b 7d 20 38 20 65 69 67 68 74 20  ur 6 {} 8 eight 
1640: 31 30 20 74 65 6e 20 31 20 74 77 6f 20 32 20 66  10 ten 1 two 2 f
1650: 6f 75 72 20 33 20 7b 7d 20 34 20 65 69 67 68 74  our 3 {} 4 eight
1660: 20 35 20 74 65 6e 20 36 20 7b 7d 20 37 20 66 6f   5 ten 6 {} 7 fo
1670: 75 72 74 65 65 6e 20 38 20 73 69 78 74 65 65 6e  urteen 8 sixteen
1680: 20 39 20 7b 7d 20 31 30 20 74 77 65 6e 74 79 7d   9 {} 10 twenty}
1690: 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64  .  test_compound
16a0: 5f 73 65 6c 65 63 74 20 73 65 6c 65 63 74 39 2d  _select select9-
16b0: 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 33 20  1.$iOuterLoop.3 
16c0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20  {.    SELECT a, 
16d0: 62 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  b FROM t1 UNION 
16e0: 41 4c 4c 20 53 45 4c 45 43 54 20 64 2c 20 65 20  ALL SELECT d, e 
16f0: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
1700: 20 31 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 31   1 .  } {1 one 1
1710: 20 74 77 6f 20 32 20 74 77 6f 20 32 20 66 6f 75   two 2 two 2 fou
1720: 72 20 33 20 7b 7d 20 33 20 7b 7d 20 34 20 66 6f  r 3 {} 3 {} 4 fo
1730: 75 72 20 34 20 65 69 67 68 74 20 35 20 66 69 76  ur 4 eight 5 fiv
1740: 65 20 35 20 74 65 6e 20 36 20 7b 7d 20 36 20 7b  e 5 ten 6 {} 6 {
1750: 7d 20 37 20 73 65 76 65 6e 20 37 20 66 6f 75 72  } 7 seven 7 four
1760: 74 65 65 6e 20 38 20 65 69 67 68 74 20 38 20 73  teen 8 eight 8 s
1770: 69 78 74 65 65 6e 20 39 20 7b 7d 20 39 20 7b 7d  ixteen 9 {} 9 {}
1780: 20 31 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74   10 ten 10 twent
1790: 79 7d 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75  y}.  test_compou
17a0: 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63 74  nd_select select
17b0: 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e  9-1.$iOuterLoop.
17c0: 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  4 {.    SELECT a
17d0: 2c 20 62 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  , b FROM t1 UNIO
17e0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 64 2c 20  N ALL SELECT d, 
17f0: 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  e FROM t2 ORDER 
1800: 42 59 20 32 20 0a 20 20 7d 20 7b 33 20 7b 7d 20  BY 2 .  } {3 {} 
1810: 39 20 7b 7d 20 36 20 7b 7d 20 33 20 7b 7d 20 36  9 {} 6 {} 3 {} 6
1820: 20 7b 7d 20 39 20 7b 7d 20 38 20 65 69 67 68 74   {} 9 {} 8 eight
1830: 20 34 20 65 69 67 68 74 20 35 20 66 69 76 65 20   4 eight 5 five 
1840: 34 20 66 6f 75 72 20 32 20 66 6f 75 72 20 37 20  4 four 2 four 7 
1850: 66 6f 75 72 74 65 65 6e 20 31 20 6f 6e 65 20 37  fourteen 1 one 7
1860: 20 73 65 76 65 6e 20 38 20 73 69 78 74 65 65 6e   seven 8 sixteen
1870: 20 31 30 20 74 65 6e 20 35 20 74 65 6e 20 31 30   10 ten 5 ten 10
1880: 20 74 77 65 6e 74 79 20 32 20 74 77 6f 20 31 20   twenty 2 two 1 
1890: 74 77 6f 7d 0a 20 20 74 65 73 74 5f 63 6f 6d 70  two}.  test_comp
18a0: 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70  ound_select_flip
18b0: 70 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 31 2e  pable select9-1.
18c0: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 35 20 7b 0a  $iOuterLoop.5 {.
18d0: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
18e0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c  FROM t1 UNION AL
18f0: 4c 20 53 45 4c 45 43 54 20 64 2c 20 65 20 46 52  L SELECT d, e FR
1900: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31  OM t2 ORDER BY 1
1910: 2c 20 32 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 31  , 2.  } {1 one 1
1920: 20 74 77 6f 20 32 20 66 6f 75 72 20 32 20 74 77   two 2 four 2 tw
1930: 6f 20 33 20 7b 7d 20 33 20 7b 7d 20 34 20 65 69  o 3 {} 3 {} 4 ei
1940: 67 68 74 20 34 20 66 6f 75 72 20 35 20 66 69 76  ght 4 four 5 fiv
1950: 65 20 35 20 74 65 6e 20 36 20 7b 7d 20 36 20 7b  e 5 ten 6 {} 6 {
1960: 7d 20 37 20 66 6f 75 72 74 65 65 6e 20 37 20 73  } 7 fourteen 7 s
1970: 65 76 65 6e 20 38 20 65 69 67 68 74 20 38 20 73  even 8 eight 8 s
1980: 69 78 74 65 65 6e 20 39 20 7b 7d 20 39 20 7b 7d  ixteen 9 {} 9 {}
1990: 20 31 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74   10 ten 10 twent
19a0: 79 7d 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75  y}.  test_compou
19b0: 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61  nd_select_flippa
19c0: 62 6c 65 20 73 65 6c 65 63 74 39 2d 31 2e 24 69  ble select9-1.$i
19d0: 4f 75 74 65 72 4c 6f 6f 70 2e 36 20 7b 0a 20 20  OuterLoop.6 {.  
19e0: 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52    SELECT a, b FR
19f0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
1a00: 53 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d  SELECT d, e FROM
1a10: 20 74 32 20 4f 52 44 45 52 20 42 59 20 32 2c 20   t2 ORDER BY 2, 
1a20: 31 0a 20 20 7d 20 7b 33 20 7b 7d 20 33 20 7b 7d  1.  } {3 {} 3 {}
1a30: 20 36 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d 20   6 {} 6 {} 9 {} 
1a40: 39 20 7b 7d 20 34 20 65 69 67 68 74 20 38 20 65  9 {} 4 eight 8 e
1a50: 69 67 68 74 20 35 20 66 69 76 65 20 32 20 66 6f  ight 5 five 2 fo
1a60: 75 72 20 34 20 66 6f 75 72 20 37 20 66 6f 75 72  ur 4 four 7 four
1a70: 74 65 65 6e 20 31 20 6f 6e 65 20 37 20 73 65 76  teen 1 one 7 sev
1a80: 65 6e 20 38 20 73 69 78 74 65 65 6e 20 35 20 74  en 8 sixteen 5 t
1a90: 65 6e 20 31 30 20 74 65 6e 20 31 30 20 74 77 65  en 10 ten 10 twe
1aa0: 6e 74 79 20 31 20 74 77 6f 20 32 20 74 77 6f 7d  nty 1 two 2 two}
1ab0: 0a 0a 20 20 23 20 54 65 73 74 20 73 6f 6d 65 20  ..  # Test some 
1ac0: 32 2d 77 61 79 20 55 4e 49 4f 4e 20 71 75 65 72  2-way UNION quer
1ad0: 69 65 73 2e 0a 20 20 23 0a 20 20 74 65 73 74 5f  ies..  #.  test_
1ae0: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20  compound_select 
1af0: 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65  select9-1.$iOute
1b00: 72 4c 6f 6f 70 2e 37 20 7b 0a 20 20 20 20 53 45  rLoop.7 {.    SE
1b10: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
1b20: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64  1 UNION SELECT d
1b30: 2c 20 65 20 46 52 4f 4d 20 74 32 20 0a 20 20 7d  , e FROM t2 .  }
1b40: 20 7b 31 20 6f 6e 65 20 31 20 74 77 6f 20 32 20   {1 one 1 two 2 
1b50: 66 6f 75 72 20 32 20 74 77 6f 20 33 20 7b 7d 20  four 2 two 3 {} 
1b60: 34 20 65 69 67 68 74 20 34 20 66 6f 75 72 20 35  4 eight 4 four 5
1b70: 20 66 69 76 65 20 35 20 74 65 6e 20 36 20 7b 7d   five 5 ten 6 {}
1b80: 20 37 20 66 6f 75 72 74 65 65 6e 20 37 20 73 65   7 fourteen 7 se
1b90: 76 65 6e 20 38 20 65 69 67 68 74 20 38 20 73 69  ven 8 eight 8 si
1ba0: 78 74 65 65 6e 20 39 20 7b 7d 20 31 30 20 74 65  xteen 9 {} 10 te
1bb0: 6e 20 31 30 20 74 77 65 6e 74 79 7d 0a 0a 20 20  n 10 twenty}..  
1bc0: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
1bd0: 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e 24  lect select9-1.$
1be0: 69 4f 75 74 65 72 4c 6f 6f 70 2e 38 20 7b 0a 20  iOuterLoop.8 {. 
1bf0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46     SELECT a, b F
1c00: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
1c10: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
1c20: 20 4f 52 44 45 52 20 42 59 20 31 20 0a 20 20 7d   ORDER BY 1 .  }
1c30: 20 7b 31 20 6f 6e 65 20 31 20 74 77 6f 20 32 20   {1 one 1 two 2 
1c40: 66 6f 75 72 20 32 20 74 77 6f 20 33 20 7b 7d 20  four 2 two 3 {} 
1c50: 34 20 65 69 67 68 74 20 34 20 66 6f 75 72 20 35  4 eight 4 four 5
1c60: 20 66 69 76 65 20 35 20 74 65 6e 20 36 20 7b 7d   five 5 ten 6 {}
1c70: 20 37 20 66 6f 75 72 74 65 65 6e 20 37 20 73 65   7 fourteen 7 se
1c80: 76 65 6e 20 38 20 65 69 67 68 74 20 38 20 73 69  ven 8 eight 8 si
1c90: 78 74 65 65 6e 20 39 20 7b 7d 20 31 30 20 74 65  xteen 9 {} 10 te
1ca0: 6e 20 31 30 20 74 77 65 6e 74 79 7d 0a 0a 20 20  n 10 twenty}..  
1cb0: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
1cc0: 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e 24  lect select9-1.$
1cd0: 69 4f 75 74 65 72 4c 6f 6f 70 2e 39 20 7b 0a 20  iOuterLoop.9 {. 
1ce0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46     SELECT a, b F
1cf0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
1d00: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
1d10: 20 4f 52 44 45 52 20 42 59 20 32 20 0a 20 20 7d   ORDER BY 2 .  }
1d20: 20 7b 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d   {3 {} 6 {} 9 {}
1d30: 20 34 20 65 69 67 68 74 20 38 20 65 69 67 68 74   4 eight 8 eight
1d40: 20 35 20 66 69 76 65 20 32 20 66 6f 75 72 20 34   5 five 2 four 4
1d50: 20 66 6f 75 72 20 37 20 66 6f 75 72 74 65 65 6e   four 7 fourteen
1d60: 20 31 20 6f 6e 65 20 37 20 73 65 76 65 6e 20 38   1 one 7 seven 8
1d70: 20 73 69 78 74 65 65 6e 20 35 20 74 65 6e 20 31   sixteen 5 ten 1
1d80: 30 20 74 65 6e 20 31 30 20 74 77 65 6e 74 79 20  0 ten 10 twenty 
1d90: 31 20 74 77 6f 20 32 20 74 77 6f 7d 0a 0a 20 20  1 two 2 two}..  
1da0: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
1db0: 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c 65 20 73  lect_flippable s
1dc0: 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65 72  elect9-1.$iOuter
1dd0: 4c 6f 6f 70 2e 31 30 20 7b 0a 20 20 20 20 53 45  Loop.10 {.    SE
1de0: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
1df0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64  1 UNION SELECT d
1e00: 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  , e FROM t2 ORDE
1e10: 52 20 42 59 20 31 2c 20 32 0a 20 20 7d 20 7b 31  R BY 1, 2.  } {1
1e20: 20 6f 6e 65 20 31 20 74 77 6f 20 32 20 66 6f 75   one 1 two 2 fou
1e30: 72 20 32 20 74 77 6f 20 33 20 7b 7d 20 34 20 65  r 2 two 3 {} 4 e
1e40: 69 67 68 74 20 34 20 66 6f 75 72 20 35 20 66 69  ight 4 four 5 fi
1e50: 76 65 20 35 20 74 65 6e 20 36 20 7b 7d 20 37 20  ve 5 ten 6 {} 7 
1e60: 66 6f 75 72 74 65 65 6e 20 37 20 73 65 76 65 6e  fourteen 7 seven
1e70: 20 38 20 65 69 67 68 74 20 38 20 73 69 78 74 65   8 eight 8 sixte
1e80: 65 6e 20 39 20 7b 7d 20 31 30 20 74 65 6e 20 31  en 9 {} 10 ten 1
1e90: 30 20 74 77 65 6e 74 79 7d 0a 0a 20 20 74 65 73  0 twenty}..  tes
1ea0: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
1eb0: 74 5f 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65  t_flippable sele
1ec0: 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-1.$iOuterLoo
1ed0: 70 2e 31 31 20 7b 0a 20 20 20 20 53 45 4c 45 43  p.11 {.    SELEC
1ee0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 55  T a, b FROM t1 U
1ef0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 65  NION SELECT d, e
1f00: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1f10: 59 20 32 2c 20 31 0a 20 20 7d 20 7b 33 20 7b 7d  Y 2, 1.  } {3 {}
1f20: 20 36 20 7b 7d 20 39 20 7b 7d 20 34 20 65 69 67   6 {} 9 {} 4 eig
1f30: 68 74 20 38 20 65 69 67 68 74 20 35 20 66 69 76  ht 8 eight 5 fiv
1f40: 65 20 32 20 66 6f 75 72 20 34 20 66 6f 75 72 20  e 2 four 4 four 
1f50: 37 20 66 6f 75 72 74 65 65 6e 20 31 20 6f 6e 65  7 fourteen 1 one
1f60: 20 37 20 73 65 76 65 6e 20 38 20 73 69 78 74 65   7 seven 8 sixte
1f70: 65 6e 20 35 20 74 65 6e 20 31 30 20 74 65 6e 20  en 5 ten 10 ten 
1f80: 31 30 20 74 77 65 6e 74 79 20 31 20 74 77 6f 20  10 twenty 1 two 
1f90: 32 20 74 77 6f 7d 0a 0a 20 20 23 20 54 65 73 74  2 two}..  # Test
1fa0: 20 73 6f 6d 65 20 32 2d 77 61 79 20 49 4e 54 45   some 2-way INTE
1fb0: 52 53 45 43 54 20 71 75 65 72 69 65 73 2e 0a 20  RSECT queries.. 
1fc0: 20 23 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75   #.  test_compou
1fd0: 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63 74  nd_select select
1fe0: 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e  9-1.$iOuterLoop.
1ff0: 31 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  11 {.    SELECT 
2000: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 49 4e 54  a, b FROM t1 INT
2010: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 64 2c  ERSECT SELECT d,
2020: 20 65 20 46 52 4f 4d 20 74 32 20 0a 20 20 7d 20   e FROM t2 .  } 
2030: 7b 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d 7d  {3 {} 6 {} 9 {}}
2040: 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64  .  test_compound
2050: 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c  _select_flippabl
2060: 65 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75  e select9-1.$iOu
2070: 74 65 72 4c 6f 6f 70 2e 31 32 20 7b 0a 20 20 20  terLoop.12 {.   
2080: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
2090: 4d 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53  M t1 INTERSECT S
20a0: 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20  ELECT d, e FROM 
20b0: 74 32 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  t2 ORDER BY 1.  
20c0: 7d 20 7b 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b  } {3 {} 6 {} 9 {
20d0: 7d 7d 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75  }}.  test_compou
20e0: 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63 74  nd_select select
20f0: 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e  9-1.$iOuterLoop.
2100: 31 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  13 {.    SELECT 
2110: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 49 4e 54  a, b FROM t1 INT
2120: 45 52 53 45 43 54 20 53 45 4c 45 43 54 20 64 2c  ERSECT SELECT d,
2130: 20 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   e FROM t2 ORDER
2140: 20 42 59 20 32 0a 20 20 7d 20 7b 33 20 7b 7d 20   BY 2.  } {3 {} 
2150: 36 20 7b 7d 20 39 20 7b 7d 7d 0a 20 20 74 65 73  6 {} 9 {}}.  tes
2160: 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63  t_compound_selec
2170: 74 5f 66 6c 69 70 70 61 62 6c 65 20 73 65 6c 65  t_flippable sele
2180: 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-1.$iOuterLoo
2190: 70 2e 31 34 20 7b 0a 20 20 20 20 53 45 4c 45 43  p.14 {.    SELEC
21a0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 49  T a, b FROM t1 I
21b0: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
21c0: 64 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f 52 44  d, e FROM t2 ORD
21d0: 45 52 20 42 59 20 32 2c 20 31 0a 20 20 7d 20 7b  ER BY 2, 1.  } {
21e0: 33 20 7b 7d 20 36 20 7b 7d 20 39 20 7b 7d 7d 0a  3 {} 6 {} 9 {}}.
21f0: 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f    test_compound_
2200: 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c 65  select_flippable
2210: 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74   select9-1.$iOut
2220: 65 72 4c 6f 6f 70 2e 31 35 20 7b 0a 20 20 20 20  erLoop.15 {.    
2230: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
2240: 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   t1 INTERSECT SE
2250: 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74  LECT d, e FROM t
2260: 32 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32 0a  2 ORDER BY 1, 2.
2270: 20 20 7d 20 7b 33 20 7b 7d 20 36 20 7b 7d 20 39    } {3 {} 6 {} 9
2280: 20 7b 7d 7d 0a 0a 20 20 23 20 54 65 73 74 20 73   {}}..  # Test s
2290: 6f 6d 65 20 32 2d 77 61 79 20 45 58 43 45 50 54  ome 2-way EXCEPT
22a0: 20 71 75 65 72 69 65 73 2e 0a 20 20 23 0a 20 20   queries..  #.  
22b0: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
22c0: 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e 24  lect select9-1.$
22d0: 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 36 20 7b 0a  iOuterLoop.16 {.
22e0: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
22f0: 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
2300: 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20  ELECT d, e FROM 
2310: 74 32 20 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32  t2 .  } {1 one 2
2320: 20 74 77 6f 20 34 20 66 6f 75 72 20 35 20 66 69   two 4 four 5 fi
2330: 76 65 20 37 20 73 65 76 65 6e 20 38 20 65 69 67  ve 7 seven 8 eig
2340: 68 74 20 31 30 20 74 65 6e 7d 0a 0a 20 20 74 65  ht 10 ten}..  te
2350: 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65  st_compound_sele
2360: 63 74 20 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f  ct select9-1.$iO
2370: 75 74 65 72 4c 6f 6f 70 2e 31 37 20 7b 0a 20 20  uterLoop.17 {.  
2380: 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52    SELECT a, b FR
2390: 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23a0: 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 32  ECT d, e FROM t2
23b0: 20 4f 52 44 45 52 20 42 59 20 31 20 0a 20 20 7d   ORDER BY 1 .  }
23c0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 34 20   {1 one 2 two 4 
23d0: 66 6f 75 72 20 35 20 66 69 76 65 20 37 20 73 65  four 5 five 7 se
23e0: 76 65 6e 20 38 20 65 69 67 68 74 20 31 30 20 74  ven 8 eight 10 t
23f0: 65 6e 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70  en}..  test_comp
2400: 6f 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65  ound_select sele
2410: 63 74 39 2d 31 2e 24 69 4f 75 74 65 72 4c 6f 6f  ct9-1.$iOuterLoo
2420: 70 2e 31 38 20 7b 0a 20 20 20 20 53 45 4c 45 43  p.18 {.    SELEC
2430: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 45  T a, b FROM t1 E
2440: 58 43 45 50 54 20 53 45 4c 45 43 54 20 64 2c 20  XCEPT SELECT d, 
2450: 65 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  e FROM t2 ORDER 
2460: 42 59 20 32 20 0a 20 20 7d 20 7b 38 20 65 69 67  BY 2 .  } {8 eig
2470: 68 74 20 35 20 66 69 76 65 20 34 20 66 6f 75 72  ht 5 five 4 four
2480: 20 31 20 6f 6e 65 20 37 20 73 65 76 65 6e 20 31   1 one 7 seven 1
2490: 30 20 74 65 6e 20 32 20 74 77 6f 7d 0a 0a 20 20  0 ten 2 two}..  
24a0: 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73 65  test_compound_se
24b0: 6c 65 63 74 20 73 65 6c 65 63 74 39 2d 31 2e 24  lect select9-1.$
24c0: 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 39 20 7b 0a  iOuterLoop.19 {.
24d0: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
24e0: 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
24f0: 45 4c 45 43 54 20 64 2c 20 65 20 46 52 4f 4d 20  ELECT d, e FROM 
2500: 74 32 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32  t2 ORDER BY 1, 2
2510: 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77  .  } {1 one 2 tw
2520: 6f 20 34 20 66 6f 75 72 20 35 20 66 69 76 65 20  o 4 four 5 five 
2530: 37 20 73 65 76 65 6e 20 38 20 65 69 67 68 74 20  7 seven 8 eight 
2540: 31 30 20 74 65 6e 7d 0a 0a 20 20 74 65 73 74 5f  10 ten}..  test_
2550: 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20  compound_select 
2560: 73 65 6c 65 63 74 39 2d 31 2e 24 69 4f 75 74 65  select9-1.$iOute
2570: 72 4c 6f 6f 70 2e 32 30 20 7b 0a 20 20 20 20 53  rLoop.20 {.    S
2580: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2590: 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
25a0: 20 64 2c 20 65 20 46 52 4f 4d 20 74 32 20 4f 52   d, e FROM t2 OR
25b0: 44 45 52 20 42 59 20 32 2c 20 31 0a 20 20 7d 20  DER BY 2, 1.  } 
25c0: 7b 38 20 65 69 67 68 74 20 35 20 66 69 76 65 20  {8 eight 5 five 
25d0: 34 20 66 6f 75 72 20 31 20 6f 6e 65 20 37 20 73  4 four 1 one 7 s
25e0: 65 76 65 6e 20 31 30 20 74 65 6e 20 32 20 74 77  even 10 ten 2 tw
25f0: 6f 7d 0a 0a 20 20 69 6e 63 72 20 69 4f 75 74 65  o}..  incr iOute
2600: 72 4c 6f 6f 70 0a 7d 0a 0a 64 6f 5f 74 65 73 74  rLoop.}..do_test
2610: 20 73 65 6c 65 63 74 39 2d 32 2e 30 20 7b 0a 20   select9-2.0 {. 
2620: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2630: 52 4f 50 20 49 4e 44 45 58 20 69 31 3b 0a 20 20  ROP INDEX i1;.  
2640: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 32 3b    DROP INDEX i2;
2650: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
2660: 69 33 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  i3;.    DROP IND
2670: 45 58 20 69 34 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  EX i4;.  }.} {}.
2680: 0a 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b 6c  .proc reverse {l
2690: 68 73 20 72 68 73 7d 20 7b 0a 20 20 72 65 74 75  hs rhs} {.  retu
26a0: 72 6e 20 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61  rn [string compa
26b0: 72 65 20 24 72 68 73 20 24 6c 68 73 5d 0a 7d 0a  re $rhs $lhs].}.
26c0: 64 62 20 63 6f 6c 6c 61 74 65 20 72 65 76 65 72  db collate rever
26d0: 73 65 20 72 65 76 65 72 73 65 0a 0a 23 20 54 68  se reverse..# Th
26e0: 69 73 20 6c 6f 6f 70 20 69 73 20 73 69 6d 69 6c  is loop is simil
26f0: 61 72 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ar to the previo
2700: 75 73 20 6f 6e 65 20 28 74 65 73 74 20 63 61 73  us one (test cas
2710: 65 73 20 73 65 6c 65 63 74 39 2d 31 2e 2a 29 20  es select9-1.*) 
2720: 0a 23 20 65 78 63 65 70 74 20 74 68 61 74 20 74  .# except that t
2730: 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
2740: 20 73 74 61 74 65 6d 65 6e 74 73 20 68 61 76 65   statements have
2750: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 61   WHERE clauses a
2760: 74 74 61 63 68 65 64 0a 23 20 74 6f 20 74 68 65  ttached.# to the
2770: 6d 2e 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  m. Sometimes the
2780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
2790: 79 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75  y be satisfied u
27a0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 23 20  sing the same.# 
27b0: 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 4f  index used for O
27c0: 52 44 45 52 20 42 59 2c 20 73 6f 6d 65 74 69 6d  RDER BY, sometim
27d0: 65 73 20 6e 6f 74 2e 0a 23 0a 73 65 74 20 69 4f  es not..#.set iO
27e0: 75 74 65 72 4c 6f 6f 70 20 31 0a 66 6f 72 65 61  uterLoop 1.forea
27f0: 63 68 20 69 6e 64 65 78 65 73 20 5b 6c 69 73 74  ch indexes [list
2800: 20 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63   {.  /* Do not c
2810: 72 65 61 74 65 20 61 6e 79 20 69 6e 64 65 78 65  reate any indexe
2820: 73 2e 20 2a 2f 0a 7d 20 7b 0a 20 20 43 52 45 41  s. */.} {.  CREA
2830: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
2840: 31 28 61 29 0a 7d 20 7b 0a 20 20 44 52 4f 50 20  1(a).} {.  DROP 
2850: 49 4e 44 45 58 20 69 31 3b 0a 20 20 43 52 45 41  INDEX i1;.  CREA
2860: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
2870: 31 28 62 2c 20 61 29 0a 7d 20 7b 0a 20 20 43 52  1(b, a).} {.  CR
2880: 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
2890: 20 74 32 28 64 20 44 45 53 43 2c 20 65 20 43 4f   t2(d DESC, e CO
28a0: 4c 4c 41 54 45 20 52 45 56 45 52 53 45 20 41 53  LLATE REVERSE AS
28b0: 43 29 3b 0a 7d 20 7b 0a 20 20 43 52 45 41 54 45  C);.} {.  CREATE
28c0: 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
28d0: 61 20 44 45 53 43 29 3b 0a 7d 5d 20 7b 0a 20 20  a DESC);.}] {.  
28e0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d  do_test select9-
28f0: 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 31 20  2.$iOuterLoop.1 
2900: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 69  {.    execsql $i
2910: 6e 64 65 78 65 73 0a 20 20 7d 20 7b 7d 0a 0a 20  ndexes.  } {}.. 
2920: 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e 64 5f 73   test_compound_s
2930: 65 6c 65 63 74 5f 66 6c 69 70 70 61 62 6c 65 20  elect_flippable 
2940: 73 65 6c 65 63 74 39 2d 32 2e 24 69 4f 75 74 65  select9-2.$iOute
2950: 72 4c 6f 6f 70 2e 32 20 7b 0a 20 20 20 20 53 45  rLoop.2 {.    SE
2960: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2970: 48 45 52 45 20 61 3c 35 20 55 4e 49 4f 4e 20 53  HERE a<5 UNION S
2980: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
2990: 57 48 45 52 45 20 64 3e 3d 35 20 4f 52 44 45 52  WHERE d>=5 ORDER
29a0: 20 42 59 20 31 0a 20 20 7d 20 7b 31 20 6f 6e 65   BY 1.  } {1 one
29b0: 20 49 20 32 20 74 77 6f 20 49 49 20 33 20 7b 7d   I 2 two II 3 {}
29c0: 20 7b 7d 20 34 20 66 6f 75 72 20 49 56 20 35 20   {} 4 four IV 5 
29d0: 74 65 6e 20 58 58 20 36 20 7b 7d 20 7b 7d 20 37  ten XX 6 {} {} 7
29e0: 20 66 6f 75 72 74 65 65 6e 20 58 58 56 49 49 49   fourteen XXVIII
29f0: 20 38 20 73 69 78 74 65 65 6e 20 58 58 58 49 49   8 sixteen XXXII
2a00: 20 39 20 7b 7d 20 7b 7d 20 31 30 20 74 77 65 6e   9 {} {} 10 twen
2a10: 74 79 20 58 4c 7d 0a 0a 20 20 74 65 73 74 5f 63  ty XL}..  test_c
2a20: 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66  ompound_select_f
2a30: 6c 69 70 70 61 62 6c 65 20 73 65 6c 65 63 74 39  lippable select9
2a40: 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 32  -2.$iOuterLoop.2
2a50: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2a60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3c  FROM t1 WHERE a<
2a70: 35 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a  5 UNION SELECT *
2a80: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 64   FROM t2 WHERE d
2a90: 3e 3d 35 20 4f 52 44 45 52 20 42 59 20 32 2c 20  >=5 ORDER BY 2, 
2aa0: 31 0a 20 20 7d 20 7b 33 20 7b 7d 20 7b 7d 20 36  1.  } {3 {} {} 6
2ab0: 20 7b 7d 20 7b 7d 20 39 20 7b 7d 20 7b 7d 20 34   {} {} 9 {} {} 4
2ac0: 20 66 6f 75 72 20 49 56 20 37 20 66 6f 75 72 74   four IV 7 fourt
2ad0: 65 65 6e 20 58 58 56 49 49 49 20 31 20 6f 6e 65  een XXVIII 1 one
2ae0: 20 49 20 38 20 73 69 78 74 65 65 6e 20 58 58 58   I 8 sixteen XXX
2af0: 49 49 20 35 20 74 65 6e 20 58 58 20 31 30 20 74  II 5 ten XX 10 t
2b00: 77 65 6e 74 79 20 58 4c 20 32 20 74 77 6f 20 49  wenty XL 2 two I
2b10: 49 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  I}..  test_compo
2b20: 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70  und_select_flipp
2b30: 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 32 2e 24  able select9-2.$
2b40: 69 4f 75 74 65 72 4c 6f 6f 70 2e 33 20 7b 0a 20  iOuterLoop.3 {. 
2b50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2b60: 20 74 31 20 57 48 45 52 45 20 61 3c 35 20 55 4e   t1 WHERE a<5 UN
2b70: 49 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ION SELECT * FRO
2b80: 4d 20 74 32 20 57 48 45 52 45 20 64 3e 3d 35 20  M t2 WHERE d>=5 
2b90: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 32 20  .    ORDER BY 2 
2ba0: 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 2c  COLLATE reverse,
2bb0: 20 31 0a 20 20 7d 20 7b 33 20 7b 7d 20 7b 7d 20   1.  } {3 {} {} 
2bc0: 36 20 7b 7d 20 7b 7d 20 39 20 7b 7d 20 7b 7d 20  6 {} {} 9 {} {} 
2bd0: 32 20 74 77 6f 20 49 49 20 31 30 20 74 77 65 6e  2 two II 10 twen
2be0: 74 79 20 58 4c 20 35 20 74 65 6e 20 58 58 20 38  ty XL 5 ten XX 8
2bf0: 20 73 69 78 74 65 65 6e 20 58 58 58 49 49 20 31   sixteen XXXII 1
2c00: 20 6f 6e 65 20 49 20 37 20 66 6f 75 72 74 65 65   one I 7 fourtee
2c10: 6e 20 58 58 56 49 49 49 20 34 20 66 6f 75 72 20  n XXVIII 4 four 
2c20: 49 56 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70  IV}..  test_comp
2c30: 6f 75 6e 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70  ound_select_flip
2c40: 70 61 62 6c 65 20 73 65 6c 65 63 74 39 2d 32 2e  pable select9-2.
2c50: 24 69 4f 75 74 65 72 4c 6f 6f 70 2e 34 20 7b 0a  $iOuterLoop.4 {.
2c60: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2c70: 4d 20 74 31 20 57 48 45 52 45 20 61 3c 35 20 55  M t1 WHERE a<5 U
2c80: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
2c90: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
2ca0: 64 3e 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  d>=5 ORDER BY 1.
2cb0: 20 20 7d 20 7b 31 20 6f 6e 65 20 49 20 32 20 74    } {1 one I 2 t
2cc0: 77 6f 20 49 49 20 33 20 7b 7d 20 7b 7d 20 34 20  wo II 3 {} {} 4 
2cd0: 66 6f 75 72 20 49 56 20 35 20 74 65 6e 20 58 58  four IV 5 ten XX
2ce0: 20 36 20 7b 7d 20 7b 7d 20 37 20 66 6f 75 72 74   6 {} {} 7 fourt
2cf0: 65 65 6e 20 58 58 56 49 49 49 20 38 20 73 69 78  een XXVIII 8 six
2d00: 74 65 65 6e 20 58 58 58 49 49 20 39 20 7b 7d 20  teen XXXII 9 {} 
2d10: 7b 7d 20 31 30 20 74 77 65 6e 74 79 20 58 4c 7d  {} 10 twenty XL}
2d20: 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e  ..  test_compoun
2d30: 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62  d_select_flippab
2d40: 6c 65 20 73 65 6c 65 63 74 39 2d 32 2e 24 69 4f  le select9-2.$iO
2d50: 75 74 65 72 4c 6f 6f 70 2e 35 20 7b 0a 20 20 20  uterLoop.5 {.   
2d60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2d70: 31 20 57 48 45 52 45 20 61 3c 35 20 55 4e 49 4f  1 WHERE a<5 UNIO
2d80: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46  N ALL SELECT * F
2d90: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 64 3e 3d  ROM t2 WHERE d>=
2da0: 35 20 4f 52 44 45 52 20 42 59 20 32 2c 20 31 0a  5 ORDER BY 2, 1.
2db0: 20 20 7d 20 7b 33 20 7b 7d 20 7b 7d 20 36 20 7b    } {3 {} {} 6 {
2dc0: 7d 20 7b 7d 20 39 20 7b 7d 20 7b 7d 20 34 20 66  } {} 9 {} {} 4 f
2dd0: 6f 75 72 20 49 56 20 37 20 66 6f 75 72 74 65 65  our IV 7 fourtee
2de0: 6e 20 58 58 56 49 49 49 20 31 20 6f 6e 65 20 49  n XXVIII 1 one I
2df0: 20 38 20 73 69 78 74 65 65 6e 20 58 58 58 49 49   8 sixteen XXXII
2e00: 20 35 20 74 65 6e 20 58 58 20 31 30 20 74 77 65   5 ten XX 10 twe
2e10: 6e 74 79 20 58 4c 20 32 20 74 77 6f 20 49 49 7d  nty XL 2 two II}
2e20: 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f 75 6e  ..  test_compoun
2e30: 64 5f 73 65 6c 65 63 74 5f 66 6c 69 70 70 61 62  d_select_flippab
2e40: 6c 65 20 73 65 6c 65 63 74 39 2d 32 2e 24 69 4f  le select9-2.$iO
2e50: 75 74 65 72 4c 6f 6f 70 2e 36 20 7b 0a 20 20 20  uterLoop.6 {.   
2e60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2e70: 31 20 57 48 45 52 45 20 61 3c 35 20 55 4e 49 4f  1 WHERE a<5 UNIO
2e80: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46  N ALL SELECT * F
2e90: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 64 3e 3d  ROM t2 WHERE d>=
2ea0: 35 20 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  5 .    ORDER BY 
2eb0: 32 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73  2 COLLATE revers
2ec0: 65 2c 20 31 0a 20 20 7d 20 7b 33 20 7b 7d 20 7b  e, 1.  } {3 {} {
2ed0: 7d 20 36 20 7b 7d 20 7b 7d 20 39 20 7b 7d 20 7b  } 6 {} {} 9 {} {
2ee0: 7d 20 32 20 74 77 6f 20 49 49 20 31 30 20 74 77  } 2 two II 10 tw
2ef0: 65 6e 74 79 20 58 4c 20 35 20 74 65 6e 20 58 58  enty XL 5 ten XX
2f00: 20 38 20 73 69 78 74 65 65 6e 20 58 58 58 49 49   8 sixteen XXXII
2f10: 20 31 20 6f 6e 65 20 49 20 37 20 66 6f 75 72 74   1 one I 7 fourt
2f20: 65 65 6e 20 58 58 56 49 49 49 20 34 20 66 6f 75  een XXVIII 4 fou
2f30: 72 20 49 56 7d 0a 0a 20 20 74 65 73 74 5f 63 6f  r IV}..  test_co
2f40: 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 20 73 65  mpound_select se
2f50: 6c 65 63 74 39 2d 32 2e 24 69 4f 75 74 65 72 4c  lect9-2.$iOuterL
2f60: 6f 6f 70 2e 34 20 7b 0a 20 20 20 20 53 45 4c 45  oop.4 {.    SELE
2f70: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  CT a FROM t1 WHE
2f80: 52 45 20 61 3c 38 20 45 58 43 45 50 54 20 53 45  RE a<8 EXCEPT SE
2f90: 4c 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57  LECT d FROM t2 W
2fa0: 48 45 52 45 20 64 3c 3d 33 20 4f 52 44 45 52 20  HERE d<=3 ORDER 
2fb0: 42 59 20 31 0a 20 20 7d 20 7b 34 20 35 20 36 20  BY 1.  } {4 5 6 
2fc0: 37 7d 0a 0a 20 20 74 65 73 74 5f 63 6f 6d 70 6f  7}..  test_compo
2fd0: 75 6e 64 5f 73 65 6c 65 63 74 20 73 65 6c 65 63  und_select selec
2fe0: 74 39 2d 32 2e 24 69 4f 75 74 65 72 4c 6f 6f 70  t9-2.$iOuterLoop
2ff0: 2e 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .4 {.    SELECT 
3000: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
3010: 61 3c 38 20 49 4e 54 45 52 53 45 43 54 20 53 45  a<8 INTERSECT SE
3020: 4c 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57  LECT d FROM t2 W
3030: 48 45 52 45 20 64 3c 3d 33 20 4f 52 44 45 52 20  HERE d<=3 ORDER 
3040: 42 59 20 31 0a 20 20 7d 20 7b 31 20 32 20 33 7d  BY 1.  } {1 2 3}
3050: 0a 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 65 6c  ..}..do_test sel
3060: 65 63 74 39 2d 32 2e 58 20 7b 0a 20 20 65 78 65  ect9-2.X {.  exe
3070: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
3080: 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 44 52  INDEX i1;.    DR
3090: 4f 50 20 49 4e 44 45 58 20 69 32 3b 0a 20 20 20  OP INDEX i2;.   
30a0: 20 44 52 4f 50 20 49 4e 44 45 58 20 69 33 3b 0a   DROP INDEX i3;.
30b0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 68 69 73    }.} {}..# This
30c0: 20 70 72 6f 63 65 64 75 72 65 20 65 78 65 63 75   procedure execu
30d0: 74 65 73 20 74 68 65 20 53 51 4c 2e 20 20 54 68  tes the SQL.  Th
30e0: 65 6e 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  en it checks the
30f0: 20 67 65 6e 65 72 61 74 65 64 20 70 72 6f 67 72   generated progr
3100: 61 6d 0a 23 20 66 6f 72 20 74 68 65 20 53 51 4c  am.# for the SQL
3110: 20 61 6e 64 20 61 70 70 65 6e 64 73 20 61 20 22   and appends a "
3120: 6e 6f 73 6f 72 74 22 20 74 6f 20 74 68 65 20 72  nosort" to the r
3130: 65 73 75 6c 74 20 69 66 20 74 68 65 20 70 72 6f  esult if the pro
3140: 67 72 61 6d 20 63 6f 6e 74 61 69 6e 73 20 74 68  gram contains th
3150: 65 0a 23 20 53 6f 72 74 43 61 6c 6c 62 61 63 6b  e.# SortCallback
3160: 20 6f 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65   opcode.  If the
3170: 20 70 72 6f 67 72 61 6d 20 64 6f 65 73 20 6e 6f   program does no
3180: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 53 6f  t contain the So
3190: 72 74 43 61 6c 6c 62 61 63 6b 0a 23 20 6f 70 63  rtCallback.# opc
31a0: 6f 64 65 20 69 74 20 61 70 70 65 6e 64 73 20 22  ode it appends "
31b0: 73 6f 72 74 22 0a 23 0a 70 72 6f 63 20 63 6b 73  sort".#.proc cks
31c0: 6f 72 74 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65  ort {sql} {.  se
31d0: 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f  t ::sqlite_sort_
31e0: 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 64 61  count 0.  set da
31f0: 74 61 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c  ta [execsql $sql
3200: 5d 0a 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69 74  ].  if {$::sqlit
3210: 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 7d 20 7b 73  e_sort_count} {s
3220: 65 74 20 78 20 73 6f 72 74 7d 20 7b 73 65 74 20  et x sort} {set 
3230: 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61 70 70  x nosort}.  lapp
3240: 65 6e 64 20 64 61 74 61 20 24 78 0a 20 20 72 65  end data $x.  re
3250: 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a 23 20  turn $data.}..# 
3260: 49 66 20 74 68 65 20 72 69 67 68 74 20 69 6e 64  If the right ind
3270: 65 78 65 73 20 65 78 69 73 74 2c 20 74 68 65 20  exes exist, the 
3280: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 3a  following query:
3290: 0a 23 0a 23 20 20 20 20 20 53 45 4c 45 43 54 20  .#.#     SELECT 
32a0: 74 31 2e 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  t1.a FROM t1 UNI
32b0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 74 32  ON ALL SELECT t2
32c0: 2e 64 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .d FROM t2 ORDER
32d0: 20 42 59 20 31 0a 23 0a 23 20 63 61 6e 20 75 73   BY 1.#.# can us
32e0: 65 20 69 6e 64 65 78 65 73 20 74 6f 20 72 75 6e  e indexes to run
32f0: 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
3300: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 6f 72 74 20   in-memory sort 
3310: 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 20 54 68 69  operation..# Thi
3320: 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  s block of tests
3330: 20 28 73 65 6c 65 63 74 39 2d 33 2e 2a 29 20 69   (select9-3.*) i
3340: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
3350: 69 66 20 74 68 65 20 73 61 6d 65 20 0a 23 20 69  if the same .# i
3360: 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 3a  s possible with:
3370: 0a 23 0a 23 20 20 20 20 20 43 52 45 41 54 45 20  .#.#     CREATE 
3380: 56 49 45 57 20 76 31 20 41 53 20 53 45 4c 45 43  VIEW v1 AS SELEC
3390: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
33a0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 64 20 46  N ALL SELECT d F
33b0: 52 4f 4d 20 74 32 0a 23 20 20 20 20 20 53 45 4c  ROM t2.#     SEL
33c0: 45 43 54 20 61 20 46 52 4f 4d 20 76 31 20 4f 52  ECT a FROM v1 OR
33d0: 44 45 52 20 42 59 20 31 0a 23 0a 23 20 49 74 20  DER BY 1.#.# It 
33e0: 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 69  turns out that i
33f0: 74 20 69 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  t is..#.do_test 
3400: 73 65 6c 65 63 74 39 2d 33 2e 31 20 7b 0a 20 20  select9-3.1 {.  
3410: 63 6b 73 6f 72 74 20 7b 20 53 45 4c 45 43 54 20  cksort { SELECT 
3420: 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  a FROM t1 ORDER 
3430: 42 59 20 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  BY 1 }.} {1 2 3 
3440: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 73  4 5 6 7 8 9 10 s
3450: 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65 6c  ort}.do_test sel
3460: 65 63 74 39 2d 33 2e 32 20 7b 0a 20 20 65 78 65  ect9-3.2 {.  exe
3470: 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 49 4e  csql { CREATE IN
3480: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 20  DEX i1 ON t1(a) 
3490: 7d 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53 45 4c  }.  cksort { SEL
34a0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4f 52  ECT a FROM t1 OR
34b0: 44 45 52 20 42 59 20 31 20 7d 0a 7d 20 7b 31 20  DER BY 1 }.} {1 
34c0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
34d0: 31 30 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65  10 nosort}.do_te
34e0: 73 74 20 73 65 6c 65 63 74 39 2d 33 2e 33 20 7b  st select9-3.3 {
34f0: 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53 45 4c 45  .  cksort { SELE
3500: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
3510: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 64 20  ON ALL SELECT d 
3520: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
3530: 20 31 20 4c 49 4d 49 54 20 35 20 7d 0a 7d 20 7b   1 LIMIT 5 }.} {
3540: 31 20 31 20 32 20 32 20 33 20 73 6f 72 74 7d 0a  1 1 2 2 3 sort}.
3550: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d  do_test select9-
3560: 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.4 {.  execsql 
3570: 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  { CREATE INDEX i
3580: 32 20 4f 4e 20 74 32 28 64 29 20 7d 0a 20 20 63  2 ON t2(d) }.  c
3590: 6b 73 6f 72 74 20 7b 20 53 45 4c 45 43 54 20 61  ksort { SELECT a
35a0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
35b0: 4c 4c 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d  LL SELECT d FROM
35c0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 20 4c   t2 ORDER BY 1 L
35d0: 49 4d 49 54 20 35 20 7d 0a 7d 20 7b 31 20 31 20  IMIT 5 }.} {1 1 
35e0: 32 20 32 20 33 20 6e 6f 73 6f 72 74 7d 0a 64 6f  2 2 3 nosort}.do
35f0: 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 33 2e  _test select9-3.
3600: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
3610: 43 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41  CREATE VIEW v1 A
3620: 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
3630: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
3640: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT d FROM t2 }.
3650: 20 20 63 6b 73 6f 72 74 20 7b 20 53 45 4c 45 43    cksort { SELEC
3660: 54 20 61 20 46 52 4f 4d 20 76 31 20 4f 52 44 45  T a FROM v1 ORDE
3670: 52 20 42 59 20 31 20 4c 49 4d 49 54 20 35 20 7d  R BY 1 LIMIT 5 }
3680: 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 6e 6f  .} {1 1 2 2 3 no
3690: 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 73 65  sort}.do_test se
36a0: 6c 65 63 74 39 2d 33 2e 58 20 7b 0a 20 20 65 78  lect9-3.X {.  ex
36b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
36c0: 20 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 44   INDEX i1;.    D
36d0: 52 4f 50 20 49 4e 44 45 58 20 69 32 3b 0a 20 20  ROP INDEX i2;.  
36e0: 20 20 44 52 4f 50 20 56 49 45 57 20 76 31 3b 0a    DROP VIEW v1;.
36f0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 68 69 73    }.} {}..# This
3700: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
3710: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
3720: 68 65 20 70 72 65 63 65 64 69 6e 67 20 6f 6e 65  he preceding one
3730: 2c 20 65 78 63 65 70 74 20 74 68 61 74 0a 23 20  , except that.# 
3740: 22 55 4e 49 4f 4e 22 20 69 73 20 74 65 73 74 65  "UNION" is teste
3750: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 22 55 4e  d instead of "UN
3760: 49 4f 4e 20 41 4c 4c 22 2e 0a 23 0a 64 6f 5f 74  ION ALL"..#.do_t
3770: 65 73 74 20 73 65 6c 65 63 74 39 2d 34 2e 31 20  est select9-4.1 
3780: 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 20 53 45 4c  {.  cksort { SEL
3790: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4f 52  ECT a FROM t1 OR
37a0: 44 45 52 20 42 59 20 31 20 7d 0a 7d 20 7b 31 20  DER BY 1 }.} {1 
37b0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
37c0: 31 30 20 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74  10 sort}.do_test
37d0: 20 73 65 6c 65 63 74 39 2d 34 2e 32 20 7b 0a 20   select9-4.2 {. 
37e0: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
37f0: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
3800: 28 61 29 20 7d 0a 20 20 63 6b 73 6f 72 74 20 7b  (a) }.  cksort {
3810: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
3820: 31 20 4f 52 44 45 52 20 42 59 20 31 20 7d 0a 7d  1 ORDER BY 1 }.}
3830: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3840: 38 20 39 20 31 30 20 6e 6f 73 6f 72 74 7d 0a 64  8 9 10 nosort}.d
3850: 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d 34  o_test select9-4
3860: 2e 33 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 20  .3 {.  cksort { 
3870: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
3880: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 20   UNION SELECT d 
3890: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
38a0: 20 31 20 4c 49 4d 49 54 20 35 20 7d 0a 7d 20 7b   1 LIMIT 5 }.} {
38b0: 31 20 32 20 33 20 34 20 35 20 73 6f 72 74 7d 0a  1 2 3 4 5 sort}.
38c0: 64 6f 5f 74 65 73 74 20 73 65 6c 65 63 74 39 2d  do_test select9-
38d0: 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.4 {.  execsql 
38e0: 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  { CREATE INDEX i
38f0: 32 20 4f 4e 20 74 32 28 64 29 20 7d 0a 20 20 63  2 ON t2(d) }.  c
3900: 6b 73 6f 72 74 20 7b 20 53 45 4c 45 43 54 20 61  ksort { SELECT a
3910: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
3920: 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20  ELECT d FROM t2 
3930: 4f 52 44 45 52 20 42 59 20 31 20 4c 49 4d 49 54  ORDER BY 1 LIMIT
3940: 20 35 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20   5 }.} {1 2 3 4 
3950: 35 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73  5 nosort}.do_tes
3960: 74 20 73 65 6c 65 63 74 39 2d 34 2e 35 20 7b 0a  t select9-4.5 {.
3970: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
3980: 54 45 20 56 49 45 57 20 76 31 20 41 53 20 53 45  TE VIEW v1 AS SE
3990: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
39a0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 20 46 52  NION SELECT d FR
39b0: 4f 4d 20 74 32 20 7d 0a 20 20 63 6b 73 6f 72 74  OM t2 }.  cksort
39c0: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
39d0: 20 76 31 20 4f 52 44 45 52 20 42 59 20 31 20 4c   v1 ORDER BY 1 L
39e0: 49 4d 49 54 20 35 20 7d 0a 7d 20 7b 31 20 32 20  IMIT 5 }.} {1 2 
39f0: 33 20 34 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74  3 4 5 sort}.do_t
3a00: 65 73 74 20 73 65 6c 65 63 74 39 2d 34 2e 58 20  est select9-4.X 
3a10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3a20: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b    DROP INDEX i1;
3a30: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
3a40: 69 32 3b 0a 20 20 20 20 44 52 4f 50 20 56 49 45  i2;.    DROP VIE
3a50: 57 20 76 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  W v1;.  }.} {}..
3a60: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.