/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3fe051af50921284189d1970eb653f9fcf5117d2:


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 30 20 30 20 31 20  =2;.} {.  0 0 1 
04a0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
04b0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20   USING INDEX i1 
04c0: 28 61 3d 3f 29 7d 20 0a 20 20 30 20 30 20 31 20  (a=?)} .  0 0 1 
04d0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
04e0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32 20   USING INDEX i2 
04f0: 28 62 3d 3f 29 7d 20 0a 20 20 30 20 31 20 30 20  (b=?)} .  0 1 0 
0500: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d 0a  {SCAN TABLE t2}.
0510: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e  }.do_eqp_test 1.
0520: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
0530: 52 4f 4d 20 74 32 20 43 52 4f 53 53 20 4a 4f 49  ROM t2 CROSS JOI
0540: 4e 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 3d  N t1 WHERE t1.a=
0550: 31 20 4f 52 20 74 31 2e 62 3d 32 3b 0a 7d 20 7b  1 OR t1.b=2;.} {
0560: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
0570: 41 42 4c 45 20 74 32 7d 0a 20 20 30 20 31 20 31  ABLE t2}.  0 1 1
0580: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
0590: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31  1 USING INDEX i1
05a0: 20 28 61 3d 3f 29 7d 20 0a 20 20 30 20 31 20 31   (a=?)} .  0 1 1
05b0: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
05c0: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32  1 USING INDEX i2
05d0: 20 28 62 3d 3f 29 7d 20 0a 7d 0a 64 6f 5f 65 71   (b=?)} .}.do_eq
05e0: 70 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 53  p_test 1.3 {.  S
05f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0600: 4f 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a 20  ORDER BY a.} {. 
0610: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
0620: 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45  LE t1 USING COVE
0630: 52 49 4e 47 20 49 4e 44 45 58 20 69 31 7d 0a 7d  RING INDEX i1}.}
0640: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 34  .do_eqp_test 1.4
0650: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52   {.  SELECT a FR
0660: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 2b  OM t1 ORDER BY +
0670: 61 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  a.} {.  0 0 0 {S
0680: 43 41 4e 20 54 41 42 4c 45 20 74 31 20 55 53 49  CAN TABLE t1 USI
0690: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
06a0: 58 20 69 31 7d 0a 20 20 30 20 30 20 30 20 7b 55  X i1}.  0 0 0 {U
06b0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
06c0: 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d 0a 64  OR ORDER BY}.}.d
06d0: 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 35 20 7b  o_eqp_test 1.5 {
06e0: 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  .  SELECT a FROM
06f0: 20 74 31 20 57 48 45 52 45 20 61 3d 34 0a 7d 20   t1 WHERE a=4.} 
0700: 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43  {.  0 0 0 {SEARC
0710: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
0720: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
0730: 69 31 20 28 61 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65  i1 (a=?)}.}.do_e
0740: 71 70 5f 74 65 73 74 20 31 2e 36 20 7b 0a 20 20  qp_test 1.6 {.  
0750: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0760: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 33  count(*) FROM t3
0770: 20 47 52 4f 55 50 20 42 59 20 61 3b 0a 7d 20 7b   GROUP BY a;.} {
0780: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
0790: 41 42 4c 45 20 74 33 7d 0a 20 20 30 20 30 20 30  ABLE t3}.  0 0 0
07a0: 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   {USE TEMP B-TRE
07b0: 45 20 46 4f 52 20 47 52 4f 55 50 20 42 59 7d 0a  E FOR GROUP BY}.
07c0: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
07d0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 44 49 53  P B-TREE FOR DIS
07e0: 54 49 4e 43 54 7d 0a 7d 0a 0a 64 6f 5f 65 71 70  TINCT}.}..do_eqp
07f0: 5f 74 65 73 74 20 31 2e 37 20 7b 0a 20 20 53 45  _test 1.7 {.  SE
0800: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4a  LECT * FROM t3 J
0810: 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 29 0a 7d  OIN (SELECT 1).}
0820: 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 43 41 4e   {.  0 0 1 {SCAN
0830: 20 53 55 42 51 55 45 52 59 20 31 7d 0a 20 20 30   SUBQUERY 1}.  0
0840: 20 31 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   1 0 {SCAN TABLE
0850: 20 74 33 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65   t3}.}.do_eqp_te
0860: 73 74 20 31 2e 38 20 7b 0a 20 20 53 45 4c 45 43  st 1.8 {.  SELEC
0870: 54 20 2a 20 46 52 4f 4d 20 74 33 20 4a 4f 49 4e  T * FROM t3 JOIN
0880: 20 28 53 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e   (SELECT 1 UNION
0890: 20 53 45 4c 45 43 54 20 32 29 0a 7d 20 7b 0a 20   SELECT 2).} {. 
08a0: 20 31 20 30 20 30 20 7b 43 4f 4d 50 4f 55 4e 44   1 0 0 {COMPOUND
08b0: 20 53 55 42 51 55 45 52 49 45 53 20 32 20 41 4e   SUBQUERIES 2 AN
08c0: 44 20 33 20 55 53 49 4e 47 20 54 45 4d 50 20 42  D 3 USING TEMP B
08d0: 2d 54 52 45 45 20 28 55 4e 49 4f 4e 29 7d 0a 20  -TREE (UNION)}. 
08e0: 20 30 20 30 20 31 20 7b 53 43 41 4e 20 53 55 42   0 0 1 {SCAN SUB
08f0: 51 55 45 52 59 20 31 7d 0a 20 20 30 20 31 20 30  QUERY 1}.  0 1 0
0900: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33 7d   {SCAN TABLE t3}
0910: 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31  .}.do_eqp_test 1
0920: 2e 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .9 {.  SELECT * 
0930: 46 52 4f 4d 20 74 33 20 4a 4f 49 4e 20 28 53 45  FROM t3 JOIN (SE
0940: 4c 45 43 54 20 31 20 45 58 43 45 50 54 20 53 45  LECT 1 EXCEPT SE
0950: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 33 20 4c  LECT a FROM t3 L
0960: 49 4d 49 54 20 31 37 29 0a 7d 20 7b 0a 20 20 33  IMIT 17).} {.  3
0970: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
0980: 20 74 33 7d 0a 20 20 31 20 30 20 30 20 7b 43 4f   t3}.  1 0 0 {CO
0990: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
09a0: 53 20 32 20 41 4e 44 20 33 20 55 53 49 4e 47 20  S 2 AND 3 USING 
09b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 28 45 58 43  TEMP B-TREE (EXC
09c0: 45 50 54 29 7d 0a 20 20 30 20 30 20 31 20 7b 53  EPT)}.  0 0 1 {S
09d0: 43 41 4e 20 53 55 42 51 55 45 52 59 20 31 7d 0a  CAN SUBQUERY 1}.
09e0: 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20 54 41    0 1 0 {SCAN TA
09f0: 42 4c 45 20 74 33 7d 0a 7d 0a 64 6f 5f 65 71 70  BLE t3}.}.do_eqp
0a00: 5f 74 65 73 74 20 31 2e 31 30 20 7b 0a 20 20 53  _test 1.10 {.  S
0a10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
0a20: 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 49  JOIN (SELECT 1 I
0a30: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
0a40: 61 20 46 52 4f 4d 20 74 33 20 4c 49 4d 49 54 20  a FROM t3 LIMIT 
0a50: 31 37 29 0a 7d 20 7b 0a 20 20 33 20 30 20 30 20  17).} {.  3 0 0 
0a60: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33 7d 0a  {SCAN TABLE t3}.
0a70: 20 20 31 20 30 20 30 20 7b 43 4f 4d 50 4f 55 4e    1 0 0 {COMPOUN
0a80: 44 20 53 55 42 51 55 45 52 49 45 53 20 32 20 41  D SUBQUERIES 2 A
0a90: 4e 44 20 33 20 55 53 49 4e 47 20 54 45 4d 50 20  ND 3 USING TEMP 
0aa0: 42 2d 54 52 45 45 20 28 49 4e 54 45 52 53 45 43  B-TREE (INTERSEC
0ab0: 54 29 7d 0a 20 20 30 20 30 20 31 20 7b 53 43 41  T)}.  0 0 1 {SCA
0ac0: 4e 20 53 55 42 51 55 45 52 59 20 31 7d 0a 20 20  N SUBQUERY 1}.  
0ad0: 30 20 31 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 0 {SCAN TABL
0ae0: 45 20 74 33 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f  E t3}.}..do_eqp_
0af0: 74 65 73 74 20 31 2e 31 31 20 7b 0a 20 20 53 45  test 1.11 {.  SE
0b00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4a  LECT * FROM t3 J
0b10: 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 55 4e  OIN (SELECT 1 UN
0b20: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61  ION ALL SELECT a
0b30: 20 46 52 4f 4d 20 74 33 20 4c 49 4d 49 54 20 31   FROM t3 LIMIT 1
0b40: 37 29 0a 7d 20 7b 0a 20 20 33 20 30 20 30 20 7b  7).} {.  3 0 0 {
0b50: 53 43 41 4e 20 54 41 42 4c 45 20 74 33 7d 0a 20  SCAN TABLE t3}. 
0b60: 20 31 20 30 20 30 20 7b 43 4f 4d 50 4f 55 4e 44   1 0 0 {COMPOUND
0b70: 20 53 55 42 51 55 45 52 49 45 53 20 32 20 41 4e   SUBQUERIES 2 AN
0b80: 44 20 33 20 28 55 4e 49 4f 4e 20 41 4c 4c 29 7d  D 3 (UNION ALL)}
0b90: 0a 20 20 30 20 30 20 31 20 7b 53 43 41 4e 20 53  .  0 0 1 {SCAN S
0ba0: 55 42 51 55 45 52 59 20 31 7d 0a 20 20 30 20 31  UBQUERY 1}.  0 1
0bb0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
0bc0: 33 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  3}.}..#---------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 65 71  .# Test cases eq
0c20: 70 2d 32 2e 2a 20 2d 20 74 65 73 74 73 20 66 6f  p-2.* - tests fo
0c30: 72 20 73 69 6e 67 6c 65 20 73 65 6c 65 63 74 20  r single select 
0c40: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23 0a 64 72  statements..#.dr
0c50: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
0c60: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
0c70: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
0c80: 4c 45 20 74 31 28 78 20 49 4e 54 2c 20 79 20 49  LE t1(x INT, y I
0c90: 4e 54 2c 20 65 78 20 54 45 58 54 29 3b 0a 0a 20  NT, ex TEXT);.. 
0ca0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
0cb0: 28 78 20 49 4e 54 2c 20 79 20 49 4e 54 2c 20 65  (x INT, y INT, e
0cc0: 78 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41 54  x TEXT);.  CREAT
0cd0: 45 20 49 4e 44 45 58 20 74 32 69 31 20 4f 4e 20  E INDEX t2i1 ON 
0ce0: 74 32 28 78 29 3b 0a 7d 0a 0a 64 65 74 20 32 2e  t2(x);.}..det 2.
0cf0: 32 2e 31 20 22 53 45 4c 45 43 54 20 44 49 53 54  2.1 "SELECT DIST
0d00: 49 4e 43 54 20 6d 69 6e 28 78 29 2c 20 6d 61 78  INCT min(x), max
0d10: 28 78 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  (x) FROM t1 GROU
0d20: 50 20 42 59 20 78 20 4f 52 44 45 52 20 42 59 20  P BY x ORDER BY 
0d30: 31 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  1" {.  0 0 0 {SC
0d40: 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 20 20 30  AN TABLE t1}.  0
0d50: 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42   0 0 {USE TEMP B
0d60: 2d 54 52 45 45 20 46 4f 52 20 47 52 4f 55 50 20  -TREE FOR GROUP 
0d70: 42 59 7d 0a 20 20 30 20 30 20 30 20 7b 55 53 45  BY}.  0 0 0 {USE
0d80: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
0d90: 20 44 49 53 54 49 4e 43 54 7d 0a 20 20 30 20 30   DISTINCT}.  0 0
0da0: 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54   0 {USE TEMP B-T
0db0: 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59  REE FOR ORDER BY
0dc0: 7d 0a 7d 0a 64 65 74 20 32 2e 32 2e 32 20 22 53  }.}.det 2.2.2 "S
0dd0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6d  ELECT DISTINCT m
0de0: 69 6e 28 78 29 2c 20 6d 61 78 28 78 29 20 46 52  in(x), max(x) FR
0df0: 4f 4d 20 74 32 20 47 52 4f 55 50 20 42 59 20 78  OM t2 GROUP BY x
0e00: 20 4f 52 44 45 52 20 42 59 20 31 22 20 7b 0a 20   ORDER BY 1" {. 
0e10: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
0e20: 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45  LE t2 USING COVE
0e30: 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 7d  RING INDEX t2i1}
0e40: 0a 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45  .  0 0 0 {USE TE
0e50: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 44 49  MP B-TREE FOR DI
0e60: 53 54 49 4e 43 54 7d 0a 20 20 30 20 30 20 30 20  STINCT}.  0 0 0 
0e70: 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  {USE TEMP B-TREE
0e80: 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a 7d   FOR ORDER BY}.}
0e90: 0a 64 65 74 20 32 2e 32 2e 33 20 22 53 45 4c 45  .det 2.2.3 "SELE
0ea0: 43 54 20 44 49 53 54 49 4e 43 54 20 2a 20 46 52  CT DISTINCT * FR
0eb0: 4f 4d 20 74 31 22 20 7b 0a 20 20 30 20 30 20 30  OM t1" {.  0 0 0
0ec0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
0ed0: 0a 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45  .  0 0 0 {USE TE
0ee0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 44 49  MP B-TREE FOR DI
0ef0: 53 54 49 4e 43 54 7d 0a 7d 0a 64 65 74 20 32 2e  STINCT}.}.det 2.
0f00: 32 2e 34 20 22 53 45 4c 45 43 54 20 44 49 53 54  2.4 "SELECT DIST
0f10: 49 4e 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  INCT * FROM t1, 
0f20: 74 32 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  t2" {.  0 0 0 {S
0f30: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 20 20  CAN TABLE t1}.  
0f40: 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 1 {SCAN TABL
0f50: 45 20 74 32 7d 0a 20 20 30 20 30 20 30 20 7b 55  E t2}.  0 0 0 {U
0f60: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
0f70: 4f 52 20 44 49 53 54 49 4e 43 54 7d 0a 7d 0a 64  OR DISTINCT}.}.d
0f80: 65 74 20 32 2e 32 2e 35 20 22 53 45 4c 45 43 54  et 2.2.5 "SELECT
0f90: 20 44 49 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d   DISTINCT * FROM
0fa0: 20 74 31 2c 20 74 32 20 4f 52 44 45 52 20 42 59   t1, t2 ORDER BY
0fb0: 20 74 31 2e 78 22 20 7b 0a 20 20 30 20 30 20 30   t1.x" {.  0 0 0
0fc0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
0fd0: 0a 20 20 30 20 31 20 31 20 7b 53 43 41 4e 20 54  .  0 1 1 {SCAN T
0fe0: 41 42 4c 45 20 74 32 7d 0a 20 20 30 20 30 20 30  ABLE t2}.  0 0 0
0ff0: 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   {USE TEMP B-TRE
1000: 45 20 46 4f 52 20 44 49 53 54 49 4e 43 54 7d 0a  E FOR DISTINCT}.
1010: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
1020: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
1030: 45 52 20 42 59 7d 0a 7d 0a 64 65 74 20 32 2e 32  ER BY}.}.det 2.2
1040: 2e 36 20 22 53 45 4c 45 43 54 20 44 49 53 54 49  .6 "SELECT DISTI
1050: 4e 43 54 20 74 32 2e 78 20 46 52 4f 4d 20 74 31  NCT t2.x FROM t1
1060: 2c 20 74 32 20 4f 52 44 45 52 20 42 59 20 74 32  , t2 ORDER BY t2
1070: 2e 78 22 20 7b 0a 20 20 30 20 30 20 31 20 7b 53  .x" {.  0 0 1 {S
1080: 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49  CAN TABLE t2 USI
1090: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
10a0: 58 20 74 32 69 31 7d 0a 20 20 30 20 31 20 30 20  X t2i1}.  0 1 0 
10b0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a  {SCAN TABLE t1}.
10c0: 7d 0a 0a 64 65 74 20 32 2e 33 2e 31 20 22 53 45  }..det 2.3.1 "SE
10d0: 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
10e0: 20 74 32 22 20 7b 0a 20 20 30 20 30 20 30 20 7b   t2" {.  0 0 0 {
10f0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20  SEARCH TABLE t2 
1100: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
1110: 4e 44 45 58 20 74 32 69 31 7d 0a 7d 0a 64 65 74  NDEX t2i1}.}.det
1120: 20 32 2e 33 2e 32 20 22 53 45 4c 45 43 54 20 6d   2.3.2 "SELECT m
1130: 69 6e 28 78 29 20 46 52 4f 4d 20 74 32 22 20 7b  in(x) FROM t2" {
1140: 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48  .  0 0 0 {SEARCH
1150: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
1160: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74  COVERING INDEX t
1170: 32 69 31 7d 0a 7d 0a 64 65 74 20 32 2e 33 2e 33  2i1}.}.det 2.3.3
1180: 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2c   "SELECT min(x),
1190: 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74 32 22   max(x) FROM t2"
11a0: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
11b0: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
11c0: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74  COVERING INDEX t
11d0: 32 69 31 7d 0a 7d 0a 0a 64 65 74 20 32 2e 34 2e  2i1}.}..det 2.4.
11e0: 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  1 "SELECT * FROM
11f0: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d   t1 WHERE rowid=
1200: 3f 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45  ?" {.  0 0 0 {SE
1210: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
1220: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1230: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
1240: 29 7d 0a 7d 0a 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  )}.}....#-------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
12a0: 65 71 70 2d 33 2e 2a 20 2d 20 74 65 73 74 73 20  eqp-3.* - tests 
12b0: 66 6f 72 20 73 65 6c 65 63 74 20 73 74 61 74 65  for select state
12c0: 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 73  ments that use s
12d0: 75 62 2d 73 65 6c 65 63 74 73 2e 0a 23 0a 64 6f  ub-selects..#.do
12e0: 5f 65 71 70 5f 74 65 73 74 20 33 2e 31 2e 31 20  _eqp_test 3.1.1 
12f0: 7b 0a 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  {.  SELECT (SELE
1300: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 41 53 20  CT x FROM t1 AS 
1310: 73 75 62 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  sub) FROM t1;.} 
1320: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
1330: 54 41 42 4c 45 20 74 31 7d 0a 20 20 30 20 30 20  TABLE t1}.  0 0 
1340: 30 20 7b 45 58 45 43 55 54 45 20 53 43 41 4c 41  0 {EXECUTE SCALA
1350: 52 20 53 55 42 51 55 45 52 59 20 31 7d 0a 20 20  R SUBQUERY 1}.  
1360: 31 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  1 0 0 {SCAN TABL
1370: 45 20 74 31 20 41 53 20 73 75 62 7d 0a 7d 0a 64  E t1 AS sub}.}.d
1380: 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 31 2e 32  o_eqp_test 3.1.2
1390: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
13a0: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 53 45 4c  OM t1 WHERE (SEL
13b0: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 41 53  ECT x FROM t1 AS
13c0: 20 73 75 62 29 3b 0a 7d 20 7b 0a 20 20 30 20 30   sub);.} {.  0 0
13d0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
13e0: 31 7d 0a 20 20 30 20 30 20 30 20 7b 45 58 45 43  1}.  0 0 0 {EXEC
13f0: 55 54 45 20 53 43 41 4c 41 52 20 53 55 42 51 55  UTE SCALAR SUBQU
1400: 45 52 59 20 31 7d 0a 20 20 31 20 30 20 30 20 7b  ERY 1}.  1 0 0 {
1410: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 41 53  SCAN TABLE t1 AS
1420: 20 73 75 62 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74   sub}.}.do_eqp_t
1430: 65 73 74 20 33 2e 31 2e 33 20 7b 0a 20 20 53 45  est 3.1.3 {.  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 28 53 45 4c 45 43 54 20 78 20 46  HERE (SELECT x F
1460: 52 4f 4d 20 74 31 20 41 53 20 73 75 62 20 4f 52  ROM t1 AS sub OR
1470: 44 45 52 20 42 59 20 79 29 3b 0a 7d 20 7b 0a 20  DER BY y);.} {. 
1480: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
1490: 4c 45 20 74 31 7d 0a 20 20 30 20 30 20 30 20 7b  LE t1}.  0 0 0 {
14a0: 45 58 45 43 55 54 45 20 53 43 41 4c 41 52 20 53  EXECUTE SCALAR S
14b0: 55 42 51 55 45 52 59 20 31 7d 0a 20 20 31 20 30  UBQUERY 1}.  1 0
14c0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
14d0: 31 20 41 53 20 73 75 62 7d 0a 20 20 31 20 30 20  1 AS sub}.  1 0 
14e0: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
14f0: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
1500: 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 33  .}.do_eqp_test 3
1510: 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.4 {.  SELECT 
1520: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1530: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
1540: 32 20 4f 52 44 45 52 20 42 59 20 78 29 3b 0a 7d  2 ORDER BY x);.}
1550: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
1560: 20 54 41 42 4c 45 20 74 31 7d 0a 20 20 30 20 30   TABLE t1}.  0 0
1570: 20 30 20 7b 45 58 45 43 55 54 45 20 53 43 41 4c   0 {EXECUTE SCAL
1580: 41 52 20 53 55 42 51 55 45 52 59 20 31 7d 0a 20  AR SUBQUERY 1}. 
1590: 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   1 0 0 {SCAN TAB
15a0: 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45  LE t2 USING COVE
15b0: 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 7d  RING INDEX t2i1}
15c0: 0a 7d 0a 0a 64 65 74 20 33 2e 32 2e 31 20 7b 0a  .}..det 3.2.1 {.
15d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
15e0: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
15f0: 31 20 4f 52 44 45 52 20 42 59 20 78 20 4c 49 4d  1 ORDER BY x LIM
1600: 49 54 20 31 30 29 20 4f 52 44 45 52 20 42 59 20  IT 10) ORDER BY 
1610: 79 20 4c 49 4d 49 54 20 35 0a 7d 20 7b 0a 20 20  y LIMIT 5.} {.  
1620: 31 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  1 0 0 {SCAN TABL
1630: 45 20 74 31 7d 20 0a 20 20 31 20 30 20 30 20 7b  E t1} .  1 0 0 {
1640: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
1650: 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 20 0a 20  FOR ORDER BY} . 
1660: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 53 55 42   0 0 0 {SCAN SUB
1670: 51 55 45 52 59 20 31 7d 20 0a 20 20 30 20 30 20  QUERY 1} .  0 0 
1680: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
1690: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
16a0: 0a 7d 0a 64 65 74 20 33 2e 32 2e 32 20 7b 0a 20  .}.det 3.2.2 {. 
16b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 0a   SELECT * FROM .
16c0: 20 20 20 20 28 53 45 4c 45 43 54 20 2a 20 46 52      (SELECT * FR
16d0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
16e0: 20 4c 49 4d 49 54 20 31 30 29 20 41 53 20 78 31   LIMIT 10) AS x1
16f0: 2c 0a 20 20 20 20 28 53 45 4c 45 43 54 20 2a 20  ,.    (SELECT * 
1700: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
1710: 20 78 20 4c 49 4d 49 54 20 31 30 29 20 41 53 20   x LIMIT 10) AS 
1720: 78 32 0a 20 20 4f 52 44 45 52 20 42 59 20 78 32  x2.  ORDER BY x2
1730: 2e 79 20 4c 49 4d 49 54 20 35 0a 7d 20 7b 0a 20  .y LIMIT 5.} {. 
1740: 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   1 0 0 {SCAN TAB
1750: 4c 45 20 74 31 7d 20 0a 20 20 31 20 30 20 30 20  LE t1} .  1 0 0 
1760: 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  {USE TEMP B-TREE
1770: 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 20 0a   FOR ORDER BY} .
1780: 20 20 32 20 30 20 30 20 7b 53 43 41 4e 20 54 41    2 0 0 {SCAN TA
1790: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44  BLE t2 USING IND
17a0: 45 58 20 74 32 69 31 7d 20 0a 20 20 30 20 30 20  EX t2i1} .  0 0 
17b0: 30 20 7b 53 43 41 4e 20 53 55 42 51 55 45 52 59  0 {SCAN SUBQUERY
17c0: 20 31 20 41 53 20 78 31 7d 20 0a 20 20 30 20 31   1 AS x1} .  0 1
17d0: 20 31 20 7b 53 43 41 4e 20 53 55 42 51 55 45 52   1 {SCAN SUBQUER
17e0: 59 20 32 20 41 53 20 78 32 7d 20 0a 20 20 30 20  Y 2 AS x2} .  0 
17f0: 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d  0 0 {USE TEMP B-
1800: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
1810: 59 7d 0a 7d 0a 0a 64 65 74 20 33 2e 33 2e 31 20  Y}.}..det 3.3.1 
1820: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1830: 4d 20 74 31 20 57 48 45 52 45 20 79 20 49 4e 20  M t1 WHERE y IN 
1840: 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74  (SELECT y FROM t
1850: 32 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  2).} {.  0 0 0 {
1860: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a  SCAN TABLE t1} .
1870: 20 20 30 20 30 20 30 20 7b 45 58 45 43 55 54 45    0 0 0 {EXECUTE
1880: 20 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 31   LIST SUBQUERY 1
1890: 7d 20 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e  } .  1 0 0 {SCAN
18a0: 20 54 41 42 4c 45 20 74 32 7d 0a 7d 0a 64 65 74   TABLE t2}.}.det
18b0: 20 33 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43   3.3.2 {.  SELEC
18c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
18d0: 45 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79  E y IN (SELECT y
18e0: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
18f0: 31 2e 78 21 3d 74 32 2e 78 29 0a 7d 20 7b 0a 20  1.x!=t2.x).} {. 
1900: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
1910: 4c 45 20 74 31 7d 20 0a 20 20 30 20 30 20 30 20  LE t1} .  0 0 0 
1920: 7b 45 58 45 43 55 54 45 20 43 4f 52 52 45 4c 41  {EXECUTE CORRELA
1930: 54 45 44 20 4c 49 53 54 20 53 55 42 51 55 45 52  TED LIST SUBQUER
1940: 59 20 31 7d 20 0a 20 20 31 20 30 20 30 20 7b 53  Y 1} .  1 0 0 {S
1950: 43 41 4e 20 54 41 42 4c 45 20 74 32 7d 0a 7d 0a  CAN TABLE t2}.}.
1960: 64 65 74 20 33 2e 33 2e 33 20 7b 0a 20 20 53 45  det 3.3.3 {.  SE
1970: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1980: 48 45 52 45 20 45 58 49 53 54 53 20 28 53 45 4c  HERE EXISTS (SEL
1990: 45 43 54 20 79 20 46 52 4f 4d 20 74 32 20 57 48  ECT y FROM t2 WH
19a0: 45 52 45 20 74 31 2e 78 21 3d 74 32 2e 78 29 0a  ERE t1.x!=t2.x).
19b0: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41  } {.  0 0 0 {SCA
19c0: 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 30  N TABLE t1} .  0
19d0: 20 30 20 30 20 7b 45 58 45 43 55 54 45 20 43 4f   0 0 {EXECUTE CO
19e0: 52 52 45 4c 41 54 45 44 20 53 43 41 4c 41 52 20  RRELATED SCALAR 
19f0: 53 55 42 51 55 45 52 59 20 31 7d 20 0a 20 20 31  SUBQUERY 1} .  1
1a00: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
1a10: 20 74 32 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   t2}.}..#-------
1a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
1a70: 65 71 70 2d 34 2e 2a 20 2d 20 74 65 73 74 73 20  eqp-4.* - tests 
1a80: 66 6f 72 20 63 6f 6d 70 6f 73 69 74 65 20 73 65  for composite se
1a90: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
1aa0: 0a 23 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 34  .#.do_eqp_test 4
1ab0: 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.1 {.  SELECT 
1ac0: 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  * FROM t1 UNION 
1ad0: 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ALL SELECT * FRO
1ae0: 4d 20 74 32 0a 7d 20 7b 0a 20 20 31 20 30 20 30  M t2.} {.  1 0 0
1af0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
1b00: 20 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e 20   .  2 0 0 {SCAN 
1b10: 54 41 42 4c 45 20 74 32 7d 20 0a 20 20 30 20 30  TABLE t2} .  0 0
1b20: 20 30 20 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42   0 {COMPOUND SUB
1b30: 51 55 45 52 49 45 53 20 31 20 41 4e 44 20 32 20  QUERIES 1 AND 2 
1b40: 28 55 4e 49 4f 4e 20 41 4c 4c 29 7d 20 0a 7d 0a  (UNION ALL)} .}.
1b50: 64 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 31 2e  do_eqp_test 4.1.
1b60: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
1b70: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
1b80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b90: 32 20 4f 52 44 45 52 20 42 59 20 32 0a 7d 20 7b  2 ORDER BY 2.} {
1ba0: 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54  .  1 0 0 {SCAN T
1bb0: 41 42 4c 45 20 74 31 7d 20 0a 20 20 31 20 30 20  ABLE t1} .  1 0 
1bc0: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
1bd0: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
1be0: 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e 20 54  .  2 0 0 {SCAN T
1bf0: 41 42 4c 45 20 74 32 7d 20 0a 20 20 32 20 30 20  ABLE t2} .  2 0 
1c00: 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52  0 {USE TEMP B-TR
1c10: 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d  EE FOR ORDER BY}
1c20: 0a 20 20 30 20 30 20 30 20 7b 43 4f 4d 50 4f 55  .  0 0 0 {COMPOU
1c30: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 31 20  ND SUBQUERIES 1 
1c40: 41 4e 44 20 32 20 28 55 4e 49 4f 4e 20 41 4c 4c  AND 2 (UNION ALL
1c50: 29 7d 20 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73  )} .}.do_eqp_tes
1c60: 74 20 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  t 4.1.3 {.  SELE
1c70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT * FROM t1 UNI
1c80: 4f 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ON SELECT * FROM
1c90: 20 74 32 20 4f 52 44 45 52 20 42 59 20 32 0a 7d   t2 ORDER BY 2.}
1ca0: 20 7b 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e   {.  1 0 0 {SCAN
1cb0: 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 31 20   TABLE t1} .  1 
1cc0: 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d  0 0 {USE TEMP B-
1cd0: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
1ce0: 59 7d 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e  Y}.  2 0 0 {SCAN
1cf0: 20 54 41 42 4c 45 20 74 32 7d 20 0a 20 20 32 20   TABLE t2} .  2 
1d00: 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d  0 0 {USE TEMP B-
1d10: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
1d20: 59 7d 0a 20 20 30 20 30 20 30 20 7b 43 4f 4d 50  Y}.  0 0 0 {COMP
1d30: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
1d40: 31 20 41 4e 44 20 32 20 28 55 4e 49 4f 4e 29 7d  1 AND 2 (UNION)}
1d50: 20 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20   .}.do_eqp_test 
1d60: 34 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.4 {.  SELECT
1d70: 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 54 45 52   * FROM t1 INTER
1d80: 53 45 43 54 20 53 45 4c 45 43 54 20 2a 20 46 52  SECT SELECT * FR
1d90: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 32  OM t2 ORDER BY 2
1da0: 0a 7d 20 7b 0a 20 20 31 20 30 20 30 20 7b 53 43  .} {.  1 0 0 {SC
1db0: 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20  AN TABLE t1} .  
1dc0: 31 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  1 0 0 {USE TEMP 
1dd0: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
1de0: 20 42 59 7d 0a 20 20 32 20 30 20 30 20 7b 53 43   BY}.  2 0 0 {SC
1df0: 41 4e 20 54 41 42 4c 45 20 74 32 7d 20 0a 20 20  AN TABLE t2} .  
1e00: 32 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20  2 0 0 {USE TEMP 
1e10: 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52  B-TREE FOR ORDER
1e20: 20 42 59 7d 0a 20 20 30 20 30 20 30 20 7b 43 4f   BY}.  0 0 0 {CO
1e30: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
1e40: 53 20 31 20 41 4e 44 20 32 20 28 49 4e 54 45 52  S 1 AND 2 (INTER
1e50: 53 45 43 54 29 7d 20 0a 7d 0a 64 6f 5f 65 71 70  SECT)} .}.do_eqp
1e60: 5f 74 65 73 74 20 34 2e 31 2e 35 20 7b 0a 20 20  _test 4.1.5 {.  
1e70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1e80: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2a   EXCEPT SELECT *
1e90: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1ea0: 59 20 32 0a 7d 20 7b 0a 20 20 31 20 30 20 30 20  Y 2.} {.  1 0 0 
1eb0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 20  {SCAN TABLE t1} 
1ec0: 0a 20 20 31 20 30 20 30 20 7b 55 53 45 20 54 45  .  1 0 0 {USE TE
1ed0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52  MP B-TREE FOR OR
1ee0: 44 45 52 20 42 59 7d 0a 20 20 32 20 30 20 30 20  DER BY}.  2 0 0 
1ef0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d 20  {SCAN TABLE t2} 
1f00: 0a 20 20 32 20 30 20 30 20 7b 55 53 45 20 54 45  .  2 0 0 {USE TE
1f10: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52  MP B-TREE FOR OR
1f20: 44 45 52 20 42 59 7d 0a 20 20 30 20 30 20 30 20  DER BY}.  0 0 0 
1f30: 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  {COMPOUND SUBQUE
1f40: 52 49 45 53 20 31 20 41 4e 44 20 32 20 28 45 58  RIES 1 AND 2 (EX
1f50: 43 45 50 54 29 7d 20 0a 7d 0a 0a 64 6f 5f 65 71  CEPT)} .}..do_eq
1f60: 70 5f 74 65 73 74 20 34 2e 32 2e 32 20 7b 0a 20  p_test 4.2.2 {. 
1f70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1f80: 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
1f90: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44  CT * FROM t2 ORD
1fa0: 45 52 20 42 59 20 31 0a 7d 20 7b 0a 20 20 31 20  ER BY 1.} {.  1 
1fb0: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
1fc0: 74 31 7d 20 0a 20 20 31 20 30 20 30 20 7b 55 53  t1} .  1 0 0 {US
1fd0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
1fe0: 52 20 4f 52 44 45 52 20 42 59 7d 0a 20 20 32 20  R ORDER BY}.  2 
1ff0: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
2000: 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t2 USING INDEX t
2010: 32 69 31 7d 20 0a 20 20 30 20 30 20 30 20 7b 43  2i1} .  0 0 0 {C
2020: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
2030: 45 53 20 31 20 41 4e 44 20 32 20 28 55 4e 49 4f  ES 1 AND 2 (UNIO
2040: 4e 20 41 4c 4c 29 7d 20 0a 7d 0a 64 6f 5f 65 71  N ALL)} .}.do_eq
2050: 70 5f 74 65 73 74 20 34 2e 32 2e 33 20 7b 0a 20  p_test 4.2.3 {. 
2060: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2070: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 2a  1 UNION SELECT *
2080: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
2090: 59 20 31 0a 7d 20 7b 0a 20 20 31 20 30 20 30 20  Y 1.} {.  1 0 0 
20a0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 20  {SCAN TABLE t1} 
20b0: 0a 20 20 31 20 30 20 30 20 7b 55 53 45 20 54 45  .  1 0 0 {USE TE
20c0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52  MP B-TREE FOR OR
20d0: 44 45 52 20 42 59 7d 0a 20 20 32 20 30 20 30 20  DER BY}.  2 0 0 
20e0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55  {SCAN TABLE t2 U
20f0: 53 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31 7d  SING INDEX t2i1}
2100: 20 0a 20 20 32 20 30 20 30 20 7b 55 53 45 20 54   .  2 0 0 {USE T
2110: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 52  EMP B-TREE FOR R
2120: 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
2130: 45 52 20 42 59 7d 0a 20 20 30 20 30 20 30 20 7b  ER BY}.  0 0 0 {
2140: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
2150: 49 45 53 20 31 20 41 4e 44 20 32 20 28 55 4e 49  IES 1 AND 2 (UNI
2160: 4f 4e 29 7d 20 0a 7d 0a 64 6f 5f 65 71 70 5f 74  ON)} .}.do_eqp_t
2170: 65 73 74 20 34 2e 32 2e 34 20 7b 0a 20 20 53 45  est 4.2.4 {.  SE
2180: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49  LECT * FROM t1 I
2190: 4e 54 45 52 53 45 43 54 20 53 45 4c 45 43 54 20  NTERSECT SELECT 
21a0: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
21b0: 42 59 20 31 0a 7d 20 7b 0a 20 20 31 20 30 20 30  BY 1.} {.  1 0 0
21c0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
21d0: 20 0a 20 20 31 20 30 20 30 20 7b 55 53 45 20 54   .  1 0 0 {USE T
21e0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f  EMP B-TREE FOR O
21f0: 52 44 45 52 20 42 59 7d 0a 20 20 32 20 30 20 30  RDER BY}.  2 0 0
2200: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20   {SCAN TABLE t2 
2210: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32 69 31  USING INDEX t2i1
2220: 7d 20 0a 20 20 32 20 30 20 30 20 7b 55 53 45 20  } .  2 0 0 {USE 
2230: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
2240: 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52  RIGHT PART OF OR
2250: 44 45 52 20 42 59 7d 0a 20 20 30 20 30 20 30 20  DER BY}.  0 0 0 
2260: 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  {COMPOUND SUBQUE
2270: 52 49 45 53 20 31 20 41 4e 44 20 32 20 28 49 4e  RIES 1 AND 2 (IN
2280: 54 45 52 53 45 43 54 29 7d 20 0a 7d 0a 64 6f 5f  TERSECT)} .}.do_
2290: 65 71 70 5f 74 65 73 74 20 34 2e 32 2e 35 20 7b  eqp_test 4.2.5 {
22a0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
22b0: 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
22c0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T * FROM t2 ORDE
22d0: 52 20 42 59 20 31 0a 7d 20 7b 0a 20 20 31 20 30  R BY 1.} {.  1 0
22e0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
22f0: 31 7d 20 0a 20 20 31 20 30 20 30 20 7b 55 53 45  1} .  1 0 0 {USE
2300: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
2310: 20 4f 52 44 45 52 20 42 59 7d 0a 20 20 32 20 30   ORDER BY}.  2 0
2320: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
2330: 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32  2 USING INDEX t2
2340: 69 31 7d 20 0a 20 20 32 20 30 20 30 20 7b 55 53  i1} .  2 0 0 {US
2350: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
2360: 52 20 52 49 47 48 54 20 50 41 52 54 20 4f 46 20  R RIGHT PART OF 
2370: 4f 52 44 45 52 20 42 59 7d 0a 20 20 30 20 30 20  ORDER BY}.  0 0 
2380: 30 20 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  0 {COMPOUND SUBQ
2390: 55 45 52 49 45 53 20 31 20 41 4e 44 20 32 20 28  UERIES 1 AND 2 (
23a0: 45 58 43 45 50 54 29 7d 20 0a 7d 0a 0a 64 6f 5f  EXCEPT)} .}..do_
23b0: 65 71 70 5f 74 65 73 74 20 34 2e 33 2e 31 20 7b  eqp_test 4.3.1 {
23c0: 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  .  SELECT x FROM
23d0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
23e0: 20 78 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 0a 20   x FROM t2.} {. 
23f0: 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   1 0 0 {SCAN TAB
2400: 4c 45 20 74 31 7d 20 0a 20 20 32 20 30 20 30 20  LE t1} .  2 0 0 
2410: 7b 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 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2430: 44 45 58 20 74 32 69 31 7d 20 0a 20 20 30 20 30  DEX t2i1} .  0 0
2440: 20 30 20 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42   0 {COMPOUND SUB
2450: 51 55 45 52 49 45 53 20 31 20 41 4e 44 20 32 20  QUERIES 1 AND 2 
2460: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
2470: 45 20 28 55 4e 49 4f 4e 29 7d 20 0a 7d 0a 0a 64  E (UNION)} .}..d
2480: 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 33 2e 32  o_eqp_test 4.3.2
2490: 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52   {.  SELECT x FR
24a0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
24b0: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT x FROM t2 UNI
24c0: 4f 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  ON SELECT x FROM
24d0: 20 74 31 0a 7d 20 7b 0a 20 20 32 20 30 20 30 20   t1.} {.  2 0 0 
24e0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 20  {SCAN TABLE t1} 
24f0: 0a 20 20 33 20 30 20 30 20 7b 53 43 41 4e 20 54  .  3 0 0 {SCAN T
2500: 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 43 4f  ABLE t2 USING CO
2510: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 32 69  VERING INDEX t2i
2520: 31 7d 20 0a 20 20 31 20 30 20 30 20 7b 43 4f 4d  1} .  1 0 0 {COM
2530: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
2540: 20 32 20 41 4e 44 20 33 20 55 53 49 4e 47 20 54   2 AND 3 USING T
2550: 45 4d 50 20 42 2d 54 52 45 45 20 28 55 4e 49 4f  EMP B-TREE (UNIO
2560: 4e 29 7d 0a 20 20 34 20 30 20 30 20 7b 53 43 41  N)}.  4 0 0 {SCA
2570: 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 30  N TABLE t1} .  0
2580: 20 30 20 30 20 7b 43 4f 4d 50 4f 55 4e 44 20 53   0 0 {COMPOUND S
2590: 55 42 51 55 45 52 49 45 53 20 31 20 41 4e 44 20  UBQUERIES 1 AND 
25a0: 34 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  4 USING TEMP B-T
25b0: 52 45 45 20 28 55 4e 49 4f 4e 29 7d 0a 7d 0a 64  REE (UNION)}.}.d
25c0: 6f 5f 65 71 70 5f 74 65 73 74 20 34 2e 33 2e 33  o_eqp_test 4.3.3
25d0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52   {.  SELECT x FR
25e0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
25f0: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT x FROM t2 UNI
2600: 4f 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  ON SELECT x FROM
2610: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 0a 7d   t1 ORDER BY 1.}
2620: 20 7b 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e   {.  2 0 0 {SCAN
2630: 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 32 20   TABLE t1} .  2 
2640: 30 20 30 20 7b 55 53 45 20 54 45 4d 50 20 42 2d  0 0 {USE TEMP B-
2650: 54 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42  TREE FOR ORDER B
2660: 59 7d 20 0a 20 20 33 20 30 20 30 20 7b 53 43 41  Y} .  3 0 0 {SCA
2670: 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47  N TABLE t2 USING
2680: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2690: 74 32 69 31 7d 20 0a 20 20 31 20 30 20 30 20 7b  t2i1} .  1 0 0 {
26a0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
26b0: 49 45 53 20 32 20 41 4e 44 20 33 20 28 55 4e 49  IES 2 AND 3 (UNI
26c0: 4f 4e 29 7d 20 0a 20 20 34 20 30 20 30 20 7b 53  ON)} .  4 0 0 {S
26d0: 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20  CAN TABLE t1} . 
26e0: 20 34 20 30 20 30 20 7b 55 53 45 20 54 45 4d 50   4 0 0 {USE TEMP
26f0: 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44 45   B-TREE FOR ORDE
2700: 52 20 42 59 7d 20 0a 20 20 30 20 30 20 30 20 7b  R BY} .  0 0 0 {
2710: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
2720: 49 45 53 20 31 20 41 4e 44 20 34 20 28 55 4e 49  IES 1 AND 4 (UNI
2730: 4f 4e 29 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ON)}.}..#-------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 0a 23 20 54 68 69 73 20 6e 65 78 74 20 62  --.# This next b
2790: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 76 65  lock of tests ve
27a0: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  rifies that the 
27b0: 65 78 61 6d 70 6c 65 73 20 6f 6e 20 74 68 65 20  examples on the 
27c0: 0a 23 20 6c 61 6e 67 5f 65 78 70 6c 61 69 6e 2e  .# lang_explain.
27d0: 68 74 6d 6c 20 70 61 67 65 20 61 72 65 20 63 6f  html page are co
27e0: 72 72 65 63 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c  rrect..#.drop_al
27f0: 6c 5f 74 61 62 6c 65 73 0a 0a 23 20 45 56 49 44  l_tables..# EVID
2800: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 37 37 39  ENCE-OF: R-47779
2810: 2d 34 37 36 30 35 20 73 71 6c 69 74 65 3e 20 45  -47605 sqlite> E
2820: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2830: 4e 20 53 45 4c 45 43 54 20 61 2c 20 62 0a 23 20  N SELECT a, b.# 
2840: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
2850: 31 3b 0a 23 20 30 7c 30 7c 30 7c 53 43 41 4e 20  1;.# 0|0|0|SCAN 
2860: 54 41 42 4c 45 20 74 31 0a 23 0a 64 6f 5f 65 78  TABLE t1.#.do_ex
2870: 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 31 2e 30  ecsql_test 5.1.0
2880: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
2890: 74 31 28 61 20 49 4e 54 2c 20 62 20 49 4e 54 2c  t1(a INT, b INT,
28a0: 20 65 78 20 54 45 58 54 29 20 7d 0a 64 65 74 20   ex TEXT) }.det 
28b0: 35 2e 31 2e 31 20 22 53 45 4c 45 43 54 20 61 2c  5.1.1 "SELECT a,
28c0: 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
28d0: 20 61 3d 31 22 20 7b 0a 20 20 30 20 30 20 30 20   a=1" {.  0 0 0 
28e0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a  {SCAN TABLE t1}.
28f0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
2900: 3a 20 52 2d 35 35 38 35 32 2d 31 37 35 39 39 20  : R-55852-17599 
2910: 73 71 6c 69 74 65 3e 20 43 52 45 41 54 45 20 49  sqlite> CREATE I
2920: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
2930: 3b 0a 23 20 73 71 6c 69 74 65 3e 20 45 58 50 4c  ;.# sqlite> EXPL
2940: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
2950: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2960: 74 31 20 57 48 45 52 45 20 61 3d 31 3b 0a 23 20  t1 WHERE a=1;.# 
2970: 30 7c 30 7c 30 7c 53 45 41 52 43 48 20 54 41 42  0|0|0|SEARCH TAB
2980: 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45  LE t1 USING INDE
2990: 58 20 69 31 0a 23 0a 64 6f 5f 65 78 65 63 73 71  X i1.#.do_execsq
29a0: 6c 5f 74 65 73 74 20 35 2e 32 2e 30 20 7b 20 43  l_test 5.2.0 { C
29b0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
29c0: 4e 20 74 31 28 61 29 20 7d 0a 64 65 74 20 35 2e  N t1(a) }.det 5.
29d0: 32 2e 31 20 22 53 45 4c 45 43 54 20 61 2c 20 62  2.1 "SELECT a, b
29e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
29f0: 3d 31 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  =1" {.  0 0 0 {S
2a00: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
2a10: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61  SING INDEX i1 (a
2a20: 3d 3f 29 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  =?)}.}..# EVIDEN
2a30: 43 45 2d 4f 46 3a 20 52 2d 32 31 31 37 39 2d 31  CE-OF: R-21179-1
2a40: 31 30 31 31 20 73 71 6c 69 74 65 3e 20 43 52 45  1011 sqlite> CRE
2a50: 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
2a60: 74 31 28 61 2c 20 62 29 3b 0a 23 20 73 71 6c 69  t1(a, b);.# sqli
2a70: 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  te> EXPLAIN QUER
2a80: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 61 2c  Y PLAN SELECT a,
2a90: 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
2aa0: 20 61 3d 31 3b 0a 23 20 30 7c 30 7c 30 7c 53 45   a=1;.# 0|0|0|SE
2ab0: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
2ac0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2ad0: 45 58 20 69 32 20 28 61 3d 3f 29 0a 23 0a 64 6f  EX i2 (a=?).#.do
2ae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
2af0: 33 2e 30 20 7b 20 43 52 45 41 54 45 20 49 4e 44  3.0 { CREATE IND
2b00: 45 58 20 69 32 20 4f 4e 20 74 31 28 61 2c 20 62  EX i2 ON t1(a, b
2b10: 29 20 7d 0a 64 65 74 20 35 2e 33 2e 31 20 22 53  ) }.det 5.3.1 "S
2b20: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
2b30: 74 31 20 57 48 45 52 45 20 61 3d 31 22 20 7b 0a  t1 WHERE a=1" {.
2b40: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
2b50: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43  TABLE t1 USING C
2b60: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32  OVERING INDEX i2
2b70: 20 28 61 3d 3f 29 7d 0a 7d 0a 0a 23 20 45 56 49   (a=?)}.}..# EVI
2b80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 39 39  DENCE-OF: R-0999
2b90: 31 2d 34 38 39 34 31 20 73 71 6c 69 74 65 3e 20  1-48941 sqlite> 
2ba0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2bb0: 41 4e 0a 23 20 53 45 4c 45 43 54 20 74 31 2e 2a  AN.# SELECT t1.*
2bc0: 2c 20 74 32 2e 2a 20 46 52 4f 4d 20 74 31 2c 20  , t2.* FROM t1, 
2bd0: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 31 20  t2 WHERE t1.a=1 
2be0: 41 4e 44 20 74 31 2e 62 3e 32 3b 0a 23 20 30 7c  AND t1.b>2;.# 0|
2bf0: 30 7c 30 7c 53 45 41 52 43 48 20 54 41 42 4c 45  0|0|SEARCH TABLE
2c00: 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49   t1 USING COVERI
2c10: 4e 47 20 49 4e 44 45 58 20 69 32 20 28 61 3d 3f  NG INDEX i2 (a=?
2c20: 20 41 4e 44 20 62 3e 3f 29 0a 23 20 30 7c 31 7c   AND b>?).# 0|1|
2c30: 31 7c 53 43 41 4e 20 54 41 42 4c 45 20 74 32 0a  1|SCAN TABLE t2.
2c40: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
2c50: 74 20 35 2e 34 2e 30 20 7b 43 52 45 41 54 45 20  t 5.4.0 {CREATE 
2c60: 54 41 42 4c 45 20 74 32 28 63 20 49 4e 54 2c 20  TABLE t2(c INT, 
2c70: 64 20 49 4e 54 2c 20 65 78 20 54 45 58 54 29 7d  d INT, ex TEXT)}
2c80: 0a 64 65 74 20 35 2e 34 2e 31 20 22 53 45 4c 45  .det 5.4.1 "SELE
2c90: 43 54 20 74 31 2e 61 2c 20 74 32 2e 63 20 46 52  CT t1.a, t2.c FR
2ca0: 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
2cb0: 74 31 2e 61 3d 31 20 41 4e 44 20 74 31 2e 62 3e  t1.a=1 AND t1.b>
2cc0: 32 22 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45  2" {.  0 0 0 {SE
2cd0: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
2ce0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2cf0: 45 58 20 69 32 20 28 61 3d 3f 20 41 4e 44 20 62  EX i2 (a=? AND b
2d00: 3e 3f 29 7d 0a 20 20 30 20 31 20 31 20 7b 53 43  >?)}.  0 1 1 {SC
2d10: 41 4e 20 54 41 42 4c 45 20 74 32 7d 0a 7d 0a 0a  AN TABLE t2}.}..
2d20: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2d30: 2d 33 33 36 32 36 2d 36 31 30 38 35 20 73 71 6c  -33626-61085 sql
2d40: 69 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45  ite> EXPLAIN QUE
2d50: 52 59 20 50 4c 41 4e 0a 23 20 53 45 4c 45 43 54  RY PLAN.# SELECT
2d60: 20 74 31 2e 2a 2c 20 74 32 2e 2a 20 46 52 4f 4d   t1.*, t2.* FROM
2d70: 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
2d80: 2e 61 3d 31 20 41 4e 44 20 74 31 2e 62 3e 32 3b  .a=1 AND t1.b>2;
2d90: 0a 23 20 30 7c 30 7c 31 7c 53 45 41 52 43 48 20  .# 0|0|1|SEARCH 
2da0: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43  TABLE t1 USING C
2db0: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 32  OVERING INDEX i2
2dc0: 20 28 61 3d 3f 20 41 4e 44 20 62 3e 3f 29 0a 23   (a=? AND b>?).#
2dd0: 20 30 7c 31 7c 30 7c 53 43 41 4e 20 54 41 42 4c   0|1|0|SCAN TABL
2de0: 45 20 74 32 0a 23 0a 64 65 74 20 35 2e 35 20 22  E t2.#.det 5.5 "
2df0: 53 45 4c 45 43 54 20 74 31 2e 61 2c 20 74 32 2e  SELECT t1.a, t2.
2e00: 63 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48  c FROM t2, t1 WH
2e10: 45 52 45 20 74 31 2e 61 3d 31 20 41 4e 44 20 74  ERE t1.a=1 AND t
2e20: 31 2e 62 3e 32 22 20 7b 0a 20 20 30 20 30 20 31  1.b>2" {.  0 0 1
2e30: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
2e40: 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  1 USING COVERING
2e50: 20 49 4e 44 45 58 20 69 32 20 28 61 3d 3f 20 41   INDEX i2 (a=? A
2e60: 4e 44 20 62 3e 3f 29 7d 0a 20 20 30 20 31 20 30  ND b>?)}.  0 1 0
2e70: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d   {SCAN TABLE t2}
2e80: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
2e90: 46 3a 20 52 2d 30 34 30 30 32 2d 32 35 36 35 34  F: R-04002-25654
2ea0: 20 73 71 6c 69 74 65 3e 20 43 52 45 41 54 45 20   sqlite> CREATE 
2eb0: 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 62  INDEX i3 ON t1(b
2ec0: 29 3b 0a 23 20 73 71 6c 69 74 65 3e 20 45 58 50  );.# sqlite> EXP
2ed0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2ee0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2ef0: 20 57 48 45 52 45 20 61 3d 31 20 4f 52 20 62 3d   WHERE a=1 OR b=
2f00: 32 3b 0a 23 20 30 7c 30 7c 30 7c 53 45 41 52 43  2;.# 0|0|0|SEARC
2f10: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
2f20: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2f30: 69 32 20 28 61 3d 3f 29 0a 23 20 30 7c 30 7c 30  i2 (a=?).# 0|0|0
2f40: 7c 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  |SEARCH TABLE t1
2f50: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 33 20   USING INDEX i3 
2f60: 28 62 3d 3f 29 0a 23 0a 64 6f 5f 65 78 65 63 73  (b=?).#.do_execs
2f70: 71 6c 5f 74 65 73 74 20 35 2e 35 2e 30 20 7b 43  ql_test 5.5.0 {C
2f80: 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
2f90: 4e 20 74 31 28 62 29 7d 0a 64 65 74 20 35 2e 36  N t1(b)}.det 5.6
2fa0: 2e 31 20 22 53 45 4c 45 43 54 20 61 2c 20 62 20  .1 "SELECT a, b 
2fb0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
2fc0: 31 20 4f 52 20 62 3d 32 22 20 7b 0a 20 20 30 20  1 OR b=2" {.  0 
2fd0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
2fe0: 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52  E t1 USING COVER
2ff0: 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 61 3d  ING INDEX i2 (a=
3000: 3f 29 7d 0a 20 20 30 20 30 20 30 20 7b 53 45 41  ?)}.  0 0 0 {SEA
3010: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
3020: 4e 47 20 49 4e 44 45 58 20 69 33 20 28 62 3d 3f  NG INDEX i3 (b=?
3030: 29 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  )}.}..# EVIDENCE
3040: 2d 4f 46 3a 20 52 2d 32 34 35 37 37 2d 33 38 38  -OF: R-24577-388
3050: 39 31 20 73 71 6c 69 74 65 3e 20 45 58 50 4c 41  91 sqlite> EXPLA
3060: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 23 20  IN QUERY PLAN.# 
3070: 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d  SELECT c, d FROM
3080: 20 74 32 20 4f 52 44 45 52 20 42 59 20 63 3b 0a   t2 ORDER BY c;.
3090: 23 20 30 7c 30 7c 30 7c 53 43 41 4e 20 54 41 42  # 0|0|0|SCAN TAB
30a0: 4c 45 20 74 32 0a 23 20 30 7c 30 7c 30 7c 55 53  LE t2.# 0|0|0|US
30b0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
30c0: 52 20 4f 52 44 45 52 20 42 59 0a 23 0a 64 65 74  R ORDER BY.#.det
30d0: 20 35 2e 37 20 22 53 45 4c 45 43 54 20 63 2c 20   5.7 "SELECT c, 
30e0: 64 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  d FROM t2 ORDER 
30f0: 42 59 20 63 22 20 7b 0a 20 20 30 20 30 20 30 20  BY c" {.  0 0 0 
3100: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d 0a  {SCAN TABLE t2}.
3110: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
3120: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
3130: 45 52 20 42 59 7d 0a 7d 0a 0a 23 20 45 56 49 44  ER BY}.}..# EVID
3140: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 31 35 37  ENCE-OF: R-58157
3150: 2d 31 32 33 35 35 20 73 71 6c 69 74 65 3e 20 43  -12355 sqlite> C
3160: 52 45 41 54 45 20 49 4e 44 45 58 20 69 34 20 4f  REATE INDEX i4 O
3170: 4e 20 74 32 28 63 29 3b 0a 23 20 73 71 6c 69 74  N t2(c);.# sqlit
3180: 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  e> EXPLAIN QUERY
3190: 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 63 2c 20   PLAN SELECT c, 
31a0: 64 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  d FROM t2 ORDER 
31b0: 42 59 20 63 3b 0a 23 20 30 7c 30 7c 30 7c 53 43  BY c;.# 0|0|0|SC
31c0: 41 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  AN TABLE t2 USIN
31d0: 47 20 49 4e 44 45 58 20 69 34 0a 23 0a 64 6f 5f  G INDEX i4.#.do_
31e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 38  execsql_test 5.8
31f0: 2e 30 20 7b 43 52 45 41 54 45 20 49 4e 44 45 58  .0 {CREATE INDEX
3200: 20 69 34 20 4f 4e 20 74 32 28 63 29 7d 0a 64 65   i4 ON t2(c)}.de
3210: 74 20 35 2e 38 2e 31 20 22 53 45 4c 45 43 54 20  t 5.8.1 "SELECT 
3220: 63 2c 20 64 20 46 52 4f 4d 20 74 32 20 4f 52 44  c, d FROM t2 ORD
3230: 45 52 20 42 59 20 63 22 20 7b 0a 20 20 30 20 30  ER BY c" {.  0 0
3240: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
3250: 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 34  2 USING INDEX i4
3260: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
3270: 4f 46 3a 20 52 2d 31 33 39 33 31 2d 31 30 34 32  OF: R-13931-1042
3280: 31 20 73 71 6c 69 74 65 3e 20 45 58 50 4c 41 49  1 sqlite> EXPLAI
3290: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
32a0: 45 43 54 0a 23 20 28 53 45 4c 45 43 54 20 62 20  ECT.# (SELECT b 
32b0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
32c0: 30 29 2c 20 28 53 45 4c 45 43 54 20 61 20 46 52  0), (SELECT a FR
32d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d 74 32  OM t1 WHERE b=t2
32e0: 2e 63 29 20 46 52 4f 4d 20 74 32 3b 0a 23 20 30  .c) FROM t2;.# 0
32f0: 7c 30 7c 30 7c 53 43 41 4e 20 54 41 42 4c 45 20  |0|0|SCAN TABLE 
3300: 74 32 0a 23 20 30 7c 30 7c 30 7c 45 58 45 43 55  t2.# 0|0|0|EXECU
3310: 54 45 20 53 43 41 4c 41 52 20 53 55 42 51 55 45  TE SCALAR SUBQUE
3320: 52 59 20 31 0a 23 20 31 7c 30 7c 30 7c 53 45 41  RY 1.# 1|0|0|SEA
3330: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
3340: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
3350: 58 20 69 32 20 28 61 3d 3f 29 0a 23 20 30 7c 30  X i2 (a=?).# 0|0
3360: 7c 30 7c 45 58 45 43 55 54 45 20 43 4f 52 52 45  |0|EXECUTE CORRE
3370: 4c 41 54 45 44 20 53 43 41 4c 41 52 20 53 55 42  LATED SCALAR SUB
3380: 51 55 45 52 59 20 32 0a 23 20 32 7c 30 7c 30 7c  QUERY 2.# 2|0|0|
3390: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
33a0: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 33 20 28  USING INDEX i3 (
33b0: 62 3d 3f 29 0a 23 0a 64 65 74 20 35 2e 39 20 7b  b=?).#.det 5.9 {
33c0: 0a 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43  .  SELECT (SELEC
33d0: 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
33e0: 45 20 61 3d 30 29 2c 20 28 53 45 4c 45 43 54 20  E a=0), (SELECT 
33f0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
3400: 62 3d 74 32 2e 63 29 20 46 52 4f 4d 20 74 32 0a  b=t2.c) FROM t2.
3410: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41  } {.  0 0 0 {SCA
3420: 4e 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47  N TABLE t2 USING
3430: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
3440: 69 34 7d 0a 20 20 30 20 30 20 30 20 7b 45 58 45  i4}.  0 0 0 {EXE
3450: 43 55 54 45 20 53 43 41 4c 41 52 20 53 55 42 51  CUTE SCALAR SUBQ
3460: 55 45 52 59 20 31 7d 0a 20 20 31 20 30 20 30 20  UERY 1}.  1 0 0 
3470: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
3480: 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
3490: 49 4e 44 45 58 20 69 32 20 28 61 3d 3f 29 7d 0a  INDEX i2 (a=?)}.
34a0: 20 20 30 20 30 20 30 20 7b 45 58 45 43 55 54 45    0 0 0 {EXECUTE
34b0: 20 43 4f 52 52 45 4c 41 54 45 44 20 53 43 41 4c   CORRELATED SCAL
34c0: 41 52 20 53 55 42 51 55 45 52 59 20 32 7d 0a 20  AR SUBQUERY 2}. 
34d0: 20 32 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   2 0 0 {SEARCH T
34e0: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e  ABLE t1 USING IN
34f0: 44 45 58 20 69 33 20 28 62 3d 3f 29 7d 0a 7d 0a  DEX i3 (b=?)}.}.
3500: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3510: 52 2d 35 30 38 39 32 2d 34 35 39 34 33 20 73 71  R-50892-45943 sq
3520: 6c 69 74 65 3e 20 45 58 50 4c 41 49 4e 20 51 55  lite> EXPLAIN QU
3530: 45 52 59 20 50 4c 41 4e 0a 23 20 53 45 4c 45 43  ERY PLAN.# SELEC
3540: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3550: 28 53 45 4c 45 43 54 20 6d 61 78 28 62 29 20 41  (SELECT max(b) A
3560: 53 20 78 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  S x FROM t1 GROU
3570: 50 20 42 59 20 61 29 20 47 52 4f 55 50 20 42 59  P BY a) GROUP BY
3580: 20 78 3b 0a 23 20 31 7c 30 7c 30 7c 53 43 41 4e   x;.# 1|0|0|SCAN
3590: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
35a0: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69  COVERING INDEX i
35b0: 32 0a 23 20 30 7c 30 7c 30 7c 53 43 41 4e 20 53  2.# 0|0|0|SCAN S
35c0: 55 42 51 55 45 52 59 20 31 0a 23 20 30 7c 30 7c  UBQUERY 1.# 0|0|
35d0: 30 7c 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45  0|USE TEMP B-TRE
35e0: 45 20 46 4f 52 20 47 52 4f 55 50 20 42 59 0a 23  E FOR GROUP BY.#
35f0: 0a 64 65 74 20 35 2e 31 30 20 7b 0a 20 20 53 45  .det 5.10 {.  SE
3600: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3610: 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 62  OM (SELECT max(b
3620: 29 20 41 53 20 78 20 46 52 4f 4d 20 74 31 20 47  ) AS x FROM t1 G
3630: 52 4f 55 50 20 42 59 20 61 29 20 47 52 4f 55 50  ROUP BY a) GROUP
3640: 20 42 59 20 78 0a 7d 20 7b 0a 20 20 31 20 30 20   BY x.} {.  1 0 
3650: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
3660: 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
3670: 49 4e 44 45 58 20 69 32 7d 0a 20 20 30 20 30 20  INDEX i2}.  0 0 
3680: 30 20 7b 53 43 41 4e 20 53 55 42 51 55 45 52 59  0 {SCAN SUBQUERY
3690: 20 31 7d 0a 20 20 30 20 30 20 30 20 7b 55 53 45   1}.  0 0 0 {USE
36a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
36b0: 20 47 52 4f 55 50 20 42 59 7d 0a 7d 0a 0a 23 20   GROUP BY}.}..# 
36c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
36d0: 36 32 31 39 2d 33 33 38 34 36 20 73 71 6c 69 74  6219-33846 sqlit
36e0: 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  e> EXPLAIN QUERY
36f0: 20 50 4c 41 4e 0a 23 20 53 45 4c 45 43 54 20 2a   PLAN.# SELECT *
3700: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2a 20   FROM (SELECT * 
3710: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 63 3d  FROM t2 WHERE c=
3720: 31 29 2c 20 74 31 3b 0a 23 20 30 7c 30 7c 30 7c  1), t1;.# 0|0|0|
3730: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20  SEARCH TABLE t2 
3740: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 34 20 28  USING INDEX i4 (
3750: 63 3d 3f 29 0a 23 20 30 7c 31 7c 31 7c 53 43 41  c=?).# 0|1|1|SCA
3760: 4e 20 54 41 42 4c 45 20 74 31 0a 23 0a 64 65 74  N TABLE t1.#.det
3770: 20 35 2e 31 31 20 22 53 45 4c 45 43 54 20 61 2c   5.11 "SELECT a,
3780: 20 62 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   b FROM (SELECT 
3790: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
37a0: 63 3d 31 29 2c 20 74 31 22 20 7b 0a 20 20 30 20  c=1), t1" {.  0 
37b0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
37c0: 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58  E t2 USING INDEX
37d0: 20 69 34 20 28 63 3d 3f 29 7d 0a 20 20 30 20 31   i4 (c=?)}.  0 1
37e0: 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   1 {SCAN TABLE t
37f0: 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  1 USING COVERING
3800: 20 49 4e 44 45 58 20 69 32 7d 0a 7d 0a 0a 23 20   INDEX i2}.}..# 
3810: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
3820: 37 38 37 39 2d 33 39 39 38 37 20 73 71 6c 69 74  7879-39987 sqlit
3830: 65 3e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  e> EXPLAIN QUERY
3840: 20 50 4c 41 4e 0a 23 20 53 45 4c 45 43 54 20 61   PLAN.# SELECT a
3850: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
3860: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 32 3b  ELECT c FROM t2;
3870: 0a 23 20 31 7c 30 7c 30 7c 53 43 41 4e 20 54 41  .# 1|0|0|SCAN TA
3880: 42 4c 45 20 74 31 0a 23 20 32 7c 30 7c 30 7c 53  BLE t1.# 2|0|0|S
3890: 43 41 4e 20 54 41 42 4c 45 20 74 32 0a 23 20 30  CAN TABLE t2.# 0
38a0: 7c 30 7c 30 7c 43 4f 4d 50 4f 55 4e 44 20 53 55  |0|0|COMPOUND SU
38b0: 42 51 55 45 52 49 45 53 20 31 20 41 4e 44 20 32  BQUERIES 1 AND 2
38c0: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
38d0: 45 45 20 28 55 4e 49 4f 4e 29 0a 23 0a 64 65 74  EE (UNION).#.det
38e0: 20 35 2e 31 32 20 22 53 45 4c 45 43 54 20 61 2c   5.12 "SELECT a,
38f0: 62 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  b FROM t1 UNION 
3900: 53 45 4c 45 43 54 20 63 2c 20 39 39 20 46 52 4f  SELECT c, 99 FRO
3910: 4d 20 74 32 22 20 7b 0a 20 20 31 20 30 20 30 20  M t2" {.  1 0 0 
3920: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 55  {SCAN TABLE t1 U
3930: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
3940: 44 45 58 20 69 32 7d 0a 20 20 32 20 30 20 30 20  DEX i2}.  2 0 0 
3950: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 55  {SCAN TABLE t2 U
3960: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
3970: 44 45 58 20 69 34 7d 0a 20 20 30 20 30 20 30 20  DEX i4}.  0 0 0 
3980: 7b 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  {COMPOUND SUBQUE
3990: 52 49 45 53 20 31 20 41 4e 44 20 32 20 55 53 49  RIES 1 AND 2 USI
39a0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
39b0: 55 4e 49 4f 4e 29 7d 0a 7d 0a 0a 23 20 45 56 49  UNION)}.}..# EVI
39c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 36  DENCE-OF: R-4486
39d0: 34 2d 36 33 30 31 31 20 73 71 6c 69 74 65 3e 20  4-63011 sqlite> 
39e0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
39f0: 41 4e 0a 23 20 53 45 4c 45 43 54 20 61 20 46 52  AN.# SELECT a FR
3a00: 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
3a10: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 4f 52  ECT d FROM t2 OR
3a20: 44 45 52 20 42 59 20 31 3b 0a 23 20 31 7c 30 7c  DER BY 1;.# 1|0|
3a30: 30 7c 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20  0|SCAN TABLE t1 
3a40: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
3a50: 4e 44 45 58 20 69 32 0a 23 20 32 7c 30 7c 30 7c  NDEX i2.# 2|0|0|
3a60: 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 32 7c  SCAN TABLE t2 2|
3a70: 30 7c 30 7c 55 53 45 20 54 45 4d 50 20 42 2d 54  0|0|USE TEMP B-T
3a80: 52 45 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59  REE FOR ORDER BY
3a90: 0a 23 20 30 7c 30 7c 30 7c 43 4f 4d 50 4f 55 4e  .# 0|0|0|COMPOUN
3aa0: 44 20 53 55 42 51 55 45 52 49 45 53 20 31 20 41  D SUBQUERIES 1 A
3ab0: 4e 44 20 32 20 28 45 58 43 45 50 54 29 0a 23 0a  ND 2 (EXCEPT).#.
3ac0: 64 65 74 20 35 2e 31 33 20 22 53 45 4c 45 43 54  det 5.13 "SELECT
3ad0: 20 61 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50   a FROM t1 EXCEP
3ae0: 54 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20  T SELECT d FROM 
3af0: 74 32 20 4f 52 44 45 52 20 42 59 20 31 22 20 7b  t2 ORDER BY 1" {
3b00: 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54  .  1 0 0 {SCAN T
3b10: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f  ABLE t1 USING CO
3b20: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 31 7d  VERING INDEX i1}
3b30: 0a 20 20 32 20 30 20 30 20 7b 53 43 41 4e 20 54  .  2 0 0 {SCAN T
3b40: 41 42 4c 45 20 74 32 7d 0a 20 20 32 20 30 20 30  ABLE t2}.  2 0 0
3b50: 20 7b 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   {USE TEMP B-TRE
3b60: 45 20 46 4f 52 20 4f 52 44 45 52 20 42 59 7d 0a  E FOR ORDER BY}.
3b70: 20 20 30 20 30 20 30 20 7b 43 4f 4d 50 4f 55 4e    0 0 0 {COMPOUN
3b80: 44 20 53 55 42 51 55 45 52 49 45 53 20 31 20 41  D SUBQUERIES 1 A
3b90: 4e 44 20 32 20 28 45 58 43 45 50 54 29 7d 0a 7d  ND 2 (EXCEPT)}.}
3ba0: 0a 0a 0a 69 66 20 7b 21 5b 6e 6f 6e 7a 65 72 6f  ...if {![nonzero
3bb0: 5f 72 65 73 65 72 76 65 64 5f 62 79 74 65 73 5d  _reserved_bytes]
3bc0: 7d 20 7b 0a 20 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {.  #---------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 0a 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .  # The followi
3c20: 6e 67 20 74 65 73 74 73 20 2d 20 65 71 70 2d 36  ng tests - eqp-6
3c30: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 74  .* - test that t
3c40: 68 65 20 65 78 61 6d 70 6c 65 20 43 20 63 6f 64  he example C cod
3c50: 65 20 6f 6e 20 0a 20 20 23 20 64 6f 63 75 6d 65  e on .  # docume
3c60: 6e 74 61 74 69 6f 6e 20 70 61 67 65 20 65 71 70  ntation page eqp
3c70: 2e 68 74 6d 6c 20 77 6f 72 6b 73 2e 20 54 68 65  .html works. The
3c80: 20 43 20 63 6f 64 65 20 69 73 20 64 75 70 6c 69   C code is dupli
3c90: 63 61 74 65 64 20 69 6e 20 74 65 73 74 31 2e 63  cated in test1.c
3ca0: 0a 20 20 23 20 61 6e 64 20 77 72 61 70 70 65 64  .  # and wrapped
3cb0: 20 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20   in Tcl command 
3cc0: 5b 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71  [print_explain_q
3cd0: 75 65 72 79 5f 70 6c 61 6e 5d 20 0a 20 20 23 0a  uery_plan] .  #.
3ce0: 20 20 73 65 74 20 62 6f 69 6c 65 72 70 6c 61 74    set boilerplat
3cf0: 65 20 7b 0a 20 20 20 20 70 72 6f 63 20 65 78 70  e {.    proc exp
3d00: 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 20  lain_query_plan 
3d10: 7b 64 62 20 73 71 6c 7d 20 7b 0a 20 20 20 20 20  {db sql} {.     
3d20: 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74   set stmt [sqlit
3d30: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62  e3_prepare_v2 db
3d40: 20 24 73 71 6c 20 2d 31 20 44 55 4d 4d 59 5d 0a   $sql -1 DUMMY].
3d50: 20 20 20 20 20 20 70 72 69 6e 74 5f 65 78 70 6c        print_expl
3d60: 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 20 24  ain_query_plan $
3d70: 73 74 6d 74 0a 20 20 20 20 20 20 73 71 6c 69 74  stmt.      sqlit
3d80: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d  e3_finalize $stm
3d90: 74 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  t.    }.    sqli
3da0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
3db0: 20 20 20 65 78 70 6c 61 69 6e 5f 71 75 65 72 79     explain_query
3dc0: 5f 70 6c 61 6e 20 64 62 20 7b 25 53 51 4c 25 7d  _plan db {%SQL%}
3dd0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
3de0: 20 20 65 78 69 74 0a 20 20 7d 0a 20 20 0a 20 20    exit.  }.  .  
3df0: 23 20 44 6f 20 61 20 22 50 72 69 6e 74 20 45 78  # Do a "Print Ex
3e00: 70 6c 61 69 6e 20 51 75 65 72 79 20 50 6c 61 6e  plain Query Plan
3e10: 22 20 74 65 73 74 2e 0a 20 20 70 72 6f 63 20 64  " test..  proc d
3e20: 6f 5f 70 65 71 70 5f 74 65 73 74 20 7b 74 6e 20  o_peqp_test {tn 
3e30: 73 71 6c 20 72 65 73 7d 20 7b 0a 20 20 20 20 73  sql res} {.    s
3e40: 65 74 20 66 64 20 5b 6f 70 65 6e 20 73 63 72 69  et fd [open scri
3e50: 70 74 2e 74 63 6c 20 77 5d 0a 20 20 20 20 70 75  pt.tcl w].    pu
3e60: 74 73 20 24 66 64 20 5b 73 74 72 69 6e 67 20 6d  ts $fd [string m
3e70: 61 70 20 5b 6c 69 73 74 20 25 53 51 4c 25 20 24  ap [list %SQL% $
3e80: 73 71 6c 5d 20 24 3a 3a 62 6f 69 6c 65 72 70 6c  sql] $::boilerpl
3e90: 61 74 65 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24  ate].    close $
3ea0: 66 64 0a 20 20 0a 20 20 20 20 75 70 6c 65 76 65  fd.  .    upleve
3eb0: 6c 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 5b 6c  l do_test $tn [l
3ec0: 69 73 74 20 7b 0a 20 20 20 20 20 20 73 65 74 20  ist {.      set 
3ed0: 66 64 20 5b 6f 70 65 6e 20 22 7c 5b 69 6e 66 6f  fd [open "|[info
3ee0: 20 6e 61 6d 65 6f 66 65 78 65 63 5d 20 73 63 72   nameofexec] scr
3ef0: 69 70 74 2e 74 63 6c 22 5d 0a 20 20 20 20 20 20  ipt.tcl"].      
3f00: 73 65 74 20 64 61 74 61 20 5b 72 65 61 64 20 24  set data [read $
3f10: 66 64 5d 0a 20 20 20 20 20 20 63 6c 6f 73 65 20  fd].      close 
3f20: 24 66 64 0a 20 20 20 20 20 20 73 65 74 20 64 61  $fd.      set da
3f30: 74 61 0a 20 20 20 20 7d 5d 20 5b 6c 69 73 74 20  ta.    }] [list 
3f40: 24 72 65 73 5d 0a 20 20 7d 0a 20 20 0a 20 20 64  $res].  }.  .  d
3f50: 6f 5f 70 65 71 70 5f 74 65 73 74 20 36 2e 31 20  o_peqp_test 6.1 
3f60: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20  {.    SELECT a, 
3f70: 62 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  b FROM t1 EXCEPT
3f80: 20 53 45 4c 45 43 54 20 64 2c 20 39 39 20 46 52   SELECT d, 99 FR
3f90: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31  OM t2 ORDER BY 1
3fa0: 0a 20 20 7d 20 5b 73 74 72 69 6e 67 20 74 72 69  .  } [string tri
3fb0: 6d 6c 65 66 74 20 7b 0a 31 20 30 20 30 20 53 43  mleft {.1 0 0 SC
3fc0: 41 4e 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AN TABLE t1 USIN
3fd0: 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
3fe0: 20 69 32 0a 32 20 30 20 30 20 53 43 41 4e 20 54   i2.2 0 0 SCAN T
3ff0: 41 42 4c 45 20 74 32 0a 32 20 30 20 30 20 55 53  ABLE t2.2 0 0 US
4000: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
4010: 52 20 4f 52 44 45 52 20 42 59 0a 30 20 30 20 30  R ORDER BY.0 0 0
4020: 20 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45   COMPOUND SUBQUE
4030: 52 49 45 53 20 31 20 41 4e 44 20 32 20 28 45 58  RIES 1 AND 2 (EX
4040: 43 45 50 54 29 0a 7d 5d 0a 7d 0a 0a 23 2d 2d 2d  CEPT).}].}..#---
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
40a0: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 65  lowing tests - e
40b0: 71 70 2d 37 2e 2a 20 2d 20 74 65 73 74 20 74 68  qp-7.* - test th
40c0: 61 74 20 71 75 65 72 69 65 73 20 74 68 61 74 20  at queries that 
40d0: 75 73 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  use the OP_Count
40e0: 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  .# optimization 
40f0: 72 65 74 75 72 6e 20 73 6f 6d 65 74 68 69 6e 67  return something
4100: 20 73 65 6e 73 69 62 6c 65 20 77 69 74 68 20 45   sensible with E
4110: 51 50 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  QP..#.drop_all_t
4120: 61 62 6c 65 73 0a 0a 64 6f 5f 65 78 65 63 73 71  ables..do_execsq
4130: 6c 5f 74 65 73 74 20 37 2e 30 20 7b 0a 20 20 43  l_test 7.0 {.  C
4140: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
4150: 20 49 4e 54 2c 20 62 20 49 4e 54 2c 20 65 78 20   INT, b INT, ex 
4160: 43 48 41 52 28 31 30 30 29 29 3b 0a 20 20 43 52  CHAR(100));.  CR
4170: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
4180: 49 4e 54 2c 20 62 20 49 4e 54 2c 20 65 78 20 43  INT, b INT, ex C
4190: 48 41 52 28 31 30 30 29 29 3b 0a 20 20 43 52 45  HAR(100));.  CRE
41a0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
41b0: 74 32 28 61 29 3b 0a 7d 0a 0a 64 65 74 20 37 2e  t2(a);.}..det 7.
41c0: 31 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  1 "SELECT count(
41d0: 2a 29 20 46 52 4f 4d 20 74 31 22 20 7b 0a 20 20  *) FROM t1" {.  
41e0: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
41f0: 45 20 74 31 7d 0a 7d 0a 0a 64 65 74 20 37 2e 32  E t1}.}..det 7.2
4200: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
4210: 29 20 46 52 4f 4d 20 74 32 22 20 7b 0a 20 20 30  ) FROM t2" {.  0
4220: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
4230: 20 74 32 20 55 53 49 4e 47 20 43 4f 56 45 52 49   t2 USING COVERI
4240: 4e 47 20 49 4e 44 45 58 20 69 31 7d 0a 7d 0a 0a  NG INDEX i1}.}..
4250: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4260: 37 2e 33 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  7.3 {.  INSERT I
4270: 4e 54 4f 20 74 31 28 61 2c 62 29 20 56 41 4c 55  NTO t1(a,b) VALU
4280: 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45  ES(1, 2);.  INSE
4290: 52 54 20 49 4e 54 4f 20 74 31 28 61 2c 62 29 20  RT INTO t1(a,b) 
42a0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 0a 20  VALUES(3, 4);.. 
42b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28   INSERT INTO t2(
42c0: 61 2c 62 29 20 56 41 4c 55 45 53 28 31 2c 20 32  a,b) VALUES(1, 2
42d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
42e0: 20 74 32 28 61 2c 62 29 20 56 41 4c 55 45 53 28   t2(a,b) VALUES(
42f0: 33 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  3, 4);.  INSERT 
4300: 49 4e 54 4f 20 74 32 28 61 2c 62 29 20 56 41 4c  INTO t2(a,b) VAL
4310: 55 45 53 28 35 2c 20 36 29 3b 0a 20 0a 20 20 41  UES(5, 6);. .  A
4320: 4e 41 4c 59 5a 45 3b 0a 7d 0a 0a 64 62 20 63 6c  NALYZE;.}..db cl
4330: 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74  ose.sqlite3 db t
4340: 65 73 74 2e 64 62 0a 0a 64 65 74 20 37 2e 34 20  est.db..det 7.4 
4350: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
4360: 20 46 52 4f 4d 20 74 31 22 20 7b 0a 20 20 30 20   FROM t1" {.  0 
4370: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
4380: 74 31 7d 0a 7d 0a 0a 64 65 74 20 37 2e 35 20 22  t1}.}..det 7.5 "
4390: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
43a0: 46 52 4f 4d 20 74 32 22 20 7b 0a 20 20 30 20 30  FROM t2" {.  0 0
43b0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
43c0: 32 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  2 USING COVERING
43d0: 20 49 4e 44 45 58 20 69 31 7d 0a 7d 0a 0a 23 2d   INDEX i1}.}..#-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
4430: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
4440: 20 65 71 70 2d 38 2e 2a 20 2d 20 74 65 73 74 20   eqp-8.* - test 
4450: 74 68 61 74 20 71 75 65 72 69 65 73 20 74 68 61  that queries tha
4460: 74 20 75 73 65 20 74 68 65 20 4f 50 5f 43 6f 75  t use the OP_Cou
4470: 6e 74 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69 6f  nt.# optimizatio
4480: 6e 20 72 65 74 75 72 6e 20 73 6f 6d 65 74 68 69  n return somethi
4490: 6e 67 20 73 65 6e 73 69 62 6c 65 20 77 69 74 68  ng sensible with
44a0: 20 45 51 50 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c   EQP..#.drop_all
44b0: 5f 74 61 62 6c 65 73 0a 0a 64 6f 5f 65 78 65 63  _tables..do_exec
44c0: 73 71 6c 5f 74 65 73 74 20 38 2e 30 20 7b 0a 20  sql_test 8.0 {. 
44d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
44e0: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
44f0: 59 20 4b 45 59 28 62 2c 20 63 29 29 20 57 49 54  Y KEY(b, c)) WIT
4500: 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43 52  HOUT ROWID;.  CR
4510: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
4520: 20 62 2c 20 63 29 3b 0a 7d 0a 0a 64 65 74 20 38   b, c);.}..det 8
4530: 2e 31 2e 31 20 22 53 45 4c 45 43 54 20 2a 20 46  .1.1 "SELECT * F
4540: 52 4f 4d 20 74 32 22 20 7b 0a 20 20 30 20 30 20  ROM t2" {.  0 0 
4550: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32  0 {SCAN TABLE t2
4560: 7d 0a 7d 0a 0a 64 65 74 20 38 2e 31 2e 32 20 22  }.}..det 8.1.2 "
4570: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
4580: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 20   WHERE rowid=?" 
4590: 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43  {.  0 0 0 {SEARC
45a0: 48 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47  H TABLE t2 USING
45b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
45c0: 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 7d 0a   KEY (rowid=?)}.
45d0: 7d 0a 0a 64 65 74 20 38 2e 31 2e 33 20 22 53 45  }..det 8.1.3 "SE
45e0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
45f0: 4f 4d 20 74 32 22 20 7b 0a 20 20 30 20 30 20 30  OM t2" {.  0 0 0
4600: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d   {SCAN TABLE t2}
4610: 0a 7d 0a 0a 64 65 74 20 38 2e 32 2e 31 20 22 53  .}..det 8.2.1 "S
4620: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
4630: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
4640: 20 54 41 42 4c 45 20 74 31 7d 0a 7d 0a 0a 64 65   TABLE t1}.}..de
4650: 74 20 38 2e 32 2e 32 20 22 53 45 4c 45 43 54 20  t 8.2.2 "SELECT 
4660: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
4670: 62 3d 3f 22 20 7b 0a 20 20 30 20 30 20 30 20 7b  b=?" {.  0 0 0 {
4680: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
4690: 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45  USING PRIMARY KE
46a0: 59 20 28 62 3d 3f 29 7d 0a 7d 0a 0a 64 65 74 20  Y (b=?)}.}..det 
46b0: 38 2e 32 2e 33 20 22 53 45 4c 45 43 54 20 2a 20  8.2.3 "SELECT * 
46c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d  FROM t1 WHERE b=
46d0: 3f 20 41 4e 44 20 63 3d 3f 22 20 7b 0a 20 20 30  ? AND c=?" {.  0
46e0: 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   0 0 {SEARCH TAB
46f0: 4c 45 20 74 31 20 55 53 49 4e 47 20 50 52 49 4d  LE t1 USING PRIM
4700: 41 52 59 20 4b 45 59 20 28 62 3d 3f 20 41 4e 44  ARY KEY (b=? AND
4710: 20 63 3d 3f 29 7d 0a 7d 0a 0a 64 65 74 20 38 2e   c=?)}.}..det 8.
4720: 32 2e 34 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  2.4 "SELECT coun
4730: 74 28 2a 29 20 46 52 4f 4d 20 74 31 22 20 7b 0a  t(*) FROM t1" {.
4740: 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41    0 0 0 {SCAN TA
4750: 42 4c 45 20 74 31 7d 0a 7d 0a 0a 0a 0a 0a 0a 0a  BLE t1}.}.......
4760: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.