/ Hex Artifact Content
Login

Artifact b1fef3046d555836712d4a3a7c8ae8193356c6a15bee59cb3976e4ee98596c97:


0000: 23 20 32 30 31 33 2d 31 31 2d 31 33 0a 23 0a 23  # 2013-11-13.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65  **.#.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74   implements test
0180: 73 20 6f 66 20 74 68 65 20 22 73 6b 69 70 2d 73  s of the "skip-s
0190: 63 61 6e 22 20 71 75 65 72 79 20 73 74 72 61 74  can" query strat
01a0: 65 67 79 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74  egy..#..set test
01b0: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
01c0: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
01d0: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01e0: 2e 74 63 6c 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  .tcl..do_execsql
01f0: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
0200: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
0210: 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 2c 20  ABLE t1(a TEXT, 
0220: 62 20 49 4e 54 2c 20 63 20 49 4e 54 2c 20 64 20  b INT, c INT, d 
0230: 49 4e 54 29 3b 0a 20 20 43 52 45 41 54 45 20 49  INT);.  CREATE I
0240: 4e 44 45 58 20 74 31 61 62 63 20 4f 4e 20 74 31  NDEX t1abc ON t1
0250: 28 61 2c 62 2c 63 29 3b 0a 20 20 49 4e 53 45 52  (a,b,c);.  INSER
0260: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0270: 28 27 61 62 63 27 2c 31 32 33 2c 34 2c 35 29 3b  ('abc',123,4,5);
0280: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0290: 31 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 32  1 VALUES('abc',2
02a0: 33 34 2c 35 2c 36 29 3b 0a 20 20 49 4e 53 45 52  34,5,6);.  INSER
02b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
02c0: 28 27 61 62 63 27 2c 32 33 34 2c 36 2c 37 29 3b  ('abc',234,6,7);
02d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
02e0: 31 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 33  1 VALUES('abc',3
02f0: 34 35 2c 37 2c 38 29 3b 0a 20 20 49 4e 53 45 52  45,7,8);.  INSER
0300: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0310: 28 27 64 65 66 27 2c 35 36 37 2c 38 2c 39 29 3b  ('def',567,8,9);
0320: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0330: 31 20 56 41 4c 55 45 53 28 27 64 65 66 27 2c 33  1 VALUES('def',3
0340: 34 35 2c 39 2c 31 30 29 3b 0a 20 20 49 4e 53 45  45,9,10);.  INSE
0350: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0360: 53 28 27 62 63 64 27 2c 31 30 30 2c 36 2c 31 31  S('bcd',100,6,11
0370: 29 3b 0a 0a 20 20 2f 2a 20 46 61 6b 65 20 74 68  );..  /* Fake th
0380: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
0390: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  able so that the
03a0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 62   query planner b
03b0: 65 6c 69 65 76 65 73 0a 20 20 2a 2a 20 74 68 65  elieves.  ** the
03c0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
03d0: 74 68 6f 75 73 61 6e 64 73 20 6f 66 20 72 6f 77  thousands of row
03e0: 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66  s and that the f
03f0: 69 72 73 74 20 66 65 77 0a 20 20 2a 2a 20 63 6f  irst few.  ** co
0400: 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 73 65  lumns are not se
0410: 6c 65 63 74 69 76 65 2e 20 2a 2f 0a 20 20 41 4e  lective. */.  AN
0420: 41 4c 59 5a 45 3b 0a 20 20 44 45 4c 45 54 45 20  ALYZE;.  DELETE 
0430: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
0440: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
0450: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 56 41   sqlite_stat1 VA
0460: 4c 55 45 53 28 27 74 31 27 2c 27 74 31 61 62 63  LUES('t1','t1abc
0470: 27 2c 27 31 30 30 30 30 20 35 30 30 30 20 32 30  ','10000 5000 20
0480: 30 30 20 31 30 27 29 3b 0a 20 20 41 4e 41 4c 59  00 10');.  ANALY
0490: 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
04a0: 3b 0a 7d 20 7b 7d 0a 0a 23 20 53 69 6d 70 6c 65  ;.} {}..# Simple
04b0: 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6c 65   queries that le
04c0: 61 76 65 20 74 68 65 20 66 69 72 73 74 20 6f 6e  ave the first on
04d0: 65 20 6f 72 20 74 77 6f 20 63 6f 6c 75 6d 6e 73  e or two columns
04e0: 20 6f 66 20 74 68 65 0a 23 20 69 6e 64 65 78 20   of the.# index 
04f0: 75 6e 63 6f 6e 73 74 72 61 69 6e 74 65 64 2e 0a  unconstrainted..
0500: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0510: 74 20 73 6b 69 70 73 63 61 6e 31 2d 31 2e 32 20  t skipscan1-1.2 
0520: 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63  {.  SELECT a,b,c
0530: 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57  ,d,'|' FROM t1 W
0540: 48 45 52 45 20 62 3d 33 34 35 20 4f 52 44 45 52  HERE b=345 ORDER
0550: 20 42 59 20 61 3b 0a 7d 20 7b 61 62 63 20 33 34   BY a;.} {abc 34
0560: 35 20 37 20 38 20 7c 20 64 65 66 20 33 34 35 20  5 7 8 | def 345 
0570: 39 20 31 30 20 7c 7d 0a 64 6f 5f 65 78 65 63 73  9 10 |}.do_execs
0580: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
0590: 31 2d 31 2e 32 65 71 70 20 7b 0a 20 20 45 58 50  1-1.2eqp {.  EXP
05a0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
05b0: 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c 64    SELECT a,b,c,d
05c0: 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57 48 45  ,'|' FROM t1 WHE
05d0: 52 45 20 64 3c 3e 39 39 20 41 4e 44 20 62 3d 33  RE d<>99 AND b=3
05e0: 34 35 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d  45 ORDER BY a;.}
05f0: 20 7b 2f 2a 20 55 53 49 4e 47 20 49 4e 44 45 58   {/* USING INDEX
0600: 20 74 31 61 62 63 20 28 41 4e 59 28 61 29 20 41   t1abc (ANY(a) A
0610: 4e 44 20 62 3d 3f 29 2a 2f 7d 0a 64 6f 5f 65 78  ND b=?)*/}.do_ex
0620: 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73  ecsql_test skips
0630: 63 61 6e 31 2d 31 2e 32 73 6f 72 74 20 7b 0a 20  can1-1.2sort {. 
0640: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0650: 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c 62  LAN.  SELECT a,b
0660: 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31  ,c,d,'|' FROM t1
0670: 20 57 48 45 52 45 20 64 3c 3e 39 39 20 41 4e 44   WHERE d<>99 AND
0680: 20 62 3d 33 34 35 20 4f 52 44 45 52 20 42 59 20   b=345 ORDER BY 
0690: 61 3b 0a 7d 20 7b 7e 2f 2a 4f 52 44 45 52 20 42  a;.} {~/*ORDER B
06a0: 59 2a 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  Y*/}..do_execsql
06b0: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
06c0: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  1.3 {.  SELECT a
06d0: 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20  ,b,c,d,'|' FROM 
06e0: 74 31 20 57 48 45 52 45 20 64 3c 3e 39 39 20 41  t1 WHERE d<>99 A
06f0: 4e 44 20 62 3d 33 34 35 20 4f 52 44 45 52 20 42  ND b=345 ORDER B
0700: 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b 64 65 66  Y a DESC;.} {def
0710: 20 33 34 35 20 39 20 31 30 20 7c 20 61 62 63 20   345 9 10 | abc 
0720: 33 34 35 20 37 20 38 20 7c 7d 0a 64 6f 5f 65 78  345 7 8 |}.do_ex
0730: 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73  ecsql_test skips
0740: 63 61 6e 31 2d 31 2e 33 65 71 70 20 7b 0a 20 20  can1-1.3eqp {.  
0750: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
0760: 41 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c  AN.  SELECT a,b,
0770: 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20  c,d,'|' FROM t1 
0780: 57 48 45 52 45 20 64 3c 3e 39 39 20 41 4e 44 20  WHERE d<>99 AND 
0790: 62 3d 33 34 35 20 4f 52 44 45 52 20 42 59 20 61  b=345 ORDER BY a
07a0: 20 44 45 53 43 3b 0a 7d 20 7b 2f 2a 20 55 53 49   DESC;.} {/* USI
07b0: 4e 47 20 49 4e 44 45 58 20 74 31 61 62 63 20 28  NG INDEX t1abc (
07c0: 41 4e 59 28 61 29 20 41 4e 44 20 62 3d 3f 29 2a  ANY(a) AND b=?)*
07d0: 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  /}.do_execsql_te
07e0: 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31 2e 33  st skipscan1-1.3
07f0: 73 6f 72 74 20 7b 0a 20 20 45 58 50 4c 41 49 4e  sort {.  EXPLAIN
0800: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45   QUERY PLAN.  SE
0810: 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27  LECT a,b,c,d,'|'
0820: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 64   FROM t1 WHERE d
0830: 3c 3e 39 39 20 41 4e 44 20 62 3d 33 34 35 20 4f  <>99 AND b=345 O
0840: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
0850: 7d 20 7b 7e 2f 2a 4f 52 44 45 52 20 42 59 2a 2f  } {~/*ORDER BY*/
0860: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
0870: 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31 2e 34  st skipscan1-1.4
0880: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c   {.  SELECT a,b,
0890: 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20  c,d,'|' FROM t1 
08a0: 57 48 45 52 45 20 63 3d 36 20 4f 52 44 45 52 20  WHERE c=6 ORDER 
08b0: 42 59 20 61 2c 20 62 2c 20 63 3b 0a 7d 20 7b 61  BY a, b, c;.} {a
08c0: 62 63 20 32 33 34 20 36 20 37 20 7c 20 62 63 64  bc 234 6 7 | bcd
08d0: 20 31 30 30 20 36 20 31 31 20 7c 7d 0a 64 6f 5f   100 6 11 |}.do_
08e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69  execsql_test ski
08f0: 70 73 63 61 6e 31 2d 31 2e 34 65 71 70 20 7b 0a  pscan1-1.4eqp {.
0900: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
0910: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c  PLAN.  SELECT a,
0920: 62 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74  b,c,d,'|' FROM t
0930: 31 20 57 48 45 52 45 20 63 3d 36 20 4f 52 44 45  1 WHERE c=6 ORDE
0940: 52 20 42 59 20 61 2c 20 62 2c 20 63 3b 0a 7d 20  R BY a, b, c;.} 
0950: 7b 2f 2a 20 55 53 49 4e 47 20 49 4e 44 45 58 20  {/* USING INDEX 
0960: 74 31 61 62 63 20 28 41 4e 59 28 61 29 20 41 4e  t1abc (ANY(a) AN
0970: 44 20 41 4e 59 28 62 29 20 41 4e 44 20 63 3d 3f  D ANY(b) AND c=?
0980: 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  )*/}.do_execsql_
0990: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31  test skipscan1-1
09a0: 2e 34 73 6f 72 74 20 7b 0a 20 20 45 58 50 4c 41  .4sort {.  EXPLA
09b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
09c0: 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27  SELECT a,b,c,d,'
09d0: 7c 27 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  |' FROM t1 WHERE
09e0: 20 63 3d 36 20 4f 52 44 45 52 20 42 59 20 61 2c   c=6 ORDER BY a,
09f0: 20 62 2c 20 63 3b 0a 7d 20 7b 7e 2f 2a 4f 52 44   b, c;.} {~/*ORD
0a00: 45 52 20 42 59 2a 2f 7d 0a 0a 64 6f 5f 65 78 65  ER BY*/}..do_exe
0a10: 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63  csql_test skipsc
0a20: 61 6e 31 2d 31 2e 35 20 7b 0a 20 20 53 45 4c 45  an1-1.5 {.  SELE
0a30: 43 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27 20 46  CT a,b,c,d,'|' F
0a40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63 20 49  ROM t1 WHERE c I
0a50: 4e 20 28 36 2c 37 29 20 4f 52 44 45 52 20 42 59  N (6,7) ORDER BY
0a60: 20 61 2c 20 62 2c 20 63 3b 0a 7d 20 7b 61 62 63   a, b, c;.} {abc
0a70: 20 32 33 34 20 36 20 37 20 7c 20 61 62 63 20 33   234 6 7 | abc 3
0a80: 34 35 20 37 20 38 20 7c 20 62 63 64 20 31 30 30  45 7 8 | bcd 100
0a90: 20 36 20 31 31 20 7c 7d 0a 64 6f 5f 65 78 65 63   6 11 |}.do_exec
0aa0: 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61  sql_test skipsca
0ab0: 6e 31 2d 31 2e 35 65 71 70 20 7b 0a 20 20 45 58  n1-1.5eqp {.  EX
0ac0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0ad0: 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c  .  SELECT a,b,c,
0ae0: 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57 48  d,'|' FROM t1 WH
0af0: 45 52 45 20 63 20 49 4e 20 28 36 2c 37 29 20 4f  ERE c IN (6,7) O
0b00: 52 44 45 52 20 42 59 20 61 2c 20 62 2c 20 63 3b  RDER BY a, b, c;
0b10: 0a 7d 20 7b 2f 2a 20 55 53 49 4e 47 20 49 4e 44  .} {/* USING IND
0b20: 45 58 20 74 31 61 62 63 20 28 41 4e 59 28 61 29  EX t1abc (ANY(a)
0b30: 20 41 4e 44 20 41 4e 59 28 62 29 20 41 4e 44 20   AND ANY(b) AND 
0b40: 63 3d 3f 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73  c=?)*/}.do_execs
0b50: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
0b60: 31 2d 31 2e 35 73 6f 72 74 20 7b 0a 20 20 45 58  1-1.5sort {.  EX
0b70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0b80: 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c  .  SELECT a,b,c,
0b90: 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57 48  d,'|' FROM t1 WH
0ba0: 45 52 45 20 63 20 49 4e 20 28 36 2c 37 29 20 4f  ERE c IN (6,7) O
0bb0: 52 44 45 52 20 42 59 20 61 2c 20 62 2c 20 63 3b  RDER BY a, b, c;
0bc0: 0a 7d 20 7b 7e 2f 2a 4f 52 44 45 52 20 42 59 2a  .} {~/*ORDER BY*
0bd0: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
0be0: 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31 2e  est skipscan1-1.
0bf0: 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 62  6 {.  SELECT a,b
0c00: 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31  ,c,d,'|' FROM t1
0c10: 20 57 48 45 52 45 20 63 20 42 45 54 57 45 45 4e   WHERE c BETWEEN
0c20: 20 36 20 41 4e 44 20 37 20 4f 52 44 45 52 20 42   6 AND 7 ORDER B
0c30: 59 20 61 2c 20 62 2c 20 63 3b 0a 7d 20 7b 61 62  Y a, b, c;.} {ab
0c40: 63 20 32 33 34 20 36 20 37 20 7c 20 61 62 63 20  c 234 6 7 | abc 
0c50: 33 34 35 20 37 20 38 20 7c 20 62 63 64 20 31 30  345 7 8 | bcd 10
0c60: 30 20 36 20 31 31 20 7c 7d 0a 64 6f 5f 65 78 65  0 6 11 |}.do_exe
0c70: 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63  csql_test skipsc
0c80: 61 6e 31 2d 31 2e 36 65 71 70 20 7b 0a 20 20 45  an1-1.6eqp {.  E
0c90: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
0ca0: 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63  N.  SELECT a,b,c
0cb0: 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57  ,d,'|' FROM t1 W
0cc0: 48 45 52 45 20 63 20 42 45 54 57 45 45 4e 20 36  HERE c BETWEEN 6
0cd0: 20 41 4e 44 20 37 20 4f 52 44 45 52 20 42 59 20   AND 7 ORDER BY 
0ce0: 61 2c 20 62 2c 20 63 3b 0a 7d 20 7b 2f 2a 20 55  a, b, c;.} {/* U
0cf0: 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 62 63  SING INDEX t1abc
0d00: 20 28 41 4e 59 28 61 29 20 41 4e 44 20 41 4e 59   (ANY(a) AND ANY
0d10: 28 62 29 20 41 4e 44 20 63 3e 3f 20 41 4e 44 20  (b) AND c>? AND 
0d20: 63 3c 3f 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73  c<?)*/}.do_execs
0d30: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
0d40: 31 2d 31 2e 36 73 6f 72 74 20 7b 0a 20 20 45 58  1-1.6sort {.  EX
0d50: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0d60: 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c  .  SELECT a,b,c,
0d70: 64 2c 27 7c 27 20 46 52 4f 4d 20 74 31 20 57 48  d,'|' FROM t1 WH
0d80: 45 52 45 20 63 20 42 45 54 57 45 45 4e 20 36 20  ERE c BETWEEN 6 
0d90: 41 4e 44 20 37 20 4f 52 44 45 52 20 42 59 20 61  AND 7 ORDER BY a
0da0: 2c 20 62 2c 20 63 3b 0a 7d 20 7b 7e 2f 2a 4f 52  , b, c;.} {~/*OR
0db0: 44 45 52 20 42 59 2a 2f 7d 0a 0a 64 6f 5f 65 78  DER BY*/}..do_ex
0dc0: 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73  ecsql_test skips
0dd0: 63 61 6e 31 2d 31 2e 37 20 7b 0a 20 20 53 45 4c  can1-1.7 {.  SEL
0de0: 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27 20  ECT a,b,c,d,'|' 
0df0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
0e00: 49 4e 20 28 32 33 34 2c 20 33 34 35 29 20 41 4e  IN (234, 345) AN
0e10: 44 20 63 20 42 45 54 57 45 45 4e 20 36 20 41 4e  D c BETWEEN 6 AN
0e20: 44 20 37 0a 20 20 20 4f 52 44 45 52 20 42 59 20  D 7.   ORDER BY 
0e30: 61 2c 20 62 3b 0a 7d 20 7b 61 62 63 20 32 33 34  a, b;.} {abc 234
0e40: 20 36 20 37 20 7c 20 61 62 63 20 33 34 35 20 37   6 7 | abc 345 7
0e50: 20 38 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   8 |}.do_execsql
0e60: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
0e70: 31 2e 37 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  1.7eqp {.  EXPLA
0e80: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
0e90: 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27  SELECT a,b,c,d,'
0ea0: 7c 27 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  |' FROM t1 WHERE
0eb0: 20 62 20 49 4e 20 28 32 33 34 2c 20 33 34 35 29   b IN (234, 345)
0ec0: 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 36   AND c BETWEEN 6
0ed0: 20 41 4e 44 20 37 0a 20 20 20 4f 52 44 45 52 20   AND 7.   ORDER 
0ee0: 42 59 20 61 2c 20 62 3b 0a 7d 20 7b 2f 2a 20 55  BY a, b;.} {/* U
0ef0: 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 62 63  SING INDEX t1abc
0f00: 20 28 41 4e 59 28 61 29 20 41 4e 44 20 62 3d 3f   (ANY(a) AND b=?
0f10: 20 41 4e 44 20 63 3e 3f 20 41 4e 44 20 63 3c 3f   AND c>? AND c<?
0f20: 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  )*/}.do_execsql_
0f30: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31  test skipscan1-1
0f40: 2e 37 73 6f 72 74 20 7b 0a 20 20 45 58 50 4c 41  .7sort {.  EXPLA
0f50: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
0f60: 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27  SELECT a,b,c,d,'
0f70: 7c 27 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  |' FROM t1 WHERE
0f80: 20 62 20 49 4e 20 28 32 33 34 2c 20 33 34 35 29   b IN (234, 345)
0f90: 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 36   AND c BETWEEN 6
0fa0: 20 41 4e 44 20 37 0a 20 20 20 4f 52 44 45 52 20   AND 7.   ORDER 
0fb0: 42 59 20 61 2c 20 62 3b 0a 7d 20 7b 7e 2f 2a 4f  BY a, b;.} {~/*O
0fc0: 52 44 45 52 20 42 59 2a 2f 7d 0a 0a 0a 23 20 4a  RDER BY*/}...# J
0fd0: 6f 69 6e 73 0a 23 0a 64 6f 5f 65 78 65 63 73 71  oins.#.do_execsq
0fe0: 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31  l_test skipscan1
0ff0: 2d 31 2e 35 31 20 7b 0a 20 20 43 52 45 41 54 45  -1.51 {.  CREATE
1000: 20 54 41 42 4c 45 20 74 31 6a 28 78 20 54 45 58   TABLE t1j(x TEX
1010: 54 2c 20 79 20 49 4e 54 45 47 45 52 29 3b 0a 20  T, y INTEGER);. 
1020: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 6a   INSERT INTO t1j
1030: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 31 29   VALUES('one',1)
1040: 2c 28 27 73 69 78 27 2c 36 29 2c 28 27 6e 69 6e  ,('six',6),('nin
1050: 74 79 2d 6e 69 6e 65 27 2c 39 39 29 3b 0a 20 20  ty-nine',99);.  
1060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
1070: 74 65 5f 73 74 61 74 31 20 56 41 4c 55 45 53 28  te_stat1 VALUES(
1080: 27 74 31 6a 27 2c 6e 75 6c 6c 2c 27 33 27 29 3b  't1j',null,'3');
1090: 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  .  ANALYZE sqlit
10a0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45  e_master;.  SELE
10b0: 43 54 20 78 2c 20 61 2c 20 62 2c 20 63 2c 20 64  CT x, a, b, c, d
10c0: 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 6a 2c 20  , '|' FROM t1j, 
10d0: 74 31 20 57 48 45 52 45 20 63 3d 79 20 4f 52 44  t1 WHERE c=y ORD
10e0: 45 52 20 42 59 20 2b 61 3b 0a 7d 20 7b 73 69 78  ER BY +a;.} {six
10f0: 20 61 62 63 20 32 33 34 20 36 20 37 20 7c 20 73   abc 234 6 7 | s
1100: 69 78 20 62 63 64 20 31 30 30 20 36 20 31 31 20  ix bcd 100 6 11 
1110: 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  |}.do_execsql_te
1120: 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 31 2e 35  st skipscan1-1.5
1130: 31 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e  1eqp {.  EXPLAIN
1140: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45   QUERY PLAN.  SE
1150: 4c 45 43 54 20 78 2c 20 61 2c 20 62 2c 20 63 2c  LECT x, a, b, c,
1160: 20 64 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 6a   d, '|' FROM t1j
1170: 2c 20 74 31 20 57 48 45 52 45 20 63 3d 79 20 4f  , t1 WHERE c=y O
1180: 52 44 45 52 20 42 59 20 2b 61 3b 0a 7d 20 7b 2f  RDER BY +a;.} {/
1190: 2a 20 49 4e 44 45 58 20 74 31 61 62 63 20 28 41  * INDEX t1abc (A
11a0: 4e 59 28 61 29 20 41 4e 44 20 41 4e 59 28 62 29  NY(a) AND ANY(b)
11b0: 20 41 4e 44 20 63 3d 3f 29 2a 2f 7d 0a 0a 64 6f   AND c=?)*/}..do
11c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b  _execsql_test sk
11d0: 69 70 73 63 61 6e 31 2d 31 2e 35 32 20 7b 0a 20  ipscan1-1.52 {. 
11e0: 20 53 45 4c 45 43 54 20 78 2c 20 61 2c 20 62 2c   SELECT x, a, b,
11f0: 20 63 2c 20 64 2c 20 27 7c 27 20 46 52 4f 4d 20   c, d, '|' FROM 
1200: 74 31 6a 20 4c 45 46 54 20 4a 4f 49 4e 20 74 31  t1j LEFT JOIN t1
1210: 20 4f 4e 20 63 3d 79 20 4f 52 44 45 52 20 42 59   ON c=y ORDER BY
1220: 20 2b 79 2c 20 2b 61 3b 0a 7d 20 7b 6f 6e 65 20   +y, +a;.} {one 
1230: 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7c 20 73 69  {} {} {} {} | si
1240: 78 20 61 62 63 20 32 33 34 20 36 20 37 20 7c 20  x abc 234 6 7 | 
1250: 73 69 78 20 62 63 64 20 31 30 30 20 36 20 31 31  six bcd 100 6 11
1260: 20 7c 20 6e 69 6e 74 79 2d 6e 69 6e 65 20 7b 7d   | ninty-nine {}
1270: 20 7b 7d 20 7b 7d 20 7b 7d 20 7c 7d 0a 64 6f 5f   {} {} {} |}.do_
1280: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69  execsql_test ski
1290: 70 73 63 61 6e 31 2d 31 2e 35 32 65 71 70 20 7b  pscan1-1.52eqp {
12a0: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
12b0: 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 78   PLAN.  SELECT x
12c0: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 27 7c  , a, b, c, d, '|
12d0: 27 20 46 52 4f 4d 20 74 31 6a 20 4c 45 46 54 20  ' FROM t1j LEFT 
12e0: 4a 4f 49 4e 20 74 31 20 4f 4e 20 63 3d 79 20 4f  JOIN t1 ON c=y O
12f0: 52 44 45 52 20 42 59 20 2b 79 2c 20 2b 61 3b 0a  RDER BY +y, +a;.
1300: 7d 20 7b 2f 2a 20 49 4e 44 45 58 20 74 31 61 62  } {/* INDEX t1ab
1310: 63 20 28 41 4e 59 28 61 29 20 41 4e 44 20 41 4e  c (ANY(a) AND AN
1320: 59 28 62 29 20 41 4e 44 20 63 3d 3f 29 2a 2f 7d  Y(b) AND c=?)*/}
1330: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1340: 74 20 73 6b 69 70 73 63 61 6e 31 2d 32 2e 31 20  t skipscan1-2.1 
1350: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1360: 20 74 32 28 61 20 54 45 58 54 2c 20 62 20 49 4e   t2(a TEXT, b IN
1370: 54 2c 20 63 20 49 4e 54 2c 20 64 20 49 4e 54 2c  T, c INT, d INT,
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1390: 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61     PRIMARY KEY(a
13a0: 2c 62 2c 63 29 29 3b 0a 20 20 49 4e 53 45 52 54  ,b,c));.  INSERT
13b0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
13c0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 0a 20 20 2f 2a  * FROM t1;..  /*
13d0: 20 46 61 6b 65 20 74 68 65 20 73 71 6c 69 74 65   Fake the sqlite
13e0: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 73 6f 20  _stat1 table so 
13f0: 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
1400: 6c 61 6e 6e 65 72 20 62 65 6c 69 65 76 65 73 0a  lanner believes.
1410: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63    ** the table c
1420: 6f 6e 74 61 69 6e 73 20 74 68 6f 75 73 61 6e 64  ontains thousand
1430: 73 20 6f 66 20 72 6f 77 73 20 61 6e 64 20 74 68  s of rows and th
1440: 61 74 20 74 68 65 20 66 69 72 73 74 20 66 65 77  at the first few
1450: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 72  .  ** columns ar
1460: 65 20 6e 6f 74 20 73 65 6c 65 63 74 69 76 65 2e  e not selective.
1470: 20 2a 2f 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20   */.  ANALYZE;. 
1480: 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73   UPDATE sqlite_s
1490: 74 61 74 31 20 53 45 54 20 73 74 61 74 3d 27 31  tat1 SET stat='1
14a0: 30 30 30 30 20 35 30 30 30 20 32 30 30 30 20 31  0000 5000 2000 1
14b0: 30 27 20 57 48 45 52 45 20 69 64 78 20 4e 4f 54  0' WHERE idx NOT
14c0: 20 4e 55 4c 4c 3b 0a 20 20 41 4e 41 4c 59 5a 45   NULL;.  ANALYZE
14d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
14e0: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
14f0: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
1500: 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  2.2 {.  SELECT a
1510: 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20  ,b,c,d,'|' FROM 
1520: 74 32 20 57 48 45 52 45 20 64 3c 3e 39 39 20 41  t2 WHERE d<>99 A
1530: 4e 44 20 62 3d 33 34 35 20 4f 52 44 45 52 20 42  ND b=345 ORDER B
1540: 59 20 61 3b 0a 7d 20 7b 61 62 63 20 33 34 35 20  Y a;.} {abc 345 
1550: 37 20 38 20 7c 20 64 65 66 20 33 34 35 20 39 20  7 8 | def 345 9 
1560: 31 30 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  10 |}.do_execsql
1570: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
1580: 32 2e 32 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  2.2eqp {.  EXPLA
1590: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
15a0: 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27  SELECT a,b,c,d,'
15b0: 7c 27 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  |' FROM t2 WHERE
15c0: 20 64 3c 3e 39 39 20 41 4e 44 20 62 3d 33 34 35   d<>99 AND b=345
15d0: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b   ORDER BY a;.} {
15e0: 2f 2a 20 55 53 49 4e 47 20 49 4e 44 45 58 20 73  /* USING INDEX s
15f0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
1600: 74 32 5f 31 20 28 41 4e 59 28 61 29 20 41 4e 44  t2_1 (ANY(a) AND
1610: 20 62 3d 3f 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63   b=?)*/}.do_exec
1620: 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61  sql_test skipsca
1630: 6e 31 2d 32 2e 32 73 6f 72 74 20 7b 0a 20 20 45  n1-2.2sort {.  E
1640: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1650: 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63  N.  SELECT a,b,c
1660: 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74 32 20 57  ,d,'|' FROM t2 W
1670: 48 45 52 45 20 64 3c 3e 39 39 20 41 4e 44 20 62  HERE d<>99 AND b
1680: 3d 33 34 35 20 4f 52 44 45 52 20 42 59 20 61 3b  =345 ORDER BY a;
1690: 0a 7d 20 7b 7e 2f 2a 4f 52 44 45 52 20 42 59 2a  .} {~/*ORDER BY*
16a0: 2f 7d 0a 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  /}...do_execsql_
16b0: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 33  test skipscan1-3
16c0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
16d0: 42 4c 45 20 74 33 28 61 20 54 45 58 54 2c 20 62  BLE t3(a TEXT, b
16e0: 20 49 4e 54 2c 20 63 20 49 4e 54 2c 20 64 20 49   INT, c INT, d I
16f0: 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT,.            
1700: 20 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45        PRIMARY KE
1710: 59 28 61 2c 62 2c 63 29 29 20 57 49 54 48 4f 55  Y(a,b,c)) WITHOU
1720: 54 20 52 4f 57 49 44 3b 0a 20 20 49 4e 53 45 52  T ROWID;.  INSER
1730: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
1740: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 0a 20 20 2f   * FROM t1;..  /
1750: 2a 20 46 61 6b 65 20 74 68 65 20 73 71 6c 69 74  * Fake the sqlit
1760: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 73 6f  e_stat1 table so
1770: 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
1780: 70 6c 61 6e 6e 65 72 20 62 65 6c 69 65 76 65 73  planner believes
1790: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
17a0: 63 6f 6e 74 61 69 6e 73 20 74 68 6f 75 73 61 6e  contains thousan
17b0: 64 73 20 6f 66 20 72 6f 77 73 20 61 6e 64 20 74  ds of rows and t
17c0: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 65  hat the first fe
17d0: 77 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61  w.  ** columns a
17e0: 72 65 20 6e 6f 74 20 73 65 6c 65 63 74 69 76 65  re not selective
17f0: 2e 20 2a 2f 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a  . */.  ANALYZE;.
1800: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
1810: 73 74 61 74 31 20 53 45 54 20 73 74 61 74 3d 27  stat1 SET stat='
1820: 31 30 30 30 30 20 35 30 30 30 20 32 30 30 30 20  10000 5000 2000 
1830: 31 30 27 20 57 48 45 52 45 20 69 64 78 20 4e 4f  10' WHERE idx NO
1840: 54 20 4e 55 4c 4c 3b 0a 20 20 41 4e 41 4c 59 5a  T NULL;.  ANALYZ
1850: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
1860: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  .} {}..do_execsq
1870: 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31  l_test skipscan1
1880: 2d 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  -3.2 {.  SELECT 
1890: 61 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d  a,b,c,d,'|' FROM
18a0: 20 74 33 20 57 48 45 52 45 20 62 3d 33 34 35 20   t3 WHERE b=345 
18b0: 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 61  ORDER BY a;.} {a
18c0: 62 63 20 33 34 35 20 37 20 38 20 7c 20 64 65 66  bc 345 7 8 | def
18d0: 20 33 34 35 20 39 20 31 30 20 7c 7d 0a 64 6f 5f   345 9 10 |}.do_
18e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69  execsql_test ski
18f0: 70 73 63 61 6e 31 2d 33 2e 32 65 71 70 20 7b 0a  pscan1-3.2eqp {.
1900: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
1910: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 61 2c  PLAN.  SELECT a,
1920: 62 2c 63 2c 64 2c 27 7c 27 20 46 52 4f 4d 20 74  b,c,d,'|' FROM t
1930: 33 20 57 48 45 52 45 20 62 3d 33 34 35 20 4f 52  3 WHERE b=345 OR
1940: 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 2f 2a 20  DER BY a;.} {/* 
1950: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 41 4e 59  PRIMARY KEY (ANY
1960: 28 61 29 20 41 4e 44 20 62 3d 3f 29 2a 2f 7d 0a  (a) AND b=?)*/}.
1970: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1980: 73 6b 69 70 73 63 61 6e 31 2d 33 2e 32 73 6f 72  skipscan1-3.2sor
1990: 74 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  t {.  EXPLAIN QU
19a0: 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43  ERY PLAN.  SELEC
19b0: 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52  T a,b,c,d,'|' FR
19c0: 4f 4d 20 74 33 20 57 48 45 52 45 20 62 3d 33 34  OM t3 WHERE b=34
19d0: 35 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20  5 ORDER BY a;.} 
19e0: 7b 7e 2f 2a 4f 52 44 45 52 20 42 59 2a 2f 7d 0a  {~/*ORDER BY*/}.
19f0: 0a 23 20 54 69 63 6b 65 74 20 35 32 30 30 37 30  .# Ticket 520070
1a00: 65 63 37 66 62 61 61 63 3a 20 41 72 72 61 79 20  ec7fbaac: Array 
1a10: 6f 76 65 72 72 75 6e 20 69 6e 20 74 68 65 20 73  overrun in the s
1a20: 6b 69 70 2d 73 63 61 6e 20 6f 70 74 69 6d 69 7a  kip-scan optimiz
1a30: 61 74 69 6f 6e 0a 23 20 32 30 31 33 2d 31 32 2d  ation.# 2013-12-
1a40: 32 32 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  22.#.do_execsql_
1a50: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 34  test skipscan1-4
1a60: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
1a70: 42 4c 45 20 74 34 28 61 2c 62 2c 63 2c 64 2c 65  BLE t4(a,b,c,d,e
1a80: 2c 66 2c 67 2c 68 2c 69 29 3b 0a 20 20 43 52 45  ,f,g,h,i);.  CRE
1a90: 41 54 45 20 49 4e 44 45 58 20 74 34 61 6c 6c 20  ATE INDEX t4all 
1aa0: 4f 4e 20 74 34 28 61 2c 62 2c 63 2c 64 2c 65 2c  ON t4(a,b,c,d,e,
1ab0: 66 2c 67 2c 68 29 3b 0a 20 20 49 4e 53 45 52 54  f,g,h);.  INSERT
1ac0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
1ad0: 31 2c 32 2c 33 2c 34 2c 35 2c 36 2c 37 2c 38 2c  1,2,3,4,5,6,7,8,
1ae0: 39 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20  9);.  ANALYZE;. 
1af0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c   DELETE FROM sql
1b00: 69 74 65 5f 73 74 61 74 31 3b 0a 20 20 49 4e 53  ite_stat1;.  INS
1b10: 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
1b20: 73 74 61 74 31 20 0a 20 20 20 20 56 41 4c 55 45  stat1 .    VALUE
1b30: 53 28 27 74 34 27 2c 27 74 34 61 6c 6c 27 2c 27  S('t4','t4all','
1b40: 36 35 35 33 36 30 20 31 36 33 38 34 30 20 34 30  655360 163840 40
1b50: 39 36 30 20 31 30 32 34 30 20 32 35 36 30 20 36  960 10240 2560 6
1b60: 34 30 20 31 36 30 20 34 30 20 31 30 27 29 3b 0a  40 160 40 10');.
1b70: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
1b80: 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45 43  _master;.  SELEC
1b90: 54 20 69 20 46 52 4f 4d 20 74 34 20 57 48 45 52  T i FROM t4 WHER
1ba0: 45 20 61 3d 31 3b 0a 20 20 53 45 4c 45 43 54 20  E a=1;.  SELECT 
1bb0: 69 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  i FROM t4 WHERE 
1bc0: 62 3d 32 3b 0a 20 20 53 45 4c 45 43 54 20 69 20  b=2;.  SELECT i 
1bd0: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 63 3d  FROM t4 WHERE c=
1be0: 33 3b 0a 20 20 53 45 4c 45 43 54 20 69 20 46 52  3;.  SELECT i FR
1bf0: 4f 4d 20 74 34 20 57 48 45 52 45 20 64 3d 34 3b  OM t4 WHERE d=4;
1c00: 0a 20 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d  .  SELECT i FROM
1c10: 20 74 34 20 57 48 45 52 45 20 65 3d 35 3b 0a 20   t4 WHERE e=5;. 
1c20: 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 74   SELECT i FROM t
1c30: 34 20 57 48 45 52 45 20 66 3d 36 3b 0a 20 20 53  4 WHERE f=6;.  S
1c40: 45 4c 45 43 54 20 69 20 46 52 4f 4d 20 74 34 20  ELECT i FROM t4 
1c50: 57 48 45 52 45 20 67 3d 37 3b 0a 20 20 53 45 4c  WHERE g=7;.  SEL
1c60: 45 43 54 20 69 20 46 52 4f 4d 20 74 34 20 57 48  ECT i FROM t4 WH
1c70: 45 52 45 20 68 3d 38 3b 0a 7d 20 7b 39 20 39 20  ERE h=8;.} {9 9 
1c80: 39 20 39 20 39 20 39 20 39 20 39 7d 0a 0a 23 20  9 9 9 9 9 9}..# 
1c90: 4d 61 6b 65 20 73 75 72 65 20 73 6b 69 70 2d 73  Make sure skip-s
1ca0: 63 61 6e 20 63 6f 73 74 20 63 6f 6d 70 75 74 61  can cost computa
1cb0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72  tion in the quer
1cc0: 79 20 70 6c 61 6e 6e 65 72 20 74 61 6b 65 73 20  y planner takes 
1cd0: 69 6e 74 6f 0a 23 20 61 63 63 6f 75 6e 74 20 74  into.# account t
1ce0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
1cf0: 20 73 65 65 6b 20 6d 75 73 74 20 6f 63 63 75 72   seek must occur
1d00: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
1d10: 0a 23 0a 23 20 50 72 69 6f 72 20 74 6f 20 32 30  .#.# Prior to 20
1d20: 31 34 2d 30 33 2d 31 30 2c 20 74 68 65 20 63 6f  14-03-10, the co
1d30: 73 74 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  sts were compute
1d40: 64 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 77 68  d incorrectly wh
1d50: 69 63 68 20 77 6f 75 6c 64 0a 23 20 63 61 75 73  ich would.# caus
1d60: 65 20 69 6e 64 65 78 20 74 35 69 32 20 74 6f 20  e index t5i2 to 
1d70: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
1d80: 6f 66 20 74 35 69 31 20 6f 6e 20 74 68 65 20 73  of t5i1 on the s
1d90: 6b 69 70 73 63 61 6e 31 2d 35 2e 33 2e 0a 23 0a  kipscan1-5.3..#.
1da0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1db0: 73 6b 69 70 73 63 61 6e 31 2d 35 2e 31 20 7b 0a  skipscan1-5.1 {.
1dc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1dd0: 35 28 0a 20 20 20 20 69 64 20 49 4e 54 45 47 45  5(.    id INTEGE
1de0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  R PRIMARY KEY,. 
1df0: 20 20 20 6c 6f 63 20 54 45 58 54 2c 0a 20 20 20     loc TEXT,.   
1e00: 20 6c 61 6e 67 20 49 4e 54 45 47 45 52 2c 0a 20   lang INTEGER,. 
1e10: 20 20 20 75 74 79 70 65 20 49 4e 54 45 47 45 52     utype INTEGER
1e20: 2c 0a 20 20 20 20 78 61 20 49 4e 54 45 47 45 52  ,.    xa INTEGER
1e30: 2c 0a 20 20 20 20 78 64 20 49 4e 54 45 47 45 52  ,.    xd INTEGER
1e40: 2c 0a 20 20 20 20 78 68 20 49 4e 54 45 47 45 52  ,.    xh INTEGER
1e50: 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20 49  .  );.  CREATE I
1e60: 4e 44 45 58 20 74 35 69 31 20 6f 6e 20 74 35 28  NDEX t5i1 on t5(
1e70: 6c 6f 63 2c 20 78 68 2c 20 78 61 2c 20 75 74 79  loc, xh, xa, uty
1e80: 70 65 2c 20 6c 61 6e 67 29 3b 0a 20 20 43 52 45  pe, lang);.  CRE
1e90: 41 54 45 20 49 4e 44 45 58 20 74 35 69 32 20 4f  ATE INDEX t5i2 O
1ea0: 4e 20 74 35 28 78 64 2c 6c 6f 63 2c 75 74 79 70  N t5(xd,loc,utyp
1eb0: 65 2c 6c 61 6e 67 29 3b 0a 20 20 45 58 50 4c 41  e,lang);.  EXPLA
1ec0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
1ed0: 20 20 53 45 4c 45 43 54 20 78 68 2c 20 6c 6f 63    SELECT xh, loc
1ee0: 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20 6c   FROM t5 WHERE l
1ef0: 6f 63 20 3e 3d 20 27 4d 27 20 41 4e 44 20 6c 6f  oc >= 'M' AND lo
1f00: 63 20 3c 20 27 4e 27 3b 0a 7d 20 7b 2f 2e 2a 43  c < 'N';.} {/.*C
1f10: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 35  OVERING INDEX t5
1f20: 69 31 20 2e 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73  i1 .*/}.do_execs
1f30: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
1f40: 31 2d 35 2e 32 20 7b 0a 20 20 41 4e 41 4c 59 5a  1-5.2 {.  ANALYZ
1f50: 45 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  E;.  DELETE FROM
1f60: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 3b 0a 20   sqlite_stat1;. 
1f70: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
1f80: 58 49 53 54 53 20 73 71 6c 69 74 65 5f 73 74 61  XISTS sqlite_sta
1f90: 74 34 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  t4;.  DROP TABLE
1fa0: 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 69 74   IF EXISTS sqlit
1fb0: 65 5f 73 74 61 74 33 3b 0a 20 20 49 4e 53 45 52  e_stat3;.  INSER
1fc0: 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74  T INTO sqlite_st
1fd0: 61 74 31 20 56 41 4c 55 45 53 28 27 74 35 27 2c  at1 VALUES('t5',
1fe0: 27 74 35 69 31 27 2c 27 32 37 30 32 39 33 31 20  't5i1','2702931 
1ff0: 33 20 32 20 32 20 32 20 32 27 29 3b 0a 20 20 49  3 2 2 2 2');.  I
2000: 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74  NSERT INTO sqlit
2010: 65 5f 73 74 61 74 31 20 56 41 4c 55 45 53 28 27  e_stat1 VALUES('
2020: 74 35 27 2c 27 74 35 69 32 27 2c 27 32 37 30 32  t5','t5i2','2702
2030: 39 33 31 20 36 38 36 20 32 20 32 20 32 27 29 3b  931 686 2 2 2');
2040: 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  .  ANALYZE sqlit
2050: 65 5f 6d 61 73 74 65 72 3b 0a 7d 20 7b 7d 0a 64  e_master;.} {}.d
2060: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 64 6f  b cache flush.do
2070: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b  _execsql_test sk
2080: 69 70 73 63 61 6e 31 2d 35 2e 33 20 7b 0a 20 20  ipscan1-5.3 {.  
2090: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
20a0: 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 78 68  AN.    SELECT xh
20b0: 2c 20 6c 6f 63 20 46 52 4f 4d 20 74 35 20 57 48  , loc FROM t5 WH
20c0: 45 52 45 20 6c 6f 63 20 3e 3d 20 27 4d 27 20 41  ERE loc >= 'M' A
20d0: 4e 44 20 6c 6f 63 20 3c 20 27 4e 27 3b 0a 7d 20  ND loc < 'N';.} 
20e0: 7b 2f 2e 2a 43 4f 56 45 52 49 4e 47 20 49 4e 44  {/.*COVERING IND
20f0: 45 58 20 74 35 69 31 20 2e 2a 2f 7d 0a 0a 23 20  EX t5i1 .*/}..# 
2100: 54 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20  The column used 
2110: 62 79 20 74 68 65 20 73 6b 69 70 2d 73 63 61 6e  by the skip-scan
2120: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 75 66   needs to be suf
2130: 66 69 63 69 65 6e 74 6c 79 20 73 65 6c 65 63 74  ficiently select
2140: 69 76 65 2e 0a 23 20 53 65 65 20 74 68 65 20 70  ive..# See the p
2150: 72 69 76 61 74 65 20 65 6d 61 69 6c 20 66 72 6f  rivate email fro
2160: 6d 20 41 64 69 20 5a 61 69 6d 69 20 74 6f 20 64  m Adi Zaimi to d
2170: 72 68 40 73 71 6c 69 74 65 2e 6f 72 67 20 6f 6e  rh@sqlite.org on
2180: 20 32 30 31 34 2d 30 39 2d 32 32 2e 0a 23 0a 64   2014-09-22..#.d
2190: 62 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c  b close.forcedel
21a0: 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69  ete test.db.sqli
21b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
21c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73  o_execsql_test s
21d0: 6b 69 70 73 63 61 6e 31 2d 36 2e 31 20 7b 0a 20  kipscan1-6.1 {. 
21e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
21f0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c 67 2c 68  (a,b,c,d,e,f,g,h
2200: 20 76 61 72 63 68 61 72 28 33 30 30 29 29 3b 0a   varchar(300));.
2210: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
2220: 31 61 62 20 4f 4e 20 74 31 28 61 2c 62 29 3b 0a  1ab ON t1(a,b);.
2230: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
2240: 5f 6d 61 73 74 65 72 3b 0a 20 20 2d 2d 20 4f 6e  _master;.  -- On
2250: 6c 79 20 74 77 6f 20 64 69 73 74 69 6e 63 74 20  ly two distinct 
2260: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73  values for the s
2270: 6b 69 70 2d 73 63 61 6e 20 63 6f 6c 75 6d 6e 2e  kip-scan column.
2280: 20 20 53 6b 69 70 2d 73 63 61 6e 20 69 73 20 6e    Skip-scan is n
2290: 6f 74 20 75 73 65 64 2e 0a 20 20 49 4e 53 45 52  ot used..  INSER
22a0: 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74  T INTO sqlite_st
22b0: 61 74 31 20 56 41 4c 55 45 53 28 27 74 31 27 2c  at1 VALUES('t1',
22c0: 27 74 31 61 62 27 2c 27 35 30 30 30 30 30 20 32  't1ab','500000 2
22d0: 35 30 30 30 30 20 31 32 35 30 30 30 27 29 3b 0a  50000 125000');.
22e0: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
22f0: 5f 6d 61 73 74 65 72 3b 0a 20 20 45 58 50 4c 41  _master;.  EXPLA
2300: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
2310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2320: 48 45 52 45 20 62 3d 31 3b 0a 7d 20 7b 7e 2f 41  HERE b=1;.} {~/A
2330: 4e 59 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  NY/}.do_execsql_
2340: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 36  test skipscan1-6
2350: 2e 32 20 7b 0a 20 20 2d 2d 20 46 6f 75 72 20 64  .2 {.  -- Four d
2360: 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 66  istinct values f
2370: 6f 72 20 74 68 65 20 73 6b 69 70 2d 73 63 61 6e  or the skip-scan
2380: 20 63 6f 6c 75 6d 6e 2e 20 20 53 6b 69 70 2d 73   column.  Skip-s
2390: 63 61 6e 20 69 73 20 75 73 65 64 2e 0a 20 20 55  can is used..  U
23a0: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74 61  PDATE sqlite_sta
23b0: 74 31 20 53 45 54 20 73 74 61 74 3d 27 35 30 30  t1 SET stat='500
23c0: 30 30 30 20 32 35 30 30 30 30 20 36 32 35 30 30  000 250000 62500
23d0: 27 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c  ';.  ANALYZE sql
23e0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 45 58  ite_master;.  EX
23f0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2400: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2410: 31 20 57 48 45 52 45 20 62 3d 31 3b 0a 7d 20 7b  1 WHERE b=1;.} {
2420: 2f 41 4e 59 2e 61 2e 20 41 4e 44 20 62 3d 2f 7d  /ANY.a. AND b=/}
2430: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2440: 20 73 6b 69 70 73 63 61 6e 31 2d 36 2e 33 20 7b   skipscan1-6.3 {
2450: 0a 20 20 2d 2d 20 54 77 6f 20 64 69 73 74 69 6e  .  -- Two distin
2460: 63 74 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ct values for th
2470: 65 20 73 6b 69 70 2d 73 63 61 6e 20 63 6f 6c 75  e skip-scan colu
2480: 6d 6e 20 61 67 61 69 6e 2e 20 20 53 6b 69 70 2d  mn again.  Skip-
2490: 73 63 61 6e 20 69 73 20 6e 6f 74 20 75 73 65 64  scan is not used
24a0: 2e 0a 20 20 55 50 44 41 54 45 20 73 71 6c 69 74  ..  UPDATE sqlit
24b0: 65 5f 73 74 61 74 31 20 53 45 54 20 73 74 61 74  e_stat1 SET stat
24c0: 3d 27 35 30 30 30 30 30 20 31 32 35 30 30 30 20  ='500000 125000 
24d0: 36 32 35 30 30 27 3b 0a 20 20 41 4e 41 4c 59 5a  62500';.  ANALYZ
24e0: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
24f0: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
2500: 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20 46   PLAN SELECT * F
2510: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d 31  ROM t1 WHERE b=1
2520: 3b 0a 7d 20 7b 7e 2f 41 4e 59 2f 7d 0a 0a 23 20  ;.} {~/ANY/}..# 
2530: 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  If the sqlite_st
2540: 61 74 31 20 65 6e 74 72 79 20 69 6e 63 6c 75 64  at1 entry includ
2550: 65 73 20 74 68 65 20 22 6e 6f 73 6b 69 70 73 63  es the "noskipsc
2560: 61 6e 22 20 74 6f 6b 65 6e 2c 20 74 68 65 6e 20  an" token, then 
2570: 6e 65 76 65 72 20 75 73 65 0a 23 20 73 6b 69 70  never use.# skip
2580: 73 63 61 6e 20 77 69 74 68 20 74 68 61 74 20 69  scan with that i
2590: 6e 64 65 78 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ndex..#.do_execs
25a0: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
25b0: 31 2d 37 2e 31 20 7b 0a 20 20 55 50 44 41 54 45  1-7.1 {.  UPDATE
25c0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 53 45   sqlite_stat1 SE
25d0: 54 20 73 74 61 74 3d 27 35 30 30 30 30 30 20 31  T stat='500000 1
25e0: 32 35 30 30 30 20 31 20 73 7a 3d 31 30 30 27 3b  25000 1 sz=100';
25f0: 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  .  ANALYZE sqlit
2600: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 45 58 50 4c  e_master;.  EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
2620: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2630: 57 48 45 52 45 20 62 3d 31 3b 0a 7d 20 7b 2f 41  WHERE b=1;.} {/A
2640: 4e 59 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  NY/}.do_execsql_
2650: 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 37  test skipscan1-7
2660: 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20 73 71  .2 {.  UPDATE sq
2670: 6c 69 74 65 5f 73 74 61 74 31 20 53 45 54 20 73  lite_stat1 SET s
2680: 74 61 74 3d 27 35 30 30 30 30 30 20 31 32 35 30  tat='500000 1250
2690: 30 30 20 31 20 6e 6f 73 6b 69 70 73 63 61 6e 20  00 1 noskipscan 
26a0: 73 7a 3d 31 30 30 27 3b 0a 20 20 41 4e 41 4c 59  sz=100';.  ANALY
26b0: 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
26c0: 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ;.  EXPLAIN QUER
26d0: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
26e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d  FROM t1 WHERE b=
26f0: 31 3b 0a 7d 20 7b 7e 2f 41 4e 59 2f 7d 0a 64 6f  1;.} {~/ANY/}.do
2700: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b  _execsql_test sk
2710: 69 70 73 63 61 6e 31 2d 37 2e 33 20 7b 0a 20 20  ipscan1-7.3 {.  
2720: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 73 74  UPDATE sqlite_st
2730: 61 74 31 20 53 45 54 20 73 74 61 74 3d 27 35 30  at1 SET stat='50
2740: 30 30 30 30 20 31 32 35 30 30 30 20 31 20 73 7a  0000 125000 1 sz
2750: 3d 31 30 30 20 6e 6f 73 6b 69 70 73 63 61 6e 27  =100 noskipscan'
2760: 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69  ;.  ANALYZE sqli
2770: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 45 58 50  te_master;.  EXP
2780: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2790: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
27a0: 20 57 48 45 52 45 20 62 3d 31 3b 0a 7d 20 7b 7e   WHERE b=1;.} {~
27b0: 2f 41 4e 59 2f 7d 0a 0a 23 20 54 69 63 6b 65 74  /ANY/}..# Ticket
27c0: 20 38 66 64 33 39 31 31 35 64 38 66 34 36 65 63   8fd39115d8f46ec
27d0: 65 37 30 65 37 64 34 62 33 63 34 38 31 64 31 62  e70e7d4b3c481d1b
27e0: 64 38 36 31 39 34 37 34 36 20 20 32 30 31 35 2d  d86194746  2015-
27f0: 30 37 2d 32 33 0a 23 20 49 6e 63 6f 72 72 65 63  07-23.# Incorrec
2800: 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  t code generated
2810: 20 66 6f 72 20 61 20 73 6b 69 70 73 63 61 6e 20   for a skipscan 
2820: 77 69 74 68 69 6e 20 61 6e 20 4f 52 20 6f 70 74  within an OR opt
2830: 69 6d 69 7a 61 74 69 6f 6e 0a 23 20 6f 6e 20 61  imization.# on a
2840: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2850: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  able..#.do_execs
2860: 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e  ql_test skipscan
2870: 31 2d 38 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54  1-8.1 {.  DROP T
2880: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
2890: 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  1;.  CREATE TABL
28a0: 45 20 74 31 28 78 2c 20 79 2c 20 50 52 49 4d 41  E t1(x, y, PRIMA
28b0: 52 59 20 4b 45 59 28 78 2c 79 29 29 20 57 49 54  RY KEY(x,y)) WIT
28c0: 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 49 4e  HOUT ROWID;.  IN
28d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78 2c 79  SERT INTO t1(x,y
28e0: 29 20 56 41 4c 55 45 53 28 31 2c 27 41 42 27 29  ) VALUES(1,'AB')
28f0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2900: 74 31 28 78 2c 79 29 20 56 41 4c 55 45 53 28 32  t1(x,y) VALUES(2
2910: 2c 27 43 44 27 29 3b 0a 20 20 41 4e 41 4c 59 5a  ,'CD');.  ANALYZ
2920: 45 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20  E;.  DROP TABLE 
2930: 49 46 20 45 58 49 53 54 53 20 73 71 6c 69 74 65  IF EXISTS sqlite
2940: 5f 73 74 61 74 34 3b 0a 20 20 44 45 4c 45 54 45  _stat4;.  DELETE
2950: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
2960: 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t1;.  INSERT INT
2970: 4f 20 73 71 6c 69 74 65 5f 73 74 61 74 31 28 74  O sqlite_stat1(t
2980: 62 6c 2c 69 64 78 2c 73 74 61 74 29 20 56 41 4c  bl,idx,stat) VAL
2990: 55 45 53 28 27 74 31 27 2c 27 74 31 27 2c 27 31  UES('t1','t1','1
29a0: 30 30 30 30 30 30 20 31 30 30 20 31 27 29 3b 0a  000000 100 1');.
29b0: 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65    ANALYZE sqlite
29c0: 5f 6d 61 73 74 65 72 3b 0a 20 20 53 45 4c 45 43  _master;.  SELEC
29d0: 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20 20 57  T * FROM t1.   W
29e0: 48 45 52 45 20 28 79 20 3d 20 27 41 42 27 20 41  HERE (y = 'AB' A
29f0: 4e 44 20 78 20 3c 3d 20 34 29 0a 20 20 20 20 20  ND x <= 4).     
2a00: 20 4f 52 20 28 79 20 3d 20 27 45 46 27 20 41 4e   OR (y = 'EF' AN
2a10: 44 20 78 20 3d 20 35 29 3b 0a 7d 20 7b 31 20 41  D x = 5);.} {1 A
2a20: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
2a30: 73 74 20 73 6b 69 70 73 63 61 6e 31 2d 38 2e 31  st skipscan1-8.1
2a40: 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  eqp {.  EXPLAIN 
2a50: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
2a60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20  ECT * FROM t1.  
2a70: 20 57 48 45 52 45 20 28 79 20 3d 20 27 41 42 27   WHERE (y = 'AB'
2a80: 20 41 4e 44 20 78 20 3c 3d 20 34 29 0a 20 20 20   AND x <= 4).   
2a90: 20 20 20 4f 52 20 28 79 20 3d 20 27 45 46 27 20     OR (y = 'EF' 
2aa0: 41 4e 44 20 78 20 3d 20 35 29 3b 0a 7d 20 7b 2f  AND x = 5);.} {/
2ab0: 41 4e 59 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ANY/}.do_execsql
2ac0: 5f 74 65 73 74 20 73 6b 69 70 73 63 61 6e 31 2d  _test skipscan1-
2ad0: 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  8.2 {.  SELECT *
2ae0: 20 46 52 4f 4d 20 74 31 0a 20 20 20 57 48 45 52   FROM t1.   WHER
2af0: 45 20 79 20 3d 20 27 41 42 27 20 4f 52 20 28 79  E y = 'AB' OR (y
2b00: 20 3d 20 27 43 44 27 20 41 4e 44 20 78 20 3d 20   = 'CD' AND x = 
2b10: 32 29 0a 20 20 4f 52 44 45 52 20 42 59 20 2b 78  2).  ORDER BY +x
2b20: 3b 0a 7d 20 7b 31 20 41 42 20 32 20 43 44 7d 0a  ;.} {1 AB 2 CD}.
2b30: 0a 23 20 53 65 67 66 61 75 6c 74 20 72 65 70 6f  .# Segfault repo
2b40: 72 74 65 64 20 6f 6e 20 74 68 65 20 6d 61 69 6c  rted on the mail
2b50: 69 6e 67 20 6c 69 73 74 20 62 79 20 4b 65 69 74  ing list by Keit
2b60: 68 20 4d 65 64 63 61 6c 66 20 6f 6e 20 32 30 31  h Medcalf on 201
2b70: 36 2d 30 39 2d 31 38 2e 0a 23 20 41 20 73 6b 69  6-09-18..# A ski
2b80: 70 2d 73 63 61 6e 20 77 69 74 68 20 61 20 22 63  p-scan with a "c
2b90: 6f 6c 75 6d 6e 20 49 4e 20 28 53 45 4c 45 43 54  olumn IN (SELECT
2ba0: 20 2e 2e 2e 29 22 20 6f 6e 20 74 68 65 20 73 65   ...)" on the se
2bb0: 63 6f 6e 64 20 74 65 72 6d 20 6f 66 20 74 68 65  cond term of the
2bc0: 0a 23 20 69 6e 64 65 78 2e 0a 23 0a 64 6f 5f 65  .# index..#.do_e
2bd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70  xecsql_test skip
2be0: 73 63 61 6e 31 2d 39 2e 32 20 7b 0a 20 20 43 52  scan1-9.2 {.  CR
2bf0: 45 41 54 45 20 54 41 42 4c 45 20 74 39 61 28 61  EATE TABLE t9a(a
2c00: 2c 62 2c 63 29 3b 0a 20 20 43 52 45 41 54 45 20  ,b,c);.  CREATE 
2c10: 49 4e 44 45 58 20 74 39 61 5f 61 62 20 4f 4e 20  INDEX t9a_ab ON 
2c20: 74 39 61 28 61 2c 62 29 3b 0a 20 20 43 52 45 41  t9a(a,b);.  CREA
2c30: 54 45 20 54 41 42 4c 45 20 74 39 62 28 78 2c 79  TE TABLE t9b(x,y
2c40: 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c  );.  ANALYZE sql
2c50: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 49 4e  ite_master;.  IN
2c60: 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
2c70: 5f 73 74 61 74 31 20 56 41 4c 55 45 53 28 27 74  _stat1 VALUES('t
2c80: 39 61 27 2c 27 74 39 61 5f 61 62 27 2c 27 31 30  9a','t9a_ab','10
2c90: 30 30 30 30 30 20 32 35 30 30 30 30 20 31 27 29  00000 250000 1')
2ca0: 3b 0a 20 20 41 4e 41 4c 59 5a 45 20 73 71 6c 69  ;.  ANALYZE sqli
2cb0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 45 58 50  te_master;.  EXP
2cc0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
2cd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2ce0: 74 39 61 20 57 48 45 52 45 20 62 20 49 4e 20 28  t9a WHERE b IN (
2cf0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 39  SELECT x FROM t9
2d00: 62 20 57 48 45 52 45 20 79 21 3d 35 29 3b 0a 7d  b WHERE y!=5);.}
2d10: 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74   {/USING INDEX t
2d20: 39 61 5f 61 62 20 2e 41 4e 59 2e 61 2e 20 41 4e  9a_ab .ANY.a. AN
2d30: 44 20 62 3d 2e 2f 7d 0a 0a 0a 6f 70 74 69 6d 69  D b=./}...optimi
2d40: 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64  zation_control d
2d50: 62 20 73 6b 69 70 2d 73 63 61 6e 20 30 0a 64 6f  b skip-scan 0.do
2d60: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b  _execsql_test sk
2d70: 69 70 73 63 61 6e 31 2d 39 2e 33 20 7b 0a 20 20  ipscan1-9.3 {.  
2d80: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2d90: 41 4e 0a 20 20 53 45 4c 45 43 54 20 20 2a 20 46  AN.  SELECT  * F
2da0: 52 4f 4d 20 74 39 61 20 57 48 45 52 45 20 62 20  ROM t9a WHERE b 
2db0: 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
2dc0: 4d 20 74 39 62 20 57 48 45 52 45 20 79 21 3d 35  M t9b WHERE y!=5
2dd0: 29 3b 0a 7d 20 7b 2f 7b 53 43 41 4e 20 54 41 42  );.} {/{SCAN TAB
2de0: 4c 45 20 74 39 61 7d 2f 7d 0a 6f 70 74 69 6d 69  LE t9a}/}.optimi
2df0: 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64  zation_control d
2e00: 62 20 73 6b 69 70 2d 73 63 61 6e 20 31 0a 0a 64  b skip-scan 1..d
2e10: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 73  o_execsql_test s
2e20: 6b 69 70 73 63 61 6e 31 2d 32 2e 31 20 7b 0a 20  kipscan1-2.1 {. 
2e30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
2e40: 28 61 20 54 45 58 54 2c 20 62 20 49 4e 54 2c 20  (a TEXT, b INT, 
2e50: 63 20 49 4e 54 2c 20 64 20 49 4e 54 29 3b 0a 20  c INT, d INT);. 
2e60: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 36   CREATE INDEX t6
2e70: 61 62 63 20 4f 4e 20 74 36 28 61 2c 62 2c 63 29  abc ON t6(a,b,c)
2e80: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2e90: 74 36 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c  t6 VALUES('abc',
2ea0: 31 32 33 2c 34 2c 35 29 3b 0a 0a 20 20 41 4e 41  123,4,5);..  ANA
2eb0: 4c 59 5a 45 3b 0a 20 20 44 45 4c 45 54 45 20 46  LYZE;.  DELETE F
2ec0: 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ROM sqlite_stat1
2ed0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2ee0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 56 41 4c  sqlite_stat1 VAL
2ef0: 55 45 53 28 27 74 36 27 2c 27 74 36 61 62 63 27  UES('t6','t6abc'
2f00: 2c 27 31 30 30 30 30 20 35 30 30 30 20 32 30 30  ,'10000 5000 200
2f10: 30 20 31 30 27 29 3b 0a 20 20 41 4e 41 4c 59 5a  0 10');.  ANALYZ
2f20: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
2f30: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  .  DELETE FROM t
2f40: 36 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63  6;.} {}..do_exec
2f50: 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61  sql_test skipsca
2f60: 6e 31 2d 32 2e 32 65 71 70 20 7b 0a 20 20 45 58  n1-2.2eqp {.  EX
2f70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2f80: 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c  .  SELECT a,b,c,
2f90: 64 2c 27 7c 27 20 46 52 4f 4d 20 74 36 20 57 48  d,'|' FROM t6 WH
2fa0: 45 52 45 20 64 3c 3e 39 39 20 41 4e 44 20 62 3d  ERE d<>99 AND b=
2fb0: 33 34 35 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  345 ORDER BY a;.
2fc0: 7d 20 7b 2f 2a 20 55 53 49 4e 47 20 49 4e 44 45  } {/* USING INDE
2fd0: 58 20 74 36 61 62 63 20 28 41 4e 59 28 61 29 20  X t6abc (ANY(a) 
2fe0: 41 4e 44 20 62 3d 3f 29 2a 2f 7d 0a 64 6f 5f 65  AND b=?)*/}.do_e
2ff0: 78 65 63 73 71 6c 5f 74 65 73 74 20 73 6b 69 70  xecsql_test skip
3000: 73 63 61 6e 31 2d 32 2e 32 20 7b 0a 20 20 53 45  scan1-2.2 {.  SE
3010: 4c 45 43 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27  LECT a,b,c,d,'|'
3020: 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 64   FROM t6 WHERE d
3030: 3c 3e 39 39 20 41 4e 44 20 62 3d 33 34 35 20 4f  <>99 AND b=345 O
3040: 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 7d 0a  RDER BY a;.} {}.
3050: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3060: 20 73 6b 69 70 73 63 61 6e 31 2d 32 2e 33 65 71   skipscan1-2.3eq
3070: 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  p {.  EXPLAIN QU
3080: 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43  ERY PLAN.  SELEC
3090: 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52  T a,b,c,d,'|' FR
30a0: 4f 4d 20 74 36 20 57 48 45 52 45 20 64 3c 3e 39  OM t6 WHERE d<>9
30b0: 39 20 41 4e 44 20 62 3d 33 34 35 20 4f 52 44 45  9 AND b=345 ORDE
30c0: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
30d0: 2f 2a 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  /* USING INDEX t
30e0: 36 61 62 63 20 28 41 4e 59 28 61 29 20 41 4e 44  6abc (ANY(a) AND
30f0: 20 62 3d 3f 29 2a 2f 7d 0a 64 6f 5f 65 78 65 63   b=?)*/}.do_exec
3100: 73 71 6c 5f 74 65 73 74 20 73 6b 69 70 73 63 61  sql_test skipsca
3110: 6e 31 2d 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43  n1-2.3 {.  SELEC
3120: 54 20 61 2c 62 2c 63 2c 64 2c 27 7c 27 20 46 52  T a,b,c,d,'|' FR
3130: 4f 4d 20 74 36 20 57 48 45 52 45 20 64 3c 3e 39  OM t6 WHERE d<>9
3140: 39 20 41 4e 44 20 62 3d 33 34 35 20 4f 52 44 45  9 AND b=345 ORDE
3150: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3160: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.