/ Hex Artifact Content
Login

Artifact 155809967fbab889374dedf970ea6561b8fb519fcb165d6ba00776552ecc5cde:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
08e0: 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  f the innermost 
08f0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57 48 45 52  loop of the WHER
0900: 45 20 63 6c 61 75 73 65 20 69 6d 70 6c 65 6d 65  E clause impleme
0910: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ntation.** retur
0920: 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52  ns rows in ORDER
0930: 20 42 59 20 6f 72 64 65 72 20 66 6f 72 20 63 6f   BY order for co
0940: 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66 20 74 68  mplete run of th
0950: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2a  e inner loop..**
0960: 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75 6c 74 69  .** Across multi
0970: 70 6c 65 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ple iterations o
0980: 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2c 20 74  f outer loops, t
0990: 68 65 20 6f 75 74 70 75 74 20 72 6f 77 73 20 6e  he output rows n
09a0: 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 73 6f  eed not be.** so
09b0: 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e 67 20 61  rted.  As long a
09c0: 73 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65  s rows are sorte
09d0: 64 20 66 6f 72 20 6a 75 73 74 20 74 68 65 20 69  d for just the i
09e0: 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70 2c 20 74  nnermost loop, t
09f0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 63  his.** routine c
0a00: 61 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  an return TRUE..
0a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0a20: 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
0a30: 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  oop(WhereInfo *p
0a40: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0a50: 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
0a60: 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d 0a 0a 2f  dInnerLoop;.}../
0a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0a80: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
0a90: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
0aa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
0ab0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
0ac0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0ad0: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0ae0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0af0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0b00: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0b10: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0b20: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
0b30: 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b  >iContinue!=0 );
0b40: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
0b50: 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  ->iContinue;.}..
0b60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0b70: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
0b80: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
0b90: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  o in order to br
0ba0: 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20  eak.** out of a 
0bb0: 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  WHERE loop..*/.i
0bc0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  nt sqlite3WhereB
0bd0: 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49  reakLabel(WhereI
0be0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
0bf0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0c00: 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Break;.}../*.** 
0c10: 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f 4f  Return ONEPASS_O
0c20: 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50 44  FF (0) if an UPD
0c30: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
0c40: 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62 6c  atement is unabl
0c50: 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65 20  e to.** operate 
0c60: 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20  directly on the 
0c70: 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20 62  rowis returned b
0c80: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
0c90: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45  .  Return.** ONE
0ca0: 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29 20  PASS_SINGLE (1) 
0cb0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
0cc0: 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 64   can operation d
0cd0: 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65 20  irectly because 
0ce0: 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  only.** a single
0cf0: 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63 68   row is to be ch
0d00: 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20 4f  anged.  Return O
0d10: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32 29  NEPASS_MULTI (2)
0d20: 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73 73   if the one-pass
0d30: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
0d40: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
0d50: 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20  multiple .**.** 
0d60: 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  If the ONEPASS o
0d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
0d80: 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75  sed (if this rou
0d90: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
0da0: 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20  e).** then also 
0db0: 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65  write the indice
0dc0: 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72  s of open cursor
0dd0: 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53  s used by ONEPAS
0de0: 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b  S.** into aiCur[
0df0: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e  0] and aiCur[1].
0e00: 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20    iaCur[0] gets 
0e10: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
0e20: 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  e data.** table 
0e30: 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74  and iaCur[1] get
0e40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  s the cursor use
0e50: 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72  d by an auxiliar
0e60: 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68  y index..** Eith
0e70: 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  er value may be 
0e80: 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
0e90: 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  hat cursor is no
0ea0: 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63  t used..** Any c
0eb0: 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20  ursors returned 
0ec0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f  will have been o
0ed0: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
0ee0: 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30  g..**.** aiCur[0
0ef0: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62  ] and aiCur[1] b
0f00: 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68  oth get -1 if th
0f10: 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c  e where-clause l
0f20: 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  ogic is.** unabl
0f30: 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45  e to use the ONE
0f40: 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
0f50: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
0f60: 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28  3WhereOkOnePass(
0f70: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0f80: 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a  o, int *aiCur){.
0f90: 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20    memcpy(aiCur, 
0fa0: 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
0fb0: 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Pass, sizeof(int
0fc0: 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48 45  )*2);.#ifdef WHE
0fd0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
0fe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
0ff0: 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e 66  reTrace && pWInf
1000: 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
1010: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
1020: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1030: 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a 20  tf("%s cursors: 
1040: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
1050: 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50     pWInfo->eOneP
1060: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
1070: 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f 53  GLE ? "ONEPASS_S
1080: 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41 53  INGLE" : "ONEPAS
1090: 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20 20  S_MULTI",.      
10a0: 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69 43     aiCur[0], aiC
10b0: 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  ur[1]);.  }.#end
10c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  if.  return pWIn
10d0: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a  fo->eOnePass;.}.
10e0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
10f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20  content of pSrc 
1100: 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74  into pDest.*/.st
1110: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
1120: 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74  rMove(WhereOrSet
1130: 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72   *pDest, WhereOr
1140: 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44  Set *pSrc){.  pD
1150: 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e  est->n = pSrc->n
1160: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74  ;.  memcpy(pDest
1170: 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44  ->a, pSrc->a, pD
1180: 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44  est->n*sizeof(pD
1190: 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a  est->a[0]));.}..
11a0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73  /*.** Try to ins
11b0: 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65 71  ert a new prereq
11c0: 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72  uisite/cost entr
11d0: 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  y into the Where
11e0: 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a  OrSet pSet..**.*
11f0: 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20  * The new entry 
1200: 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
1210: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
1220: 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  y, or it might b
1230: 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f  e.** appended, o
1240: 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 69  r it might be di
1250: 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61  scarded.  Do wha
1260: 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69 67  tever is the rig
1270: 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74  ht thing.** so t
1280: 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20 74  hat pSet keeps t
1290: 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73  he N_OR_COST bes
12a0: 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73  t entries seen s
12b0: 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  o far..*/.static
12c0: 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65   int whereOrInse
12d0: 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74  rt(.  WhereOrSet
12e0: 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20   *pSet,      /* 
12f0: 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 74  The WhereOrSet t
1300: 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a  o be updated */.
1310: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
1320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72  ,        /* Prer
1330: 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68 65  equisites of the
1340: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
1350: 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20 20  LogEst rRun,    
1360: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f         /* Run-co
1370: 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  st of the new en
1380: 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  try */.  LogEst 
1390: 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
13a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
13b0: 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77  puts for the new
13c0: 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75   entry */.){.  u
13d0: 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43  16 i;.  WhereOrC
13e0: 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  ost *p;.  for(i=
13f0: 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d  pSet->n, p=pSet-
1400: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b  >a; i>0; i--, p+
1410: 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e  +){.    if( rRun
1420: 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72  <=p->rRun && (pr
1430: 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71  ereq & p->prereq
1440: 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20  )==prereq ){.   
1450: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49     goto whereOrI
1460: 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20  nsert_done;.    
1470: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
1480: 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70  n<=rRun && (p->p
1490: 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29 3d  rereq & prereq)=
14a0: 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20  =p->prereq ){.  
14b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
14d0: 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20  et->n<N_OR_COST 
14e0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74  ){.    p = &pSet
14f0: 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a  ->a[pSet->n++];.
1500: 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f      p->nOut = nO
1510: 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ut;.  }else{.   
1520: 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20   p = pSet->a;.  
1530: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65    for(i=1; i<pSe
1540: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
1550: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53    if( p->rRun>pS
1560: 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20  et->a[i].rRun ) 
1570: 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b  p = pSet->a + i;
1580: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1590: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72  ->rRun<=rRun ) r
15a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65  eturn 0;.  }.whe
15b0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a  reOrInsert_done:
15c0: 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70  .  p->prereq = p
15d0: 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e  rereq;.  p->rRun
15e0: 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70   = rRun;.  if( p
15f0: 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d  ->nOut>nOut ) p-
1600: 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nOut = nOut;.  
1610: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1620: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
1630: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
1640: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
1650: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
1660: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
1670: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
1680: 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33  .Bitmask sqlite3
1690: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68 65  WhereGetMask(Whe
16a0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
16b0: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
16c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
16d0: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
16e0: 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42  n<=(int)sizeof(B
16f0: 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66  itmask)*8 );.  f
1700: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
1710: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1720: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
1730: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
1740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41  .      return MA
1750: 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
1760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1780: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
1790: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
17a0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
17b0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
17c0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
17d0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
17e0: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
17f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1800: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
1810: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
1820: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
1830: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
1840: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
1850: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
1860: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
1870: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
1880: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
1890: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
18a0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
18b0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
18c0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
18d0: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
18e0: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
18f0: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
1900: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
1910: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
1920: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  r;.}../*.** Adva
1930: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
1940: 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d  WhereTerm that m
1950: 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67  atches according
1960: 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61   to the criteria
1970: 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20  .** established 
1980: 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f  when the pScan o
1990: 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61  bject was initia
19a0: 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63  lized by whereSc
19b0: 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74  anInit()..** Ret
19c0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
19d0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61  e are no more ma
19e0: 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d  tching WhereTerm
19f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  s..*/.static Whe
1a00: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
1a10: 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20  nNext(WhereScan 
1a20: 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69  *pScan){.  int i
1a30: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1a40: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e  /* The cursor on
1a50: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
1a60: 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69 43  term */.  i16 iC
1a70: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f  olumn;         /
1a80: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20  * The column on 
1a90: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
1aa0: 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b  erm.  -1 for IPK
1ab0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20   */.  Expr *pX; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
1ae0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68  g tested */.  Wh
1af0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1b00: 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20     /* Shorthand 
1b10: 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a  for pScan->pWC *
1b20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1b30: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20  Term;    /* The 
1b40: 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65  term being teste
1b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70  d */.  int k = p
1b60: 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57  Scan->k;    /* W
1b70: 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63  here to start sc
1b80: 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  anning */..  ass
1b90: 65 72 74 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ert( pScan->iEqu
1ba0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
1bb0: 76 20 29 3b 0a 20 20 70 57 43 20 3d 20 70 53 63  v );.  pWC = pSc
1bc0: 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68 69 6c 65  an->pWC;.  while
1bd0: 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  (1){.    iColumn
1be0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
1bf0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
1c00: 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  -1];.    iCur = 
1c10: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
1c20: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1c30: 20 20 20 61 73 73 65 72 74 28 20 70 57 43 21 3d     assert( pWC!=
1c40: 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
1c50: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
1c60: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
1c70: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
1c80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1c90: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1ca0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
1cb0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
1cc0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
1cd0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69 43  .         && (iC
1ce0: 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a 20  olumn!=XN_EXPR. 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
1d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1d10: 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e 70 45 78  eSkip(pTerm->pEx
1d20: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
1d60: 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20 20 20 20  r,iCur)==0).    
1d70: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1d80: 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21 45 78  iEquiv<=1 || !Ex
1d90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1da0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
1db0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
1dc0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1dd0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1de0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
1df0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
1e00: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1e10: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1e20: 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20 20 20  >aiCur).        
1e30: 20 20 20 26 26 20 28 70 58 20 3d 20 73 71 6c 69     && (pX = sqli
1e40: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1e50: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
1e60: 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70 3d 3d 54  >pRight))->op==T
1e70: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1e80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1e90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1ea0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1eb0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
1ec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1ed0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 69     if( pScan->ai
1ee0: 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  Cur[j]==pX->iTab
1ef0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
1f00: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 69 43 6f    && pScan->aiCo
1f10: 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f  lumn[j]==pX->iCo
1f20: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1f30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
1f70: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
1f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f90: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d   pScan->aiCur[j]
1fa0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1fc0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  an->aiColumn[j] 
1fd0: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1ff0: 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b 0a 20 20  an->nEquiv++;.  
2000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2020: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2030: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
2040: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
2060: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
2070: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
2080: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
2090: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
20a0: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
20b0: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
20c0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
20d0: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
20e0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
20f0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
2100: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
2110: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
2120: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
2130: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
2140: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2150: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2160: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
2170: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
2180: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
21d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
21e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
2210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
2250: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
2260: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2270: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
2280: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2290: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
22a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22b0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
22c0: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
22d0: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
22f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2310: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2320: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2330: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
2340: 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20  O_IS))!=0.      
2350: 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20         && (pX = 
2360: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
2370: 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ight)->op==TK_CO
2380: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LUMN.           
2390: 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d    && pX->iTable=
23a0: 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d  =pScan->aiCur[0]
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
23c0: 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53   pX->iColumn==pS
23d0: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  can->aiColumn[0]
23e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2400: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
2410: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
2420: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2430: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2450: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
2460: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2470: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
2480: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
2490: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
24a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24c0: 20 20 70 57 43 20 3d 20 70 57 43 2d 3e 70 4f 75    pWC = pWC->pOu
24d0: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
24e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 57  ;.    }while( pW
24f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  C!=0 );.    if( 
2500: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3e 3d 70  pScan->iEquiv>=p
2510: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 20 62  Scan->nEquiv ) b
2520: 72 65 61 6b 3b 0a 20 20 20 20 70 57 43 20 3d 20  reak;.    pWC = 
2530: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
2540: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
2550: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
2560: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2570: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2580: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
2590: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
25a0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
25b0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
25c0: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
25d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
25e0: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
25f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2600: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2610: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2620: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2630: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
2640: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2650: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2660: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
2670: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
2680: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
2690: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
26a0: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
26b0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
26c0: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
26d0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
26e0: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
26f0: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2700: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2710: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2720: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2730: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
2740: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
2750: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
2760: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2770: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
2780: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
2790: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27a0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
27b0: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
27c0: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
27d0: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
27e0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
27f0: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2800: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2810: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2820: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2830: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
2840: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
2850: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
2860: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2870: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
2880: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
2890: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
28a0: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
28b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
28c0: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
28d0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
28e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
28f0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2900: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2910: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2920: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2930: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2940: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2950: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2970: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
2980: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29a0: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
29b0: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
29c0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
29d0: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
29e0: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
29f0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2a10: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2a20: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2a30: 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72  .){.  pScan->pOr
2a40: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
2a50: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
2a60: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
2a70: 72 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  r = 0;.  pScan->
2a80: 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 70 53  idxaff = 0;.  pS
2a90: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2aa0: 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 20 29   0;.  if( pIdx )
2ab0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 43  {.    int j = iC
2ac0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75  olumn;.    iColu
2ad0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
2ae0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
2af0: 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52  iColumn==XN_EXPR
2b00: 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d   ){.      pScan-
2b10: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2b20: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2b30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 53  .pExpr;.      pS
2b40: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2b50: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
2b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2b70: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
2b80: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
2b90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2ba0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65  XN_ROWID;.    }e
2bb0: 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e  lse if( iColumn>
2bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61  =0 ){.      pSca
2bd0: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78  n->idxaff = pIdx
2be0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2bf0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
2c00: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a  ;.      pScan->z
2c10: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d  CollName = pIdx-
2c20: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
2c30: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  }.  }else if( iC
2c40: 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29  olumn==XN_EXPR )
2c50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2c60: 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d    }.  pScan->opM
2c70: 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20  ask = opMask;.  
2c80: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
2c90: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20  pScan->aiCur[0] 
2ca0: 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d  = iCur;.  pScan-
2cb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69  >aiColumn[0] = i
2cc0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
2cd0: 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70  >nEquiv = 1;.  p
2ce0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31  Scan->iEquiv = 1
2cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
2d00: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
2d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
2d20: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
2d30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d40: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
2d50: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2d60: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
2d70: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2d80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
2d90: 74 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66  table iCur or of
2da0: 20 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69   index pIdx.** i
2db0: 66 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f  f pIdx!=0 and <o
2dc0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  p> is one of the
2dd0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
2de0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
2df0: 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72  by.** the op par
2e00: 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20  ameter.  Return 
2e10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2e20: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2e30: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2e40: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
2e50: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
2e60: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
2e70: 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  es of table iCur
2e80: 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  .  .** Search fo
2e90: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  r terms matching
2ea0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2eb0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a  column of pIdx.*
2ec0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2ed0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
2ee0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
2ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  r..**.** The ter
2f00: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
2f10: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
2f20: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
2f30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
2f40: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2f50: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
2f60: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
2f70: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
2f80: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
2f90: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
2fa0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
2fb0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
2fc0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
2fd0: 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c  ** aiCur[]/iaCol
2fe0: 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c  umn[] arrays hol
2ff0: 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  d X and all its 
3000: 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65  equivalents. The
3010: 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f  re are 11.** slo
3020: 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69  ts in aiCur[]/ai
3030: 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74  Column[] so that
3040: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
3050: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
3060: 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20   to 10.** other 
3070: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
3080: 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72  s.  Hence a sear
3090: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
30a0: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
30b0: 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32  =A1.** and A1=A2
30c0: 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e   and A2=A3 and .
30d0: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
30e0: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
30f0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
3100: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
3110: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3120: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
3130: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
3140: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
3150: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
3160: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
3170: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
3180: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
3190: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
31a0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
31b0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
31c0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
31d0: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
31e0: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
31f0: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
3200: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
3210: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
3220: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
3230: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
3240: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
3250: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
3260: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
3270: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
3280: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
3290: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
32a0: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65  _EQUIV..*/.Where
32b0: 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65  Term *sqlite3Whe
32c0: 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68  reFindTerm(.  Wh
32d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
32e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
32f0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
3300: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
3310: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
3320: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
3330: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
3340: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
3350: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
3360: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
3370: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
3380: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
3390: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
33a0: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
33b0: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
33c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
33d0: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
33e0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
33f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
3400: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
3410: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3420: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3430: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
3440: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
3450: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
3460: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
3470: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
3480: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
3490: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
34a0: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
34b0: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
34c0: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57  .  op &= WO_EQ|W
34d0: 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70  O_IS;.  while( p
34e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
34f0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
3500: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
3510: 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65      if( p->prere
3520: 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d  qRight==0 && (p-
3530: 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d  >eOperator&op)!=
3540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
3550: 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61  tcase( p->eOpera
3560: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
3570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
3580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3590: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
35a0: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
35b0: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
35c0: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
35d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
35e0: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
35f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
3600: 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
3610: 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d   an entry that m
3620: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
3630: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
3640: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
3650: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
3660: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3670: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
3680: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
3690: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
36a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
36b0: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
36c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
36d0: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
36e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
36f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3700: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3710: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3720: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
3730: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3740: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
3750: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
3760: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3780: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
3790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
37a0: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
37b0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37d0: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
37e0: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
37f0: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
3800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
3810: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
3820: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
3830: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
3840: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
3850: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
3860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
3870: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3880: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3890: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
38a0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
38b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
38c0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
38d0: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
38e0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
38f0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
3900: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3910: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
3920: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
3940: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3950: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3960: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  r);.      if( 0=
3970: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
3980: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
3990: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
39a0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
39b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
39c0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
39d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
39e0: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
39f0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
3a00: 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a  dx is NOT NULL.*
3a10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
3a20: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
3a30: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
3a40: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b   iCol){.  int j;
3a50: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
3a60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3a70: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
3a80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3a90: 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  .  j = pIdx->aiC
3aa0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69  olumn[iCol];.  i
3ab0: 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 72  f( j>=0 ){.    r
3ac0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
3ad0: 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
3ae0: 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ull;.  }else if(
3af0: 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   j==(-1) ){.    
3b00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
3b10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  e{.    assert( j
3b20: 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20 72 65  ==(-2) );.    re
3b30: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73 73 75  turn 0;  /* Assu
3b40: 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20 65 78  me an indexed ex
3b50: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 6c 77  pression can alw
3b60: 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55 4c 4c  ays yield a NULL
3b70: 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   */..  }.}../*.*
3b80: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
3b90: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
3ba0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
3bb0: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
3bc0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
3bd0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
3be0: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
3bf0: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
3c00: 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20  f any subset of 
3c10: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
3c20: 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c  he.** DISTINCT l
3c30: 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ist are collecti
3c40: 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20  vely unique and 
3c50: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e  individually non
3c60: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
3c70: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
3c80: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
3c90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ca0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3cb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
3cc0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
3ce0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
3cf0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3d00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
3d10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3d20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3d30: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
3d40: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
3d50: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
3d60: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
3d70: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
3d80: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
3d90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3db0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
3dc0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
3dd0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
3de0: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
3df0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3e00: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
3e10: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
3e20: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
3e30: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
3e40: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
3e50: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
3e60: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
3e70: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
3e80: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
3e90: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
3ea0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
3eb0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
3ec0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
3ed0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
3ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
3ef0: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
3f00: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
3f10: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
3f20: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
3f30: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
3f40: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
3f50: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
3f60: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
3f70: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
3f80: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
3f90: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
3fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
3fb0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
3fc0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
3fd0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
3fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
3ff0: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
4000: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
4010: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
4020: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
4030: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
4040: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4050: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
4060: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
4070: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
4080: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
4090: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
40a0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
40b0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
40c0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
40d0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
40e0: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
40f0: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
4100: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
4110: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
4120: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
4130: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
4140: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
4150: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
4160: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
4170: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4180: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
4190: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
41a0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
41b0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
41c0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
41d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
41e0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
41f0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
4200: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
4210: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
4220: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
4230: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
4240: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
4250: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
4260: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
4270: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
4280: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
4290: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
42a0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
42b0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
42c0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
42d0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
42e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
42f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
4300: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
4310: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
4320: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
4340: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
4350: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
4360: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
4370: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c  m(pWC, iBase, i,
4380: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
4390: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
43a0: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e        if( findIn
43b0: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
43c0: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
43d0: 20 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72   pIdx, i)<0 ) br
43e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
43f0: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
4400: 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20  ull(pIdx, i)==0 
4410: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4430: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
4440: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
4450: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
4460: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
4470: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
4480: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
4490: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
44a0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
44b0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
44c0: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
44d0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
44e0: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
44f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
4500: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
4510: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
4520: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
4530: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
4540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4550: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
4560: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
4570: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
4580: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
4590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45a0: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
45b0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
45c0: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
45d0: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
45e0: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 77  s into OP_Copy w
45f0: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73  hen the table is
4600: 20 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 20   being accessed 
4610: 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 0a  via co-routine .
4620: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  ** instead of vi
4630: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a  a table lookup..
4640: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 49 6e  **.** If the bIn
4650: 63 72 52 6f 77 69 64 20 70 61 72 61 6d 65 74 65  crRowid paramete
4660: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e 79  r is 0, then any
4670: 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73 74 72 75   OP_Rowid instru
4680: 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72  ctions on.** cur
4690: 73 6f 72 20 69 54 61 62 43 75 72 20 61 72 65 20  sor iTabCur are 
46a0: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
46b0: 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66   OP_Null. Or, if
46c0: 20 62 49 6e 63 72 52 6f 77 69 64 20 69 73 20 6e   bIncrRowid is n
46d0: 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  on-zero,.** then
46e0: 20 65 61 63 68 20 4f 50 5f 52 6f 77 69 64 20 69   each OP_Rowid i
46f0: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
4700: 74 6f 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  to an instructio
4710: 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  n to increment t
4720: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
4730: 65 64 20 69 6e 20 69 74 73 20 6f 75 74 70 75 74  ed in its output
4740: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 73 74   register..*/.st
4750: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4760: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4770: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4780: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4790: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
47a0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
47b0: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
47c0: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
47d0: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
47e0: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
47f0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4800: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4810: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4820: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4830: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4840: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4850: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4860: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4870: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4880: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4890: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
48a0: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
48b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
48c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
48d0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  ;.  VdbeOp *pOp 
48e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
48f0: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
4900: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
4910: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4920: 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50 61  dr(v);.  if( pPa
4930: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4940: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4950: 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c 69    for(; iStart<i
4960: 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70  End; iStart++, p
4970: 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Op++){.    if( p
4980: 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72 20  Op->p1!=iTabCur 
4990: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
49b0: 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
49c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
49d0: 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20  = OP_Copy;.     
49e0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e   pOp->p1 = pOp->
49f0: 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b 0a  p2 + iRegister;.
4a00: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4a10: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pOp->p3;.      p
4a20: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
4a30: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
4a40: 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
4a50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
4a60: 63 72 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  crRowid ){.     
4a70: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
4a80: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
4a90: 20 69 6e 20 74 68 65 20 50 32 20 6f 70 65 72 61   in the P2 opera
4aa0: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77  nd of the OP_Row
4ab0: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  id. */.        p
4ac0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4ad0: 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20  AddImm;.        
4ae0: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70  pOp->p1 = pOp->p
4af0: 32 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  2;.        pOp->
4b00: 70 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  p2 = 1;.      }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
4b20: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
4b30: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
4b40: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >p1 = 0;.       
4b50: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
4b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
4b80: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
4b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
4ba0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
4bb0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
4bc0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
4bd0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
4be0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
4bf0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
4c00: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
4c10: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
4c20: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
4c30: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
4c40: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
4c50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4c60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
4c70: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
4c80: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
4c90: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
4ca0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
4cb0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4cc0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4cd0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ce0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4cf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4d00: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4d10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4d20: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
4d30: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
4d40: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
4d50: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
4d60: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
4d70: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4d80: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
4d90: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4da0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
4db0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
4dc0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
4dd0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
4de0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
4df0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
4e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
4e10: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
4e20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4e30: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
4e40: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
4e50: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
4e60: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
4e70: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4e80: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
4e90: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
4ea0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
4eb0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
4ec0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4ed0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4ee0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ef0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4f10: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4f20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4f30: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
4f40: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
4f50: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
4f60: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
4f70: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
4f80: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
4f90: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
4fa0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
4fb0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
4fc0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4fd0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
4fe0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
4ff0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5000: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
5010: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
5020: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5030: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
5040: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
5050: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
5060: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
5070: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5080: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
5090: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
50a0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
50b0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
50c0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
50d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
50e0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
50f0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
5100: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
5110: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
5120: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
5130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5140: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
5150: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
5160: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
5170: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
5180: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
5190: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
51a0: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
51b0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
51c0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
51d0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
51e0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
51f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5200: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5210: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
5220: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
5230: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
5240: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
5250: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
5260: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5270: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
5280: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
5290: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
52a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
52c0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
52d0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
52e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
52f0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
5300: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
5310: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
5320: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5330: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
5340: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d  (WO_EQ|WO_IS))==
5350: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5360: 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
5370: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
5380: 29 20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  ) .   && !ExprHa
5390: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
53a0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
53b0: 6f 69 6e 29 0a 20 20 20 26 26 20 28 70 54 65 72  oin).   && (pTer
53c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
53d0: 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 2f  O_IS).  ){.    /
53e0: 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  * Cannot use an 
53f0: 49 53 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  IS term from the
5400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73   WHERE clause as
5410: 20 61 6e 20 69 6e 64 65 78 20 64 72 69 76 65 72   an index driver
5420: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
5430: 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  RHS of a LEFT JO
5440: 49 4e 2e 20 53 75 63 68 20 61 20 74 65 72 6d 20  IN. Such a term 
5450: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
5460: 20 69 66 20 69 74 20 69 73 20 66 72 6f 6d 0a 20   if it is from. 
5470: 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 63 6c 61     ** the ON cla
5480: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74  use.  */.    ret
5490: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
54a0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
54b0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
54c0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
54d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
54e0: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
54f0: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
5500: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
5510: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
5520: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
5540: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
5550: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
5560: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
5570: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
5580: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
5590: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
55a0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
55b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55c0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
55e0: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
55f0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
5600: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
5610: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
5620: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
5630: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
5640: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
5650: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
5660: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
5670: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
5680: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
5690: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
56a0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
56b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
56d0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
56e0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
56f0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5700: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5710: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5720: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5730: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5740: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5750: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
5760: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
5770: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5790: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
57a0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
57b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
57c0: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
57d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
57e0: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
57f0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5810: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5820: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5830: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5840: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5850: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
5860: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
5870: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5880: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
5890: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
58a0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
58b0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
58c0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
58e0: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
58f0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5900: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5930: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5940: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5950: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
5960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5970: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
5980: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
5990: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
59a0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
59c0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
59d0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
59e0: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
59f0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5a00: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5a10: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5a20: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5a30: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5a40: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5a50: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
5a60: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
5a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
5a80: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
5a90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5ac0: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ae0: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5af0: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5b00: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5b10: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5b20: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5b30: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5b40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5b50: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
5b60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
5b70: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
5b80: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5ba0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
5bb0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5bd0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5be0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5bf0: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5c00: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5c10: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5c20: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5c30: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5c40: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5c50: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5c70: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
5c80: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
5c90: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
5ca0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
5cb0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5cc0: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5cd0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5ce0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5cf0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5d00: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5d10: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d20: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5d30: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5d40: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5d50: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
5d60: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
5d70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5d80: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
5d90: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
5da0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
5db0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5dd0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5de0: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5df0: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5e00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5e10: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5e20: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5e30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5e40: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5e50: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
5e60: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
5e70: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
5e80: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
5e90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5ea0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5eb0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
5ed0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
5ee0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
5ef0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5f00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
5f10: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
5f20: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5f30: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5f40: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5f50: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5f60: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5f70: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5f80: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5f90: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5fa0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5fb0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5fc0: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
5fd0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5fe0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
5ff0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
6000: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6010: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6020: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
6030: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
6040: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
6050: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
6060: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
6070: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
6080: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6090: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
60a0: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
60b0: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
60d0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
6100: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
6110: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
6120: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
6130: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6140: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
6150: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
6160: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6170: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6180: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
6190: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
61a0: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
61b0: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
61c0: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
61d0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
61e0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
61f0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6220: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
6230: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
6240: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
6250: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
6260: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
6270: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
6280: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
6290: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
62a0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
62b0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
62c0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
62d0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
62e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
62f0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
6300: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6310: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
6320: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
6330: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6340: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
6350: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
6360: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
6370: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
6380: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
6390: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
63a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
63b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
63c0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
63d0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
63e0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
63f0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
6400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
6410: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
6420: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
6430: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
6440: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
6450: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
6460: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
6470: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
6480: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
6490: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
64a0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
64b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
64c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
64d0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
64e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
64f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
6500: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
6510: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
6520: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
6530: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
6540: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
6570: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
6580: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6590: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
65a0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
65b0: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
65c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
65d0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
65e0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
65f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
6600: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
6610: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
6620: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
6630: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6640: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
6650: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
6660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
6670: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
6680: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
6690: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
66a0: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
66b0: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
66c0: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
66d0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
66e0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
66f0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
6700: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
6710: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
6720: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
6730: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
6740: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
6750: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
6760: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
6770: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
6780: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
6790: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
67a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
67b0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
67c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
67d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
67e0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
67f0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
6800: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
6810: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
6820: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
6830: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
6840: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
6850: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
6860: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
6870: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
6880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
6890: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
68a0: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
68b0: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
68c0: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
68d0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
68e0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
68f0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
6900: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
6910: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
6920: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
6930: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
6940: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
6950: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
6960: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
6970: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
6980: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
6990: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
69a0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
69b0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
69c0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
69d0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
69e0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
69f0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
6a00: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
6a10: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
6a20: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
6a30: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
6a40: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
6a50: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
6a60: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
6a70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
6a80: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
6a90: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
6aa0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
6ab0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
6ac0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
6ad0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
6ae0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6af0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
6b00: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
6b10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b20: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6b30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
6b40: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
6b50: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
6b60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
6b70: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
6b80: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
6b90: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
6ba0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
6bb0: 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42  me : sqlite3StrB
6bc0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6e  INARY;.        n
6bd0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6be0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6bf0: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
6c00: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
6c10: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
6c20: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6c30: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
6c40: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
6c50: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
6c60: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
6c70: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
6c80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6c90: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
6ca0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
6cb0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6cc0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6cd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6ce0: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6cf0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6d00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
6d10: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
6d20: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
6d30: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6d40: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6d50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6d60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6d70: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6d80: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6d90: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
6da0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
6db0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
6dc0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
6dd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6de0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49 64 78  XN_ROWID;.  pIdx
6df0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
6e00: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
6e10: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
6e20: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
6e30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
6e40: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
6e50: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
6e60: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
6e70: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
6e80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6e90: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
6ea0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6eb0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
6ec0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
6ed0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
6ee0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
6ef0: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
6f00: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
6f10: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
6f20: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6f30: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
6f40: 2a 2f 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  */.  pTabItem = 
6f50: 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  &pWC->pWInfo->pT
6f60: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
6f70: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20  ->iFrom];.  if( 
6f80: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f90: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6fa0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
6fb0: 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
6fc0: 75 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75  urn;.    addrCou
6fd0: 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  nter = sqlite3Vd
6fe0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6ff0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
7000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7010: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
7020: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
7030: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
7040: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
7050: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71     addrTop =  sq
7060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7070: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
7080: 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
7090: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
70a0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
70b0: 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 25 73   "next row of %s
70c0: 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
70d0: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65  b->zName));.  }e
70e0: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70  lse{.    addrTop
70f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7100: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
7110: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
7120: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
7130: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
7140: 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20  pPartial ){.    
7150: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
7160: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7170: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
7180: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
7190: 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43  se, pPartial, iC
71a0: 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f  ontinue, SQLITE_
71b0: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
71c0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
71d0: 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c  |= WHERE_PARTIAL
71e0: 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  IDX;.  }.  regRe
71f0: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
7200: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7210: 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71  ;.  regBase = sq
7220: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
7230: 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61  exKey(.      pPa
7240: 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
7250: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
7260: 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
7270: 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  0.  );.  sqlite3
7280: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7290: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
72a0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
72b0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
72c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
72d0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
72e0: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
72f0: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
7300: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
7310: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
7320: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
7330: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
7340: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
7350: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
7360: 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42  ddrCounter, regB
7370: 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74  ase+n);.    test
7380: 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62  case( pParse->db
7390: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
73a0: 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43  ;.    translateC
73b0: 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72  olumnToCopy(pPar
73c0: 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65  se, addrTop, pLe
73d0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20  vel->iTabCur,.  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d          pTabItem
7400: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
7410: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7420: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
7430: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
7440: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
7450: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7470: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7480: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7490: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
74a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
74b0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
74c0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
74d0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
74e0: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
74f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
7500: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
7510: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7520: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
7530: 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  ecord);.  .  /* 
7540: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
7550: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
7560: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
7570: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7580: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
7590: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
75a0: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
75b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
75c0: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
75d0: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
75e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
75f0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
7600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7610: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7620: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
7630: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
7640: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7650: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
7660: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
7670: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7680: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
7690: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
76a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
76b0: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
76c0: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
76d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
76e0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
76f0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
7700: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7710: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
7720: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
7730: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
7750: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7760: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7770: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
7780: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
7790: 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 6e   clause being an
77a0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
77b0: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
77d0: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
77e0: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
77f0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7800: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
7810: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
7820: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
7830: 20 69 73 20 74 68 65 20 76 74 61 62 20 2a 2f 0a   is the vtab */.
7840: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7850: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
7860: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
7870: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
7880: 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20  6 *pmNoOmit     
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78a0: 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e   Mask of terms n
78b0: 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b  ot to omit */.){
78c0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
78d0: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
78e0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
78f0: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
7900: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
7910: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
7920: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
7930: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
7940: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7950: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
7960: 61 67 65 3b 0a 20 20 73 74 72 75 63 74 20 48 69  age;.  struct Hi
7970: 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70  ddenIndexInfo *p
7980: 48 69 64 64 65 6e 3b 0a 20 20 57 68 65 72 65 54  Hidden;.  WhereT
7990: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
79a0: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
79b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
79c0: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31   *pIdxInfo;.  u1
79d0: 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a  6 mNoOmit = 0;..
79e0: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
79f0: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7a00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
7a10: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
7a20: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
7a30: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
7a40: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
7a50: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7a60: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7a70: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7a80: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7a90: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7aa0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7ab0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7ac0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7ad0: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7ae0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7af0: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7b00: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
7b10: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
7b20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7b30: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7b40: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
7b50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7b60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7b70: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7b80: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7b90: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7ba0: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7bb0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7bc0: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7bd0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7be0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7bf0: 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f  _EQUIV))==0 ) co
7c00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7c10: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
7c20: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
7c30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
7c40: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
7c50: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7c60: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7c70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7c80: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7c90: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7ca0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7cb0: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7cc0: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7cd0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7ce0: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7cf0: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
7d00: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7d10: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
7d20: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
7d30: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
7d40: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
7d50: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7d60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7d80: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7d90: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7da0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7db0: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7dc0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7dd0: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7de0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7df0: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
7e00: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
7e10: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
7e20: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
7e30: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7e40: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
7e50: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7e60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7e70: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7e80: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7eb0: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7ec0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7ed0: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
7f00: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
7f10: 65 72 42 79 20 2b 20 73 69 7a 65 6f 66 28 2a 70  erBy + sizeof(*p
7f20: 48 69 64 64 65 6e 29 20 29 3b 0a 20 20 69 66 28  Hidden) );.  if(
7f30: 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7f50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
7f60: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
7f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7f80: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
7f90: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
7fa0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
7fb0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7fc0: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
7fd0: 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
7fe0: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
7ff0: 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
8000: 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
8010: 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
8020: 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
8030: 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
8040: 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
8050: 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
8060: 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
8070: 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64 65 6e 20  .  */.  pHidden 
8080: 3d 20 28 73 74 72 75 63 74 20 48 69 64 64 65 6e  = (struct Hidden
8090: 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78  IndexInfo*)&pIdx
80a0: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 43  Info[1];.  pIdxC
80b0: 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
80c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
80d0: 74 72 61 69 6e 74 2a 29 26 70 48 69 64 64 65 6e  traint*)&pHidden
80e0: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
80f0: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
8100: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
8110: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
8120: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
8130: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
8140: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
8150: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
8160: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
8170: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
8180: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
8190: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
81a0: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
81b0: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
81c0: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
81d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
81e0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
81f0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
8200: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
8210: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8220: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
8230: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
8240: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
8250: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
8260: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8270: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
8280: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
8290: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
82e0: 55 73 61 67 65 3b 0a 0a 20 20 70 48 69 64 64 65  Usage;..  pHidde
82f0: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
8300: 70 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65 20  pHidden->pParse 
8310: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
8320: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
8330: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
8340: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
8350: 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b 0a 20 20  {.    u16 op;.  
8360: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
8370: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
8380: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
8390: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
83a0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
83b0: 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f  & mUnusable ) co
83c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
83d0: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
83e0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
83f0: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
8400: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8410: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8420: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
8430: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8440: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8450: 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IS );.    testca
8460: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8470: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
8480: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8490: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
84a0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
84b0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
84c0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
84d0: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
84e0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
84f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8500: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
8510: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
8520: 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  t( pTerm->u.left
8530: 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a  Column>=(-1) );.
8540: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8550: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
8560: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
8570: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
8580: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
8590: 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e      op = pTerm->
85a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
85b0: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
85c0: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
85d0: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
85e0: 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20 20 20 20  WO_AUX ){.      
85f0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8600: 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70   pTerm->eMatchOp
8610: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8620: 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  op & (WO_ISNULL|
8630: 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
8640: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  if( op==WO_ISNUL
8650: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  L ){.        pId
8660: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51  xCons[j].op = SQ
8670: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8680: 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20  RAINT_ISNULL;.  
8690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
86a0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
86b0: 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  p = SQLITE_INDEX
86c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b 0a  _CONSTRAINT_IS;.
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
86e0: 65 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  e{.      pIdxCon
86f0: 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f 70  s[j].op = (u8)op
8700: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ;.      /* The d
8710: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
8720: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
8730: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
8740: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
8750: 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20       ** the WO_ 
8760: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
8770: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
8780: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
8790: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
87a0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
87b0: 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61  s verify this fa
87c0: 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ct. */.      ass
87d0: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
87e0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
87f0: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  INT_EQ );.      
8800: 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
8810: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8820: 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
8830: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
8840: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8850: 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
8860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8870: 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
8880: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
8890: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
88a0: 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
88b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
88c0: 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
88d0: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
88e0: 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57 4f 5f 45  ator&(WO_IN|WO_E
88f0: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
8900: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 41 55 58  _GT|WO_GE|WO_AUX
8910: 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
8920: 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  op & (WO_LT|WO_L
8930: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20  E|WO_GT|WO_GE). 
8940: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
8950: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 54 65  ExprIsVector(pTe
8960: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8970: 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t) .      ){.   
8980: 20 20 20 20 20 69 66 28 20 69 3c 31 36 20 29 20       if( i<16 ) 
8990: 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c  mNoOmit |= (1 <<
89a0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
89b0: 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49 64   op==WO_LT ) pId
89c0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f  xCons[j].op = WO
89d0: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _LE;.        if(
89e0: 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49 64   op==WO_GT ) pId
89f0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f  xCons[j].op = WO
8a00: 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _GE;.      }.   
8a10: 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   }..    j++;.  }
8a20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
8a30: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8a40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8a50: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8a60: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
8a70: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
8a80: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8a90: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
8aa0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
8ab0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
8ac0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70  Order;.  }..  *p
8ad0: 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69  mNoOmit = mNoOmi
8ae0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  t;.  return pIdx
8af0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
8b00: 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
8b10: 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
8b20: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8b30: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
8b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
8b50: 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
8b60: 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
8b70: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
8b80: 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
8b90: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
8ba0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
8bb0: 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
8bc0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62  e3_index_info ob
8bd0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d  ject that.** com
8be0: 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64  es in as the 3rd
8bf0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8c00: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
8c10: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8c20: 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
8c30: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
8c40: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8c50: 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
8c60: 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
8c70: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
8c80: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
8c90: 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
8ca0: 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
8cb0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8cc0: 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
8cd0: 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
8ce0: 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
8cf0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
8d00: 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
8d10: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
8d20: 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
8d30: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
8d40: 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
8d50: 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
8d60: 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
8d70: 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
8d80: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
8d90: 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
8da0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
8db0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
8dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8dd0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
8de0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
8df0: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
8e00: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
8e10: 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
8e20: 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
8e30: 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
8e40: 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
8e50: 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
8e60: 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
8e70: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
8e80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
8e90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
8ea0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
8eb0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
8ec0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61  ite3OomFault(pPa
8ed0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65  rse->db);.    }e
8ee0: 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
8ef0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
8f00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8f10: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
8f20: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
8f30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8f40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8f60: 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
8f70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8f80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
8f90: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
8fa0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
8fb0: 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54  0;..#if 0.  /* T
8fc0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 6e 6f 77  his error is now
8fd0: 20 63 61 75 67 68 74 20 62 79 20 74 68 65 20 63   caught by the c
8fe0: 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72  aller..  ** Sear
8ff0: 63 68 20 66 6f 72 20 22 78 42 65 73 74 49 6e 64  ch for "xBestInd
9000: 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20  ex malfunction" 
9010: 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69  below */.  for(i
9020: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
9030: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
9040: 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
9050: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
9060: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
9070: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
9080: 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
9090: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
90a0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
90b0: 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
90c0: 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
90d0: 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
90e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
90f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9100: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
9110: 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
9120: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
9130: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9140: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65  TABLE) */..#ifde
9150: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9160: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
9170: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
9180: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
9190: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
91a0: 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
91b0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
91c0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
91d0: 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
91e0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
91f0: 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
9200: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
9210: 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a   less than pRec.
9220: 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
9230: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
9240: 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
9250: 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pRec.**.** Retu
9260: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
9270: 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20  the sample that 
9280: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  is the smallest 
9290: 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69  sample that.** i
92a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
92b0: 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e  r equal to pRec.
92c0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
92d0: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20  index is not an 
92e0: 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68  index.** into th
92f0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9300: 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64  y - it is an ind
9310: 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61  ex into a virtua
9320: 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  l set of samples
9330: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
9340: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61   contents of aSa
9350: 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e  mple[] and the n
9360: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
9370: 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52  in record .** pR
9380: 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ec. .*/.static i
9390: 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
93a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
93b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
93c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
93d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
93e0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
93f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9400: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
9410: 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
9420: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
9430: 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
9440: 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
9450: 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
9460: 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
9470: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
9480: 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
9490: 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
94a0: 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
94b0: 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
94c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
94d0: 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
94e0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
94f0: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
9500: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
9510: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
9520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9530: 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
9540: 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
9550: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  etc. */.  int i;
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
9580: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e  f first sample >
9590: 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  = pRec */.  int 
95a0: 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  iSample;        
95b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
95c0: 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65  est sample large
95d0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
95e0: 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  to pRec */.  int
95f0: 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
9600: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
9610: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
9620: 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
9630: 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
9640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9650: 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
9660: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9690: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
96a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
96b0: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
96c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
96d0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52   of fields in pR
96e0: 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ec */.  tRowcnt 
96f0: 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20  iLower = 0;     
9700: 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20      /* anLt[] + 
9710: 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73  anEq[] of larges
9720: 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73  t sample pRec is
9730: 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   > */..#ifndef S
9740: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
9750: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
9760: 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66  pParse );.#endif
9770: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21  .  assert( pRec!
9780: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9790: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
97a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
97b0: 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  c->nField>0 && p
97c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64  Rec->nField<=pId
97d0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
97e0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61  ..  /* Do a bina
97f0: 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e  ry search to fin
9800: 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  d the first samp
9810: 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  le greater than 
9820: 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f  or equal.  ** to
9830: 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63   pRec. If pRec c
9840: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
9850: 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20   field, the set 
9860: 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65  of samples to se
9870: 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d  arch.  ** is sim
9880: 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ply the aSample[
9890: 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  ] array. If the 
98a0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
98b0: 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  le[] contain mor
98c0: 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  e.  ** than one 
98d0: 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c  fields, all fiel
98e0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ds following the
98f0: 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72   first are ignor
9900: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
9910: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e   pRec contains N
9920: 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e   fields, where N
9930: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
9940: 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20  e, then as well 
9950: 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70  as the.  ** samp
9960: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9970: 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e   (truncated to N
9980: 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65   fields), the se
9990: 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f  arch also has to
99a0: 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70  .  ** consider p
99b0: 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65  refixes of those
99c0: 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78   samples. For ex
99d0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65  ample, if the se
99e0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a  t of samples.  *
99f0: 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a  * in aSample is:
9a00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61  .  **.  **     a
9a10: 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20  Sample[0] = (a, 
9a20: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9a30: 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30  mple[1] = (a, 10
9a40: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9a50: 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20  ple[2] = (b, 5) 
9a60: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9a70: 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20  e[3] = (c, 100) 
9a80: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9a90: 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a  e[4] = (c, 105).
9aa0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
9ab0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
9ac0: 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62  should ideally b
9ad0: 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62  e the samples ab
9ae0: 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ove and the .  *
9af0: 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65  * unique prefixe
9b00: 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b  s [a], [b] and [
9b10: 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68  c]. But since th
9b20: 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72  at is hard to or
9b30: 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68  ganize, .  ** th
9b40: 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20  e code actually 
9b50: 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65  searches this se
9b60: 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t:.  **.  **    
9b70: 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20   0: (a) .  **   
9b80: 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a    1: (a, 5) .  *
9b90: 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29  *     2: (a, 10)
9ba0: 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61   .  **     3: (a
9bb0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
9bc0: 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20  4: (b) .  **    
9bd0: 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a   5: (b, 5) .  **
9be0: 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a       6: (c) .  *
9bf0: 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30  *     7: (c, 100
9c00: 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28  ) .  **     8: (
9c10: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20  c, 105).  **    
9c20: 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   9: (c, 105).  *
9c30: 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  *.  ** For each 
9c40: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53  sample in the aS
9c50: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e  ample[] array, N
9c60: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65   samples are pre
9c70: 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a  sent in the.  **
9c80: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
9c90: 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20  e array. In the 
9ca0: 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30  above, samples 0
9cb0: 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64   and 1 are based
9cc0: 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   on .  ** sample
9cd0: 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d   aSample[0]. Sam
9ce0: 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20  ples 2 and 3 on 
9cf0: 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a  aSample[1] etc..
9d00: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c    **.  ** Often,
9d10: 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63   sample i of eac
9d20: 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66  h block of N eff
9d30: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68  ective samples h
9d40: 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e  as (i+1) fields.
9d50: 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61  .  ** Except, ea
9d60: 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65  ch sample may be
9d70: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73   extended to ens
9d80: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67  ure that it is g
9d90: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20  reater than or. 
9da0: 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65   ** equal to the
9db0: 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65   previous sample
9dc0: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46   in the array. F
9dd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
9de0: 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20  he above, .  ** 
9df0: 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20  sample 2 is the 
9e00: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20  first sample of 
9e10: 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d  a block of N sam
9e20: 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73  ples, so at firs
9e30: 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61  t it .  ** appea
9e40: 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  rs that it shoul
9e50: 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20  d be 1 field in 
9e60: 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  size. However, t
9e70: 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  hat would make i
9e80: 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20  t .  ** smaller 
9e90: 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73  than sample 1, s
9ea0: 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
9eb0: 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f  rch would not wo
9ec0: 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  rk. As a result,
9ed0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74   .  ** it is ext
9ee0: 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65  ended to two fie
9ef0: 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61  lds. The duplica
9f00: 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72  tes that this cr
9f10: 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20  eates do not .  
9f20: 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
9f30: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46  blems..  */.  nF
9f40: 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69  ield = pRec->nFi
9f50: 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b  eld;.  iCol = 0;
9f60: 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  iSample = pId
9f70: 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69  x->nSample * nFi
9f80: 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  eld;.  do{.    i
9f90: 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20  nt iSamp;       
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fb0: 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65  Index in aSample
9fc0: 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c  [] of test sampl
9fd0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  e */.    int n; 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a000: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65   of fields in te
a010: 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20  st sample */..  
a020: 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
a030: 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20  iSample)/2;.    
a040: 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20  iSamp = iTest / 
a050: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
a060: 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  iSamp>0 ){.     
a070: 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64   /* The proposed
a080: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a090: 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  e is a prefix of
a0a0: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
a0b0: 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a  iSamp]..      **
a0c0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
a0d0: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
a0e0: 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ix of at least (
a0f0: 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64  1 + iTest%nField
a100: 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c  ) .      ** fiel
a110: 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74  ds that is great
a120: 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
a130: 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73  ious effective s
a140: 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  ample.  */.     
a150: 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20   for(n=(iTest % 
a160: 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e  nField) + 1; n<n
a170: 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Field; n++){.   
a180: 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
a190: 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e  [iSamp-1].anLt[n
a1a0: 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61  -1]!=aSample[iSa
a1b0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20  mp].anLt[n-1] ) 
a1c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a1d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a1e0: 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20  n = iTest + 1;. 
a1f0: 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e     }..    pRec->
a200: 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20  nField = n;.    
a210: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
a220: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a230: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c  Sample[iSamp].n,
a240: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
a250: 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66  p, pRec);.    if
a260: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
a270: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
a280: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
a290: 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61  1] + aSample[iSa
a2a0: 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20  mp].anEq[n-1];. 
a2b0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
a2c0: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t+1;.    }else i
a2d0: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e  f( res==0 && n<n
a2e0: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69  Field ){.      i
a2f0: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
a300: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a310: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
a320: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65  Test+1;.      re
a330: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  s = -1;.    }els
a340: 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65  e{.      iSample
a350: 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20   = iTest;.      
a360: 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20  iCol = n-1;.    
a370: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
a380: 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20  && iMin<iSample 
a390: 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65  );.  i = iSample
a3a0: 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64   / nField;..#ifd
a3b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a3c0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
a3d0: 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
a3e0: 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
a3f0: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
a400: 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
a410: 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
a420: 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
a430: 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
a440: 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
a450: 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
a460: 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
a470: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
a480: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a490: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
a4a0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
a4b0: 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
a4c0: 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63   true, then pRec
a4d0: 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
a4e0: 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20  o sample i. */. 
a4f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
a500: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
a510: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
a520: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
a530: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
a540: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
a550: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
a560: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a570: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a580: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a590: 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20  p, pRec) .      
a5a0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
a5b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a5c0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d   .      );.    }
a5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
a5e0: 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e  nless i==pIdx->n
a5f0: 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69  Sample, indicati
a600: 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20  ng that pRec is 
a610: 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
a620: 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73    ** all samples
a630: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
a640: 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75  ] array, pRec mu
a650: 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
a660: 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  an the.      ** 
a670: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
a680: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
a690: 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  i.  */.      ass
a6a0: 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53  ert( i<=pIdx->nS
a6b0: 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b  ample && i>=0 );
a6c0: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
a6d0: 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  eld = iCol+1;.  
a6e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
a6f0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
a700: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
a710: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a720: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
a730: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
a740: 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
a750: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a760: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a770: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  );..      /* if 
a780: 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30  i==0 and iCol==0
a790: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52  , then record pR
a7a0: 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ec is smaller th
a7b0: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20  an all samples. 
a7c0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61       ** in the a
a7d0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
a7e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69  Otherwise, if (i
a7f0: 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63  Col>0) then pRec
a800: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
a810: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
a820: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28  r equal to the (
a830: 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66  iCol) field pref
a840: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a  ix of sample i..
a850: 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30        ** If (i>0
a860: 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  ), then pRec mus
a870: 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65  t also be greate
a880: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69  r than sample (i
a890: 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  -1).  */.      i
a8a0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
a8b0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
a8c0: 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  d = iCol;.      
a8d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a8e0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
a8f0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
a900: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
a910: 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20  Rec)<=0.        
a920: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
a930: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a940: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
a950: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
a960: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
a970: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
a980: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a990: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a9a0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
a9b0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
a9c0: 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
a9d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
a9e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
a9f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
aa00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa10: 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
aa20: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66  E_DEBUG */..  if
aa30: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
aa40: 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69  /* Record pRec i
aa50: 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  s equal to sampl
aa60: 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e i */.    asser
aa70: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
aa80: 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  1 );.    aStat[0
aa90: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
aaa0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
aab0: 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
aac0: 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
aad0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
aae0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
aaf0: 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65  the (iCol+1) fie
ab00: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61  ld prefix of aSa
ab10: 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
ab20: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d  irst .    ** sam
ab30: 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
ab40: 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f  ter than pRec. O
ab50: 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  r, if i==pIdx->n
ab60: 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63  Sample then pRec
ab70: 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65  .    ** is large
ab80: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
ab90: 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  es in the array.
aba0: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
abb0: 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
abc0: 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e    if( i>=pIdx->n
abd0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
abe0: 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
abf0: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
ac00: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
ac10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ac20: 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
ac30: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
ac40: 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l];.    }..    i
ac50: 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
ac60: 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
ac70: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
ac80: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
ac90: 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
aca0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
acb0: 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
acc0: 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
acd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ace0: 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
acf0: 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
ad00: 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
ad10: 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  ap;.    aStat[1]
ad20: 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
ad30: 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a  nField-1];.  }..
ad40: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
ad50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
ad60: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
ad70: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
ad80: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
ad90: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
ada0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
adb0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
adc0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
add0: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
ade0: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
adf0: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
ae00: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
ae10: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
ae20: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
ae30: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
ae40: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
ae50: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
ae60: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
ae70: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
ae80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ae90: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
aea0: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
aeb0: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
aec0: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
aed0: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
aee0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
aef0: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
af00: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
af10: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
af20: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
af30: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
af40: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
af50: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
af60: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
af70: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
af80: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
af90: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
afa0: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
afb0: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
afc0: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
afd0: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
afe0: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
aff0: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
b000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
b010: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
b020: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
b030: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
b040: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
b050: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
b060: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
b070: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
b080: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
b090: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
b0a0: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
b0b0: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
b0c0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
b0d0: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
b0e0: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
b0f0: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
b100: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
b110: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
b120: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
b130: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b140: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
b150: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
b160: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
b170: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
b180: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
b190: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e  /.char sqlite3In
b1a0: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
b1b0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  y(sqlite3 *db, I
b1c0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
b1d0: 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  iCol){.  assert(
b1e0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
b1f0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
b200: 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a  ;.  if( !pIdx->z
b210: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66  ColAff ){.    if
b220: 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  ( sqlite3IndexAf
b230: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49  finityStr(db, pI
b240: 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dx)==0 ) return 
b250: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
b260: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
b270: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c  dx->zColAff[iCol
b280: 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  ];.}.#endif...#i
b290: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b2a0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
b2b0: 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
b2c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b2d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b2e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b2f0: 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
b300: 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
b310: 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
b320: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
b330: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
b340: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
b350: 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
b360: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
b370: 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
b380: 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
b390: 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
b3a0: 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
b3b0: 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
b3c0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
b3d0: 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
b3e0: 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
b3f0: 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
b400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
b410: 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
b420: 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
b430: 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
b440: 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
b450: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
b460: 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
b470: 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
b480: 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
b490: 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
b4a0: 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
b4b0: 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
b4c0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
b4d0: 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
b4e0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
b4f0: 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
b500: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
b510: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
b520: 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
b530: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
b540: 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
b550: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
b560: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b570: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
b580: 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
b590: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
b5a0: 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
b5b0: 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
b5c0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
b5d0: 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
b5e0: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
b5f0: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
b600: 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
b610: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
b620: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
b630: 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
b640: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
b650: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
b660: 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
b670: 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
b680: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
b690: 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
b6a0: 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
b6b0: 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
b6c0: 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
b6d0: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
b6e0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
b6f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
b700: 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
b710: 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
b720: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
b730: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
b740: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b750: 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
b760: 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
b770: 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
b780: 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
b790: 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
b7a0: 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
b7b0: 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
b7c0: 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
b7d0: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
b7e0: 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
b7f0: 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
b800: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
b810: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
b820: 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
b830: 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
b840: 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
b850: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
b860: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
b870: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
b880: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
b890: 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
b8a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
b8b0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
b8c0: 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
b8d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b8e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b8f0: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
b900: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b910: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
b920: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
b930: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
b940: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
b950: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
b960: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
b970: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
b980: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
b990: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
b9a0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
b9b0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
b9c0: 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
b9d0: 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
b9e0: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
b9f0: 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
ba00: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
ba10: 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
ba20: 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
ba30: 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
ba40: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
ba50: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
ba60: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
ba70: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
ba80: 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
ba90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
baa0: 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
bab0: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
bac0: 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
bad0: 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
bae0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
baf0: 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  f = sqlite3Index
bb00: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64  ColumnAffinity(d
bb10: 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f  b, p, nEq);.  Co
bb20: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
bb30: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
bb40: 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20   *p1 = 0;       
bb50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
bb60: 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
bb70: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
bb80: 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20  alue *p2 = 0;   
bb90: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
bba0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
bbb0: 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  Upper */.  sqlit
bbc0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
bbd0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61   0;        /* Va
bbe0: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
bbf0: 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20  om record */..  
bc00: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
bc10: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
bc20: 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e  rse, p->azColl[n
bc30: 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77  Eq]);.  if( pLow
bc40: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  er ){.    rc = s
bc50: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
bc60: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
bc70: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
bc80: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31  pRight, aff, &p1
bc90: 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20  );.    nLower = 
bca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70  0;.  }.  if( pUp
bcb0: 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  per && rc==SQLIT
bcc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
bcd0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
bce0: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
bcf0: 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72  e, pUpper->pExpr
bd00: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
bd10: 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20  p2);.    nUpper 
bd20: 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53  = p2 ? 0 : p->nS
bd30: 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  ample;.  }..  if
bd40: 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20  ( p1 || p2 ){.  
bd50: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
bd60: 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28   nDiff;.    for(
bd70: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
bd80: 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70  OK && i<p->nSamp
bd90: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
bda0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
bdb0: 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61  4Column(db, p->a
bdc0: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e  Sample[i].p, p->
bdd0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45  aSample[i].n, nE
bde0: 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  q, &pVal);.     
bdf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
be00: 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20  OK && p1 ){.    
be10: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
be20: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
be30: 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p1, pVal, pColl)
be40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
be50: 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b  s>=0 ) nLower++;
be60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
be80: 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20   && p2 ){.      
be90: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
bea0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32  te3MemCompare(p2
beb0: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
bec0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
bed0: 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20  =0 ) nUpper++;. 
bee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bef0: 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72   nDiff = (nUpper
bf00: 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - nLower);.    
bf10: 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e  if( nDiff<=0 ) n
bf20: 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Diff = 1;..    /
bf30: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
bf40: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
bf50: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63  lower bound spec
bf60: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a  ified, and the .
bf70: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
bf80: 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  ns indicate that
bf90: 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20   they are close 
bfa0: 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74 68  together, use th
bfb0: 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e fallback.    *
bfc0: 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65  * method (assume
bfd0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 76   that the scan v
bfe0: 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68  isits 1/64 of th
bff0: 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69  e rows) for esti
c000: 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  mating.    ** th
c010: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c020: 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77   visited. Otherw
c030: 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68  ise, estimate th
c040: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c050: 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
c060: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
c070: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
c080: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69   comment for thi
c090: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
c0a0: 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20     if( nDiff!=1 
c0b0: 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  || pUpper==0 || 
c0c0: 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pLower==0 ){.   
c0d0: 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d     int nAdjust =
c0e0: 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28   (sqlite3LogEst(
c0f0: 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71  p->nSample) - sq
c100: 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66  lite3LogEst(nDif
c110: 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  f));.      pLoop
c120: 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73  ->nOut -= nAdjus
c130: 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65  t;.      *pbDone
c140: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
c150: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72  ETRACE(0x10, ("r
c160: 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72  ange skip-scan r
c170: 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20  egions: %u..%u  
c180: 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64  adjust=%d est=%d
c190: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20  nLower, nUpper, 
c1c0: 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
c1d0: 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
c1e0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
c1f0: 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
c200: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
c210: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
c220: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
c230: 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
c240: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
c250: 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
c260: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c270: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c280: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
c290: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c2a0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
c2b0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
c2c0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
c2d0: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
c2e0: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
c2f0: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
c300: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
c310: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
c320: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
c330: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
c340: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
c350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
c360: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
c370: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
c380: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
c390: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
c3a0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
c3b0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
c3c0: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
c3d0: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
c3e0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
c3f0: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
c400: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
c410: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
c440: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
c460: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
c490: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
c4a0: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
c4b0: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
c4c0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
c4d0: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
c4e0: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
c4f0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
c500: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
c510: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
c520: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
c530: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
c540: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c550: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
c560: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
c570: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c580: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
c590: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
c5a0: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
c5b0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
c5c0: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
c5d0: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
c5e0: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
c5f0: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
c600: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
c610: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
c620: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
c630: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
c640: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
c650: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
c660: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
c670: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
c680: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
c690: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
c6a0: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
c6b0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
c6c0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
c6d0: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
c6e0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
c6f0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
c700: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
c710: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
c720: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
c730: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
c740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c750: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
c760: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
c770: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
c780: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
c790: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
c7a0: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
c7b0: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
c7c0: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
c7d0: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
c7e0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
c7f0: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
c800: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
c810: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
c820: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
c830: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
c840: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
c850: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
c860: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
c870: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
c880: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
c890: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
c8a0: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
c8b0: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
c8c0: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
c8d0: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
c8e0: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
c8f0: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
c900: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
c910: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
c920: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
c930: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
c940: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
c950: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
c960: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
c970: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
c980: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
c990: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
c9a0: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
c9b0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
c9c0: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
c9d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c9e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
c9f0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
ca00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
ca10: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
ca20: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
ca30: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
ca40: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
ca50: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
ca60: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
ca70: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
ca80: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
ca90: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
caa0: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
cab0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
cac0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
cad0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
cae0: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
caf0: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
cb00: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
cb10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cb20: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
cb30: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
cb40: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
cb50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cb60: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
cb70: 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70  STAT4.  Index *p
cb80: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
cb90: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
cba0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
cbb0: 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28  tree.nEq;..  if(
cbc0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26   p->nSample>0 &&
cbd0: 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43   nEq<p->nSampleC
cbe0: 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  ol.   && Optimiz
cbf0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
cc00: 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
cc10: 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20  Stat34).  ){.   
cc20: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
cc30: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
cc40: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
cc50: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
cc60: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
cc70: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
cc80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d  ;.      int nBtm
cc90: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
cca0: 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e  e.nBtm;.      in
ccb0: 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  t nTop = pLoop->
ccc0: 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20  u.btree.nTop;.. 
ccd0: 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
cce0: 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
ccf0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
cd00: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
cd10: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
cd20: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
cd30: 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
cd40: 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
cd50: 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
cd60: 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20   query. The.    
cd70: 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64    ** lower bound
cd80: 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61   being the conca
cd90: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61  tenation of $P a
cda0: 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20  nd $L, where $P 
cdb0: 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
cdc0: 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65  key-prefix forme
cdd0: 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c  d by the nEq val
cde0: 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69  ues matched agai
cdf0: 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74  nst the nEq left
ce00: 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63  -most.      ** c
ce10: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
ce20: 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74  dex, and $L is t
ce30: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77  he value in pLow
ce40: 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
ce50: 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f     ** Or, if pLo
ce60: 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24  wer is NULL or $
ce70: 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  L cannot be extr
ce80: 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62  acted from it (b
ce90: 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
cea0: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  ** is not a simp
ceb0: 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c  le variable or l
cec0: 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74  iteral value), t
ced0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
cee0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  f the.      ** r
cef0: 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
cf00: 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
cf10: 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
cf20: 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
cf30: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c  n.      ** if $L
cf40: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77   is available, w
cf50: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69  hereKeyStats() i
cf60: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74  s called for bot
cf70: 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20  h ($P) and .    
cf80: 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64    ** ($P:$L) and
cf90: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
cfa0: 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20  he two returned 
cfb0: 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a  values is used..
cfc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
cfd0: 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
cfe0: 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
cff0: 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
d000: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
d010: 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
d020: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
d030: 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
d040: 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
d050: 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
d060: 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
d070: 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
d080: 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
d090: 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
d0a0: 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
d0b0: 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
d0c0: 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
d0d0: 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
d0e0: 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
d0f0: 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
d100: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d110: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
d120: 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ws between the t
d130: 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65  wo bounds is the
d140: 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c  n just iUpper-iL
d150: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ower..      */. 
d160: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f       tRowcnt iLo
d170: 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  wer;     /* Rows
d180: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
d190: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
d1a0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
d1b0: 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
d1c0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
d1d0: 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  per bound */.   
d1e0: 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d     int iLwrIdx =
d1f0: 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -2;   /* aSampl
d200: 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  e[] for the lowe
d210: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
d220: 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d   int iUprIdx = -
d230: 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  1;   /* aSample[
d240: 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20  ] for the upper 
d250: 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20  bound */..      
d260: 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
d270: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
d280: 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
d290: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
d2a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
d2b0: 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
d2c0: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
d2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
d2e0: 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72  Determine iLower
d2f0: 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e   and iUpper usin
d300: 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a  g ($P) only. */.
d310: 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30        if( nEq==0
d320: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
d330: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
d340: 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77  iUpper = p->nRow
d350: 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Est0;.      }els
d360: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
d370: 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f  te: this call co
d380: 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  uld be optimized
d390: 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68   away - since th
d3a0: 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75  e same values mu
d3b0: 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  st .        ** h
d3c0: 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
d3d0: 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
d3e0: 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
d3f0: 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
d400: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  */.        where
d410: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
d420: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
d430: 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20  .        iLower 
d440: 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
d450: 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20  iUpper = a[0] + 
d460: 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  a[1];.      }.. 
d470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
d480: 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65  wer==0 || (pLowe
d490: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d4a0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
d4b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d4c0: 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
d4d0: 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
d4e0: 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
d4f0: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
d500: 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f  ssert( p->aSortO
d510: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
d520: 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64   if( p->aSortOrd
d530: 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20  er[nEq] ){.     
d540: 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20     /* The roles 
d550: 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  of pLower and pU
d560: 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64  pper are swapped
d570: 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65   for a DESC inde
d580: 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41  x */.        SWA
d590: 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c  P(WhereTerm*, pL
d5a0: 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20  ower, pUpper);. 
d5b0: 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c         SWAP(int,
d5c0: 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20   nBtm, nTop);.  
d5d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d5e0: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
d5f0: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
d600: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
d610: 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
d620: 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
d630: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
d660: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
d670: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
d680: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
d690: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
d6a0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
d6b0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
d6c0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
d6d0: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
d6e0: 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e  r, nBtm, nEq, &n
d6f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d710: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
d720: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
d730: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
d740: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
d750: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
d760: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
d770: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
d780: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
d790: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c  T);.          iL
d7a0: 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  wrIdx = whereKey
d7b0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
d7c0: 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
d7d0: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
d7e0: 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e  [0] + ((pLower->
d7f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
d800: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
d810: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
d820: 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
d830: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
d840: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
d850: 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
d860: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d870: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
d880: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
d890: 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
d8a0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
d8b0: 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
d8c0: 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
d8d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
d900: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
d910: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
d920: 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
d930: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
d940: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d950: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
d960: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
d970: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
d980: 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b   nTop, nEq, &n);
d990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
d9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
d9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
d9c0: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
d9d0: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
d9e0: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
d9f0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
da00: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
da10: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
da20: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
da30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72  ;.          iUpr
da40: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
da50: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
da60: 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20  Rec, 1, a);.    
da70: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
da80: 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f  ] + ((pUpper->eO
da90: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
daa0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
dab0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c         if( iNew<
dac0: 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  iUpper ) iUpper 
dad0: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
dae0: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
daf0: 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a      pUpper = 0;.
db00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db10: 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65  }..      pBuilde
db20: 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
db30: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
db40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
db50: 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
db60: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
db70: 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
db80: 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
db90: 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20  iLower);.       
dba0: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49     /* TUNING:  I
dbb0: 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e  f both iUpper an
dbc0: 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72  d iLower are der
dbd0: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61  ived from the sa
dbe0: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
dbf0: 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73  sample, then ass
dc00: 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20  ume they are 4x 
dc10: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20  more selective. 
dc20: 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20   This brings.   
dc30: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73         ** the es
dc40: 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76  timated selectiv
dc50: 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65  ity more in line
dc60: 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f   with what it wo
dc70: 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20  uld be.         
dc80: 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64   ** if estimated
dc90: 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65   without the use
dca0: 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c   of STAT3/4 tabl
dcb0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
dcc0: 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55   if( iLwrIdx==iU
dcd0: 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20  prIdx ) nNew -= 
dce0: 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d  20;  assert( 20=
dcf0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
dd00: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ) );.        }el
dd10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
dd20: 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
dd30: 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
dd40: 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
dd50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd60: 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
dd70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
dd80: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
dd90: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
dda0: 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
ddb0: 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
ddc0: 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
ddd0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ddf0: 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
de00: 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
de10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
de20: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
de30: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
de40: 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
de50: 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
de60: 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
de70: 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
de80: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
de90: 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
dea0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
deb0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
dec0: 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
ded0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
dee0: 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
def0: 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
df00: 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
df10: 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
df20: 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
df30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
df40: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
df50: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
df60: 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
df70: 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
df80: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
df90: 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
dfa0: 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
dfb0: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
dfc0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
dfd0: 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20  mit and neither 
dfe0: 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61  limit.  ** has a
dff0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65  n application-de
e000: 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64  fined likelihood
e010: 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72  (), assume the r
e020: 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64  ange is.  ** red
e030: 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74  uced by an addit
e040: 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20  ional 75%. This 
e050: 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64  means that, by d
e060: 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d  efault, an open-
e070: 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65  ended.  ** range
e080: 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c   query (e.g. col
e090: 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64   > ?) is assumed
e0a0: 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66   to match 1/4 of
e0b0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
e0c0: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69  .  ** index. Whi
e0d0: 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67  le a closed rang
e0e0: 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57  e (e.g. col BETW
e0f0: 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20  EEN ? AND ?) is 
e100: 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a  estimated to.  *
e110: 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20  * match 1/64 of 
e120: 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20  the index. */ . 
e130: 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70   if( pLower && p
e140: 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Lower->truthProb
e150: 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20  >0 && pUpper && 
e160: 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f  pUpper->truthPro
e170: 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  b>0 ){.    nNew 
e180: 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f  -= 20;.  }..  nO
e190: 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30  ut -= (pLower!=0
e1a0: 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b  ) + (pUpper!=0);
e1b0: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29  .  if( nNew<10 )
e1c0: 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66   nNew = 10;.  if
e1d0: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f  ( nNew<nOut ) nO
e1e0: 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64  ut = nNew;.#if d
e1f0: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
e200: 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
e210: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75   pLoop->nOut>nOu
e220: 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  t ){.    WHERETR
e230: 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65  ACE(0x10,("Range
e240: 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75   scan lowers nOu
e250: 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  t from %d to %d\
e260: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e270: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
e280: 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d  Out, nOut));.  }
e290: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d  .#endif.  pLoop-
e2a0: 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
e2b0: 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  nOut;.  return r
e2c0: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
e2d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
e2e0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
e2f0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
e300: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
e310: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e320: 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
e330: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
e340: 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
e350: 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
e360: 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
e370: 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
e380: 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
e390: 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
e3a0: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
e3b0: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
e3c0: 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
e3d0: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
e3e0: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
e3f0: 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
e400: 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
e410: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
e420: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
e430: 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
e440: 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
e450: 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
e460: 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
e470: 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
e480: 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
e490: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
e4a0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
e4b0: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
e4c0: 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
e4d0: 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
e4e0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
e4f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e500: 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
e510: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
e520: 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
e530: 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
e540: 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
e550: 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
e560: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
e570: 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
e580: 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
e590: 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
e5a0: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
e5b0: 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
e5c0: 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
e5d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
e5e0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
e5f0: 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
e600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e610: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
e620: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
e630: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
e640: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
e650: 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72  pBuilder,.  Expr
e660: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
e670: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
e680: 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
e690: 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
e6a0: 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
e6b0: 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
e6c0: 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
e6d0: 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
e6e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
e6f0: 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
e700: 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
e710: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
e720: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
e730: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
e740: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
e750: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
e760: 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72  r->pRec;.  int r
e770: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
e780: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
e790: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
e7a0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
e7b0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
e7c0: 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
e7d0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73    int bOk;..  as
e7e0: 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a  sert( nEq>=1 );.
e7f0: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70    assert( nEq<=p
e800: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ->nColumn );.  a
e810: 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
e820: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
e830: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
e840: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  ;.  assert( pBui
e850: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e860: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nEq );..  /* If 
e870: 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61  values are not a
e880: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
e890: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69   fields of the i
e8a0: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74  ndex to the left
e8b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
e8c0: 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63  e, no estimate c
e8d0: 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75  an be made. Retu
e8e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
e8f0: 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ND. */.  if( pBu
e900: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e910: 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20  <(nEq-1) ){.    
e920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e930: 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f  TFOUND;.  }..  /
e940: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
e950: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
e960: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
e970: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
e980: 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c  Value().  ** bel
e990: 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  ow would return 
e9a0: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20  the same value. 
e9b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70   */.  if( nEq>=p
e9c0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
e9d0: 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20   *pnRow = 1;.   
e9e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e9f0: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  K;.  }..  rc = s
ea00: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
ea10: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
ea20: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
ea30: 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b  , 1, nEq-1, &bOk
ea40: 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  );.  pBuilder->p
ea50: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66  Rec = pRec;.  if
ea60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ea70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
ea80: 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75  f( bOk==0 ) retu
ea90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
eaa0: 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  ND;.  pBuilder->
eab0: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b  nRecValid = nEq;
eac0: 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74  ..  whereKeyStat
ead0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
eae0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52  c, 0, a);.  WHER
eaf0: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71  ETRACE(0x10,("eq
eb00: 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
eb10: 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e  ons %s(%d): %d\n
eb20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
eb30: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20        p->zName, 
eb40: 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d  nEq-1, (int)a[1]
eb50: 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
eb60: 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
eb70: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
eb80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
eb90: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
eba0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ebb0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
ebc0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
ebd0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
ebe0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
ebf0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
ec00: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
ec10: 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
ec20: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
ec30: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
ec40: 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
ec50: 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
ec60: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
ec70: 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
ec80: 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
ec90: 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
eca0: 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
ecb0: 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
ecc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ecd0: 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
ece0: 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
ecf0: 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
ed00: 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
ed10: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
ed20: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
ed30: 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
ed40: 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
ed50: 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
ed60: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
ed70: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
ed80: 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
ed90: 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
eda0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
edb0: 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
edc0: 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
edd0: 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
ede0: 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
edf0: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
ee00: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
ee10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ee20: 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
ee30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ee40: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ee50: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
ee60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ee70: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
ee80: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
ee90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
eea0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
eeb0: 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
eec0: 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
eed0: 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
eee0: 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
eef0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
ef00: 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
ef10: 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
ef20: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
ef30: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
ef40: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
ef50: 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
ef60: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
ef70: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
ef80: 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  );.  int nRecVal
ef90: 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
efa0: 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
efb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
efc0: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
efd0: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
efe0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
eff0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
f000: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
f010: 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
f020: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
f030: 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
f040: 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
f050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
f060: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
f0a0: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
f0b0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
f0c0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
f0d0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f0e0: 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77  .    nEst = nRow
f0f0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
f100: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
f110: 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
f120: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f130: 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
f140: 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
f150: 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
f160: 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
f170: 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
f180: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f190: 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
f1a0: 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45   > nRow0 ) nRowE
f1b0: 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
f1c0: 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
f1d0: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
f1e0: 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
f1f0: 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c  stimate: est=%d\
f200: 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
f210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
f220: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
f230: 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
f240: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f250: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
f260: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
f270: 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66  TAT4 */...#ifdef
f280: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
f290: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
f2a0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
f2b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
f2c0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
f2d0: 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
f2e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f2f0: 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20  , int iTerm){.  
f300: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
f310: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f320: 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33  Printf("TERM-%-3
f330: 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d  d NULL\n", iTerm
f340: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f350: 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20  char zType[4];. 
f360: 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30     char zLeft[50
f370: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  ];.    memcpy(zT
f380: 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
f390: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
f3a0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
f3b0: 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
f3c0: 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20   = 'V';.    if( 
f3d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f3e0: 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
f3f0: 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
f400: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
f410: 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
f420: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
f430: 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27  ) ) zType[2] = '
f440: 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  L';.    if( pTer
f450: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f460: 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20  O_SINGLE ){.    
f470: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f480: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f490: 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64  ,zLeft,"left={%d
f4a0: 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
f4c0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c  erm->leftCursor,
f4d0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
f4e0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
f4f0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
f500: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
f510: 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70  =0 && pTerm->u.p
f520: 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20  OrInfo!=0 ){.   
f530: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
f540: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ntf(sizeof(zLeft
f550: 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62  ),zLeft,"indexab
f560: 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20  le=0x%lld", .   
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72      pTerm->u.pOr
f590: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29  Info->indexable)
f5a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f5b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
f5c0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ntf(sizeof(zLeft
f5d0: 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64  ),zLeft,"left=%d
f5e0: 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  ", pTerm->leftCu
f5f0: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
f600: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f610: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52  ntf(.       "TER
f620: 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31  M-%-3d %p %s %-1
f630: 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d  2s prob=%-3d op=
f640: 30 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30  0x%03x wtFlags=0
f650: 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69  x%04x",.       i
f660: 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79  Term, pTerm, zTy
f670: 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d  pe, zLeft, pTerm
f680: 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20  ->truthProb,.   
f690: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
f6a0: 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46  ator, pTerm->wtF
f6b0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
f6c0: 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a  Term->iField ){.
f6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f6e0: 75 67 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c  ugPrintf(" iFiel
f6f0: 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e  d=%d\n", pTerm->
f700: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c  iField);.    }el
f710: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f720: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
f730: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ");.    }.    sq
f740: 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
f750: 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
f760: 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
f770: 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
f780: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
f790: 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f  *.** Show the co
f7a0: 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
f7b0: 66 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a  f a WhereClause.
f7c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
f7d0: 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28  hereClausePrint(
f7e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
f7f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
f800: 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54  r(i=0; i<pWC->nT
f810: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77  erm; i++){.    w
f820: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70  hereTermPrint(&p
f830: 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
f840: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
f850: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
f860: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
f870: 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
f880: 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
f890: 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
f8a0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
f8b0: 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
f8c0: 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
f8d0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
f8e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
f8f0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
f900: 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
f910: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
f920: 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63  rc+3)/4;.  struc
f930: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
f940: 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
f950: 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
f960: 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
f970: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
f980: 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41  ab;.  Bitmask mA
f990: 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29  ll = (((Bitmask)
f9a0: 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b  1)<<(nb*4)) - 1;
f9b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f9c0: 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a  rintf("%c%2d.%0*
f9d0: 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
f9e0: 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
f9f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
fa00: 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
fa10: 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
fa20: 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c  q & mAll);.  sql
fa30: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fa40: 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20  " %12s",.       
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
fa60: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
fa70: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
fa80: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
fa90: 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
faa0: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
fab0: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  LE)==0 ){.    co
fac0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
fad0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74  .    if( p->u.bt
fae0: 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a  ree.pIndex && (z
faf0: 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65  Name = p->u.btre
fb00: 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
fb10: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
fb20: 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
fb30: 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
fb40: 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
fb50: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
fb60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
fb70: 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
fb80: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
fb90: 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
fba0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
fbb0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
fbc0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
fbd0: 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22  ntf(".%-16s %2d"
fbe0: 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
fbf0: 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
fc00: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
fc10: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
fc20: 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  20s","");.    }.
fc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
fc40: 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
fc50: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
fc60: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
fc70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
fc80: 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
fca0: 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
fcb0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
fcc0: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
fcd0: 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
fce0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
fcf0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
fd00: 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
fd10: 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
fd20: 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
fd30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
fd40: 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
fd50: 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  9s", z);.    sql
fd60: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
fd70: 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  }.  if( p->wsFla
fd80: 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
fd90: 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  CAN ){.    sqlit
fda0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
fdb0: 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70  f %05x %d-%d", p
fdc0: 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
fdd0: 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a  Term,p->nSkip);.
fde0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
fdf0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fe00: 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20  " f %05x N %d", 
fe10: 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
fe20: 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71  LTerm);.  }.  sq
fe30: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
fe40: 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64  (" cost %d,%d,%d
fe50: 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20  \n", p->rSetup, 
fe60: 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
fe70: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65  );.  if( p->nLTe
fe80: 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68  rm && (sqlite3Wh
fe90: 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
fea0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
feb0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
fec0: 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b  i<p->nLTerm; i++
fed0: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65  ){.      whereTe
fee0: 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72  rmPrint(p->aLTer
fef0: 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  m[i], i);.    }.
ff00: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
ff10: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b  .** Convert bulk
ff20: 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76   memory into a v
ff30: 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74  alid WhereLoop t
ff40: 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65  hat can be passe
ff50: 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f  d.** to whereLoo
ff60: 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c  pClear harmlessl
ff70: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ff80: 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28  d whereLoopInit(
ff90: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
ffa0: 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e   p->aLTerm = p->
ffb0: 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70  aLTermSpace;.  p
ffc0: 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
ffd0: 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61  p->nLSlot = Arra
ffe0: 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53  ySize(p->aLTermS
fff0: 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c  pace);.  p->wsFl
10000 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ags = 0;.}../*.*
10010 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72  * Clear the Wher
10020 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20  eLoop.u union.  
10030 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e  Leave WhereLoop.
10040 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a  pLTerm intact..*
10050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10060 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
10070 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  n(sqlite3 *db, W
10080 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10090 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
100a0 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54   (WHERE_VIRTUALT
100b0 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f  ABLE|WHERE_AUTO_
100c0 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66  INDEX) ){.    if
100d0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
100e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
100f0 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76  LE)!=0 && p->u.v
10100 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
10110 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10120 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ee(p->u.vtab.idx
10130 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75  Str);.      p->u
10140 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
10150 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76   0;.      p->u.v
10160 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a  tab.idxStr = 0;.
10170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
10180 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10190 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
101a0 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70   && p->u.btree.p
101b0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
101c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
101d0 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
101e0 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Index->zColAff);
101f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
10200 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e  FreeNN(db, p->u.
10210 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20  btree.pIndex);. 
10220 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
10230 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
10240 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
10250 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e  eallocate intern
10260 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  al memory used b
10270 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  y a WhereLoop ob
10280 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
10290 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
102a0 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
102b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
102c0 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
102d0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
102e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
102f0 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
10300 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
10310 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
10320 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
10330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
10340 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
10350 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
10360 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
10370 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
10380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10390 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
103a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
103b0 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
103c0 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
103d0 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
103e0 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
103f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10400 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
10410 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
10420 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10430 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
10440 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20  m[0])*n);.  if( 
10450 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  paNew==0 ) retur
10460 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10470 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61  KPT;.  memcpy(pa
10480 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20  New, p->aLTerm, 
10490 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
104a0 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b  [0])*p->nLSlot);
104b0 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
104c0 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
104d0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
104e0 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  NN(db, p->aLTerm
104f0 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
10500 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
10510 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
10520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10530 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
10540 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
10550 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
10560 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
10570 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10580 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
10590 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
105a0 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
105b0 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
105c0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
105d0 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
105e0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
105f0 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
10600 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
10610 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
10620 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
10630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10640 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10650 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f    }.  memcpy(pTo
10660 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
10670 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
10680 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
10690 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
106a0 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
106b0 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
106c0 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
106d0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
106e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
106f0 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
10700 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
10710 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
10720 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
10730 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
10740 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
10750 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
10760 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
10770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
10790 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
107a0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
107b0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
107c0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
107d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
107e0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
107f0 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
10800 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
10810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
10820 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
10830 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
10840 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
10850 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
10860 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
10870 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
10880 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d  assert( pWInfo!=
10890 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
108a0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
108b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ; i++){.    Wher
108c0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
108d0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
108e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
108f0 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65  pWLoop && (pLeve
10900 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
10910 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
10920 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  LE) ){.      sql
10930 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10940 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
10950 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oop);.    }.  }.
10960 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
10970 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
10980 6f 2d 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65  o->sWC);.  while
10990 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
109a0 20 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   ){.    WhereLoo
109b0 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  p *p = pWInfo->p
109c0 4c 6f 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66  Loops;.    pWInf
109d0 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
109e0 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  NextLoop;.    wh
109f0 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62  ereLoopDelete(db
10a00 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , p);.  }.  sqli
10a10 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
10a20 70 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pWInfo);.}../*.*
10a30 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10a40 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
10a50 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
10a60 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68  **.**   (1)  X h
10a70 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
10a80 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59  ower cost that Y
10a90 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 75 73 65  .**   (2)  X use
10aa0 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c  s fewer WHERE cl
10ab0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
10ac0 59 0a 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72  Y.**   (3)  Ever
10ad0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
10ae0 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
10af0 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a   also used by Y.
10b00 2a 2a 20 20 20 28 34 29 20 20 58 20 73 6b 69 70  **   (4)  X skip
10b10 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61  s at least as ma
10b20 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a  ny columns as Y.
10b30 2a 2a 20 20 20 28 35 29 20 20 49 66 20 58 20 69  **   (5)  If X i
10b40 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
10b50 65 78 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f  ex, than Y is to
10b60 6f 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f  o.**.** Conditio
10b70 6e 73 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d  ns (2) and (3) m
10b80 65 61 6e 20 74 68 61 74 20 58 20 69 73 20 61 20  ean that X is a 
10b90 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20  "proper subset" 
10ba0 6f 66 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73  of Y..** If X is
10bb0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10bc0 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20   of Y then Y is 
10bd0 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20  a better choice 
10be0 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20  and ought.** to 
10bf0 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  have a lower cos
10c00 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
10c10 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68   returns TRUE wh
10c20 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a  en that cost .**
10c30 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73   relationship is
10c40 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65   inverted and ne
10c50 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eds to be adjust
10c60 65 64 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20  ed.  Constraint 
10c70 28 34 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  (4).** was added
10c80 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73   because if X us
10c90 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73  es skip-scan les
10ca0 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c  s than Y it stil
10cb0 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72  l might.** deser
10cc0 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20  ve a lower cost 
10cd0 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20  even if it is a 
10ce0 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
10cf0 20 59 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20   Y.  Constraint 
10d00 28 35 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64  (5).** was added
10d10 20 62 65 63 61 75 73 65 20 61 20 63 6f 76 65 72   because a cover
10d20 69 6e 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62  ing index probab
10d30 6c 79 20 64 65 73 65 72 76 65 73 20 74 6f 20 68  ly deserves to h
10d40 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
10d50 0a 2a 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63  .** than a non-c
10d60 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76  overing index ev
10d70 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72  en if it is a pr
10d80 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a  oper subset..*/.
10d90 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
10da0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10db0 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74  rSubset(.  const
10dc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20   WhereLoop *pX, 
10dd0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57        /* First W
10de0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70  hereLoop to comp
10df0 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57  are */.  const W
10e00 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20  hereLoop *pY    
10e10 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61      /* Compare a
10e20 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72  gainst this Wher
10e30 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eLoop */.){.  in
10e40 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58  t i, j;.  if( pX
10e50 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b  ->nLTerm-pX->nSk
10e60 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d  ip >= pY->nLTerm
10e70 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20  -pY->nSkip ){.  
10e80 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58    return 0; /* X
10e90 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74   is not a subset
10ea0 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69   of Y */.  }.  i
10eb0 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70  f( pY->nSkip > p
10ec0 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72  X->nSkip ) retur
10ed0 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72  n 0;.  if( pX->r
10ee0 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20  Run >= pY->rRun 
10ef0 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72  ){.    if( pX->r
10f00 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29  Run > pY->rRun )
10f10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10f20 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10f30 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20  an Y */.    if( 
10f40 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e  pX->nOut > pY->n
10f50 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Out ) return 0; 
10f60 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f     /* X costs mo
10f70 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d  re than Y */.  }
10f80 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54  .  for(i=pX->nLT
10f90 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
10fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61  ){.    if( pX->a
10fb0 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f  LTerm[i]==0 ) co
10fc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
10fd0 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  j=pY->nLTerm-1; 
10fe0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
10ff0 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d    if( pY->aLTerm
11000 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b  [j]==pX->aLTerm[
11010 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
11020 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  }.    if( j<0 ) 
11030 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20  return 0;  /* X 
11040 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
11050 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69  Y since term X[i
11060 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20  ] not used by Y 
11070 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58  */.  }.  if( (pX
11080 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
11090 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
110a0 20 26 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73   && (pY->wsFlags
110b0 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
110c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
110d0 6e 20 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61  n 0;  /* Constra
110e0 69 6e 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20  int (5) */.  }. 
110f0 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
11100 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
11110 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
11120 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
11130 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
11140 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
11150 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
11160 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
11170 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
11180 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
11190 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
111a0 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
111b0 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
111c0 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
111d0 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
111e0 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
111f0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
11200 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
11210 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
11220 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
11230 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11240 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
11250 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
11260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
11270 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
11280 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
11290 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
112a0 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
112b0 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
112c0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
112d0 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
112e0 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
112f0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
11300 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
11310 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
11320 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
11330 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
11340 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
11350 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
11360 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
11370 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
11380 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
11390 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
113a0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
113b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
113c0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
113d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
113e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
113f0 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
11400 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
11410 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
11420 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
11430 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
11440 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
11450 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
11460 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
11470 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
11480 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
11490 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
114a0 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
114b0 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
114c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
114e0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
114f0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
11500 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
11510 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
11520 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
11530 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
11540 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
11550 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
11560 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
11570 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
11580 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
11590 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
115a0 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
115b0 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
115c0 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
115d0 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
115e0 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
115f0 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
11600 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
11610 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
11620 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
11630 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
11640 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
11650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11660 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
11670 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
11680 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
11690 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
116a0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
116b0 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
116c0 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
116d0 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
116e0 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
116f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
11700 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
11710 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
11720 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
11730 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
11740 20 72 65 70 6c 61 63 65 64 20 62 79 20 70 54 65   replaced by pTe
11750 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
11760 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65  turn NULL if pTe
11770 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20  mplate does not 
11780 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68  belong on the Wh
11790 65 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a  ereLoop list..**
117a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   In other words 
117b0 69 66 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67  if pTemplate oug
117c0 68 74 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  ht to be dropped
117d0 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f   from further co
117e0 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nsideration..**.
117f0 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
11800 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
11810 6d 70 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61  mplate can repla
11820 63 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ce, then return 
11830 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74  the.** link that
11840 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a   points to pX..*
11850 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74  *.** If pTemplat
11860 65 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65  e cannot replace
11870 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
11880 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
11890 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
118a0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
118b0 65 20 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20  e list as a new 
118c0 65 6e 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75  entry, then retu
118d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
118e0 74 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74  the.** tail of t
118f0 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
11900 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
11910 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11920 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
11930 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
11940 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
11950 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
11960 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
11970 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
11980 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
11990 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
119a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
119b0 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
119c0 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
119d0 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
119e0 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
119f0 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
11a00 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
11a10 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
11a20 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
11a30 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
11a40 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
11a50 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
11a60 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
11a70 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
11a80 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
11a90 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
11aa0 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
11ab0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
11ac0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
11ad0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
11ae0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
11af0 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
11b00 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
11b10 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
11b20 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
11b30 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
11b40 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
11b50 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
11b60 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
11b70 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
11b80 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
11b90 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
11ba0 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
11bb0 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
11bd0 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
11be0 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
11bf0 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
11c00 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
11c10 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
11c20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
11c30 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
11c40 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
11c50 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
11c60 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
11c70 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
11c80 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
11c90 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
11ca0 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
11cb0 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
11cc0 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11cd0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11ce0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
11cf0 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
11d00 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
11d10 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
11d20 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
11d30 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
11d40 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
11d50 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
11d60 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
11d70 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
11d80 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
11d90 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
11da0 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
11db0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
11dc0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
11dd0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
11de0 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
11df0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11e00 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
11e10 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
11e20 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11e30 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
11e40 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
11e50 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
11e60 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
11e70 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
11e80 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
11e90 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
11ea0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
11eb0 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
11ec0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
11ed0 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
11ee0 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
11ef0 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
11f00 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
11f10 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
11f20 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
11f30 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
11f40 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
11f50 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
11f60 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
11f70 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
11f80 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
11f90 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
11fa0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
11fb0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
11fc0 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
11fd0 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
11fe0 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
11ff0 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
12000 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
12010 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
12020 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
12030 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
12040 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
12050 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
12060 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
12070 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
12080 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
12090 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
120a0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
120b0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
120c0 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
120d0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
120e0 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
120f0 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
12100 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
12110 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
12120 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
12130 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
12140 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
12150 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
12160 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
12170 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
12180 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
12190 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
121a0 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
121b0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
121c0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
121d0 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
121e0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
121f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12200 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
12210 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
12220 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
12230 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
12240 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
12270 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
12280 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
122b0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
122c0 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
122d0 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
122e0 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
122f0 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
12300 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
12310 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
12320 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
12330 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
12340 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12350 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
12360 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
12370 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
12380 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
12390 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
123a0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
123b0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
123c0 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
123d0 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
123e0 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
123f0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
12400 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
12410 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
12420 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
12430 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
12440 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
12450 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
12460 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
12470 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
12480 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
12490 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
124a0 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
124b0 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
124c0 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
124d0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
124e0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
124f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12500 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
12510 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
12520 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
12530 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
12540 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
12550 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
12560 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
12570 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
12580 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
12590 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
125a0 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
125b0 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
125c0 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
125d0 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
125e0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
125f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
12600 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
12610 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
12620 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
12630 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
12640 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
12650 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
12660 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
12670 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
12680 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
12690 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
126a0 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
126b0 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
126c0 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
126d0 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
126e0 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
126f0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
12700 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
12710 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
12720 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
12730 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
12740 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
12750 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
12760 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
12770 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
12780 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
12790 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
127a0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
127b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
127c0 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
127d0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
127e0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
127f0 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
12800 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
12810 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
12820 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
12830 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
12840 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
12850 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
12860 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
12870 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
12880 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  c;..  /* If pBui
12890 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
128a0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
128b0 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
128c0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
128d0 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
128e0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
128f0 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
12900 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
12910 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
12920 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12930 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
12940 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12950 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
12960 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
12970 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
12980 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
12990 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
129a0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
129b0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
129e0 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
129f0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12a00 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12a10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12a20 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a40 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
12a50 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
12a60 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
12a70 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
12a80 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
12a90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12aa0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
12ab0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
12ad0 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
12ae0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
12af0 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
12b00 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
12b10 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
12b20 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
12b30 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
12b40 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
12b50 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
12b60 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
12b70 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
12b80 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
12b90 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
12ba0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
12bb0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
12bc0 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
12bd0 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
12be0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
12bf0 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
12c00 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
12c10 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12c20 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12c30 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12c40 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12c60 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
12c70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
12c80 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
12c90 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12ca0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
12cb0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
12cc0 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
12cd0 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
12ce0 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
12cf0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
12d00 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
12d10 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
12d20 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
12d30 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
12d40 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
12d50 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
12d60 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
12d70 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
12d80 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
12d90 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
12da0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
12db0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
12dc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12dd0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12de0 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
12df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12e00 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
12e10 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
12e20 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
12e30 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
12e50 75 67 50 72 69 6e 74 66 28 22 20 20 20 77 69 74  ugPrintf("   wit
12e60 68 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h: ");.    }else
12e70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12e80 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20  ebugPrintf("    
12e90 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20  add: ");.    }. 
12ea0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
12eb0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
12ec0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
12ed0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
12ee0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
12ef0 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
12f00 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
12f10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
12f20 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
12f30 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
12f40 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
12f50 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
12f60 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
12f70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12f80 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12f90 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
12fa0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
12fb0 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
12fc0 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
12fd0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
12fe0 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
12ff0 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
13000 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
13010 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
13020 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
13030 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
13040 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
13050 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
13060 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
13070 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
13080 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
13090 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
130a0 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
130b0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
130c0 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
130d0 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
130e0 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
130f0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
13100 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
13110 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
13120 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
13130 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
13140 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
13150 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
13160 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
13170 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
13180 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
13190 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
131a0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
131b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
131c0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
131d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
131e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
131f0 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
13200 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
13210 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
13220 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
13230 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
13240 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
13250 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
13260 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65    }.  rc = where
13270 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
13280 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
13290 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
132a0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
132b0 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
132c0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
132d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
132e0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
132f0 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
13300 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
13310 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
13320 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
13330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13340 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68  ** Adjust the Wh
13350 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c  ereLoop.nOut val
13360 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61  ue downward to a
13370 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73  ccount for terms
13380 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   of the.** WHERE
13390 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
133a0 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20  erence the loop 
133b0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
133c0 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20  t used by an.** 
133d0 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20  index..*.** For 
133e0 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
133f0 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
13400 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
13410 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
13420 63 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70  ch has a truth p
13430 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67  robability assig
13440 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68  ned by one of th
13450 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a  e likelihood(),.
13460 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20  ** likely(), or 
13470 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66  unlikely() SQL f
13480 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65  unctions, reduce
13490 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
134a0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70  umber.** of outp
134b0 75 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70  ut rows by the p
134c0 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69  robability speci
134d0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49  fied..**.** TUNI
134e0 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57  NG:  For every W
134f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
13500 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
13510 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
13520 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73  * and which does
13530 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73   not have an ass
13540 69 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62  igned truth prob
13550 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74  ability, heurist
13560 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  ics.** described
13570 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20   below are used 
13580 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  to try to estima
13590 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
135a0 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44  bability..** TOD
135b0 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68  O --> Perhaps th
135c0 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  is is something 
135d0 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d  that could be im
135e0 70 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72  proved by better
135f0 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73  .** table statis
13600 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72  tics..**.** Heur
13610 69 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61  istic 1:  Estima
13620 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
13630 62 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37  bability as 93.7
13640 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a  5%.  The 93.75%.
13650 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70  ** value corresp
13660 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f  onds to -1 in Lo
13670 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73  gEst notation, s
13680 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63  o this means dec
13690 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68  rement.** the Wh
136a0 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65  ereLoop.nOut fie
136b0 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63  ld for every suc
136c0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  h WHERE clause t
136d0 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  erm..**.** Heuri
136e0 73 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72  stic 2:  If ther
136f0 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20  e exists one or 
13700 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
13710 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  e terms of the.*
13720 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22  * form "x==EXPR"
13730 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74   and EXPR is not
13740 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72   a constant 0 or
13750 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75   1, then make su
13760 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20  re the.** final 
13770 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
13780 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65  ate is no greate
13790 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68  r than 1/4 of th
137a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a  e total number.*
137b0 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  * of rows in the
137c0 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
137d0 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20  r words, assume 
137e0 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c  that x==EXPR wil
137f0 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20  l filter.** out 
13800 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f  at least 3 out o
13810 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58  f 4 rows.  If EX
13820 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72  PR is -1 or 0 or
13830 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74   1, then maybe t
13840 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e  he.** "x" column
13850 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65   is boolean or e
13860 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31  lse -1 or 0 or 1
13870 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66   is a common def
13880 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e  ault value.** on
13890 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20   the "x" column 
138a0 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63  and so in that c
138b0 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65  ase only cap the
138c0 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69   output row esti
138d0 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69  mate.** at 1/2 i
138e0 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a  nstead of 1/4..*
138f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
13900 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
13910 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  ust(.  WhereClau
13920 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a  se *pWC,      /*
13930 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
13940 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
13950 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a   *pLoop,      /*
13960 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a   The loop to adj
13970 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a  ust downward */.
13980 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20    LogEst nRow   
13990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
139a0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
139b0 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
139c0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
139d0 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20   *pTerm, *pX;.  
139e0 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77  Bitmask notAllow
139f0 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72  ed = ~(pLoop->pr
13a00 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ereq|pLoop->mask
13a10 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20  Self);.  int i, 
13a20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69  j, k;.  LogEst i
13a30 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f  Reduce = 0;    /
13a40 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68  * pLoop->nOut sh
13a50 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20  ould not exceed 
13a60 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a  nRow-iReduce */.
13a70 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
13a80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
13a90 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
13aa0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  0 );.  for(i=pWC
13ab0 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
13ac0 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
13ad0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
13ae0 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
13af0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
13b00 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
13b10 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
13b20 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
13b30 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
13b40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13b50 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13b60 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
13b70 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
13b80 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
13b90 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
13ba0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
13bb0 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
13bc0 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
13bd0 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
13be0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13bf0 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
13c00 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
13c10 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
13c20 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
13c30 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
13c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13c50 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  j<0 ){.      if(
13c60 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
13c70 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b<=0 ){.        
13c80 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72  /* If a truth pr
13c90 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65  obability is spe
13ca0 63 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  cified using the
13cb0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69   likelihood() hi
13cc0 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  nts,.        ** 
13cd0 74 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f  then use the pro
13ce0 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65  bability provide
13cf0 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  d by the applica
13d00 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
13d10 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20   pLoop->nOut += 
13d20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
13d30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13d40 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
13d50 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c   absence of expl
13d60 69 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61  icit truth proba
13d70 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65  bilities, use he
13d80 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20  uristics to.    
13d90 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72      ** guess a r
13da0 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20  easonable truth 
13db0 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a  probability. */.
13dc0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
13dd0 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69  Out--;.        i
13de0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
13df0 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
13e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
13e10 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
13e20 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
13e30 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ht;.          te
13e40 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
13e50 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
13e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13e70 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
13e80 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b  teger(pRight, &k
13e90 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20  ) && k>=(-1) && 
13ea0 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  k<=1 ){.        
13eb0 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20      k = 10;.    
13ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13ed0 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b           k = 20;
13ee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13ef0 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75         if( iRedu
13f00 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d  ce<k ) iReduce =
13f10 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   k;.        }.  
13f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13f30 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
13f40 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  t > nRow-iReduce
13f50 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   )  pLoop->nOut 
13f60 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65  = nRow - iReduce
13f70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d  ;.}../* .** Term
13f80 20 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74   pTerm is a vect
13f90 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  or range compari
13fa0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  son operation. T
13fb0 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
13fc0 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65  son.** in the ve
13fd0 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69  ctor can be opti
13fe0 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75  mized using colu
13ff0 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e  mn nEq of the in
14000 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  dex. This.** fun
14010 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
14020 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
14030 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74  f vector element
14040 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
14050 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ed.** as part of
14060 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61   the range compa
14070 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rison..**.** For
14080 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
14090 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
140a0 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41     WHERE a = ? A
140b0 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28  ND (b, c, d) > (
140c0 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61  ?, ?, ?).**.** a
140d0 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a  nd the index:.**
140e0 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
140f0 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c  EX ... ON (a, b,
14100 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20   c, d, e).**.** 
14110 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
14120 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f  on would be invo
14130 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20  ked with nEq=1. 
14140 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
14150 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61  ed in.** this ca
14160 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74  se is 3..*/.stat
14170 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
14180 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61  eVectorLen(.  Pa
14190 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
141a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
141b0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
141c0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
141d0 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
141e0 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  n pIdx */.  Inde
141f0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
14200 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
14210 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69   be used for a i
14220 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
14230 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  aint */.  int nE
14240 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
14250 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  * Number of prio
14260 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  r equality const
14270 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69  raints on same i
14280 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
14290 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f  erm *pTerm     /
142a0 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65  * The vector ine
142b0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
142c0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
142d0 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Cmp = sqlite3Exp
142e0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72  rVectorSize(pTer
142f0 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
14300 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43  ;.  int i;..  nC
14310 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28  mp = MIN(nCmp, (
14320 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20  pIdx->nColumn - 
14330 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31  nEq));.  for(i=1
14340 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
14350 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63      /* Test if c
14360 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70  omparison i of p
14370 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62  Term is compatib
14380 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28  le with column (
14390 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f  i+nEq) .    ** o
143a0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  f the index. If 
143b0 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f  not, exit the lo
143c0 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  op.  */.    char
143d0 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
143e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
143f0 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
14400 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78   */.    char idx
14410 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aff = 0;        
14420 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64        /* Indexed
14430 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14440 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  y */.    CollSeq
14450 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
14460 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
14470 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ison collation s
14480 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45  equence */.    E
14490 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72  xpr *pLhs = pTer
144a0 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  m->pExpr->pLeft-
144b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
144c0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
144d0 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45  pRhs = pTerm->pE
144e0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
144f0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
14500 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
14510 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20  ){.      pRhs = 
14520 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  pRhs->x.pSelect-
14530 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
14540 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
14550 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
14560 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  s->x.pList->a[i]
14570 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20  .pExpr;.    }.. 
14580 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
14590 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
145a0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
145b0 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
145c0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72   to.    ** the r
145d0 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ight column of t
145e0 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20  he right source 
145f0 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20  table. And that 
14600 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20  the sort.    ** 
14610 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64  order of the ind
14620 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  ex column is the
14630 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72   same as the sor
14640 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20  t order of the. 
14650 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69     ** leftmost i
14660 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f  ndex column.  */
14670 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f  .    if( pLhs->o
14680 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
14690 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62     || pLhs->iTab
146a0 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c  le!=iCur .     |
146b0 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21  | pLhs->iColumn!
146c0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
146d0 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20  i+nEq] .     || 
146e0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
146f0 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61  [i+nEq]!=pIdx->a
14700 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20  SortOrder[nEq]. 
14710 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
14720 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  k;.    }..    te
14730 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43  stcase( pLhs->iC
14740 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
14750 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  );.    aff = sql
14760 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14770 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65  ity(pRhs, sqlite
14780 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
14790 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66  hs));.    idxaff
147a0 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
147b0 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49  olumnAffinity(pI
147c0 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73  dx->pTable, pLhs
147d0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
147e0 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20  if( aff!=idxaff 
147f0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43  ) break;..    pC
14800 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
14810 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14820 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
14830 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70  pRhs);.    if( p
14840 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Coll==0 ) break;
14850 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14860 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
14870 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
14880 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65  ll[i+nEq]) ) bre
14890 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
148a0 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a   i;.}../*.** Adj
148b0 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
148c0 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
148d0 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
148e0 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
148f0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
14900 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
14910 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
14920 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14930 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
14940 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14950 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
14960 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
14970 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14980 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
14990 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
149a0 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
149b0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
149c0 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
149d0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
149e0 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
149f0 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
14a00 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
14a10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14a20 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
14a30 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
14a40 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
14a50 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
14a60 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
14a70 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
14a80 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
14a90 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
14aa0 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
14ab0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
14ac0 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
14ad0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
14ae0 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
14af0 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
14b00 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
14b10 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
14b20 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
14b30 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
14b40 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
14b50 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
14b60 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
14b70 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
14b80 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
14b90 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
14ba0 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
14bb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14bc0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
14bd0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
14be0 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
14bf0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
14c00 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
14c10 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
14c20 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
14c30 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
14c60 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
14c70 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
14c80 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
14c90 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
14ca0 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
14cb0 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
14cc0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
14cd0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
14ce0 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
14cf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
14d00 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
14d10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
14d20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14d30 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
14d40 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
14d50 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d70 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
14d80 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
14d90 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
14da0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14dc0 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
14dd0 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
14de0 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
14e10 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
14e20 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
14e30 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e50 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
14e60 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
14e70 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
14e80 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
14e90 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14ea0 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
14eb0 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
14ec0 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
14ed0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14ee0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
14ef0 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
14f00 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
14f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14f20 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
14f30 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14f40 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
14f50 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20  d_nBtm;         
14f60 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14f70 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14f80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
14f90 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
14fa0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14fb0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14fc0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
14fd0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a  u.btree.nTop */.
14fe0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
14ff0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15000 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
15010 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
15020 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
15030 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
15040 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
15050 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
15060 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
15070 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
15080 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15090 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
150a0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
150b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
150c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
150d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
150e0 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
150f0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
15100 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15110 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
15120 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
15130 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15150 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
15160 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
15170 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
15180 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
15190 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
151a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
151b0 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
151c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
151d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
151e0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
151f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15200 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
15210 38 30 30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e  800, ("BEGIN %s.
15220 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c  addBtreeIdx(%s),
15230 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
15260 3e 7a 4e 61 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a  >zName,pProbe->z
15270 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74  Name, pNew->u.bt
15280 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73  ree.nEq));..  as
15290 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
152a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
152b0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
152c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
152d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
152e0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
152f0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
15300 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
15310 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
15320 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
15330 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
15340 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
15350 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30  >u.btree.nBtm==0
15360 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   );.    opMask =
15370 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
15380 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
15390 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_LE|WO_ISNULL|W
153a0 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_IS;.  }.  if( 
153b0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
153c0 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
153d0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
153e0 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
153f0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
15400 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
15410 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61  nColumn );..  sa
15420 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
15430 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
15440 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77  aved_nBtm = pNew
15450 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a  ->u.btree.nBtm;.
15460 20 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70    saved_nTop = p
15470 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
15480 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  p;.  saved_nSkip
15490 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
154a0 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
154b0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
154c0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
154d0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
154e0 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
154f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
15500 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
15510 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72  ew->nOut;.  pTer
15520 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
15530 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
15540 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
15550 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71  ursor, saved_nEq
15560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15570 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
15580 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65  , pProbe);.  pNe
15590 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
155a0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
155b0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
155c0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
155d0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66  tLog(rSize);.  f
155e0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
155f0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
15600 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
15610 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
15620 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65     u16 eOp = pTe
15630 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20  rm->eOperator;  
15640 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
15650 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  r pTerm->eOperat
15660 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  or */.    LogEst
15670 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c   rCostIdx;.    L
15680 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75  ogEst nOutUnadju
15690 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  sted;        /* 
156a0 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29  nOut before IN()
156b0 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73   and WHERE adjus
156c0 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  tments */.    in
156d0 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
156e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
156f0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
15700 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
15710 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
15720 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
15730 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f     if( (eOp==WO_
15740 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d  ISNULL || (pTerm
15750 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56  ->wtFlags&TERM_V
15760 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26  NULL)!=0).     &
15770 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  & indexColumnNot
15780 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76  Null(pProbe, sav
15790 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ed_nEq).    ){. 
157a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
157b0 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
157c0 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
157d0 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
157e0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
157f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
15800 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
15810 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
15820 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
15830 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
15840 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
15850 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
15860 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
15870 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
15880 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
15890 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
158a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
158b0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
158c0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
158d0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
158e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
158f0 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
15900 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  e;..    /* Do no
15910 74 20 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69  t allow constrai
15920 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
15930 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
15940 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
15950 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
15960 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
15970 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
15980 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
15990 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
159a0 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
159b0 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
159c0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
159d0 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
159e0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
159f0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
15a00 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
15a10 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15a20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69  }..    if( IsUni
15a30 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
15a40 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70   && saved_nEq==p
15a50 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
15a60 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64   ){.      pBuild
15a70 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20  er->bldFlags |= 
15a80 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51  SQLITE_BLDF_UNIQ
15a90 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UE;.    }else{. 
15aa0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62       pBuilder->b
15ab0 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ldFlags |= SQLIT
15ac0 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a  E_BLDF_INDEXED;.
15ad0 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
15ae0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
15af0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
15b00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
15b10 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
15b20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
15b30 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b  tm = saved_nBtm;
15b40 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
15b50 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
15b60 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nTop;.    pNew->
15b70 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
15b80 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
15b90 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15ba0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
15bb0 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
15bc0 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
15bd0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
15be0 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
15bf0 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
15c00 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
15c10 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
15c20 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
15c30 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
15c40 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
15c50 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
15c60 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15c70 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
15c80 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
15c90 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
15ca0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
15cb0 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
15cc0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
15cd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
15ce0 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
15cf0 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
15d00 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
15d10 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
15d20 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
15d30 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
15d40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15d50 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
15d60 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
15d70 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
15d80 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
15d90 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
15da0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
15db0 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   i;.        nIn 
15dc0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
15dd0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
15de0 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  (25) );..       
15df0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
15e00 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  on may actually 
15e10 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28  be of the form (
15e20 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54  x, y) IN (SELECT
15e30 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ...)..        **
15e40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
15e50 65 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74  ere is a separat
15e60 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20  e term for each 
15e70 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a  of (x) and (y)..
15e80 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
15e90 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74  er, the nIn mult
15ea0 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e  iplier should on
15eb0 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e  ly be applied on
15ec0 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20  ce, not once.   
15ed0 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68       ** for each
15ee0 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20   such term. The 
15ef0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63  following loop c
15f00 68 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d  hecks that pTerm
15f10 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   is the.        
15f20 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65  ** first such te
15f30 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73  rm in use, and s
15f40 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20  ets nIn back to 
15f50 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  0 if it is not. 
15f60 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
15f70 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65  =0; i<pNew->nLTe
15f80 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rm-1; i++){.    
15f90 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
15fa0 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65  aLTerm[i] && pNe
15fb0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  w->aLTerm[i]->pE
15fc0 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e  xpr==pExpr ) nIn
15fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
15fe0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15ff0 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
16000 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
16010 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
16020 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
16030 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
16040 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
16050 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
16060 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
16070 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
16080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16090 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53  nIn>0 );  /* RHS
160a0 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72   always has 2 or
160b0 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20   more terms...  
160c0 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20  The parser.     
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
160f0 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
16100 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20  "x=?". */.      
16110 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  }.      if( pPro
16120 62 65 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  be->hasStat1 ){.
16130 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 4d          LogEst M
16140 2c 20 6c 6f 67 4b 2c 20 73 61 66 65 74 79 4d 61  , logK, safetyMa
16150 72 67 69 6e 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rgin;.        /*
16160 20 4c 65 74 3a 0a 20 20 20 20 20 20 20 20 2a 2a   Let:.        **
16170 20 20 20 4e 20 3d 20 74 68 65 20 74 6f 74 61 6c     N = the total
16180 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16190 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  in the table.   
161a0 20 20 20 20 20 2a 2a 20 20 20 4b 20 3d 20 74 68       **   K = th
161b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
161c0 69 65 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ies on the RHS o
161d0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
161e0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4d  r.        **   M
161f0 20 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   = the number of
16200 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16210 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  le that match te
16220 72 6d 73 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rms to the .    
16230 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 6f 20      **       to 
16240 74 68 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20  the left in the 
16250 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 49 66 20  same index.  If 
16260 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16270 69 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  is on.        **
16280 20 20 20 20 20 20 20 74 68 65 20 6c 65 66 74 2d         the left-
16290 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
162a0 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20 20 20 20 20  n, M==N..       
162b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
162c0 69 76 65 6e 20 74 68 65 20 64 65 66 69 6e 69 74  iven the definit
162d0 69 6f 6e 73 20 61 62 6f 76 65 2c 20 69 74 20 69  ions above, it i
162e0 73 20 62 65 74 74 65 72 20 74 6f 20 6f 6d 69 74  s better to omit
162f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16300 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  .        ** from
16310 20 74 68 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75   the index looku
16320 70 20 61 6e 64 20 69 6e 73 74 65 61 64 20 64 6f  p and instead do
16330 20 61 20 73 63 61 6e 20 6f 66 20 74 68 65 20 4d   a scan of the M
16340 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20   elements,.     
16350 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 65 61     ** testing ea
16360 63 68 20 73 63 61 6e 6e 65 64 20 72 6f 77 20 61  ch scanned row a
16370 67 61 69 6e 73 74 20 74 68 65 20 49 4e 20 6f 70  gainst the IN op
16380 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 65 6c  erator separatel
16390 79 2c 20 69 66 3a 0a 20 20 20 20 20 20 20 20 2a  y, if:.        *
163a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
163b0 20 20 20 20 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b      M*log(K) < K
163c0 2a 6c 6f 67 28 4e 29 0a 20 20 20 20 20 20 20 20  *log(N).        
163d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 75  **.        ** Ou
163e0 72 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  r estimates for 
163f0 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20 6d 69 67 68  M, K, and N migh
16400 74 20 62 65 20 69 6e 61 63 63 75 72 61 74 65 2c  t be inaccurate,
16410 20 73 6f 20 77 65 20 62 75 69 6c 64 20 69 6e 0a   so we build in.
16420 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 61 66          ** a saf
16430 65 74 79 20 6d 61 72 67 69 6e 20 6f 66 20 32 20  ety margin of 2 
16440 28 4c 6f 67 45 73 74 3a 20 31 30 29 20 74 68 61  (LogEst: 10) tha
16450 74 20 66 61 76 6f 72 73 20 75 73 69 6e 67 20 74  t favors using t
16460 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20  he IN operator. 
16470 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
16480 68 65 20 69 6e 64 65 78 2c 20 61 73 20 75 73 69  he index, as usi
16490 6e 67 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  ng an index has 
164a0 62 65 74 74 65 72 20 77 6f 72 73 74 2d 63 61 73  better worst-cas
164b0 65 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  e behavior..    
164c0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
164d0 6e 6f 74 20 68 61 76 65 20 72 65 61 6c 20 73 71  not have real sq
164e0 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2c  lite_stat1 data,
164f0 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 74   always prefer t
16500 6f 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  o use.        **
16510 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
16520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
16530 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
16540 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
16550 5d 3b 0a 20 20 20 20 20 20 20 20 6c 6f 67 4b 20  ];.        logK 
16560 3d 20 65 73 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20  = estLog(nIn);. 
16570 20 20 20 20 20 20 20 73 61 66 65 74 79 4d 61 72         safetyMar
16580 67 69 6e 20 3d 20 31 30 3b 20 20 2f 2a 20 54 55  gin = 10;  /* TU
16590 4e 49 4e 47 3a 20 65 78 74 72 61 20 77 65 69 67  NING: extra weig
165a0 68 74 20 66 6f 72 20 69 6e 64 65 78 65 64 20 49  ht for indexed I
165b0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  N */.        if(
165c0 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20 73 61 66 65   M + logK + safe
165d0 74 79 4d 61 72 67 69 6e 20 3c 20 6e 49 6e 20 2b  tyMargin < nIn +
165e0 20 72 4c 6f 67 53 69 7a 65 20 29 7b 0a 20 20 20   rLogSize ){.   
165f0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
16600 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20 20  E(0x40,.        
16610 20 20 20 20 28 22 53 63 61 6e 20 70 72 65 66 65      ("Scan prefe
16620 72 72 65 64 20 6f 76 65 72 20 49 4e 20 6f 70 65  rred over IN ope
16630 72 61 74 6f 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20  rator on column 
16640 25 64 20 6f 66 20 5c 22 25 73 5c 22 20 28 25 64  %d of \"%s\" (%d
16650 3c 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  <%d)\n",.       
16660 20 20 20 20 20 20 73 61 76 65 64 5f 6e 45 71 2c        saved_nEq,
16670 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20   pProbe->zName, 
16680 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72  M+logK+10, nIn+r
16690 4c 6f 67 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  LogSize));.     
166a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
166b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
166c0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
166d0 43 45 28 30 78 34 30 2c 0a 20 20 20 20 20 20 20  CE(0x40,.       
166e0 20 20 20 20 20 28 22 49 4e 20 6f 70 65 72 61 74       ("IN operat
166f0 6f 72 20 70 72 65 66 65 72 72 65 64 20 6f 6e 20  or preferred on 
16700 63 6f 6c 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25  column %d of \"%
16710 73 5c 22 20 28 25 64 3e 3d 25 64 29 5c 6e 22 2c  s\" (%d>=%d)\n",
16720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61  .             sa
16730 76 65 64 5f 6e 45 71 2c 20 70 50 72 6f 62 65 2d  ved_nEq, pProbe-
16740 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31  >zName, M+logK+1
16750 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53 69 7a 65 29  0, nIn+rLogSize)
16760 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16770 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
16780 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16790 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
167a0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
167b0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
167c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
167d0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
167e0 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
167f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
16800 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
16810 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
16820 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
16830 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
16840 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
16850 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
16860 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
16870 3d 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20  =0 && nInMul==0 
16880 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50  && saved_nEq==pP
16890 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
168a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
168b0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
168c0 4f 57 49 44 20 7c 7c 20 70 50 72 6f 62 65 2d 3e  OWID || pProbe->
168d0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20  uniqNotNull .   
168e0 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
168f0 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
16900 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 20  pProbe->onError 
16910 26 26 20 65 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a  && eOp==WO_EQ) .
16920 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
16930 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16940 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
16950 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OW;.        }els
16960 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
16970 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16980 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a  ERE_UNQ_WANTED;.
16990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
169a0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
169b0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
169c0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
169d0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
169e0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
169f0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
16a00 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
16a10 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
16a20 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
16a30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16a40 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
16a50 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
16a60 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
16a70 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
16a80 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
16a90 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16aa0 42 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Btm = whereRange
16ab0 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
16ac0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
16ad0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
16ae0 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
16af0 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
16b00 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
16b10 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
16b20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
16b30 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
16b40 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20  M_LIKEOPT ){.   
16b50 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f       /* Range co
16b60 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  ntraints that co
16b70 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  me from the LIKE
16b80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72   optimization ar
16b90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  e.        ** alw
16ba0 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72  ays used in pair
16bb0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  s. */.        pT
16bc0 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a  op = &pTerm[1];.
16bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16be0 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57  (pTop-(pTerm->pW
16bf0 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57  C->a))<pTerm->pW
16c00 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  C->nTerm );.    
16c10 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
16c20 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
16c30 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20  _LIKEOPT );.    
16c40 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
16c50 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
16c60 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LT );.        if
16c70 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
16c80 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
16c90 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
16ca0 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
16cb0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
16cc0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
16cd0 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20  ++] = pTop;.    
16ce0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
16cf0 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
16d00 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e  IMIT;.        pN
16d10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
16d20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
16d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
16d40 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
16d50 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20  _LT|WO_LE) );.  
16d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
16d70 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20  p & WO_LT );.   
16d80 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
16d90 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
16da0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16db0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
16dc0 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f  RANGE|WHERE_TOP_
16dd0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65  LIMIT;.      pNe
16de0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
16df0 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  = whereRangeVect
16e00 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20  orLen(.         
16e10 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69   pParse, pSrc->i
16e20 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20  Cursor, pProbe, 
16e30 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d  saved_nEq, pTerm
16e40 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
16e50 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
16e60 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
16e70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
16e80 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
16e90 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
16ea0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
16eb0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
16ec0 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
16ed0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
16ee0 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
16ef0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
16f00 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
16f10 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
16f20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
16f30 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
16f40 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
16f50 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
16f60 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
16f70 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
16f80 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
16f90 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
16fa0 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
16fb0 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
16fc0 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
16fd0 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
16fe0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
16ff0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
17000 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
17010 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
17020 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
17030 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
17040 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
17050 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
17060 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
17070 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
17080 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
17090 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
170a0 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
170b0 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
170c0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
170d0 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
170e0 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
170f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
17100 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
17110 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
17120 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
17130 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
17140 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
17150 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
17160 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
17170 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
17180 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
17190 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
171a0 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20  N|WO_IS) );..   
171b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
171c0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
171d0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
171e0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
171f0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69  =0 && pProbe->ai
17200 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
17210 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]>=0 ){.        
17220 61 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57  assert( (eOp & W
17230 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20  O_IN) || nIn==0 
17240 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17250 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e  ase( eOp & WO_IN
17260 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
17270 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
17280 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
17290 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
172a0 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  = nIn;.      }el
172b0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
172c0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
172d0 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20  R_STAT4.        
172e0 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
172f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49  ;.        if( nI
17300 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20  nMul==0 .       
17310 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61    && pProbe->nSa
17320 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26  mple .         &
17330 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
17340 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61  nEq<=pProbe->nSa
17350 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20  mpleCol.        
17360 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49   && ((eOp & WO_I
17370 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61  N)==0 || !ExprHa
17380 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
17390 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
173a0 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 20  lect)).         
173b0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
173c0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
173d0 45 5f 53 74 61 74 33 34 29 0a 20 20 20 20 20 20  E_Stat34).      
173e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
173f0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
17400 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
17410 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
17420 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
17430 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
17440 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17450 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
17460 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17470 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
17480 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
17490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
174a0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
174b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
174c0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
174d0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
174e0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
174f0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
17500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17510 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17520 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
17530 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
17540 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
17550 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
17560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
17570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
17580 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
17590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
175a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
175b0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
175c0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
175d0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
175e0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
175f0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
17600 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17610 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
17620 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
17630 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
17640 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
17650 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
17660 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
17670 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17680 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
17690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
176b0 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
176c0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
176d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
176e0 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
176f0 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
17700 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17710 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
17720 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
17730 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
17740 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17750 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
17760 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
17770 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
17780 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
17790 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
177a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
177b0 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
177c0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
177d0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
177e0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
177f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
17800 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
17810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17820 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17830 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
17840 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
17850 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
17860 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
17870 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
17880 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
17890 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
178a0 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
178b0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
178c0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
178d0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
178e0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
178f0 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
17900 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
17910 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
17920 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
17930 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
17940 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
17950 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
17960 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
17970 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
17980 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
17990 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
179a0 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
179b0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
179c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
179d0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
179e0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
179f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
17a00 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
17a10 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
17a20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
17a30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
17a40 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
17a50 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
17a60 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
17a70 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
17a80 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
17a90 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
17aa0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
17ab0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
17ac0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
17ad0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
17ae0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
17af0 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
17b00 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
17b10 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
17b20 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17b30 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
17b40 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
17b50 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
17b60 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
17b70 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
17b80 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
17b90 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
17ba0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
17bb0 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
17bc0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
17bd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
17be0 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
17bf0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
17c00 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
17c10 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
17c20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
17c30 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17c40 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17c50 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
17c60 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
17c70 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
17c80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17c90 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
17ca0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
17cb0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
17cc0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
17cd0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
17ce0 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
17cf0 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
17d00 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17d10 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
17d20 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
17d30 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
17d40 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
17d50 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
17d60 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
17d70 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
17d80 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
17d90 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
17da0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
17db0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
17dc0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
17dd0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
17de0 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
17df0 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
17e00 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
17e10 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
17e20 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
17e30 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
17e40 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
17e50 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
17e60 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
17e70 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
17e80 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
17e90 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
17ea0 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
17eb0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
17ec0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
17ed0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
17ee0 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
17ef0 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
17f00 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
17f10 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
17f20 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
17f30 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
17f40 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
17f50 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
17f60 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
17f70 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
17f80 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
17f90 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
17fa0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
17fb0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
17fc0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
17fd0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
17fe0 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
17ff0 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
18000 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
18010 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
18020 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
18030 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
18040 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
18050 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
18060 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
18070 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
18080 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
18090 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
180a0 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
180b0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
180c0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
180d0 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e 29 0a 20  LITE_SkipScan). 
180e0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52    && pProbe->aiR
180f0 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
18100 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55  Eq+1]>=42  /* TU
18110 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
18120 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
18130 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
18140 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
18150 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
18160 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
18170 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
18180 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
18190 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
181a0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
181b0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
181c0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
181d0 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
181e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
181f0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
18200 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
18210 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
18220 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
18230 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
18240 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
18250 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
18260 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55  nIter;.    /* TU
18270 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75  NING:  Because u
18280 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20  ncertainties in 
18290 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f  the estimates fo
182a0 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72  r skip-scan quer
182b0 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20  ies,.    ** add 
182c0 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61  a 1.375 fudge fa
182d0 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69  ctor to make ski
182e0 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20  p-scan slightly 
182f0 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a  less likely. */.
18300 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a      nIter += 5;.
18310 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
18320 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
18330 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
18340 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75  e, nIter + nInMu
18350 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  l);.    pNew->nO
18360 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
18370 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
18380 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
18390 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  Eq;.    pNew->nS
183a0 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
183b0 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  p;.    pNew->wsF
183c0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
183d0 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45  lags;.  }..  WHE
183e0 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28  RETRACE(0x800, (
183f0 22 45 4e 44 20 25 73 2e 61 64 64 42 74 72 65 65  "END %s.addBtree
18400 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c  Idx(%s), nEq=%d,
18410 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20   rc=%d\n",.     
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
18440 3e 7a 4e 61 6d 65 2c 20 70 50 72 6f 62 65 2d 3e  >zName, pProbe->
18450 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71  zName, saved_nEq
18460 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  , rc));.  return
18470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18480 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
18490 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
184a0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
184b0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
184c0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
184d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
184e0 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
184f0 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
18500 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
18510 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
18520 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
18530 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
18540 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
18550 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
18560 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
18570 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
18580 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
18590 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
185a0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
185b0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
185c0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
185d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
185e0 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
185f0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
18600 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61  B;.  ExprList *a
18610 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69  ColExpr;.  int i
18620 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
18630 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
18640 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
18650 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
18660 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
18670 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
18680 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
18690 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
186a0 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
186b0 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
186c0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
186d0 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
186e0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
186f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
18700 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
18710 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
18720 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
18730 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
18740 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   1;.      for(jj
18750 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
18760 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
18770 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
18780 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
18790 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
187a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
187b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
187c0 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49  ( (aColExpr = pI
187d0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21  ndex->aColExpr)!
187e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
187f0 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
18800 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
18810 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
18820 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
18830 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e  ]!=XN_EXPR ) con
18840 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
18850 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
18860 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c  mpareSkip(pExpr,
18870 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e  aColExpr->a[jj].
18880 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d  pExpr,iCursor)==
18890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
188a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
188b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
188c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
188d0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
188e0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
188f0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
18900 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
18910 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
18920 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
18930 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
18940 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
18950 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
18960 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18970 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
18980 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
18990 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
189a0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
189b0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
189c0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
189d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
189e0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
189f0 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
18a00 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
18a10 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
18a20 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
18a30 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
18a40 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
18a50 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
18a60 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
18a70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
18a80 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
18a90 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
18aa0 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
18ab0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
18ac0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
18ad0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
18ae0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
18af0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
18b00 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
18b10 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18b20 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
18b30 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
18b40 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
18b50 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
18b60 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
18b70 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18b80 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
18b90 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
18ba0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
18bb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
18bd0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18be0 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
18bf0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
18c00 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
18c10 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
18c20 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
18c30 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
18c40 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
18c50 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
18c60 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
18c70 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
18c80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
18c90 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
18ca0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
18cb0 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
18cc0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
18cd0 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
18ce0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
18cf0 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
18d00 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
18d10 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
18d20 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
18d30 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
18d40 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
18d50 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
18d60 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
18d70 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
18d80 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
18db0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18dc0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
18dd0 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
18de0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
18df0 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
18e00 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
18e10 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
18e20 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
18e30 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
18e40 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
18e50 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
18e60 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
18e70 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
18e80 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
18e90 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
18ea0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
18eb0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18ec0 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
18ed0 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
18ee0 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
18ef0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18f00 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
18f10 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
18f20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
18f30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
18f40 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
18f50 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
18f60 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
18f70 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18f80 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
18f90 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18fa0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
18fb0 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
18fc0 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
18fd0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
18fe0 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
18ff0 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
19000 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
19010 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
19020 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
19030 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
19040 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
19050 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
19060 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
19070 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
19080 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
19090 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
190a0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
190b0 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
190c0 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
190d0 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
190e0 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
190f0 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
19100 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
19110 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
19120 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
19130 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
19140 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
19150 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
19160 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
19170 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
19180 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
19190 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
191a0 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
191b0 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
191c0 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
191d0 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
191e0 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
191f0 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
19200 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
19210 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
19220 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
19230 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
19240 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
19250 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
19260 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
19270 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
19280 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
19290 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
192a0 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
192b0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
192c0 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
192d0 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
192e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
192f0 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
19300 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
19310 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
19320 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
19330 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
19340 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
19350 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
19360 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
19370 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19390 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
193a0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
193b0 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
193c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
193d0 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
193e0 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
193f0 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
19400 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
19410 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
19420 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
19430 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
19440 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
19450 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
19460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
19470 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
19480 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
19490 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
194a0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
194b0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
194c0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
194d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
194e0 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
194f0 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
19500 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
19510 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
19520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
19530 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
19540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
19550 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
19560 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19570 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
19580 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
19590 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
195a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
195b0 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
195c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
195d0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
195e0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19600 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19610 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
19620 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
19630 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19640 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
19650 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19660 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
19670 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
19680 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
19690 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
196a0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
196b0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
196c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
196d0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
196e0 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
196f0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
19700 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
19710 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
19720 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
19730 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
19740 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
19750 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
19760 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
19770 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
19780 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
19790 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
197a0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
197b0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
197c0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
197d0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
197e0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
197f0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
19800 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
19810 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
19820 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
19830 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
19840 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
19850 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
19860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19870 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
19880 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
19890 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
198a0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
198b0 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
198c0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
198d0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
198e0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
198f0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
19900 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
19910 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
19920 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
19930 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
19940 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
19950 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
19960 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
19970 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
19980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19990 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
199a0 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
199b0 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
199c0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
199d0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
199e0 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
199f0 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
19a00 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
19a10 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
19a20 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
19a30 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
19a40 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
19a50 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
19a60 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
19a70 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
19a80 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
19a90 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
19aa0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
19ab0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
19ac0 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
19ad0 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
19ae0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
19af0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
19b00 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
19b10 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
19b20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
19b30 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
19b40 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
19b50 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
19b60 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
19b70 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
19b80 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
19b90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
19ba0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
19bb0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
19bc0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
19bd0 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
19be0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
19bf0 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
19c00 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
19c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19c20 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
19c30 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
19c40 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
19c50 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
19c60 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
19c70 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
19c80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
19c90 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
19ca0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
19cb0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
19cc0 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
19cd0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
19ce0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
19cf0 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
19d00 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
19d10 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
19d20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
19d30 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
19d40 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
19d50 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
19d60 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
19d70 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
19d80 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
19d90 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
19da0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
19db0 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
19dc0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
19dd0 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
19de0 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
19df0 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
19e00 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
19e10 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
19e20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
19e30 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
19e40 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
19e50 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
19e60 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
19e70 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
19e80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
19e90 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19ea0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
19eb0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
19ec0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19ed0 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
19ee0 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
19ef0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
19f00 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
19f10 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
19f20 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
19f30 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
19f40 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
19f50 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
19f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
19f70 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
19f80 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19f90 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
19fa0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19fb0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19fc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
19fd0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
19fe0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
19ff0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1a000 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
1a010 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
1a020 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
1a030 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
1a040 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
1a050 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
1a060 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
1a070 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a080 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
1a090 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
1a0a0 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
1a0b0 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
1a0c0 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
1a0d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
1a0e0 62 6c 65 73 20 6f 72 20 30 2e 35 20 28 4c 6f 67  bles or 0.5 (Log
1a0f0 45 73 74 3d 2d 31 30 29 20 66 6f 72 20 76 69 65  Est=-10) for vie
1a100 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
1a110 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
1a120 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
1a130 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
1a140 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
1a150 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
1a160 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
1a170 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
1a180 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
1a190 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
1a1a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
1a1b0 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
1a1c0 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
1a1d0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
1a1e0 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
1a1f0 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
1a200 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
1a210 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
1a220 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
1a230 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1a240 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
1a250 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
1a260 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
1a270 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1a280 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1a290 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
1a2a0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1a2b0 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20 20 20 20   += 28;.        
1a2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a2d0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2d 3d   pNew->rSetup -=
1a2e0 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
1a2f0 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
1a300 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
1a310 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63  >rSetup, pTab->c
1a320 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
1a330 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74    if( pNew->rSet
1a340 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65  up<0 ) pNew->rSe
1a350 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
1a360 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
1a370 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
1a380 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
1a390 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
1a3a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
1a3b0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
1a3c0 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
1a3d0 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
1a3e0 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
1a3f0 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20    ** of knowing 
1a400 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
1a410 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
1a420 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
1a430 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
1a440 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
1a450 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
1a460 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
1a470 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
1a480 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
1a490 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
1a4a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
1a4b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
1a4c0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1a4d0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
1a4e0 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
1a4f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a500 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
1a510 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
1a520 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1a530 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  mPrereq | pTerm-
1a540 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
1a550 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1a560 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1a570 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1a580 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1a590 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1a5a0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
1a5b0 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
1a5c0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
1a5d0 65 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73  es. If there was
1a5e0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1a5f0 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
1a600 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20   .  ** consider 
1a610 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20 20 2a  index pProbe.  *
1a620 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
1a630 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
1a640 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f 62 65  e; .      pProbe
1a650 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  =(pSrc->pIBIndex
1a660 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70   ? 0 : pProbe->p
1a670 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64 78 2b  Next), iSortIdx+
1a680 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  +.  ){.    if( p
1a690 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
1a6a0 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20  here!=0.     && 
1a6b0 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
1a6c0 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69  ialIndex(pSrc->i
1a6d0 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72  Cursor, pWC, pPr
1a6e0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
1a6f0 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  re) ){.      tes
1a700 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61  tcase( pNew->iTa
1a710 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  b!=pSrc->iCursor
1a720 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b   );  /* See tick
1a730 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20  et [98d973b8f5] 
1a740 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
1a750 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69  e;  /* Partial i
1a760 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61  ndex inappropria
1a770 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  te for this quer
1a780 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  y */.    }.    i
1a790 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51 75  f( pProbe->bNoQu
1a7a0 65 72 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ery ) continue;.
1a7b0 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f      rSize = pPro
1a7c0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
1a7d0 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  0];.    pNew->u.
1a7e0 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
1a7f0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
1a800 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70  .nBtm = 0;.    p
1a810 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
1a820 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
1a830 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
1a840 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1a850 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
1a860 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
1a870 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1a880 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1a890 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20   = mPrereq;.    
1a8a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
1a8b0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
1a8c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
1a8d0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
1a8e0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
1a8f0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
1a900 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
1a910 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
1a920 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
1a930 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
1a940 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
1a950 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
1a960 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
1a970 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1a980 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1a990 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
1a9a0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
1a9b0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
1a9c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
1a9d0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
1a9e0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
1a9f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1aa00 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
1aa10 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
1aa20 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
1aa30 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1aa40 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
1aa50 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
1aa60 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
1aa70 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
1aa80 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
1aa90 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
1aaa0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
1aab0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1aac0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1aad0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1aae0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
1aaf0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
1ab00 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
1ab10 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1ab20 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1ab30 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1ab40 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
1ab50 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
1ab60 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
1ab70 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
1ab80 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
1ab90 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
1aba0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
1abb0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1abc0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
1abd0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
1abe0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
1abf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac00 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
1ac10 55 73 65 64 20 26 20 70 50 72 6f 62 65 2d 3e 63  Used & pProbe->c
1ac20 6f 6c 4e 6f 74 49 64 78 65 64 3b 0a 20 20 20 20  olNotIdxed;.    
1ac30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1ac40 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
1ac50 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
1ac60 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
1ac70 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
1ac80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
1ac90 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
1aca0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
1acb0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
1acc0 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
1acd0 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50     || pProbe->pP
1ace0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
1acf0 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
1ad00 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
1ad10 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
1ad20 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
1ad30 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
1ad40 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
1ad50 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1ad60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1ad70 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
1ad80 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
1ad90 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
1ada0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
1adb0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
1adc0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
1add0 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
1ade0 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1adf0 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
1ae00 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
1ae10 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1ae20 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
1ae30 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
1ae40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
1ae50 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
1ae60 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
1ae70 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
1ae80 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
1ae90 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
1aea0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1aeb0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
1aec0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1aed0 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
1aee0 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  e rows. */.     
1aef0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1af00 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
1af10 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
1af20 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
1af30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
1af40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1af50 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1af60 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
1af70 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20  ex scan, add in 
1af80 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
1af90 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74        ** doing t
1afa0 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54  able lookups.  T
1afb0 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20  he cost will be 
1afc0 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  3x the number of
1afd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  .          ** lo
1afe0 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74  okups.  Take int
1aff0 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20  o account WHERE 
1b000 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
1b010 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  t can be.       
1b020 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
1b030 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
1b040 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64  ndex, and that d
1b050 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  o not require a.
1b060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1b070 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20  le lookup. */.  
1b080 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
1b090 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b  Lookup = rSize +
1b0a0 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f   16;  /* Base co
1b0b0 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20  st:  N*3 */.    
1b0c0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1b0d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72          int iCur
1b0e0 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
1b0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  ;.          Wher
1b100 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20  eClause *pWC2 = 
1b110 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1b120 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
1b130 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d  ; ii<pWC2->nTerm
1b140 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1b150 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1b160 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61  pTerm = &pWC2->a
1b170 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
1b180 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1b190 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
1b1a0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69  (pTerm->pExpr, i
1b1b0 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a  Cur, pProbe) ){.
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1b1d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1b1e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
1b1f0 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65  * pTerm can be e
1b200 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a  valuated using j
1b210 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ust the index.  
1b220 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20 20  So reduce.      
1b230 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70        ** the exp
1b240 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
1b250 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63  table lookups ac
1b260 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20  cordingly */.   
1b270 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1b280 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
1b290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b2a0 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65    nLookup += pTe
1b2b0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
1b2c0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1b2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b2e0 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20  nLookup--;.     
1b2f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1b300 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b310 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20  (WO_EQ|WO_IS) ) 
1b320 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20  nLookup -= 19;. 
1b330 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b350 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e     .          pN
1b360 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1b370 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
1b380 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29  ->rRun, nLookup)
1b390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b3a0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
1b3b0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
1b3c0 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
1b3d0 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  lt);.        whe
1b3e0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1b3f0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1b400 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
1b410 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b420 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b430 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
1b440 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
1b450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1b460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b470 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c      }..    pBuil
1b480 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20  der->bldFlags = 
1b490 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
1b4a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
1b4b0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
1b4c0 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20  c, pProbe, 0);. 
1b4d0 20 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d     if( pBuilder-
1b4e0 3e 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54  >bldFlags==SQLIT
1b4f0 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29  E_BLDF_INDEXED )
1b500 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20  {.      /* If a 
1b510 6e 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78  non-unique index
1b520 20 69 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20   is used, or if 
1b530 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1b540 6b 65 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  key for.      **
1b550 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73   unique index is
1b560 20 75 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68   used (making th
1b570 65 20 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e  e index function
1b580 61 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29  ally non-unique)
1b590 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
1b5a0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
1b5b0 64 61 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70  data becomes imp
1b5c0 6f 72 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69  ortant for scori
1b5d0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
1b5e0 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54  plan */.      pT
1b5f0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
1b600 54 46 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20  TF_StatsUsed;.  
1b610 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1b620 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
1b630 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
1b640 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
1b650 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
1b660 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
1b670 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
1b680 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
1b690 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ec = 0;.#endif. 
1b6a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b6b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b6c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1b6d0 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLE../*.** Argum
1b6e0 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20  ent pIdxInfo is 
1b6f0 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
1b700 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74  d with all const
1b710 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a  raints that may.
1b720 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74 68  ** be used by th
1b730 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1b740 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
1b750 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
1b760 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ab. This.** func
1b770 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62  tion marks a sub
1b780 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  set of those con
1b790 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c  straints usable,
1b7a0 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
1b7b0 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
1b7c0 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 72  d and adds the r
1b7d0 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20  eturned plan to 
1b7e0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
1b7f0 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  A constraint is 
1b800 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66  marked usable if
1b810 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75  :.**.**   * Argu
1b820 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64  ment mUsable ind
1b830 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73 20  icates that its 
1b840 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1b850 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64  e available, and
1b860 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73  .**.**   * It is
1b870 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   not one of the 
1b880 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69 66  operators specif
1b890 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c  ied in the mExcl
1b8a0 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a  ude mask passed.
1b8b0 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66 6f  **     as the fo
1b8c0 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77  urth argument (w
1b8d0 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63 65  hich in practice
1b8e0 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e   is either WO_IN
1b8f0 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72   or 0)..**.** Ar
1b900 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69  gument mPrereq i
1b910 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c  s a mask of tabl
1b920 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1b930 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1b940 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  he.** virtual ta
1b950 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e  ble in question.
1b960 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65 64   These are added
1b970 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72   to the plans pr
1b980 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62  erequisites.** b
1b990 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64 65  efore it is adde
1b9a0 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  d to pBuilder..*
1b9b0 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61  *.** Output para
1b9c0 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73  meter *pbIn is s
1b9d0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  et to true if th
1b9e0 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20  e plan added to 
1b9f0 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73  pBuilder.** uses
1ba00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f   one or more WO_
1ba10 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c  IN terms, or fal
1ba20 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
1ba30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1ba40 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1ba50 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ne(.  WhereLoopB
1ba60 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1ba70 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  ,.  Bitmask mPre
1ba80 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1ba90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
1baa0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1bab0 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69  be used. */.  Bi
1bac0 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20  tmask mUsable,  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bae0 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20   Mask of usable 
1baf0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20  tables */.  u16 
1bb00 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20  mExclude,       
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1bb20 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69  xclude terms usi
1bb30 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f  ng these operato
1bb40 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
1bb50 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
1bb60 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c  Info,   /* Popul
1bb70 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20  ated object for 
1bb80 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
1bb90 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20  u16 mNoOmit,    
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74  /* Do not omit t
1bbc0 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hese constraints
1bbd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20   */.  int *pbIn 
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
1bc00 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20  ue if plan uses 
1bc10 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f  an IN(...) op */
1bc20 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  .){.  WhereClaus
1bc30 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65  e *pWC = pBuilde
1bc40 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74  r->pWC;.  struct
1bc50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1bc60 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
1bc70 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
1bc80 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1bc90 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
1bca0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
1bcb0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
1bcc0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
1bcd0 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  t mxTerm;.  int 
1bce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bcf0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1bd00 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1bd10 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew;.  Parse *pPa
1bd20 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  rse = pBuilder->
1bd30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1bd40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1bd50 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70  _item *pSrc = &p
1bd60 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
1bd70 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1bd80 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20  w->iTab];.  int 
1bd90 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
1bda0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
1bdb0 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  int;..  assert( 
1bdc0 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72  (mUsable & mPrer
1bdd0 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a  eq)==mPrereq );.
1bde0 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70    *pbIn = 0;.  p
1bdf0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
1be00 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74  rereq;..  /* Set
1be10 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
1be20 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f   on the subset o
1be30 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64  f constraints id
1be40 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a  entified by .  *
1be50 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61  * arguments mUsa
1be60 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65  ble and mExclude
1be70 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20  . */.  pIdxCons 
1be80 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1be90 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1bea0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1beb0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1bec0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1bed0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1bee0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68  xCons++){.    Wh
1bef0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
1bf00 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e   &pWC->a[pIdxCon
1bf10 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b  s->iTermOffset];
1bf20 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
1bf30 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  sable = 0;.    i
1bf40 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1bf50 71 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65  qRight & mUsable
1bf60 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  )==pTerm->prereq
1bf70 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20 28  Right .     && (
1bf80 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1bf90 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a   & mExclude)==0.
1bfa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64      ){.      pId
1bfb0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1bfc0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1bfd0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1bfe0 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20  e output fields 
1bff0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1c000 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
1c010 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ure */.  memset(
1c020 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
1c030 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f  f(pUsage[0])*nCo
1c040 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73  nstraint);.  ass
1c050 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ert( pIdxInfo->n
1c060 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
1c070 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  =0 );.  pIdxInfo
1c080 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
1c090 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1c0a0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c0b0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1c0c0 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  d = 0;.  pIdxInf
1c0d0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1c0e0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
1c0f0 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
1c100 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1c110 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
1c120 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1c130 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  ags = 0;.  pIdxI
1c140 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28  nfo->colUsed = (
1c150 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53  sqlite3_int64)pS
1c160 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20  rc->colUsed;..  
1c170 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69  /* Invoke the vi
1c180 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73  rtual table xBes
1c190 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1c1a0 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65  */.  rc = vtabBe
1c1b0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
1c1c0 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78  pSrc->pTab, pIdx
1c1d0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20  Info);.  if( rc 
1c1e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1c1f0 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61  mxTerm = -1;.  a
1c200 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53  ssert( pNew->nLS
1c210 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  lot>=nConstraint
1c220 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1c230 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1c240 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  +) pNew->aLTerm[
1c250 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  i] = 0;.  pNew->
1c260 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
1c270 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20  = 0;.  pIdxCons 
1c280 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1c290 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c2a0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1c2b0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1c2c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1c2d0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1c2e0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e  xCons++){.    in
1c2f0 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  t iTerm;.    if(
1c300 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65   (iTerm = pUsage
1c310 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20  [i].argvIndex - 
1c320 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  1)>=0 ){.      W
1c330 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1c340 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1c350 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
1c360 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
1c370 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
1c380 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  nt.       || j<0
1c390 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57  .       || j>=pW
1c3a0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
1c3b0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
1c3c0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
1c3d0 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73   || pIdxCons->us
1c3e0 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b  able==0.      ){
1c3f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c410 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d  "%s.xBestIndex m
1c420 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63  alfunction",pSrc
1c430 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1c440 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1c450 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
1c460 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 3b 0a  ToFreeIdxStr );.
1c470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c480 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1c490 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1c4a0 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
1c4b0 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
1c4c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c4d0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1c4e0 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65  ase( j==pWC->nTe
1c4f0 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54  rm-1 );.      pT
1c500 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
1c510 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
1c520 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
1c530 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1c540 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
1c550 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
1c560 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
1c570 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
1c580 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  m;.      if( iTe
1c590 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
1c5a0 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
1c5b0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1c5c0 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74  m==15 );.      t
1c5d0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1c5e0 31 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  16 );.      if( 
1c5f0 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61  iTerm<16 && pUsa
1c600 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65  ge[i].omit ) pNe
1c610 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1c620 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a  sk |= 1<<iTerm;.
1c630 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1c640 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1c650 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
1c660 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
1c670 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
1c680 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
1c690 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
1c6a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
1c6b0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
1c6c0 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
1c6d0 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
1c6e0 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
1c6f0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
1c700 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
1c710 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
1c720 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
1c730 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29  d.        ** (2)
1c740 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
1c750 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
1c760 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
1c770 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
1c780 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
1c790 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1c7a0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1c7b0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1c7c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1c7d0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e  gs &= ~SQLITE_IN
1c7e0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b  DEX_SCAN_UNIQUE;
1c7f0 0a 20 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d  .        *pbIn =
1c800 20 31 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78   1; assert( (mEx
1c810 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d  clude & WO_IN)==
1c820 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1c830 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75   }.  }.  pNew->u
1c840 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26  .vtab.omitMask &
1c850 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70  = ~mNoOmit;..  p
1c860 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
1c870 54 65 72 6d 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  Term+1;.  for(i=
1c880 30 3b 20 69 3c 3d 6d 78 54 65 72 6d 3b 20 69 2b  0; i<=mxTerm; i+
1c890 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  +){.    if( pNew
1c8a0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
1c8b0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  {.      /* The n
1c8c0 6f 6e 2d 7a 65 72 6f 20 61 72 67 76 49 64 78 20  on-zero argvIdx 
1c8d0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 63  values must be c
1c8e0 6f 6e 74 69 67 75 6f 75 73 2e 20 20 52 61 69 73  ontiguous.  Rais
1c8f0 65 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  e an.      ** er
1c900 72 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20  ror if they are 
1c910 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  not */.      sql
1c920 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c930 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64  rse,"%s.xBestInd
1c940 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c  ex malfunction",
1c950 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1c960 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1c970 73 65 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  se( pIdxInfo->ne
1c980 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1c990 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c9a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1c9b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1c9c0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
1c9d0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1c9e0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1c9f0 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1ca00 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d  >idxNum;.  pNew-
1ca10 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1ca20 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1ca30 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1ca40 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1ca50 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1ca60 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1ca70 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
1ca80 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65  o->idxStr;.  pNe
1ca90 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1caa0 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1cab0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1cac0 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64  umed ?.      pId
1cad0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1cae0 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  : 0);.  pNew->rS
1caf0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1cb00 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1cb10 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
1cb20 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1cb30 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65  atedCost);.  pNe
1cb40 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
1cb50 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
1cb60 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
1cb70 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1cb80 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1cb90 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1cba0 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1cbb0 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74  icated.  ** that
1cbc0 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1cbd0 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1cbe0 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1cbf0 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69  therwise. */.  i
1cc00 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  f( pIdxInfo->idx
1cc10 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  Flags & SQLITE_I
1cc20 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
1cc30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   ){.    pNew->ws
1cc40 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1cc50 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NEROW;.  }else{.
1cc60 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1cc70 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1cc80 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77  OW;.  }.  rc = w
1cc90 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1cca0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1ccb0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
1ccc0 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
1ccd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1cce0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1ccf0 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Str);.    pNew->
1cd00 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1cd10 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  = 0;.  }.  WHERE
1cd20 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1cd30 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49    bIn=%d prereqI
1cd40 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f  n=%04llx prereqO
1cd50 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  ut=%04llx\n",.  
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69      *pbIn, (sqli
1cd80 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72  te3_uint64)mPrer
1cd90 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1cda0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1cdb0 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d  e3_uint64)(pNew-
1cdc0 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1cdd0 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eq)));..  return
1cde0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
1cdf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ce00 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 77  s invoked from w
1ce10 69 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49 6e  ithin an xBestIn
1ce20 64 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c 20  dex() callback, 
1ce30 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  it.** returns a 
1ce40 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
1ce50 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
1ce60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
1ce70 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
1ce80 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ence associated 
1ce90 77 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43 6f  with element iCo
1cea0 6e 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ns of the sqlite
1ceb0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43 6f  3_index_info.aCo
1cec0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72 61  nstraint.** arra
1ced0 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73 20  y. Or, if iCons 
1cee0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
1cef0 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  or there is no a
1cf00 63 74 69 76 65 20 78 42 65 73 74 49 6e 64 65 78  ctive xBestIndex
1cf10 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72 6e  .** call, return
1cf20 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   NULL..*/.const 
1cf30 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 74  char *sqlite3_vt
1cf40 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71 6c  ab_collation(sql
1cf50 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1cf60 2a 70 49 64 78 49 6e 66 6f 2c 20 69 6e 74 20 69  *pIdxInfo, int i
1cf70 43 6f 6e 73 29 7b 0a 20 20 48 69 64 64 65 6e 49  Cons){.  HiddenI
1cf80 6e 64 65 78 49 6e 66 6f 20 2a 70 48 69 64 64 65  ndexInfo *pHidde
1cf90 6e 20 3d 20 28 48 69 64 64 65 6e 49 6e 64 65 78  n = (HiddenIndex
1cfa0 49 6e 66 6f 2a 29 26 70 49 64 78 49 6e 66 6f 5b  Info*)&pIdxInfo[
1cfb0 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
1cfc0 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *zRet = 0;.  if
1cfd0 28 20 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43  ( iCons>=0 && iC
1cfe0 6f 6e 73 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ons<pIdxInfo->nC
1cff0 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
1d000 20 43 6f 6c 6c 53 65 71 20 2a 70 43 20 3d 20 30   CollSeq *pC = 0
1d010 3b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20  ;.    int iTerm 
1d020 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
1d030 73 74 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69  straint[iCons].i
1d040 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
1d050 45 78 70 72 20 2a 70 58 20 3d 20 70 48 69 64 64  Expr *pX = pHidd
1d060 65 6e 2d 3e 70 57 43 2d 3e 61 5b 69 54 65 72 6d  en->pWC->a[iTerm
1d070 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d080 20 70 58 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pX->pLeft ){.  
1d090 20 20 20 20 70 43 20 3d 20 73 71 6c 69 74 65 33      pC = sqlite3
1d0a0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1d0b0 6c 53 65 71 28 70 48 69 64 64 65 6e 2d 3e 70 50  lSeq(pHidden->pP
1d0c0 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
1d0d0 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
1d0e0 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28    }.    zRet = (
1d0f0 70 43 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a  pC ? pC->zName :
1d100 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1d110 59 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Y);.  }.  return
1d120 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
1d130 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1d140 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
1d150 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1d160 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
1d170 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
1d180 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
1d190 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
1d1a0 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
1d1b0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
1d1c0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1d1d0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1d1e0 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20  IN joins in the 
1d1f0 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65  query, both mPre
1d200 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73  req and.** mUnus
1d210 61 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20  able are set to 
1d220 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50  0. Otherwise, mP
1d230 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1d240 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  of all FROM clau
1d250 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  se.** entries th
1d260 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1d270 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1d280 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1d290 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20  ause and are.** 
1d2a0 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69  separated from i
1d2b0 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e  t by at least on
1d2c0 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  e LEFT or CROSS 
1d2d0 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  JOIN. Similarly,
1d2e0 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   the.** mUnusabl
1d2f0 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
1d300 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1d310 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
1d320 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20  ur after the.** 
1d330 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e  virtual table an
1d340 64 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  d are separated 
1d350 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1d360 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1d370 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20  .** CROSS JOIN. 
1d380 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d390 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1d3a0 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e   were:.**.**   .
1d3b0 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c  .. FROM t1, t2 L
1d3c0 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c  EFT JOIN t3, t4,
1d3d0 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   vt CROSS JOIN t
1d3e0 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  5, t6;.**.** the
1d3f0 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73  n mPrereq corres
1d400 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32  ponds to (t1, t2
1d410 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20  ) and mUnusable 
1d420 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a  to (t5, t6)..**.
1d430 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65  ** All the table
1d440 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73  s in mPrereq mus
1d450 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1d460 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1d470 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c  virtual .** tabl
1d480 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20  e. So any terms 
1d490 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72  for which all pr
1d4a0 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1d4b0 73 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a  satisfied by .**
1d4c0 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20   mPrereq may be 
1d4d0 73 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73  specified as "us
1d4e0 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c  able" in all cal
1d4f0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1d500 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79  . .** Conversely
1d510 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  , all tables in 
1d520 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62  mUnusable must b
1d530 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1d540 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76  the current.** v
1d550 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f  irtual table, so
1d560 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1d570 68 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75  hich the prerequ
1d580 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77  isites overlap w
1d590 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  ith.** mUnusable
1d5a0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1d5b0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20  e configured as 
1d5c0 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72  "not-usable" for
1d5d0 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a   xBestIndex..*/.
1d5e0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1d5f0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
1d600 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1d610 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
1d620 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
1d630 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1d640 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d660 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1d670 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1d680 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  re this one */. 
1d690 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d6a0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le            /*
1d6b0 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   Tables that mus
1d6c0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1d6d0 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29  er this one */.)
1d6e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d6f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1d700 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1d710 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1d720 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
1d730 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
1d740 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
1d750 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d770 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1d780 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1d790 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
1d7a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1d7b0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1d7c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d7d0 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  tem *pSrc;   /* 
1d7e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d7f0 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1d800 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1d810 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  x_info *p;      
1d820 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61   /* Object to pa
1d830 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ss to xBestIndex
1d840 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e  () */.  int nCon
1d850 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1d860 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d870 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  f constraints in
1d880 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b   p */.  int bIn;
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d8b0 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e  plan uses IN(...
1d8c0 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
1d8d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1d8e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74  .  Bitmask mBest
1d8f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d900 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62  /* Tables used b
1d910 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  y best possible 
1d920 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  plan */.  u16 mN
1d930 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74  oOmit;..  assert
1d940 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1d950 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1d960 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1d970 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1d980 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1d990 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1d9a0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1d9b0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1d9c0 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1d9d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d9e0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1d9f0 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1da00 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1da10 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1da20 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1da30 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1da40 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1da50 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  er->pOrderBy, . 
1da60 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a       &mNoOmit);.
1da70 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1da80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1da90 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1daa0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1dab0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1dac0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1dad0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1dae0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1daf0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1db00 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1db10 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1db20 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1db30 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1db40 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1db50 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1db60 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1db70 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1db80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1db90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1dba0 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78   /* First call x
1dbb0 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68  BestIndex() with
1dbc0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1dbd0 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48   usable. */.  WH
1dbe0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
1dbf0 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 56 69  ("BEGIN %s.addVi
1dc00 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63  rtual()\n", pSrc
1dc10 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1dc20 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1dc30 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1dc40 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e  ne: all usable\n
1dc50 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  "));.  rc = wher
1dc60 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1dc70 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ne(pBuilder, mPr
1dc80 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30  ereq, ALLBITS, 0
1dc90 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1dca0 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  In);..  /* If th
1dcb0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1dcc0 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1dcd0 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1dce0 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1dcf0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1dd00 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1dd10 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a  rce tables (IOW:
1dd20 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65   a plan with mBe
1dd30 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65  st==0),.  ** the
1dd40 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  n there is no po
1dd50 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e  int in making an
1dd60 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1dd70 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1dd80 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79  .  ** since they
1dd90 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e   will all return
1dda0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1ddb0 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e   (if the xBestIn
1ddc0 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65  dex().  ** imple
1ddd0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e  mentation is san
1dde0 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  e). */.  if( rc=
1ddf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d  =SQLITE_OK && (m
1de00 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72  Best = (pNew->pr
1de10 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1de20 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
1de30 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1de40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1de50 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1de60 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1de70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1de80 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1de90 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1dea0 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1deb0 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1dec0 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1ded0 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1dee0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1def0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1df00 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1df10 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1df20 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1df30 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1df40 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1df50 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1df60 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1df70 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1df80 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1df90 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1dfa0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1dfb0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1dfc0 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1dfd0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1dfe0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1dff0 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1e000 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1e010 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1e020 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1e030 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  &bIn);.      ass
1e040 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20  ert( bIn==0 );. 
1e050 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d       mBestNoIn =
1e060 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20   pNew->prereq & 
1e070 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ~mPrereq;.      
1e080 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30  if( mBestNoIn==0
1e090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1e0a0 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1e0b0 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d    seenZeroNoIN =
1e0c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1e0d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  }..    /* Call x
1e0e0 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66  BestIndex once f
1e0f0 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
1e100 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65   value of (prere
1e110 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1e120 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  q) .    ** in th
1e130 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74  e set of terms t
1e140 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65  hat apply to the
1e150 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1e160 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
1e170 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1e190 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  t i;.      Bitma
1e1a0 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49  sk mNext = ALLBI
1e1b0 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  TS;.      assert
1e1c0 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20  ( mNext>0 );.   
1e1d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1e1e0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
1e1f0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1e200 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20   mThis = (.     
1e210 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d         pWC->a[p-
1e220 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
1e230 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
1e240 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1e250 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  req.        );. 
1e260 20 20 20 20 20 20 20 69 66 28 20 6d 54 68 69 73         if( mThis
1e270 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c  >mPrev && mThis<
1e280 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20  mNext ) mNext = 
1e290 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mThis;.      }. 
1e2a0 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65       mPrev = mNe
1e2b0 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  xt;.      if( mN
1e2c0 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62  ext==ALLBITS ) b
1e2d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1e2e0 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20  mNext==mBest || 
1e2f0 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e  mNext==mBestNoIn
1e300 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e310 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e320 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e330 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78  ne: mPrev=%04llx
1e340 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22   mNext=%04llx\n"
1e350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e360 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1e370 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20  3_uint64)mPrev, 
1e380 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1e390 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72  mNext));.      r
1e3a0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e3b0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1e3c0 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1e3d0 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d  mPrereq, mNext|m
1e3e0 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1e3f0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1e400 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1e410 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1e420 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1e430 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1e440 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1e450 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1e460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e470 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1e480 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1e490 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1e4a0 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1e4b0 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1e4c0 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1e4d0 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1e4e0 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1e4f0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1e500 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1e510 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1e520 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1e530 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1e540 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1e550 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1e560 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1e570 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1e580 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1e590 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1e5a0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1e5b0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1e5c0 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1e5d0 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1e5e0 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c  req, mPrereq, 0,
1e5f0 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1e600 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  n);.      if( bI
1e610 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1e620 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  oIN = 1;.    }..
1e630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1e640 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1e650 78 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20  x() have so far 
1e660 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1e670 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61   plan.    ** tha
1e680 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f  t requires no so
1e690 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61  urce tables at a
1e6a0 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ll and does not 
1e6b0 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20  use an IN(...). 
1e6c0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20     ** operator, 
1e6d0 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c  make a final cal
1e6e0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20  l to obtain one 
1e6f0 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
1e700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e710 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d  && seenZeroNoIN=
1e720 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1e730 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1e740 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1e750 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f   disabled and w/
1e760 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1e770 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e780 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1e790 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1e7a0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1e7b0 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  eq, WO_IN, p, mN
1e7c0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1e7d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1e7e0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1e7f0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1e800 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1e810 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1e820 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1e830 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1e840 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64  00, ("END %s.add
1e850 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64  Virtual(), rc=%d
1e860 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1e870 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20  >zName, rc));.  
1e880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1e890 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1e8a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1e8b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1e8c0 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1e8d0 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1e8e0 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1e8f0 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1e900 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1e910 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1e920 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e930 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1e940 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1e950 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1e960 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1e970 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1e980 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e990 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1e9a0 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1e9b0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1e9c0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1e9d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1e9e0 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1e9f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ea00 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1ea10 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1ea20 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1ea30 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1ea40 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1ea50 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1ea60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ea70 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1ea80 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1ea90 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1eaa0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1eab0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1eac0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1ead0 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1eae0 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1eaf0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1eb00 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1eb10 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1eb20 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1eb30 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1eb40 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1eb50 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1eb60 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1eb70 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1eb80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1eb90 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1eba0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1ebb0 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1ebc0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1ebd0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1ebe0 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1ebf0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1ec00 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1ec10 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1ec20 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1ec30 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1ec40 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1ec50 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ec60 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1ec70 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1ec80 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1ec90 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1eca0 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1ecb0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1ecc0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1ecd0 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1ece0 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1ecf0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1ed00 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1ed10 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1ed20 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1ed30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1ed40 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1ed50 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1ed60 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1ed70 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1ed80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1ed90 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1eda0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1edb0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1edc0 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1edd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ede0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1edf0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1ee00 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1ee10 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1ee20 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1ee30 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1ee40 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1ee50 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1ee60 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1ee70 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1ee80 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1ee90 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1eea0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1eeb0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1eec0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1eed0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1eee0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1eef0 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1ef00 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1ef10 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1ef20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1ef30 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1ef40 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1ef50 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1ef80 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1ef90 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1efa0 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1efb0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1efc0 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1efd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1efe0 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1eff0 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1f000 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1f010 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1f020 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1f030 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1f040 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1f050 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1f060 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1f070 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1f080 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1f090 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f0a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1f0b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1f0c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1f0d0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1f0e0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1f0f0 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1f100 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f120 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1f130 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1f140 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1f150 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1f160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f170 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1f180 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1f190 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f1a0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1f1b0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1f1c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1f1d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1f1e0 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1f1f0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1f200 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1f210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1f220 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1f230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f240 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1f250 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1f260 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1f270 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1f280 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1f290 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1f2a0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1f2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1f2c0 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1f2d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1f2e0 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1f2f0 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1f300 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1f310 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f340 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1f350 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1f360 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f390 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1f3a0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1f3b0 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f3e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f3f0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1f400 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1f410 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1f420 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1f430 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1f440 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1f450 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1f460 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1f470 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1f480 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1f490 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1f4a0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1f4b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1f4c0 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1f4d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1f4e0 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1f4f0 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1f500 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1f510 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1f520 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1f530 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1f540 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1f550 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1f560 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1f570 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1f580 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1f590 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1f5a0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1f5b0 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1f5c0 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1f5d0 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1f5e0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1f5f0 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1f600 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1f610 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1f620 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1f630 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1f640 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1f650 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1f660 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1f670 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1f680 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1f690 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1f6a0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1f6b0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1f6c0 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1f6d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1f6e0 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1f6f0 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1f700 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1f710 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1f720 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1f730 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1f740 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1f750 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1f760 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1f770 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1f780 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1f790 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1f7a0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1f7b0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1f7c0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1f7d0 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
1f7e0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
1f7f0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
1f800 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
1f810 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1f820 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1f830 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1f840 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
1f850 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
1f860 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
1f870 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1f880 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
1f890 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f8a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1f8b0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1f8c0 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
1f8d0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1f8e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
1f8f0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1f900 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
1f910 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f920 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1f930 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
1f940 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
1f950 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
1f960 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
1f970 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1f980 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
1f990 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1f9a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f9b0 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
1f9c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
1f9d0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
1f9e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
1f9f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fa00 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1fa10 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
1fa20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1fa30 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
1fa40 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
1fa50 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
1fa60 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
1fa70 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
1fa80 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1fa90 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
1faa0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
1fab0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
1fac0 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
1fad0 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
1fae0 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
1faf0 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
1fb00 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
1fb10 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
1fb20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
1fb30 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
1fb40 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
1fb50 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1fb60 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1fb70 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1fb80 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
1fb90 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72  ->fg.jointype|pr
1fba0 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
1fbb0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1fbc0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
1fbd0 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
1fbe0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
1fbf0 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
1fc00 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
1fc10 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
1fc20 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
1fc30 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1fc40 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
1fc50 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b  Prereq = mPrior;
1fc60 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
1fc70 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d  Jointype = pItem
1fc80 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23  ->fg.jointype;.#
1fc90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fca0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1fcb0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1fcc0 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1fcd0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
1fce0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a  rcList_item *p;.
1fcf0 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74        for(p=&pIt
1fd00 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  em[1]; p<pEnd; p
1fd10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1fd20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70   mUnusable || (p
1fd30 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1fd40 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1fd50 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S)) ){.         
1fd60 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71   mUnusable |= sq
1fd70 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
1fd80 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1fd90 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29  Set, p->iCursor)
1fda0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fdb0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77    }.      rc = w
1fdc0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1fdd0 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  al(pBuilder, mPr
1fde0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1fdf0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1fe00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1fe10 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1fe20 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  /.    {.      rc
1fe30 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1fe40 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
1fe50 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20  Prereq);.    }. 
1fe60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fe70 45 5f 4f 4b 20 26 26 20 70 42 75 69 6c 64 65 72  E_OK && pBuilder
1fe80 2d 3e 70 57 43 2d 3e 68 61 73 4f 72 20 29 7b 0a  ->pWC->hasOr ){.
1fe90 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1fea0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
1feb0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  er, mPrereq, mUn
1fec0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  usable);.    }. 
1fed0 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
1fee0 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
1fef0 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
1ff00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1ff10 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72  eak;.  }..  wher
1ff20 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
1ff30 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
1ff40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
1ff50 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
1ff60 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
1ff70 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
1ff80 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
1ff90 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   6th.** paramete
1ffa0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
1ffb0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
1ffc0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
1ffd0 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
1ffe0 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
1fff0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
20000 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
20010 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
20020 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
20030 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
20040 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20050 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
20060 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
20070 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
20080 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
20090 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
200a0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
200b0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
200c0 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
200d0 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
200e0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
200f0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
20100 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
20110 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
20120 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
20130 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
20140 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20150 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
20160 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
20170 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
20180 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
20190 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
201a0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
201b0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
201c0 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
201d0 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
201e0 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
201f0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
20200 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
20210 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
20220 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
20230 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
20240 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
20250 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
20260 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
20270 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
20280 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
20290 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
202a0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
202b0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
202c0 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
202d0 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
202e0 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
202f0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
20300 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
20310 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
20320 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
20330 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
20340 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
20350 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
20360 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
20370 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
20380 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
20390 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
203a0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
203b0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
203c0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
203d0 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
203e0 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
203f0 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
20400 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
20410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
20420 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
20430 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
20440 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
20450 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
20460 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
20470 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
20480 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
20490 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
204a0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
204b0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
204c0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
204d0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
204e0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
204f0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
20500 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
20510 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
20520 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
20530 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
20540 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
20550 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
20560 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
20570 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
20580 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20590 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
205a0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
205b0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
205c0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
205d0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
205e0 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
205f0 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
20600 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
20610 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
20620 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
20630 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
20640 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20650 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
20660 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
20670 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
20680 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
20690 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
206a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
206b0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
206c0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
206d0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
206e0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
206f0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
20700 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
20710 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
20720 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
20730 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
20740 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
20750 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
20760 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
20770 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
20780 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
20790 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
207a0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
207b0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
207c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
207d0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
207e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
207f0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
20800 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
20810 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
20820 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
20830 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
20840 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
20850 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
20860 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
20870 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
20880 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
20890 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
208a0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
208b0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
208c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
208d0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
208e0 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
208f0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
20900 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
20910 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
20920 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
20930 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
20940 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
20950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
20960 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
20970 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
20980 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
20990 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
209a0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
209b0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
209c0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
209d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
209e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
209f0 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
20a00 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
20a10 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
20a20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
20a30 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
20a40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
20a50 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
20a60 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
20a70 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
20a80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
20a90 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
20aa0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
20ab0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
20ac0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
20ad0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
20ae0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
20af0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
20b00 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
20b10 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
20b20 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
20b30 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
20b40 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
20b50 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
20b60 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20b70 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
20b80 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
20b90 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
20ba0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
20bb0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
20bc0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
20bd0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
20be0 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
20bf0 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
20c00 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
20c10 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
20c20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
20c30 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
20c40 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
20c50 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
20c60 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
20c70 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
20c80 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
20c90 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
20ca0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
20cb0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
20cc0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
20cd0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
20ce0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
20cf0 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
20d00 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
20d10 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
20d20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
20d30 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
20d40 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
20d50 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
20d60 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
20d70 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
20d80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
20d90 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
20da0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
20db0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
20dc0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
20dd0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
20de0 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
20df0 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
20e00 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
20e10 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
20e20 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
20e30 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
20e40 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
20e50 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
20e60 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
20e70 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
20e80 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
20e90 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
20ea0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
20eb0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
20ec0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
20ed0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
20ee0 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
20ef0 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
20f00 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
20f10 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
20f20 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
20f30 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
20f40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
20f50 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
20f60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
20f70 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
20f80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20f90 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
20fa0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
20fb0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
20fc0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
20fd0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
20fe0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
20ff0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
21000 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
21010 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
21020 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
21030 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
21040 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
21050 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
21060 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
21070 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
21080 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
21090 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
210a0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
210b0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
210c0 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
210d0 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
210e0 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
210f0 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
21100 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21110 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21120 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
21130 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
21140 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
21150 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
21160 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
21170 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
21180 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
21190 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
211a0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
211b0 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
211c0 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
211d0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
211e0 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
211f0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21200 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
21210 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
21220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21230 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
21240 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
21250 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21260 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
21270 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
21280 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
21290 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
212a0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
212b0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
212c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
212d0 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b  ree.nIdxCol = 0;
212e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
212f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
21300 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
21310 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
21320 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
21330 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
21340 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
21350 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
21360 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
21370 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
21380 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
21390 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
213a0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
213b0 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
213c0 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
213d0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
213e0 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
213f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
21400 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
21410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21420 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21430 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21440 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
21450 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
21460 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
21470 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21480 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21490 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
214a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
214b0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
214c0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
214d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
214e0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
214f0 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
21500 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
21510 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
21520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21530 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
21540 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20  eqOpMask, 0);.  
21550 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
21560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21570 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
21580 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
21590 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  {.        /* IN 
215a0 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76  terms are only v
215b0 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  alid for sorting
215c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
215d0 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20   LIMIT .        
215e0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
215f0 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69   and then only i
21600 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75 61  f they are actua
21610 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20 20  lly used.       
21620 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72 79   ** by the query
21630 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   plan */.       
21640 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
21650 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
21660 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  RBY_LIMIT );.   
21670 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
21680 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
21690 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61   pTerm!=pLoop->a
216a0 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d  LTerm[j]; j++){}
216b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
216c0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
216d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
216e0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  }.      if( (pTe
216f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
21700 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
21710 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
21720 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
21730 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21740 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57  rCollSeqMatch(pW
21750 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20  Info->pParse, . 
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21780 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45  pExpr, pTerm->pE
21790 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)==0 ){.     
217a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
217b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
217c0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
217d0 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
217e0 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
217f0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
21800 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
21810 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
21820 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21830 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
21840 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21850 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
21860 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
21870 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
21880 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
21890 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
218a0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
218b0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
218c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
218d0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
218e0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
218f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21900 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
21910 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
21920 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
21930 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
21940 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
21950 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
21960 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
21970 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
21980 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
21990 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
219a0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
219b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
219c0 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
219f0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
21a00 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
21a10 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
21a20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
21a30 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
21a40 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
21a50 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
21a60 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
21a70 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
21a80 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
21a90 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
21aa0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
21ab0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
21ac0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
21ad0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
21ae0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
21af0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
21b00 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
21b10 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
21b20 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
21b30 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
21b40 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
21b50 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
21b60 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
21b70 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
21b80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
21b90 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
21ba0 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
21bb0 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
21bc0 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
21bd0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
21be0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
21bf0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
21c00 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
21c10 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
21c20 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
21c30 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
21c40 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
21c50 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
21c60 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
21c70 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
21c80 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
21c90 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
21ca0 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20  ssing). .       
21cb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
21cc0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
21cd0 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75  t term is a colu
21ce0 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20  mn of an ((?,?) 
21cf0 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20  IN (SELECT...)) 
21d00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
21d10 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
21d20 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ch the SELECT re
21d30 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
21d40 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  one column,.    
21d50 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74        ** check t
21d60 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e  hat it is the on
21d70 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62  ly column used b
21d80 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68  y this loop. Oth
21d90 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
21da0 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e    ** if it is on
21db0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
21dc0 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  , none of the co
21dd0 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20  lumns can be.   
21de0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64         ** consid
21df0 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e  ered to match an
21e00 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20   ORDER BY term. 
21e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21e20 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73  ( (eOp & eqOpMas
21e30 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
21e40 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
21e50 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
21e60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21e70 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
21e80 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
21e90 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21ea0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
21eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21ec0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
21ed0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
21ee0 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26  if( ALWAYS(eOp &
21ef0 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20   WO_IN) ){.     
21f00 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53         /* ALWAYS
21f10 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  () justification
21f20 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61  : eOp is an equa
21f30 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75  lity operator du
21f40 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
21f50 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d       ** j<pLoop-
21f60 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e  >u.btree.nEq con
21f70 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20  straint above.  
21f80 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68  Any equality oth
21f90 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
21fa0 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20  * than WO_IN is 
21fb0 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20  captured by the 
21fc0 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20  previous "if".  
21fd0 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20  So this one.    
21fe0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
21ff0 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49  s has to be WO_I
22000 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  N. */.          
22010 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f    Expr *pX = pLo
22020 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70  op->aLTerm[j]->p
22030 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22040 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70    for(i=j+1; i<p
22050 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
22060 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; i++){.       
22070 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70         if( pLoop
22080 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
22090 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
220a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
220b0 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ( (pLoop->aLTerm
220c0 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  [i]->eOperator &
220d0 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20   WO_IN) );.     
220e0 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65             bOnce
220f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22110 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22140 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
22150 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
22160 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
22170 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
22180 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
22190 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
221a0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
221b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
221c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
221d0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
221e0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
221f0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
22200 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
22210 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
22220 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
22230 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
22240 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
22250 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
22260 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52  ) iColumn = XN_R
22270 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  OWID;.        }e
22280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
22290 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
222a0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  D;.          rev
222b0 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
222c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
222d0 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
222e0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
222f0 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
22300 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
22310 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
22320 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
22330 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
22340 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
22350 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
22360 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
22370 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
22380 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
22390 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
223a0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
223b0 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
223c0 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
223d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
223e0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
223f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
22400 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
22410 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
22420 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
22430 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
22440 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
22450 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
22460 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
22470 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
22480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
22490 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
224a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
224b0 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
224c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
224d0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
224e0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
224f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
22500 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
22510 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
22520 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
22530 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
22540 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
22550 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
22560 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
22570 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
22580 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22590 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
225a0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
225b0 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
225c0 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
225d0 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
225e0 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
225f0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
22600 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20  n>=XN_ROWID ){. 
22610 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22620 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
22630 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
22640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22650 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
22660 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
22670 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
22680 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
22690 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
226a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
226b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
226c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 49 64         Expr *pId
226d0 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  xExpr = pIndex->
226e0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70  aColExpr->a[j].p
226f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22700 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22710 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 4f 42  rCompareSkip(pOB
22720 45 78 70 72 2c 20 70 49 64 78 45 78 70 72 2c 20  Expr, pIdxExpr, 
22730 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
22740 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
22750 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22770 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
22780 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  !=XN_ROWID ){.  
22790 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
227a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
227b0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
227c0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
227d0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
227e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
227f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
22800 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
22810 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
22820 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22840 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
22850 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b  e.nIdxCol = j+1;
22860 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
22870 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
22880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22890 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
228a0 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
228b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
228c0 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
228d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
228e0 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
228f0 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
22900 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
22910 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
22920 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
22930 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
22940 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
22950 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
22960 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
22970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22980 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
22990 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
229a0 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
229b0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
229c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
229d0 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
229e0 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
229f0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
22a00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
22a10 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
22a20 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
22a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
22a40 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
22a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22a60 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
22a70 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
22a80 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  if( iColumn==XN_
22a90 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
22aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
22ab0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d  istinctColumns==
22ac0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
22ad0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
22ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
22af0 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  }.          obSa
22b00 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
22b10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
22b30 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20  match found */. 
22b40 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
22b50 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29  0 || j<nKeyCol )
22b60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
22b70 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
22b80 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
22b90 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22ba0 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
22bb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
22be0 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61   end Loop over a
22bf0 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
22c00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69   */.      if( di
22c10 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b  stinctColumns ){
22c20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22c30 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
22c40 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
22c50 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
22c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
22c70 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f    } /* end-if no
22c80 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20  t one-row */..  
22c90 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
22ca0 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59  y other ORDER BY
22cb0 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65   terms that refe
22cc0 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20  rence pLoop */. 
22cd0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
22ce0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
22cf0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
22d00 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  k |= pLoop->mask
22d10 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28  Self;.      for(
22d20 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
22d30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
22d40 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  xpr *p;.        
22d50 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20  Bitmask mTerm;. 
22d60 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
22d70 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
22d80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22d90 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e    p = pOrderBy->
22da0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
22db0 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69      mTerm = sqli
22dc0 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67  te3WhereExprUsag
22dd0 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  e(&pWInfo->sMask
22de0 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20  Set,p);.        
22df0 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20  if( mTerm==0 && 
22e00 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
22e10 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74  nstant(p) ) cont
22e20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22e30 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44  ( (mTerm&~orderD
22e40 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
22e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
22e60 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
22e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
22e90 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
22ea0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
22eb0 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
22ec0 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
22ed0 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
22ee0 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
22ef0 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42  turn (i8)nOrderB
22f00 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  y;.  if( !isOrde
22f10 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
22f20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d   for(i=nOrderBy-
22f30 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
22f40 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
22f50 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a  MASKBIT(i) - 1;.
22f60 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74        if( (obSat
22f70 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20  &m)==m ) return 
22f80 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  i;.    }.    ret
22f90 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
22fa0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn -1;.}.../*.*
22fb0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47  * If the WHERE_G
22fc0 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
22fd0 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70  et in the mask p
22fe0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
22ff0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a  WhereBegin(),.**
23000 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73   the planner ass
23010 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70  umes that the sp
23020 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79  ecified pOrderBy
23030 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c   list is actuall
23040 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20  y a GROUP.** BY 
23050 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20  clause - and so 
23060 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67  any order that g
23070 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65  roups rows as re
23080 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73  quired satisfies
23090 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e   the.** request.
230a0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
230b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
230c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
230d0 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20   for the caller 
230e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
230f0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
23100 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c  he rows are real
23110 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72  ly being deliver
23120 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ed in sorted ord
23130 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69  er, or.** just i
23140 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64  n some other ord
23150 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  er that provides
23160 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72   the required gr
23170 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  ouping. However,
23180 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
23190 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61  _SORTBYGROUP fla
231a0 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64  g is also passed
231b0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
231c0 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a  Begin(), then.**
231d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
231e0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
231f0 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65  the returned Whe
23200 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49  reInfo object. I
23210 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75  t returns.** tru
23220 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65  e if the rows re
23230 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72  ally will be sor
23240 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69  ted in the speci
23250 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66  fied order, or f
23260 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
23270 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
23280 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a  mple, assuming:.
23290 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
232a0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c  NDEX i1 ON t1(x,
232b0 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a   Y);.**.** then.
232c0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
232d0 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
232e0 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78  Y x,y ORDER BY x
232f0 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,y;   -- IsSorte
23300 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45  d()==1.**   SELE
23310 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
23320 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20  UP BY y,x ORDER 
23330 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53  BY y,x;   -- IsS
23340 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e  orted()==0.*/.in
23350 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
23360 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f  Sorted(WhereInfo
23370 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
23380 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
23390 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
233a0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73  GROUPBY );.  ass
233b0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ert( pWInfo->wct
233c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
233d0 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20  SORTBYGROUP );. 
233e0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
233f0 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65  sorted;.}..#ifde
23400 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
23410 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
23420 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
23430 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23440 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
23450 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
23460 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
23470 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
23480 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
23490 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
234a0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
234b0 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
234c0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
234d0 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
234e0 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
234f0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
23500 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
23510 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
23520 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
23530 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23540 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72   the cost of sor
23550 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20  ting nRow rows, 
23560 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68  assuming that th
23570 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20  e keys have .** 
23580 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73  nOrderby columns
23590 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69   and that the fi
235a0 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75  rst nSorted colu
235b0 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  mns are already 
235c0 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a  in.** order..*/.
235d0 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68  static LogEst wh
235e0 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
235f0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
23600 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52  nfo,.  LogEst nR
23610 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  ow,.  int nOrder
23620 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65  By,.  int nSorte
23630 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  d.){.  /* TUNING
23640 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
23650 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72   of a full exter
23660 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20  nal sort, where 
23670 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e  N is .  ** the n
23680 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
23690 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20   sort is:.  **. 
236a0 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
236b0 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e  0 * N * log(N)).
236c0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20  .  ** .  ** Or, 
236d0 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
236e0 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
236f0 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
23700 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72  last Y .  ** ter
23710 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72  ms are out of or
23720 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d  der, then block-
23730 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64  sorting will red
23740 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f  uce the .  ** so
23750 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20  rting cost to:. 
23760 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
23770 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
23780 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a  (N)) * (Y/X).  *
23790 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29  *.  ** The (Y/X)
237a0 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65   term is impleme
237b0 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b  nted using stack
237c0 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65   variable rScale
237d0 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f  .  ** below.  */
237e0 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65  .  LogEst rScale
237f0 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61  , rSortCost;.  a
23800 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
23810 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33  0 && 66==sqlite3
23820 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
23830 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65   rScale = sqlite
23840 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42  3LogEst((nOrderB
23850 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e  y-nSorted)*100/n
23860 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
23870 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
23880 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  w + rScale + 16;
23890 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20  ..  /* Multiple 
238a0 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65 20  by log(M) where 
238b0 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  M is the number 
238c0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a  of output rows..
238d0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49 4d    ** Use the LIM
238e0 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20 69  IT for M if it i
238f0 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  s smaller */.  i
23900 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
23910 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
23920 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26 20  SE_LIMIT)!=0 && 
23930 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e  pWInfo->iLimit<n
23940 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20  Row ){.    nRow 
23950 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  = pWInfo->iLimit
23960 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73  ;.  }.  rSortCos
23970 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77  t += estLog(nRow
23980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72  );.  return rSor
23990 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tCost;.}../*.** 
239a0 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
239b0 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
239c0 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
239d0 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
239e0 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
239f0 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
23a00 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
23a10 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
23a20 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
23a30 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
23a40 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
23a50 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
23a60 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
23a70 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
23a80 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
23a90 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
23aa0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
23ab0 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
23ac0 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
23ad0 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
23ae0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
23af0 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
23b00 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
23b10 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
23b20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23b30 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
23b40 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
23b50 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
23b60 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
23b70 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
23b80 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
23b90 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
23ba0 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
23bb0 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
23bc0 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
23bd0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
23be0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
23bf0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
23c00 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
23c10 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
23c20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23c30 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
23c40 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
23c50 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
23c60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
23c70 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
23c80 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
23c90 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23ca0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23cb0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cd0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
23ce0 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
23cf0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
23d00 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
23d10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23d20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
23d30 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
23d40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23d50 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
23d60 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
23d70 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
23d80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23d90 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
23da0 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
23db0 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
23dc0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
23dd0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
23de0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
23df0 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72    LogEst mxUnsor
23e00 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  ted = 0;    /* M
23e10 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20  aximum unsorted 
23e20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
23e30 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
23e40 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
23e50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23e60 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
23e70 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
23e80 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
23e90 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
23ea0 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
23eb0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
23ec0 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
23ed0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
23ee0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
23ef0 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
23f00 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
23f10 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
23f20 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
23f30 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
23f40 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
23f50 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
23f60 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
23f70 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
23f80 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
23f90 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
23fa0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
23fb0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
23fc0 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
23fd0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
23fe0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
23ff0 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
24000 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
24010 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
24020 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
24030 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  emory */.  LogEs
24040 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30  t *aSortCost = 0
24050 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20  ;    /* Sorting 
24060 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74  and partial sort
24070 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63  ing costs */.  c
24080 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
24090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
240a0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
240b0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
240c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
240d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
240e0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
240f0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  ce allocated at 
24100 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61  pSpace */..  pPa
24110 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
24120 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
24130 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
24140 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
24150 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
24160 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
24170 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
24180 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
24190 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
241a0 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
241b0 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
241c0 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
241d0 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
241e0 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
241f0 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
24200 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
24210 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f  e = (nLoop<=1) ?
24220 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
24230 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
24240 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
24250 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
24260 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
24270 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
24280 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28  begin solver.  (
24290 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20  nRowEst=%d)\n", 
242a0 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a  nRowEst));..  /*
242b0 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a   If nRowEst is z
242c0 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73  ero and there is
242d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
242e0 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20  use, ignore it. 
242f0 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
24300 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  e the purpose of
24310 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
24320 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
24330 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
24340 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  urned.  ** by th
24350 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e  e overall query.
24360 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d   Once this estim
24370 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ate has been obt
24380 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  ained, the calle
24390 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f  r.  ** will invo
243a0 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
243b0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20   a second time, 
243c0 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69  passing the esti
243d0 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  mate as the.  **
243e0 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74   nRowEst paramet
243f0 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  er.  */.  if( pW
24400 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
24410 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
24420 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  ){.    nOrderBy 
24430 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24440 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49    nOrderBy = pWI
24450 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
24460 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
24470 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
24480 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
24490 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64  r aTo, aFrom and
244a0 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a   aSortCost[] */.
244b0 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65    nSpace = (size
244c0 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69  of(WherePath)+si
244d0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
244e0 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65  *nLoop)*mxChoice
244f0 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  *2;.  nSpace += 
24500 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
24510 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70   nOrderBy;.  pSp
24520 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
24530 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
24540 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
24550 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
24560 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24570 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65  PT;.  aTo = (Whe
24580 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a  rePath*)pSpace;.
24590 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78    aFrom = aTo+mx
245a0 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74  Choice;.  memset
245b0 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (aFrom, 0, sizeo
245c0 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20  f(aFrom[0]));.  
245d0 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  pX = (WhereLoop*
245e0 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63  *)(aFrom+mxChoic
245f0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43  e);.  for(ii=mxC
24600 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61  hoice*2, pFrom=a
24610 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20  To; ii>0; ii--, 
24620 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e  pFrom++, pX += n
24630 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d  Loop){.    pFrom
24640 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20  ->aLoop = pX;.  
24650 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  }.  if( nOrderBy
24660 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
24670 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
24680 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74  BY clause and it
24690 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67   is not being ig
246a0 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20  nored, set up.  
246b0 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
246c0 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61  he aSortCost[] a
246d0 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65  rray. Each eleme
246e0 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43  nt of the aSortC
246f0 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  ost array.    **
24700 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20   is either zero 
24710 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73  - meaning it has
24720 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e   not yet been in
24730 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74  itialized - or t
24740 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
24750 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73  f sorting nRowEs
24760 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77  t rows of data w
24770 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 58  here the first X
24780 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a   terms of.    **
24790 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
247a0 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  ause are already
247b0 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65   in order, where
247c0 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79 20   X is the array 
247d0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
247e0 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74  */.    aSortCost
247f0 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a   = (LogEst*)pX;.
24800 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74      memset(aSort
24810 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
24820 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
24830 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  By);.  }.  asser
24840 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20  t( aSortCost==0 
24850 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63  || &pSpace[nSpac
24860 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72  e]==(char*)&aSor
24870 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20  tCost[nOrderBy] 
24880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f  );.  assert( aSo
24890 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53  rtCost!=0 || &pS
248a0 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63  pace[nSpace]==(c
248b0 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a  har*)pX );..  /*
248c0 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
248d0 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
248e0 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
248f0 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
24900 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
24910 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
24920 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
24930 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
24940 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65 20  ove 28.  If the 
24950 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
24960 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
24970 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
24980 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
24990 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a 20  n the first 28. 
249a0 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
249b0 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
249c0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
249d0 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
249e0 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
249f0 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b  nQueryLoop, 48);
24a00 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73 71    assert( 48==sq
24a10 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29 20  lite3LogEst(28) 
24a20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a  );.  nFrom = 1;.
24a30 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b    assert( aFrom[
24a40 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20  0].isOrdered==0 
24a50 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
24a60 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  y ){.    /* If n
24a70 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68  Loop is zero, th
24a80 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
24a90 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68  FROM terms in th
24aa0 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20  e query. Since. 
24ab0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
24ac0 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61 79  se the query may
24ad0 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
24ae0 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68  m of one row, th
24af0 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a  e results.    **
24b00 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
24b10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f 72  the requested or
24b20 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72  der. Set isOrder
24b30 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74  ed to nOrderBy t
24b40 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74  o.    ** indicat
24b50 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e  e this. Or, if n
24b60 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  Loop is greater 
24b70 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69  than zero, set i
24b80 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20  sOrdered to.    
24b90 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  ** -1, indicatin
24ba0 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  g that the resul
24bb0 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79  t set may or may
24bc0 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c   not be ordered,
24bd0 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69   .    ** dependi
24be0 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20  ng on the loops 
24bf0 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  added to the cur
24c00 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20  rent plan.  */. 
24c10 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
24c20 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20  dered = nLoop>0 
24c30 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b  ? -1 : nOrderBy;
24c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
24c50 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
24c60 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
24c70 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
24c80 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
24c90 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
24ca0 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
24cb0 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
24cc0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
24cd0 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
24ce0 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
24cf0 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
24d00 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
24d10 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
24d20 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
24d30 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
24d40 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
24d50 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
24d60 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
24d70 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
24d80 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
24d90 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
24da0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
24db0 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b      LogEst nOut;
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69        /* Rows vi
24de0 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b  sited by (pFrom+
24df0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
24e00 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b     LogEst rCost;
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
24e30 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  path (pFrom+pWLo
24e40 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
24e50 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b  ogEst rUnsorted;
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73   /* Unsorted cos
24e80 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  t of (pFrom+pWLo
24e90 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  op) */.        i
24ea0 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
24eb0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20  rom->isOrdered; 
24ec0 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f   /* isOrdered fo
24ed0 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  r (pFrom+pWLoop)
24ee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
24ef0 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20  ask maskNew;    
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f10 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73   Mask of src vis
24f20 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a  ited by (..) */.
24f30 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
24f40 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  revMask = 0;    
24f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
24f60 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c  k of rev-order l
24f70 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f  oops for (..) */
24f80 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ..        if( (p
24f90 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20  WLoop->prereq & 
24fa0 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70  ~pFrom->maskLoop
24fb0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
24fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
24fd0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26  Loop->maskSelf &
24fe0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
24ff0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
25000 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
25010 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
25020 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
25030 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e  )!=0 && pFrom->n
25040 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Row<3 ){.       
25050 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65     /* Do not use
25060 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
25070 64 65 78 20 69 66 20 74 68 65 20 74 68 69 73 20  dex if the this 
25080 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74 65 64  loop is expected
25090 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
250a0 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 31   run less than 1
250b0 2e 32 35 20 74 69 6d 65 73 2e 20 20 49 74 20 69  .25 times.  It i
250c0 73 20 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c  s tempting to al
250d0 73 6f 20 65 78 63 6c 75 64 65 0a 20 20 20 20 20  so exclude.     
250e0 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
250f0 63 20 69 6e 64 65 78 20 75 73 61 67 65 20 6f 6e  c index usage on
25100 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20   an outer loop, 
25110 62 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 61 6e  but sometimes an
25120 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20 20   automatic.     
25130 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73       ** index is
25140 20 75 73 65 66 75 6c 20 69 6e 20 74 68 65 20 6f   useful in the o
25150 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61 20 63  uter loop of a c
25160 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
25170 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ry. */.         
25180 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
25190 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
251a0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
251b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
251c0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
251d0 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
251e0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
251f0 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
25200 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
25210 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
25220 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
25230 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
25240 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
25250 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
25260 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
25270 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
25280 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
25290 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
252a0 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
252b0 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
252c0 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
252d0 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
252e0 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
252f0 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
25300 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
25310 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
25320 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
25330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
25340 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
25350 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
25360 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
25390 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
253a0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
253b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253c0 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
253d0 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
253e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
253f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
25400 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
25410 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
25420 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
25430 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
25440 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
25450 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
25460 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
25470 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
25480 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
25490 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
254a0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
254c0 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
254d0 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
254e0 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
254f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
25500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
25510 4e 47 3a 20 20 41 64 64 20 61 20 73 6d 61 6c 6c  NG:  Add a small
25520 20 65 78 74 72 61 20 70 65 6e 61 6c 74 79 20 28   extra penalty (
25530 35 29 20 74 6f 20 73 6f 72 74 69 6e 67 20 61 73  5) to sorting as
25540 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   an.          **
25550 20 65 78 74 72 61 20 65 6e 63 6f 75 72 61 67 6d   extra encouragm
25560 65 6e 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  ent to the query
25570 20 70 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65   planner to sele
25580 63 74 20 61 20 70 6c 61 6e 0a 20 20 20 20 20 20  ct a plan.      
25590 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
255a0 20 72 6f 77 73 20 65 6d 65 72 67 65 20 69 6e 20   rows emerge in 
255b0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
255c0 72 20 77 69 74 68 6f 75 74 20 61 6e 79 20 73 6f  r without any so
255d0 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rting.          
255e0 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ** required. */.
255f0 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
25600 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
25610 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
25620 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
25630 64 5d 29 20 2b 20 35 3b 0a 0a 20 20 20 20 20 20  d]) + 5;..      
25640 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
25650 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
25660 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
25670 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
25680 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
25690 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
256a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
256b0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
256c0 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
256d0 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
256e0 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
256f0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
25700 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
25710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25720 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
25730 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
25740 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20  rUnsorted -= 2; 
25750 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69   /* TUNING:  Sli
25760 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f  ght bias in favo
25770 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61  r of no-sort pla
25780 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ns */.        }.
25790 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
257a0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
257b0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
257c0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
257d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
257e0 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
257f0 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
25800 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
25810 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
25820 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
25830 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
25840 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
25850 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
25860 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
25870 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
25880 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
25890 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
258a0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
258b0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
258c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
258d0 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
258e0 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
258f0 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
25900 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
25910 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
25920 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
25930 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
25940 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
25950 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
25960 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
25970 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
25980 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
25990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
259a0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
259b0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
259c0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
259d0 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
259e0 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
259f0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
25a00 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
25a10 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
25a20 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
25a30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25a40 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
25a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25a60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a80 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
25a90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
25aa0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
25ab0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
25ac0 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
25ad0 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
25ae0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
25af0 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
25b00 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
25b10 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
25b20 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
25b30 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
25b40 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
25b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25b60 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
25b70 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
25b80 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
25b90 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
25ba0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
25bb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
25bc0 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
25bd0 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
25be0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
25bf0 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
25c00 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
25c10 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25c20 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25c40 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25c50 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
25c60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25c70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
25c80 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
25c90 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
25ca0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
25cb0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
25cc0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
25cd0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
25ce0 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
25cf0 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
25d00 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
25d10 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
25d20 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25d30 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
25d40 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
25d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
25d70 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
25d80 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
25d90 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
25da0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
25db0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
25dc0 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
25dd0 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
25de0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
25df0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
25e00 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
25e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25e20 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
25e30 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
25e40 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
25e50 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
25e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25e70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
25e80 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
25e90 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
25ea0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
25eb0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
25ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25ed0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
25ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25ef0 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
25f00 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25f10 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25f30 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25f40 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
25f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25f60 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
25f70 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
25f80 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
25f90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
25fa0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25fb0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
25fc0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
25fd0 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
25fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ff0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
26000 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26010 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26020 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26040 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
26050 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
26060 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
26070 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
26080 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26090 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
260a0 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
260b0 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73  same isOrdered s
260c0 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
260d0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
260e0 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
260f0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
26100 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
26110 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
26120 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
26130 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
26140 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e  ould be skipped.
26150 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
26160 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
26170 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61  conditional is a
26180 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f  n expanded vecto
26190 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75  r comparison equ
261a0 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20  ivalent to:.    
261b0 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d        **   (pTo-
261c0 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77  >rCost,pTo->nRow
261d0 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29  ,pTo->rUnsorted)
261e0 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c   <= (rCost,nOut,
261f0 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20  rUnsorted).     
26200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26210 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
26220 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  <rCost .        
26230 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
26240 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20  t==rCost.       
26250 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d          && (pTo-
26260 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20  >nRow<nOut.     
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
26280 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75   (pTo->nRow==nOu
26290 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
262a0 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a  ted<=rUnsorted).
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
262d0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b    ).          ){
262e0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
262f0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26300 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
26310 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26320 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
26330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26340 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
26370 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26380 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
26390 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
263a0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
263b0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
263c0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
263d0 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
263e0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
263f0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
26400 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26420 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26430 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
26440 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
26450 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
26460 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26470 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
26480 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
26490 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
264a0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
264b0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
264c0 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
264d0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
264e0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
264f0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26500 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
26510 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20       /* Discard 
26520 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
26530 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  th from further 
26540 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
26550 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26560 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
26570 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
26580 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
265a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
265b0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
265c0 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
265d0 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
265e0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68  aches here if th
265f0 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
26600 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
26610 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
26620 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c   pTo path.  Repl
26630 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65  ace pTo with the
26640 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23   candidate. */.#
26650 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26660 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26670 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
26680 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26690 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
266a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
266b0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
266c0 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
266d0 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
266e0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
266f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26700 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26710 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26720 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26730 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26750 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
26760 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26770 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26780 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26790 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
267a0 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
267b0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
267c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
267d0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
267e0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
267f0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
26800 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
26810 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
26820 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
26830 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
26840 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
26850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
26860 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
26870 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
26880 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
26890 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
268a0 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
268b0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
268c0 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
268d0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
268e0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
268f0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
26900 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
26910 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
26920 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
26930 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
26940 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
26950 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
26960 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26970 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
26980 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
26990 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
269a0 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
269b0 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
269c0 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
269d0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
269e0 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
269f0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
26a00 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
26a10 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
26a20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
26a30 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
26a40 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
26a50 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
26a60 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
26a70 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
26a80 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
26a90 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
26aa0 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
26ab0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
26ac0 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
26ad0 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
26ae0 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
26af0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
26b00 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
26b10 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26b20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
26b30 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
26b40 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
26b50 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
26b60 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26b70 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
26b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26bb0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
26bc0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
26bd0 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
26be0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26bf0 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
26c00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26c10 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
26c20 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
26c30 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
26c40 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
26c50 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
26c60 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
26c70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26c80 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
26c90 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
26ca0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
26cb0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
26cc0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
26cd0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
26ce0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
26cf0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
26d00 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
26d10 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
26d20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
26d30 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
26d40 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
26d50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26d60 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
26d70 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
26d80 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
26d90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
26da0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26db0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
26dc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26dd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
26de0 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
26df0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
26e00 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
26e10 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
26e20 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
26e30 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
26e40 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
26e50 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
26e60 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
26e70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26e90 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
26ea0 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
26eb0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
26ec0 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
26ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26ee0 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
26ef0 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
26f00 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
26f10 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
26f20 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
26f30 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
26f40 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
26f50 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
26f60 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
26f70 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
26f80 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
26f90 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
26fa0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
26fb0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
26fc0 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
26fd0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
26fe0 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
26ff0 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
27000 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
27010 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
27020 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
27030 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
27040 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
27050 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
27060 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
27070 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
27080 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
27090 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
270a0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
270b0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
270c0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
270d0 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
270e0 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
270f0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
27100 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
27110 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
27120 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27130 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
27140 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
27150 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
27160 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
27170 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
27180 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
27190 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
271a0 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
271b0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
271c0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
271d0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
271e0 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
271f0 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
27200 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
27210 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
27220 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
27230 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
27240 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
27250 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
27260 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
27270 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
27280 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
27290 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
272a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
272b0 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
272c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
272d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
272e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
272f0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
27300 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
27310 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
27320 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
27330 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
27340 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
27350 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
27360 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
27370 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
27380 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
27390 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
273a0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
273b0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
273c0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
273d0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
273e0 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
273f0 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
27400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
27410 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72  32 wsFlags = pFr
27420 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
27430 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  1]->wsFlags;.   
27440 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c         if( (wsFl
27450 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
27460 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  OW)==0 .        
27470 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28     && (wsFlags&(
27480 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
27490 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48  COLUMN_IN))!=(WH
274a0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
274b0 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20  LUMN_IN).       
274c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
274d0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
274e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
274f0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
27500 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
27510 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
27520 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
27530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27540 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44         WHERE_ORD
27550 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f  ERBY_LIMIT, nLoo
27560 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
27570 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b  p[nLoop-1], &m);
27580 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
27590 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
275a0 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20   WHERE_IPK );.  
275b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
275c0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
275d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
275e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
275f0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72   rc==pWInfo->pOr
27600 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
27620 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Info->bOrderedIn
27630 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20  nerLoop = 1;.   
27640 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27650 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a  o->revMask = m;.
27660 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27690 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
276a0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
276b0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
276c0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
276d0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
276e0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
276f0 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
27700 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
27710 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
27720 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
27730 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
27740 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
27750 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
27760 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
27770 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
27780 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
27790 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
277a0 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
277b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
277c0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
277d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
277e0 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
277f0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
27800 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
27810 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
27820 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
27830 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
27840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27850 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
27860 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
27870 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
27880 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
27890 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
278a0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
278b0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
278c0 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ace);.  return S
278d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
278e0 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20  ** Most queries 
278f0 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  use only a singl
27900 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72  e table (they ar
27910 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64  e not joins) and
27920 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20   have.** simple 
27930 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  == constraints a
27940 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66  gainst indexed f
27950 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75  ields.  This rou
27960 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a  tine attempts.**
27970 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73   to plan those s
27980 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e  imple cases usin
27990 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65  g much less cere
279a0 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a  mony than the.**
279b0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
279c0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20   query planner, 
279d0 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c  and thereby yiel
279e0 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33  d faster sqlite3
279f0 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69  _prepare().** ti
27a00 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  mes for the comm
27a10 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  on case..**.** R
27a20 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
27a30 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68  n success, if th
27a40 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20  is query can be 
27a50 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a  handled by this.
27a60 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65  ** no-frills que
27a70 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74  ry planner.  Ret
27a80 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73  urn zero if this
27a90 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65   query needs the
27aa0 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72   .** general-pur
27ab0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
27ac0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
27ad0 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  t whereShortCut(
27ae0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
27af0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
27b00 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
27b10 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
27b20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
27b30 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
27b40 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  WC;.  WhereTerm 
27b50 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c  *pTerm;.  WhereL
27b60 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e  oop *pLoop;.  in
27b70 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b  t iCur;.  int j;
27b80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
27b90 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
27ba0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
27bb0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
27bc0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
27bd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
27be0 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74  _SUBCLAUSE ) ret
27bf0 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
27c00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
27c10 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20  t->nSrc>=1 );.  
27c20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
27c30 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
27c40 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
27c50 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  b;.  if( IsVirtu
27c60 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
27c70 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  n 0;.  if( pItem
27c80 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
27c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27ca0 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
27cb0 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70  rsor;.  pWC = &p
27cc0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
27cd0 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  oop = pBuilder->
27ce0 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  pNew;.  pLoop->w
27cf0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c  sFlags = 0;.  pL
27d00 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  oop->nSkip = 0;.
27d10 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
27d20 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
27d30 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
27d40 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29   WO_EQ|WO_IS, 0)
27d50 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
27d60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
27d70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27d80 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70  & WO_IS );.    p
27d90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
27da0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
27db0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
27dc0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f  ONEROW;.    pLoo
27dd0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  p->aLTerm[0] = p
27de0 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Term;.    pLoop-
27df0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
27e00 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
27e10 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20  nEq = 1;.    /* 
27e20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
27e30 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69  a rowid lookup i
27e40 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f  s 10 */.    pLoo
27e50 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f  p->rRun = 33;  /
27e60 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 33==sqlite3Log
27e70 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  Est(10) */.  }el
27e80 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
27e90 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
27ea0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
27eb0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
27ec0 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20  t opMask;.      
27ed0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
27ee0 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
27ef0 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
27f00 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
27f10 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20  Index(pIdx).    
27f20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72     || pIdx->pPar
27f30 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20  tIdxWhere!=0 .  
27f40 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b       || pIdx->nK
27f50 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28  eyCol>ArraySize(
27f60 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
27f70 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e  ce) .      ) con
27f80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d  tinue;.      opM
27f90 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71  ask = pIdx->uniq
27fa0 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51  NotNull ? (WO_EQ
27fb0 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b  |WO_IS) : WO_EQ;
27fc0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
27fd0 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
27fe0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
27ff0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
28000 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
28010 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d   iCur, j, 0, opM
28020 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ask, pIdx);.    
28030 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
28040 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28050 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28060 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28070 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
28080 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
28090 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
280a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
280b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
280c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
280d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
280e0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
280f0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
28100 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
28110 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
28120 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
28130 2d 3e 63 6f 6c 55 73 65 64 20 26 20 70 49 64 78  ->colUsed & pIdx
28140 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d  ->colNotIdxed)==
28150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
28160 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
28170 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
28180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
28190 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
281a0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
281b0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
281c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
281d0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
281e0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
281f0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
28200 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
28210 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
28220 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
28230 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
28240 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
28250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28260 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
28270 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
28280 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
28290 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
282a0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
282b0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
282c0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
282d0 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26  sMaskSet.n==1 &&
282e0 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73   iCur==pWInfo->s
282f0 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b  MaskSet.ix[0] );
28300 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
28310 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c  Self = 1; /* sql
28320 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
28330 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
28340 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20  et, iCur); */.  
28350 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
28360 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
28370 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
28380 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
28390 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
283a0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
283b0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
283c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
283d0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
283e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
283f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
28400 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
28410 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
28420 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
28430 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
28440 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
28450 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
28460 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
28470 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
28480 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
28490 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
284a0 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65 72   for exprIsDeter
284b0 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73  ministic()..*/.s
284c0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
284d0 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  deIsDeterministi
284e0 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  c(Walker *pWalke
284f0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
28500 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
28510 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
28520 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
28530 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74  (pExpr, EP_Const
28540 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Func)==0 ){.    
28550 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
28560 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
28570 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
28580 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28590 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nue;.}../*.** Re
285a0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
285b0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
285c0 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65  ains no non-dete
285d0 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a  rministic SQL .*
285e0 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20  * functions. Do 
285f0 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e  not consider non
28600 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53  -deterministic S
28610 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  QL functions tha
28620 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f  t are .** part o
28630 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74 61  f sub-select sta
28640 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
28650 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65 74  ic int exprIsDet
28660 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72 20  erministic(Expr 
28670 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
28680 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
28690 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
286a0 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
286b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
286c0 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d  exprNodeIsDeterm
286d0 69 6e 69 73 74 69 63 3b 0a 20 20 77 2e 78 53 65  inistic;.  w.xSe
286e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
286f0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
28700 46 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57  Fail;.  sqlite3W
28710 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
28720 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
28730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
28740 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
28750 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
28760 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
28770 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
28780 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
28790 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
287a0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
287b0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
287c0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
287d0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
287e0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
287f0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
28800 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
28810 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
28820 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
28830 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
28840 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
28850 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
28860 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
28870 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
28880 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
28890 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
288a0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
288b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
288c0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
288d0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
288e0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
288f0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
28900 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
28910 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
28920 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
28930 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
28940 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
28950 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
28960 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
28970 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
28980 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28990 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
289a0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
289b0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
289c0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
289d0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
289e0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
289f0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
28a00 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
28a10 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
28a20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
28a30 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
28a40 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
28a50 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
28a60 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
28a70 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
28a80 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
28a90 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
28aa0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
28ab0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
28ac0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
28ad0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
28ae0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
28b10 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
28b20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
28b30 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
28b40 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
28b50 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
28b80 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
28b90 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
28ba0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
28bb0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
28bc0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
28bd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28be0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
28bf0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
28c00 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
28c10 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
28c20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
28c30 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
28c40 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
28c50 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
28c60 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
28c70 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
28c80 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
28c90 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
28ca0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
28cb0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
28cc0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
28cd0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
28ce0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
28cf0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28d00 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
28d10 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
28d20 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
28d30 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
28d40 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
28d50 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
28d60 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
28d70 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
28d80 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
28d90 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
28da0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
28db0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
28dc0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
28dd0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
28de0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
28df0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
28e00 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
28e10 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
28e20 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
28e30 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
28e40 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
28e50 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
28e60 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
28e70 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
28e80 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
28e90 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
28ea0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
28eb0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
28ec0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
28ed0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
28ee0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
28ef0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
28f00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
28f10 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
28f20 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
28f30 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
28f40 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
28f50 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
28f60 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
28f70 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
28f80 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
28f90 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
28fa0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
28fb0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
28fc0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
28fd0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
28fe0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
28ff0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
29000 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
29010 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
29020 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
29030 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
29040 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
29050 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
29060 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
29070 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
29080 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
29090 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
290a0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
290b0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
290c0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
290d0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
290e0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
290f0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
29100 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
29110 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
29120 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
29130 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
29140 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
29150 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
29160 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
29170 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
29180 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
29190 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
291a0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
291b0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
291c0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
291d0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
291e0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
291f0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
29200 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
29210 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
29220 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
29230 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
29240 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
29250 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
29260 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
29270 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
29280 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
29290 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
292a0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
292b0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
292c0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
292d0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
292e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
292f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
29300 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
29310 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
29320 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
29330 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
29340 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
29350 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
29360 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
29370 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
29380 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
29390 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
293a0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
293b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
293c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
293d0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
293e0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
293f0 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
29400 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
29410 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
29420 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
29430 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
29440 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
29450 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
29460 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
29470 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
29480 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
29490 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
294a0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
294b0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
294c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
294d0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
294e0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
294f0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
29500 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
29510 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73  _OR_SUBCLAUSE is
29520 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73   set, iIdxCur is
29530 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
29540 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  er of an index.*
29550 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20  * to use for OR 
29560 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
29570 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c  g.  The WHERE cl
29580 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20  ause should use 
29590 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63  this.** specific
295a0 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45   cursor.  If WHE
295b0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
295c0 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ED is set, then 
295d0 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68  iIdxCur is.** th
295e0 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69  e first cursor i
295f0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75  n an array of cu
29600 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
29610 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20  dices.  iIdxCur 
29620 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65  should.** be use
29630 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
29640 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72   appropriate cur
29650 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  sor depending on
29660 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a   which index is.
29670 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72  ** used..*/.Wher
29680 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
29690 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
296a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
296b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
296c0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
296d0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
296e0 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
296f0 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
29700 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
29710 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
29720 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
29730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
29740 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
29750 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
29760 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52  By,     /* An OR
29770 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
29780 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20   BY) clause, or 
29790 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
297a0 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20  st *pResultSet, 
297b0 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73 75 6c    /* Query resul
297c0 74 20 73 65 74 2e 20 20 52 65 71 27 64 20 66 6f  t set.  Req'd fo
297d0 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  r DISTINCT */.  
297e0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
297f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
29800 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
29810 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
29820 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75  t.h */.  int iAu
29830 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  xArg            
29840 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52 5f   /* If WHERE_OR_
29850 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74  SUBCLAUSE is set
29860 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
29870 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45 5f  ** If WHERE_USE_
298a0 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65 20  LIMIT, then the 
298b0 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a  limit amount */.
298c0 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  ){.  int nByteWI
298d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
298e0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
298f0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
29900 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
29910 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29930 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
29940 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
29950 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
29960 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
29970 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
29980 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
29990 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
299a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
299b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
299c0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
299d0 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
299e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
299f0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
29a00 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
29a10 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
29a20 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
29a30 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c 42  LoopBuilder sWLB
29a40 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ;     /* The Whe
29a50 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a  reLoop builder *
29a60 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
29a70 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
29a80 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
29a90 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
29aa0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
29ab0 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
29ac0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
29ad0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
29ae0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
29af0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
29b00 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
29b10 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29b20 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  ct */.  int ii; 
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29b50 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
29b60 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
29b70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
29b80 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
29b90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29bb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38  urn code */.  u8
29bc0 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b   bFordelete = 0;
29bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c           /* OPFL
29be0 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72 20  AG_FORDELETE or 
29bf0 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70 72  zero, as appropr
29c00 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  iate */..  asser
29c10 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
29c20 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
29c30 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28  ULTIROW)==0 || (
29c40 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c 46  .        (wctrlF
29c50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
29c60 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
29c70 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72 6c   .     && (wctrl
29c80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
29c90 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a  _SUBCLAUSE)==0 .
29ca0 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79    ));..  /* Only
29cb0 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f 52   one of WHERE_OR
29cc0 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57 48  _SUBCLAUSE or WH
29cd0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f  ERE_USE_LIMIT */
29ce0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
29cf0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
29d00 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a  R_SUBCLAUSE)==0.
29d10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
29d20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29d30 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30  RE_USE_LIMIT)==0
29d40 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62   );..  /* Variab
29d50 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
29d60 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
29d70 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
29d80 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
29d90 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
29da0 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
29db0 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
29dc0 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
29dd0 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
29de0 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
29df0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
29e00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
29e10 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
29e20 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
29e30 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
29e40 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
29e50 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
29e60 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
29e70 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
29e80 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
29e90 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
29ea0 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
29eb0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
29ec0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
29ed0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
29ee0 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
29ef0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
29f00 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
29f10 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
29f20 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
29f30 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
29f40 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
29f50 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
29f60 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
29f70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29f80 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
29f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
29fa0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
29fb0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
29fc0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
29fd0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
29fe0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
29ff0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2a000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2a010 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2a020 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2a030 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2a040 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2a050 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a060 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2a070 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2a080 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2a090 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2a0a0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2a0b0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a0c0 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
2a0d0 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
2a0e0 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
2a0f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
2a100 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
2a110 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
2a120 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
2a130 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
2a140 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
2a150 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
2a160 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2a170 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
2a180 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a190 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 20  E_OR_SUBCLAUSE) 
2a1a0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
2a1b0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
2a1c0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2a1d0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
2a1e0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
2a1f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2a200 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
2a210 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
2a220 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
2a230 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
2a240 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
2a250 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
2a260 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
2a270 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
2a280 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
2a290 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
2a2a0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
2a2b0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
2a2c0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
2a2d0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
2a2e0 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
2a2f0 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
2a300 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
2a310 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
2a320 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
2a330 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
2a340 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
2a350 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
2a360 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
2a370 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
2a380 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
2a390 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
2a3a0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2a3b0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
2a3c0 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
2a3d0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
2a3e0 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
2a3f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2a400 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2a410 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
2a420 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
2a430 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2a440 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
2a450 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
2a460 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
2a470 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
2a480 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
2a490 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2a4a0 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57  By;.  pWInfo->pW
2a4b0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
2a4c0 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
2a4d0 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
2a4e0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ;.  pWInfo->aiCu
2a4f0 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57  rOnePass[0] = pW
2a500 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2a510 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57  ss[1] = -1;.  pW
2a520 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
2a530 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2a540 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e  o->iBreak = pWIn
2a550 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
2a560 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a570 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
2a580 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
2a590 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
2a5a0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69  Info->iLimit = i
2a5b0 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f  AuxArg;.  pWInfo
2a5c0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2a5d0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
2a5e0 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74  ryLoop;.  memset
2a5f0 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  (&pWInfo->nOBSat
2a600 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 6f  , 0, .         o
2a610 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66  ffsetof(WhereInf
2a620 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73 65 74 6f  o,sWC) - offseto
2a630 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53  f(WhereInfo,nOBS
2a640 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  at));.  memset(&
2a650 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c  pWInfo->a[0], 0,
2a660 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
2a670 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65  p)+nTabList*size
2a680 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
2a690 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2a6a0 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2a6b0 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
2a6c0 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
2a6d0 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
2a6e0 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
2a6f0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
2a700 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
2a710 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
2a720 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
2a730 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
2a740 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
2a750 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
2a760 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
2a770 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2a780 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
2a790 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
2a7a0 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
2a7b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2a7c0 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
2a7d0 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
2a7e0 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
2a7f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2a800 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
2a810 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
2a820 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
2a830 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
2a840 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
2a850 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
2a860 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
2a870 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
2a880 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
2a890 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
2a8a0 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
2a8b0 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
2a8c0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
2a8d0 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
2a8e0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
2a8f0 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
2a900 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
2a910 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
2a920 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
2a930 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
2a940 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2a950 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
2a960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2a970 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
2a980 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2a990 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2a9a0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2a9b0 20 20 20 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e     }.    Explain
2a9c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
2a9d0 65 2c 20 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53  e, 0, "SCAN CONS
2a9e0 54 41 4e 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d  TANT ROW"));.  }
2a9f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73  else{.    /* Ass
2aa00 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
2aa10 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
2aa20 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
2aa30 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20  FROM clause..   
2aa40 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e   **.    ** The N
2aa50 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
2aa60 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
2aa70 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73  ssigned a bitmas
2aa80 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a  k of 1<<N..    *
2aa90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6c  *.    ** The rul
2aaa0 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
2aab0 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72  s sentence ensur
2aac0 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73 20  es thta if X is 
2aad0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a  the bitmask for.
2aae0 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54      ** a table T
2aaf0 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68  , then X-1 is th
2ab00 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
2ab10 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74  l other tables t
2ab20 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e  o the left of T.
2ab30 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20  .    ** Knowing 
2ab40 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2ab50 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2ab60 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
2ab70 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20   join is.    ** 
2ab80 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
2ab90 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a  et #3015..    **
2aba0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2abb0 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
2abc0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
2abd0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
2abe0 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70  bles in.    ** p
2abf0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
2ac00 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
2ac10 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
2ac20 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
2ac30 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c 20  ly.    ** equal 
2ac40 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
2ac50 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
2ac60 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
2ac70 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45 52   the.    ** WHER
2ac80 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
2ac90 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20 20  lag is set..    
2aca0 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a 20  */.    ii = 0;. 
2acb0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72 65     do{.      cre
2acc0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
2acd0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
2ace0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2acf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61    sqlite3WhereTa
2ad00 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65  bFuncArgs(pParse
2ad10 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  , &pTabList->a[i
2ad20 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  i], &pWInfo->sWC
2ad30 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
2ad40 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e  ++ii)<pTabList->
2ad50 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65 66  nSrc );.  #ifdef
2ad60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2ad70 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73    {.      Bitmas
2ad80 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  k mx = 0;.      
2ad90 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
2ada0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
2adb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  +){.        Bitm
2adc0 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57  ask m = sqlite3W
2add0 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73  hereGetMask(pMas
2ade0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2adf0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2ae00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ae10 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20 20  m>=mx );.       
2ae20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d   mx = m;.      }
2ae30 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a  .    }.  #endif.
2ae40 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c    }.  .  /* Anal
2ae50 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
2ae60 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a  ubexpressions. *
2ae70 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
2ae80 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  ExprAnalyze(pTab
2ae90 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
2aea0 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
2aeb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2aec0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2aed0 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  or;..  /* Specia
2aee0 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20 74 65  l case: WHERE te
2aef0 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  rms that do not 
2af00 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61 62  refer to any tab
2af10 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a  les in the join.
2af20 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65    ** (constant e
2af30 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76 61  xpressions). Eva
2af40 6c 75 61 74 65 20 65 61 63 68 20 73 75 63 68 20  luate each such 
2af50 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f  term, and jump o
2af60 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  ver all the.  **
2af70 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
2af80 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  if the result is
2af90 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20 2a   not true.  .  *
2afa0 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f  *.  ** Do not do
2afb0 20 74 68 69 73 20 69 66 20 74 68 65 20 65 78 70   this if the exp
2afc0 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
2afd0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
2afe0 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a  ic functions.  *
2aff0 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 77  * that are not w
2b000 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c 65  ithin a sub-sele
2b010 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ct. This is not 
2b020 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
2b030 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65 73  d, but.  ** pres
2b040 65 72 76 65 73 20 53 51 4c 69 74 65 27 73 20 6c  erves SQLite's l
2b050 65 67 61 63 79 20 62 65 68 61 76 69 6f 75 72 20  egacy behaviour 
2b060 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2b070 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a   two cases:.  **
2b080 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e  .  **   FROM ...
2b090 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e   WHERE random()>
2b0a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  0;           -- 
2b0b0 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e  eval random() on
2b0c0 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20  ce per row.  ** 
2b0d0 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45    FROM ... WHERE
2b0e0 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28   (SELECT random(
2b0f0 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72  ))>0;  -- eval r
2b100 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65  andom() once ove
2b110 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  rall.  */.  for(
2b120 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57  ii=0; ii<sWLB.pW
2b130 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  C->nTerm; ii++){
2b140 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
2b150 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e  pT = &sWLB.pWC->
2b160 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  a[ii];.    if( p
2b170 54 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  T->wtFlags & TER
2b180 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74  M_VIRTUAL ) cont
2b190 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
2b1a0 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26  ->prereqAll==0 &
2b1b0 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
2b1c0 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  | exprIsDetermin
2b1d0 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29  istic(pT->pExpr)
2b1e0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2b1f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2b200 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c  arse, pT->pExpr,
2b210 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
2b220 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2b230 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77  LL);.      pT->w
2b240 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
2b250 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
2b260 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
2b270 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2b280 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
2b290 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
2b2a0 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
2b2b0 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
2b2c0 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
2b2d0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
2b2e0 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
2b2f0 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
2b300 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
2b310 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2b320 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2b330 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2b340 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2b350 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2b360 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
2b370 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
2b380 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
2b390 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
2b3a0 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
2b3b0 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
2b3c0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
2b3d0 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
2b3e0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2b3f0 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
2b400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b410 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
2b420 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2b430 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
2b440 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2b450 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
2b460 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66  WhereTrace & 0xf
2b470 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fff ){.    sqlit
2b480 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a  e3DebugPrintf("*
2b490 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
2b4a0 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61  rt *** (wctrlFla
2b4b0 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46  gs: 0x%x",wctrlF
2b4c0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77  lags);.    if( w
2b4d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2b4e0 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_USE_LIMIT ){. 
2b4f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2b500 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74  gPrintf(", limit
2b510 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b  : %d", iAuxArg);
2b520 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2b530 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
2b540 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
2b550 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2b560 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20  e & 0x100 ){ /* 
2b570 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
2b580 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2b590 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  lause */.    sql
2b5a0 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
2b5b0 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a  rint(sWLB.pWC);.
2b5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b5d0 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
2b5e0 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
2b5f0 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
2b600 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2b610 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
2b620 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2b630 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2b640 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54    .#ifdef WHERET
2b650 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2b660 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2b670 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20  eTrace ){    /* 
2b680 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
2b690 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2b6a0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68  ects */.      Wh
2b6b0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
2b6c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
2b6d0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2b6e0 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
2b6f0 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
2b700 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
2b710 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2b750 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
2b760 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
2b770 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
2b780 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
2b790 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
2b7a0 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
2b7b0 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  i%(sizeof(zLabel
2b7c0 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  )-1)];.        w
2b7d0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
2b7e0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
2b7f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2b800 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
2b810 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2b820 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
2b830 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2b840 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2b850 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
2b860 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
2b870 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
2b880 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2b890 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
2b8a0 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
2b8b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2b8c0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2b8d0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
2b8e0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
2b8f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
2b900 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2b910 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
2b920 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
2b930 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c  fo->revMask = AL
2b940 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28  LBITS;.  }.  if(
2b950 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2b960 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
2b970 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
2b980 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b990 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
2b9a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2b9b0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2b9c0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
2b9d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2b9e0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
2b9f0 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
2ba00 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
2ba10 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2ba20 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
2ba30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ba40 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
2ba50 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  %d,0x%llx", pWIn
2ba60 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e  fo->nOBSat, pWIn
2ba70 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
2ba80 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
2ba90 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2baa0 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
2bab0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2bac0 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
2bad0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bae0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2baf0 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
2bb00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2bb10 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2bb20 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2bb30 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2bb40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2bb50 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
2bb60 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
2bb70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2bb80 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2bb90 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2bba0 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2bbb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2bbc0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
2bbd0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2bbe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2bbf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2bc00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2bc10 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
2bc20 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  0; ii<pWInfo->nL
2bc30 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  evel; ii++){.   
2bc40 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2bc50 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e  t(pWInfo->a[ii].
2bc60 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43  pWLoop, sWLB.pWC
2bc70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2bc80 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  dif..  /* Attemp
2bc90 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
2bca0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
2bcb0 68 61 74 20 64 6f 20 6e 6f 74 20 61 66 66 65 63  hat do not affec
2bcc0 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  t the result..  
2bcd0 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 74  ** For a table t
2bce0 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  o not affect the
2bcf0 20 72 65 73 75 6c 74 2c 20 74 68 65 20 66 6f 6c   result, the fol
2bd00 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74  lowing must be t
2bd10 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
2bd20 20 31 29 20 54 68 65 20 71 75 65 72 79 20 6d 75   1) The query mu
2bd30 73 74 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  st not be an agg
2bd40 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20 20 20 32  regate..  **   2
2bd50 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74  ) The table must
2bd60 20 62 65 20 74 68 65 20 52 48 53 20 6f 66 20 61   be the RHS of a
2bd70 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a 2a   LEFT JOIN..  **
2bd80 20 20 20 33 29 20 45 69 74 68 65 72 20 74 68 65     3) Either the
2bd90 20 71 75 65 72 79 20 6d 75 73 74 20 62 65 20 44   query must be D
2bda0 49 53 54 49 4e 43 54 2c 20 6f 72 20 65 6c 73 65  ISTINCT, or else
2bdb0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2bdc0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 20 20 20   clause.  **    
2bdd0 20 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61    must contain a
2bde0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74   constraint that
2bdf0 20 6c 69 6d 69 74 73 20 74 68 65 20 73 63 61 6e   limits the scan
2be00 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
2be10 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 74 20 6d   .  **      at m
2be20 6f 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ost a single row
2be30 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54 68 65 20  ..  **   4) The 
2be40 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62  table must not b
2be50 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
2be60 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
2be70 71 75 65 72 79 20 61 70 61 72 74 0a 20 20 2a 2a  query apart.  **
2be80 20 20 20 20 20 20 66 72 6f 6d 20 69 74 73 20 6f        from its o
2be90 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63  wn USING or ON c
2bea0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
2beb0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69   For example, gi
2bec0 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ven:.  **.  **  
2bed0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2bee0 74 31 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50  t1(ipk INTEGER P
2bef0 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 31 29 3b  RIMARY KEY, v1);
2bf00 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
2bf10 20 54 41 42 4c 45 20 74 32 28 69 70 6b 20 49 4e   TABLE t2(ipk IN
2bf20 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2bf30 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20 20 20 20  Y, v2);.  **    
2bf40 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
2bf50 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49  (ipk INTEGER PRI
2bf60 4d 41 52 59 20 4b 45 59 2c 20 76 33 29 3b 0a 20  MARY KEY, v3);. 
2bf70 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e 20 74 61   **.  ** then ta
2bf80 62 6c 65 20 74 32 20 63 61 6e 20 62 65 20 6f 6d  ble t2 can be om
2bf90 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  itted from the f
2bfa0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
2bfb0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 76   **     SELECT v
2bfc0 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20  1, v3 FROM t1 . 
2bfd0 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2bfe0 4f 49 4e 20 74 32 20 55 53 49 4e 47 20 28 74 31  OIN t2 USING (t1
2bff0 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a 20 20 2a  .ipk=t2.ipk).  *
2c000 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2c010 4e 20 74 33 20 55 53 49 4e 47 20 28 74 31 2e 69  N t3 USING (t1.i
2c020 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2a 0a  pk=t3.ipk).  **.
2c030 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20 20    ** or from:.  
2c040 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2c050 43 54 20 44 49 53 54 49 4e 43 54 20 76 31 2c 20  CT DISTINCT v1, 
2c060 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a  v3 FROM t1 .  **
2c070 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
2c080 20 74 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c   t2.  **       L
2c090 45 46 54 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e  EFT JOIN t3 USIN
2c0a0 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b  G (t1.ipk=t3.ipk
2c0b0 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ).  */.  notRead
2c0c0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2c0d0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
2c0e0 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
2c0f0 52 65 73 75 6c 74 53 65 74 21 3d 30 20 20 20 20  ResultSet!=0    
2c100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67 75             /* gu
2c110 61 72 61 6e 74 65 65 73 20 63 6f 6e 64 69 74 69  arantees conditi
2c120 6f 6e 20 28 31 29 20 61 62 6f 76 65 20 2a 2f 0a  on (1) above */.
2c130 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2c140 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2c150 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
2c160 6e 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  n).  ){.    int 
2c170 69 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74  i;.    Bitmask t
2c180 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33  abUsed = sqlite3
2c190 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
2c1a0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
2c1b0 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
2c1c0 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
2c1d0 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
2c1e0 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
2c1f0 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2c200 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
2c210 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
2c220 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
2c230 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b 20  nLevel-1; i>=1; 
2c240 69 2d 2d 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i--){.      Wher
2c250 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
2c260 45 6e 64 3b 0a 20 20 20 20 20 20 73 74 72 75 63  End;.      struc
2c270 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2c280 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 70 4c 6f  pItem;.      pLo
2c290 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  op = pWInfo->a[i
2c2a0 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
2c2b0 70 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  pItem = &pWInfo-
2c2c0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2c2d0 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20 20  op->iTab];.     
2c2e0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2c2f0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
2c300 46 54 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  FT)==0 ) continu
2c310 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  e;.      if( (wc
2c320 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2c330 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d  _WANT_DISTINCT)=
2c340 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  =0.       && (pL
2c350 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2c360 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a  HERE_ONEROW)==0.
2c370 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
2c3a0 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
2c3b0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 63 6f  askSelf)!=0 ) co
2c3c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
2c3d0 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61  nd = sWLB.pWC->a
2c3e0 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   + sWLB.pWC->nTe
2c3f0 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  rm;.      for(pT
2c400 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b  erm=sWLB.pWC->a;
2c410 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65   pTerm<pEnd; pTe
2c420 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
2c430 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
2c440 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
2c450 73 6b 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20  skSelf)!=0 ){.  
2c460 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
2c470 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
2c480 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
2c490 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
2c4a0 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 45 78     || pTerm->pEx
2c4b0 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
2c4c0 62 6c 65 21 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble!=pItem->iCur
2c4d0 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20 29 7b  sor.          ){
2c4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2c4f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2c500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c510 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  }.      if( pTer
2c520 6d 3c 70 45 6e 64 20 29 20 63 6f 6e 74 69 6e 75  m<pEnd ) continu
2c530 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  e;.      WHERETR
2c540 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
2c550 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
2c560 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
2c570 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 6e  ->cId));.      n
2c580 6f 74 52 65 61 64 79 20 26 3d 20 7e 70 4c 6f 6f  otReady &= ~pLoo
2c590 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2c5a0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
2c5b0 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
2c5c0 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
2c5d0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2c5e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
2c5f0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2c600 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2c610 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2c620 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
2c630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c640 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 70 57  .      if( i!=pW
2c650 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29  Info->nLevel-1 )
2c660 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
2c670 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 6e  yte = (pWInfo->n
2c680 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69 7a  Level-1-i) * siz
2c690 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 3b  eof(WhereLevel);
2c6a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
2c6b0 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 20  (&pWInfo->a[i], 
2c6c0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d 2c  &pWInfo->a[i+1],
2c6d0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
2c6e0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
2c6f0 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
2c700 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
2c710 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
2c720 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
2c730 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
2c740 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
2c750 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
2c760 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
2c770 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
2c780 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
2c790 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
2c7a0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2c7b0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
2c7c0 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
2c7d0 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
2c7e0 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
2c7f0 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
2c800 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  opriate..  **.  
2c810 2a 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20 61 70  ** A one-pass ap
2c820 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73  proach can be us
2c830 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  ed if the caller
2c840 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 6f   has requested o
2c850 6e 65 0a 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  ne.  ** and eith
2c860 65 72 20 28 61 29 20 74 68 65 20 73 63 61 6e 20  er (a) the scan 
2c870 76 69 73 69 74 73 20 61 74 20 6d 6f 73 74 20 6f  visits at most o
2c880 6e 65 20 72 6f 77 20 6f 72 20 28 62 29 20 65 61  ne row or (b) ea
2c890 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  ch.  ** of the f
2c8a0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2c8b0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  e:.  **.  **   *
2c8c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
2c8d0 69 6e 64 69 63 61 74 65 64 20 74 68 61 74 20 61  indicated that a
2c8e0 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61   one-pass approa
2c8f0 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 0a 20  ch can be used. 
2c900 20 2a 2a 20 20 20 20 20 77 69 74 68 20 6d 75 6c   **     with mul
2c910 74 69 70 6c 65 20 72 6f 77 73 20 28 62 79 20 73  tiple rows (by s
2c920 65 74 74 69 6e 67 20 57 48 45 52 45 5f 4f 4e 45  etting WHERE_ONE
2c930 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 2c 20  PASS_MULTIROW), 
2c940 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65  and.  **   * the
2c950 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
2c960 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 61  virtual table, a
2c970 6e 64 0a 20 20 2a 2a 20 20 20 2a 20 65 69 74 68  nd.  **   * eith
2c980 65 72 20 74 68 65 20 73 63 61 6e 20 64 6f 65 73  er the scan does
2c990 20 6e 6f 74 20 75 73 65 20 74 68 65 20 4f 52 20   not use the OR 
2c9a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 72 20  optimization or 
2c9b0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2c9c0 20 20 20 20 69 73 20 61 20 44 45 4c 45 54 45 20      is a DELETE 
2c9d0 6f 70 65 72 61 74 69 6f 6e 20 28 57 48 45 52 45  operation (WHERE
2c9e0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 20 69  _DUPLICATES_OK i
2c9f0 73 20 6f 6e 6c 79 20 73 70 65 63 69 66 69 65 64  s only specified
2ca00 0a 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 44 45  .  **     for DE
2ca10 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  LETE)..  **.  **
2ca20 20 54 68 65 20 6c 61 73 74 20 71 75 61 6c 69 66   The last qualif
2ca30 69 63 61 74 69 6f 6e 20 69 73 20 62 65 63 61 75  ication is becau
2ca40 73 65 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  se an UPDATE sta
2ca50 74 65 6d 65 6e 74 20 75 73 65 73 0a 20 20 2a 2a  tement uses.  **
2ca60 20 57 68 65 72 65 49 6e 66 6f 2e 61 69 43 75 72   WhereInfo.aiCur
2ca70 4f 6e 65 50 61 73 73 5b 31 5d 20 74 6f 20 64 65  OnePass[1] to de
2ca80 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2ca90 6f 72 20 6e 6f 74 20 69 74 20 72 65 61 6c 6c 79  or not it really
2caa0 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 20   can.  ** use a 
2cab0 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63  one-pass approac
2cac0 68 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6e  h, and this is n
2cad0 6f 74 20 73 65 74 20 61 63 63 75 72 61 74 65 6c  ot set accuratel
2cae0 79 20 66 6f 72 20 73 63 61 6e 73 0a 20 20 2a 2a  y for scans.  **
2caf0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4f 52   that use the OR
2cb00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
2cb10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
2cb20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2cb30 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2cb40 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
2cb50 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
2cb60 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2cb70 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2cb80 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20  DESIRED)!=0 ){. 
2cb90 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d     int wsFlags =
2cba0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
2cbb0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2cbc0 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d     int bOnerow =
2cbd0 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
2cbe0 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20  E_ONEROW)!=0;.  
2cbf0 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c    if( bOnerow ||
2cc00 20 28 0a 20 20 20 20 20 20 20 20 30 21 3d 28 77   (.        0!=(w
2cc10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2cc20 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
2cc30 4f 57 29 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  OW).     && 0==(
2cc40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2cc50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
2cc60 20 20 20 26 26 20 28 30 3d 3d 28 77 73 46 6c 61     && (0==(wsFla
2cc70 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
2cc80 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
2cc90 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
2cca0 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20 20 20 20  ICATES_OK)).    
2ccb0 29 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  )){.      pWInfo
2ccc0 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e  ->eOnePass = bOn
2ccd0 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53  erow ? ONEPASS_S
2cce0 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f  INGLE : ONEPASS_
2ccf0 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28  MULTI;.      if(
2cd00 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69   HasRowid(pTabLi
2cd10 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26  st->a[0].pTab) &
2cd20 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  & (wsFlags & WHE
2cd30 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a  RE_IDX_ONLY) ){.
2cd40 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72          if( wctr
2cd50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2cd60 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20  NEPASS_MULTIROW 
2cd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f  ){.          bFo
2cd80 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47  rdelete = OPFLAG
2cd90 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20  _FORDELETE;.    
2cda0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57      }.        pW
2cdb0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2cdc0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73  p->wsFlags = (ws
2cdd0 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49  Flags & ~WHERE_I
2cde0 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20  DX_ONLY);.      
2cdf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2ce00 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
2ce10 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
2ce20 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
2ce30 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
2ce40 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
2ce50 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2ce60 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65  .  for(ii=0, pLe
2ce70 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
2ce80 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
2ce90 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2cea0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
2ceb0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70    /* Table to op
2cec0 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  en */.    int iD
2ced0 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b;         /* In
2cee0 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20  dex of database 
2cef0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
2cf00 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74  /index */.    st
2cf10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2cf20 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
2cf30 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2cf40 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2cf50 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
2cf60 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
2cf70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  Tab;.    iDb = s
2cf80 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2cf90 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
2cfa0 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f  chema);.    pLoo
2cfb0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
2cfc0 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
2cfd0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2cfe0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
2cff0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2d000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
2d010 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
2d020 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
2d030 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d040 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
2d050 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2d060 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2d070 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
2d080 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
2d090 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2d0a0 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
2d0b0 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
2d0c0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
2d0d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2d0e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d0f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
2d100 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
2d110 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
2d120 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2d130 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2d140 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f   ){.      /* noo
2d150 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  p */.    }else.#
2d160 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
2d170 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d180 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2d190 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2d1a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d1b0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2d1c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2d1d0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
2d1e0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  d;.      if( pWI
2d1f0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
2d200 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
2d210 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
2d220 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
2d230 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2d240 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49  ePass[0] = pTabI
2d250 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2d260 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c      };.      sql
2d270 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
2d280 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
2d290 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
2d2a0 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61  ab, op);.      a
2d2b0 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
2d2c0 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c  >iCursor==pLevel
2d2d0 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20  ->iTabCur );.   
2d2e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
2d2f0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2d300 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54  NEPASS_OFF && pT
2d310 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
2d320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2d330 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  e( pWInfo->eOneP
2d340 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2d350 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
2d360 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
2d370 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2d380 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2d390 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
2d3a0 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
2d3b0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  b) ){.        Bi
2d3c0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
2d3d0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
2d3e0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
2d3f0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
2d400 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
2d410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d420 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2d430 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  1, SQLITE_INT_TO
2d440 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
2d450 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
2d460 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
2d470 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  l );.      }.#if
2d480 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2d490 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
2d4a0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2d4b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
2d4c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2d4d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2d4e0 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  (v, OPFLAG_SEEKE
2d4f0 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  Q|bFordelete);. 
2d500 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2d510 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
2d520 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d530 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c  ngeP5(v, bFordel
2d540 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ete);.      }.#i
2d550 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2d560 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
2d570 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ASK.      sqlite
2d580 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
2d590 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
2d5a0 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  d, pTabItem->iCu
2d5b0 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  rsor, 0, 0,.    
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5d0 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75          (const u
2d5e0 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f  8*)&pTabItem->co
2d5f0 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
2d600 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2d610 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2d620 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
2d630 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
2d640 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
2d650 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
2d660 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2d670 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2d680 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  D ){.      Index
2d690 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   *pIx = pLoop->u
2d6a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
2d6b0 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43       int iIndexC
2d6c0 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  ur;.      int op
2d6d0 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
2d6e0 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67        /* iAuxArg
2d6f0 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
2d700 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
2d710 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
2d720 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
2d730 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78 41     assert( iAuxA
2d740 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  rg!=0 || (pWInfo
2d750 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2d760 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2d770 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
2d780 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2d790 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61  pTab) && IsPrima
2d7a0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a  ryKeyIndex(pIx).
2d7b0 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
2d7c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2d7d0 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20  _SUBCLAUSE)!=0. 
2d7e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d7f0 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74  /* This is one t
2d800 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74  erm of an OR-opt
2d810 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20  imization using 
2d820 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2d830 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  of a.        ** 
2d840 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
2d850 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f  ble.  No need fo
2d860 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  r a separate ind
2d870 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49  ex */.        iI
2d880 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
2d890 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20  ->iTabCur;.     
2d8a0 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20     op = 0;.     
2d8b0 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66   }else if( pWInf
2d8c0 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
2d8d0 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
2d8e0 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
2d8f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
2d900 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
2d910 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
2d920 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Arg;.        ass
2d930 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
2d940 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2d950 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
2d960 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
2d970 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
2d980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
2d990 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
2d9a0 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
2d9b0 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
2d9c0 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
2d9d0 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
2d9e0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2d9f0 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
2da00 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
2da10 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26  e if( iAuxArg &&
2da20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2da30 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2da40 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
2da50 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2da60 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70  xArg;.        op
2da70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b   = OP_ReopenIdx;
2da80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2da90 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2daa0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2dab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dac0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
2dad0 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
2dae0 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
2daf0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
2db00 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
2db10 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
2db20 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r>=0 );.      if
2db30 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
2db40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2db50 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
2db60 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
2db70 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2db80 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
2db90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
2dba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
2dbb0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2dbc0 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
2dbd0 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  T)!=0.         &
2dbe0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2dbf0 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
2dc00 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b  N_RANGE|WHERE_SK
2dc10 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20  IPSCAN))==0.    
2dc20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2dc30 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
2dc40 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
2dc50 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 57  0.         && pW
2dc60 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21  Info->eDistinct!
2dc70 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2dc80 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 20  ORDERED.        
2dc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2dca0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2dcb0 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  (v, OPFLAG_SEEKE
2dcc0 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43  Q); /* Hint to C
2dcd0 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20  OMDB2 */.       
2dce0 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65 43   }.        VdbeC
2dcf0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2dd00 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23   pIx->zName));.#
2dd10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2dd20 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2dd30 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20  MASK.        {. 
2dd40 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c           u64 col
2dd50 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Used = 0;.      
2dd60 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a      int ii, jj;.
2dd70 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2dd80 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c  =0; ii<pIx->nCol
2dd90 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  umn; ii++){.    
2dda0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78          jj = pIx
2ddb0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a  ->aiColumn[ii];.
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ddd0 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  jj<0 ) continue;
2dde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ddf0 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33   jj>63 ) jj = 63
2de00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2de10 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  ( (pTabItem->col
2de20 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a  Used & MASKBIT(j
2de30 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j))==0 ) continu
2de40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
2de50 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29  olUsed |= ((u64)
2de60 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20  1)<<(ii<63 ? ii 
2de70 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20  : 63);.         
2de80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2de90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
2dea0 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
2deb0 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c  Used, iIndexCur,
2dec0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c         (u8*)&col
2def0 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
2df00 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2df10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
2df20 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
2df30 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ASK */.      }. 
2df40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
2df50 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64  >=0 ) sqlite3Cod
2df60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2df70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
2df80 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
2df90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2dfa0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
2dfb0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2dfc0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2dfd0 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a  eginError;..  /*
2dfe0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
2dff0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
2e000 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
2e010 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
2e020 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
2e030 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
2e040 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
2e050 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
2e060 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
2e070 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
2e080 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
2e090 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
2e0a0 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
2e0b0 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
2e0c0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2e0d0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
2e0e0 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
2e0f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
2e100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e110 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2e120 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
2e130 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
2e140 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
2e150 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
2e160 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
2e170 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
2e180 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
2e190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e1a0 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
2e1b0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
2e1c0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
2e1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
2e1e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2e1f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2e200 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
2e210 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
2e220 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
2e230 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
2e240 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2e250 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2e260 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20  , wctrlFlags.   
2e270 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
2e280 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74  addrBody = sqlit
2e290 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2e2a0 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  r(v);.    notRea
2e2b0 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  dy = sqlite3Wher
2e2c0 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72  eCodeOneLoopStar
2e2d0 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f  t(pWInfo, ii, no
2e2e0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
2e2f0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2e300 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2e310 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c  t;.    if( (wsFl
2e320 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
2e330 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c  OR)==0 && (wctrl
2e340 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53  Flags&WHERE_OR_S
2e350 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a  UBCLAUSE)==0 ){.
2e360 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2e370 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
2e380 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  v, pTabList, pLe
2e390 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e  vel, addrExplain
2e3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2e3b0 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
2e3c0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2e3d0 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
2e3e0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
2e3f0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
2e400 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
2e410 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
2e420 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
2e430 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
2e440 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
2e450 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2e460 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2e470 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
2e480 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2e490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2e4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 74 20 6f 66  }../*.** Part of
2e4b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2e4c0 28 29 20 77 69 6c 6c 20 72 65 77 72 69 74 65 20  () will rewrite 
2e4d0 6f 70 63 6f 64 65 73 20 74 6f 20 72 65 66 65 72  opcodes to refer
2e4e0 65 6e 63 65 20 74 68 65 0a 2a 2a 20 69 6e 64 65  ence the.** inde
2e4f0 78 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  x rather than th
2e500 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 49  e main table.  I
2e510 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6d  n SQLITE_DEBUG m
2e520 6f 64 65 2c 20 77 65 20 77 61 6e 74 0a 2a 2a 20  ode, we want.** 
2e530 74 6f 20 74 72 61 63 65 20 74 68 6f 73 65 20 63  to trace those c
2e540 68 61 6e 67 65 73 20 69 66 20 50 52 41 47 4d 41  hanges if PRAGMA
2e550 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65   vdbe_addoptrace
2e560 3d 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  =on.  This routi
2e570 6e 65 0a 2a 2a 20 64 6f 65 73 20 74 68 61 74 2e  ne.** does that.
2e580 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2e590 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69 6e  TE_DEBUG.# defin
2e5a0 65 20 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54  e OpcodeRewriteT
2e5b0 72 61 63 65 28 44 2c 4b 2c 50 29 20 2f 2a 20 6e  race(D,K,P) /* n
2e5c0 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 73 65 0a 23 20  o-op */.#else.# 
2e5d0 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65 77  define OpcodeRew
2e5e0 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50 29  riteTrace(D,K,P)
2e5f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 70 63   sqlite3WhereOpc
2e600 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2e610 44 2c 4b 2c 50 29 0a 20 20 73 74 61 74 69 63 20  D,K,P).  static 
2e620 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
2e630 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65 54 72  eOpcodeRewriteTr
2e640 61 63 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33  ace(.    sqlite3
2e650 20 2a 64 62 2c 0a 20 20 20 20 69 6e 74 20 70 63   *db,.    int pc
2e660 2c 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ,.    VdbeOp *pO
2e670 70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 28  p.  ){.    if( (
2e680 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2e690 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
2e6a0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
2e6b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
2e6c0 72 69 6e 74 4f 70 28 30 2c 20 70 63 2c 20 70 4f  rintOp(0, pc, pO
2e6d0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
2e6e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2e6f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2e700 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
2e710 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
2e720 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e730 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2e740 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2e750 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
2e760 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
2e770 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
2e780 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
2e790 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
2e7a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2e7b0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2e7c0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2e7d0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
2e7e0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
2e7f0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2e800 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2e810 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2e820 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2e830 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2e840 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2e850 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
2e860 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2e870 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
2e880 65 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  e"));.  for(i=pW
2e890 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2e8a0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2e8b0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
2e8c0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2e8d0 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
2e8e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2e8f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2e900 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
2e910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e920 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2e930 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2e940 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d 20   int addrSeek = 
2e950 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  0;.      Index *
2e960 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIdx;.      int 
2e970 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  n;.      if( pWI
2e980 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
2e990 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2e9a0 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26 26  RDERED.       &&
2e9b0 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   i==pWInfo->nLev
2e9c0 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74 20  el-1  /* Ticket 
2e9d0 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65 33  [ef9318757b152e3
2e9e0 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f 0a  ] 2017-10-21 */.
2e9f0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2ea00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2ea10 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
2ea20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d 20       && (pIdx = 
2ea30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2ea40 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74 31  Index)->hasStat1
2ea50 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d 20  .       && (n = 
2ea60 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2ea70 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20 20  IdxCol)>0.      
2ea80 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c   && pIdx->aiRowL
2ea90 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20 20  ogEst[n]>=36.   
2eaa0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
2eab0 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  t r1 = pParse->n
2eac0 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  Mem+1;.        i
2ead0 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20 20  nt j, op;.      
2eae0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
2eaf0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2eb00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eb10 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2eb20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
2eb30 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20 20   j, r1+j);.     
2eb40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
2eb50 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b 31  rse->nMem += n+1
2eb60 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 70  ;.        op = p
2eb70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72  Level->op==OP_Pr
2eb80 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20 3a  ev ? OP_SeekLT :
2eb90 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20 20   OP_SeekGT;.    
2eba0 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20 73      addrSeek = s
2ebb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ebc0 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65  Int(v, op, pLeve
2ebd0 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20 72  l->iIdxCur, 0, r
2ebe0 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 56  1, n);.        V
2ebf0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2ec00 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
2ec10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2ec20 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
2ec30 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20 20  P_SeekGT);.     
2ec40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ec50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2ec60 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b   1, pLevel->p2);
2ec70 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
2ec80 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  /* SQLITE_DISABL
2ec90 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2eca0 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  INCT */.      /*
2ecb0 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
2ecc0 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  : Advance to the
2ecd0 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 20   next row */.   
2ece0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2ecf0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2ed00 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2ed10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ed20 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76  beAddOp3(v, pLev
2ed30 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
2ed40 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20  p1, pLevel->p2, 
2ed50 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20  pLevel->p3);.   
2ed60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ed70 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
2ed80 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62  ->p5);.      Vdb
2ed90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2eda0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2edb0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2edc0 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
2edd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2ede0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2edf0 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20  OP_Prev);.      
2ee00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2ee10 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
2ee20 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65 66  _VNext);.#ifndef
2ee30 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2ee40 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e  SKIPAHEAD_DISTIN
2ee50 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  CT.      if( add
2ee60 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33 56  rSeek ) sqlite3V
2ee70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2ee80 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69 66  ddrSeek);.#endif
2ee90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2eea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2eeb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
2eec0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
2eed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
2eee0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2eef0 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
2ef00 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
2ef10 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
2ef20 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
2ef30 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2ef40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2ef50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2ef60 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
2ef70 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
2ef80 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
2ef90 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
2efa0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
2efb0 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
2efc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2efd0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2efe0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
2eff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2f000 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f  n->eEndLoopOp!=O
2f010 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
2f020 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 6e 50 72      if( pIn->nPr
2f030 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20 20  efix ){.        
2f040 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
2f050 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2f060 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29  RE_IN_EARLYOUT )
2f070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2f080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2f090 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f 70  nt(v, OP_IfNoHop
2f0a0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
2f0b0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
2f0e0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a 20  rentAddr(v)+2,. 
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
2f110 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e 50  ->iBase, pIn->nP
2f120 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20  refix);.        
2f130 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2f140 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
2f150 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f170 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
2f180 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
2f190 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
2f1a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2f1b0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2f1c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2f1d0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2f1e0 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  pOp==OP_Prev);. 
2f1f0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
2f200 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2f210 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e  eEndLoopOp==OP_N
2f220 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ext);.        }.
2f230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f240 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2f250 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
2f260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f280 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2f290 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
2f2a0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2f2b0 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20  >addrSkip ){.   
2f2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
2f2d0 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
2f2e0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
2f2f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f300 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
2f310 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
2f320 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
2f330 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
2f340 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2f350 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2f360 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
2f370 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2f380 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2f390 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23  Skip-2);.    }.#
2f3a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
2f3b0 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
2f3c0 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c  BLOBS.    if( pL
2f3d0 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
2f3e0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2f3f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f400 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
2f410 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69   (int)(pLevel->i
2f420 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c  LikeRepCntr>>1),
2f430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f440 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
2f450 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20  >addrLikeRep);. 
2f460 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2f470 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  e(v);.    }.#end
2f480 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  if.    if( pLeve
2f490 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
2f4a0 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
2f4b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2f4c0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
2f4d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f4e0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
2f4f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56  l->iLeftJoin); V
2f500 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 77        assert( (w
2f520 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2f530 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20  LY)==0 || (ws & 
2f540 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2f550 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
2f560 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
2f570 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
2f580 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
2f590 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61 62  l->iTabCur==pTab
2f5a0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2f5b0 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29  iFrom].iCursor )
2f5c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f5d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f5e0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
2f5f0 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 20  l->iTabCur);.   
2f600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
2f610 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
2f620 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ED) .       || (
2f630 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  (ws & WHERE_MULT
2f640 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c 2d  I_OR) && pLevel-
2f650 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20 20  >u.pCovidx) .   
2f660 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
2f670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2f680 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
2f690 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
2f6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f6b0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
2f6c0 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
2f6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f6e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2f6f0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
2f700 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
2f710 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f730 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
2f740 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2f750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2f760 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2f770 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
2f780 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
2f790 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
2f7a0 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
2f7b0 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ", i,.          
2f7c0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
2f7d0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2f7e0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54  Level->iFrom].pT
2f7f0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
2f800 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
2f810 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
2f820 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
2f830 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
2f840 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
2f850 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
2f860 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f870 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
2f880 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74  reak);..  assert
2f890 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2f8a0 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
2f8b0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
2f8c0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2f8d0 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2f8e0 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
2f8f0 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  ){.    int k, la
2f900 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  st;.    VdbeOp *
2f910 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  pOp;.    Index *
2f920 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
2f930 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f940 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
2f950 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2f960 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
2f970 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2f980 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2f990 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2f9a0 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
2f9b0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
2f9c0 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  .    /* For a co
2f9d0 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65  -routine, change
2f9e0 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72   all OP_Column r
2f9f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2fa00 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2fa10 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2fa20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20  into OP_Copy of 
2fa30 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64  result contained
2fa40 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a   in a register..
2fa50 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20      ** OP_Rowid 
2fa60 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e  becomes OP_Null.
2fa70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fa80 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
2fa90 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
2faa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2fab0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2fac0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 74  ailed );.      t
2fad0 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
2fae0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c 65  Copy(pParse, pLe
2faf0 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  vel->addrBody, p
2fb00 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a  Level->iTabCur,.
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2fb30 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
2fb40 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
2fb50 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2fb60 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
2fb70 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
2fb80 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75  ake VDBE code su
2fb90 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
2fba0 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
2fbb0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
2fbc0 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74  nstead of from t
2fbd0 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70  he table where p
2fbe0 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d  ossible.  In som
2fbf0 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74  e cases.    ** t
2fc00 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2fc10 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61   prevents the ta
2fc20 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65  ble from ever be
2fc30 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20  ing read, which 
2fc40 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64  can.    ** yield
2fc50 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70   a significant p
2fc60 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
2fc70 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
2fc80 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
2fc90 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
2fca0 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
2fcb0 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
2fcc0 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
2fcd0 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
2fce0 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
2fcf0 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
2fd00 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
2fd10 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
2fd20 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
2fd30 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
2fd40 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
2fd50 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2fd60 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
2fd70 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
2fd80 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
2fd90 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
2fda0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
2fdb0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2fdc0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2fdd0 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49  _INDEXED|WHERE_I
2fde0 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
2fdf0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
2fe00 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2fe10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
2fe20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2fe30 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
2fe40 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
2fe50 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b  evel->u.pCovidx;
2fe60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2fe70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57 49  Idx.     && (pWI
2fe80 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2fe90 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48  NEPASS_OFF || !H
2fea0 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
2feb0 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21  able)).     && !
2fec0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fed0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61  .    ){.      la
2fee0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2fef0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2ff00 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
2ff10 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 23 69 66 64  ->addrBody;.#ifd
2ff20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ff30 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c        if( db->fl
2ff40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
2ff50 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
2ff60 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 54         printf("T
2ff70 52 41 4e 53 4c 41 54 45 20 6f 70 63 6f 64 65 73  RANSLATE opcodes
2ff80 20 69 6e 20 72 61 6e 67 65 20 25 64 2e 2e 25 64   in range %d..%d
2ff90 5c 6e 22 2c 20 6b 2c 20 6c 61 73 74 2d 31 29 3b  \n", k, last-1);
2ffa0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2ffb0 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
2ffc0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
2ffd0 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
2ffe0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
2fff0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
30000 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
30010 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
30020 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
30030 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
30040 50 5f 43 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20  P_Column.#ifdef 
30050 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
30060 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
30070 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f         || pOp->o
30080 70 63 6f 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74  pcode==OP_Offset
30090 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
300a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
300b0 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20   x = pOp->p2;.  
300c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
300d0 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54  pIdx->pTable==pT
300e0 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab );.          
300f0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
30100 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
30110 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
30120 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
30130 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
30140 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50            x = pP
30150 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a  k->aiColumn[x];.
30160 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
30170 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
30180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30190 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
301a0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c  umnOfIndex(pIdx,
301b0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   x);.          i
301c0 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
301d0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
301e0 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   x;.            
301f0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
30200 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
30210 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77         OpcodeRew
30220 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c  riteTrace(db, k,
30230 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
30240 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
30250 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
30260 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
30270 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
30280 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
30290 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65   || pWInfo->eOne
302a0 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20  Pass );.        
302b0 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
302c0 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
302d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
302e0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
302f0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
30300 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
30310 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
30320 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77         OpcodeRew
30330 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c  riteTrace(db, k,
30340 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d   pOp);.        }
30350 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
30360 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52  code==OP_IfNullR
30370 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
30380 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
30390 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
303a0 20 20 20 20 20 4f 70 63 6f 64 65 52 65 77 72 69       OpcodeRewri
303b0 74 65 54 72 61 63 65 28 64 62 2c 20 6b 2c 20 70  teTrace(db, k, p
303c0 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Op);.        }. 
303d0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
303e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
303f0 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
30400 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
30410 70 54 72 61 63 65 20 29 20 70 72 69 6e 74 66 28  pTrace ) printf(
30420 22 54 52 41 4e 53 4c 41 54 45 20 63 6f 6d 70 6c  "TRANSLATE compl
30430 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ete\n");.#endif.
30440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
30450 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
30460 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
30470 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
30480 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
30490 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
304a0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
304b0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.