/ Hex Artifact Content
Login

Artifact e4501f54721f804ca56922e253403ac6775f88e9f07569994ce99212b3ca5b10:


0000: 23 20 32 30 31 32 20 53 65 70 74 20 32 37 0a 23  # 2012 Sept 27.#
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 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65   this file is te
01c0: 73 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 6f  sting that the o
01d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61  ptimizations tha
01e0: 74 20 64 69 73 61 62 6c 65 0a 23 20 4f 52 44 45  t disable.# ORDE
01f0: 52 20 42 59 20 63 6c 61 75 73 65 73 20 77 68 65  R BY clauses whe
0200: 6e 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 72  n the natural or
0210: 64 65 72 20 6f 66 20 61 20 71 75 65 72 79 20 69  der of a query i
0220: 73 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 0a 73  s correct..#...s
0230: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
0240: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0250: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0260: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20  /tester.tcl.set 
0270: 3a 3a 74 65 73 74 70 72 65 66 69 78 20 6f 72 64  ::testprefix ord
0280: 65 72 62 79 31 0a 0a 23 20 47 65 6e 65 72 61 74  erby1..# Generat
0290: 65 20 74 65 73 74 20 64 61 74 61 20 66 6f 72 20  e test data for 
02a0: 61 20 6a 6f 69 6e 2e 20 20 56 65 72 69 66 79 20  a join.  Verify 
02b0: 74 68 61 74 20 74 68 65 20 6a 6f 69 6e 20 67 65  that the join ge
02c0: 74 73 20 74 68 65 0a 23 20 63 6f 72 72 65 63 74  ts the.# correct
02d0: 20 61 6e 73 77 65 72 2e 0a 23 0a 64 6f 5f 74 65   answer..#.do_te
02e0: 73 74 20 31 2e 30 20 7b 0a 20 20 64 62 20 65 76  st 1.0 {.  db ev
02f0: 61 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  al {.    BEGIN;.
0300: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0310: 20 61 6c 62 75 6d 28 0a 20 20 20 20 20 20 61 69   album(.      ai
0320: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
0330: 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 74 69 74  Y KEY,.      tit
0340: 6c 65 20 54 45 58 54 20 55 4e 49 51 55 45 20 4e  le TEXT UNIQUE N
0350: 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20  OT NULL.    );. 
0360: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0370: 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 69 64  track(.      tid
0380: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0390: 20 4b 45 59 2c 0a 20 20 20 20 20 20 61 69 64 20   KEY,.      aid 
03a0: 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c 4c  INTEGER NOT NULL
03b0: 20 52 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75   REFERENCES albu
03c0: 6d 2c 0a 20 20 20 20 20 20 74 6e 20 49 4e 54 45  m,.      tn INTE
03d0: 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20  GER NOT NULL,.  
03e0: 20 20 20 20 6e 61 6d 65 20 54 45 58 54 2c 0a 20      name TEXT,. 
03f0: 20 20 20 20 20 55 4e 49 51 55 45 28 61 69 64 2c       UNIQUE(aid,
0400: 20 74 6e 29 0a 20 20 20 20 29 3b 0a 20 20 20 20   tn).    );.    
0410: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 6c 62 75  INSERT INTO albu
0420: 6d 20 56 41 4c 55 45 53 28 31 2c 20 27 31 2d 6f  m VALUES(1, '1-o
0430: 6e 65 27 29 2c 20 28 32 2c 20 27 32 2d 74 77 6f  ne'), (2, '2-two
0440: 27 29 2c 20 28 33 2c 20 27 33 2d 74 68 72 65 65  '), (3, '3-three
0450: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0460: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
0470: 0a 20 20 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20  .        (NULL, 
0480: 31 2c 20 31 2c 20 27 6f 6e 65 2d 61 27 29 2c 0a  1, 1, 'one-a'),.
0490: 20 20 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20 32          (NULL, 2
04a0: 2c 20 32 2c 20 27 74 77 6f 2d 62 27 29 2c 0a 20  , 2, 'two-b'),. 
04b0: 20 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20 33 2c         (NULL, 3,
04c0: 20 33 2c 20 27 74 68 72 65 65 2d 63 27 29 2c 0a   3, 'three-c'),.
04d0: 20 20 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20 31          (NULL, 1
04e0: 2c 20 33 2c 20 27 6f 6e 65 2d 63 27 29 2c 0a 20  , 3, 'one-c'),. 
04f0: 20 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20 32 2c         (NULL, 2,
0500: 20 31 2c 20 27 74 77 6f 2d 61 27 29 2c 0a 20 20   1, 'two-a'),.  
0510: 20 20 20 20 20 20 28 4e 55 4c 4c 2c 20 33 2c 20        (NULL, 3, 
0520: 31 2c 20 27 74 68 72 65 65 2d 61 27 29 3b 0a 20  1, 'three-a');. 
0530: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
0540: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 31 61   {}.do_test 1.1a
0550: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
0560: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
0570: 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74  ROM album JOIN t
0580: 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29  rack USING (aid)
0590: 20 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65 2c   ORDER BY title,
05a0: 20 74 6e 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 61   tn.  }.} {one-a
05b0: 20 6f 6e 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f   one-c two-a two
05c0: 2d 62 20 74 68 72 65 65 2d 61 20 74 68 72 65 65  -b three-a three
05d0: 2d 63 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68  -c}..# Verify th
05e0: 61 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  at the ORDER BY 
05f0: 63 6c 61 75 73 65 20 69 73 20 6f 70 74 69 6d 69  clause is optimi
0600: 7a 65 64 20 6f 75 74 0a 23 0a 64 6f 5f 74 65 73  zed out.#.do_tes
0610: 74 20 31 2e 31 62 20 7b 0a 20 20 64 62 20 65 76  t 1.1b {.  db ev
0620: 61 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e  al {.    EXPLAIN
0630: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20   QUERY PLAN.    
0640: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
0650: 20 61 6c 62 75 6d 20 43 52 4f 53 53 20 4a 4f 49   album CROSS JOI
0660: 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61  N track USING (a
0670: 69 64 29 20 4f 52 44 45 52 20 42 59 20 74 69 74  id) ORDER BY tit
0680: 6c 65 2c 20 74 6e 0a 20 20 7d 0a 7d 20 7b 7e 2f  le, tn.  }.} {~/
0690: 4f 52 44 45 52 20 42 59 2f 7d 20 20 3b 23 20 4f  ORDER BY/}  ;# O
06a0: 52 44 45 52 20 42 59 20 6f 70 74 69 6d 69 7a 65  RDER BY optimize
06b0: 64 20 6f 75 74 0a 0a 23 20 54 68 65 20 73 61 6d  d out..# The sam
06c0: 65 20 71 75 65 72 79 20 77 69 74 68 20 4f 52 44  e query with ORD
06d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 70 74  ER BY clause opt
06e0: 69 6d 69 7a 61 74 69 6f 6e 20 64 69 73 61 62 6c  imization disabl
06f0: 65 64 20 76 69 61 20 2b 20 6f 70 65 72 61 74 6f  ed via + operato
0700: 72 73 0a 23 20 73 68 6f 75 6c 64 20 67 69 76 65  rs.# should give
0710: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
0720: 65 20 61 6e 73 77 65 72 2e 0a 23 0a 64 6f 5f 74  e answer..#.do_t
0730: 65 73 74 20 31 2e 32 61 20 7b 0a 20 20 64 62 20  est 1.2a {.  db 
0740: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
0750: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75  T name FROM albu
0760: 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49  m JOIN track USI
0770: 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20 42  NG (aid) ORDER B
0780: 59 20 2b 74 69 74 6c 65 2c 20 2b 74 6e 0a 20 20  Y +title, +tn.  
0790: 7d 0a 7d 20 7b 6f 6e 65 2d 61 20 6f 6e 65 2d 63  }.} {one-a one-c
07a0: 20 74 77 6f 2d 61 20 74 77 6f 2d 62 20 74 68 72   two-a two-b thr
07b0: 65 65 2d 61 20 74 68 72 65 65 2d 63 7d 0a 0a 23  ee-a three-c}..#
07c0: 20 54 68 65 20 6f 75 74 70 75 74 20 69 73 20 73   The output is s
07d0: 6f 72 74 65 64 20 6d 61 6e 75 61 6c 6c 79 20 69  orted manually i
07e0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 23 0a 64  n this case..#.d
07f0: 6f 5f 74 65 73 74 20 31 2e 32 62 20 7b 0a 20 20  o_test 1.2b {.  
0800: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45 58  db eval {.    EX
0810: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0820: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
0830: 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e   FROM album JOIN
0840: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69   track USING (ai
0850: 64 29 20 4f 52 44 45 52 20 42 59 20 2b 74 69 74  d) ORDER BY +tit
0860: 6c 65 2c 20 2b 74 6e 0a 20 20 7d 0a 7d 20 7b 2f  le, +tn.  }.} {/
0870: 4f 52 44 45 52 20 42 59 2f 7d 20 20 20 3b 23 20  ORDER BY/}   ;# 
0880: 73 65 70 61 72 61 74 65 20 73 6f 72 74 69 6e 67  separate sorting
0890: 20 70 61 73 73 20 64 75 65 20 74 6f 20 22 2b 22   pass due to "+"
08a0: 20 6f 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72   on ORDER BY ter
08b0: 6d 73 0a 0a 23 20 54 68 65 20 73 61 6d 65 20 71  ms..# The same q
08c0: 75 65 72 79 20 77 69 74 68 20 4f 52 44 45 52 20  uery with ORDER 
08d0: 42 59 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  BY optimizations
08e0: 20 74 75 72 6e 65 64 20 6f 66 66 20 76 69 61 20   turned off via 
08f0: 62 75 69 6c 74 2d 69 6e 20 74 65 73 74 2e 0a 23  built-in test..#
0900: 0a 64 6f 5f 74 65 73 74 20 31 2e 33 61 20 7b 0a  .do_test 1.3a {.
0910: 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
0920: 6f 6e 74 72 6f 6c 20 64 62 20 6f 72 64 65 72 2d  ontrol db order-
0930: 62 79 2d 69 64 78 2d 6a 6f 69 6e 20 30 0a 20 20  by-idx-join 0.  
0940: 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
0950: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53   db eval {.    S
0960: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
0970: 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b  album JOIN track
0980: 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44   USING (aid) ORD
0990: 45 52 20 42 59 20 74 69 74 6c 65 2c 20 74 6e 0a  ER BY title, tn.
09a0: 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 61 20 6f 6e 65    }.} {one-a one
09b0: 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d 62 20 74  -c two-a two-b t
09c0: 68 72 65 65 2d 61 20 74 68 72 65 65 2d 63 7d 0a  hree-a three-c}.
09d0: 64 6f 5f 74 65 73 74 20 31 2e 33 62 20 7b 0a 20  do_test 1.3b {. 
09e0: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45   db eval {.    E
09f0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
0a00: 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  N.    SELECT nam
0a10: 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49  e FROM album JOI
0a20: 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61  N track USING (a
0a30: 69 64 29 20 4f 52 44 45 52 20 42 59 20 74 69 74  id) ORDER BY tit
0a40: 6c 65 2c 20 74 6e 0a 20 20 7d 0a 7d 20 7b 2f 4f  le, tn.  }.} {/O
0a50: 52 44 45 52 20 42 59 2f 7d 20 20 20 3b 23 20 73  RDER BY/}   ;# s
0a60: 65 70 61 72 61 74 65 20 73 6f 72 74 69 6e 67 20  eparate sorting 
0a70: 70 61 73 73 20 64 75 65 20 74 6f 20 64 69 73 61  pass due to disa
0a80: 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
0a90: 6e 0a 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63  n.optimization_c
0aa0: 6f 6e 74 72 6f 6c 20 64 62 20 61 6c 6c 20 31 0a  ontrol db all 1.
0ab0: 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 0a  db cache flush..
0ac0: 23 20 52 65 76 65 72 73 65 20 6f 72 64 65 72 20  # Reverse order 
0ad0: 73 6f 72 74 73 0a 23 0a 64 6f 5f 74 65 73 74 20  sorts.#.do_test 
0ae0: 31 2e 34 61 20 7b 0a 20 20 64 62 20 65 76 61 6c  1.4a {.  db eval
0af0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
0b00: 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f  me FROM album JO
0b10: 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28  IN track USING (
0b20: 61 69 64 29 20 4f 52 44 45 52 20 42 59 20 74 69  aid) ORDER BY ti
0b30: 74 6c 65 20 44 45 53 43 2c 20 74 6e 0a 20 20 7d  tle DESC, tn.  }
0b40: 0a 7d 20 7b 74 68 72 65 65 2d 61 20 74 68 72 65  .} {three-a thre
0b50: 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d 62 20  e-c two-a two-b 
0b60: 6f 6e 65 2d 61 20 6f 6e 65 2d 63 7d 0a 64 6f 5f  one-a one-c}.do_
0b70: 74 65 73 74 20 31 2e 34 62 20 7b 0a 20 20 64 62  test 1.4b {.  db
0b80: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
0b90: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62  CT name FROM alb
0ba0: 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53  um JOIN track US
0bb0: 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20  ING (aid) ORDER 
0bc0: 42 59 20 2b 74 69 74 6c 65 20 44 45 53 43 2c 20  BY +title DESC, 
0bd0: 2b 74 6e 0a 20 20 7d 0a 7d 20 7b 74 68 72 65 65  +tn.  }.} {three
0be0: 2d 61 20 74 68 72 65 65 2d 63 20 74 77 6f 2d 61  -a three-c two-a
0bf0: 20 74 77 6f 2d 62 20 6f 6e 65 2d 61 20 6f 6e 65   two-b one-a one
0c00: 2d 63 7d 20 20 3b 23 20 76 65 72 69 66 79 20 73  -c}  ;# verify s
0c10: 61 6d 65 20 6f 72 64 65 72 20 61 66 74 65 72 20  ame order after 
0c20: 73 6f 72 74 69 6e 67 0a 64 6f 5f 74 65 73 74 20  sorting.do_test 
0c30: 31 2e 34 63 20 7b 0a 20 20 64 62 20 65 76 61 6c  1.4c {.  db eval
0c40: 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51   {.    EXPLAIN Q
0c50: 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45  UERY PLAN.    SE
0c60: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
0c70: 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20  lbum JOIN track 
0c80: 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45  USING (aid) ORDE
0c90: 52 20 42 59 20 74 69 74 6c 65 20 44 45 53 43 2c  R BY title DESC,
0ca0: 20 74 6e 0a 20 20 7d 0a 7d 20 7b 7e 2f 4f 52 44   tn.  }.} {~/ORD
0cb0: 45 52 20 42 59 2f 7d 20 20 3b 23 20 4f 52 44 45  ER BY/}  ;# ORDE
0cc0: 52 20 42 59 20 73 75 70 70 72 65 73 73 65 64 20  R BY suppressed 
0cd0: 64 75 65 20 74 6f 20 75 6e 69 71 75 65 6e 65 73  due to uniquenes
0ce0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 0a 64  s constraints..d
0cf0: 6f 5f 74 65 73 74 20 31 2e 35 61 20 7b 0a 20 20  o_test 1.5a {.  
0d00: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45  db eval {.    SE
0d10: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
0d20: 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20  lbum JOIN track 
0d30: 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45  USING (aid) ORDE
0d40: 52 20 42 59 20 74 69 74 6c 65 2c 20 74 6e 20 44  R BY title, tn D
0d50: 45 53 43 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 63  ESC.  }.} {one-c
0d60: 20 6f 6e 65 2d 61 20 74 77 6f 2d 62 20 74 77 6f   one-a two-b two
0d70: 2d 61 20 74 68 72 65 65 2d 63 20 74 68 72 65 65  -a three-c three
0d80: 2d 61 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 35 62  -a}.do_test 1.5b
0d90: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
0da0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
0db0: 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74  ROM album JOIN t
0dc0: 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29  rack USING (aid)
0dd0: 20 4f 52 44 45 52 20 42 59 20 2b 74 69 74 6c 65   ORDER BY +title
0de0: 2c 20 2b 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d  , +tn DESC.  }.}
0df0: 20 7b 6f 6e 65 2d 63 20 6f 6e 65 2d 61 20 74 77   {one-c one-a tw
0e00: 6f 2d 62 20 74 77 6f 2d 61 20 74 68 72 65 65 2d  o-b two-a three-
0e10: 63 20 74 68 72 65 65 2d 61 7d 20 20 3b 23 20 76  c three-a}  ;# v
0e20: 65 72 69 66 79 20 73 61 6d 65 20 6f 72 64 65 72  erify same order
0e30: 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 0a 64   after sorting.d
0e40: 6f 5f 74 65 73 74 20 31 2e 35 63 20 7b 0a 20 20  o_test 1.5c {.  
0e50: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45 58  db eval {.    EX
0e60: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0e70: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
0e80: 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e   FROM album JOIN
0e90: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69   track USING (ai
0ea0: 64 29 20 4f 52 44 45 52 20 42 59 20 74 69 74 6c  d) ORDER BY titl
0eb0: 65 2c 20 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d  e, tn DESC.  }.}
0ec0: 20 7b 7e 2f 4f 52 44 45 52 20 42 59 2f 7d 20 20   {~/ORDER BY/}  
0ed0: 3b 23 20 4f 52 44 45 52 20 42 59 20 73 75 70 70  ;# ORDER BY supp
0ee0: 72 65 73 73 65 64 20 64 75 65 20 74 6f 20 75 6e  ressed due to un
0ef0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 73 74 72 61  iqueness constra
0f00: 69 6e 74 73 0a 0a 64 6f 5f 74 65 73 74 20 31 2e  ints..do_test 1.
0f10: 36 61 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  6a {.  db eval {
0f20: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
0f30: 20 46 52 4f 4d 20 61 6c 62 75 6d 20 43 52 4f 53   FROM album CROS
0f40: 53 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49  S JOIN track USI
0f50: 4e 47 20 28 61 69 64 29 0a 20 20 20 20 20 4f 52  NG (aid).     OR
0f60: 44 45 52 20 42 59 20 74 69 74 6c 65 20 44 45 53  DER BY title DES
0f70: 43 2c 20 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d  C, tn DESC.  }.}
0f80: 20 7b 74 68 72 65 65 2d 63 20 74 68 72 65 65 2d   {three-c three-
0f90: 61 20 74 77 6f 2d 62 20 74 77 6f 2d 61 20 6f 6e  a two-b two-a on
0fa0: 65 2d 63 20 6f 6e 65 2d 61 7d 0a 64 6f 5f 74 65  e-c one-a}.do_te
0fb0: 73 74 20 31 2e 36 62 20 7b 0a 20 20 64 62 20 65  st 1.6b {.  db e
0fc0: 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  val {.    SELECT
0fd0: 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d   name FROM album
0fe0: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 72 61 63   CROSS JOIN trac
0ff0: 6b 20 55 53 49 4e 47 20 28 61 69 64 29 0a 20 20  k USING (aid).  
1000: 20 20 20 4f 52 44 45 52 20 42 59 20 2b 74 69 74     ORDER BY +tit
1010: 6c 65 20 44 45 53 43 2c 20 2b 74 6e 20 44 45 53  le DESC, +tn DES
1020: 43 0a 20 20 7d 0a 7d 20 7b 74 68 72 65 65 2d 63  C.  }.} {three-c
1030: 20 74 68 72 65 65 2d 61 20 74 77 6f 2d 62 20 74   three-a two-b t
1040: 77 6f 2d 61 20 6f 6e 65 2d 63 20 6f 6e 65 2d 61  wo-a one-c one-a
1050: 7d 20 20 3b 23 20 76 65 72 69 66 79 20 73 61 6d  }  ;# verify sam
1060: 65 20 6f 72 64 65 72 20 61 66 74 65 72 20 73 6f  e order after so
1070: 72 74 69 6e 67 0a 64 6f 5f 74 65 73 74 20 31 2e  rting.do_test 1.
1080: 36 63 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  6c {.  db eval {
1090: 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45  .    EXPLAIN QUE
10a0: 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45 4c 45  RY PLAN.    SELE
10b0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62  CT name FROM alb
10c0: 75 6d 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 72  um CROSS JOIN tr
10d0: 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 0a  ack USING (aid).
10e0: 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 74 69       ORDER BY ti
10f0: 74 6c 65 20 44 45 53 43 2c 20 74 6e 20 44 45 53  tle DESC, tn DES
1100: 43 0a 20 20 7d 0a 7d 20 7b 7e 2f 4f 52 44 45 52  C.  }.} {~/ORDER
1110: 20 42 59 2f 7d 20 20 3b 23 20 4f 52 44 45 52 20   BY/}  ;# ORDER 
1120: 42 59 20 0a 0a 0a 23 20 52 65 63 6f 6e 73 74 72  BY ...# Reconstr
1130: 75 63 74 20 74 68 65 20 74 65 73 74 20 64 61 74  uct the test dat
1140: 61 20 74 6f 20 75 73 65 20 69 6e 64 69 63 65 73  a to use indices
1150: 20 72 61 74 68 65 72 20 74 68 61 6e 20 69 6e 74   rather than int
1160: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
1170: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 30  s..#.do_test 2.0
1180: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
1190: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 52     BEGIN;.    DR
11a0: 4f 50 20 54 41 42 4c 45 20 61 6c 62 75 6d 3b 0a  OP TABLE album;.
11b0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
11c0: 72 61 63 6b 3b 0a 20 20 20 20 43 52 45 41 54 45  rack;.    CREATE
11d0: 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a 20 20   TABLE album(.  
11e0: 20 20 20 20 61 69 64 20 49 4e 54 20 50 52 49 4d      aid INT PRIM
11f0: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 74  ARY KEY,.      t
1200: 69 74 6c 65 20 54 45 58 54 20 4e 4f 54 20 4e 55  itle TEXT NOT NU
1210: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  LL.    );.    CR
1220: 45 41 54 45 20 49 4e 44 45 58 20 61 6c 62 75 6d  EATE INDEX album
1230: 5f 69 31 20 4f 4e 20 61 6c 62 75 6d 28 74 69 74  _i1 ON album(tit
1240: 6c 65 2c 20 61 69 64 29 3b 0a 20 20 20 20 43 52  le, aid);.    CR
1250: 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b  EATE TABLE track
1260: 28 0a 20 20 20 20 20 20 61 69 64 20 49 4e 54 45  (.      aid INTE
1270: 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 20 52 45 46  GER NOT NULL REF
1280: 45 52 45 4e 43 45 53 20 61 6c 62 75 6d 2c 0a 20  ERENCES album,. 
1290: 20 20 20 20 20 74 6e 20 49 4e 54 45 47 45 52 20       tn INTEGER 
12a0: 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  NOT NULL,.      
12b0: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20  name TEXT,.     
12c0: 20 55 4e 49 51 55 45 28 61 69 64 2c 20 74 6e 29   UNIQUE(aid, tn)
12d0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
12e0: 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41  RT INTO album VA
12f0: 4c 55 45 53 28 31 2c 20 27 31 2d 6f 6e 65 27 29  LUES(1, '1-one')
1300: 2c 20 28 32 30 2c 20 27 32 2d 74 77 6f 27 29 2c  , (20, '2-two'),
1310: 20 28 33 2c 20 27 33 2d 74 68 72 65 65 27 29 3b   (3, '3-three');
1320: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1330: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 0a 20 20   track VALUES.  
1340: 20 20 20 20 20 20 28 31 2c 20 20 31 2c 20 27 6f        (1,  1, 'o
1350: 6e 65 2d 61 27 29 2c 0a 20 20 20 20 20 20 20 20  ne-a'),.        
1360: 28 32 30 2c 20 32 2c 20 27 74 77 6f 2d 62 27 29  (20, 2, 'two-b')
1370: 2c 0a 20 20 20 20 20 20 20 20 28 33 2c 20 20 33  ,.        (3,  3
1380: 2c 20 27 74 68 72 65 65 2d 63 27 29 2c 0a 20 20  , 'three-c'),.  
1390: 20 20 20 20 20 20 28 31 2c 20 20 33 2c 20 27 6f        (1,  3, 'o
13a0: 6e 65 2d 63 27 29 2c 0a 20 20 20 20 20 20 20 20  ne-c'),.        
13b0: 28 32 30 2c 20 31 2c 20 27 74 77 6f 2d 61 27 29  (20, 1, 'two-a')
13c0: 2c 0a 20 20 20 20 20 20 20 20 28 33 2c 20 20 31  ,.        (3,  1
13d0: 2c 20 27 74 68 72 65 65 2d 61 27 29 3b 0a 20 20  , 'three-a');.  
13e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
13f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 31 61 20  {}.do_test 2.1a 
1400: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
1410: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
1420: 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72  OM album JOIN tr
1430: 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20  ack USING (aid) 
1440: 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65 2c 20  ORDER BY title, 
1450: 74 6e 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 61 20  tn.  }.} {one-a 
1460: 6f 6e 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d  one-c two-a two-
1470: 62 20 74 68 72 65 65 2d 61 20 74 68 72 65 65 2d  b three-a three-
1480: 63 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61  c}..# Verify tha
1490: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
14a0: 6c 61 75 73 65 20 69 73 20 6f 70 74 69 6d 69 7a  lause is optimiz
14b0: 65 64 20 6f 75 74 0a 23 0a 64 6f 5f 74 65 73 74  ed out.#.do_test
14c0: 20 32 2e 31 62 20 7b 0a 20 20 64 62 20 65 76 61   2.1b {.  db eva
14d0: 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20  l {.    EXPLAIN 
14e0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53  QUERY PLAN.    S
14f0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
1500: 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b  album JOIN track
1510: 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44   USING (aid) ORD
1520: 45 52 20 42 59 20 74 69 74 6c 65 2c 20 74 6e 0a  ER BY title, tn.
1530: 20 20 7d 0a 7d 20 7b 2f 4f 52 44 45 52 20 42 59    }.} {/ORDER BY
1540: 2f 7d 20 20 3b 23 20 4f 52 44 45 52 20 42 59 20  /}  ;# ORDER BY 
1550: 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
1560: 20 6f 66 20 6d 69 73 73 69 6e 67 20 61 69 64 20   of missing aid 
1570: 74 65 72 6d 20 69 6e 20 4f 52 44 45 52 20 42 59  term in ORDER BY
1580: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 63 20 7b  ..do_test 2.1c {
1590: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
15a0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
15b0: 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61  M album JOIN tra
15c0: 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f  ck USING (aid) O
15d0: 52 44 45 52 20 42 59 20 74 69 74 6c 65 2c 20 61  RDER BY title, a
15e0: 69 64 2c 20 74 6e 0a 20 20 7d 0a 7d 20 7b 6f 6e  id, tn.  }.} {on
15f0: 65 2d 61 20 6f 6e 65 2d 63 20 74 77 6f 2d 61 20  e-a one-c two-a 
1600: 74 77 6f 2d 62 20 74 68 72 65 65 2d 61 20 74 68  two-b three-a th
1610: 72 65 65 2d 63 7d 0a 64 6f 5f 74 65 73 74 20 32  ree-c}.do_test 2
1620: 2e 31 64 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  .1d {.  db eval 
1630: 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55  {.    EXPLAIN QU
1640: 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45 4c  ERY PLAN.    SEL
1650: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c  ECT name FROM al
1660: 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55  bum JOIN track U
1670: 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52  SING (aid) ORDER
1680: 20 42 59 20 74 69 74 6c 65 2c 20 61 69 64 2c 20   BY title, aid, 
1690: 74 6e 0a 20 20 7d 0a 7d 20 7b 2f 4f 52 44 45 52  tn.  }.} {/ORDER
16a0: 20 42 59 2f 7d 20 20 3b 23 20 4f 52 44 45 52 20   BY/}  ;# ORDER 
16b0: 42 59 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  BY required in t
16c0: 68 69 73 20 63 61 73 65 0a 0a 23 20 54 68 65 20  his case..# The 
16d0: 73 61 6d 65 20 71 75 65 72 79 20 77 69 74 68 20  same query with 
16e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16f0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 64 69 73  optimization dis
1700: 61 62 6c 65 64 20 76 69 61 20 2b 20 6f 70 65 72  abled via + oper
1710: 61 74 6f 72 73 0a 23 20 73 68 6f 75 6c 64 20 67  ators.# should g
1720: 69 76 65 20 65 78 61 63 74 6c 79 20 74 68 65 20  ive exactly the 
1730: 73 61 6d 65 20 61 6e 73 77 65 72 2e 0a 23 0a 64  same answer..#.d
1740: 6f 5f 74 65 73 74 20 32 2e 32 61 20 7b 0a 20 20  o_test 2.2a {.  
1750: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45  db eval {.    SE
1760: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
1770: 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20  lbum JOIN track 
1780: 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45  USING (aid) ORDE
1790: 52 20 42 59 20 2b 74 69 74 6c 65 2c 20 2b 74 6e  R BY +title, +tn
17a0: 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 61 20 6f 6e  .  }.} {one-a on
17b0: 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d 62 20  e-c two-a two-b 
17c0: 74 68 72 65 65 2d 61 20 74 68 72 65 65 2d 63 7d  three-a three-c}
17d0: 0a 0a 23 20 54 68 65 20 6f 75 74 70 75 74 20 69  ..# The output i
17e0: 73 20 73 6f 72 74 65 64 20 6d 61 6e 75 61 6c 6c  s sorted manuall
17f0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
1800: 23 0a 64 6f 5f 74 65 73 74 20 32 2e 32 62 20 7b  #.do_test 2.2b {
1810: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
1820: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1830: 4c 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  LAN.    SELECT n
1840: 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a  ame FROM album J
1850: 4f 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20  OIN track USING 
1860: 28 61 69 64 29 20 4f 52 44 45 52 20 42 59 20 2b  (aid) ORDER BY +
1870: 74 69 74 6c 65 2c 20 2b 74 6e 0a 20 20 7d 0a 7d  title, +tn.  }.}
1880: 20 7b 2f 4f 52 44 45 52 20 42 59 2f 7d 20 20 20   {/ORDER BY/}   
1890: 3b 23 20 73 65 70 61 72 61 74 65 20 73 6f 72 74  ;# separate sort
18a0: 69 6e 67 20 70 61 73 73 20 64 75 65 20 74 6f 20  ing pass due to 
18b0: 22 2b 22 20 6f 6e 20 4f 52 44 45 52 20 42 59 20  "+" on ORDER BY 
18c0: 74 65 72 6d 73 0a 0a 23 20 54 68 65 20 73 61 6d  terms..# The sam
18d0: 65 20 71 75 65 72 79 20 77 69 74 68 20 4f 52 44  e query with ORD
18e0: 45 52 20 42 59 20 6f 70 74 69 6d 69 7a 61 74 69  ER BY optimizati
18f0: 6f 6e 73 20 74 75 72 6e 65 64 20 6f 66 66 20 76  ons turned off v
1900: 69 61 20 62 75 69 6c 74 2d 69 6e 20 74 65 73 74  ia built-in test
1910: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 33 61  ..#.do_test 2.3a
1920: 20 7b 0a 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f   {.  optimizatio
1930: 6e 5f 63 6f 6e 74 72 6f 6c 20 64 62 20 6f 72 64  n_control db ord
1940: 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 20 30  er-by-idx-join 0
1950: 0a 20 20 64 62 20 63 61 63 68 65 20 66 6c 75 73  .  db cache flus
1960: 68 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  h.  db eval {.  
1970: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
1980: 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72  OM album JOIN tr
1990: 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20  ack USING (aid) 
19a0: 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65 2c 20  ORDER BY title, 
19b0: 74 6e 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 61 20  tn.  }.} {one-a 
19c0: 6f 6e 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d  one-c two-a two-
19d0: 62 20 74 68 72 65 65 2d 61 20 74 68 72 65 65 2d  b three-a three-
19e0: 63 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 33 62 20  c}.do_test 2.3b 
19f0: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
1a00: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
1a10: 50 4c 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20  PLAN.    SELECT 
1a20: 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20  name FROM album 
1a30: 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47  JOIN track USING
1a40: 20 28 61 69 64 29 20 4f 52 44 45 52 20 42 59 20   (aid) ORDER BY 
1a50: 74 69 74 6c 65 2c 20 74 6e 0a 20 20 7d 0a 7d 20  title, tn.  }.} 
1a60: 7b 2f 4f 52 44 45 52 20 42 59 2f 7d 20 20 20 3b  {/ORDER BY/}   ;
1a70: 23 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 69  # separate sorti
1a80: 6e 67 20 70 61 73 73 20 64 75 65 20 74 6f 20 64  ng pass due to d
1a90: 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
1aa0: 74 69 6f 6e 0a 6f 70 74 69 6d 69 7a 61 74 69 6f  tion.optimizatio
1ab0: 6e 5f 63 6f 6e 74 72 6f 6c 20 64 62 20 61 6c 6c  n_control db all
1ac0: 20 31 0a 64 62 20 63 61 63 68 65 20 66 6c 75 73   1.db cache flus
1ad0: 68 0a 0a 23 20 52 65 76 65 72 73 65 20 6f 72 64  h..# Reverse ord
1ae0: 65 72 20 73 6f 72 74 73 0a 23 0a 64 6f 5f 74 65  er sorts.#.do_te
1af0: 73 74 20 32 2e 34 61 20 7b 0a 20 20 64 62 20 65  st 2.4a {.  db e
1b00: 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  val {.    SELECT
1b10: 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d   name FROM album
1b20: 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49 4e   JOIN track USIN
1b30: 47 20 28 61 69 64 29 20 4f 52 44 45 52 20 42 59  G (aid) ORDER BY
1b40: 20 74 69 74 6c 65 20 44 45 53 43 2c 20 74 6e 0a   title DESC, tn.
1b50: 20 20 7d 0a 7d 20 7b 74 68 72 65 65 2d 61 20 74    }.} {three-a t
1b60: 68 72 65 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f  hree-c two-a two
1b70: 2d 62 20 6f 6e 65 2d 61 20 6f 6e 65 2d 63 7d 0a  -b one-a one-c}.
1b80: 64 6f 5f 74 65 73 74 20 32 2e 34 62 20 7b 0a 20  do_test 2.4b {. 
1b90: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53   db eval {.    S
1ba0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
1bb0: 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b  album JOIN track
1bc0: 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44   USING (aid) ORD
1bd0: 45 52 20 42 59 20 2b 74 69 74 6c 65 20 44 45 53  ER BY +title DES
1be0: 43 2c 20 2b 74 6e 0a 20 20 7d 0a 7d 20 7b 74 68  C, +tn.  }.} {th
1bf0: 72 65 65 2d 61 20 74 68 72 65 65 2d 63 20 74 77  ree-a three-c tw
1c00: 6f 2d 61 20 74 77 6f 2d 62 20 6f 6e 65 2d 61 20  o-a two-b one-a 
1c10: 6f 6e 65 2d 63 7d 20 20 3b 23 20 76 65 72 69 66  one-c}  ;# verif
1c20: 79 20 73 61 6d 65 20 6f 72 64 65 72 20 61 66 74  y same order aft
1c30: 65 72 20 73 6f 72 74 69 6e 67 0a 64 6f 5f 74 65  er sorting.do_te
1c40: 73 74 20 32 2e 34 63 20 7b 0a 20 20 64 62 20 65  st 2.4c {.  db e
1c50: 76 61 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49  val {.    EXPLAI
1c60: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20  N QUERY PLAN.   
1c70: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
1c80: 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61  M album JOIN tra
1c90: 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f  ck USING (aid) O
1ca0: 52 44 45 52 20 42 59 20 74 69 74 6c 65 20 44 45  RDER BY title DE
1cb0: 53 43 2c 20 74 6e 0a 20 20 7d 0a 7d 20 7b 2f 4f  SC, tn.  }.} {/O
1cc0: 52 44 45 52 20 42 59 2f 7d 20 20 3b 23 20 73 65  RDER BY/}  ;# se
1cd0: 70 61 72 61 74 65 20 73 6f 72 74 69 6e 67 20 70  parate sorting p
1ce0: 61 73 73 20 64 75 65 20 74 6f 20 6d 69 78 65 64  ass due to mixed
1cf0: 20 44 45 53 43 2f 41 53 43 0a 0a 0a 64 6f 5f 74   DESC/ASC...do_t
1d00: 65 73 74 20 32 2e 35 61 20 7b 0a 20 20 64 62 20  est 2.5a {.  db 
1d10: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
1d20: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75  T name FROM albu
1d30: 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49  m JOIN track USI
1d40: 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20 42  NG (aid) ORDER B
1d50: 59 20 74 69 74 6c 65 2c 20 74 6e 20 44 45 53 43  Y title, tn DESC
1d60: 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 2d 63 20 6f 6e  .  }.} {one-c on
1d70: 65 2d 61 20 74 77 6f 2d 62 20 74 77 6f 2d 61 20  e-a two-b two-a 
1d80: 74 68 72 65 65 2d 63 20 74 68 72 65 65 2d 61 7d  three-c three-a}
1d90: 0a 64 6f 5f 74 65 73 74 20 32 2e 35 62 20 7b 0a  .do_test 2.5b {.
1da0: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
1db0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
1dc0: 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63   album JOIN trac
1dd0: 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52  k USING (aid) OR
1de0: 44 45 52 20 42 59 20 2b 74 69 74 6c 65 2c 20 2b  DER BY +title, +
1df0: 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 6f  tn DESC.  }.} {o
1e00: 6e 65 2d 63 20 6f 6e 65 2d 61 20 74 77 6f 2d 62  ne-c one-a two-b
1e10: 20 74 77 6f 2d 61 20 74 68 72 65 65 2d 63 20 74   two-a three-c t
1e20: 68 72 65 65 2d 61 7d 20 20 3b 23 20 76 65 72 69  hree-a}  ;# veri
1e30: 66 79 20 73 61 6d 65 20 6f 72 64 65 72 20 61 66  fy same order af
1e40: 74 65 72 20 73 6f 72 74 69 6e 67 0a 64 6f 5f 74  ter sorting.do_t
1e50: 65 73 74 20 32 2e 35 63 20 7b 0a 20 20 64 62 20  est 2.5c {.  db 
1e60: 65 76 61 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41  eval {.    EXPLA
1e70: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
1e80: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
1e90: 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72  OM album JOIN tr
1ea0: 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20  ack USING (aid) 
1eb0: 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65 2c 20  ORDER BY title, 
1ec0: 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 2f  tn DESC.  }.} {/
1ed0: 4f 52 44 45 52 20 42 59 2f 7d 20 20 3b 23 20 73  ORDER BY/}  ;# s
1ee0: 65 70 61 72 61 74 65 20 73 6f 72 74 69 6e 67 20  eparate sorting 
1ef0: 70 61 73 73 20 64 75 65 20 74 6f 20 6d 69 78 65  pass due to mixe
1f00: 64 20 41 53 43 2f 44 45 53 43 0a 0a 64 6f 5f 74  d ASC/DESC..do_t
1f10: 65 73 74 20 32 2e 36 61 20 7b 0a 20 20 64 62 20  est 2.6a {.  db 
1f20: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
1f30: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75  T name FROM albu
1f40: 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49  m JOIN track USI
1f50: 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20 42  NG (aid) ORDER B
1f60: 59 20 74 69 74 6c 65 20 44 45 53 43 2c 20 74 6e  Y title DESC, tn
1f70: 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 74 68 72   DESC.  }.} {thr
1f80: 65 65 2d 63 20 74 68 72 65 65 2d 61 20 74 77 6f  ee-c three-a two
1f90: 2d 62 20 74 77 6f 2d 61 20 6f 6e 65 2d 63 20 6f  -b two-a one-c o
1fa0: 6e 65 2d 61 7d 0a 64 6f 5f 74 65 73 74 20 32 2e  ne-a}.do_test 2.
1fb0: 36 62 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  6b {.  db eval {
1fc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
1fd0: 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e   FROM album JOIN
1fe0: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69   track USING (ai
1ff0: 64 29 20 4f 52 44 45 52 20 42 59 20 2b 74 69 74  d) ORDER BY +tit
2000: 6c 65 20 44 45 53 43 2c 20 2b 74 6e 20 44 45 53  le DESC, +tn DES
2010: 43 0a 20 20 7d 0a 7d 20 7b 74 68 72 65 65 2d 63  C.  }.} {three-c
2020: 20 74 68 72 65 65 2d 61 20 74 77 6f 2d 62 20 74   three-a two-b t
2030: 77 6f 2d 61 20 6f 6e 65 2d 63 20 6f 6e 65 2d 61  wo-a one-c one-a
2040: 7d 20 20 3b 23 20 76 65 72 69 66 79 20 73 61 6d  }  ;# verify sam
2050: 65 20 6f 72 64 65 72 20 61 66 74 65 72 20 73 6f  e order after so
2060: 72 74 69 6e 67 0a 64 6f 5f 74 65 73 74 20 32 2e  rting.do_test 2.
2070: 36 63 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  6c {.  db eval {
2080: 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45  .    EXPLAIN QUE
2090: 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45 4c 45  RY PLAN.    SELE
20a0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62  CT name FROM alb
20b0: 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53  um JOIN track US
20c0: 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20  ING (aid) ORDER 
20d0: 42 59 20 74 69 74 6c 65 20 44 45 53 43 2c 20 74  BY title DESC, t
20e0: 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 2f 4f  n DESC.  }.} {/O
20f0: 52 44 45 52 20 42 59 2f 7d 20 20 3b 23 20 4f 52  RDER BY/}  ;# OR
2100: 44 45 52 20 42 59 20 72 65 71 75 69 72 65 64 0a  DER BY required.
2110: 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 61 6e 6f  ..# Generate ano
2120: 74 68 65 72 20 74 65 73 74 20 64 61 74 61 73 65  ther test datase
2130: 74 2c 20 62 75 74 20 74 68 69 73 20 74 69 6d 65  t, but this time
2140: 20 75 73 69 6e 67 20 6d 69 78 65 64 20 41 53 43   using mixed ASC
2150: 2f 44 45 53 43 20 69 6e 64 69 63 65 73 2e 0a 23  /DESC indices..#
2160: 0a 64 6f 5f 74 65 73 74 20 33 2e 30 20 7b 0a 20  .do_test 3.0 {. 
2170: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 42   db eval {.    B
2180: 45 47 49 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54  EGIN;.    DROP T
2190: 41 42 4c 45 20 61 6c 62 75 6d 3b 0a 20 20 20 20  ABLE album;.    
21a0: 44 52 4f 50 20 54 41 42 4c 45 20 74 72 61 63 6b  DROP TABLE track
21b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
21c0: 4c 45 20 61 6c 62 75 6d 28 0a 20 20 20 20 20 20  LE album(.      
21d0: 61 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  aid INTEGER PRIM
21e0: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 74  ARY KEY,.      t
21f0: 69 74 6c 65 20 54 45 58 54 20 55 4e 49 51 55 45  itle TEXT UNIQUE
2200: 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b   NOT NULL.    );
2210: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2220: 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74  E track(.      t
2230: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
2240: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 61 69  RY KEY,.      ai
2250: 64 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55  d INTEGER NOT NU
2260: 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20 61 6c  LL REFERENCES al
2270: 62 75 6d 2c 0a 20 20 20 20 20 20 74 6e 20 49 4e  bum,.      tn IN
2280: 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 0a  TEGER NOT NULL,.
2290: 20 20 20 20 20 20 6e 61 6d 65 20 54 45 58 54 2c        name TEXT,
22a0: 0a 20 20 20 20 20 20 55 4e 49 51 55 45 28 61 69  .      UNIQUE(ai
22b0: 64 20 41 53 43 2c 20 74 6e 20 44 45 53 43 29 0a  d ASC, tn DESC).
22c0: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
22d0: 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41 4c  T INTO album VAL
22e0: 55 45 53 28 31 2c 20 27 31 2d 6f 6e 65 27 29 2c  UES(1, '1-one'),
22f0: 20 28 32 2c 20 27 32 2d 74 77 6f 27 29 2c 20 28   (2, '2-two'), (
2300: 33 2c 20 27 33 2d 74 68 72 65 65 27 29 3b 0a 20  3, '3-three');. 
2310: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2320: 72 61 63 6b 20 56 41 4c 55 45 53 0a 20 20 20 20  rack VALUES.    
2330: 20 20 20 20 28 4e 55 4c 4c 2c 20 31 2c 20 31 2c      (NULL, 1, 1,
2340: 20 27 6f 6e 65 2d 61 27 29 2c 0a 20 20 20 20 20   'one-a'),.     
2350: 20 20 20 28 4e 55 4c 4c 2c 20 32 2c 20 32 2c 20     (NULL, 2, 2, 
2360: 27 74 77 6f 2d 62 27 29 2c 0a 20 20 20 20 20 20  'two-b'),.      
2370: 20 20 28 4e 55 4c 4c 2c 20 33 2c 20 33 2c 20 27    (NULL, 3, 3, '
2380: 74 68 72 65 65 2d 63 27 29 2c 0a 20 20 20 20 20  three-c'),.     
2390: 20 20 20 28 4e 55 4c 4c 2c 20 31 2c 20 33 2c 20     (NULL, 1, 3, 
23a0: 27 6f 6e 65 2d 63 27 29 2c 0a 20 20 20 20 20 20  'one-c'),.      
23b0: 20 20 28 4e 55 4c 4c 2c 20 32 2c 20 31 2c 20 27    (NULL, 2, 1, '
23c0: 74 77 6f 2d 61 27 29 2c 0a 20 20 20 20 20 20 20  two-a'),.       
23d0: 20 28 4e 55 4c 4c 2c 20 33 2c 20 31 2c 20 27 74   (NULL, 3, 1, 't
23e0: 68 72 65 65 2d 61 27 29 3b 0a 20 20 20 20 43 4f  hree-a');.    CO
23f0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  MMIT;.  }.} {}.d
2400: 6f 5f 74 65 73 74 20 33 2e 31 61 20 7b 0a 20 20  o_test 3.1a {.  
2410: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45  db eval {.    SE
2420: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
2430: 6c 62 75 6d 20 43 52 4f 53 53 20 4a 4f 49 4e 20  lbum CROSS JOIN 
2440: 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64  track USING (aid
2450: 29 20 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65  ) ORDER BY title
2460: 2c 20 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20  , tn DESC.  }.} 
2470: 7b 6f 6e 65 2d 63 20 6f 6e 65 2d 61 20 74 77 6f  {one-c one-a two
2480: 2d 62 20 74 77 6f 2d 61 20 74 68 72 65 65 2d 63  -b two-a three-c
2490: 20 74 68 72 65 65 2d 61 7d 0a 0a 23 20 56 65 72   three-a}..# Ver
24a0: 69 66 79 20 74 68 61 74 20 74 68 65 20 4f 52 44  ify that the ORD
24b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
24c0: 6f 70 74 69 6d 69 7a 65 64 20 6f 75 74 0a 23 0a  optimized out.#.
24d0: 64 6f 5f 74 65 73 74 20 33 2e 31 62 20 7b 0a 20  do_test 3.1b {. 
24e0: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45   db eval {.    E
24f0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2500: 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  N.    SELECT nam
2510: 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 43 52 4f  e FROM album CRO
2520: 53 53 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53  SS JOIN track US
2530: 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52 20  ING (aid) ORDER 
2540: 42 59 20 74 69 74 6c 65 2c 20 74 6e 20 44 45 53  BY title, tn DES
2550: 43 0a 20 20 7d 0a 7d 20 7b 7e 2f 4f 52 44 45 52  C.  }.} {~/ORDER
2560: 20 42 59 2f 7d 20 20 3b 23 20 4f 52 44 45 52 20   BY/}  ;# ORDER 
2570: 42 59 20 6f 70 74 69 6d 69 7a 65 64 20 6f 75 74  BY optimized out
2580: 0a 0a 23 20 54 68 65 20 73 61 6d 65 20 71 75 65  ..# The same que
2590: 72 79 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  ry with ORDER BY
25a0: 20 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61   clause optimiza
25b0: 74 69 6f 6e 20 64 69 73 61 62 6c 65 64 20 76 69  tion disabled vi
25c0: 61 20 2b 20 6f 70 65 72 61 74 6f 72 73 0a 23 20  a + operators.# 
25d0: 73 68 6f 75 6c 64 20 67 69 76 65 20 65 78 61 63  should give exac
25e0: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 6e 73  tly the same ans
25f0: 77 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 33  wer..#.do_test 3
2600: 2e 32 61 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  .2a {.  db eval 
2610: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  {.    SELECT nam
2620: 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49  e FROM album JOI
2630: 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61  N track USING (a
2640: 69 64 29 20 4f 52 44 45 52 20 42 59 20 2b 74 69  id) ORDER BY +ti
2650: 74 6c 65 2c 20 2b 74 6e 20 44 45 53 43 0a 20 20  tle, +tn DESC.  
2660: 7d 0a 7d 20 7b 6f 6e 65 2d 63 20 6f 6e 65 2d 61  }.} {one-c one-a
2670: 20 74 77 6f 2d 62 20 74 77 6f 2d 61 20 74 68 72   two-b two-a thr
2680: 65 65 2d 63 20 74 68 72 65 65 2d 61 7d 0a 0a 23  ee-c three-a}..#
2690: 20 54 68 65 20 6f 75 74 70 75 74 20 69 73 20 73   The output is s
26a0: 6f 72 74 65 64 20 6d 61 6e 75 61 6c 6c 79 20 69  orted manually i
26b0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 23 0a 64  n this case..#.d
26c0: 6f 5f 74 65 73 74 20 33 2e 32 62 20 7b 0a 20 20  o_test 3.2b {.  
26d0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45 58  db eval {.    EX
26e0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
26f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
2700: 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e   FROM album JOIN
2710: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69   track USING (ai
2720: 64 29 20 4f 52 44 45 52 20 42 59 20 2b 74 69 74  d) ORDER BY +tit
2730: 6c 65 2c 20 2b 74 6e 20 44 45 53 43 0a 20 20 7d  le, +tn DESC.  }
2740: 0a 7d 20 7b 2f 4f 52 44 45 52 20 42 59 2f 7d 20  .} {/ORDER BY/} 
2750: 20 20 3b 23 20 73 65 70 61 72 61 74 65 20 73 6f    ;# separate so
2760: 72 74 69 6e 67 20 70 61 73 73 20 64 75 65 20 74  rting pass due t
2770: 6f 20 22 2b 22 20 6f 6e 20 4f 52 44 45 52 20 42  o "+" on ORDER B
2780: 59 20 74 65 72 6d 73 0a 0a 23 20 54 68 65 20 73  Y terms..# The s
2790: 61 6d 65 20 71 75 65 72 79 20 77 69 74 68 20 4f  ame query with O
27a0: 52 44 45 52 20 42 59 20 6f 70 74 69 6d 69 7a 61  RDER BY optimiza
27b0: 74 69 6f 6e 73 20 74 75 72 6e 65 64 20 6f 66 66  tions turned off
27c0: 20 76 69 61 20 62 75 69 6c 74 2d 69 6e 20 74 65   via built-in te
27d0: 73 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 33 2e  st..#.do_test 3.
27e0: 33 61 20 7b 0a 20 20 6f 70 74 69 6d 69 7a 61 74  3a {.  optimizat
27f0: 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64 62 20 6f  ion_control db o
2800: 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e  rder-by-idx-join
2810: 20 30 0a 20 20 64 62 20 63 61 63 68 65 20 66 6c   0.  db cache fl
2820: 75 73 68 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a  ush.  db eval {.
2830: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
2840: 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49 4e 20  FROM album JOIN 
2850: 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61 69 64  track USING (aid
2860: 29 20 4f 52 44 45 52 20 42 59 20 74 69 74 6c 65  ) ORDER BY title
2870: 2c 20 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20  , tn DESC.  }.} 
2880: 7b 6f 6e 65 2d 63 20 6f 6e 65 2d 61 20 74 77 6f  {one-c one-a two
2890: 2d 62 20 74 77 6f 2d 61 20 74 68 72 65 65 2d 63  -b two-a three-c
28a0: 20 74 68 72 65 65 2d 61 7d 0a 64 6f 5f 74 65 73   three-a}.do_tes
28b0: 74 20 33 2e 33 62 20 7b 0a 20 20 64 62 20 65 76  t 3.3b {.  db ev
28c0: 61 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e  al {.    EXPLAIN
28d0: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20   QUERY PLAN.    
28e0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
28f0: 20 61 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63   album JOIN trac
2900: 6b 20 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52  k USING (aid) OR
2910: 44 45 52 20 42 59 20 74 69 74 6c 65 2c 20 74 6e  DER BY title, tn
2920: 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 2f 4f 52   DESC.  }.} {/OR
2930: 44 45 52 20 42 59 2f 7d 20 20 20 3b 23 20 73 65  DER BY/}   ;# se
2940: 70 61 72 61 74 65 20 73 6f 72 74 69 6e 67 20 70  parate sorting p
2950: 61 73 73 20 64 75 65 20 74 6f 20 64 69 73 61 62  ass due to disab
2960: 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
2970: 0a 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f  .optimization_co
2980: 6e 74 72 6f 6c 20 64 62 20 61 6c 6c 20 31 0a 64  ntrol db all 1.d
2990: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 0a 23  b cache flush..#
29a0: 20 57 69 74 68 6f 75 74 20 74 68 65 20 6d 69 78   Without the mix
29b0: 65 64 20 41 53 43 2f 44 45 53 43 20 6f 6e 20 4f  ed ASC/DESC on O
29c0: 52 44 45 52 20 42 59 0a 23 0a 64 6f 5f 74 65 73  RDER BY.#.do_tes
29d0: 74 20 33 2e 34 61 20 7b 0a 20 20 64 62 20 65 76  t 3.4a {.  db ev
29e0: 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  al {.    SELECT 
29f0: 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20  name FROM album 
2a00: 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47  JOIN track USING
2a10: 20 28 61 69 64 29 20 4f 52 44 45 52 20 42 59 20   (aid) ORDER BY 
2a20: 74 69 74 6c 65 2c 20 74 6e 0a 20 20 7d 0a 7d 20  title, tn.  }.} 
2a30: 7b 6f 6e 65 2d 61 20 6f 6e 65 2d 63 20 74 77 6f  {one-a one-c two
2a40: 2d 61 20 74 77 6f 2d 62 20 74 68 72 65 65 2d 61  -a two-b three-a
2a50: 20 74 68 72 65 65 2d 63 7d 0a 64 6f 5f 74 65 73   three-c}.do_tes
2a60: 74 20 33 2e 34 62 20 7b 0a 20 20 64 62 20 65 76  t 3.4b {.  db ev
2a70: 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  al {.    SELECT 
2a80: 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20  name FROM album 
2a90: 4a 4f 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47  JOIN track USING
2aa0: 20 28 61 69 64 29 20 4f 52 44 45 52 20 42 59 20   (aid) ORDER BY 
2ab0: 2b 74 69 74 6c 65 2c 20 2b 74 6e 0a 20 20 7d 0a  +title, +tn.  }.
2ac0: 7d 20 7b 6f 6e 65 2d 61 20 6f 6e 65 2d 63 20 74  } {one-a one-c t
2ad0: 77 6f 2d 61 20 74 77 6f 2d 62 20 74 68 72 65 65  wo-a two-b three
2ae0: 2d 61 20 74 68 72 65 65 2d 63 7d 20 20 3b 23 20  -a three-c}  ;# 
2af0: 76 65 72 69 66 79 20 73 61 6d 65 20 6f 72 64 65  verify same orde
2b00: 72 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 0a  r after sorting.
2b10: 64 6f 5f 74 65 73 74 20 33 2e 34 63 20 7b 0a 20  do_test 3.4c {. 
2b20: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 45   db eval {.    E
2b30: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2b40: 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  N.    SELECT nam
2b50: 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f 49  e FROM album JOI
2b60: 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61  N track USING (a
2b70: 69 64 29 20 4f 52 44 45 52 20 42 59 20 74 69 74  id) ORDER BY tit
2b80: 6c 65 2c 20 74 6e 0a 20 20 7d 0a 7d 20 7b 7e 2f  le, tn.  }.} {~/
2b90: 4f 52 44 45 52 20 42 59 2f 7d 20 20 3b 23 20 4f  ORDER BY/}  ;# O
2ba0: 52 44 45 52 20 42 59 20 73 75 70 70 72 65 73 73  RDER BY suppress
2bb0: 65 64 20 62 79 20 75 6e 69 71 75 65 6e 65 73 73  ed by uniqueness
2bc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 0a 64 6f   constraints..do
2bd0: 5f 74 65 73 74 20 33 2e 35 61 20 7b 0a 20 20 64  _test 3.5a {.  d
2be0: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
2bf0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c  ECT name FROM al
2c00: 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20 55  bum JOIN track U
2c10: 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45 52  SING (aid) ORDER
2c20: 20 42 59 20 74 69 74 6c 65 20 44 45 53 43 2c 20   BY title DESC, 
2c30: 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b 74  tn DESC.  }.} {t
2c40: 68 72 65 65 2d 63 20 74 68 72 65 65 2d 61 20 74  hree-c three-a t
2c50: 77 6f 2d 62 20 74 77 6f 2d 61 20 6f 6e 65 2d 63  wo-b two-a one-c
2c60: 20 6f 6e 65 2d 61 7d 0a 64 6f 5f 74 65 73 74 20   one-a}.do_test 
2c70: 33 2e 35 62 20 7b 0a 20 20 64 62 20 65 76 61 6c  3.5b {.  db eval
2c80: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
2c90: 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 4a 4f  me FROM album JO
2ca0: 49 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28  IN track USING (
2cb0: 61 69 64 29 20 4f 52 44 45 52 20 42 59 20 2b 74  aid) ORDER BY +t
2cc0: 69 74 6c 65 20 44 45 53 43 2c 20 2b 74 6e 20 44  itle DESC, +tn D
2cd0: 45 53 43 0a 20 20 7d 0a 7d 20 7b 74 68 72 65 65  ESC.  }.} {three
2ce0: 2d 63 20 74 68 72 65 65 2d 61 20 74 77 6f 2d 62  -c three-a two-b
2cf0: 20 74 77 6f 2d 61 20 6f 6e 65 2d 63 20 6f 6e 65   two-a one-c one
2d00: 2d 61 7d 20 20 3b 23 20 76 65 72 69 66 79 20 73  -a}  ;# verify s
2d10: 61 6d 65 20 6f 72 64 65 72 20 61 66 74 65 72 20  ame order after 
2d20: 73 6f 72 74 69 6e 67 0a 64 6f 5f 74 65 73 74 20  sorting.do_test 
2d30: 33 2e 35 63 20 7b 0a 20 20 64 62 20 65 76 61 6c  3.5c {.  db eval
2d40: 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51   {.    EXPLAIN Q
2d50: 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45  UERY PLAN.    SE
2d60: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
2d70: 6c 62 75 6d 20 4a 4f 49 4e 20 74 72 61 63 6b 20  lbum JOIN track 
2d80: 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45  USING (aid) ORDE
2d90: 52 20 42 59 20 74 69 74 6c 65 20 44 45 53 43 2c  R BY title DESC,
2da0: 20 74 6e 20 44 45 53 43 0a 20 20 7d 0a 7d 20 7b   tn DESC.  }.} {
2db0: 7e 2f 4f 52 44 45 52 20 42 59 2f 7d 20 20 3b 23  ~/ORDER BY/}  ;#
2dc0: 20 4f 52 44 45 52 20 42 59 20 73 75 70 70 72 65   ORDER BY suppre
2dd0: 73 73 65 64 20 62 79 20 75 6e 69 71 75 65 6e 65  ssed by uniquene
2de0: 73 73 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 0a  ss constraints..
2df0: 0a 64 6f 5f 74 65 73 74 20 33 2e 36 61 20 7b 0a  .do_test 3.6a {.
2e00: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
2e10: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
2e20: 20 61 6c 62 75 6d 20 43 52 4f 53 53 20 4a 4f 49   album CROSS JOI
2e30: 4e 20 74 72 61 63 6b 20 55 53 49 4e 47 20 28 61  N track USING (a
2e40: 69 64 29 20 4f 52 44 45 52 20 42 59 20 74 69 74  id) ORDER BY tit
2e50: 6c 65 20 44 45 53 43 2c 20 74 6e 0a 20 20 7d 0a  le DESC, tn.  }.
2e60: 7d 20 7b 74 68 72 65 65 2d 61 20 74 68 72 65 65  } {three-a three
2e70: 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d 62 20 6f  -c two-a two-b o
2e80: 6e 65 2d 61 20 6f 6e 65 2d 63 7d 0a 64 6f 5f 74  ne-a one-c}.do_t
2e90: 65 73 74 20 33 2e 36 62 20 7b 0a 20 20 64 62 20  est 3.6b {.  db 
2ea0: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
2eb0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75  T name FROM albu
2ec0: 6d 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 72 61  m CROSS JOIN tra
2ed0: 63 6b 20 55 53 49 4e 47 20 28 61 69 64 29 0a 20  ck USING (aid). 
2ee0: 20 20 20 20 4f 52 44 45 52 20 42 59 20 2b 74 69      ORDER BY +ti
2ef0: 74 6c 65 20 44 45 53 43 2c 20 2b 74 6e 0a 20 20  tle DESC, +tn.  
2f00: 7d 0a 7d 20 7b 74 68 72 65 65 2d 61 20 74 68 72  }.} {three-a thr
2f10: 65 65 2d 63 20 74 77 6f 2d 61 20 74 77 6f 2d 62  ee-c two-a two-b
2f20: 20 6f 6e 65 2d 61 20 6f 6e 65 2d 63 7d 20 20 3b   one-a one-c}  ;
2f30: 23 20 76 65 72 69 66 79 20 73 61 6d 65 20 6f 72  # verify same or
2f40: 64 65 72 20 61 66 74 65 72 20 73 6f 72 74 69 6e  der after sortin
2f50: 67 0a 64 6f 5f 74 65 73 74 20 33 2e 36 63 20 7b  g.do_test 3.6c {
2f60: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
2f70: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
2f80: 4c 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  LAN.    SELECT n
2f90: 61 6d 65 20 46 52 4f 4d 20 61 6c 62 75 6d 20 43  ame FROM album C
2fa0: 52 4f 53 53 20 4a 4f 49 4e 20 74 72 61 63 6b 20  ROSS JOIN track 
2fb0: 55 53 49 4e 47 20 28 61 69 64 29 20 4f 52 44 45  USING (aid) ORDE
2fc0: 52 20 42 59 20 74 69 74 6c 65 20 44 45 53 43 2c  R BY title DESC,
2fd0: 20 74 6e 0a 20 20 7d 0a 7d 20 7b 7e 2f 4f 52 44   tn.  }.} {~/ORD
2fe0: 45 52 20 42 59 2f 7d 20 20 3b 23 20 69 6e 76 65  ER BY/}  ;# inve
2ff0: 72 74 65 64 20 41 53 43 2f 44 45 53 43 20 69 73  rted ASC/DESC is
3000: 20 6f 70 74 69 6d 69 7a 65 64 20 6f 75 74 0a 0a   optimized out..
3010: 23 20 54 69 63 6b 65 74 20 35 65 64 31 37 37 32  # Ticket 5ed1772
3020: 38 39 35 62 66 33 64 65 65 61 62 37 38 63 35 65  895bf3deeab78c5e
3030: 33 35 31 39 62 31 64 61 39 31 36 35 63 35 34 31  3519b1da9165c541
3040: 62 20 28 32 30 31 33 2d 30 36 2d 30 34 29 0a 23  b (2013-06-04).#
3050: 20 49 6e 63 6f 72 72 65 63 74 20 4f 52 44 45 52   Incorrect ORDER
3060: 20 42 59 20 6f 6e 20 61 6e 20 69 6e 64 65 78 65   BY on an indexe
3070: 64 20 4a 4f 49 4e 0a 23 0a 64 6f 5f 74 65 73 74  d JOIN.#.do_test
3080: 20 34 2e 30 20 7b 0a 20 20 64 62 20 65 76 61 6c   4.0 {.  db eval
3090: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
30a0: 42 4c 45 20 74 34 31 28 61 20 49 4e 54 20 55 4e  BLE t41(a INT UN
30b0: 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 2c 20 62  IQUE NOT NULL, b
30c0: 20 49 4e 54 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a   INT NOT NULL);.
30d0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
30e0: 20 74 34 31 62 61 20 4f 4e 20 74 34 31 28 62 2c   t41ba ON t41(b,
30f0: 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  a);.    CREATE T
3100: 41 42 4c 45 20 74 34 32 28 78 20 49 4e 54 20 4e  ABLE t42(x INT N
3110: 4f 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43  OT NULL REFERENC
3120: 45 53 20 74 34 31 28 61 29 2c 20 79 20 49 4e 54  ES t41(a), y INT
3130: 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20   NOT NULL);.    
3140: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
3150: 44 45 58 20 74 34 32 78 79 20 4f 4e 20 74 34 32  DEX t42xy ON t42
3160: 28 78 2c 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  (x,y);.    INSER
3170: 54 20 49 4e 54 4f 20 74 34 31 20 56 41 4c 55 45  T INTO t41 VALUE
3180: 53 28 31 2c 31 29 2c 28 33 2c 31 29 3b 0a 20 20  S(1,1),(3,1);.  
3190: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
31a0: 32 20 56 41 4c 55 45 53 28 31 2c 31 33 29 2c 28  2 VALUES(1,13),(
31b0: 31 2c 31 35 29 2c 28 33 2c 31 34 29 2c 28 33 2c  1,15),(3,14),(3,
31c0: 31 36 29 3b 0a 20 20 20 20 0a 20 20 20 20 53 45  16);.    .    SE
31d0: 4c 45 43 54 20 62 2c 20 79 20 46 52 4f 4d 20 74  LECT b, y FROM t
31e0: 34 31 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 34  41 CROSS JOIN t4
31f0: 32 20 4f 4e 20 78 3d 61 20 4f 52 44 45 52 20 42  2 ON x=a ORDER B
3200: 59 20 62 2c 20 79 3b 0a 20 20 7d 0a 7d 20 7b 31  Y b, y;.  }.} {1
3210: 20 31 33 20 31 20 31 34 20 31 20 31 35 20 31 20   13 1 14 1 15 1 
3220: 31 36 7d 0a 0a 23 20 4e 6f 20 73 6f 72 74 69 6e  16}..# No sortin
3230: 67 20 6f 66 20 71 75 65 72 69 65 73 20 74 68 61  g of queries tha
3240: 74 20 6f 6d 69 74 20 74 68 65 20 46 52 4f 4d 20  t omit the FROM 
3250: 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 65 71 70  clause..#.do_eqp
3260: 5f 74 65 73 74 20 35 2e 30 20 7b 0a 20 20 53 45  _test 5.0 {.  SE
3270: 4c 45 43 54 20 35 20 4f 52 44 45 52 20 42 59 20  LECT 5 ORDER BY 
3280: 31 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  1.} {.  QUERY PL
3290: 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 43 4f 4e  AN.  `--SCAN CON
32a0: 53 54 41 4e 54 20 52 4f 57 0a 7d 0a 64 6f 5f 65  STANT ROW.}.do_e
32b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 31 20  xecsql_test 5.1 
32c0: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
32d0: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 35 20  Y PLAN SELECT 5 
32e0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
32f0: 20 33 20 4f 52 44 45 52 20 42 59 20 31 0a 7d 20   3 ORDER BY 1.} 
3300: 7b 7e 2f 42 2d 54 52 45 45 2f 7d 0a 64 6f 5f 65  {~/B-TREE/}.do_e
3310: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 32 20  xecsql_test 5.2 
3320: 7b 0a 20 20 53 45 4c 45 43 54 20 35 20 55 4e 49  {.  SELECT 5 UNI
3330: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 33 20  ON ALL SELECT 3 
3340: 4f 52 44 45 52 20 42 59 20 31 0a 7d 20 7b 33 20  ORDER BY 1.} {3 
3350: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
3360: 73 74 20 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43  st 5.3 {.  SELEC
3370: 54 20 39 38 36 20 41 53 20 78 20 47 52 4f 55 50  T 986 AS x GROUP
3380: 20 42 59 20 58 20 4f 52 44 45 52 20 42 59 20 58   BY X ORDER BY X
3390: 0a 7d 20 7b 39 38 36 7d 0a 0a 23 20 54 68 65 20  .} {986}..# The 
33a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 28  following test (
33b0: 6f 72 69 67 69 6e 61 6c 6c 79 20 64 65 72 69 76  originally deriv
33c0: 65 64 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ed from a single
33d0: 20 74 65 73 74 20 77 69 74 68 69 6e 20 66 75 7a   test within fuz
33e0: 7a 2e 74 65 73 74 29 0a 23 20 76 65 72 69 66 69  z.test).# verifi
33f0: 65 73 20 74 68 61 74 20 61 20 50 73 65 75 64 6f  es that a Pseudo
3400: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 69 73 20  Table cursor is 
3410: 6e 6f 74 20 63 6c 6f 73 65 64 20 70 72 65 6d 61  not closed prema
3420: 74 75 72 65 6c 79 20 69 6e 20 61 20 64 65 65 70  turely in a deep
3430: 6c 79 0a 23 20 6e 65 73 74 65 64 20 71 75 65 72  ly.# nested quer
3440: 79 2e 20 20 54 68 69 73 20 74 65 73 74 20 63 61  y.  This test ca
3450: 75 73 65 64 20 61 20 73 65 67 66 61 75 6c 74 20  used a segfault 
3460: 6f 6e 20 33 2e 38 2e 35 20 62 65 74 61 2e 0a 23  on 3.8.5 beta..#
3470: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3480: 20 36 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   6.0 {.  CREATE 
3490: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
34a0: 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  c);.  INSERT INT
34b0: 4f 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20  O abc VALUES(1, 
34c0: 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  2, 3);.  INSERT 
34d0: 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28  INTO abc VALUES(
34e0: 34 2c 20 35 2c 20 36 29 3b 0a 20 20 49 4e 53 45  4, 5, 6);.  INSE
34f0: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
3500: 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 53  ES(7, 8, 9);.  S
3510: 45 4c 45 43 54 20 28 0a 20 20 20 20 53 45 4c 45  ELECT (.    SELE
3520: 43 54 20 27 68 61 72 64 77 61 72 65 27 20 46 52  CT 'hardware' FR
3530: 4f 4d 20 28 20 0a 20 20 20 20 20 20 53 45 4c 45  OM ( .      SELE
3540: 43 54 20 27 73 6f 66 74 77 61 72 65 27 20 4f 52  CT 'software' OR
3550: 44 45 52 20 42 59 20 27 66 69 72 6d 77 61 72 65  DER BY 'firmware
3560: 27 20 41 53 43 2c 20 27 73 70 6f 72 74 73 77 65  ' ASC, 'sportswe
3570: 61 72 27 20 44 45 53 43 20 0a 20 20 20 20 29 20  ar' DESC .    ) 
3580: 47 52 4f 55 50 20 42 59 20 31 20 48 41 56 49 4e  GROUP BY 1 HAVIN
3590: 47 20 6c 65 6e 67 74 68 28 62 29 0a 20 20 29 0a  G length(b).  ).
35a0: 20 20 46 52 4f 4d 20 61 62 63 3b 0a 7d 20 7b 68    FROM abc;.} {h
35b0: 61 72 64 77 61 72 65 20 68 61 72 64 77 61 72 65  ardware hardware
35c0: 20 68 61 72 64 77 61 72 65 7d 0a 0a 23 20 48 65   hardware}..# He
35d0: 72 65 20 69 73 20 61 20 74 65 73 74 20 66 6f 72  re is a test for
35e0: 20 61 20 71 75 65 72 79 2d 70 6c 61 6e 6e 65 72   a query-planner
35f0: 20 70 72 6f 62 6c 65 6d 20 72 65 70 6f 72 74 65   problem reporte
3600: 64 20 6f 6e 20 74 68 65 20 53 51 4c 69 74 65 0a  d on the SQLite.
3610: 23 20 6d 61 69 6c 69 6e 67 20 6c 69 73 74 20 6f  # mailing list o
3620: 6e 20 32 30 31 34 2d 30 39 2d 31 38 20 62 79 20  n 2014-09-18 by 
3630: 22 4d 65 72 69 6b 65 22 2e 20 20 42 65 67 69 6e  "Merike".  Begin
3640: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
3650: 6e 20 33 2e 38 2e 30 2c 0a 23 20 61 20 73 65 70  n 3.8.0,.# a sep
3660: 61 72 61 74 65 20 73 6f 72 74 20 77 61 73 20 62  arate sort was b
3670: 65 69 6e 67 20 75 73 65 64 20 72 61 74 68 65 72  eing used rather
3680: 20 74 68 61 6e 20 75 73 69 6e 67 20 74 68 65 20   than using the 
3690: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 0a 23 20  single-column.# 
36a0: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 77 61 73  index.  This was
36b0: 20 64 75 65 20 74 6f 20 61 6e 20 6f 76 65 72 73   due to an overs
36c0: 69 67 68 74 20 69 6e 20 74 68 65 20 69 6e 64 65  ight in the inde
36d0: 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
36e0: 64 65 72 62 79 28 29 0a 23 20 72 6f 75 74 69 6e  derby().# routin
36f0: 65 20 69 6e 20 77 68 65 72 65 2e 63 2e 0a 23 0a  e in where.c..#.
3700: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3710: 37 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  7.0 {.  CREATE T
3720: 41 42 4c 45 20 74 37 28 61 2c 62 29 3b 0a 20 20  ABLE t7(a,b);.  
3730: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 37 61  CREATE INDEX t7a
3740: 20 4f 4e 20 74 37 28 61 29 3b 0a 20 20 43 52 45   ON t7(a);.  CRE
3750: 41 54 45 20 49 4e 44 45 58 20 74 37 61 62 20 4f  ATE INDEX t7ab O
3760: 4e 20 74 37 28 61 2c 62 29 3b 0a 20 20 45 58 50  N t7(a,b);.  EXP
3770: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
3780: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3790: 74 37 20 57 48 45 52 45 20 61 3d 3f 31 20 4f 52  t7 WHERE a=?1 OR
37a0: 44 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 7d 20  DER BY rowid;.} 
37b0: 7b 7e 2f 4f 52 44 45 52 20 42 59 2f 7d 0a 0a 23  {~/ORDER BY/}..#
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
3810: 20 61 20 70 61 72 74 69 61 6c 20 73 6f 72 74 20   a partial sort 
3820: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
3830: 63 61 75 73 65 20 74 68 65 20 73 6f 72 74 65 72  cause the sorter
3840: 20 74 6f 20 73 70 69 6c 6c 20 64 61 74 61 0a 23   to spill data.#
3850: 20 74 6f 20 64 69 73 6b 2e 0a 23 0a 72 65 73 65   to disk..#.rese
3860: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
3870: 74 65 73 74 20 38 2e 30 20 7b 0a 20 20 50 52 41  test 8.0 {.  PRA
3880: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
3890: 20 35 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42   5;.  CREATE TAB
38a0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43  LE t1(a, b);.  C
38b0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
38c0: 4e 20 74 31 28 61 29 3b 0a 7d 0a 0a 64 6f 5f 65  N t1(a);.}..do_e
38d0: 71 70 5f 74 65 73 74 20 38 2e 31 20 7b 0a 20 20  qp_test 8.1 {.  
38e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
38f0: 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62 3b 0a   ORDER BY a, b;.
3900: 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e  } {.  QUERY PLAN
3910: 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45  .  |--SCAN TABLE
3920: 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t1 USING INDEX 
3930: 69 31 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50  i1.  `--USE TEMP
3940: 20 42 2d 54 52 45 45 20 46 4f 52 20 52 49 47 48   B-TREE FOR RIGH
3950: 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
3960: 42 59 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  BY.}..do_execsql
3970: 5f 74 65 73 74 20 38 2e 32 20 7b 0a 20 20 57 49  _test 8.2 {.  WI
3980: 54 48 20 63 6e 74 28 69 29 20 41 53 20 28 0a 20  TH cnt(i) AS (. 
3990: 20 20 20 53 45 4c 45 43 54 20 31 20 55 4e 49 4f     SELECT 1 UNIO
39a0: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b 31  N ALL SELECT i+1
39b0: 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52 45 20   FROM cnt WHERE 
39c0: 69 3c 31 30 30 30 30 0a 20 20 29 0a 20 20 49 4e  i<10000.  ).  IN
39d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
39e0: 45 43 54 20 69 25 32 2c 20 72 61 6e 64 6f 6d 62  ECT i%2, randomb
39f0: 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 63 6e  lob(500) FROM cn
3a00: 74 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 38 2e  t;.}..do_test 8.
3a10: 33 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20  3 {.  db eval { 
3a20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3a30: 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62 20 7d   ORDER BY a, b }
3a40: 20 7b 20 69 6e 63 72 20 72 65 73 20 24 61 20 7d   { incr res $a }
3a50: 0a 20 20 73 65 74 20 72 65 73 0a 7d 20 35 30 30  .  set res.} 500
3a60: 30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  0..#------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3ab0: 23 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71  # https://www.sq
3ac0: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 74 6b 74  lite.org/src/tkt
3ad0: 76 69 65 77 2f 63 62 33 61 61 30 36 34 31 64 39  view/cb3aa0641d9
3ae0: 61 34 31 33 38 34 31 63 30 30 34 32 39 33 61 34  a413841c004293a4
3af0: 66 63 30 36 63 64 63 31 32 32 30 32 39 0a 23 0a  fc06cdc122029.#.
3b00: 23 20 41 64 76 65 72 73 65 20 69 6e 74 65 72 61  # Adverse intera
3b10: 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 73 63  ction between sc
3b20: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
3b30: 61 6e 64 20 74 68 65 20 70 61 72 74 69 61 6c 2d  and the partial-
3b40: 73 6f 72 74 69 6e 67 0a 23 20 6c 6f 67 69 63 2e  sorting.# logic.
3b50: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3b60: 73 74 20 39 2e 30 20 7b 0a 20 20 44 52 4f 50 20  st 9.0 {.  DROP 
3b70: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
3b80: 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  t1;.  CREATE TAB
3b90: 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45 52 20  LE t1(x INTEGER 
3ba0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
3bb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3bc0: 41 4c 55 45 53 28 31 29 2c 28 32 29 3b 0a 20 20  ALUES(1),(2);.  
3bd0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
3be0: 49 53 54 53 20 74 32 3b 0a 20 20 43 52 45 41 54  ISTS t2;.  CREAT
3bf0: 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20  E TABLE t2(y);. 
3c00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3c10: 56 41 4c 55 45 53 28 39 29 2c 28 38 29 2c 28 33  VALUES(9),(8),(3
3c20: 29 2c 28 34 29 3b 0a 20 20 53 45 4c 45 43 54 20  ),(4);.  SELECT 
3c30: 28 53 45 4c 45 43 54 20 78 7c 7c 79 20 46 52 4f  (SELECT x||y FRO
3c40: 4d 20 74 32 2c 20 74 31 20 4f 52 44 45 52 20 42  M t2, t1 ORDER B
3c50: 59 20 78 2c 20 79 29 3b 0a 7d 20 7b 31 33 7d 0a  Y x, y);.} {13}.
3c60: 0a 23 20 50 72 6f 62 6c 65 6d 20 66 6f 75 6e 64  .# Problem found
3c70: 20 62 79 20 4f 53 53 46 75 7a 7a 20 6f 6e 20 32   by OSSFuzz on 2
3c80: 30 31 38 2d 30 35 2d 30 35 2e 20 20 54 68 69 73  018-05-05.  This
3c90: 20 77 61 73 20 63 61 75 73 65 64 20 62 79 20 61   was caused by a
3ca0: 20 6e 65 77 0a 23 20 6f 70 74 69 6d 69 7a 61 74   new.# optimizat
3cb0: 69 6f 6e 20 74 68 61 74 20 68 61 64 20 6e 6f 74  ion that had not
3cc0: 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
3cd0: 20 72 65 6c 65 61 73 65 64 2e 0a 23 0a 64 6f 5f   released..#.do_
3ce0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e  execsql_test 10.
3cf0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
3d00: 4c 45 20 74 31 30 28 61 2c 62 29 3b 0a 20 20 49  LE t10(a,b);.  I
3d10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56  NSERT INTO t10 V
3d20: 41 4c 55 45 53 28 31 2c 32 29 2c 28 38 2c 39 29  ALUES(1,2),(8,9)
3d30: 2c 28 33 2c 34 29 2c 28 35 2c 34 29 2c 28 30 2c  ,(3,4),(5,4),(0,
3d40: 37 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  7);.  CREATE IND
3d50: 45 58 20 74 31 30 62 20 4f 4e 20 74 31 30 28 62  EX t10b ON t10(b
3d60: 29 3b 0a 20 20 53 45 4c 45 43 54 20 62 2c 20 72  );.  SELECT b, r
3d70: 6f 77 69 64 2c 20 27 5e 27 20 46 52 4f 4d 20 74  owid, '^' FROM t
3d80: 31 30 20 4f 52 44 45 52 20 42 59 20 62 2c 20 61  10 ORDER BY b, a
3d90: 20 4c 49 4d 49 54 20 34 3b 0a 7d 20 7b 32 20 31   LIMIT 4;.} {2 1
3da0: 20 5e 20 34 20 33 20 5e 20 34 20 34 20 5e 20 37   ^ 4 3 ^ 4 4 ^ 7
3db0: 20 35 20 5e 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74   5 ^}...finish_t
3dc0: 65 73 74 0a                                      est.