/ Hex Artifact Content
Login

Artifact 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382:


0000: 23 20 32 30 31 30 20 4e 6f 76 65 6d 62 65 72 20  # 2010 November 
0010: 36 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  6.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62  ter.tcl..ifcapab
01b0: 6c 65 20 21 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20  le !compound {. 
01c0: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
01d0: 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 74 65 73  eturn.}..set tes
01e0: 74 70 72 65 66 69 78 20 65 71 70 0a 0a 23 2d 2d  tprefix eqp..#--
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 65 71 70 2d  -------.#.# eqp-
0240: 31 2e 2a 3a 20 20 20 20 20 20 20 20 41 73 73 6f  1.*:        Asso
0250: 72 74 65 64 20 74 65 73 74 73 2e 0a 23 20 65 71  rted tests..# eq
0260: 70 2d 32 2e 2a 3a 20 20 20 20 20 20 20 20 54 65  p-2.*:        Te
0270: 73 74 73 20 66 6f 72 20 73 69 6e 67 6c 65 20 73  sts for single s
0280: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
0290: 2e 0a 23 20 65 71 70 2d 33 2e 2a 3a 20 20 20 20  ..# eqp-3.*:    
02a0: 20 20 20 20 53 65 6c 65 63 74 20 73 74 61 74 65      Select state
02b0: 6d 65 6e 74 73 20 74 68 61 74 20 65 78 65 63 75  ments that execu
02c0: 74 65 20 73 75 62 2d 73 65 6c 65 63 74 73 2e 0a  te sub-selects..
02d0: 23 20 65 71 70 2d 34 2e 2a 3a 20 20 20 20 20 20  # eqp-4.*:      
02e0: 20 20 43 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63    Compound selec
02f0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23 20  t statements..# 
0300: 2e 2e 2e 0a 23 20 65 71 70 2d 37 2e 2a 3a 20 20  ....# eqp-7.*:  
0310: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
0320: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 62 6c 22  unt(*) FROM tbl"
0330: 20 73 74 61 74 65 6d 65 6e 74 73 20 28 56 44 42   statements (VDB
0340: 45 20 63 6f 64 65 20 4f 50 5f 43 6f 75 6e 74 29  E code OP_Count)
0350: 2e 0a 23 0a 0a 70 72 6f 63 20 64 65 74 20 7b 61  ..#..proc det {a
0360: 72 67 73 7d 20 7b 20 75 70 6c 65 76 65 6c 20 64  rgs} { uplevel d
0370: 6f 5f 65 71 70 5f 74 65 73 74 20 24 61 72 67 73  o_eqp_test $args
0380: 20 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   }..do_execsql_t
0390: 65 73 74 20 31 2e 31 20 7b 0a 20 20 43 52 45 41  est 1.1 {.  CREA
03a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
03b0: 54 2c 20 62 20 49 4e 54 2c 20 65 78 20 54 45 58  T, b INT, ex TEX
03c0: 54 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  T);.  CREATE IND
03d0: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
03e0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
03f0: 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 43 52  2 ON t1(b);.  CR
0400: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
0410: 49 4e 54 2c 20 62 20 49 4e 54 2c 20 65 78 20 54  INT, b INT, ex T
0420: 45 58 54 29 3b 0a 20 20 43 52 45 41 54 45 20 54  EXT);.  CREATE T
0430: 41 42 4c 45 20 74 33 28 61 20 49 4e 54 2c 20 62  ABLE t3(a INT, b
0440: 20 49 4e 54 2c 20 65 78 20 54 45 58 54 29 3b 0a   INT, ex TEXT);.
0450: 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  }..do_eqp_test 1
0460: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
0470: 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52  FROM t2, t1 WHER
0480: 45 20 74 31 2e 61 3d 31 20 4f 52 20 74 31 2e 62  E t1.a=1 OR t1.b
0490: 3d 32 3b 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20  =2;.} {.  QUERY 
04a0: 50 4c 41 4e 0a 20 20 7c 2d 2d 4d 55 4c 54 49 2d  PLAN.  |--MULTI-
04b0: 49 4e 44 45 58 20 4f 52 0a 20 20 7c 20 20 7c 2d  INDEX OR.  |  |-
04c0: 2d 49 4e 44 45 58 20 31 0a 20 20 7c 20 20 7c 20  -INDEX 1.  |  | 
04d0: 20 60 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45   `--SEARCH TABLE
04e0: 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t1 USING INDEX 
04f0: 69 31 20 28 61 3d 3f 29 0a 20 20 7c 20 20 60 2d  i1 (a=?).  |  `-
0500: 2d 49 4e 44 45 58 20 32 0a 20 20 7c 20 20 20 20  -INDEX 2.  |    
0510: 20 60 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45   `--SEARCH TABLE
0520: 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t1 USING INDEX 
0530: 69 32 20 28 62 3d 3f 29 0a 20 20 60 2d 2d 53 43  i2 (b=?).  `--SC
0540: 41 4e 20 54 41 42 4c 45 20 74 32 0a 7d 0a 64 6f  AN TABLE t2.}.do
0550: 5f 65 71 70 5f 74 65 73 74 20 31 2e 33 20 7b 0a  _eqp_test 1.3 {.
0560: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0570: 74 32 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 31  t2 CROSS JOIN t1
0580: 20 57 48 45 52 45 20 74 31 2e 61 3d 31 20 4f 52   WHERE t1.a=1 OR
0590: 20 74 31 2e 62 3d 32 3b 0a 7d 20 7b 0a 20 20 51   t1.b=2;.} {.  Q
05a0: 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53  UERY PLAN.  |--S
05b0: 43 41 4e 20 54 41 42 4c 45 20 74 32 0a 20 20 60  CAN TABLE t2.  `
05c0: 2d 2d 4d 55 4c 54 49 2d 49 4e 44 45 58 20 4f 52  --MULTI-INDEX OR
05d0: 0a 20 20 20 20 20 7c 2d 2d 49 4e 44 45 58 20 31  .     |--INDEX 1
05e0: 0a 20 20 20 20 20 7c 20 20 60 2d 2d 53 45 41 52  .     |  `--SEAR
05f0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
0600: 47 20 49 4e 44 45 58 20 69 31 20 28 61 3d 3f 29  G INDEX i1 (a=?)
0610: 0a 20 20 20 20 20 60 2d 2d 49 4e 44 45 58 20 32  .     `--INDEX 2
0620: 0a 20 20 20 20 20 20 20 20 60 2d 2d 53 45 41 52  .        `--SEAR
0630: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
0640: 47 20 49 4e 44 45 58 20 69 32 20 28 62 3d 3f 29  G INDEX i2 (b=?)
0650: 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  .}.do_eqp_test 1
0660: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20  .3 {.  SELECT a 
0670: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
0680: 20 61 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50   a.} {.  QUERY P
0690: 4c 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41  LAN.  `--SCAN TA
06a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56  BLE t1 USING COV
06b0: 45 52 49 4e 47 20 49 4e 44 45 58 20 69 31 0a 7d  ERING INDEX i1.}
06c0: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 34  .do_eqp_test 1.4
06d0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52   {.  SELECT a FR
06e0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 2b  OM t1 ORDER BY +
06f0: 61 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  a.} {.  QUERY PL
0700: 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42  AN.  |--SCAN TAB
0710: 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45  LE t1 USING COVE
0720: 52 49 4e 47 20 49 4e 44 45 58 20 69 31 0a 20 20  RING INDEX i1.  
0730: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
0740: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a  EE FOR ORDER BY.
0750: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e  }.do_eqp_test 1.
0760: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46  5 {.  SELECT a F
0770: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 34  ROM t1 WHERE a=4
0780: 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41  .} {.  QUERY PLA
0790: 4e 0a 20 20 60 2d 2d 53 45 41 52 43 48 20 54 41  N.  `--SEARCH TA
07a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56  BLE t1 USING COV
07b0: 45 52 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28  ERING INDEX i1 (
07c0: 61 3d 3f 29 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65  a=?).}.do_eqp_te
07d0: 73 74 20 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43  st 1.6 {.  SELEC
07e0: 54 20 44 49 53 54 49 4e 43 54 20 63 6f 75 6e 74  T DISTINCT count
07f0: 28 2a 29 20 46 52 4f 4d 20 74 33 20 47 52 4f 55  (*) FROM t3 GROU
0800: 50 20 42 59 20 61 3b 0a 7d 20 7b 0a 20 20 51 55  P BY a;.} {.  QU
0810: 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53 43  ERY PLAN.  |--SC
0820: 41 4e 20 54 41 42 4c 45 20 74 33 0a 20 20 7c 2d  AN TABLE t3.  |-
0830: 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  -USE TEMP B-TREE
0840: 20 46 4f 52 20 47 52 4f 55 50 20 42 59 0a 20 20   FOR GROUP BY.  
0850: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
0860: 45 45 20 46 4f 52 20 44 49 53 54 49 4e 43 54 0a  EE FOR DISTINCT.
0870: 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  }..do_eqp_test 1
0880: 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .7 {.  SELECT * 
0890: 46 52 4f 4d 20 74 33 20 4a 4f 49 4e 20 28 53 45  FROM t3 JOIN (SE
08a0: 4c 45 43 54 20 31 29 0a 7d 20 7b 0a 20 20 51 55  LECT 1).} {.  QU
08b0: 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 4d 41  ERY PLAN.  |--MA
08c0: 54 45 52 49 41 4c 49 5a 45 20 78 78 78 78 78 78  TERIALIZE xxxxxx
08d0: 0a 20 20 7c 20 20 60 2d 2d 53 43 41 4e 20 43 4f  .  |  `--SCAN CO
08e0: 4e 53 54 41 4e 54 20 52 4f 57 0a 20 20 7c 2d 2d  NSTANT ROW.  |--
08f0: 53 43 41 4e 20 53 55 42 51 55 45 52 59 20 78 78  SCAN SUBQUERY xx
0900: 78 78 78 78 0a 20 20 60 2d 2d 53 43 41 4e 20 54  xxxx.  `--SCAN T
0910: 41 42 4c 45 20 74 33 0a 7d 0a 64 6f 5f 65 71 70  ABLE t3.}.do_eqp
0920: 5f 74 65 73 74 20 31 2e 38 20 7b 0a 20 20 53 45  _test 1.8 {.  SE
0930: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4a  LECT * FROM t3 J
0940: 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 55 4e  OIN (SELECT 1 UN
0950: 49 4f 4e 20 53 45 4c 45 43 54 20 32 29 0a 7d 20  ION SELECT 2).} 
0960: 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  {.  QUERY PLAN. 
0970: 20 7c 2d 2d 4d 41 54 45 52 49 41 4c 49 5a 45 20   |--MATERIALIZE 
0980: 78 78 78 78 78 78 0a 20 20 7c 20 20 60 2d 2d 43  xxxxxx.  |  `--C
0990: 4f 4d 50 4f 55 4e 44 20 51 55 45 52 59 0a 20 20  OMPOUND QUERY.  
09a0: 7c 20 20 20 20 20 7c 2d 2d 4c 45 46 54 2d 4d 4f  |     |--LEFT-MO
09b0: 53 54 20 53 55 42 51 55 45 52 59 0a 20 20 7c 20  ST SUBQUERY.  | 
09c0: 20 20 20 20 7c 20 20 60 2d 2d 53 43 41 4e 20 43      |  `--SCAN C
09d0: 4f 4e 53 54 41 4e 54 20 52 4f 57 0a 20 20 7c 20  ONSTANT ROW.  | 
09e0: 20 20 20 20 60 2d 2d 55 4e 49 4f 4e 20 55 53 49      `--UNION USI
09f0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 0a 20  NG TEMP B-TREE. 
0a00: 20 7c 20 20 20 20 20 20 20 20 60 2d 2d 53 43 41   |        `--SCA
0a10: 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 0a 20  N CONSTANT ROW. 
0a20: 20 7c 2d 2d 53 43 41 4e 20 53 55 42 51 55 45 52   |--SCAN SUBQUER
0a30: 59 20 78 78 78 78 78 78 0a 20 20 60 2d 2d 53 43  Y xxxxxx.  `--SC
0a40: 41 4e 20 54 41 42 4c 45 20 74 33 0a 7d 0a 64 6f  AN TABLE t3.}.do
0a50: 5f 65 71 70 5f 74 65 73 74 20 31 2e 39 20 7b 0a  _eqp_test 1.9 {.
0a60: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0a70: 74 33 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t3 JOIN (SELECT 
0a80: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
0a90: 61 20 46 52 4f 4d 20 74 33 20 4c 49 4d 49 54 20  a FROM t3 LIMIT 
0aa0: 31 37 29 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20  17).} {.  QUERY 
0ab0: 50 4c 41 4e 0a 20 20 7c 2d 2d 4d 41 54 45 52 49  PLAN.  |--MATERI
0ac0: 41 4c 49 5a 45 20 78 78 78 78 78 78 0a 20 20 7c  ALIZE xxxxxx.  |
0ad0: 20 20 60 2d 2d 43 4f 4d 50 4f 55 4e 44 20 51 55    `--COMPOUND QU
0ae0: 45 52 59 0a 20 20 7c 20 20 20 20 20 7c 2d 2d 4c  ERY.  |     |--L
0af0: 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
0b00: 59 0a 20 20 7c 20 20 20 20 20 7c 20 20 60 2d 2d  Y.  |     |  `--
0b10: 53 43 41 4e 20 43 4f 4e 53 54 41 4e 54 20 52 4f  SCAN CONSTANT RO
0b20: 57 0a 20 20 7c 20 20 20 20 20 60 2d 2d 45 58 43  W.  |     `--EXC
0b30: 45 50 54 20 55 53 49 4e 47 20 54 45 4d 50 20 42  EPT USING TEMP B
0b40: 2d 54 52 45 45 0a 20 20 7c 20 20 20 20 20 20 20  -TREE.  |       
0b50: 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   `--SCAN TABLE t
0b60: 33 0a 20 20 7c 2d 2d 53 43 41 4e 20 53 55 42 51  3.  |--SCAN SUBQ
0b70: 55 45 52 59 20 78 78 78 78 78 78 0a 20 20 60 2d  UERY xxxxxx.  `-
0b80: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 33 0a 7d  -SCAN TABLE t3.}
0b90: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 31  .do_eqp_test 1.1
0ba0: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  0 {.  SELECT * F
0bb0: 52 4f 4d 20 74 33 20 4a 4f 49 4e 20 28 53 45 4c  ROM t3 JOIN (SEL
0bc0: 45 43 54 20 31 20 49 4e 54 45 52 53 45 43 54 20  ECT 1 INTERSECT 
0bd0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 33  SELECT a FROM t3
0be0: 20 4c 49 4d 49 54 20 31 37 29 0a 7d 20 7b 0a 20   LIMIT 17).} {. 
0bf0: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d   QUERY PLAN.  |-
0c00: 2d 4d 41 54 45 52 49 41 4c 49 5a 45 20 78 78 78  -MATERIALIZE xxx
0c10: 78 78 78 0a 20 20 7c 20 20 60 2d 2d 43 4f 4d 50  xxx.  |  `--COMP
0c20: 4f 55 4e 44 20 51 55 45 52 59 0a 20 20 7c 20 20  OUND QUERY.  |  
0c30: 20 20 20 7c 2d 2d 4c 45 46 54 2d 4d 4f 53 54 20     |--LEFT-MOST 
0c40: 53 55 42 51 55 45 52 59 0a 20 20 7c 20 20 20 20  SUBQUERY.  |    
0c50: 20 7c 20 20 60 2d 2d 53 43 41 4e 20 43 4f 4e 53   |  `--SCAN CONS
0c60: 54 41 4e 54 20 52 4f 57 0a 20 20 7c 20 20 20 20  TANT ROW.  |    
0c70: 20 60 2d 2d 49 4e 54 45 52 53 45 43 54 20 55 53   `--INTERSECT US
0c80: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 0a  ING TEMP B-TREE.
0c90: 20 20 7c 20 20 20 20 20 20 20 20 60 2d 2d 53 43    |        `--SC
0ca0: 41 4e 20 54 41 42 4c 45 20 74 33 0a 20 20 7c 2d  AN TABLE t3.  |-
0cb0: 2d 53 43 41 4e 20 53 55 42 51 55 45 52 59 20 78  -SCAN SUBQUERY x
0cc0: 78 78 78 78 78 0a 20 20 60 2d 2d 53 43 41 4e 20  xxxxx.  `--SCAN 
0cd0: 54 41 42 4c 45 20 74 33 0a 7d 0a 0a 64 6f 5f 65  TABLE t3.}..do_e
0ce0: 71 70 5f 74 65 73 74 20 31 2e 31 31 20 7b 0a 20  qp_test 1.11 {. 
0cf0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d00: 33 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31  3 JOIN (SELECT 1
0d10: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
0d20: 54 20 61 20 46 52 4f 4d 20 74 33 20 4c 49 4d 49  T a FROM t3 LIMI
0d30: 54 20 31 37 29 0a 7d 20 7b 0a 20 20 51 55 45 52  T 17).} {.  QUER
0d40: 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 4d 41 54 45  Y PLAN.  |--MATE
0d50: 52 49 41 4c 49 5a 45 20 78 78 78 78 78 78 0a 20  RIALIZE xxxxxx. 
0d60: 20 7c 20 20 60 2d 2d 43 4f 4d 50 4f 55 4e 44 20   |  `--COMPOUND 
0d70: 51 55 45 52 59 0a 20 20 7c 20 20 20 20 20 7c 2d  QUERY.  |     |-
0d80: 2d 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55  -LEFT-MOST SUBQU
0d90: 45 52 59 0a 20 20 7c 20 20 20 20 20 7c 20 20 60  ERY.  |     |  `
0da0: 2d 2d 53 43 41 4e 20 43 4f 4e 53 54 41 4e 54 20  --SCAN CONSTANT 
0db0: 52 4f 57 0a 20 20 7c 20 20 20 20 20 60 2d 2d 55  ROW.  |     `--U
0dc0: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 7c 20 20 20 20  NION ALL.  |    
0dd0: 20 20 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c      `--SCAN TABL
0de0: 45 20 74 33 0a 20 20 7c 2d 2d 53 43 41 4e 20 53  E t3.  |--SCAN S
0df0: 55 42 51 55 45 52 59 20 78 78 78 78 78 78 0a 20  UBQUERY xxxxxx. 
0e00: 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   `--SCAN TABLE t
0e10: 33 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3.}..#----------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0e60: 23 20 54 65 73 74 20 63 61 73 65 73 20 65 71 70  # Test cases eqp
0e70: 2d 32 2e 2a 20 2d 20 74 65 73 74 73 20 66 6f 72  -2.* - tests for
0e80: 20 73 69 6e 67 6c 65 20 73 65 6c 65 63 74 20 73   single select s
0e90: 74 61 74 65 6d 65 6e 74 73 2e 0a 23 0a 64 72 6f  tatements..#.dro
0ea0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
0eb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 31  execsql_test 2.1
0ec0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
0ed0: 45 20 74 31 28 78 20 49 4e 54 2c 20 79 20 49 4e  E t1(x INT, y IN
0ee0: 54 2c 20 65 78 20 54 45 58 54 29 3b 0a 0a 20 20  T, ex TEXT);..  
0ef0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
0f00: 78 20 49 4e 54 2c 20 79 20 49 4e 54 2c 20 65 78  x INT, y INT, ex
0f10: 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41 54 45   TEXT);.  CREATE
0f20: 20 49 4e 44 45 58 20 74 32 69 31 20 4f 4e 20 74   INDEX t2i1 ON t
0f30: 32 28 78 29 3b 0a 7d 0a 0a 64 65 74 20 32 2e 32  2(x);.}..det 2.2
0f40: 2e 31 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  .1 "SELECT DISTI
0f50: 4e 43 54 20 6d 69 6e 28 78 29 2c 20 6d 61 78 28  NCT min(x), max(
0f60: 78 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50  x) FROM t1 GROUP
0f70: 20 42 59 20 78 20 4f 52 44 45 52 20 42 59 20 31   BY x ORDER BY 1
0f80: 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e  " {.  QUERY PLAN
0f90: 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45  .  |--SCAN TABLE
0fa0: 20 74 31 0a 20 20 7c 2d 2d 55 53 45 20 54 45 4d   t1.  |--USE TEM
0fb0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 47 52 4f  P B-TREE FOR GRO
0fc0: 55 50 20 42 59 0a 20 20 7c 2d 2d 55 53 45 20 54  UP BY.  |--USE T
0fd0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 44  EMP B-TREE FOR D
0fe0: 49 53 54 49 4e 43 54 0a 20 20 60 2d 2d 55 53 45  ISTINCT.  `--USE
0ff0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
1000: 20 4f 52 44 45 52 20 42 59 0a 7d 0a 64 65 74 20   ORDER BY.}.det 
1010: 32 2e 32 2e 32 20 22 53 45 4c 45 43 54 20 44 49  2.2.2 "SELECT DI
1020: 53 54 49 4e 43 54 20 6d 69 6e 28 78 29 2c 20 6d  STINCT min(x), m
1030: 61 78 28 78 29 20 46 52 4f 4d 20 74 32 20 47 52  ax(x) FROM t2 GR
1040: 4f 55 50 20 42 59 20 78 20 4f 52 44 45 52 20 42  OUP BY x ORDER B
1050: 59 20 31 22 20 7b 0a 20 20 51 55 45 52 59 20 50  Y 1" {.  QUERY P
1060: 4c 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41  LAN.  |--SCAN TA
1070: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56  BLE t2 USING COV
1080: 45 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31  ERING INDEX t2i1
1090: 0a 20 20 7c 2d 2d 55 53 45 20 54 45 4d 50 20 42  .  |--USE TEMP B
10a0: 2d 54 52 45 45 20 46 4f 52 20 44 49 53 54 49 4e  -TREE FOR DISTIN
10b0: 43 54 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50  CT.  `--USE TEMP
10c0: 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45   B-TREE FOR ORDE
10d0: 52 20 42 59 0a 7d 0a 64 65 74 20 32 2e 32 2e 33  R BY.}.det 2.2.3
10e0: 20 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   "SELECT DISTINC
10f0: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7b 0a 20  T * FROM t1" {. 
1100: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d   QUERY PLAN.  |-
1110: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a 20  -SCAN TABLE t1. 
1120: 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54   `--USE TEMP B-T
1130: 52 45 45 20 46 4f 52 20 44 49 53 54 49 4e 43 54  REE FOR DISTINCT
1140: 0a 7d 0a 64 65 74 20 32 2e 32 2e 34 20 22 53 45  .}.det 2.2.4 "SE
1150: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 2a 20  LECT DISTINCT * 
1160: 46 52 4f 4d 20 74 31 2c 20 74 32 22 20 7b 0a 20  FROM t1, t2" {. 
1170: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d   QUERY PLAN.  |-
1180: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a 20  -SCAN TABLE t1. 
1190: 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   |--SCAN TABLE t
11a0: 32 0a 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20  2.  `--USE TEMP 
11b0: 42 2d 54 52 45 45 20 46 4f 52 20 44 49 53 54 49  B-TREE FOR DISTI
11c0: 4e 43 54 0a 7d 0a 64 65 74 20 32 2e 32 2e 35 20  NCT.}.det 2.2.5 
11d0: 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
11e0: 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4f   * FROM t1, t2 O
11f0: 52 44 45 52 20 42 59 20 74 31 2e 78 22 20 7b 0a  RDER BY t1.x" {.
1200: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c    QUERY PLAN.  |
1210: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
1220: 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20    |--SCAN TABLE 
1230: 74 32 0a 20 20 7c 2d 2d 55 53 45 20 54 45 4d 50  t2.  |--USE TEMP
1240: 20 42 2d 54 52 45 45 20 46 4f 52 20 44 49 53 54   B-TREE FOR DIST
1250: 49 4e 43 54 0a 20 20 60 2d 2d 55 53 45 20 54 45  INCT.  `--USE TE
1260: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52  MP B-TREE FOR OR
1270: 44 45 52 20 42 59 0a 7d 0a 64 65 74 20 32 2e 32  DER BY.}.det 2.2
1280: 2e 36 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  .6 "SELECT DISTI
1290: 4e 43 54 20 74 32 2e 78 20 46 52 4f 4d 20 74 31  NCT t2.x FROM t1
12a0: 2c 20 74 32 20 4f 52 44 45 52 20 42 59 20 74 32  , t2 ORDER BY t2
12b0: 2e 78 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  .x" {.  QUERY PL
12c0: 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42  AN.  |--SCAN TAB
12d0: 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45  LE t2 USING COVE
12e0: 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 0a  RING INDEX t2i1.
12f0: 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20    `--SCAN TABLE 
1300: 74 31 0a 7d 0a 0a 64 65 74 20 32 2e 33 2e 31 20  t1.}..det 2.3.1 
1310: 22 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46  "SELECT max(x) F
1320: 52 4f 4d 20 74 32 22 20 7b 0a 20 20 51 55 45 52  ROM t2" {.  QUER
1330: 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 53 45 41 52  Y PLAN.  `--SEAR
1340: 43 48 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  CH TABLE t2 USIN
1350: 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
1360: 20 74 32 69 31 0a 7d 0a 64 65 74 20 32 2e 33 2e   t2i1.}.det 2.3.
1370: 32 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  2 "SELECT min(x)
1380: 20 46 52 4f 4d 20 74 32 22 20 7b 0a 20 20 51 55   FROM t2" {.  QU
1390: 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 53 45  ERY PLAN.  `--SE
13a0: 41 52 43 48 20 54 41 42 4c 45 20 74 32 20 55 53  ARCH TABLE t2 US
13b0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
13c0: 45 58 20 74 32 69 31 0a 7d 0a 64 65 74 20 32 2e  EX t2i1.}.det 2.
13d0: 33 2e 33 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  3.3 "SELECT min(
13e0: 78 29 2c 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  x), max(x) FROM 
13f0: 74 32 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  t2" {.  QUERY PL
1400: 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41 42  AN.  `--SCAN TAB
1410: 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45  LE t2 USING COVE
1420: 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 0a  RING INDEX t2i1.
1430: 7d 0a 0a 64 65 74 20 32 2e 34 2e 31 20 22 53 45  }..det 2.4.1 "SE
1440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1450: 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 20 7b 0a  HERE rowid=?" {.
1460: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60    QUERY PLAN.  `
1470: 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74  --SEARCH TABLE t
1480: 31 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  1 USING INTEGER 
1490: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
14a0: 69 64 3d 3f 29 0a 7d 0a 0a 0a 0a 23 2d 2d 2d 2d  id=?).}....#----
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
1500: 65 73 20 65 71 70 2d 33 2e 2a 20 2d 20 74 65 73  es eqp-3.* - tes
1510: 74 73 20 66 6f 72 20 73 65 6c 65 63 74 20 73 74  ts for select st
1520: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
1530: 65 20 73 75 62 2d 73 65 6c 65 63 74 73 2e 0a 23  e sub-selects..#
1540: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 31  .do_eqp_test 3.1
1550: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 28 53  .1 {.  SELECT (S
1560: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
1570: 41 53 20 73 75 62 29 20 46 52 4f 4d 20 74 31 3b  AS sub) FROM t1;
1580: 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41  .} {.  QUERY PLA
1590: 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c  N.  |--SCAN TABL
15a0: 45 20 74 31 0a 20 20 60 2d 2d 53 43 41 4c 41 52  E t1.  `--SCALAR
15b0: 20 53 55 42 51 55 45 52 59 20 78 78 78 78 78 78   SUBQUERY xxxxxx
15c0: 0a 20 20 20 20 20 60 2d 2d 53 43 41 4e 20 54 41  .     `--SCAN TA
15d0: 42 4c 45 20 74 31 20 41 53 20 73 75 62 0a 7d 0a  BLE t1 AS sub.}.
15e0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 31 2e  do_eqp_test 3.1.
15f0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
1600: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 53 45  ROM t1 WHERE (SE
1610: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 41  LECT x FROM t1 A
1620: 53 20 73 75 62 29 3b 0a 7d 20 7b 0a 20 20 51 55  S sub);.} {.  QU
1630: 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53 43  ERY PLAN.  |--SC
1640: 41 4e 20 54 41 42 4c 45 20 74 31 0a 20 20 60 2d  AN TABLE t1.  `-
1650: 2d 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59  -SCALAR SUBQUERY
1660: 20 78 78 78 78 78 78 0a 20 20 20 20 20 60 2d 2d   xxxxxx.     `--
1670: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 41 53  SCAN TABLE t1 AS
1680: 20 73 75 62 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65   sub.}.do_eqp_te
1690: 73 74 20 33 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  st 3.1.3 {.  SEL
16a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
16b0: 45 52 45 20 28 53 45 4c 45 43 54 20 78 20 46 52  ERE (SELECT x FR
16c0: 4f 4d 20 74 31 20 41 53 20 73 75 62 20 4f 52 44  OM t1 AS sub ORD
16d0: 45 52 20 42 59 20 79 29 3b 0a 7d 20 7b 0a 20 20  ER BY y);.} {.  
16e0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d  QUERY PLAN.  |--
16f0: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a 20 20  SCAN TABLE t1.  
1700: 60 2d 2d 53 43 41 4c 41 52 20 53 55 42 51 55 45  `--SCALAR SUBQUE
1710: 52 59 20 78 78 78 78 78 78 0a 20 20 20 20 20 7c  RY xxxxxx.     |
1720: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20  --SCAN TABLE t1 
1730: 41 53 20 73 75 62 0a 20 20 20 20 20 60 2d 2d 55  AS sub.     `--U
1740: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
1750: 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 64 6f  OR ORDER BY.}.do
1760: 5f 65 71 70 5f 74 65 73 74 20 33 2e 31 2e 34 20  _eqp_test 3.1.4 
1770: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1780: 4d 20 74 31 20 57 48 45 52 45 20 28 53 45 4c 45  M t1 WHERE (SELE
1790: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 4f 52 44  CT x FROM t2 ORD
17a0: 45 52 20 42 59 20 78 29 3b 0a 7d 20 7b 0a 20 20  ER BY x);.} {.  
17b0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d  QUERY PLAN.  |--
17c0: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a 20 20  SCAN TABLE t1.  
17d0: 60 2d 2d 53 43 41 4c 41 52 20 53 55 42 51 55 45  `--SCALAR SUBQUE
17e0: 52 59 20 78 78 78 78 78 78 0a 20 20 20 20 20 60  RY xxxxxx.     `
17f0: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20  --SCAN TABLE t2 
1800: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
1810: 4e 44 45 58 20 74 32 69 31 0a 7d 0a 0a 64 65 74  NDEX t2i1.}..det
1820: 20 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43   3.2.1 {.  SELEC
1830: 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
1840: 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   * FROM t1 ORDER
1850: 20 42 59 20 78 20 4c 49 4d 49 54 20 31 30 29 20   BY x LIMIT 10) 
1860: 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
1870: 20 35 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50   5.} {.  QUERY P
1880: 4c 41 4e 0a 20 20 7c 2d 2d 43 4f 2d 52 4f 55 54  LAN.  |--CO-ROUT
1890: 49 4e 45 20 78 78 78 78 78 78 0a 20 20 7c 20 20  INE xxxxxx.  |  
18a0: 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31  |--SCAN TABLE t1
18b0: 0a 20 20 7c 20 20 60 2d 2d 55 53 45 20 54 45 4d  .  |  `--USE TEM
18c0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
18d0: 45 52 20 42 59 0a 20 20 7c 2d 2d 53 43 41 4e 20  ER BY.  |--SCAN 
18e0: 53 55 42 51 55 45 52 59 20 78 78 78 78 78 78 0a  SUBQUERY xxxxxx.
18f0: 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d    `--USE TEMP B-
1900: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
1910: 59 0a 7d 0a 64 65 74 20 33 2e 32 2e 32 20 7b 0a  Y.}.det 3.2.2 {.
1920: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1930: 0a 20 20 20 20 28 53 45 4c 45 43 54 20 2a 20 46  .    (SELECT * F
1940: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
1950: 78 20 4c 49 4d 49 54 20 31 30 29 20 41 53 20 78  x LIMIT 10) AS x
1960: 31 2c 0a 20 20 20 20 28 53 45 4c 45 43 54 20 2a  1,.    (SELECT *
1970: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1980: 59 20 78 20 4c 49 4d 49 54 20 31 30 29 20 41 53  Y x LIMIT 10) AS
1990: 20 78 32 0a 20 20 4f 52 44 45 52 20 42 59 20 78   x2.  ORDER BY x
19a0: 32 2e 79 20 4c 49 4d 49 54 20 35 0a 7d 20 7b 0a  2.y LIMIT 5.} {.
19b0: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 7c    QUERY PLAN.  |
19c0: 2d 2d 4d 41 54 45 52 49 41 4c 49 5a 45 20 78 78  --MATERIALIZE xx
19d0: 78 78 78 78 0a 20 20 7c 20 20 7c 2d 2d 53 43 41  xxxx.  |  |--SCA
19e0: 4e 20 54 41 42 4c 45 20 74 31 0a 20 20 7c 20 20  N TABLE t1.  |  
19f0: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
1a00: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a  EE FOR ORDER BY.
1a10: 20 20 7c 2d 2d 4d 41 54 45 52 49 41 4c 49 5a 45    |--MATERIALIZE
1a20: 20 78 78 78 78 78 78 0a 20 20 7c 20 20 60 2d 2d   xxxxxx.  |  `--
1a30: 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53  SCAN TABLE t2 US
1a40: 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 0a 20  ING INDEX t2i1. 
1a50: 20 7c 2d 2d 53 43 41 4e 20 53 55 42 51 55 45 52   |--SCAN SUBQUER
1a60: 59 20 78 78 78 78 78 78 20 41 53 20 78 31 0a 20  Y xxxxxx AS x1. 
1a70: 20 7c 2d 2d 53 43 41 4e 20 53 55 42 51 55 45 52   |--SCAN SUBQUER
1a80: 59 20 78 78 78 78 78 78 20 41 53 20 78 32 0a 20  Y xxxxxx AS x2. 
1a90: 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54   `--USE TEMP B-T
1aa0: 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59  REE FOR ORDER BY
1ab0: 0a 7d 0a 0a 64 65 74 20 33 2e 33 2e 31 20 7b 0a  .}..det 3.3.1 {.
1ac0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ad0: 74 31 20 57 48 45 52 45 20 79 20 49 4e 20 28 53  t1 WHERE y IN (S
1ae0: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29  ELECT y FROM t2)
1af0: 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41  .} {.  QUERY PLA
1b00: 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c  N.  |--SCAN TABL
1b10: 45 20 74 31 0a 20 20 60 2d 2d 4c 49 53 54 20 53  E t1.  `--LIST S
1b20: 55 42 51 55 45 52 59 20 78 78 78 78 78 78 0a 20  UBQUERY xxxxxx. 
1b30: 20 20 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c      `--SCAN TABL
1b40: 45 20 74 32 0a 7d 0a 64 65 74 20 33 2e 33 2e 32  E t2.}.det 3.3.2
1b50: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
1b60: 4f 4d 20 74 31 20 57 48 45 52 45 20 79 20 49 4e  OM t1 WHERE y IN
1b70: 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20   (SELECT y FROM 
1b80: 74 32 20 57 48 45 52 45 20 74 31 2e 78 21 3d 74  t2 WHERE t1.x!=t
1b90: 32 2e 78 29 0a 7d 20 7b 0a 20 20 51 55 45 52 59  2.x).} {.  QUERY
1ba0: 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e 20   PLAN.  |--SCAN 
1bb0: 54 41 42 4c 45 20 74 31 0a 20 20 60 2d 2d 43 4f  TABLE t1.  `--CO
1bc0: 52 52 45 4c 41 54 45 44 20 4c 49 53 54 20 53 55  RRELATED LIST SU
1bd0: 42 51 55 45 52 59 20 78 78 78 78 78 78 0a 20 20  BQUERY xxxxxx.  
1be0: 20 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45     `--SCAN TABLE
1bf0: 20 74 32 0a 7d 0a 64 65 74 20 33 2e 33 2e 33 20   t2.}.det 3.3.3 
1c00: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1c10: 4d 20 74 31 20 57 48 45 52 45 20 45 58 49 53 54  M t1 WHERE EXIST
1c20: 53 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  S (SELECT y FROM
1c30: 20 74 32 20 57 48 45 52 45 20 74 31 2e 78 21 3d   t2 WHERE t1.x!=
1c40: 74 32 2e 78 29 0a 7d 20 7b 0a 20 20 51 55 45 52  t2.x).} {.  QUER
1c50: 59 20 50 4c 41 4e 0a 20 20 7c 2d 2d 53 43 41 4e  Y PLAN.  |--SCAN
1c60: 20 54 41 42 4c 45 20 74 31 0a 20 20 60 2d 2d 43   TABLE t1.  `--C
1c70: 4f 52 52 45 4c 41 54 45 44 20 53 43 41 4c 41 52  ORRELATED SCALAR
1c80: 20 53 55 42 51 55 45 52 59 20 78 78 78 78 78 78   SUBQUERY xxxxxx
1c90: 0a 20 20 20 20 20 60 2d 2d 53 43 41 4e 20 54 41  .     `--SCAN TA
1ca0: 42 4c 45 20 74 32 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  BLE t2.}..#-----
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
1d00: 73 20 65 71 70 2d 34 2e 2a 20 2d 20 74 65 73 74  s eqp-4.* - test
1d10: 73 20 66 6f 72 20 63 6f 6d 70 6f 73 69 74 65 20  s for composite 
1d20: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1d30: 73 2e 0a 23 0a 64 6f 5f 65 71 70 5f 74 65 73 74  s..#.do_eqp_test
1d40: 20 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43   4.1.1 {.  SELEC
1d50: 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T * FROM t1 UNIO
1d60: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46  N ALL SELECT * F
1d70: 52 4f 4d 20 74 32 0a 7d 20 7b 0a 20 20 51 55 45  ROM t2.} {.  QUE
1d80: 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 43 4f 4d  RY PLAN.  `--COM
1d90: 50 4f 55 4e 44 20 51 55 45 52 59 0a 20 20 20 20  POUND QUERY.    
1da0: 20 7c 2d 2d 4c 45 46 54 2d 4d 4f 53 54 20 53 55   |--LEFT-MOST SU
1db0: 42 51 55 45 52 59 0a 20 20 20 20 20 7c 20 20 60  BQUERY.     |  `
1dc0: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
1dd0: 20 20 20 20 20 60 2d 2d 55 4e 49 4f 4e 20 41 4c       `--UNION AL
1de0: 4c 0a 20 20 20 20 20 20 20 20 60 2d 2d 53 43 41  L.        `--SCA
1df0: 4e 20 54 41 42 4c 45 20 74 32 0a 7d 0a 64 6f 5f  N TABLE t2.}.do_
1e00: 65 71 70 5f 74 65 73 74 20 34 2e 31 2e 32 20 7b  eqp_test 4.1.2 {
1e10: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1e20: 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
1e30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
1e40: 52 44 45 52 20 42 59 20 32 0a 7d 20 7b 0a 20 20  RDER BY 2.} {.  
1e50: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d  QUERY PLAN.  `--
1e60: 4d 45 52 47 45 20 28 55 4e 49 4f 4e 20 41 4c 4c  MERGE (UNION ALL
1e70: 29 0a 20 20 20 20 20 7c 2d 2d 4c 45 46 54 0a 20  ).     |--LEFT. 
1e80: 20 20 20 20 7c 20 20 7c 2d 2d 53 43 41 4e 20 54      |  |--SCAN T
1e90: 41 42 4c 45 20 74 31 0a 20 20 20 20 20 7c 20 20  ABLE t1.     |  
1ea0: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
1eb0: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a  EE FOR ORDER BY.
1ec0: 20 20 20 20 20 60 2d 2d 52 49 47 48 54 0a 20 20       `--RIGHT.  
1ed0: 20 20 20 20 20 20 7c 2d 2d 53 43 41 4e 20 54 41        |--SCAN TA
1ee0: 42 4c 45 20 74 32 0a 20 20 20 20 20 20 20 20 60  BLE t2.        `
1ef0: 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45  --USE TEMP B-TRE
1f00: 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d  E FOR ORDER BY.}
1f10: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 31  .do_eqp_test 4.1
1f20: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
1f30: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
1f40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
1f50: 52 44 45 52 20 42 59 20 32 0a 7d 20 7b 0a 20 20  RDER BY 2.} {.  
1f60: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d  QUERY PLAN.  `--
1f70: 4d 45 52 47 45 20 28 55 4e 49 4f 4e 29 0a 20 20  MERGE (UNION).  
1f80: 20 20 20 7c 2d 2d 4c 45 46 54 0a 20 20 20 20 20     |--LEFT.     
1f90: 7c 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45  |  |--SCAN TABLE
1fa0: 20 74 31 0a 20 20 20 20 20 7c 20 20 60 2d 2d 55   t1.     |  `--U
1fb0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
1fc0: 4f 52 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  OR ORDER BY.    
1fd0: 20 60 2d 2d 52 49 47 48 54 0a 20 20 20 20 20 20   `--RIGHT.      
1fe0: 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20    |--SCAN TABLE 
1ff0: 74 32 0a 20 20 20 20 20 20 20 20 60 2d 2d 55 53  t2.        `--US
2000: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
2010: 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 64 6f 5f  R ORDER BY.}.do_
2020: 65 71 70 5f 74 65 73 74 20 34 2e 31 2e 34 20 7b  eqp_test 4.1.4 {
2030: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2040: 20 74 31 20 49 4e 54 45 52 53 45 43 54 20 53 45   t1 INTERSECT SE
2050: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
2060: 52 44 45 52 20 42 59 20 32 0a 7d 20 7b 0a 20 20  RDER BY 2.} {.  
2070: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d  QUERY PLAN.  `--
2080: 4d 45 52 47 45 20 28 49 4e 54 45 52 53 45 43 54  MERGE (INTERSECT
2090: 29 0a 20 20 20 20 20 7c 2d 2d 4c 45 46 54 0a 20  ).     |--LEFT. 
20a0: 20 20 20 20 7c 20 20 7c 2d 2d 53 43 41 4e 20 54      |  |--SCAN T
20b0: 41 42 4c 45 20 74 31 0a 20 20 20 20 20 7c 20 20  ABLE t1.     |  
20c0: 60 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52  `--USE TEMP B-TR
20d0: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a  EE FOR ORDER BY.
20e0: 20 20 20 20 20 60 2d 2d 52 49 47 48 54 0a 20 20       `--RIGHT.  
20f0: 20 20 20 20 20 20 7c 2d 2d 53 43 41 4e 20 54 41        |--SCAN TA
2100: 42 4c 45 20 74 32 0a 20 20 20 20 20 20 20 20 60  BLE t2.        `
2110: 2d 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45  --USE TEMP B-TRE
2120: 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d  E FOR ORDER BY.}
2130: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 31  .do_eqp_test 4.1
2140: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .5 {.  SELECT * 
2150: 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
2160: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
2170: 4f 52 44 45 52 20 42 59 20 32 0a 7d 20 7b 0a 20  ORDER BY 2.} {. 
2180: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d   QUERY PLAN.  `-
2190: 2d 4d 45 52 47 45 20 28 45 58 43 45 50 54 29 0a  -MERGE (EXCEPT).
21a0: 20 20 20 20 20 7c 2d 2d 4c 45 46 54 0a 20 20 20       |--LEFT.   
21b0: 20 20 7c 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42    |  |--SCAN TAB
21c0: 4c 45 20 74 31 0a 20 20 20 20 20 7c 20 20 60 2d  LE t1.     |  `-
21d0: 2d 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  -USE TEMP B-TREE
21e0: 20 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 20 20   FOR ORDER BY.  
21f0: 20 20 20 60 2d 2d 52 49 47 48 54 0a 20 20 20 20     `--RIGHT.    
2200: 20 20 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c      |--SCAN TABL
2210: 45 20 74 32 0a 20 20 20 20 20 20 20 20 60 2d 2d  E t2.        `--
2220: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
2230: 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a  FOR ORDER BY.}..
2240: 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 32 2e  do_eqp_test 4.2.
2250: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
2260: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
2270: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2280: 32 20 4f 52 44 45 52 20 42 59 20 31 0a 7d 20 7b  2 ORDER BY 1.} {
2290: 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  .  QUERY PLAN.  
22a0: 60 2d 2d 4d 45 52 47 45 20 28 55 4e 49 4f 4e 20  `--MERGE (UNION 
22b0: 41 4c 4c 29 0a 20 20 20 20 20 7c 2d 2d 4c 45 46  ALL).     |--LEF
22c0: 54 0a 20 20 20 20 20 7c 20 20 7c 2d 2d 53 43 41  T.     |  |--SCA
22d0: 4e 20 54 41 42 4c 45 20 74 31 0a 20 20 20 20 20  N TABLE t1.     
22e0: 7c 20 20 60 2d 2d 55 53 45 20 54 45 4d 50 20 42  |  `--USE TEMP B
22f0: 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20  -TREE FOR ORDER 
2300: 42 59 0a 20 20 20 20 20 60 2d 2d 52 49 47 48 54  BY.     `--RIGHT
2310: 0a 20 20 20 20 20 20 20 20 60 2d 2d 53 43 41 4e  .        `--SCAN
2320: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
2330: 49 4e 44 45 58 20 74 32 69 31 0a 7d 0a 64 6f 5f  INDEX t2i1.}.do_
2340: 65 71 70 5f 74 65 73 74 20 34 2e 32 2e 33 20 7b  eqp_test 4.2.3 {
2350: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2360: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
2370: 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   * FROM t2 ORDER
2380: 20 42 59 20 31 0a 7d 20 7b 0a 20 20 51 55 45 52   BY 1.} {.  QUER
2390: 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 4d 45 52 47  Y PLAN.  `--MERG
23a0: 45 20 28 55 4e 49 4f 4e 29 0a 20 20 20 20 20 7c  E (UNION).     |
23b0: 2d 2d 4c 45 46 54 0a 20 20 20 20 20 7c 20 20 7c  --LEFT.     |  |
23c0: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
23d0: 20 20 20 20 20 7c 20 20 60 2d 2d 55 53 45 20 54       |  `--USE T
23e0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
23f0: 52 44 45 52 20 42 59 0a 20 20 20 20 20 60 2d 2d  RDER BY.     `--
2400: 52 49 47 48 54 0a 20 20 20 20 20 20 20 20 7c 2d  RIGHT.        |-
2410: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55  -SCAN TABLE t2 U
2420: 53 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 0a  SING INDEX t2i1.
2430: 20 20 20 20 20 20 20 20 60 2d 2d 55 53 45 20 54          `--USE T
2440: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 52  EMP B-TREE FOR R
2450: 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
2460: 45 52 20 42 59 0a 7d 0a 64 6f 5f 65 71 70 5f 74  ER BY.}.do_eqp_t
2470: 65 73 74 20 34 2e 32 2e 34 20 7b 0a 20 20 53 45  est 4.2.4 {.  SE
2480: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49  LECT * FROM t1 I
2490: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
24a0: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
24b0: 42 59 20 31 0a 7d 20 7b 0a 20 20 51 55 45 52 59  BY 1.} {.  QUERY
24c0: 20 50 4c 41 4e 0a 20 20 60 2d 2d 4d 45 52 47 45   PLAN.  `--MERGE
24d0: 20 28 49 4e 54 45 52 53 45 43 54 29 0a 20 20 20   (INTERSECT).   
24e0: 20 20 7c 2d 2d 4c 45 46 54 0a 20 20 20 20 20 7c    |--LEFT.     |
24f0: 20 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20    |--SCAN TABLE 
2500: 74 31 0a 20 20 20 20 20 7c 20 20 60 2d 2d 55 53  t1.     |  `--US
2510: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
2520: 52 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  R ORDER BY.     
2530: 60 2d 2d 52 49 47 48 54 0a 20 20 20 20 20 20 20  `--RIGHT.       
2540: 20 7c 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   |--SCAN TABLE t
2550: 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32  2 USING INDEX t2
2560: 69 31 0a 20 20 20 20 20 20 20 20 60 2d 2d 55 53  i1.        `--US
2570: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
2580: 52 20 52 49 47 48 54 20 50 41 52 54 20 4f 46 20  R RIGHT PART OF 
2590: 4f 52 44 45 52 20 42 59 0a 7d 0a 64 6f 5f 65 71  ORDER BY.}.do_eq
25a0: 70 5f 74 65 73 74 20 34 2e 32 2e 35 20 7b 0a 20  p_test 4.2.5 {. 
25b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
25c0: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
25d0: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
25e0: 42 59 20 31 0a 7d 20 7b 0a 20 20 51 55 45 52 59  BY 1.} {.  QUERY
25f0: 20 50 4c 41 4e 0a 20 20 60 2d 2d 4d 45 52 47 45   PLAN.  `--MERGE
2600: 20 28 45 58 43 45 50 54 29 0a 20 20 20 20 20 7c   (EXCEPT).     |
2610: 2d 2d 4c 45 46 54 0a 20 20 20 20 20 7c 20 20 7c  --LEFT.     |  |
2620: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
2630: 20 20 20 20 20 7c 20 20 60 2d 2d 55 53 45 20 54       |  `--USE T
2640: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
2650: 52 44 45 52 20 42 59 0a 20 20 20 20 20 60 2d 2d  RDER BY.     `--
2660: 52 49 47 48 54 0a 20 20 20 20 20 20 20 20 7c 2d  RIGHT.        |-
2670: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55  -SCAN TABLE t2 U
2680: 53 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 0a  SING INDEX t2i1.
2690: 20 20 20 20 20 20 20 20 60 2d 2d 55 53 45 20 54          `--USE T
26a0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 52  EMP B-TREE FOR R
26b0: 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
26c0: 45 52 20 42 59 0a 7d 0a 0a 64 6f 5f 65 71 70 5f  ER BY.}..do_eqp_
26d0: 74 65 73 74 20 34 2e 33 2e 31 20 7b 0a 20 20 53  test 4.3.1 {.  S
26e0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
26f0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 78 20 46  UNION SELECT x F
2700: 52 4f 4d 20 74 32 0a 7d 20 7b 0a 20 20 51 55 45  ROM t2.} {.  QUE
2710: 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 43 4f 4d  RY PLAN.  `--COM
2720: 50 4f 55 4e 44 20 51 55 45 52 59 0a 20 20 20 20  POUND QUERY.    
2730: 20 7c 2d 2d 4c 45 46 54 2d 4d 4f 53 54 20 53 55   |--LEFT-MOST SU
2740: 42 51 55 45 52 59 0a 20 20 20 20 20 7c 20 20 60  BQUERY.     |  `
2750: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
2760: 20 20 20 20 20 60 2d 2d 55 4e 49 4f 4e 20 55 53       `--UNION US
2770: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 0a  ING TEMP B-TREE.
2780: 20 20 20 20 20 20 20 20 60 2d 2d 53 43 41 4e 20          `--SCAN 
2790: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 43  TABLE t2 USING C
27a0: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 32  OVERING INDEX t2
27b0: 69 31 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  i1.}..do_eqp_tes
27c0: 74 20 34 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45  t 4.3.2 {.  SELE
27d0: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT x FROM t1 UNI
27e0: 4f 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  ON SELECT x FROM
27f0: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
2800: 20 78 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 0a 20   x FROM t1.} {. 
2810: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d   QUERY PLAN.  `-
2820: 2d 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52 59 0a  -COMPOUND QUERY.
2830: 20 20 20 20 20 7c 2d 2d 4c 45 46 54 2d 4d 4f 53       |--LEFT-MOS
2840: 54 20 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T SUBQUERY.     
2850: 7c 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45  |  `--SCAN TABLE
2860: 20 74 31 0a 20 20 20 20 20 7c 2d 2d 55 4e 49 4f   t1.     |--UNIO
2870: 4e 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  N USING TEMP B-T
2880: 52 45 45 0a 20 20 20 20 20 7c 20 20 60 2d 2d 53  REE.     |  `--S
2890: 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49  CAN TABLE t2 USI
28a0: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
28b0: 58 20 74 32 69 31 0a 20 20 20 20 20 60 2d 2d 55  X t2i1.     `--U
28c0: 4e 49 4f 4e 20 55 53 49 4e 47 20 54 45 4d 50 20  NION USING TEMP 
28d0: 42 2d 54 52 45 45 0a 20 20 20 20 20 20 20 20 60  B-TREE.        `
28e0: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
28f0: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e  }.do_eqp_test 4.
2900: 33 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 78  3.3 {.  SELECT x
2910: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
2920: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
2930: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 78 20 46  UNION SELECT x F
2940: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
2950: 31 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  1.} {.  QUERY PL
2960: 41 4e 0a 20 20 60 2d 2d 4d 45 52 47 45 20 28 55  AN.  `--MERGE (U
2970: 4e 49 4f 4e 29 0a 20 20 20 20 20 7c 2d 2d 4c 45  NION).     |--LE
2980: 46 54 0a 20 20 20 20 20 7c 20 20 60 2d 2d 4d 45  FT.     |  `--ME
2990: 52 47 45 20 28 55 4e 49 4f 4e 29 0a 20 20 20 20  RGE (UNION).    
29a0: 20 7c 20 20 20 20 20 7c 2d 2d 4c 45 46 54 0a 20   |     |--LEFT. 
29b0: 20 20 20 20 7c 20 20 20 20 20 7c 20 20 7c 2d 2d      |     |  |--
29c0: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a 20 20  SCAN TABLE t1.  
29d0: 20 20 20 7c 20 20 20 20 20 7c 20 20 60 2d 2d 55     |     |  `--U
29e0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
29f0: 4f 52 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  OR ORDER BY.    
2a00: 20 7c 20 20 20 20 20 60 2d 2d 52 49 47 48 54 0a   |     `--RIGHT.
2a10: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 60 2d       |        `-
2a20: 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55  -SCAN TABLE t2 U
2a30: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2a40: 44 45 58 20 74 32 69 31 0a 20 20 20 20 20 60 2d  DEX t2i1.     `-
2a50: 2d 52 49 47 48 54 0a 20 20 20 20 20 20 20 20 7c  -RIGHT.        |
2a60: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31 0a  --SCAN TABLE t1.
2a70: 20 20 20 20 20 20 20 20 60 2d 2d 55 53 45 20 54          `--USE T
2a80: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
2a90: 52 44 45 52 20 42 59 0a 7d 0a 0a 69 66 20 30 20  RDER BY.}..if 0 
2aa0: 7b 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {.#-------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
2af0: 68 69 73 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  his next block o
2b00: 66 20 74 65 73 74 73 20 76 65 72 69 66 69 65 73  f tests verifies
2b10: 20 74 68 61 74 20 74 68 65 20 65 78 61 6d 70 6c   that the exampl
2b20: 65 73 20 6f 6e 20 74 68 65 20 0a 23 20 6c 61 6e  es on the .# lan
2b30: 67 5f 65 78 70 6c 61 69 6e 2e 68 74 6d 6c 20 70  g_explain.html p
2b40: 61 67 65 20 61 72 65 20 63 6f 72 72 65 63 74 2e  age are correct.
2b50: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
2b60: 65 73 0a 0a 23 20 58 56 49 44 45 4e 43 45 2d 4f  es..# XVIDENCE-O
2b70: 46 3a 20 52 2d 34 37 37 37 39 2d 34 37 36 30 35  F: R-47779-47605
2b80: 20 73 71 6c 69 74 65 3e 20 45 58 50 4c 41 49 4e   sqlite> EXPLAIN
2b90: 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
2ba0: 43 54 20 61 2c 20 62 0a 23 20 46 52 4f 4d 20 74  CT a, b.# FROM t
2bb0: 31 20 57 48 45 52 45 20 61 3d 31 3b 0a 23 20 30  1 WHERE a=1;.# 0
2bc0: 7c 30 7c 30 7c 53 43 41 4e 20 54 41 42 4c 45 20  |0|0|SCAN TABLE 
2bd0: 74 31 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t1.#.do_execsql_
2be0: 74 65 73 74 20 35 2e 31 2e 30 20 7b 20 43 52 45  test 5.1.0 { CRE
2bf0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
2c00: 4e 54 2c 20 62 20 49 4e 54 2c 20 65 78 20 54 45  NT, b INT, ex TE
2c10: 58 54 29 20 7d 0a 64 65 74 20 35 2e 31 2e 31 20  XT) }.det 5.1.1 
2c20: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
2c30: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 22 20  M t1 WHERE a=1" 
2c40: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
2c50: 54 41 42 4c 45 20 74 31 7d 0a 7d 0a 0a 23 20 58  TABLE t1}.}..# X
2c60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
2c70: 38 35 32 2d 31 37 35 39 39 20 73 71 6c 69 74 65  852-17599 sqlite
2c80: 3e 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  > CREATE INDEX i
2c90: 31 20 4f 4e 20 74 31 28 61 29 3b 0a 23 20 73 71  1 ON t1(a);.# sq
2ca0: 6c 69 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55  lite> EXPLAIN QU
2cb0: 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
2cc0: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a, b FROM t1 WHE
2cd0: 52 45 20 61 3d 31 3b 0a 23 20 30 7c 30 7c 30 7c  RE a=1;.# 0|0|0|
2ce0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
2cf0: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 0a 23  USING INDEX i1.#
2d00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2d10: 20 35 2e 32 2e 30 20 7b 20 43 52 45 41 54 45 20   5.2.0 { CREATE 
2d20: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
2d30: 29 20 7d 0a 64 65 74 20 35 2e 32 2e 31 20 22 53  ) }.det 5.2.1 "S
2d40: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2d50: 74 31 20 57 48 45 52 45 20 61 3d 31 22 20 7b 0a  t1 WHERE a=1" {.
2d60: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
2d70: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49  TABLE t1 USING I
2d80: 4e 44 45 58 20 69 31 20 28 61 3d 3f 29 7d 0a 7d  NDEX i1 (a=?)}.}
2d90: 0a 0a 23 20 58 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# XVIDENCE-OF:
2da0: 20 52 2d 32 31 31 37 39 2d 31 31 30 31 31 20 73   R-21179-11011 s
2db0: 71 6c 69 74 65 3e 20 43 52 45 41 54 45 20 49 4e  qlite> CREATE IN
2dc0: 44 45 58 20 69 32 20 4f 4e 20 74 31 28 61 2c 20  DEX i2 ON t1(a, 
2dd0: 62 29 3b 0a 23 20 73 71 6c 69 74 65 3e 20 45 58  b);.# sqlite> EX
2de0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
2e00: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 3b 0a  M t1 WHERE a=1;.
2e10: 23 20 30 7c 30 7c 30 7c 53 45 41 52 43 48 20 54  # 0|0|0|SEARCH T
2e20: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f  ABLE t1 USING CO
2e30: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32 20  VERING INDEX i2 
2e40: 28 61 3d 3f 29 0a 23 0a 64 6f 5f 65 78 65 63 73  (a=?).#.do_execs
2e50: 71 6c 5f 74 65 73 74 20 35 2e 33 2e 30 20 7b 20  ql_test 5.3.0 { 
2e60: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
2e70: 4f 4e 20 74 31 28 61 2c 20 62 29 20 7d 0a 64 65  ON t1(a, b) }.de
2e80: 74 20 35 2e 33 2e 31 20 22 53 45 4c 45 43 54 20  t 5.3.1 "SELECT 
2e90: 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a, b FROM t1 WHE
2ea0: 52 45 20 61 3d 31 22 20 7b 0a 20 20 30 20 30 20  RE a=1" {.  0 0 
2eb0: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
2ec0: 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e  t1 USING COVERIN
2ed0: 47 20 49 4e 44 45 58 20 69 32 20 28 61 3d 3f 29  G INDEX i2 (a=?)
2ee0: 7d 0a 7d 0a 0a 23 20 58 56 49 44 45 4e 43 45 2d  }.}..# XVIDENCE-
2ef0: 4f 46 3a 20 52 2d 30 39 39 39 31 2d 34 38 39 34  OF: R-09991-4894
2f00: 31 20 73 71 6c 69 74 65 3e 20 45 58 50 4c 41 49  1 sqlite> EXPLAI
2f10: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 23 20 53  N QUERY PLAN.# S
2f20: 45 4c 45 43 54 20 74 31 2e 2a 2c 20 74 32 2e 2a  ELECT t1.*, t2.*
2f30: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2f40: 52 45 20 74 31 2e 61 3d 31 20 41 4e 44 20 74 31  RE t1.a=1 AND t1
2f50: 2e 62 3e 32 3b 0a 23 20 30 7c 30 7c 30 7c 53 45  .b>2;.# 0|0|0|SE
2f60: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
2f70: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2f80: 45 58 20 69 32 20 28 61 3d 3f 20 41 4e 44 20 62  EX i2 (a=? AND b
2f90: 3e 3f 29 0a 23 20 30 7c 31 7c 31 7c 53 43 41 4e  >?).# 0|1|1|SCAN
2fa0: 20 54 41 42 4c 45 20 74 32 0a 23 0a 64 6f 5f 65   TABLE t2.#.do_e
2fb0: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 34 2e  xecsql_test 5.4.
2fc0: 30 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  0 {CREATE TABLE 
2fd0: 74 32 28 63 20 49 4e 54 2c 20 64 20 49 4e 54 2c  t2(c INT, d INT,
2fe0: 20 65 78 20 54 45 58 54 29 7d 0a 64 65 74 20 35   ex TEXT)}.det 5
2ff0: 2e 34 2e 31 20 22 53 45 4c 45 43 54 20 74 31 2e  .4.1 "SELECT t1.
3000: 61 2c 20 74 32 2e 63 20 46 52 4f 4d 20 74 31 2c  a, t2.c FROM t1,
3010: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 31   t2 WHERE t1.a=1
3020: 20 41 4e 44 20 74 31 2e 62 3e 32 22 20 7b 0a 20   AND t1.b>2" {. 
3030: 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   0 0 0 {SEARCH T
3040: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f  ABLE t1 USING CO
3050: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32 20  VERING INDEX i2 
3060: 28 61 3d 3f 20 41 4e 44 20 62 3e 3f 29 7d 0a 20  (a=? AND b>?)}. 
3070: 20 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42   0 1 1 {SCAN TAB
3080: 4c 45 20 74 32 7d 0a 7d 0a 0a 23 20 58 56 49 44  LE t2}.}..# XVID
3090: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36 32 36  ENCE-OF: R-33626
30a0: 2d 36 31 30 38 35 20 73 71 6c 69 74 65 3e 20 45  -61085 sqlite> E
30b0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
30c0: 4e 0a 23 20 53 45 4c 45 43 54 20 74 31 2e 2a 2c  N.# SELECT t1.*,
30d0: 20 74 32 2e 2a 20 46 52 4f 4d 20 74 32 2c 20 74   t2.* FROM t2, t
30e0: 31 20 57 48 45 52 45 20 74 31 2e 61 3d 31 20 41  1 WHERE t1.a=1 A
30f0: 4e 44 20 74 31 2e 62 3e 32 3b 0a 23 20 30 7c 30  ND t1.b>2;.# 0|0
3100: 7c 31 7c 53 45 41 52 43 48 20 54 41 42 4c 45 20  |1|SEARCH TABLE 
3110: 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e  t1 USING COVERIN
3120: 47 20 49 4e 44 45 58 20 69 32 20 28 61 3d 3f 20  G INDEX i2 (a=? 
3130: 41 4e 44 20 62 3e 3f 29 0a 23 20 30 7c 31 7c 30  AND b>?).# 0|1|0
3140: 7c 53 43 41 4e 20 54 41 42 4c 45 20 74 32 0a 23  |SCAN TABLE t2.#
3150: 0a 64 65 74 20 35 2e 35 20 22 53 45 4c 45 43 54  .det 5.5 "SELECT
3160: 20 74 31 2e 61 2c 20 74 32 2e 63 20 46 52 4f 4d   t1.a, t2.c FROM
3170: 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
3180: 2e 61 3d 31 20 41 4e 44 20 74 31 2e 62 3e 32 22  .a=1 AND t1.b>2"
3190: 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 45 41 52   {.  0 0 1 {SEAR
31a0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  CH TABLE t1 USIN
31b0: 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
31c0: 20 69 32 20 28 61 3d 3f 20 41 4e 44 20 62 3e 3f   i2 (a=? AND b>?
31d0: 29 7d 0a 20 20 30 20 31 20 30 20 7b 53 43 41 4e  )}.  0 1 0 {SCAN
31e0: 20 54 41 42 4c 45 20 74 32 7d 0a 7d 0a 0a 23 20   TABLE t2}.}..# 
31f0: 58 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  XVIDENCE-OF: R-0
3200: 34 30 30 32 2d 32 35 36 35 34 20 73 71 6c 69 74  4002-25654 sqlit
3210: 65 3e 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  e> CREATE INDEX 
3220: 69 33 20 4f 4e 20 74 31 28 62 29 3b 0a 23 20 73  i3 ON t1(b);.# s
3230: 71 6c 69 74 65 3e 20 45 58 50 4c 41 49 4e 20 51  qlite> EXPLAIN Q
3240: 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
3250: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3260: 20 61 3d 31 20 4f 52 20 62 3d 32 3b 0a 23 20 30   a=1 OR b=2;.# 0
3270: 7c 30 7c 30 7c 53 45 41 52 43 48 20 54 41 42 4c  |0|0|SEARCH TABL
3280: 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52  E t1 USING COVER
3290: 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 61 3d  ING INDEX i2 (a=
32a0: 3f 29 0a 23 20 30 7c 30 7c 30 7c 53 45 41 52 43  ?).# 0|0|0|SEARC
32b0: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
32c0: 20 49 4e 44 45 58 20 69 33 20 28 62 3d 3f 29 0a   INDEX i3 (b=?).
32d0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
32e0: 74 20 35 2e 35 2e 30 20 7b 43 52 45 41 54 45 20  t 5.5.0 {CREATE 
32f0: 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 62  INDEX i3 ON t1(b
3300: 29 7d 0a 64 65 74 20 35 2e 36 2e 31 20 22 53 45  )}.det 5.6.1 "SE
3310: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  LECT a, b FROM t
3320: 31 20 57 48 45 52 45 20 61 3d 31 20 4f 52 20 62  1 WHERE a=1 OR b
3330: 3d 32 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  =2" {.  0 0 0 {S
3340: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
3350: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
3360: 44 45 58 20 69 32 20 28 61 3d 3f 29 7d 0a 20 20  DEX i2 (a=?)}.  
3370: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
3380: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44  BLE t1 USING IND
3390: 45 58 20 69 33 20 28 62 3d 3f 29 7d 0a 7d 0a 0a  EX i3 (b=?)}.}..
33a0: 23 20 58 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # XVIDENCE-OF: R
33b0: 2d 32 34 35 37 37 2d 33 38 38 39 31 20 73 71 6c  -24577-38891 sql
33c0: 69 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45  ite> EXPLAIN QUE
33d0: 52 59 20 50 4c 41 4e 0a 23 20 53 45 4c 45 43 54  RY PLAN.# SELECT
33e0: 20 63 2c 20 64 20 46 52 4f 4d 20 74 32 20 4f 52   c, d FROM t2 OR
33f0: 44 45 52 20 42 59 20 63 3b 0a 23 20 30 7c 30 7c  DER BY c;.# 0|0|
3400: 30 7c 53 43 41 4e 20 54 41 42 4c 45 20 74 32 0a  0|SCAN TABLE t2.
3410: 23 20 30 7c 30 7c 30 7c 55 53 45 20 54 45 4d 50  # 0|0|0|USE TEMP
3420: 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45   B-TREE FOR ORDE
3430: 52 20 42 59 0a 23 0a 64 65 74 20 35 2e 37 20 22  R BY.#.det 5.7 "
3440: 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d  SELECT c, d FROM
3450: 20 74 32 20 4f 52 44 45 52 20 42 59 20 63 22 20   t2 ORDER BY c" 
3460: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
3470: 54 41 42 4c 45 20 74 32 7d 0a 20 20 30 20 30 20  TABLE t2}.  0 0 
3480: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
3490: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
34a0: 0a 7d 0a 0a 23 20 58 56 49 44 45 4e 43 45 2d 4f  .}..# XVIDENCE-O
34b0: 46 3a 20 52 2d 35 38 31 35 37 2d 31 32 33 35 35  F: R-58157-12355
34c0: 20 73 71 6c 69 74 65 3e 20 43 52 45 41 54 45 20   sqlite> CREATE 
34d0: 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 32 28 63  INDEX i4 ON t2(c
34e0: 29 3b 0a 23 20 73 71 6c 69 74 65 3e 20 45 58 50  );.# sqlite> EXP
34f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
3500: 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d  SELECT c, d FROM
3510: 20 74 32 20 4f 52 44 45 52 20 42 59 20 63 3b 0a   t2 ORDER BY c;.
3520: 23 20 30 7c 30 7c 30 7c 53 43 41 4e 20 54 41 42  # 0|0|0|SCAN TAB
3530: 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45  LE t2 USING INDE
3540: 58 20 69 34 0a 23 0a 64 6f 5f 65 78 65 63 73 71  X i4.#.do_execsq
3550: 6c 5f 74 65 73 74 20 35 2e 38 2e 30 20 7b 43 52  l_test 5.8.0 {CR
3560: 45 41 54 45 20 49 4e 44 45 58 20 69 34 20 4f 4e  EATE INDEX i4 ON
3570: 20 74 32 28 63 29 7d 0a 64 65 74 20 35 2e 38 2e   t2(c)}.det 5.8.
3580: 31 20 22 53 45 4c 45 43 54 20 63 2c 20 64 20 46  1 "SELECT c, d F
3590: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
35a0: 63 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  c" {.  0 0 0 {SC
35b0: 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  AN TABLE t2 USIN
35c0: 47 20 49 4e 44 45 58 20 69 34 7d 0a 7d 0a 0a 23  G INDEX i4}.}..#
35d0: 20 58 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   XVIDENCE-OF: R-
35e0: 31 33 39 33 31 2d 31 30 34 32 31 20 73 71 6c 69  13931-10421 sqli
35f0: 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  te> EXPLAIN QUER
3600: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 0a 23 20  Y PLAN SELECT.# 
3610: 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74  (SELECT b FROM t
3620: 31 20 57 48 45 52 45 20 61 3d 30 29 2c 20 28 53  1 WHERE a=0), (S
3630: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
3640: 57 48 45 52 45 20 62 3d 74 32 2e 63 29 20 46 52  WHERE b=t2.c) FR
3650: 4f 4d 20 74 32 3b 0a 23 20 30 7c 30 7c 30 7c 53  OM t2;.# 0|0|0|S
3660: 43 41 4e 20 54 41 42 4c 45 20 74 32 0a 23 20 30  CAN TABLE t2.# 0
3670: 7c 30 7c 30 7c 45 58 45 43 55 54 45 20 53 43 41  |0|0|EXECUTE SCA
3680: 4c 41 52 20 53 55 42 51 55 45 52 59 20 31 0a 23  LAR SUBQUERY 1.#
3690: 20 31 7c 30 7c 30 7c 53 45 41 52 43 48 20 54 41   1|0|0|SEARCH TA
36a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56  BLE t1 USING COV
36b0: 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28  ERING INDEX i2 (
36c0: 61 3d 3f 29 0a 23 20 30 7c 30 7c 30 7c 45 58 45  a=?).# 0|0|0|EXE
36d0: 43 55 54 45 20 43 4f 52 52 45 4c 41 54 45 44 20  CUTE CORRELATED 
36e0: 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20  SCALAR SUBQUERY 
36f0: 32 0a 23 20 32 7c 30 7c 30 7c 53 45 41 52 43 48  2.# 2|0|0|SEARCH
3700: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
3710: 49 4e 44 45 58 20 69 33 20 28 62 3d 3f 29 0a 23  INDEX i3 (b=?).#
3720: 0a 64 65 74 20 35 2e 39 20 7b 0a 20 20 53 45 4c  .det 5.9 {.  SEL
3730: 45 43 54 20 28 53 45 4c 45 43 54 20 62 20 46 52  ECT (SELECT b FR
3740: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 29  OM t1 WHERE a=0)
3750: 2c 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  , (SELECT a FROM
3760: 20 74 31 20 57 48 45 52 45 20 62 3d 74 32 2e 63   t1 WHERE b=t2.c
3770: 29 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 0a 20 20  ) FROM t2.} {.  
3780: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
3790: 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45 52  E t2 USING COVER
37a0: 49 4e 47 20 49 4e 44 45 58 20 69 34 7d 0a 20 20  ING INDEX i4}.  
37b0: 30 20 30 20 30 20 7b 45 58 45 43 55 54 45 20 53  0 0 0 {EXECUTE S
37c0: 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20 31  CALAR SUBQUERY 1
37d0: 7d 0a 20 20 31 20 30 20 30 20 7b 53 45 41 52 43  }.  1 0 0 {SEARC
37e0: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
37f0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
3800: 69 32 20 28 61 3d 3f 29 7d 0a 20 20 30 20 30 20  i2 (a=?)}.  0 0 
3810: 30 20 7b 45 58 45 43 55 54 45 20 43 4f 52 52 45  0 {EXECUTE CORRE
3820: 4c 41 54 45 44 20 53 43 41 4c 41 52 20 53 55 42  LATED SCALAR SUB
3830: 51 55 45 52 59 20 32 7d 0a 20 20 32 20 30 20 30  QUERY 2}.  2 0 0
3840: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
3850: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 33  1 USING INDEX i3
3860: 20 28 62 3d 3f 29 7d 0a 7d 0a 0a 23 20 58 56 49   (b=?)}.}..# XVI
3870: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 38 39  DENCE-OF: R-5089
3880: 32 2d 34 35 39 34 33 20 73 71 6c 69 74 65 3e 20  2-45943 sqlite> 
3890: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
38a0: 41 4e 0a 23 20 53 45 4c 45 43 54 20 63 6f 75 6e  AN.# SELECT coun
38b0: 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  t(*) FROM (SELEC
38c0: 54 20 6d 61 78 28 62 29 20 41 53 20 78 20 46 52  T max(b) AS x FR
38d0: 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 61  OM t1 GROUP BY a
38e0: 29 20 47 52 4f 55 50 20 42 59 20 78 3b 0a 23 20  ) GROUP BY x;.# 
38f0: 31 7c 30 7c 30 7c 53 43 41 4e 20 54 41 42 4c 45  1|0|0|SCAN TABLE
3900: 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49   t1 USING COVERI
3910: 4e 47 20 49 4e 44 45 58 20 69 32 0a 23 20 30 7c  NG INDEX i2.# 0|
3920: 30 7c 30 7c 53 43 41 4e 20 53 55 42 51 55 45 52  0|0|SCAN SUBQUER
3930: 59 20 31 0a 23 20 30 7c 30 7c 30 7c 55 53 45 20  Y 1.# 0|0|0|USE 
3940: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
3950: 47 52 4f 55 50 20 42 59 0a 23 0a 64 65 74 20 35  GROUP BY.#.det 5
3960: 2e 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 63  .10 {.  SELECT c
3970: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45  ount(*) FROM (SE
3980: 4c 45 43 54 20 6d 61 78 28 62 29 20 41 53 20 78  LECT max(b) AS x
3990: 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
39a0: 59 20 61 29 20 47 52 4f 55 50 20 42 59 20 78 0a  Y a) GROUP BY x.
39b0: 7d 20 7b 0a 20 20 31 20 30 20 30 20 7b 53 43 41  } {.  1 0 0 {SCA
39c0: 4e 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  N TABLE t1 USING
39d0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
39e0: 69 32 7d 0a 20 20 30 20 30 20 30 20 7b 53 43 41  i2}.  0 0 0 {SCA
39f0: 4e 20 53 55 42 51 55 45 52 59 20 31 7d 0a 20 20  N SUBQUERY 1}.  
3a00: 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  0 0 0 {USE TEMP 
3a10: 42 2d 54 52 45 45 20 46 4f 52 20 47 52 4f 55 50  B-TREE FOR GROUP
3a20: 20 42 59 7d 0a 7d 0a 0a 23 20 58 56 49 44 45 4e   BY}.}..# XVIDEN
3a30: 43 45 2d 4f 46 3a 20 52 2d 34 36 32 31 39 2d 33  CE-OF: R-46219-3
3a40: 33 38 34 36 20 73 71 6c 69 74 65 3e 20 45 58 50  3846 sqlite> EXP
3a50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
3a60: 23 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  # SELECT * FROM 
3a70: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
3a80: 32 20 57 48 45 52 45 20 63 3d 31 29 2c 20 74 31  2 WHERE c=1), t1
3a90: 3b 0a 23 20 30 7c 30 7c 30 7c 53 45 41 52 43 48  ;.# 0|0|0|SEARCH
3aa0: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
3ab0: 49 4e 44 45 58 20 69 34 20 28 63 3d 3f 29 0a 23  INDEX i4 (c=?).#
3ac0: 20 30 7c 31 7c 31 7c 53 43 41 4e 20 54 41 42 4c   0|1|1|SCAN TABL
3ad0: 45 20 74 31 0a 23 0a 64 65 74 20 35 2e 31 31 20  E t1.#.det 5.11 
3ae0: 22 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f  "SELECT a, b FRO
3af0: 4d 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  M (SELECT * FROM
3b00: 20 74 32 20 57 48 45 52 45 20 63 3d 31 29 2c 20   t2 WHERE c=1), 
3b10: 74 31 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  t1" {.  0 0 0 {S
3b20: 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20 55  EARCH TABLE t2 U
3b30: 53 49 4e 47 20 49 4e 44 45 58 20 69 34 20 28 63  SING INDEX i4 (c
3b40: 3d 3f 29 7d 0a 20 20 30 20 31 20 31 20 7b 53 43  =?)}.  0 1 1 {SC
3b50: 41 4e 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AN TABLE t1 USIN
3b60: 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
3b70: 20 69 32 7d 0a 7d 0a 0a 23 20 58 56 49 44 45 4e   i2}.}..# XVIDEN
3b80: 43 45 2d 4f 46 3a 20 52 2d 33 37 38 37 39 2d 33  CE-OF: R-37879-3
3b90: 39 39 38 37 20 73 71 6c 69 74 65 3e 20 45 58 50  9987 sqlite> EXP
3ba0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
3bb0: 23 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  # SELECT a FROM 
3bc0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
3bd0: 63 20 46 52 4f 4d 20 74 32 3b 0a 23 20 31 7c 30  c FROM t2;.# 1|0
3be0: 7c 30 7c 53 43 41 4e 20 54 41 42 4c 45 20 74 31  |0|SCAN TABLE t1
3bf0: 0a 23 20 32 7c 30 7c 30 7c 53 43 41 4e 20 54 41  .# 2|0|0|SCAN TA
3c00: 42 4c 45 20 74 32 0a 23 20 30 7c 30 7c 30 7c 43  BLE t2.# 0|0|0|C
3c10: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
3c20: 45 53 20 31 20 41 4e 44 20 32 20 55 53 49 4e 47  ES 1 AND 2 USING
3c30: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 55 4e   TEMP B-TREE (UN
3c40: 49 4f 4e 29 0a 23 0a 64 65 74 20 35 2e 31 32 20  ION).#.det 5.12 
3c50: 22 53 45 4c 45 43 54 20 61 2c 62 20 46 52 4f 4d  "SELECT a,b FROM
3c60: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
3c70: 20 63 2c 20 39 39 20 46 52 4f 4d 20 74 32 22 20   c, 99 FROM t2" 
3c80: 7b 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e 20  {.  1 0 0 {SCAN 
3c90: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43  TABLE t1 USING C
3ca0: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32  OVERING INDEX i2
3cb0: 7d 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e 20  }.  2 0 0 {SCAN 
3cc0: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 43  TABLE t2 USING C
3cd0: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 34  OVERING INDEX i4
3ce0: 7d 0a 20 20 30 20 30 20 30 20 7b 43 4f 4d 50 4f  }.  0 0 0 {COMPO
3cf0: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 31  UND SUBQUERIES 1
3d00: 20 41 4e 44 20 32 20 55 53 49 4e 47 20 54 45 4d   AND 2 USING TEM
3d10: 50 20 42 2d 54 52 45 45 20 28 55 4e 49 4f 4e 29  P B-TREE (UNION)
3d20: 7d 0a 7d 0a 0a 23 20 58 56 49 44 45 4e 43 45 2d  }.}..# XVIDENCE-
3d30: 4f 46 3a 20 52 2d 34 34 38 36 34 2d 36 33 30 31  OF: R-44864-6301
3d40: 31 20 73 71 6c 69 74 65 3e 20 45 58 50 4c 41 49  1 sqlite> EXPLAI
3d50: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 23 20 53  N QUERY PLAN.# S
3d60: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
3d70: 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 64 20  EXCEPT SELECT d 
3d80: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
3d90: 20 31 3b 0a 23 20 31 7c 30 7c 30 7c 53 43 41 4e   1;.# 1|0|0|SCAN
3da0: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
3db0: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69  COVERING INDEX i
3dc0: 32 0a 23 20 32 7c 30 7c 30 7c 53 43 41 4e 20 54  2.# 2|0|0|SCAN T
3dd0: 41 42 4c 45 20 74 32 20 32 7c 30 7c 30 7c 55 53  ABLE t2 2|0|0|US
3de0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
3df0: 52 20 4f 52 44 45 52 20 42 59 0a 23 20 30 7c 30  R ORDER BY.# 0|0
3e00: 7c 30 7c 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  |0|COMPOUND SUBQ
3e10: 55 45 52 49 45 53 20 31 20 41 4e 44 20 32 20 28  UERIES 1 AND 2 (
3e20: 45 58 43 45 50 54 29 0a 23 0a 64 65 74 20 35 2e  EXCEPT).#.det 5.
3e30: 31 33 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  13 "SELECT a FRO
3e40: 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
3e50: 43 54 20 64 20 46 52 4f 4d 20 74 32 20 4f 52 44  CT d FROM t2 ORD
3e60: 45 52 20 42 59 20 31 22 20 7b 0a 20 20 31 20 30  ER BY 1" {.  1 0
3e70: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
3e80: 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  1 USING COVERING
3e90: 20 49 4e 44 45 58 20 69 31 7d 0a 20 20 32 20 30   INDEX i1}.  2 0
3ea0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
3eb0: 32 7d 0a 20 20 32 20 30 20 30 20 7b 55 53 45 20  2}.  2 0 0 {USE 
3ec0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
3ed0: 4f 52 44 45 52 20 42 59 7d 0a 20 20 30 20 30 20  ORDER BY}.  0 0 
3ee0: 30 20 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  0 {COMPOUND SUBQ
3ef0: 55 45 52 49 45 53 20 31 20 41 4e 44 20 32 20 28  UERIES 1 AND 2 (
3f00: 45 58 43 45 50 54 29 7d 0a 7d 0a 0a 69 66 20 7b  EXCEPT)}.}..if {
3f10: 21 5b 6e 6f 6e 7a 65 72 6f 5f 72 65 73 65 72 76  ![nonzero_reserv
3f20: 65 64 5f 62 79 74 65 73 5d 7d 20 7b 0a 20 20 23  ed_bytes]} {.  #
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 23 20 54 68  ---------.  # Th
3f80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
3f90: 73 20 2d 20 65 71 70 2d 36 2e 2a 20 2d 20 74 65  s - eqp-6.* - te
3fa0: 73 74 20 74 68 61 74 20 74 68 65 20 65 78 61 6d  st that the exam
3fb0: 70 6c 65 20 43 20 63 6f 64 65 20 6f 6e 20 0a 20  ple C code on . 
3fc0: 20 23 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e   # documentation
3fd0: 20 70 61 67 65 20 65 71 70 2e 68 74 6d 6c 20 77   page eqp.html w
3fe0: 6f 72 6b 73 2e 20 54 68 65 20 43 20 63 6f 64 65  orks. The C code
3ff0: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 20 69   is duplicated i
4000: 6e 20 74 65 73 74 31 2e 63 0a 20 20 23 20 61 6e  n test1.c.  # an
4010: 64 20 77 72 61 70 70 65 64 20 69 6e 20 54 63 6c  d wrapped in Tcl
4020: 20 63 6f 6d 6d 61 6e 64 20 5b 70 72 69 6e 74 5f   command [print_
4030: 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c  explain_query_pl
4040: 61 6e 5d 20 0a 20 20 23 0a 20 20 73 65 74 20 62  an] .  #.  set b
4050: 6f 69 6c 65 72 70 6c 61 74 65 20 7b 0a 20 20 20  oilerplate {.   
4060: 20 70 72 6f 63 20 65 78 70 6c 61 69 6e 5f 71 75   proc explain_qu
4070: 65 72 79 5f 70 6c 61 6e 20 7b 64 62 20 73 71 6c  ery_plan {db sql
4080: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73 74  } {.      set st
4090: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
40a0: 61 72 65 5f 76 32 20 64 62 20 24 73 71 6c 20 2d  are_v2 db $sql -
40b0: 31 20 44 55 4d 4d 59 5d 0a 20 20 20 20 20 20 70  1 DUMMY].      p
40c0: 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65  rint_explain_que
40d0: 72 79 5f 70 6c 61 6e 20 24 73 74 6d 74 0a 20 20  ry_plan $stmt.  
40e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
40f0: 6c 69 7a 65 20 24 73 74 6d 74 0a 20 20 20 20 7d  lize $stmt.    }
4100: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
4110: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 70 6c  test.db.    expl
4120: 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 20 64  ain_query_plan d
4130: 62 20 7b 25 53 51 4c 25 7d 0a 20 20 20 20 64 62  b {%SQL%}.    db
4140: 20 63 6c 6f 73 65 0a 20 20 20 20 65 78 69 74 0a   close.    exit.
4150: 20 20 7d 0a 20 20 0a 20 20 23 20 44 6f 20 61 20    }.  .  # Do a 
4160: 22 50 72 69 6e 74 20 45 78 70 6c 61 69 6e 20 51  "Print Explain Q
4170: 75 65 72 79 20 50 6c 61 6e 22 20 74 65 73 74 2e  uery Plan" test.
4180: 0a 20 20 70 72 6f 63 20 64 6f 5f 70 65 71 70 5f  .  proc do_peqp_
4190: 74 65 73 74 20 7b 74 6e 20 73 71 6c 20 72 65 73  test {tn sql res
41a0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 64 20 5b  } {.    set fd [
41b0: 6f 70 65 6e 20 73 63 72 69 70 74 2e 74 63 6c 20  open script.tcl 
41c0: 77 5d 0a 20 20 20 20 70 75 74 73 20 24 66 64 20  w].    puts $fd 
41d0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
41e0: 74 20 25 53 51 4c 25 20 24 73 71 6c 5d 20 24 3a  t %SQL% $sql] $:
41f0: 3a 62 6f 69 6c 65 72 70 6c 61 74 65 5d 0a 20 20  :boilerplate].  
4200: 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 0a 20    close $fd.  . 
4210: 20 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 74 65     uplevel do_te
4220: 73 74 20 24 74 6e 20 5b 6c 69 73 74 20 7b 0a 20  st $tn [list {. 
4230: 20 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65       set fd [ope
4240: 6e 20 22 7c 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  n "|[info nameof
4250: 65 78 65 63 5d 20 73 63 72 69 70 74 2e 74 63 6c  exec] script.tcl
4260: 22 5d 0a 20 20 20 20 20 20 73 65 74 20 64 61 74  "].      set dat
4270: 61 20 5b 72 65 61 64 20 24 66 64 5d 0a 20 20 20  a [read $fd].   
4280: 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 20     close $fd.   
4290: 20 20 20 73 65 74 20 64 61 74 61 0a 20 20 20 20     set data.    
42a0: 7d 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d 0a 20  }] [list $res]. 
42b0: 20 7d 0a 20 20 0a 20 20 64 6f 5f 70 65 71 70 5f   }.  .  do_peqp_
42c0: 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 20 20 53  test 6.1 {.    S
42d0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
42e0: 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
42f0: 20 64 2c 20 39 39 20 46 52 4f 4d 20 74 32 20 4f   d, 99 FROM t2 O
4300: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 20 5b 73  RDER BY 1.  } [s
4310: 74 72 69 6e 67 20 74 72 69 6d 6c 65 66 74 20 7b  tring trimleft {
4320: 0a 31 20 30 20 30 20 53 43 41 4e 20 54 41 42 4c  .1 0 0 SCAN TABL
4330: 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52  E t1 USING COVER
4340: 49 4e 47 20 49 4e 44 45 58 20 69 32 0a 32 20 30  ING INDEX i2.2 0
4350: 20 30 20 53 43 41 4e 20 54 41 42 4c 45 20 74 32   0 SCAN TABLE t2
4360: 0a 32 20 30 20 30 20 55 53 45 20 54 45 4d 50 20  .2 0 0 USE TEMP 
4370: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
4380: 20 42 59 0a 30 20 30 20 30 20 43 4f 4d 50 4f 55   BY.0 0 0 COMPOU
4390: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 31 20  ND SUBQUERIES 1 
43a0: 41 4e 44 20 32 20 28 45 58 43 45 50 54 29 0a 7d  AND 2 (EXCEPT).}
43b0: 5d 0a 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ].}.}..#--------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
4410: 67 20 74 65 73 74 73 20 2d 20 65 71 70 2d 37 2e  g tests - eqp-7.
4420: 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 71 75  * - test that qu
4430: 65 72 69 65 73 20 74 68 61 74 20 75 73 65 20 74  eries that use t
4440: 68 65 20 4f 50 5f 43 6f 75 6e 74 0a 23 20 6f 70  he OP_Count.# op
4450: 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65 74 75 72  timization retur
4460: 6e 20 73 6f 6d 65 74 68 69 6e 67 20 73 65 6e 73  n something sens
4470: 69 62 6c 65 20 77 69 74 68 20 45 51 50 2e 0a 23  ible with EQP..#
4480: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
4490: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
44a0: 74 20 37 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 7.0 {.  CREATE
44b0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 2c   TABLE t1(a INT,
44c0: 20 62 20 49 4e 54 2c 20 65 78 20 43 48 41 52 28   b INT, ex CHAR(
44d0: 31 30 30 29 29 3b 0a 20 20 43 52 45 41 54 45 20  100));.  CREATE 
44e0: 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54 2c 20  TABLE t2(a INT, 
44f0: 62 20 49 4e 54 2c 20 65 78 20 43 48 41 52 28 31  b INT, ex CHAR(1
4500: 30 30 29 29 3b 0a 20 20 43 52 45 41 54 45 20 49  00));.  CREATE I
4510: 4e 44 45 58 20 69 31 20 4f 4e 20 74 32 28 61 29  NDEX i1 ON t2(a)
4520: 3b 0a 7d 0a 0a 64 65 74 20 37 2e 31 20 22 53 45  ;.}..det 7.1 "SE
4530: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
4540: 4f 4d 20 74 31 22 20 7b 0a 20 20 51 55 45 52 59  OM t1" {.  QUERY
4550: 20 50 4c 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20   PLAN.  `--SCAN 
4560: 54 41 42 4c 45 20 74 31 0a 7d 0a 0a 64 65 74 20  TABLE t1.}..det 
4570: 37 2e 32 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  7.2 "SELECT coun
4580: 74 28 2a 29 20 46 52 4f 4d 20 74 32 22 20 7b 0a  t(*) FROM t2" {.
4590: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60    QUERY PLAN.  `
45a0: 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20  --SCAN TABLE t2 
45b0: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
45c0: 4e 44 45 58 20 69 31 0a 7d 0a 0a 64 6f 5f 65 78  NDEX i1.}..do_ex
45d0: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 20 7b  ecsql_test 7.3 {
45e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
45f0: 31 28 61 2c 62 29 20 56 41 4c 55 45 53 28 31 2c  1(a,b) VALUES(1,
4600: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
4610: 54 4f 20 74 31 28 61 2c 62 29 20 56 41 4c 55 45  TO t1(a,b) VALUE
4620: 53 28 33 2c 20 34 29 3b 0a 0a 20 20 49 4e 53 45  S(3, 4);..  INSE
4630: 52 54 20 49 4e 54 4f 20 74 32 28 61 2c 62 29 20  RT INTO t2(a,b) 
4640: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
4650: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61  INSERT INTO t2(a
4660: 2c 62 29 20 56 41 4c 55 45 53 28 33 2c 20 34 29  ,b) VALUES(3, 4)
4670: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
4680: 74 32 28 61 2c 62 29 20 56 41 4c 55 45 53 28 35  t2(a,b) VALUES(5
4690: 2c 20 36 29 3b 0a 20 0a 20 20 41 4e 41 4c 59 5a  , 6);. .  ANALYZ
46a0: 45 3b 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 73  E;.}..db close.s
46b0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
46c0: 62 0a 0a 64 65 74 20 37 2e 34 20 22 53 45 4c 45  b..det 7.4 "SELE
46d0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
46e0: 20 74 31 22 20 7b 0a 20 20 51 55 45 52 59 20 50   t1" {.  QUERY P
46f0: 4c 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41  LAN.  `--SCAN TA
4700: 42 4c 45 20 74 31 0a 7d 0a 0a 64 65 74 20 37 2e  BLE t1.}..det 7.
4710: 35 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  5 "SELECT count(
4720: 2a 29 20 46 52 4f 4d 20 74 32 22 20 7b 0a 20 20  *) FROM t2" {.  
4730: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d  QUERY PLAN.  `--
4740: 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53  SCAN TABLE t2 US
4750: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
4760: 45 58 20 69 31 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  EX i1.}..#------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
47c0: 69 6e 67 20 74 65 73 74 73 20 2d 20 65 71 70 2d  ing tests - eqp-
47d0: 38 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20  8.* - test that 
47e0: 71 75 65 72 69 65 73 20 74 68 61 74 20 75 73 65  queries that use
47f0: 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 0a 23 20   the OP_Count.# 
4800: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65 74  optimization ret
4810: 75 72 6e 20 73 6f 6d 65 74 68 69 6e 67 20 73 65  urn something se
4820: 6e 73 69 62 6c 65 20 77 69 74 68 20 45 51 50 2e  nsible with EQP.
4830: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
4840: 65 73 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  es..do_execsql_t
4850: 65 73 74 20 38 2e 30 20 7b 0a 20 20 43 52 45 41  est 8.0 {.  CREA
4860: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
4870: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
4880: 28 62 2c 20 63 29 29 20 57 49 54 48 4f 55 54 20  (b, c)) WITHOUT 
4890: 52 4f 57 49 44 3b 0a 20 20 43 52 45 41 54 45 20  ROWID;.  CREATE 
48a0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63  TABLE t2(a, b, c
48b0: 29 3b 0a 7d 0a 0a 64 65 74 20 38 2e 31 2e 31 20  );.}..det 8.1.1 
48c0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
48d0: 32 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41  2" {.  QUERY PLA
48e0: 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c  N.  `--SCAN TABL
48f0: 45 20 74 32 0a 7d 0a 0a 64 65 74 20 38 2e 31 2e  E t2.}..det 8.1.
4900: 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 "SELECT * FROM
4910: 20 74 32 20 57 48 45 52 45 20 72 6f 77 69 64 3d   t2 WHERE rowid=
4920: 3f 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41  ?" {.  QUERY PLA
4930: 4e 0a 20 20 60 2d 2d 53 45 41 52 43 48 20 54 41  N.  `--SEARCH TA
4940: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 54  BLE t2 USING INT
4950: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4960: 20 28 72 6f 77 69 64 3d 3f 29 0a 7d 0a 0a 64 65   (rowid=?).}..de
4970: 74 20 38 2e 31 2e 33 20 22 53 45 4c 45 43 54 20  t 8.1.3 "SELECT 
4980: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
4990: 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e  " {.  QUERY PLAN
49a0: 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45  .  `--SCAN TABLE
49b0: 20 74 32 0a 7d 0a 0a 64 65 74 20 38 2e 32 2e 31   t2.}..det 8.2.1
49c0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
49d0: 74 31 22 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  t1" {.  QUERY PL
49e0: 41 4e 0a 20 20 60 2d 2d 53 43 41 4e 20 54 41 42  AN.  `--SCAN TAB
49f0: 4c 45 20 74 31 0a 7d 0a 0a 64 65 74 20 38 2e 32  LE t1.}..det 8.2
4a00: 2e 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  .2 "SELECT * FRO
4a10: 4d 20 74 31 20 57 48 45 52 45 20 62 3d 3f 22 20  M t1 WHERE b=?" 
4a20: 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  {.  QUERY PLAN. 
4a30: 20 60 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45   `--SEARCH TABLE
4a40: 20 74 31 20 55 53 49 4e 47 20 50 52 49 4d 41 52   t1 USING PRIMAR
4a50: 59 20 4b 45 59 20 28 62 3d 3f 29 0a 7d 0a 0a 64  Y KEY (b=?).}..d
4a60: 65 74 20 38 2e 32 2e 33 20 22 53 45 4c 45 43 54  et 8.2.3 "SELECT
4a70: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
4a80: 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 22 20 7b 0a   b=? AND c=?" {.
4a90: 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 60    QUERY PLAN.  `
4aa0: 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74  --SEARCH TABLE t
4ab0: 31 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20  1 USING PRIMARY 
4ac0: 4b 45 59 20 28 62 3d 3f 20 41 4e 44 20 63 3d 3f  KEY (b=? AND c=?
4ad0: 29 0a 7d 0a 0a 64 65 74 20 38 2e 32 2e 34 20 22  ).}..det 8.2.4 "
4ae0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4af0: 46 52 4f 4d 20 74 31 22 20 7b 0a 20 20 51 55 45  FROM t1" {.  QUE
4b00: 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 53 43 41  RY PLAN.  `--SCA
4b10: 4e 20 54 41 42 4c 45 20 74 31 0a 7d 0a 0a 23 20  N TABLE t1.}..# 
4b20: 32 30 31 38 2d 30 38 2d 31 36 3a 20 20 57 68 69  2018-08-16:  Whi
4b30: 6c 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 46 6f  le working on Fo
4b40: 73 73 69 6c 20 49 20 64 69 73 63 6f 76 65 72 65  ssil I discovere
4b50: 64 20 74 68 61 74 20 45 58 50 4c 41 49 4e 20 51  d that EXPLAIN Q
4b60: 55 45 52 59 20 50 4c 41 4e 0a 23 20 64 69 64 20  UERY PLAN.# did 
4b70: 6e 6f 74 20 64 65 73 63 72 69 62 65 20 49 4e 20  not describe IN 
4b80: 6f 70 65 72 61 74 6f 72 73 20 69 6d 70 6c 65 6d  operators implem
4b90: 65 6e 74 65 64 20 75 73 69 6e 67 20 61 20 52 4f  ented using a RO
4ba0: 57 49 44 20 6c 6f 6f 6b 75 70 2e 20 20 54 68 65  WID lookup.  The
4bb0: 73 65 0a 23 20 74 65 73 74 20 63 61 73 65 73 20  se.# test cases 
4bc0: 65 6e 73 75 72 65 20 74 68 61 74 20 70 72 6f 62  ensure that prob
4bd0: 6c 65 6d 20 61 73 20 62 65 65 6e 20 66 69 78 65  lem as been fixe
4be0: 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d..#.do_execsql_
4bf0: 74 65 73 74 20 39 2e 30 20 7b 0a 20 20 2d 2d 20  test 9.0 {.  -- 
4c00: 53 63 68 65 6d 61 20 66 72 6f 6d 20 46 6f 73 73  Schema from Foss
4c10: 69 6c 20 32 30 31 38 2d 30 38 2d 31 36 0a 20 20  il 2018-08-16.  
4c20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 66 6f 72  CREATE TABLE for
4c30: 75 6d 70 6f 73 74 28 0a 20 20 20 20 66 70 69 64  umpost(.    fpid
4c40: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4c50: 20 4b 45 59 2c 0a 20 20 20 20 66 72 6f 6f 74 20   KEY,.    froot 
4c60: 49 4e 54 2c 0a 20 20 20 20 66 70 72 65 76 20 49  INT,.    fprev I
4c70: 4e 54 2c 0a 20 20 20 20 66 69 72 74 20 49 4e 54  NT,.    firt INT
4c80: 2c 0a 20 20 20 20 66 6d 74 69 6d 65 20 52 45 41  ,.    fmtime REA
4c90: 4c 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20  L.  );.  CREATE 
4ca0: 49 4e 44 45 58 20 66 6f 72 75 6d 74 68 72 65 61  INDEX forumthrea
4cb0: 64 20 4f 4e 20 66 6f 72 75 6d 70 6f 73 74 28 66  d ON forumpost(f
4cc0: 72 6f 6f 74 2c 66 6d 74 69 6d 65 29 3b 0a 20 20  root,fmtime);.  
4cd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 6c 6f  CREATE TABLE blo
4ce0: 62 28 0a 20 20 20 20 72 69 64 20 49 4e 54 45 47  b(.    rid INTEG
4cf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  ER PRIMARY KEY,.
4d00: 20 20 20 20 72 63 76 69 64 20 49 4e 54 45 47 45      rcvid INTEGE
4d10: 52 2c 0a 20 20 20 20 73 69 7a 65 20 49 4e 54 45  R,.    size INTE
4d20: 47 45 52 2c 0a 20 20 20 20 75 75 69 64 20 54 45  GER,.    uuid TE
4d30: 58 54 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  XT UNIQUE NOT NU
4d40: 4c 4c 2c 0a 20 20 20 20 63 6f 6e 74 65 6e 74 20  LL,.    content 
4d50: 42 4c 4f 42 2c 0a 20 20 20 20 43 48 45 43 4b 28  BLOB,.    CHECK(
4d60: 20 6c 65 6e 67 74 68 28 75 75 69 64 29 3e 3d 34   length(uuid)>=4
4d70: 30 20 41 4e 44 20 72 69 64 3e 30 20 29 0a 20 20  0 AND rid>0 ).  
4d80: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
4d90: 45 20 65 76 65 6e 74 28 0a 20 20 20 20 74 79 70  E event(.    typ
4da0: 65 20 54 45 58 54 2c 0a 20 20 20 20 6d 74 69 6d  e TEXT,.    mtim
4db0: 65 20 44 41 54 45 54 49 4d 45 2c 0a 20 20 20 20  e DATETIME,.    
4dc0: 6f 62 6a 69 64 20 49 4e 54 45 47 45 52 20 50 52  objid INTEGER PR
4dd0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 74  IMARY KEY,.    t
4de0: 61 67 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20  agid INTEGER,.  
4df0: 20 20 75 69 64 20 49 4e 54 45 47 45 52 20 52 45    uid INTEGER RE
4e00: 46 45 52 45 4e 43 45 53 20 75 73 65 72 2c 0a 20  FERENCES user,. 
4e10: 20 20 20 62 67 63 6f 6c 6f 72 20 54 45 58 54 2c     bgcolor TEXT,
4e20: 0a 20 20 20 20 65 75 73 65 72 20 54 45 58 54 2c  .    euser TEXT,
4e30: 0a 20 20 20 20 75 73 65 72 20 54 45 58 54 2c 0a  .    user TEXT,.
4e40: 20 20 20 20 65 63 6f 6d 6d 65 6e 74 20 54 45 58      ecomment TEX
4e50: 54 2c 0a 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54  T,.    comment T
4e60: 45 58 54 2c 0a 20 20 20 20 62 72 69 65 66 20 54  EXT,.    brief T
4e70: 45 58 54 2c 0a 20 20 20 20 6f 6d 74 69 6d 65 20  EXT,.    omtime 
4e80: 44 41 54 45 54 49 4d 45 0a 20 20 29 3b 0a 20 20  DATETIME.  );.  
4e90: 43 52 45 41 54 45 20 49 4e 44 45 58 20 65 76 65  CREATE INDEX eve
4ea0: 6e 74 5f 69 31 20 4f 4e 20 65 76 65 6e 74 28 6d  nt_i1 ON event(m
4eb0: 74 69 6d 65 29 3b 0a 20 20 43 52 45 41 54 45 20  time);.  CREATE 
4ec0: 54 41 42 4c 45 20 70 72 69 76 61 74 65 28 72 69  TABLE private(ri
4ed0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
4ee0: 59 20 4b 45 59 29 3b 0a 7d 0a 64 6f 5f 65 71 70  Y KEY);.}.do_eqp
4ef0: 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 57 49  _test 9.1 {.  WI
4f00: 54 48 20 74 68 72 65 61 64 28 61 67 65 2c 64 75  TH thread(age,du
4f10: 72 61 74 69 6f 6e 2c 63 6e 74 2c 72 6f 6f 74 2c  ration,cnt,root,
4f20: 6c 61 73 74 29 20 41 53 20 28 0a 20 20 20 20 53  last) AS (.    S
4f30: 45 4c 45 43 54 0a 20 20 20 20 20 20 6a 75 6c 69  ELECT.      juli
4f40: 61 6e 64 61 79 28 27 6e 6f 77 27 29 20 2d 20 6d  anday('now') - m
4f50: 61 78 28 66 6d 74 69 6d 65 29 20 41 53 20 61 67  ax(fmtime) AS ag
4f60: 65 2c 0a 20 20 20 20 20 20 6d 61 78 28 66 6d 74  e,.      max(fmt
4f70: 69 6d 65 29 20 2d 20 6d 69 6e 28 66 6d 74 69 6d  ime) - min(fmtim
4f80: 65 29 20 41 53 20 64 75 72 61 74 69 6f 6e 2c 0a  e) AS duration,.
4f90: 20 20 20 20 20 20 73 75 6d 28 66 70 72 65 76 20        sum(fprev 
4fa0: 49 53 20 4e 55 4c 4c 29 20 41 53 20 6d 73 67 5f  IS NULL) AS msg_
4fb0: 63 6f 75 6e 74 2c 0a 20 20 20 20 20 20 66 72 6f  count,.      fro
4fc0: 6f 74 2c 0a 20 20 20 20 20 20 28 53 45 4c 45 43  ot,.      (SELEC
4fd0: 54 20 66 70 69 64 20 46 52 4f 4d 20 66 6f 72 75  T fpid FROM foru
4fe0: 6d 70 6f 73 74 0a 20 20 20 20 20 20 20 20 57 48  mpost.        WH
4ff0: 45 52 45 20 66 72 6f 6f 74 3d 78 2e 66 72 6f 6f  ERE froot=x.froo
5000: 74 0a 20 20 20 20 20 20 20 20 20 20 41 4e 44 20  t.          AND 
5010: 66 70 69 64 20 4e 4f 54 20 49 4e 20 70 72 69 76  fpid NOT IN priv
5020: 61 74 65 0a 20 20 20 20 20 20 20 20 4f 52 44 45  ate.        ORDE
5030: 52 20 42 59 20 66 6d 74 69 6d 65 20 44 45 53 43  R BY fmtime DESC
5040: 20 4c 49 4d 49 54 20 31 29 0a 20 20 20 20 46 52   LIMIT 1).    FR
5050: 4f 4d 20 66 6f 72 75 6d 70 6f 73 74 20 41 53 20  OM forumpost AS 
5060: 78 0a 20 20 20 20 57 48 45 52 45 20 66 70 69 64  x.    WHERE fpid
5070: 20 4e 4f 54 20 49 4e 20 70 72 69 76 61 74 65 20   NOT IN private 
5080: 20 2d 2d 2d 20 45 6e 73 75 72 65 20 74 68 69 73   --- Ensure this
5090: 20 74 61 62 6c 65 20 6d 65 6e 74 69 6f 6e 65 64   table mentioned
50a0: 20 69 6e 20 45 51 50 20 6f 75 74 70 75 74 21 0a   in EQP output!.
50b0: 20 20 20 20 47 52 4f 55 50 20 42 59 20 66 72 6f      GROUP BY fro
50c0: 6f 74 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20  ot.    ORDER BY 
50d0: 31 20 4c 49 4d 49 54 20 32 36 20 4f 46 46 53 45  1 LIMIT 26 OFFSE
50e0: 54 20 35 0a 20 20 29 0a 20 20 53 45 4c 45 43 54  T 5.  ).  SELECT
50f0: 0a 20 20 20 20 74 68 72 65 61 64 2e 61 67 65 2c  .    thread.age,
5100: 0a 20 20 20 20 74 68 72 65 61 64 2e 64 75 72 61  .    thread.dura
5110: 74 69 6f 6e 2c 0a 20 20 20 20 74 68 72 65 61 64  tion,.    thread
5120: 2e 63 6e 74 2c 0a 20 20 20 20 62 6c 6f 62 2e 75  .cnt,.    blob.u
5130: 75 69 64 2c 0a 20 20 20 20 73 75 62 73 74 72 28  uid,.    substr(
5140: 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 2c 69 6e  event.comment,in
5150: 73 74 72 28 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e  str(event.commen
5160: 74 2c 27 3a 27 29 2b 31 29 0a 20 20 46 52 4f 4d  t,':')+1).  FROM
5170: 20 74 68 72 65 61 64 2c 20 62 6c 6f 62 2c 20 65   thread, blob, e
5180: 76 65 6e 74 0a 20 20 57 48 45 52 45 20 62 6c 6f  vent.  WHERE blo
5190: 62 2e 72 69 64 3d 74 68 72 65 61 64 2e 6c 61 73  b.rid=thread.las
51a0: 74 0a 20 20 20 20 41 4e 44 20 65 76 65 6e 74 2e  t.    AND event.
51b0: 6f 62 6a 69 64 3d 74 68 72 65 61 64 2e 6c 61 73  objid=thread.las
51c0: 74 0a 20 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  t.  ORDER BY 1;.
51d0: 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c 41 4e  } {.  QUERY PLAN
51e0: 0a 20 20 7c 2d 2d 4d 41 54 45 52 49 41 4c 49 5a  .  |--MATERIALIZ
51f0: 45 20 78 78 78 78 78 78 0a 20 20 7c 20 20 7c 2d  E xxxxxx.  |  |-
5200: 2d 53 43 41 4e 20 54 41 42 4c 45 20 66 6f 72 75  -SCAN TABLE foru
5210: 6d 70 6f 73 74 20 41 53 20 78 20 55 53 49 4e 47  mpost AS x USING
5220: 20 49 4e 44 45 58 20 66 6f 72 75 6d 74 68 72 65   INDEX forumthre
5230: 61 64 0a 20 20 7c 20 20 7c 2d 2d 55 53 49 4e 47  ad.  |  |--USING
5240: 20 52 4f 57 49 44 20 53 45 41 52 43 48 20 4f 4e   ROWID SEARCH ON
5250: 20 54 41 42 4c 45 20 70 72 69 76 61 74 65 20 46   TABLE private F
5260: 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 0a 20  OR IN-OPERATOR. 
5270: 20 7c 20 20 7c 2d 2d 43 4f 52 52 45 4c 41 54 45   |  |--CORRELATE
5280: 44 20 53 43 41 4c 41 52 20 53 55 42 51 55 45 52  D SCALAR SUBQUER
5290: 59 20 78 78 78 78 78 78 0a 20 20 7c 20 20 7c 20  Y xxxxxx.  |  | 
52a0: 20 7c 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45   |--SEARCH TABLE
52b0: 20 66 6f 72 75 6d 70 6f 73 74 20 55 53 49 4e 47   forumpost USING
52c0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
52d0: 66 6f 72 75 6d 74 68 72 65 61 64 20 28 66 72 6f  forumthread (fro
52e0: 6f 74 3d 3f 29 0a 20 20 7c 20 20 7c 20 20 60 2d  ot=?).  |  |  `-
52f0: 2d 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45 41  -USING ROWID SEA
5300: 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 70 72 69  RCH ON TABLE pri
5310: 76 61 74 65 20 46 4f 52 20 49 4e 2d 4f 50 45 52  vate FOR IN-OPER
5320: 41 54 4f 52 0a 20 20 7c 20 20 60 2d 2d 55 53 45  ATOR.  |  `--USE
5330: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
5340: 20 4f 52 44 45 52 20 42 59 0a 20 20 7c 2d 2d 53   ORDER BY.  |--S
5350: 43 41 4e 20 53 55 42 51 55 45 52 59 20 78 78 78  CAN SUBQUERY xxx
5360: 78 78 78 0a 20 20 7c 2d 2d 53 45 41 52 43 48 20  xxx.  |--SEARCH 
5370: 54 41 42 4c 45 20 62 6c 6f 62 20 55 53 49 4e 47  TABLE blob USING
5380: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5390: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 0a 20   KEY (rowid=?). 
53a0: 20 7c 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45   |--SEARCH TABLE
53b0: 20 65 76 65 6e 74 20 55 53 49 4e 47 20 49 4e 54   event USING INT
53c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
53d0: 20 28 72 6f 77 69 64 3d 3f 29 0a 20 20 60 2d 2d   (rowid=?).  `--
53e0: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
53f0: 46 4f 52 20 4f 52 44 45 52 20 42 59 0a 7d 0a 0a  FOR ORDER BY.}..
5400: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.