/ Hex Artifact Content
Login

Artifact 83b6cf94d98ff9a2185071aeed664a57922999a6dd58a03dbb379d472314e4b2:


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 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
6f50: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
6f60: 29 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  );.  pTabItem = 
6f70: 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  &pWC->pWInfo->pT
6f80: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
6f90: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20  ->iFrom];.  if( 
6fa0: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6fb0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6fc0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
6fd0: 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
6fe0: 75 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75  urn;.    addrCou
6ff0: 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  nter = sqlite3Vd
7000: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7010: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
7020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7030: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
7040: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
7050: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
7060: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
7070: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71     addrTop =  sq
7080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7090: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
70a0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
70b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
70c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
70d0: 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
70e0: 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
70f0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
7100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
7110: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
7120: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
7130: 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
7140: 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
7150: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7160: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
7170: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
7180: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
7190: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
71a0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
71b0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
71c0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
71d0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
71e0: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
71f0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
7200: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
7210: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
7220: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7230: 72 73 65 29 3b 0a 20 20 72 65 67 42 61 73 65 20  rse);.  regBase 
7240: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
7250: 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 20 20 20  eIndexKey(.     
7260: 20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70   pParse, pIdx, p
7270: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
7280: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
7290: 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c   0, 0.  );.  sql
72a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
72b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
72c0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
72d0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
72e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
72f0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
7300: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69  SEEKRESULT);.  i
7310: 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71  f( pPartial ) sq
7320: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7330: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
7340: 75 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49  ue);.  if( pTabI
7350: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
7360: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
7380: 76 2c 20 61 64 64 72 43 6f 75 6e 74 65 72 2c 20  v, addrCounter, 
7390: 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20  regBase+n);.    
73a0: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
73b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
73c0: 65 64 20 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  ed );.    transl
73d0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
73e0: 70 50 61 72 73 65 2c 20 61 64 64 72 54 6f 70 2c  pParse, addrTop,
73f0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7410: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
7430: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
7440: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
7450: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
7460: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
7470: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
7480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7490: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
74a0: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
74b0: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
74c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
74d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
74e0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
74f0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
7500: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
7510: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7520: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
7530: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7540: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7550: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
7560: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
7570: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
7580: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
7590: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
75a0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
75b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
75c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
75d0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
75e0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
75f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
7610: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
7620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7630: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
7640: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7650: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7660: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
7670: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7680: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
7690: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
76a0: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
76b0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
76c0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
76d0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
76e0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
76f0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
7700: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
7710: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7720: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7730: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7740: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7750: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7760: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7770: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7790: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
77a0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
77b0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
77c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
77d0: 45 52 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ERE clause being
77e0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
77f0: 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
7800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7810: 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77  * Ignore terms w
7820: 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65 71  ith these prereq
7830: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7840: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
7850: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
7860: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
7870: 68 61 74 20 69 73 20 74 68 65 20 76 74 61 62 20  hat is the vtab 
7880: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7890: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
78a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
78b0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
78c0: 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20   u16 *pmNoOmit  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d   /* Mask of term
78f0: 73 20 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f  s not to omit */
7900: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
7910: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
7920: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7930: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
7940: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
7950: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7960: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
7970: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
7980: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7990: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
79a0: 70 55 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74  pUsage;.  struct
79b0: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
79c0: 20 2a 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65   *pHidden;.  Whe
79d0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
79e0: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
79f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7a00: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
7a10: 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30   u16 mNoOmit = 0
7a20: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
7a30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
7a40: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
7a50: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
7a60: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
7a70: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
7a80: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
7a90: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
7aa0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
7ab0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
7ac0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
7ad0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
7ae0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
7af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7b00: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7b10: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7b20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7b30: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7b40: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7b50: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7b60: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7b70: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7b80: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7ba0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7bb0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
7bc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7bd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7be0: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
7bf0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7c00: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7c10: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7c20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7c30: 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29  (WO_EQUIV))==0 )
7c40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7c50: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7c60: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7c70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7c80: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
7c90: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
7ca0: 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b   );.    nTerm++;
7cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
7cc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7cd0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
7ce0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
7cf0: 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
7d00: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
7d10: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
7d20: 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
7d30: 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
7d40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7d50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
7d60: 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
7d70: 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
7d80: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
7d90: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
7da0: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
7db0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7dc0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
7dd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
7de0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
7df0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
7e00: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
7e10: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
7e20: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
7e30: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
7e40: 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
7e50: 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
7e60: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
7e70: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7e80: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
7e90: 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
7ea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7eb0: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7ec0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
7ed0: 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
7ef0: 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
7f00: 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
7f10: 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
7f40: 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
7f50: 4f 72 64 65 72 42 79 20 2b 20 73 69 7a 65 6f 66  OrderBy + sizeof
7f60: 28 2a 70 48 69 64 64 65 6e 29 20 29 3b 0a 20 20  (*pHidden) );.  
7f70: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
7f80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fa0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
7fb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7fc0: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
7fd0: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
7fe0: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
7ff0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8000: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
8010: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
8020: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
8030: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
8040: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
8050: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
8060: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
8070: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
8080: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
8090: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
80a0: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
80b0: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64  ds..  */.  pHidd
80c0: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 48 69 64  en = (struct Hid
80d0: 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
80e0: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
80f0: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
8100: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8110: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 48 69 64  onstraint*)&pHid
8120: 64 65 6e 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  den[1];.  pIdxOr
8130: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
8140: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8150: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
8160: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
8170: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
8180: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
8190: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
81a0: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
81b0: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
81c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
81d0: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
81e0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
81f0: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
8200: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
8210: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8220: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
8230: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
8240: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
8250: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8260: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
8270: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
8280: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
8290: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
82a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
82b0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
82c0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
82d0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 70 48 69    pUsage;..  pHi
8330: 64 64 65 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  dden->pWC = pWC;
8340: 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 50 61 72  .  pHidden->pPar
8350: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8360: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
8370: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
8380: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
8390: 2b 2b 29 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b  ++){.    u16 op;
83a0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
83b0: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
83c0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
83d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
83e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
83f0: 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29  ht & mUnusable )
8400: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
8410: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
8420: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
8430: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
8440: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
8450: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8460: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
8470: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8480: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8490: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
84a0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
84b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
84c0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
84d0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
84e0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
84f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
8500: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
8510: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
8520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8530: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
8540: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
8550: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
8560: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c  sert( pTerm->u.l
8570: 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20  eftColumn>=(-1) 
8580: 29 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  );.    pIdxCons[
8590: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
85a0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
85b0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
85c0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
85d0: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 70 54 65 72  i;.    op = pTer
85e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
85f0: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
8600: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
8610: 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f  WO_EQ;.    if( o
8620: 70 3d 3d 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20  p==WO_AUX ){.   
8630: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8640: 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63  p = pTerm->eMatc
8650: 68 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  hOp;.    }else i
8660: 66 28 20 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55  f( op & (WO_ISNU
8670: 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  LL|WO_IS) ){.   
8680: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53     if( op==WO_IS
8690: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
86a0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
86b0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
86c0: 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b  NSTRAINT_ISNULL;
86d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86e0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
86f0: 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ].op = SQLITE_IN
8700: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
8710: 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
8720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
8730: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
8740: 29 6f 70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  )op;.      /* Th
8750: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
8760: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
8770: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
8780: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
8790: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57  e.      ** the W
87a0: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
87b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
87c0: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
87d0: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20  cal.  The.      
87e0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
87f0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
8800: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20   fact. */.      
8810: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
8820: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8830: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
8840: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
8850: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8860: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
8870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8880: 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
8890: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
88a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
88b0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
88c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
88d0: 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GT );.      asse
88e0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
88f0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8900: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_GE );.      a
8910: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
8920: 70 65 72 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57  perator&(WO_IN|W
8930: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
8940: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
8950: 41 55 58 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  AUX) );..      i
8960: 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  f( op & (WO_LT|W
8970: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8980: 29 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  ).       && sqli
8990: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
89a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
89b0: 69 67 68 74 29 20 0a 20 20 20 20 20 20 29 7b 0a  ight) .      ){.
89c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 31 36          if( i<16
89d0: 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31   ) mNoOmit |= (1
89e0: 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   << i);.        
89f0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20  if( op==WO_LT ) 
8a00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a10: 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20   WO_LE;.        
8a20: 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20  if( op==WO_GT ) 
8a30: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a40: 20 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a   WO_GE;.      }.
8a50: 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a      }..    j++;.
8a60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
8a70: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
8a80: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8a90: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8aa0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
8ab0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
8ac0: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
8ad0: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
8ae0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
8af0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
8b00: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
8b10: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f   *pmNoOmit = mNo
8b20: 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Omit;.  return p
8b30: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
8b40: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
8b50: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
8b60: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
8b70: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8b80: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
8b90: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
8ba0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
8bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
8bc0: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
8bd0: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
8be0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
8bf0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
8c00: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8c10: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
8c20: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
8c30: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
8c40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8c50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8c60: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
8c70: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
8c80: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
8c90: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
8ca0: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
8cb0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8cc0: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
8cd0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
8ce0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
8cf0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8d00: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
8d10: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
8d20: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
8d30: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
8d40: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
8d50: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8d60: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
8d70: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8d80: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
8d90: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
8da0: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
8db0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
8dc0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
8dd0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
8de0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
8df0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
8e00: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
8e10: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
8e20: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
8e30: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
8e40: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
8e50: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
8e60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
8e70: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
8e80: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
8e90: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
8ea0: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
8eb0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
8ec0: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
8ed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8ee0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8ef0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
8f00: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
8f10: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
8f20: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
8f30: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
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 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8f70: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8fa0: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8fb0: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8fd0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8fe0: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
8ff0: 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f   = 0;..#if 0.  /
9000: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
9010: 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68  now caught by th
9020: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53  e caller..  ** S
9030: 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74  earch for "xBest
9040: 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
9050: 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f  n" below */.  fo
9060: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
9070: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
9080: 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
9090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
90a0: 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
90b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
90c0: 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
90d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
90f0: 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
9100: 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
9110: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
9120: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
9130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9140: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
9150: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
9160: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
9170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9180: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
9190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
91a0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
91b0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
91c0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
91d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
91e0: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
91f0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
9200: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
9210: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
9220: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
9230: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
9240: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
9250: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
9260: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
9270: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
9280: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
9290: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
92a0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
92b0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
92c0: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
92d0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
92e0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
92f0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
9300: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
9310: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
9320: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
9330: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9340: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
9350: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
9360: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
9370: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
9380: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9390: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
93a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
93b0: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
93c0: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
93d0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
93e0: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
93f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
9400: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9410: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
9420: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
9430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9440: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
9450: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
9460: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
9470: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
9480: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
9490: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
94a0: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
94c0: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
94d0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
94e0: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
94f0: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
9500: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
9510: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
9520: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
9530: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
9540: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
9550: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
9580: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
9590: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
95a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
95c0: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
95d0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
95e0: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
9600: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
9610: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
9620: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
9630: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
9640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9650: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
9660: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
9670: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
96a0: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
96b0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
96c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
96d0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
96e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
96f0: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
9700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9710: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9720: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
9730: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
9740: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
9750: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
9760: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
9770: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
9780: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9790: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
97a0: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
97b0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
97c0: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
97d0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
97e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
97f0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
9800: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
9810: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
9820: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
9830: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
9840: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
9850: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
9860: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
9870: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
9880: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
9890: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
98a0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
98b0: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
98c0: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
98d0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
98e0: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
98f0: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
9900: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
9910: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
9920: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
9930: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
9940: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
9950: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9960: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
9970: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
9980: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
9990: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
99a0: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
99b0: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
99c0: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
99d0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
99e0: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
99f0: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
9a00: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
9a10: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
9a20: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9a30: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
9a40: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
9a50: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
9a60: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9a70: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
9a80: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
9a90: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
9aa0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9ab0: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
9ac0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
9ad0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
9ae0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
9af0: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
9b00: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
9b10: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
9b20: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
9b30: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
9b40: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
9b50: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
9b60: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
9b70: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
9b80: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
9b90: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
9ba0: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
9bb0: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
9bc0: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
9bd0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
9be0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
9bf0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
9c00: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
9c10: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
9c20: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
9c30: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
9c40: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
9c50: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
9c60: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
9c70: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
9c80: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
9c90: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9ca0: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
9cb0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
9cc0: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
9cd0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
9ce0: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
9cf0: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
9d00: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
9d10: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
9d20: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
9d30: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
9d40: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
9d50: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
9d60: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
9d70: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9d80: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
9d90: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
9da0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
9db0: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
9dc0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
9dd0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9de0: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
9df0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
9e00: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
9e10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9e20: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
9e30: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
9e40: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
9e50: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
9e60: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
9e70: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
9e80: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
9e90: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
9ea0: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
9eb0: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
9ec0: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
9ed0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
9ee0: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
9ef0: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
9f00: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
9f10: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
9f20: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
9f30: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
9f40: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
9f50: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
9f60: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
9f70: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
9f80: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
9f90: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
9fa0: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
9fb0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
9fc0: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
9fd0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
a000: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
a010: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
a020: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
a030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a040: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
a050: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
a060: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
a070: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
a080: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
a090: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
a0a0: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
a0b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
a0c0: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
a0d0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
a0e0: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
a0f0: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
a100: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
a110: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
a120: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
a130: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
a140: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
a150: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
a160: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
a170: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
a180: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
a190: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
a1a0: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
a1b0: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
a1c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
a1d0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
a1e0: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
a1f0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a200: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a210: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a220: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
a240: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
a250: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
a260: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a270: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
a280: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
a290: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
a2a0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
a2b0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
a2c0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
a2d0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
a2e0: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
a2f0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
a300: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
a310: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
a320: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
a330: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
a340: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
a350: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
a360: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
a370: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
a380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
a390: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
a3a0: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
a3b0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
a3c0: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
a3d0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
a3e0: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
a3f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a400: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
a410: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
a420: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
a430: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
a440: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
a450: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
a460: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
a470: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
a480: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
a490: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
a4a0: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
a4b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
a4c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a4d0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
a4e0: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
a4f0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
a500: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
a510: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
a520: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
a530: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a540: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
a550: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a560: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
a570: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
a580: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a590: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
a5a0: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
a5b0: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
a5c0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
a5d0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
a5e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a5f0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a600: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
a610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a620: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
a630: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
a640: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
a650: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
a660: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
a670: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
a680: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
a690: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
a6a0: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
a6b0: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
a6c0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a6d0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
a6e0: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
a6f0: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
a700: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
a710: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
a720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a730: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
a750: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a760: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a770: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
a780: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
a790: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a7a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a7b0: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
a7c0: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
a7d0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
a7e0: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
a7f0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
a800: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
a810: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a820: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
a830: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
a840: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
a850: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
a860: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
a870: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
a880: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
a890: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
a8a0: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
a8b0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
a8c0: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
a8d0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
a8e0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
a8f0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a900: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
a910: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a920: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
a930: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
a940: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
a950: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
a960: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a970: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a980: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
a990: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
a9a0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a9b0: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
a9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
a9d0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a9e0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a9f0: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
aa00: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
aa20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
aa30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
aa40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
aa50: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
aa60: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
aa70: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
aa80: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
aa90: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
aaa0: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
aab0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
aac0: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
aad0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
aae0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
aaf0: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
ab00: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
ab10: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
ab20: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
ab30: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
ab40: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
ab50: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
ab60: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
ab70: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
ab80: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
ab90: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
aba0: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
abb0: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
abc0: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
abd0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
abe0: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
abf0: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
ac00: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
ac10: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
ac20: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
ac30: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
ac40: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
ac50: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
ac60: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
ac70: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
ac80: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
ac90: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
aca0: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
acb0: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
acc0: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
acd0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
acf0: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
ad00: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
ad10: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
ad20: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
ad30: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
ad40: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
ad50: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
ad60: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
ad70: 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  Eq[nField-1];.  
ad80: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
ad90: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
ada0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
adb0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
adc0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
add0: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
ade0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
adf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ae00: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
ae10: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
ae20: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
ae30: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
ae40: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
ae50: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
ae60: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
ae70: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
ae80: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
ae90: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
aea0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
aeb0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
aec0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
aed0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
aee0: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
aef0: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
af00: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
af10: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
af20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
af30: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
af40: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
af50: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
af60: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
af70: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
af80: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
af90: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
afa0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
afb0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
afc0: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
afd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
afe0: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
aff0: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
b000: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
b010: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
b020: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
b030: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
b040: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
b050: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
b060: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
b070: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
b080: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
b090: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
b0a0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
b0b0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
b0c0: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
b0d0: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
b0e0: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
b0f0: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
b100: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
b110: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
b120: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
b130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
b140: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
b150: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
b160: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
b170: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
b180: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
b190: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
b1a0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
b1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
b1c0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
b1d0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
b1e0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b1f0: 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62  nity(sqlite3 *db
b200: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
b210: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65  nt iCol){.  asse
b220: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
b230: 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Col<pIdx->nColum
b240: 6e 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78  n );.  if( !pIdx
b250: 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20  ->zColAff ){.   
b260: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
b270: 78 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c  xAffinityStr(db,
b280: 20 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75   pIdx)==0 ) retu
b290: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  rn SQLITE_AFF_BL
b2a0: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
b2b0: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69   pIdx->zColAff[i
b2c0: 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Col];.}.#endif..
b2d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b2e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b2f0: 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TAT4./* .** This
b300: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
b310: 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  led to estimate 
b320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b330: 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a  ws visited by a.
b340: 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e  ** range-scan on
b350: 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64   a skip-scan ind
b360: 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ex. For example:
b370: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
b380: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
b390: 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45  , b, c);.**   SE
b3a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
b3b0: 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42  HERE a=? AND c B
b3c0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a  ETWEEN ? AND ?;.
b3d0: 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f  **.** Value pLoo
b3e0: 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65  p->nOut is curre
b3f0: 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
b400: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
b410: 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73   of rows .** vis
b420: 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e  ited for scannin
b430: 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e  g (a=? AND b=?).
b440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b450: 65 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69  educes that esti
b460: 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65  mate .** by some
b470: 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75   factor to accou
b480: 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45  nt for the (c BE
b490: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65  TWEEN ? AND ?) e
b4a0: 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a  xpression based.
b4b0: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20  ** on the stat4 
b4c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64  data for the ind
b4d0: 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69  ex. this scan wi
b4e0: 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d  ll be peformed m
b4f0: 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
b500: 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  s (once for each
b510: 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69   (a,b) combinati
b520: 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  on that matches 
b530: 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69  a=?) is dealt wi
b540: 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  th .** by the ca
b550: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64  ller..**.** It d
b560: 6f 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e  oes this by scan
b570: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
b580: 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20   stat4 samples, 
b590: 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73  comparing values
b5a0: 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72  .** extracted fr
b5b0: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
b5c0: 70 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f  pper with the co
b5d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
b5e0: 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61  mn in each.** sa
b5f0: 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55  mple. If L and U
b600: 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20   are the number 
b610: 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64  of samples found
b620: 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
b630: 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20   or.** equal to 
b640: 74 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61  the values extra
b650: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b660: 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
b670: 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a  ectively, and.**
b680: 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20   N is the total 
b690: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b6a0: 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f  s, the pLoop->nO
b6b0: 75 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75  ut value is adju
b6c0: 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  sted.** as follo
b6d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74  ws:.**.**   nOut
b6e0: 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28   = nOut * ( min(
b6f0: 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a  U - L, 1) / N ).
b700: 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20  **.** If pLower 
b710: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61  is NULL, or a va
b720: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
b730: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b740: 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73   term, L is.** s
b750: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70  et to zero. If p
b760: 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Upper is NULL, o
b770: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
b780: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
b790: 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73  om it,.** U is s
b7a0: 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e  et to N..**.** N
b7b0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  ormally, this fu
b7c0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44  nction sets *pbD
b7d0: 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20  one to 1 before 
b7e0: 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76  returning. Howev
b7f0: 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c  er,.** if no val
b800: 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ue can be extrac
b810: 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20  ted from either 
b820: 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72  pLower or pUpper
b830: 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20   (and so the.** 
b840: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
b850: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64  number of rows d
b860: 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73  elivered remains
b870: 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62   unchanged), *pb
b880: 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20  Done.** is left 
b890: 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  as is..**.** If 
b8a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b8b0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
b8c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b8d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
b8e0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  * SQLITE_OK..*/.
b8f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
b900: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
b910: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b920: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
b930: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
b940: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
b950: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
b960: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
b970: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
b980: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
b990: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b9a0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b9b0: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
b9c0: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
b9d0: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
b9e0: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
b9f0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
ba00: 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64  pLoop,    /* Upd
ba10: 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61  ate the .nOut va
ba20: 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  lue of this loop
ba30: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e   */.  int *pbDon
ba40: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e          /* Se
ba50: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20  t to true if at 
ba60: 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20  least one expr. 
ba70: 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  value extracted 
ba80: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
ba90: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
baa0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
bab0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
bac0: 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69  tree.nEq;.  sqli
bad0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
bae0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77  ->db;.  int nLow
baf0: 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e  er = -1;.  int n
bb00: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70  Upper = p->nSamp
bb10: 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  le+1;.  int rc =
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
bb30: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
bb40: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
bb50: 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20  y(db, p, nEq);. 
bb60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bb70: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  .  .  sqlite3_va
bb80: 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  lue *p1 = 0;    
bb90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
bba0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
bbb0: 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ower */.  sqlite
bbc0: 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b  3_value *p2 = 0;
bbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
bbe0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
bbf0: 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71  m pUpper */.  sq
bc00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
bc10: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
bc20: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
bc30: 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a   from record */.
bc40: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
bc50: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
bc60: 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c  pParse, p->azCol
bc70: 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70  l[nEq]);.  if( p
bc80: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20  Lower ){.    rc 
bc90: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
bca0: 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
bcb0: 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  se, pLower->pExp
bcc0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
bcd0: 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72  &p1);.    nLower
bce0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
bcf0: 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51  pUpper && rc==SQ
bd00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
bd10: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
bd20: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
bd30: 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45  arse, pUpper->pE
bd40: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
bd50: 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70  , &p2);.    nUpp
bd60: 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d  er = p2 ? 0 : p-
bd70: 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20  >nSample;.  }.. 
bd80: 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b   if( p1 || p2 ){
bd90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bda0: 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66  int nDiff;.    f
bdb0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
bdc0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53  TE_OK && i<p->nS
bdd0: 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
bde0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
bdf0: 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70  tat4Column(db, p
be00: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  ->aSample[i].p, 
be10: 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  p->aSample[i].n,
be20: 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20   nEq, &pVal);.  
be30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
be40: 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20  TE_OK && p1 ){. 
be50: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
be60: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
be70: 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p1, pVal, pCo
be80: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
be90: 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72   res>=0 ) nLower
bea0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20  _OK && p2 ){.   
bed0: 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
bee0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
bef0: 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p2, pVal, pColl
bf00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
bf10: 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b  es>=0 ) nUpper++
bf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bf30: 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70      nDiff = (nUp
bf40: 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20  per - nLower);. 
bf50: 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20     if( nDiff<=0 
bf60: 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20  ) nDiff = 1;..  
bf70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
bf80: 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
bf90: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73  nd lower bound s
bfa0: 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68  pecified, and th
bfb0: 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e .    ** compar
bfc0: 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74  isons indicate t
bfd0: 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hat they are clo
bfe0: 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65  se together, use
bff0: 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20   the fallback.  
c000: 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73    ** method (ass
c010: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61  ume that the sca
c020: 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66  n visits 1/64 of
c030: 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65   the rows) for e
c040: 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a  stimating.    **
c050: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c060: 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68  ows visited. Oth
c070: 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65  erwise, estimate
c080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c090: 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ows.    ** using
c0a0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c0b0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61  ribed in the hea
c0c0: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
c0d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
c0e0: 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21  /.    if( nDiff!
c0f0: 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20  =1 || pUpper==0 
c100: 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a  || pLower==0 ){.
c110: 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73        int nAdjus
c120: 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45  t = (sqlite3LogE
c130: 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d  st(p->nSample) -
c140: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
c150: 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c  Diff));.      pL
c160: 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64  oop->nOut -= nAd
c170: 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44  just;.      *pbD
c180: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57  one = 1;.      W
c190: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
c1a0: 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61  ("range skip-sca
c1b0: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
c1c0: 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74  u  adjust=%d est
c1d0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65     nLower, nUppe
c200: 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70  r, nAdjust*-1, p
c210: 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20  Loop->nOut));.  
c220: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
c230: 20 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e    assert( *pbDon
c240: 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  e==0 );.  }..  s
c250: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c260: 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p1);.  sqlite3Va
c270: 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73  lueFree(p2);.  s
c280: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c290: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
c2a0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c2b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c2c0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c2e0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
c2f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c300: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
c310: 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
c320: 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
c330: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
c340: 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
c350: 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
c360: 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
c370: 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
c380: 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
c390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c3a0: 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
c3b0: 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
c3c0: 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
c3d0: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
c3e0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c3f0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
c400: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
c410: 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
c420: 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
c430: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
c440: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c450: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c470: 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
c480: 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
c4d0: 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
c4e0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
c4f0: 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
c500: 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
c510: 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
c520: 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
c530: 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
c540: 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
c550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
c560: 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
c570: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
c580: 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  q) is the number
c590: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
c5a0: 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
c5b0: 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  to the range con
c5c0: 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
c5d0: 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
c5e0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61  umber of.** equa
c5f0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
c600: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
c610: 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
c620: 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
c630: 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20  le,.** assuming 
c640: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
c650: 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
c660: 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
c670: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c680: 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
c690: 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
c6a0: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
c6b0: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31   nEq is set to 1
c6c0: 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
c6d0: 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
c6e0: 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  , b, is the seco
c6f0: 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  nd .** left-most
c700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
c710: 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
c720: 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
c730: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
c740: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
c750: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
c760: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
c770: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  to 0..**.** When
c780: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c790: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74  s called, *pnOut
c7a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
c7b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f  qlite3LogEst() o
c7c0: 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
c7d0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65  of rows that the
c7e0: 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65   index scan is e
c7f0: 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74  xpected to visit
c800: 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e   without .** con
c810: 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e  sidering the ran
c820: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ge constraints. 
c830: 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65  If nEq is 0, the
c840: 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20  n *pnOut is the 
c850: 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f  number of .** ro
c860: 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ws in the index.
c870: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
c880: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75  or occurs, *pnOu
c890: 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72  t is adjusted (r
c8a0: 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63  educed).** to ac
c8b0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61  count for the ra
c8c0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
c8d0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c8e0: 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
c8f0: 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
c900: 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
c910: 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
c920: 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
c930: 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67  .** used, a sing
c940: 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  le range inequal
c950: 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
c960: 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
c970: 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a  a factor of 4. .
c980: 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66  ** and a pair of
c990: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
c9a0: 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
c9b0: 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
c9c0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
c9d0: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
c9e0: 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a  actor of 64..*/.
c9f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
ca00: 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
ca10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ca20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ca30: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
ca40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
ca50: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
ca60: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
ca70: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
ca80: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
ca90: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
caa0: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
cab0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
cac0: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
cad0: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
cae0: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
caf0: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
cb00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
cb10: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
cb20: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
cb30: 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
cb40: 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
cb50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
cb60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cb70: 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
cb80: 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
cb90: 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
cba0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
cbb0: 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
cbc0: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
cbd0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
cbe0: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
cbf0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
cc00: 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
cc10: 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
cc20: 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  leCol ){.    if(
cc30: 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
cc40: 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20  nRecValid ){.   
cc50: 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
cc60: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
cc70: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20  er->pRec;.      
cc80: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
cc90: 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70      int nBtm = p
cca0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
ccb0: 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  tm;.      int nT
ccc0: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
ccd0: 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20  ree.nTop;..     
cce0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
ccf0: 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
cd00: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
cd10: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
cd20: 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
cd30: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
cd40: 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
cd50: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
cd60: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
cd70: 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
cd80: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
cd90: 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
cda0: 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
cdb0: 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
cdc0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
cdd0: 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
cde0: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
cdf0: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
ce00: 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
ce10: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
ce20: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
ce30: 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
ce40: 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
ce50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ce60: 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
ce70: 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
ce80: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
ce90: 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
cea0: 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
ceb0: 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
cec0: 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
ced0: 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
cee0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
cef0: 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
cf00: 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
cf10: 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
cf20: 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
cf30: 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
cf40: 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
cf50: 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
cf60: 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
cf70: 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
cf80: 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
cf90: 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
cfa0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
cfb0: 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
cfc0: 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
cfd0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
cfe0: 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
cff0: 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
d000: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d020: 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
d030: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d040: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d050: 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
d060: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
d070: 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
d080: 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
d090: 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
d0a0: 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
d0b0: 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
d0c0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
d0d0: 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
d0e0: 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
d0f0: 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
d100: 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
d110: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
d120: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
d130: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
d140: 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
d150: 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
d160: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d170: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
d180: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
d190: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
d1a0: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d1b0: 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
d1c0: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
d1d0: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d1e0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d1f0: 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
d200: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d210: 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
d220: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
d230: 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
d240: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
d250: 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
d260: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
d270: 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
d280: 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
d290: 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
d2a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
d2b0: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
d2c0: 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
d2d0: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
d2e0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
d2f0: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
d300: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
d310: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
d320: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
d330: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d340: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
d350: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
d360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d370: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
d380: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
d390: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
d3a0: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
d3b0: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
d3c0: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
d3d0: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
d3e0: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
d3f0: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
d400: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
d410: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
d420: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d430: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d440: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
d450: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
d460: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
d470: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d480: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
d490: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
d4a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
d4b0: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
d4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
d4d0: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d4e0: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
d4f0: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
d500: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
d510: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
d520: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
d530: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
d540: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
d550: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
d560: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
d570: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
d580: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
d590: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
d5a0: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
d5b0: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
d5c0: 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74     SWAP(int, nBt
d5d0: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  m, nTop);.      
d5e0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
d5f0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
d600: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
d610: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
d620: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
d630: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
d640: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
d670: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
d680: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
d690: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
d6a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
d6b0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d6c0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d6d0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d6e0: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
d6f0: 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Btm, nEq, &n);. 
d700: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
d710: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
d730: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
d740: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
d750: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
d760: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d770: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d780: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
d790: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
d7a0: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
d7b0: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
d7c0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d7d0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
d7e0: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
d7f0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
d800: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
d810: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d820: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d830: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d840: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d850: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d860: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d880: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d890: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d8a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d8b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d8c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d8d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d8e0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d900: 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   Values extracte
d910: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
d920: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
d930: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
d940: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
d950: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d960: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d970: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
d980: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f  pRec, pExpr, nTo
d990: 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20  p, nEq, &n);.   
d9a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d9b0: 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20  ITE_OK && n ){. 
d9c0: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
d9d0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
d9e0: 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47   u16 mask = WO_G
d9f0: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
da00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
da10: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
da20: 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28  pr)>n ) mask = (
da30: 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20  WO_LE|WO_LT);.  
da40: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
da50: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
da60: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
da70: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
da80: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
da90: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
daa0: 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b  tor & mask) ? a[
dab0: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
dac0: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
dad0: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
dae0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
daf0: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
db00: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
db10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
db20: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
db30: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
db40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
db50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
db60: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
db70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
db80: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
db90: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
dba0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
dbb0: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
dbc0: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
dbd0: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
dbe0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
dbf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
dc00: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
dc10: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
dc20: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
dc30: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
dc40: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
dc50: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
dc60: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
dc70: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
dc80: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
dc90: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
dca0: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
dcb0: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
dcc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
dcd0: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
dce0: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
dcf0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
dd00: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
dd10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dd20: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
dd30: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
dd40: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
dd50: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
dd70: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
dd80: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
dd90: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
dda0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
ddb0: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
ddc0: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
ddd0: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
de00: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
de10: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
de20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
de30: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
de40: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
de50: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
de60: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
de70: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
de80: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
de90: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
dea0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
deb0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
dec0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
ded0: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
dee0: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
def0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
df00: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
df10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
df20: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
df30: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
df40: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
df50: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
df60: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
df70: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
df80: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
df90: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
dfa0: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
dfb0: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
dfc0: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
dfd0: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
dfe0: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
dff0: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e000: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e010: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e020: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e030: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e040: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e050: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e060: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e070: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e080: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e090: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e0a0: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e0b0: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e0c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e0d0: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e0e0: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e0f0: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e100: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e110: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e120: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e130: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e140: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e150: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e160: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e170: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e180: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e190: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e1a0: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e1b0: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e1c0: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e1d0: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e1e0: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e1f0: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e200: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e210: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e220: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e230: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
e240: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
e250: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
e260: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
e290: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
e2a0: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
e2b0: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
e2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e2d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e2e0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e2f0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
e300: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
e310: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
e320: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
e330: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
e340: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e350: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
e360: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
e370: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
e380: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
e390: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
e3a0: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
e3b0: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
e3c0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
e3d0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
e3e0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
e3f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
e400: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
e410: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
e420: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
e430: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
e440: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
e450: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
e460: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
e470: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
e480: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
e490: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
e4a0: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
e4b0: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
e4c0: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
e4d0: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
e4e0: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
e4f0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
e500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
e510: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
e520: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
e530: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e540: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
e550: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
e560: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
e570: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
e580: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
e590: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
e5a0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
e5b0: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
e5c0: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
e5d0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
e5e0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
e5f0: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
e600: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e620: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e630: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e640: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e650: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e660: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
e670: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
e680: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
e690: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
e6a0: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
e6b0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
e6c0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
e6d0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
e6e0: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
e6f0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
e700: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
e710: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
e720: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
e730: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
e740: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
e750: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
e760: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
e770: 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Rec;.  int rc;  
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
e7a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
e7b0: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
e7d0: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
e7e0: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
e7f0: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
e800: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
e810: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
e820: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
e830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e840: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
e850: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
e860: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
e870: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
e880: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
e890: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
e8a0: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
e8b0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
e8c0: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
e8d0: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
e8e0: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
e8f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
e900: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
e910: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
e920: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
e930: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
e940: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
e950: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
e960: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
e970: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
e980: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e990: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
e9a0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
e9b0: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
e9c0: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
e9d0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
e9e0: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
e9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ea00: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
ea10: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
ea20: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
ea30: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c  &pRec, pExpr, 1,
ea40: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
ea50: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
ea60: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
ea70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
ea80: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
ea90: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
eaa0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
eab0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
eac0: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
ead0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
eae0: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
eaf0: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
eb00: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
eb10: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
eb20: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
eb50: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
eb60: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
eb70: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
eb80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
eba0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
ebb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ebc0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
ebd0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
ebe0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ebf0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
ec00: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
ec10: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
ec20: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
ec30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
ec40: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ec50: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
ec60: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
ec70: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
ec80: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
ec90: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
eca0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
ecb0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
ecc0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
ecd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
ece0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
ecf0: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
ed00: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
ed10: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
ed20: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
ed30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ed40: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
ed50: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
ed60: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
ed70: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
ed80: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
ed90: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
eda0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
edb0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
edc0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
edd0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
ede0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
edf0: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
ee00: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
ee10: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
ee20: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ee30: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
ee40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ee50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
ee60: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ee70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ee80: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
ee90: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
eea0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
eeb0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
eec0: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
eed0: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
eee0: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
eef0: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
ef00: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
ef10: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
ef20: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
ef30: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
ef40: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
ef50: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
ef60: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
ef70: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
ef80: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
ef90: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
efa0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
efb0: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
efc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
efd0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
efe0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
eff0: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f010: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f020: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f030: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f040: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f050: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f060: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f070: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f090: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f0b0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f0c0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f0d0: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f0e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f0f0: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f100: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f110: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f120: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f130: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f140: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f150: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f160: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f170: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f180: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f1a0: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f1b0: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f1c0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f1d0: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f1e0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f1f0: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f200: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f210: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f220: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f230: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f240: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f250: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f260: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f270: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
f280: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
f290: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f2a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f2b0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
f2c0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
f2d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f2e0: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
f2f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
f300: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
f310: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
f320: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f330: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
f340: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
f350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f360: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
f370: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
f380: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
f390: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
f3a0: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
f3b0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
f3c0: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
f3d0: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
f3e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f3f0: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
f400: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
f410: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
f420: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
f430: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
f440: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
f450: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f460: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
f470: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
f480: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
f490: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
f4a0: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
f4b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f4c0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
f4d0: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
f4e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
f4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f500: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f510: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
f520: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
f530: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
f540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f550: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f560: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
f570: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
f5a0: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
f5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f5c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f5d0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f5e0: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
f5f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f600: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f610: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f620: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
f630: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
f640: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
f650: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
f660: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
f670: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
f680: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
f690: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
f6a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f6b0: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
f6c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
f6d0: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
f6e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f6f0: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
f700: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
f710: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f730: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
f740: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f750: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
f760: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
f770: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
f780: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
f790: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
f7a0: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
f7b0: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
f7c0: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
f7d0: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
f7e0: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
f7f0: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
f800: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f810: 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
f820: 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
f830: 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
f840: 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
f850: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f860: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f870: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
f880: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
f890: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
f8a0: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
f8b0: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f8c0: 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
f8d0: 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
f8e0: 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
f8f0: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
f900: 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
f910: 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
f920: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
f930: 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
f940: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
f950: 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
f960: 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
f970: 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
f980: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
f990: 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
f9a0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
f9b0: 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
f9c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f9d0: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
f9e0: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
f9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa00: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
fa10: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
fa20: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
fa30: 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
fa40: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
fa50: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
fa60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
fa70: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
fa80: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
fa90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
faa0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fab0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
fac0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
fad0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
fae0: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
faf0: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
fb00: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
fb10: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
fb20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
fb30: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
fb40: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
fb50: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
fb60: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
fb70: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
fb80: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
fb90: 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
fba0: 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
fbb0: 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
fbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fbd0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fbe0: 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
fbf0: 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
fc00: 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fc20: 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
fc30: 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
fc40: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
fc50: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
fc60: 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
fc70: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fc80: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
fc90: 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
fca0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
fcb0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
fcc0: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
fcd0: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
fce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fcf0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fd00: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
fd10: 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
fd20: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
fd30: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
fd40: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fd50: 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
fd60: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
fd70: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
fd80: 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
fd90: 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
fda0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
fdb0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
fdc0: 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
fdd0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
fde0: 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
fdf0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
fe00: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
fe10: 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
fe20: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
fe30: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
fe40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
fe50: 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
fe60: 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
fe70: 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
fe80: 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
fe90: 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
fea0: 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
feb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
fec0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
fed0: 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
fee0: 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
fef0: 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
ff00: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
ff10: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
ff20: 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
ff30: 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
ff40: 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
ff50: 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
ff60: 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
ff70: 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
ff80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
ff90: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
ffa0: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
ffb0: 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
ffc0: 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
ffd0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
ffe0: 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
fff0: 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
10000 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
10010 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
10020 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
10030 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
10040 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
10050 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
10060 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10070 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
10080 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10090 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
100a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
100b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
100c0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
100d0 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
100e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
100f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
10100 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
10110 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10120 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10130 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
10140 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10150 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
10160 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10170 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
10180 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10190 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
101a0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
101b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101c0 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
101d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
101e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101f0 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
10200 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10210 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
10220 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
10230 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
10240 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
10250 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
10260 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
10270 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
10280 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10290 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
102a0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
102b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
102c0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
102d0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
102e0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
102f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10300 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
10310 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
10320 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
10330 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
10340 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
10350 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
10360 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
10370 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
10380 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10390 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
103a0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
103b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
103c0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
103d0 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
103e0 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
103f0 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10410 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10420 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
10430 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
10440 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
10450 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
10460 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
10470 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10480 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10490 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
104a0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
104b0 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
104c0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
104d0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
104e0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
104f0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10500 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10510 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10520 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
10530 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10540 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
10550 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
10560 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
10570 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
10580 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10590 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
105a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
105b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
105c0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
105d0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
105e0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
105f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10600 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10610 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10620 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10630 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10650 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10660 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10670 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10680 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10690 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
106a0 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
106b0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
106c0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
106d0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
106e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
106f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10700 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10710 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10730 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10740 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10750 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10760 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10770 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10790 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
107a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
107b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
107c0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
107d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
107e0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
107f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10800 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
10810 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
10820 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
10830 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10840 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
10850 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
10860 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10870 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
10880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
10890 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
108a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
108b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
108c0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
108d0 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
108e0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
108f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10900 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10910 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10920 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10940 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
10950 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
10960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10970 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
10980 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
10990 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
109a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
109b0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
109c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
109d0 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
109e0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
109f0 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
10a00 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
10a10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
10a20 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
10a30 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
10a40 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
10a50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10a60 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
10a70 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
10a80 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
10a90 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
10aa0 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
10ab0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
10ac0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
10ad0 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
10ae0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10af0 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
10b00 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
10b10 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
10b20 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
10b30 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
10b40 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
10b50 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
10b60 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
10b70 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
10b80 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
10b90 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
10ba0 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
10bb0 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
10bc0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
10bd0 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
10be0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
10bf0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
10c00 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
10c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
10c20 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
10c30 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
10c40 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
10c50 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
10c60 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
10c70 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
10c80 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10c90 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
10ca0 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
10cb0 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
10cc0 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
10cd0 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
10ce0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
10cf0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
10d00 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
10d10 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10d20 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
10d30 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
10d40 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
10d50 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
10d60 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
10d70 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
10d80 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
10d90 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
10da0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10db0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10dc0 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
10dd0 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
10de0 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
10df0 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
10e00 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
10e10 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
10e20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
10e30 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
10e40 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
10e50 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
10e60 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
10e70 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
10e80 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
10e90 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
10ea0 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
10eb0 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
10ec0 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
10ed0 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
10ee0 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
10ef0 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
10f00 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
10f10 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
10f20 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10f30 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10f40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
10f50 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
10f60 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
10f70 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
10f80 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
10f90 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
10fa0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
10fb0 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
10fc0 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
10fd0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
10fe0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
10ff0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
11000 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
11010 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
11020 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11030 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
11040 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
11050 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
11060 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
11070 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
11080 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11090 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
110a0 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
110b0 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
110c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
110d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
110e0 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
110f0 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
11100 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
11110 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
11120 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
11130 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
11140 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
11150 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
11160 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
11170 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
11180 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11190 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
111a0 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
111b0 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
111c0 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
111d0 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
111e0 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
111f0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11200 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
11210 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
11220 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
11230 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
11240 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
11250 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
11260 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
11270 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11280 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11290 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
112a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
112b0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
112c0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
112d0 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
112e0 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
112f0 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11300 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
11310 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
11320 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
11330 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
11340 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
11350 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11360 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11370 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11380 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11390 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
113a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
113b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
113c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
113d0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
113e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
113f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11400 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11410 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11420 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
11430 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11440 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11450 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
11460 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
11470 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
11480 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11490 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
114a0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
114b0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
114c0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
114e0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
114f0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11500 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11510 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11520 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11530 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11540 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11550 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11560 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
11570 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
11580 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11590 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
115a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
115b0 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
115c0 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
115d0 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
115e0 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
115f0 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11600 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11610 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11620 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11630 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11640 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11650 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11680 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11690 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
116a0 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
116b0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
116c0 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
116d0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
116e0 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
116f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11700 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11710 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11720 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11730 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11740 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11750 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11760 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11770 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11780 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11790 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
117a0 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
117b0 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
117c0 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
117d0 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
117e0 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
117f0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11800 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
11810 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
11820 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
11830 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
11840 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
11850 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
11860 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
11870 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
11880 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
11890 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
118a0 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
118b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
118c0 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
118d0 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
118e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
118f0 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
11900 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
11910 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
11920 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
11930 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11940 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
11950 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
11960 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
11970 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
11980 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
11990 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
119a0 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
119b0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
119c0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
119d0 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
119e0 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
119f0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
11a00 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
11a10 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
11a20 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
11a30 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
11a40 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
11a50 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
11a60 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
11a70 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
11a80 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
11a90 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
11aa0 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
11ab0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
11ac0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
11ad0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
11ae0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
11af0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
11b00 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
11b10 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
11b20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
11b30 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
11b40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
11b50 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
11b60 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
11b70 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
11b80 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
11b90 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
11ba0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
11bb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
11bc0 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
11bd0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
11be0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
11bf0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
11c00 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
11c10 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
11c20 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
11c30 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
11c40 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
11c50 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
11c60 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
11c70 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
11c80 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
11c90 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
11ca0 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
11cb0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
11cc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11cd0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11ce0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
11cf0 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
11d00 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
11d10 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
11d20 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
11d30 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
11d40 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
11d50 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
11d60 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
11d70 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11d80 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
11d90 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
11da0 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
11db0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
11dc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
11dd0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
11de0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
11df0 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
11e00 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e20 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
11e30 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
11e60 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
11e70 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11e80 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
11e90 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
11ea0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11eb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11ec0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11ed0 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
11ee0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
11ef0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
11f00 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
11f10 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
11f20 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
11f30 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
11f40 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
11f50 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
11f60 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
11f70 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
11f80 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
11f90 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
11fa0 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
11fb0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11fc0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11fd0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
11fe0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
11ff0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
12000 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
12030 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
12040 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12070 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
12080 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
120b0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
120c0 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
120d0 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
120e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
120f0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
12100 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
12110 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
12120 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
12130 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
12140 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
12150 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
12160 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
12170 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
12180 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12190 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
121a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
121b0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
121c0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
121d0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
121e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
121f0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12200 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12210 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12220 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
12230 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
12240 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
12270 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
12280 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12290 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
122c0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
122d0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
122e0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
122f0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12300 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
12310 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
12320 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
12330 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
12340 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
12350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
12360 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
12370 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
12380 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12390 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
123a0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
123b0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
123c0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
123d0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
123e0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
123f0 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12400 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12410 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12420 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
12430 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
12440 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
12450 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
12460 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
12470 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
12480 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12490 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
124a0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
124b0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
124c0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
124d0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
124e0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
124f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12500 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12510 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12520 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
12530 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
12540 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
12550 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
12560 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
12570 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
12580 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12590 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
125a0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
125b0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
125c0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
125d0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
125e0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
125f0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12600 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12610 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12620 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12630 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12640 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12650 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12660 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12670 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12680 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12690 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
126a0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
126b0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
126c0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
126d0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
126e0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
126f0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12700 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12710 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12720 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12730 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12740 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12750 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12760 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12770 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12780 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12790 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
127a0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
127b0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
127c0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
127d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
127e0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
127f0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12800 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
12810 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
12820 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
12830 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
12840 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12850 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12870 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
12880 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
12890 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
128a0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
128b0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
128c0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
128d0 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
128e0 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
128f0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
12900 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69  rSet!=0 ){.    i
12910 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  f( pTemplate->nL
12920 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52  Term ){.#if WHER
12930 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
12940 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75       u16 n = pBu
12950 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e  ilder->pOrSet->n
12960 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a  ;.      int x =.
12970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
12980 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
12990 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
129a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
129b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
129c0 0a 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 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
129f0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
12a00 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12a10 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12a20 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12a30 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12a50 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
12a60 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
12a70 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
12a80 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12a90 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12aa0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
12ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12ad0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12ae0 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
12af0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12b00 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
12b10 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
12b20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
12b30 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
12b40 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
12b50 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
12b60 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12b70 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
12b80 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
12b90 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
12ba0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
12bb0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
12bc0 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
12bd0 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
12be0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
12bf0 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
12c00 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
12c10 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
12c20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12c30 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
12c40 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12c50 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
12c60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12c70 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29  ntf("   skip: ")
12c80 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
12c90 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
12ca0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12cb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cd0 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
12ce0 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
12cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
12d00 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
12d10 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
12d20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
12d30 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
12d40 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
12d50 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
12d60 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
12d70 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
12d80 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
12d90 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
12da0 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
12db0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12dc0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
12dd0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12de0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12df0 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
12e00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12e10 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20  rintf("replace: 
12e20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
12e30 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
12e40 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12e50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12e60 69 6e 74 66 28 22 20 20 20 77 69 74 68 3a 20 22  intf("   with: "
12e70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12e90 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a  Printf("    add:
12ea0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   ");.    }.    w
12eb0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12ec0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12ed0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12ee0 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12ef0 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12f00 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12f10 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12f20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12f30 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12f40 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12f50 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
12f60 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
12f70 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
12f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12f90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
12fa0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
12fb0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
12fc0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
12fd0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12fe0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12ff0 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
13000 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
13010 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
13020 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
13030 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
13040 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
13050 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
13060 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
13070 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
13080 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
13090 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
130a0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
130b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
130c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
130d0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
130e0 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
130f0 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
13100 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
13110 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
13120 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
13130 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
13140 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
13150 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
13160 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
13170 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
13180 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
13190 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
131a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
131b0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
131c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
131d0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
131e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
131f0 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
13200 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
13210 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
13220 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
13230 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
13240 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
13250 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
13260 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
13270 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
13280 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
13290 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
132a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
132b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
132c0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
132d0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
132e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
132f0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
13300 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
13310 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
13320 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
13330 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
13350 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
13360 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
13370 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
13380 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
13390 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
133a0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
133b0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
133c0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
133d0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
133e0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
133f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13400 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13410 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13420 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
13430 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
13440 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
13450 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
13460 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
13470 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
13480 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
13490 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
134a0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
134b0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
134c0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
134d0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
134e0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
134f0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
13500 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
13510 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
13520 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
13530 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
13540 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
13550 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
13560 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
13570 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
13580 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
13590 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
135a0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
135b0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
135c0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
135d0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
135e0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
135f0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
13600 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
13610 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13620 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
13630 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13640 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
13650 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
13660 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
13670 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
13680 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
13690 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
136a0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
136b0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
136c0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
136d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
136e0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
136f0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
13700 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
13710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13720 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
13730 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
13740 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
13750 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
13760 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
13770 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
13780 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
13790 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
137a0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
137b0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
137c0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
137d0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
137e0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
137f0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13800 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13810 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13820 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13830 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13840 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13850 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13860 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13870 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
13880 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
13890 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
138a0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
138b0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
138c0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
138d0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
138e0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
138f0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13900 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13910 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13920 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13930 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13940 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13960 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13970 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
13980 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
13990 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
139a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
139b0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
139c0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
139d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
139e0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
139f0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13a00 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13a10 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13a20 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13a30 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13a40 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13a50 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13a60 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13a70 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
13a80 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
13a90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
13aa0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
13ab0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
13ac0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
13ad0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13ae0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13af0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13b00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13b10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13b20 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13b30 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13b40 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13b50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13b60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13b70 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
13b80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13b90 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
13ba0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
13bb0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
13bc0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
13bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13be0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13bf0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
13c00 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
13c10 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
13c20 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
13c30 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
13c40 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13c50 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
13c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
13c70 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
13c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
13c90 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
13ca0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
13cb0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
13cc0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
13cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
13ce0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
13cf0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
13d00 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
13d10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13d20 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
13d30 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
13d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d50 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
13d60 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
13d70 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13d80 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
13d90 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
13da0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
13db0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
13dc0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
13dd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
13de0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
13df0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
13e00 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
13e10 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
13e20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
13e30 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13e40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13e50 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
13e60 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
13e70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
13e80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13e90 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
13ea0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
13eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13ec0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
13ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13ee0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13f00 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13f10 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13f40 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13f50 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
13f60 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
13f70 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
13f80 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
13f90 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
13fa0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
13fb0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
13fc0 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
13fd0 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
13fe0 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
13ff0 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
14000 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
14010 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
14020 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
14030 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
14040 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
14050 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
14060 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
14070 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
14080 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
14090 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
140a0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
140b0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
140c0 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
140d0 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
140e0 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
140f0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
14100 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
14110 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
14120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
14130 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
14140 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
14150 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
14160 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
14170 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 3..*/.static i
14180 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63  nt whereRangeVec
14190 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20  torLen(.  Parse 
141a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
141b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
141c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  t */.  int iCur,
141d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
141e0 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49  ursor open on pI
141f0 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
14200 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
14210 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
14220 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75  used for a inequ
14230 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14240 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14260 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71  mber of prior eq
14270 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14280 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78  ts on same index
14290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
142a0 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68  *pTerm     /* Th
142b0 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c  e vector inequal
142c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
142d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
142e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
142f0 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70  torSize(pTerm->p
14300 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
14310 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d  int i;..  nCmp =
14320 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78   MIN(nCmp, (pIdx
14330 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29  ->nColumn - nEq)
14340 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
14350 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
14360 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61  /* Test if compa
14370 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d  rison i of pTerm
14380 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   is compatible w
14390 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45  ith column (i+nE
143a0 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  q) .    ** of th
143b0 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c  e index. If not,
143c0 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20   exit the loop. 
143d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
143e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
14400 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  son affinity */.
14410 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
14420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14430 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c    /* Indexed col
14440 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f  umns affinity */
14450 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
14460 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
14470 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
14480 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14490 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  nce */.    Expr 
144a0 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pLhs = pTerm->p
144b0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
144c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
144d0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73  ;.    Expr *pRhs
144e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
144f0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
14500 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45   pRhs->flags & E
14510 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
14520 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
14530 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
14540 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14560 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78    pRhs = pRhs->x
14570 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14580 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  pr;.    }..    /
14590 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
145a0 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70   LHS of the comp
145b0 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
145c0 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  mn reference to.
145d0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
145e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
145f0 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c  ight source tabl
14600 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
14610 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65  sort.    ** orde
14620 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  r of the index c
14630 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d  olumn is the sam
14640 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72  e as the sort or
14650 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  der of the.    *
14660 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78  * leftmost index
14670 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20   column.  */.   
14680 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
14690 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
146a0 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
146b0 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
146c0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
146d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
146e0 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78  q] .     || pIdx
146f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e  ->aSortOrder[i+n
14700 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74  Eq]!=pIdx->aSort
14710 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29  Order[nEq].    )
14720 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14730 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
14740 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  se( pLhs->iColum
14750 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20  n==XN_ROWID );. 
14760 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
14770 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14780 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
14790 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
147a0 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73  ;.    idxaff = s
147b0 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
147c0 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e  nAffinity(pIdx->
147d0 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43  pTable, pLhs->iC
147e0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
147f0 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72  aff!=idxaff ) br
14800 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20  eak;..    pColl 
14810 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14820 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14830 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
14850 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14860 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14870 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
14880 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
14890 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a  +nEq]) ) break;.
148a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
148b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
148c0 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
148d0 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
148e0 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
148f0 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
14900 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
14910 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
14920 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
14930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14940 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
14950 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14960 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
14970 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
14980 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14990 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
149a0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
149b0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
149c0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
149d0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
149e0 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
149f0 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
14a00 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
14a10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
14a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14a30 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
14a40 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
14a50 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14a60 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14a70 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
14a80 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
14a90 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
14aa0 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
14ab0 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
14ac0 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
14ad0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
14ae0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
14af0 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
14b00 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
14b10 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
14b20 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
14b30 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
14b40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14b50 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
14b60 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
14b70 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
14b80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
14b90 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
14ba0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
14bb0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
14bc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14bd0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
14be0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14bf0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
14c00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
14c10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14c20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
14c30 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
14c40 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c60 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
14c70 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
14c80 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
14c90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
14ca0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
14cb0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
14cc0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
14cd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
14ce0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
14cf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14d00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14d10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14d20 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
14d30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14d40 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
14d50 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14d60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
14d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
14d80 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
14d90 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14da0 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
14db0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
14dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
14dd0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
14de0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
14df0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
14e20 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
14e30 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
14e40 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
14e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14e60 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
14e70 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
14e80 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
14e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14ea0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14eb0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
14ec0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
14ed0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
14ee0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14ef0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
14f00 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
14f10 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
14f20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14f30 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14f40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
14f50 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42  /.  u16 saved_nB
14f60 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tm;             
14f70 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14f80 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
14f90 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20  .btree.nBtm */. 
14fa0 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b   u16 saved_nTop;
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14fd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14fe0 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31  ree.nTop */.  u1
14ff0 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15010 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15020 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
15030 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
15040 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
15050 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
15060 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
15070 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
15080 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
15090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
150a0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
150b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
150c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
150d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
150e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
150f0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
15100 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15120 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
15130 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
15140 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
15150 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
15160 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
15170 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
15180 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
15190 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
151a0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
151b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
151c0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
151d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
151e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
151f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15200 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57  _NOMEM_BKPT;.  W
15210 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
15220 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 42   ("BEGIN %s.addB
15230 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
15240 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
15260 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
15270 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  me,pProbe->zName
15280 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
15290 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
152a0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
152b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
152c0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
152d0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
152e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
152f0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
15300 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
15310 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
15320 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
15330 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
15340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15350 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
15360 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
15370 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
15380 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
15390 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
153a0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
153b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
153c0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
153d0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
153e0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
153f0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
15400 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
15410 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
15420 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
15430 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
15440 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
15450 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
15460 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
15470 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
15480 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
15490 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
154a0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
154b0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
154c0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
154d0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
154e0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
154f0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
15500 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
15510 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
15520 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
15530 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
15540 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
15550 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
15560 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
15590 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
155a0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
155b0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
155c0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
155d0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
155e0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
155f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15600 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
15610 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
15620 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
15630 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
15640 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
15650 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
15660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
15670 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
15680 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
15690 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
156a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
156b0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
156c0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
156d0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
156e0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
156f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15700 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
15710 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
15720 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15730 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
15740 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
15750 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
15760 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
15770 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
15780 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
15790 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
157a0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
157b0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
157c0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
157d0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
157e0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
157f0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15800 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15810 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15820 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15830 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15840 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
15850 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
15860 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15870 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15880 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
15890 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
158a0 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
158b0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
158c0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
158d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
158e0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
158f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15900 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15910 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15920 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  low constraints 
15930 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63  from the WHERE c
15940 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
15950 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   by the.    ** r
15960 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
15970 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79  LEFT JOIN.  Only
15980 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
15990 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72  the ON clause ar
159a0 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  e.    ** allowed
159b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72   */.    if( (pSr
159c0 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  c->fg.jointype &
159d0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
159e0 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
159f0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
15a00 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15a10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
15a20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
15a30 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49     if( IsUniqueI
15a40 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26 26 20  ndex(pProbe) && 
15a50 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
15a60 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29 7b 0a  e->nKeyCol-1 ){.
15a70 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
15a80 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  bldFlags |= SQLI
15a90 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45 3b 0a  TE_BLDF_UNIQUE;.
15aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ab0 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15ac0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15ad0 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  DF_INDEXED;.    
15ae0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  }.    pNew->wsFl
15af0 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15b00 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
15b10 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15b20 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15b30 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
15b40 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 20   saved_nBtm;.   
15b50 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15b60 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
15b70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
15b80 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
15b90 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
15ba0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
15bb0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
15bc0 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
15bd0 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
15be0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15bf0 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
15c00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
15c10 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
15c20 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
15c30 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
15c40 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20  ->maskSelf;..   
15c50 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d   assert( nInMul=
15c60 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  =0.        || (p
15c70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15c80 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
15c90 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
15ca0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15cb0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
15cc0 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  N)!=0 .        |
15cd0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15ce0 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
15cf0 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20  N)!=0 .    );.. 
15d00 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
15d10 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
15d20 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
15d30 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
15d40 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15d50 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
15d60 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
15d70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15d80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15d90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
15da0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
15db0 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53  :  TUNING: the S
15dc0 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35  ELECT returns 25
15dd0 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20   rows */.       
15de0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
15df0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
15e00 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
15e10 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20  gEst(25) );..   
15e20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
15e30 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61  ession may actua
15e40 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f  lly be of the fo
15e50 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45  rm (x, y) IN (SE
15e60 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20  LECT...)..      
15e70 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
15e80 65 20 74 68 65 72 65 20 69 73 20 61 20 73 65 70  e there is a sep
15e90 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65  arate term for e
15ea0 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28  ach of (x) and (
15eb0 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48  y)..        ** H
15ec0 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20  owever, the nIn 
15ed0 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c  multiplier shoul
15ee0 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65  d only be applie
15ef0 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65  d once, not once
15f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
15f10 65 61 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20  each such term. 
15f20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
15f30 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74 20 70  op checks that p
15f40 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20  Term is the.    
15f50 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63      ** first suc
15f60 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61  h term in use, a
15f70 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b  nd sets nIn back
15f80 20 74 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e   to 0 if it is n
15f90 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ot. */.        f
15fa0 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e  or(i=0; i<pNew->
15fb0 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a  nLTerm-1; i++){.
15fc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
15fd0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26  ew->aLTerm[i] &&
15fe0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
15ff0 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29  ->pExpr==pExpr )
16000 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20   nIn = 0;.      
16010 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
16020 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
16030 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
16040 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
16050 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
16060 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
16070 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
16080 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71          nIn = sq
16090 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70  lite3LogEst(pExp
160a0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
160b0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
160c0 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
160d0 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
160e0 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
160f0 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e           ** chan
16120 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69  ges "x IN (?)" i
16130 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20  nto "x=?". */.  
16140 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
16150 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51  if( eOp & (WO_EQ
16160 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
16170 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f   int iCol = pPro
16180 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76  be->aiColumn[sav
16190 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70  ed_nEq];.      p
161a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
161b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
161c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
161d0 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e  aved_nEq==pNew->
161e0 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20  u.btree.nEq );. 
161f0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58       if( iCol==X
16200 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20  N_ROWID .       
16210 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 6e  || (iCol>=0 && n
16220 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76 65  InMul==0 && save
16230 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  d_nEq==pProbe->n
16240 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20  KeyCol-1).      
16250 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
16260 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  Col==XN_ROWID ||
16270 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74   pProbe->uniqNot
16280 4e 75 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 7c  Null .         |
16290 7c 20 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  | (pProbe->nKeyC
162a0 6f 6c 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d  ol==1 && pProbe-
162b0 3e 6f 6e 45 72 72 6f 72 20 26 26 20 65 4f 70 3d  >onError && eOp=
162c0 3d 57 4f 5f 45 51 29 20 0a 20 20 20 20 20 20 20  =WO_EQ) .       
162d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
162e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
162f0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
16300 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16310 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
16320 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51  ags |= WHERE_UNQ
16330 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20  _WANTED;.       
16340 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16350 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57  else if( eOp & W
16360 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
16370 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16380 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
16390 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
163a0 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  if( eOp & (WO_GT
163b0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
163c0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
163d0 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
163e0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
163f0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_GE );.      p
16400 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
16410 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
16420 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  GE|WHERE_BTM_LIM
16430 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  IT;.      pNew->
16440 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 77  u.btree.nBtm = w
16450 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c  hereRangeVectorL
16460 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  en(.          pP
16470 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  arse, pSrc->iCur
16480 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76  sor, pProbe, sav
16490 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20  ed_nEq, pTerm.  
164a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42 74      );.      pBt
164b0 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
164c0 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20   pTop = 0;.     
164d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
164e0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
164f0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  PT ){.        /*
16500 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   Range contraint
16510 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d  s that come from
16520 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
16530 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  zation are.     
16540 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65     ** always use
16550 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20  d in pairs. */. 
16560 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70         pTop = &p
16570 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20  Term[1];.       
16580 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28   assert( (pTop-(
16590 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c  pTerm->pWC->a))<
165a0 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72  pTerm->pWC->nTer
165b0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  m );.        ass
165c0 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61  ert( pTop->wtFla
165d0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
165e0 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  T );.        ass
165f0 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72  ert( pTop->eOper
16600 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  ator==WO_LT );. 
16610 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
16620 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
16630 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
16640 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
16650 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20   OOM */.        
16660 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
16670 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
16680 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Top;.        pNe
16690 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
166a0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
166b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
166c0 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20  tree.nTop = 1;. 
166d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
166e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
166f0 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eOp & (WO_LT|WO_
16700 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LE) );.      tes
16710 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
16720 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
16730 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
16740 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
16750 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16760 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
16770 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
16780 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
16790 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72 65  ree.nTop = where
167a0 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a  RangeVectorLen(.
167b0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
167c0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
167d0 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e   pProbe, saved_n
167e0 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20  Eq, pTerm.      
167f0 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  );.      pTop = 
16800 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74  pTerm;.      pBt
16810 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  m = (pNew->wsFla
16820 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
16830 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20  IMIT)!=0 ?.     
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
16860 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30  w->nLTerm-2] : 0
16870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16880 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e  At this point pN
16890 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20  ew->nOut is set 
168a0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
168b0 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
168c0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69  o.    ** be visi
168d0 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  ted by the index
168e0 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e   scan before con
168f0 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54  sidering term pT
16900 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  erm, or the.    
16910 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e  ** values of nIn
16920 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20   and nInMul. In 
16930 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73  other words, ass
16940 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a  uming that all .
16950 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e      ** "x IN(...
16960 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70  )" terms are rep
16970 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20  laced with "x = 
16980 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75  ?". This block u
16990 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  pdates.    ** th
169a0 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  e value of pNew-
169b0 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74  >nOut to account
169c0 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20   for pTerm (but 
169d0 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e  not nIn/nInMul).
169e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
169f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
16a00 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69  ed_nOut );.    i
16a10 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
16a20 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
16a30 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
16a40 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73  * Adjust nOut us
16a50 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20  ing stat3/stat4 
16a60 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65  data. Or, if the
16a70 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73  re is no stat3/s
16a80 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61  tat4.      ** da
16a90 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f  ta, using some o
16aa0 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20  ther estimate.  
16ab0 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  */.      whereRa
16ac0 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
16ad0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74  e, pBuilder, pBt
16ae0 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a  m, pTop, pNew);.
16af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16b00 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65   int nEq = ++pNe
16b10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
16b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
16b30 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
16b40 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
16b50 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
16b60 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
16b70 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
16b80 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
16b90 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70  ruthProb<=0 && p
16ba0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
16bb0 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b  saved_nEq]>=0 ){
16bc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16bd0 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
16be0 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
16bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
16c00 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
16c10 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16c20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
16c30 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
16c40 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
16c50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
16c60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16c70 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16c80 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
16c90 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
16ca0 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
16cb0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
16cc0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
16cd0 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
16ce0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
16cf0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
16d00 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
16d10 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
16d20 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
16d30 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
16d40 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
16d50 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
16d60 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
16d70 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
16d80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
16d90 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
16da0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d  ISNULL|WO_IS))!=
16db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
16dc0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16dd0 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
16de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16df0 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
16e00 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16e10 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
16e20 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
16e30 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
16e40 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
16e50 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
16e60 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75  pr->pRight, &nOu
16e70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
16e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16e90 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61   rc = whereInSca
16ea0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16eb0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  ilder, pExpr->x.
16ec0 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
16ed0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16ee0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16ef0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
16f00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16f10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
16f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
16f30 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
16f40 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
16f50 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
16f60 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
16f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16f80 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
16f90 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
16fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16fb0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
16fc0 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
16fd0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
16fe0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
16ff0 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
17000 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17020 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
17030 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
17040 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17050 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
17060 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
17070 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
17080 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
17090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
170a0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
170b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
170c0 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
170d0 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
170e0 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
170f0 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
17100 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
17110 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
17120 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
17130 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
17140 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
17150 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
17160 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17170 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
17180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
171a0 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
171b0 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
171c0 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
171d0 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
171e0 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
171f0 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
17200 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
17210 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
17220 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
17230 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
17240 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
17250 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
17260 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
17270 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
17280 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
17290 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
172a0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
172b0 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
172c0 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
172d0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
172e0 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
172f0 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
17300 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
17310 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
17320 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
17330 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
17340 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
17350 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
17360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
17370 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
17380 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
17390 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
173a0 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20  t + 16);.    }. 
173b0 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
173c0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
173d0 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c  n, pProbe->pTabl
173e0 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20  e->costMult);.. 
173f0 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
17400 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
17410 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
17420 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
17430 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
17440 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
17450 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
17460 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
17470 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72  er->pWC, pNew, r
17480 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
17490 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
174a0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
174b0 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
174c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
174d0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
174e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
174f0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
17500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17510 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75  pNew->nOut = nOu
17520 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20  tUnadjusted;.   
17530 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65   }..    if( (pNe
17540 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
17550 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
17560 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
17570 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
17580 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  e->nColumn.    )
17590 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
175a0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
175b0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
175c0 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
175d0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
175e0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
175f0 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
17600 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17610 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
17620 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
17630 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
17640 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
17650 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
17660 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
17670 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
17680 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
17690 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
176a0 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20  = saved_nBtm;.  
176b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
176c0 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b  op = saved_nTop;
176d0 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
176e0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
176f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
17700 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
17710 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
17720 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
17730 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
17740 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
17750 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
17760 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
17770 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
17780 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
17790 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
177a0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
177b0 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
177c0 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
177d0 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
177e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
177f0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
17800 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
17810 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
17820 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
17830 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
17840 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
17850 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
17860 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
17870 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
17880 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
17890 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
178a0 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
178b0 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
178c0 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
178d0 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
178e0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
178f0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
17900 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
17910 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
17920 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
17930 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
17940 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
17950 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
17960 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
17970 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
17980 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
17990 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
179a0 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
179b0 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
179c0 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
179d0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
179e0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
179f0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
17a00 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
17a10 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
17a20 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
17a30 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17a40 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
17a50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
17a60 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
17a70 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
17a80 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
17a90 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
17aa0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
17ab0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
17ac0 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
17ad0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
17ae0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
17af0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
17b00 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
17b10 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
17b20 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
17b30 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
17b40 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
17b50 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
17b60 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
17b70 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
17b80 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
17b90 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
17ba0 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
17bb0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
17bc0 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
17bd0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
17be0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
17bf0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
17c00 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
17c10 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
17c20 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
17c30 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
17c40 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
17c50 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
17c60 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
17c70 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
17c80 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
17c90 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
17ca0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
17cb0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
17cc0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
17cd0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
17ce0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
17cf0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
17d00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
17d10 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
17d20 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ..  WHERETRACE(0
17d30 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61  x800, ("END %s.a
17d40 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20  ddBtreeIdx(%s), 
17d50 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22  nEq=%d, rc=%d\n"
17d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17d70 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e          pProbe->
17d80 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 70  pTable->zName, p
17d90 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61  Probe->zName, sa
17da0 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20  ved_nEq, rc));. 
17db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17dc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
17dd0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17de0 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
17df0 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
17e00 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
17e10 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
17e20 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
17e30 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
17e40 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
17e50 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
17e60 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
17e70 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
17e80 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
17e90 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
17ea0 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
17eb0 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
17ec0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
17ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
17ee0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17ef0 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
17f00 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
17f10 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
17f20 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
17f30 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
17f40 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
17f50 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
17f60 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
17f70 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
17f80 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
17f90 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
17fa0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17fb0 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
17fc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
17fd0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
17fe0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
17ff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
18000 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
18010 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
18020 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
18030 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18040 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
18050 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
18060 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
18070 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
18080 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
18090 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
180a0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
180b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
180c0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
180d0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
180e0 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
180f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18100 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
18110 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
18120 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
18130 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
18140 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
18150 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
18160 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
18170 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
18180 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
18190 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
181a0 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
181b0 28 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d  (pExpr,aColExpr-
181c0 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75  >a[jj].pExpr,iCu
181d0 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rsor)==0 ){.    
181e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
181f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18200 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18210 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18220 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73   Return a bitmas
18230 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63  k where 1s indic
18240 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72  ate that the cor
18250 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
18260 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  n of.** the tabl
18270 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20  e is used by an 
18280 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
18290 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
182a0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
182b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
182c0 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64  ask columnsInInd
182d0 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  ex(Index *pIdx){
182e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30  .  Bitmask m = 0
182f0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
18300 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (j=pIdx->nColumn
18310 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
18320 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
18330 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
18340 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
18350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
18360 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
18370 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
18380 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-2 );.      if(
18390 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
183a0 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20  MASKBIT(x);.    
183b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
183c0 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
183d0 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
183e0 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
183f0 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
18400 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
18410 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
18420 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
18430 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
18440 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
18450 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18460 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
18470 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
18480 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
18490 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
184a0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
184b0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61  erm *pTerm;.  Pa
184c0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
184d0 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
184e0 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  e;.  while( pWhe
184f0 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
18500 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
18510 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
18520 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
18530 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
18540 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
18550 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
18560 68 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ht;.  }.  if( pP
18570 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
18580 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51  & SQLITE_EnableQ
18590 50 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30  PSG ) pParse = 0
185a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
185b0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
185c0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
185d0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
185e0 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
185f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
18600 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
18610 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
18620 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
18630 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
18640 3d 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73  =iTab).     && s
18650 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
18660 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
18670 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
18680 62 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  b) .    ){.     
18690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
186a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
186b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
186c0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
186d0 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  cts for a single
186e0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
186f0 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62  in where the tab
18700 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66  le.** is identif
18710 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
18720 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
18730 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
18740 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
18750 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
18760 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
18770 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ble..**.** The c
18780 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e  osts (WhereLoop.
18790 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74  rRun) of the b-t
187a0 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  ree loops added 
187b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
187c0 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74  .** are calculat
187d0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
187e0 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20  *.** For a full 
187f0 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  scan, assuming t
18800 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64  he table (or ind
18810 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f  ex) contains nRo
18820 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  w rows:.**.**   
18830 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
18840 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20  3.0             
18850 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74         // full-t
18860 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20  able scan.**    
18870 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b   cost = nRow * K
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
188a0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
188b0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
188c0 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20  ow * (K+3.0)    
188d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
188e0 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72  can of non-cover
188f0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
18900 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c  where K is a val
18910 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ue between 1.1 a
18920 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64  nd 3.0 set based
18930 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
18940 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61   .** estimated a
18950 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74  verage size of t
18960 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
18970 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a  le records..**.*
18980 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  * For an index s
18990 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69  can, where nVisi
189a0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
189b0 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69  of index rows vi
189c0 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  sited.** by the 
189d0 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20  scan, and nSeek 
189e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
189f0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73   seek operations
18a00 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a   required on .**
18a10 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
18a20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  e:.**.**     cos
18a30 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
18a40 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69  (nRow) + K * nVi
18a50 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f  sit)          //
18a60 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
18a70 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
18a80 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
18a90 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69   + (K+3.0) * nVi
18aa0 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63  sit)    // non-c
18ab0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18ac0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53  .** Normally, nS
18ad0 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20  eek is 1. nSeek 
18ae0 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74  values greater t
18af0 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74  han 1 come about
18b00 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52   if the .** WHER
18b10 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65  E clause include
18b20 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20  s "x IN (....)" 
18b30 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c  terms used in pl
18b40 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72  ace of "x=?". Or
18b50 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63   when .** implic
18b60 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  it "x IN (SELECT
18b70 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65   x FROM tbl)" te
18b80 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f  rms are added fo
18b90 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a  r skip-scans..**
18ba0 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
18bb0 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20  d values (nRow, 
18bc0 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f  nVisit, nSeek) o
18bd0 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c  ften contain a l
18be0 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f  arge amount.** o
18bf0 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20  f uncertainty.  
18c00 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
18c10 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69   scoring is desi
18c20 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61  gned to pick pla
18c30 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74  ns that.** "do t
18c40 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69  he least harm" i
18c50 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  f the estimates 
18c60 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20  are inaccurate. 
18c70 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a   For example, a.
18c80 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63  ** log(nRow) fac
18c90 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  tor is omitted f
18ca0 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  rom a non-coveri
18cb0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e  ng index scan in
18cc0 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61   order to.** bia
18cd0 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e  s the scoring in
18ce0 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20   favor of using 
18cf0 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20  an index, since 
18d00 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a  the worst-case.*
18d10 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  * performance of
18d20 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
18d30 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68  is far better th
18d40 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  an the worst-cas
18d50 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
18d60 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
18d70 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   scan..*/.static
18d80 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
18d90 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
18da0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
18db0 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
18dc0 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
18dd0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
18de0 50 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20  Prereq          
18df0 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
18e00 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
18e10 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
18e20 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
18e30 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
18e40 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
18e50 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
18e60 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e80 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
18e90 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
18ea0 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ec0 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
18ed0 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
18ee0 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67  ary key */.  Log
18ef0 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  Est aiRowEstPk[2
18f00 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ];       /* The 
18f10 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61  aiRowLogEst[] va
18f20 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
18f30 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61  index */.  i16 a
18f40 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
18f50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
18f60 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
18f70 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
18f80 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
18f90 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
18fa0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
18fb0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
18fc0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
18fd0 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
18fe0 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
18ff0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
19000 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
19010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
19020 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
19030 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
19040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19050 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19060 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
19070 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
19080 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19090 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
190a0 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
190b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
190c0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
190d0 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19100 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
19110 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
19120 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
19130 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
19140 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
19150 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
19160 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19170 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
19180 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
19190 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  RE clause */.  T
191a0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
191b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
191c0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
191d0 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  d */.  .  pNew =
191e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
191f0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
19200 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
19210 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
19220 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
19230 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
19240 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
19250 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
19260 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
19270 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
19280 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
19290 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
192a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42  .  if( pSrc->pIB
192b0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
192c0 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
192d0 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
192e0 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
192f0 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
19300 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
19310 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  IBIndex;.  }else
19320 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
19330 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f  Tab) ){.    pPro
19340 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  be = pTab->pInde
19350 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
19360 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
19370 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
19380 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
19390 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
193a0 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
193b0 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
193c0 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
193d0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
193e0 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
193f0 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
19400 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
19410 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
19420 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
19430 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
19440 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
19450 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
19460 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19480 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
19490 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
194a0 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
194b0 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
194c0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
194d0 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20  k.nKeyCol = 1;. 
194e0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
194f0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
19500 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
19510 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
19520 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45  wLogEst = aiRowE
19530 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e  stPk;.    sPk.on
19540 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61  Error = OE_Repla
19550 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62  ce;.    sPk.pTab
19560 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73  le = pTab;.    s
19570 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54  Pk.szIdxRow = pT
19580 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
19590 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
195a0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
195b0 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
195c0 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70  Pk[1] = 0;.    p
195d0 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
195e0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
195f0 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  if( pSrc->fg.not
19600 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
19610 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
19620 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
19630 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
19640 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
19650 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
19660 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
19670 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
19680 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19690 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
196a0 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
196b0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
196c0 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65  sPk;.  }.  rSize
196d0 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
196e0 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  Est;.  rLogSize 
196f0 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
19700 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19710 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
19720 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d  INDEX.  /* Autom
19730 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
19740 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
19750 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20  >pOrSet      /* 
19760 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f  Not part of an O
19770 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a  R optimization *
19780 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  /.   && (pWInfo-
19790 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
197a0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
197b0 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )==0.   && (pWIn
197c0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
197d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41  flags & SQLITE_A
197e0 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20  utoIndex)!=0.   
197f0 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  && pSrc->pIBInde
19800 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73  x==0      /* Has
19810 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
19820 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21  lause */.   && !
19830 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
19840 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20  xed   /* Has no 
19850 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
19860 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52  se */.   && HasR
19870 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20  owid(pTab)      
19880 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55     /* Not WITHOU
19890 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28  T ROWID table. (
198a0 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29  FIXME: Why not?)
198b0 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
198c0 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
198d0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
198e0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
198f0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
19900 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a  .isRecursive  /*
19910 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   Not a recursive
19920 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
19930 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29  pression. */.  )
19940 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  {.    /* Generat
19950 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65  e auto-index Whe
19960 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57  reLoops */.    W
19970 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
19980 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
19990 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
199a0 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
199b0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
199c0 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  >a; rc==SQLITE_O
199d0 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e  K && pTerm<pWCEn
199e0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
199f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
19a00 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
19a10 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
19a20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
19a30 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
19a40 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
19a50 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  0) ){.        pN
19a60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
19a70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
19a80 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
19a90 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
19aa0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
19ab0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
19ac0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
19ad0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
19ae0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
19af0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e     /* TUNING: On
19b00 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20  e-time cost for 
19b10 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75  computing the au
19b20 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
19b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69  .        ** esti
19b40 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a  mated to be X*N*
19b50 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
19b60 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19b70 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
19b80 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
19b90 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20  ing indexed and 
19ba0 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f  where X is 7 (Lo
19bb0 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72  gEst=28) for nor
19bc0 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  mal.        ** t
19bd0 61 62 6c 65 73 20 6f 72 20 30 2e 35 20 28 4c 6f  ables or 0.5 (Lo
19be0 67 45 73 74 3d 2d 31 30 29 20 66 6f 72 20 76 69  gEst=-10) for vi
19bf0 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
19c00 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20  es.  The value. 
19c10 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69         ** of X i
19c20 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69  s smaller for vi
19c30 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
19c40 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71  es so that the q
19c50 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20  uery planner.   
19c60 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
19c70 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20  more aggressive 
19c80 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  about generating
19c90 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
19ca0 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a  es for.        *
19cb0 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c  * those objects,
19cc0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
19cd0 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  no opportunity t
19ce0 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20  o add schema.   
19cf0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20       ** indexes 
19d00 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e  on subqueries an
19d10 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20  d views. */.    
19d20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
19d30 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
19d40 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
19d50 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
19d60 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  0 && (pTab->tabF
19d70 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
19d80 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ral)==0 ){.     
19d90 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
19da0 70 20 2b 3d 20 32 38 3b 0a 20 20 20 20 20 20 20  p += 28;.       
19db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19dc0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2d    pNew->rSetup -
19dd0 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
19de0 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
19df0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
19e00 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e  ->rSetup, pTab->
19e10 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
19e20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53 65     if( pNew->rSe
19e30 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53  tup<0 ) pNew->rS
19e40 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
19e50 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
19e60 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
19e70 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
19e80 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
19e90 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
19ea0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
19eb0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
19ec0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
19ed0 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
19ee0 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67     ** of knowing
19ef0 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74   how selective t
19f00 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c  he index will ul
19f10 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74  timately be.  It
19f20 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
19f30 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f  * not be unreaso
19f40 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68  nable to make th
19f50 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61  is value much la
19f60 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rger. */.       
19f70 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33   pNew->nOut = 43
19f80 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73  ;  assert( 43==s
19f90 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29  qlite3LogEst(20)
19fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
19fb0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
19fc0 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
19fd0 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
19fe0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
19ff0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
1a000 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
1a010 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1a020 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72 6d   mPrereq | pTerm
1a030 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1a040 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1a050 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1a060 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1a070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1a080 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a090 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
1a0a0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
1a0b0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
1a0c0 63 65 73 2e 20 49 66 20 74 68 65 72 65 20 77 61  ces. If there wa
1a0d0 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
1a0e0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
1a0f0 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  y .  ** consider
1a100 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20 20   index pProbe.  
1a110 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
1a120 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
1a130 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f 62  be; .      pProb
1a140 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  e=(pSrc->pIBInde
1a150 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e  x ? 0 : pProbe->
1a160 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64 78  pNext), iSortIdx
1a170 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  ++.  ){.    if( 
1a180 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
1a190 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
1a1a0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
1a1b0 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
1a1c0 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
1a1d0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
1a1e0 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
1a1f0 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
1a200 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
1a210 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
1a220 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
1a230 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
1a240 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
1a250 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
1a260 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
1a270 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
1a280 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51  if( pProbe->bNoQ
1a290 75 65 72 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  uery ) continue;
1a2a0 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72  .    rSize = pPr
1a2b0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
1a2c0 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  [0];.    pNew->u
1a2d0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a  .btree.nEq = 0;.
1a2e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
1a2f0 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20  e.nBtm = 0;.    
1a300 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
1a310 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  op = 0;.    pNew
1a320 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
1a330 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1a340 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
1a350 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
1a360 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1a370 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
1a380 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20 20  q = mPrereq;.   
1a390 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
1a3a0 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
1a3b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
1a3c0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
1a3d0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
1a3e0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
1a3f0 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
1a400 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1a410 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
1a420 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
1a430 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
1a440 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
1a450 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1a460 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1a470 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
1a480 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
1a490 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
1a4a0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
1a4b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
1a4c0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
1a4d0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
1a4e0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1a4f0 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
1a500 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
1a510 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
1a520 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1a530 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
1a540 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
1a550 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
1a560 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28   table scan is (
1a570 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20  N*3.0). */.     
1a580 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
1a590 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ize + 16;.      
1a5a0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
1a5b0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
1a5c0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
1a5d0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
1a5e0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
1a5f0 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
1a600 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1a610 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1a620 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1a630 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1a640 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
1a650 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
1a660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
1a670 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66  mask m;.      if
1a680 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65  ( pProbe->isCove
1a690 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
1a6a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1a6b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
1a6c0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
1a6d0 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20          m = 0;. 
1a6e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a6f0 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f      m = pSrc->co
1a700 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
1a710 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
1a720 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
1a730 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
1a740 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
1a750 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
1a760 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
1a770 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a780 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
1a790 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
1a7a0 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
1a7b0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1a7c0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72 6f 62  .       || pProb
1a7d0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
1a7e0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  !=0.       || ( 
1a7f0 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
1a800 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
1a810 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
1a820 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
1a830 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
1a840 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
1a850 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1a860 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1a870 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
1a880 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
1a890 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a8a0 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
1a8b0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
1a8c0 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
1a8d0 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
1a8e0 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
1a8f0 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
1a900 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
1a910 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1a920 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
1a930 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1a940 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
1a950 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77  ng the index row
1a960 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20  s is N*K, where 
1a970 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  K is.        ** 
1a980 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
1a990 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  3.0, depending o
1a9a0 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
1a9b0 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20  izes of the.    
1a9c0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
1a9d0 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f 0a   table rows. */.
1a9e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1a9f0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
1aa00 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
1aa10 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
1aa20 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
1aa30 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
1aa40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1aa50 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
1aa60 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61 64  g index scan, ad
1aa70 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  d in the cost of
1aa80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
1aa90 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ing table lookup
1aaa0 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77 69 6c  s.  The cost wil
1aab0 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75 6d 62  l be 3x the numb
1aac0 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  er of.          
1aad0 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61 6b  ** lookups.  Tak
1aae0 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 57  e into account W
1aaf0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1ab00 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a 20 20  s that can be.  
1ab10 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74 69 73          ** satis
1ab20 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20  fied using just 
1ab30 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 74  the index, and t
1ab40 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
1ab50 72 65 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  re a.          *
1ab60 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 20  * table lookup. 
1ab70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 6f 67  */.          Log
1ab80 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72 53  Est nLookup = rS
1ab90 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42 61  ize + 16;  /* Ba
1aba0 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a 2f  se cost:  N*3 */
1abb0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1abc0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
1abd0 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
1abe0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
1abf0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1ac00 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  C2 = &pWInfo->sW
1ac10 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  C;.          for
1ac20 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d 3e  (ii=0; ii<pWC2->
1ac30 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1ac40 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 54            WhereT
1ac50 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
1ac60 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  C2->a[ii];.     
1ac70 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
1ac80 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
1ac90 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 45 78  Index(pTerm->pEx
1aca0 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f 62 65  pr, iCur, pProbe
1acb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1acc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1acd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ace0 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63 61 6e      /* pTerm can
1acf0 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 75 73   be evaluated us
1ad00 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
1ad10 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65 0a 20  ex.  So reduce. 
1ad20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1ad30 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
1ad40 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  r of table looku
1ad50 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 2a  ps accordingly *
1ad60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
1ad70 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
1ad80 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ob<=0 ){.       
1ad90 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20 2b         nLookup +
1ada0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
1adb0 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ob;.            
1adc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1add0 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a       nLookup--;.
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1adf0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1ae00 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1ae10 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d 20  S) ) nLookup -= 
1ae20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  19;.            
1ae30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1ae40 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
1ae50 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1ae60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1ae70 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c 6f  (pNew->rRun, nLo
1ae80 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  okup);.        }
1ae90 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
1aea0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
1aeb0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
1aec0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
1aed0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
1aee0 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
1aef0 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
1af00 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1af10 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1af20 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
1af30 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
1af40 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
1af50 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
1af60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1af70 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61  pBuilder->bldFla
1af80 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  gs = 0;.    rc =
1af90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1afa0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
1afb0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
1afc0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69  0);.    if( pBui
1afd0 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 3d 3d  lder->bldFlags==
1afe0 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45  SQLITE_BLDF_INDE
1aff0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  XED ){.      /* 
1b000 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75 65 20  If a non-unique 
1b010 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c 20 6f  index is used, o
1b020 72 20 69 66 20 61 20 70 72 65 66 69 78 20 6f 66  r if a prefix of
1b030 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20 20 20   the key for.   
1b040 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69 6e 64     ** unique ind
1b050 65 78 20 69 73 20 75 73 65 64 20 28 6d 61 6b 69  ex is used (maki
1b060 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 75 6e  ng the index fun
1b070 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75 6e  ctionally non-un
1b080 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a 20 74  ique).      ** t
1b090 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73  hen the sqlite_s
1b0a0 74 61 74 31 20 64 61 74 61 20 62 65 63 6f 6d 65  tat1 data become
1b0b0 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  s important for 
1b0c0 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20 20 20  scoring the.    
1b0d0 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20 20    ** plan */.   
1b0e0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
1b0f0 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55 73 65  s |= TF_StatsUse
1b100 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  d;.    }.#ifdef 
1b110 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1b120 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
1b130 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
1b140 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
1b150 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
1b160 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
1b170 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
1b180 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
1b190 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
1b1a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1b1c0 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20  UALTABLE../*.** 
1b1d0 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66  Argument pIdxInf
1b1e0 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70  o is already pop
1b1f0 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
1b200 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1b210 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20   may.** be used 
1b220 62 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  by the virtual t
1b230 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
1b240 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
1b250 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a  w->iTab. This.**
1b260 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20   function marks 
1b270 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73  a subset of thos
1b280 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  e constraints us
1b290 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68  able, invokes th
1b2a0 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20  e.** xBestIndex 
1b2b0 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20  method and adds 
1b2c0 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61  the returned pla
1b2d0 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  n to pBuilder..*
1b2e0 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e  *.** A constrain
1b2f0 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62  t is marked usab
1b300 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  le if:.**.**   *
1b310 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c   Argument mUsabl
1b320 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1b330 20 69 74 73 20 70 72 65 72 65 71 75 69 73 69 74   its prerequisit
1b340 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  es are available
1b350 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
1b360 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66  It is not one of
1b370 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73   the operators s
1b380 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1b390 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61  mExclude mask pa
1b3a0 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74  ssed.**     as t
1b3b0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
1b3c0 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70 72 61  nt (which in pra
1b3d0 63 74 69 63 65 20 69 73 20 65 69 74 68 65 72 20  ctice is either 
1b3e0 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a  WO_IN or 0)..**.
1b3f0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65  ** Argument mPre
1b400 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66  req is a mask of
1b410 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   tables that mus
1b420 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1b430 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ore the.** virtu
1b440 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  al table in ques
1b450 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20  tion. These are 
1b460 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61  added to the pla
1b470 6e 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ns prerequisites
1b480 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73  .** before it is
1b490 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64   added to pBuild
1b4a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74  er..**.** Output
1b4b0 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e   parameter *pbIn
1b4c0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1b4d0 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65  if the plan adde
1b4e0 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a  d to pBuilder.**
1b4f0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1b500 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f  e WO_IN terms, o
1b510 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
1b520 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b530 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1b540 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65  tualOne(.  Where
1b550 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1b560 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b  ilder,.  Bitmask
1b570 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1b580 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1b590 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1b5a0 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f  must be used. */
1b5b0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62  .  Bitmask mUsab
1b5c0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1b5d0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73     /* Mask of us
1b5e0 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20  able tables */. 
1b5f0 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20   u16 mExclude,  
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d   /* Exclude term
1b620 73 20 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70  s using these op
1b630 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c  erators */.  sql
1b640 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1b650 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20  *pIdxInfo,   /* 
1b660 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74  Populated object
1b670 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20   for xBestIndex 
1b680 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  */.  u16 mNoOmit
1b690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b6a0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f       /* Do not o
1b6b0 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73 74 72  mit these constr
1b6c0 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
1b6d0 70 62 49 6e 20 20 20 20 20 20 20 20 20 20 20 20  pbIn            
1b6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1b6f0 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20  T: True if plan 
1b700 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1b710 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  op */.){.  Where
1b720 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42  Clause *pWC = pB
1b730 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73  uilder->pWC;.  s
1b740 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b750 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
1b760 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
1b770 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b780 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
1b790 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78  e *pUsage = pIdx
1b7a0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1b7b0 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b  tUsage;.  int i;
1b7c0 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20  .  int mxTerm;. 
1b7d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b7e0 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  _OK;.  WhereLoop
1b7f0 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65   *pNew = pBuilde
1b800 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  r->pNew;.  Parse
1b810 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c   *pParse = pBuil
1b820 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  der->pWInfo->pPa
1b830 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72  rse;.  struct Sr
1b840 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1b850 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57   = &pBuilder->pW
1b860 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1b870 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1b880 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1b890 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
1b8a0 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73  nstraint;..  ass
1b8b0 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20  ert( (mUsable & 
1b8c0 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65  mPrereq)==mPrere
1b8d0 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30  q );.  *pbIn = 0
1b8e0 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
1b8f0 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f   = mPrereq;..  /
1b900 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65  * Set the usable
1b910 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62   flag on the sub
1b920 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  set of constrain
1b930 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ts identified by
1b940 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73   .  ** arguments
1b950 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78   mUsable and mEx
1b960 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78  clude. */.  pIdx
1b970 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
1b980 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1b990 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
1b9a0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1b9b0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
1b9c0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1b9d0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
1b9e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1b9f0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49  erm = &pWC->a[pI
1ba00 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
1ba10 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  set];.    pIdxCo
1ba20 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
1ba30 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1ba40 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
1ba50 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70  sable)==pTerm->p
1ba60 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20  rereqRight .    
1ba70 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1ba80 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65  rator & mExclude
1ba90 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
1baa0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
1bab0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
1bac0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1bad0 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ze the output fi
1bae0 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69  elds of the sqli
1baf0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
1bb00 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65  tructure */.  me
1bb10 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
1bb20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
1bb30 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  )*nConstraint);.
1bb40 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e    assert( pIdxIn
1bb50 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1bb60 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64  xStr==0 );.  pId
1bb70 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
1bb80 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
1bb90 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
1bba0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1bbb0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49  nsumed = 0;.  pI
1bbc0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1bbd0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
1bbe0 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
1bbf0 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  )2;.  pIdxInfo->
1bc00 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
1bc10 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  25;.  pIdxInfo->
1bc20 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  idxFlags = 0;.  
1bc30 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65  pIdxInfo->colUse
1bc40 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  d = (sqlite3_int
1bc50 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  64)pSrc->colUsed
1bc60 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
1bc70 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1bc80 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1bc90 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76  thod */.  rc = v
1bca0 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
1bcb0 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c  rse, pSrc->pTab,
1bcc0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66   pIdxInfo);.  if
1bcd0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1bce0 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  ;..  mxTerm = -1
1bcf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
1bd00 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
1bd10 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69  raint );.  for(i
1bd20 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1bd30 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
1bd40 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70  Term[i] = 0;.  p
1bd50 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1bd60 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78  Mask = 0;.  pIdx
1bd70 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
1bd80 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1bd90 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
1bda0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1bdb0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
1bdc0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1bdd0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
1bde0 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
1bdf0 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
1be00 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
1be10 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
1be20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1be30 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1be40 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
1be50 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
1be60 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
1be70 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c  straint.       |
1be80 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20  | j<0.       || 
1be90 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
1bea0 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
1beb0 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
1bec0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e        || pIdxCon
1bed0 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20  s->usable==0.   
1bee0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1bef0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1bf00 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e  arse,"%s.xBestIn
1bf10 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  dex malfunction"
1bf20 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61  ,pSrc->pTab->zNa
1bf30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  me);.        tes
1bf40 74 63 61 73 65 28 20 70 49 64 78 49 6e 66 6f 2d  tcase( pIdxInfo-
1bf50 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1bf60 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r );.        ret
1bf70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1bf80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bf90 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
1bfa0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
1bfb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bfc0 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( j==0 );.      
1bfd0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
1bfe0 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
1bff0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
1c000 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65  >a[j];.      pNe
1c010 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
1c020 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
1c030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1c040 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
1c050 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
1c060 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
1c070 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   pTerm;.      if
1c080 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
1c090 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
1c0a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c0b0 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
1c0c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1c0d0 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20  erm==16 );.     
1c0e0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
1c0f0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
1c100 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
1c110 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
1c120 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  erm;.      if( (
1c130 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c140 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
1c150 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
1c160 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
1c170 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
1c180 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
1c190 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  ay not.        *
1c1a0 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
1c1b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
1c1c0 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
1c1d0 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
1c1e0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
1c1f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
1c200 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
1c210 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
1c220 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ms and.        *
1c230 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f  * (2) Multiple o
1c240 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69  utputs from a si
1c250 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69  ngle IN value wi
1c260 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20  ll not merge.   
1c270 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
1c280 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  .  */.        pI
1c290 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1c2a0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
1c2b0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69       pIdxInfo->i
1c2c0 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  dxFlags &= ~SQLI
1c2d0 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1c2e0 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70  IQUE;.        *p
1c2f0 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28  bIn = 1; assert(
1c300 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f   (mExclude & WO_
1c310 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  IN)==0 );.      
1c320 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  }.    }.  }.  pN
1c330 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
1c340 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b  ask &= ~mNoOmit;
1c350 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ..  pNew->nLTerm
1c360 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 66   = mxTerm+1;.  f
1c370 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54 65 72  or(i=0; i<=mxTer
1c380 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
1c390 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
1c3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1c3b0 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61 72 67  The non-zero arg
1c3c0 76 49 64 78 20 76 61 6c 75 65 73 20 6d 75 73 74  vIdx values must
1c3d0 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 20   be contiguous. 
1c3e0 20 52 61 69 73 65 20 61 6e 0a 20 20 20 20 20 20   Raise an.      
1c3f0 2a 2a 20 65 72 72 6f 72 20 69 66 20 74 68 65 79  ** error if they
1c400 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20 20 20   are not */.    
1c410 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c420 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65  g(pParse,"%s.xBe
1c430 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74  stIndex malfunct
1c440 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d  ion",pSrc->pTab-
1c450 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 74  >zName);.      t
1c460 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66  estcase( pIdxInf
1c470 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1c480 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
1c490 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1c4a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1c4b0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
1c4c0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
1c4d0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
1c4e0 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
1c4f0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
1c500 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c510 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
1c520 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1c530 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
1c540 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1c550 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1c560 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
1c570 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
1c580 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1c590 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
1c5a0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1c5b0 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
1c5c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
1c5d0 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
1c5e0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1c5f0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1c600 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
1c610 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
1c620 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
1c630 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1c640 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1c650 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1c660 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1c670 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1c680 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1c690 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1c6a0 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1c6b0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1c6c0 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1c6d0 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1c6e0 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1c6f0 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1c700 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1c710 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1c720 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1c730 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1c740 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1c750 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1c760 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1c770 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1c780 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1c790 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1c7a0 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1c7b0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1c7c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c7d0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1c7e0 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1c7f0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1c800 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1c810 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1c820 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1c830 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1c840 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1c850 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c860 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1c870 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1c880 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c8a0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1c8b0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1c8c0 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1c8d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c8e0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
1c8f0 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66  ion is invoked f
1c900 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42  rom within an xB
1c910 65 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62  estIndex() callb
1c920 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72  ack, it.** retur
1c930 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1c940 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1c950 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1c960 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  the collation.**
1c970 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69   sequence associ
1c980 61 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e  ated with elemen
1c990 74 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73  t iCons of the s
1c9a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c9b0 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  o.aConstraint.**
1c9c0 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69   array. Or, if i
1c9d0 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72  Cons is out of r
1c9e0 61 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69 73  ange or there is
1c9f0 20 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73 74   no active xBest
1ca00 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72  Index.** call, r
1ca10 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  eturn NULL..*/.c
1ca20 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1ca30 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f  e3_vtab_collatio
1ca40 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n(sqlite3_index_
1ca50 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
1ca60 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48 69  int iCons){.  Hi
1ca70 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70  ddenIndexInfo *p
1ca80 48 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65 6e  Hidden = (Hidden
1ca90 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78  IndexInfo*)&pIdx
1caa0 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74  Info[1];.  const
1cab0 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
1cac0 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20  .  if( iCons>=0 
1cad0 26 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e 66  && iCons<pIdxInf
1cae0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  o->nConstraint )
1caf0 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
1cb00 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  C = 0;.    int i
1cb10 54 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Term = pIdxInfo-
1cb20 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43 6f  >aConstraint[iCo
1cb30 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns].iTermOffset;
1cb40 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
1cb50 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61 5b  pHidden->pWC->a[
1cb60 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
1cb70 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 20    if( pX->pLeft 
1cb80 29 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73 71  ){.      pC = sq
1cb90 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1cba0 72 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65  reCollSeq(pHidde
1cbb0 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  n->pParse, pX->p
1cbc0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
1cbd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  );.    }.    zRe
1cbe0 74 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e  t = (pC ? pC->zN
1cbf0 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 29 3b  ame : "BINARY");
1cc00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1cc10 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  et;.}../*.** Add
1cc20 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1cc30 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
1cc40 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
1cc50 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
1cc60 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1cc70 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
1cc80 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1cc90 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
1cca0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
1ccb0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
1ccc0 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
1ccd0 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
1cce0 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71  ry, both mPrereq
1ccf0 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
1cd00 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
1cd10 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72  Otherwise, mPrer
1cd20 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20  eq is a mask of 
1cd30 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  all FROM clause.
1cd40 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1cd50 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1cd60 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1cd70 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1cd80 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70  e and are.** sep
1cd90 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1cda0 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1cdb0 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1cdc0 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68  N. Similarly, th
1cdd0 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d  e.** mUnusable m
1cde0 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ask contains all
1cdf0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
1ce00 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1ce10 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72  after the.** vir
1ce20 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61  tual table and a
1ce30 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  re separated fro
1ce40 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1ce50 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a   one LEFT or .**
1ce60 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a   CROSS JOIN. .**
1ce70 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1ce80 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65   if the query we
1ce90 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  re:.**.**   ... 
1cea0 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54  FROM t1, t2 LEFT
1ceb0 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74   JOIN t3, t4, vt
1cec0 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20   CROSS JOIN t5, 
1ced0 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d  t6;.**.** then m
1cee0 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e  Prereq correspon
1cef0 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61  ds to (t1, t2) a
1cf00 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20  nd mUnusable to 
1cf10 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20  (t5, t6)..**.** 
1cf20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69  All the tables i
1cf30 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62  n mPrereq must b
1cf40 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1cf50 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1cf60 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
1cf70 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
1cf80 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
1cf90 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
1cfa0 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50  isfied by .** mP
1cfb0 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65  rereq may be spe
1cfc0 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1cfd0 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1cfe0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1cff0 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1d000 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1d010 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1d020 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1d030 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1d040 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1d050 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1d060 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1d070 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1d080 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1d090 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1d0a0 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1d0b0 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1d0c0 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1d0d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1d0e0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1d0f0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1d100 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1d110 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1d120 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1d130 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
1d140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1d150 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1d160 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1d170 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1d180 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1d190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1d1a0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1d1b0 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1d1c0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1d1d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d1e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d1f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d200 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1d210 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1d220 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1d230 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1d240 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1d250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d260 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1d270 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1d280 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1d290 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1d2a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1d2b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d2c0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1d2d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1d2e0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1d2f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1d300 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1d310 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1d320 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1d330 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1d340 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1d350 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d360 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1d370 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1d3a0 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1d3b0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1d3c0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1d3d0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3f0 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1d400 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1d410 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  n */.  u16 mNoOm
1d420 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  it;..  assert( (
1d430 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61  mPrereq & mUnusa
1d440 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1d450 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1d460 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1d470 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1d480 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1d490 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1d4a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1d4b0 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1d4c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1d4d0 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1d4e0 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1d4f0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1d500 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1d510 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1d520 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1d530 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
1d540 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
1d550 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69    &mNoOmit);.  i
1d560 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1d570 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1d580 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  PT;.  pNew->rSet
1d590 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1d5a0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1d5b0 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
1d5c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1d5d0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1d5e0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1d5f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1d600 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
1d610 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
1d620 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  size(pParse->db,
1d630 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
1d640 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
1d650 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1d660 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74  >db, p);.    ret
1d670 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1d680 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1d690 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73   First call xBes
1d6a0 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1d6b0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  l constraints us
1d6c0 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45  able. */.  WHERE
1d6d0 54 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42  TRACE(0x800, ("B
1d6e0 45 47 49 4e 20 25 73 2e 61 64 64 56 69 72 74 75  EGIN %s.addVirtu
1d6f0 61 6c 28 29 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  al()\n", pSrc->p
1d700 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1d710 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1d720 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1d730 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29   all usable\n"))
1d740 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  ;.  rc = whereLo
1d750 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1d760 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1d770 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70  q, ALLBITS, 0, p
1d780 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d790 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1d7a0 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64 65  all to xBestInde
1d7b0 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65 72  x() with all ter
1d7c0 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64 75  ms enabled produ
1d7d0 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20  ced a plan.  ** 
1d7e0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
1d7f0 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63 65  quire any source
1d800 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61 20   tables (IOW: a 
1d810 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74 3d  plan with mBest=
1d820 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  =0),.  ** then t
1d830 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1d840 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20 66   in making any f
1d850 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
1d860 78 42 65 73 74 49 6e 64 65 78 28 29 20 0a 20 20  xBestIndex() .  
1d870 2a 2a 20 73 69 6e 63 65 20 74 68 65 79 20 77 69  ** since they wi
1d880 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74 68  ll all return th
1d890 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 28 69  e same result (i
1d8a0 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
1d8b0 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ().  ** implemen
1d8c0 74 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e  tation is sane).
1d8d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1d8e0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65 73  LITE_OK && (mBes
1d8f0 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72 65  t = (pNew->prere
1d900 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21 3d  q & ~mPrereq))!=
1d910 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  0 ){.    int see
1d920 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
1d930 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d940 66 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f  f a plan with no
1d950 20 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f   prereqs seen */
1d960 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72  .    int seenZer
1d970 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20  oNoIN = 0;      
1d980 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20     /* Plan with 
1d990 6e 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e  no prereqs and n
1d9a0 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a  o IN(...) seen *
1d9b0 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50  /.    Bitmask mP
1d9c0 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  rev = 0;.    Bit
1d9d0 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d  mask mBestNoIn =
1d9e0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   0;..    /* If t
1d9f0 68 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64  he plan produced
1da00 20 62 79 20 74 68 65 20 65 61 72 6c 69 65 72 20   by the earlier 
1da10 63 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28  call uses an IN(
1da20 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a  ...) term, call.
1da30 20 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65      ** xBestInde
1da40 78 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69  x again, this ti
1da50 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20  me with IN(...) 
1da60 74 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20  terms disabled. 
1da70 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29  */.    if( bIn )
1da80 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1da90 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1daa0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61  tualOne: all usa
1dab0 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b  ble w/o IN\n"));
1dac0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1dad0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1dae0 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1daf0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1db00 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c   ALLBITS, WO_IN,
1db10 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1db20 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
1db30 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ( bIn==0 );.    
1db40 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e    mBestNoIn = pN
1db50 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1db60 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28  rereq;.      if(
1db70 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b   mBestNoIn==0 ){
1db80 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1db90 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  o = 1;.        s
1dba0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1dbb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dbc0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73      /* Call xBes
1dbd0 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20  tIndex once for 
1dbe0 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61  each distinct va
1dbf0 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69  lue of (prereqRi
1dc00 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20  ght & ~mPrereq) 
1dc10 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73  .    ** in the s
1dc20 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74  et of terms that
1dc30 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75   apply to the cu
1dc40 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61  rrent virtual ta
1dc50 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ble.  */.    whi
1dc60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1dc70 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
1dc80 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
1dc90 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b  mNext = ALLBITS;
1dca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1dcb0 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Next>0 );.      
1dcc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1dcd0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
1dce0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
1dcf0 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20  his = (.        
1dd00 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43      pWC->a[p->aC
1dd10 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
1dd20 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71  rmOffset].prereq
1dd30 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71  Right & ~mPrereq
1dd40 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1dd50 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50      if( mThis>mP
1dd60 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65  rev && mThis<mNe
1dd70 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68  xt ) mNext = mTh
1dd80 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  is;.      }.    
1dd90 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b    mPrev = mNext;
1dda0 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74  .      if( mNext
1ddb0 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61  ==ALLBITS ) brea
1ddc0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65  k;.      if( mNe
1ddd0 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65  xt==mBest || mNe
1dde0 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20  xt==mBestNoIn ) 
1ddf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1de00 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1de10 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1de20 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e   mPrev=%04llx mN
1de30 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20  ext=%04llx\n",. 
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75        (sqlite3_u
1de60 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71  int64)mPrev, (sq
1de70 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65  lite3_uint64)mNe
1de80 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  xt));.      rc =
1de90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1dea0 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20  tualOne(.       
1deb0 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72     pBuilder, mPr
1dec0 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65  ereq, mNext|mPre
1ded0 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1dee0 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1def0 20 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65   if( pNew->prere
1df00 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20 20  q==mPrereq ){.  
1df10 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d        seenZero =
1df20 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
1df30 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72  bIn==0 ) seenZer
1df40 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1df50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1df60 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f   If the calls to
1df70 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e   xBestIndex() in
1df80 20 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20   the above loop 
1df90 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  did not find a p
1dfa0 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  lan.    ** that 
1dfb0 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72  requires no sour
1dfc0 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c  ce tables at all
1dfd0 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61   (i.e. one guara
1dfe0 6e 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20  nteed to be.    
1dff0 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65  ** usable), make
1e000 20 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74   a call here wit
1e010 68 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62  h all source tab
1e020 6c 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  les disabled */.
1e030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e040 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72  TE_OK && seenZer
1e050 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48  o==0 ){.      WH
1e060 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1e070 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1e080 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29 29  ll disabled\n"))
1e090 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1e0a0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1e0b0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1e0c0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1e0d0 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  , mPrereq, 0, p,
1e0e0 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1e0f0 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d  .      if( bIn==
1e100 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1e110 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1e120 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1e130 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1e140 20 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69   have so far fai
1e150 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c  led to find a pl
1e160 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  an.    ** that r
1e170 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63  equires no sourc
1e180 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20  e tables at all 
1e190 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  and does not use
1e1a0 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20   an IN(...).    
1e1b0 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b  ** operator, mak
1e1c0 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74  e a final call t
1e1d0 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72  o obtain one her
1e1e0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
1e1f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e200 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20  seenZeroNoIN==0 
1e210 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1e220 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1e230 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1e240 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49  sabled and w/o I
1e250 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1e260 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1e270 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1e280 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1e290 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1e2a0 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1e2b0 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d  it, &bIn);.    }
1e2c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  .  }..  if( p->n
1e2d0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1e2e0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
1e2f0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
1e300 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 50 61  ite3DbFreeNN(pPa
1e310 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 57  rse->db, p);.  W
1e320 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
1e330 20 28 22 45 4e 44 20 25 73 2e 61 64 64 56 69 72   ("END %s.addVir
1e340 74 75 61 6c 28 29 2c 20 72 63 3d 25 64 5c 6e 22  tual(), rc=%d\n"
1e350 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
1e360 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20 72 65 74  ame, rc));.  ret
1e370 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1e380 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e390 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
1e3a0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
1e3b0 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
1e3c0 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
1e3d0 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
1e3e0 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
1e3f0 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
1e400 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
1e410 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
1e420 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  r(.  WhereLoopBu
1e430 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
1e440 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65   .  Bitmask mPre
1e450 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  req, .  Bitmask 
1e460 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57  mUnusable.){.  W
1e470 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1e480 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1e490 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
1e4a0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
1e4b0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
1e4c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1e4d0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
1e4e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e4f0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
1e500 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
1e510 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1e520 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
1e530 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
1e540 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
1e550 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e560 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
1e570 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1e580 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
1e590 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1e5a0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1e5b0 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
1e5c0 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
1e5d0 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
1e5e0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
1e5f0 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
1e600 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
1e610 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1e620 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1e630 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
1e640 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1e650 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
1e660 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1e670 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
1e680 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
1e690 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
1e6a0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
1e6b0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
1e6c0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
1e6d0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
1e6e0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
1e6f0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1e700 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1e710 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
1e720 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
1e730 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
1e740 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1e750 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
1e760 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
1e770 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
1e780 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
1e790 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
1e7a0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
1e7b0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
1e7c0 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
1e7d0 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
1e7e0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1e7f0 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
1e800 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1e810 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1e820 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
1e830 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
1e840 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
1e850 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1e860 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
1e870 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1e880 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1e890 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1e8a0 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
1e8b0 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
1e8c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1e8d0 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1e8e0 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
1e8f0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
1e900 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
1e910 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
1e920 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
1e930 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1e940 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
1e950 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1e960 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
1e970 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
1e980 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
1e990 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1e9a0 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
1e9b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e9c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e9e0 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
1e9f0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1ea00 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
1ea10 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1ea20 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
1ea30 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
1ea40 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1ea60 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
1ea70 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
1ea80 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1ea90 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
1eaa0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1eab0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
1eac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ead0 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74  WhereClausePrint
1eae0 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43 29 3b  (sSubBuild.pWC);
1eaf0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
1eb00 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1eb10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1eb20 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
1eb30 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1eb40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1eb50 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1eb60 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
1eb70 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c  bBuild, mPrereq,
1eb80 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1eb90 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
1eba0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
1ebb0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1ebc0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
1ebd0 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1ebe0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ebf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ec00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec10 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ec20 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69  opAddOr(&sSubBui
1ec30 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  ld, mPrereq, mUn
1ec40 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1ec50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1ec60 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1ec70 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b   || sCur.n==0 );
1ec80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75  .        if( sCu
1ec90 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r.n==0 ){.      
1eca0 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1ecb0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ecc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ecd0 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
1ece0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
1ecf0 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a  (&sSum, &sCur);.
1ed00 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d            once =
1ed10 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1ed20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  e{.          Whe
1ed30 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20  reOrSet sPrev;. 
1ed40 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1ed50 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53  Move(&sPrev, &sS
1ed60 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
1ed70 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
1ed80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ed90 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  sPrev.n; i++){. 
1eda0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
1edb0 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b  =0; j<sCur.n; j+
1edc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1edd0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
1ede0 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69  &sSum, sPrev.a[i
1edf0 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e  ].prereq | sCur.
1ee00 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20  a[j].prereq,.   
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ee30 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
1ee40 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e  a[i].rRun, sCur.
1ee50 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20  a[j].rRun),.    
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1ee80 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
1ee90 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61  [i].nOut, sCur.a
1eea0 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  [j].nOut));.    
1eeb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1eed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1eee0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
1eef0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
1ef00 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
1ef10 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
1ef20 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
1ef30 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  _OR;.      pNew-
1ef40 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
1ef50 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
1ef60 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  x = 0;.      mem
1ef70 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c  set(&pNew->u, 0,
1ef80 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29   sizeof(pNew->u)
1ef90 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1efa0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1efb0 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b  && i<sSum.n; i++
1efc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  ){.        /* TU
1efd0 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20  NING: Currently 
1efe0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69  sSum.a[i].rRun i
1eff0 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d  s set to the sum
1f000 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
1f010 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20        ** of all 
1f020 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72  sub-scans requir
1f030 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61  ed by the OR-sca
1f040 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20  n. However, due 
1f050 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20  to rounding.    
1f060 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69      ** errors, i
1f070 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68  t may be that th
1f080 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52  e cost of the OR
1f090 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74  -scan is equal t
1f0a0 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  o its.        **
1f0b0 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20   most expensive 
1f0c0 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68  sub-scan. Add th
1f0d0 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
1f0e0 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20  ble penalty .   
1f0f0 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c       ** (equival
1f100 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69  ent to multiplyi
1f110 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31  ng the cost by 1
1f120 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74  .07) to ensure t
1f130 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  hat .        ** 
1f140 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61  this does not ha
1f150 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  ppen. Otherwise,
1f160 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
1f170 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20  es such as the. 
1f180 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77         ** follow
1f190 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20  ing where there 
1f1a0 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22  is an index on "
1f1b0 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y":.        **. 
1f1c0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48         **     WH
1f1d0 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78  ERE likelihood(x
1f1e0 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f  =?, 0.99) OR y=?
1f1f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f200 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e      ** the plann
1f210 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20  er may elect to 
1f220 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20  "OR" together a 
1f230 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20  full-table scan 
1f240 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  and an.        *
1f250 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20  * index lookup. 
1f260 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61  And other simila
1f270 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e  rly odd results.
1f280 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
1f290 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61  w->rRun = sSum.a
1f2a0 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20  [i].rRun + 1;.  
1f2b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
1f2c0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
1f2d0 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
1f2e0 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
1f2f0 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
1f300 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1f310 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1f320 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1f330 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  }.      WHERETRA
1f340 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20  CE(0x200, ("End 
1f350 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
1f360 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
1f370 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  m));.    }.  }. 
1f380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f390 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
1f3a0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
1f3b0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a  or all tables .*
1f3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1f3d0 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65  reLoopAddAll(Whe
1f3e0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1f3f0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
1f400 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1f410 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1f420 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  ;.  Bitmask mPre
1f430 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61  req = 0;.  Bitma
1f440 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20  sk mPrior = 0;. 
1f450 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63   int iTab;.  Src
1f460 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
1f470 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1f480 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1f490 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f4a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f4b0 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26  t_item *pEnd = &
1f4c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e  pTabList->a[pWIn
1f4d0 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73  fo->nLevel];.  s
1f4e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
1f4f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1f500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f510 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
1f520 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70  op *pNew;.  u8 p
1f530 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30  riorJointype = 0
1f540 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
1f550 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
1f560 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
1f570 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
1f580 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1f590 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65  r->pNew;.  where
1f5a0 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a  LoopInit(pNew);.
1f5b0 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
1f5c0 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
1f5d0 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61   pItem<pEnd; iTa
1f5e0 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
1f5f0 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73     Bitmask mUnus
1f600 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e  able = 0;.    pN
1f610 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
1f620 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
1f630 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65  elf = sqlite3Whe
1f640 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1f650 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
1f660 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1f670 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66    if( ((pItem->f
1f680 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72  g.jointype|prior
1f690 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f  Jointype) & (JT_
1f6a0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
1f6b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1f6c0 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
1f6d0 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d   true when pItem
1f6e0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   is the FROM cla
1f6f0 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a  use term on the.
1f700 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68        ** right-h
1f710 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45  and-side of a LE
1f720 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1f730 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65  .  */.      mPre
1f740 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  req = mPrior;.  
1f750 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
1f760 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66  ntype = pItem->f
1f770 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e  g.jointype;.#ifn
1f780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f790 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1f7a0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1f7b0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1f7c0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1f7d0 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20  ist_item *p;.   
1f7e0 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b     for(p=&pItem[
1f7f0 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  1]; p<pEnd; p++)
1f800 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 55  {.        if( mU
1f810 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66  nusable || (p->f
1f820 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  g.jointype & (JT
1f830 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1f840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55   ){.          mU
1f850 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74  nusable |= sqlit
1f860 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
1f870 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
1f880 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  , p->iCursor);. 
1f890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f8a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1f8b0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
1f8c0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1f8d0 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1f8e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
1f8f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1f900 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
1f910 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
1f920 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1f930 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
1f940 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  req);.    }.    
1f950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f960 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1f970 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
1f980 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1f990 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1f9a0 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
1f9b0 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
1f9c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
1f9d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f9e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
1f9f0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
1fa00 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
1fa10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fa20 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
1fa30 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
1fa40 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
1fa50 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
1fa60 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70 61 72  f the 6th.** par
1fa70 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
1fa80 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
1fa90 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
1faa0 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
1fab0 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
1fac0 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
1fad0 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
1fae0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
1faf0 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
1fb00 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
1fb10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1fb20 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
1fb30 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
1fb40 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
1fb50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1fb60 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1fb70 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
1fb80 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
1fb90 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
1fba0 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
1fbb0 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
1fbc0 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
1fbd0 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
1fbe0 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
1fbf0 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
1fc00 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
1fc10 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
1fc20 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
1fc30 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
1fc40 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
1fc50 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
1fc60 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
1fc70 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
1fc80 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
1fc90 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
1fca0 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
1fcb0 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
1fcc0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1fcd0 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
1fce0 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72   as equivalent r
1fcf0 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
1fd00 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
1fd10 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
1fd20 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
1fd30 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1fd40 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
1fd50 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
1fd60 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
1fd70 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
1fd80 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
1fd90 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
1fda0 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
1fdb0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
1fdc0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
1fdd0 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
1fde0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1fdf0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1fe00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1fe10 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1fe20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
1fe30 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
1fe40 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
1fe50 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
1fe60 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
1fe70 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
1fe80 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
1fe90 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
1fea0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 47        /* WHERE_G
1feb0 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53 54 49  ROUPBY or _DISTI
1fec0 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45 52 42  NCTBY or _ORDERB
1fed0 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36  Y_LIMIT */.  u16
1fee0 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
1fef0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ff00 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
1ff10 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
1ff20 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
1ff30 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
1ff40 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
1ff50 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
1ff60 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
1ff70 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
1ff80 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
1ff90 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
1ffa0 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
1ffb0 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
1ffc0 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
1ffd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1ffe0 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
1fff0 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
20000 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
20010 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
20020 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
20030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20040 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
20050 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
20060 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
20070 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
20080 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
20090 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
200a0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
200b0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
200c0 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
200d0 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
200e0 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
200f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
20100 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
20110 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
20120 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
20130 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20  u16 eqOpMask;   
20140 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64        /* Allowed
20150 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
20160 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  ors */.  u16 nKe
20170 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
20180 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
20190 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
201a0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
201b0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
201c0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
201d0 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
201e0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
201f0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
20200 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20210 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
20220 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
20230 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20250 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
20260 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
20270 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
20280 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
20290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
202a0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
202b0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
202c0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
202d0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
202e0 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
202f0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
20300 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
20310 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
20320 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
20330 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
20340 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
20350 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
20360 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
20370 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
20380 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
20390 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
203a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
203b0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
203c0 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
203d0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
203e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
203f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
20400 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
20410 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
20420 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
20430 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
20440 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
20450 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
20460 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20470 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
20480 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
20490 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
204a0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
204b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
204c0 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
204d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
204e0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
204f0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
20500 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
20510 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
20520 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
20530 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
20540 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
20550 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
20560 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
20570 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
20580 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
20590 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
205a0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
205b0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
205c0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
205d0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
205e0 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
205f0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
20600 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
20610 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
20620 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
20630 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
20640 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
20650 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
20660 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
20670 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
20680 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
20690 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
206a0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
206b0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
206c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
206d0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
206e0 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
206f0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
20700 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
20710 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
20720 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
20730 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
20740 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
20750 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
20760 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
20770 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
20780 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
20790 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
207a0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
207b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
207c0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
207d0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
207e0 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
207f0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
20800 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
20810 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
20820 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
20830 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
20840 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
20850 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
20860 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
20870 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
20880 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
20890 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
208a0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
208b0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
208c0 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
208d0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
208e0 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
208f0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
20900 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
20910 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
20920 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
20930 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
20940 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
20950 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
20960 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
20970 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
20980 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
20990 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
209a0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
209b0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
209c0 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
209d0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
209e0 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
209f0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
20a00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20a10 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
20a20 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
20a30 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
20a40 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
20a50 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
20a60 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
20a70 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  );.  if( nLoop &
20a80 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
20a90 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
20aa0 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
20ab0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
20ac0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
20ad0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
20ae0 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
20af0 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
20b00 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
20b10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
20b20 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
20b30 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
20b40 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
20b50 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
20b60 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
20b70 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
20b80 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
20b90 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
20ba0 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61  dy = 0;.  eqOpMa
20bb0 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f  sk = WO_EQ | WO_
20bc0 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  IS | WO_ISNULL;.
20bd0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
20be0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
20bf0 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d 61 73  _LIMIT ) eqOpMas
20c00 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f  k |= WO_IN;.  fo
20c10 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
20c20 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
20c30 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
20c40 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
20c50 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
20c60 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
20c70 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
20c80 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c  ;.    if( iLoop<
20c90 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 70  nLoop ){.      p
20ca0 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c  Loop = pPath->aL
20cb0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
20cc0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
20cd0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
20ce0 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75  _LIMIT ) continu
20cf0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
20d00 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73      pLoop = pLas
20d10 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
20d20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
20d30 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
20d40 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
20d50 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
20d60 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
20d70 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
20d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
20d90 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  se{.      pLoop-
20da0 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
20db0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
20dc0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
20dd0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
20de0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
20df0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
20e00 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
20e10 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
20e20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
20e30 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
20e40 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
20e50 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
20e60 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
20e70 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
20e80 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
20e90 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
20ea0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
20eb0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
20ec0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
20ed0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
20ee0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
20ef0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
20f00 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
20f10 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
20f20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
20f30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
20f40 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
20f50 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
20f60 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
20f70 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
20f80 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
20f90 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
20fa0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20fb0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
20fc0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
20fd0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
20fe0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
20ff0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
21010 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30  ady, eqOpMask, 0
21020 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
21030 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
21040 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
21050 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
21060 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _IN ){.        /
21070 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f  * IN terms are o
21080 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f  nly valid for so
21090 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44  rting in the ORD
210a0 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20  ER BY LIMIT .   
210b0 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61       ** optimiza
210c0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f  tion, and then o
210d0 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72 65 20  nly if they are 
210e0 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20  actually used.  
210f0 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20        ** by the 
21100 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
21110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
21120 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21130 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
21140 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
21150 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  0; j<pLoop->nLTe
21160 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f  rm && pTerm!=pLo
21170 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a  op->aLTerm[j]; j
21180 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  ++){}.        if
21190 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  ( j>=pLoop->nLTe
211a0 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
211b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
211c0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
211d0 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
211e0 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
211f0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
21200 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21210 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74  e3ExprCollSeqMat
21220 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ch(pWInfo->pPars
21230 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
21240 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
21250 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54 65 72  a[i].pExpr, pTer
21260 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a  m->pExpr)==0 ){.
21270 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
21280 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
21290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
212a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  pTerm->pExpr->op
212b0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
212c0 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c   }.      obSat |
212d0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
212e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c    }..    if( (pL
212f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21300 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
21310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
21320 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21330 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20  ERE_IPK ){.     
21340 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
21350 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
21360 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   0;.        nCol
21370 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  umn = 1;.      }
21380 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78  else if( (pIndex
21390 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
213a0 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20  e.pIndex)==0 || 
213b0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
213c0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
213d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
213e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65  lse{.        nKe
213f0 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  yCol = pIndex->n
21400 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
21410 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  nColumn = pIndex
21420 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
21430 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
21440 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c  mn==nKeyCol+1 ||
21450 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
21460 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20  x->pTable) );.  
21470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
21480 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
21490 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f  Column-1]==XN_RO
214a0 57 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  WID.            
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
214c0 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
214d0 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
214e0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
214f0 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49  inct = IsUniqueI
21500 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
21510 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
21520 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
21530 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
21540 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
21550 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
21560 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
21570 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
21580 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
21590 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
215a0 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
215b0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
215c0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
215d0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
215e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
215f0 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a  u8 bOnce = 1; /*
21600 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
21610 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
21620 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
21630 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f    assert( j>=pLo
21640 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
21650 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
21660 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a  (pLoop->aLTerm[j
21670 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d  ]==0)==(j<pLoop-
21680 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20 20 20  >nSkip).        
21690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
216a0 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
216b0 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d  nEq && j>=pLoop-
216c0 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  >nSkip ){.      
216d0 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4c      u16 eOp = pL
216e0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
216f0 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20  eOperator;..    
21700 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
21710 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64  er == and IS and
21720 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20   ISNULL terms.  
21730 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65  (Also skip IN te
21740 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20 20 20  rms when.       
21750 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52     ** doing WHER
21760 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
21770 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a 20 20  processing). .  
21780 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
21790 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
217a0 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 61  urrent term is a
217b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28   column of an ((
217c0 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  ?,?) IN (SELECT.
217d0 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20 20 20  ..)) .          
217e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  ** expression fo
217f0 72 20 77 68 69 63 68 20 74 68 65 20 53 45 4c 45  r which the SELE
21800 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  CT returns more 
21810 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c  than one column,
21820 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
21830 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 74  eck that it is t
21840 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75  he only column u
21850 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  sed by this loop
21860 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
21870 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20         ** if it 
21880 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72  is one of two or
21890 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74   more, none of t
218a0 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62  he columns can b
218b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
218c0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d 61 74  onsidered to mat
218d0 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74  ch an ORDER BY t
218e0 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  erm.  */.       
218f0 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 65 71     if( (eOp & eq
21900 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  OpMask)!=0 ){.  
21910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
21920 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
21930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
21940 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
21950 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
21960 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21970 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
21980 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21990 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
219a0 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d  e;  .          }
219b0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
219c0 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a  eOp & WO_IN) ){.
219d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
219e0 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66 69 63  LWAYS() justific
219f0 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e  ation: eOp is an
21a00 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
21a10 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20  or due to the.  
21a20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70            ** j<p
21a30 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
21a40 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f  q constraint abo
21a50 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c 69 74  ve.  Any equalit
21a60 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  y other.        
21a70 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49      ** than WO_I
21a80 4e 20 69 73 20 63 61 70 74 75 72 65 64 20 62 79  N is captured by
21a90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 69   the previous "i
21aa0 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e 65  f".  So this one
21ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21ac0 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20 62 65  always has to be
21ad0 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20   WO_IN. */.     
21ae0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
21af0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
21b00 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  j]->pExpr;.     
21b10 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31         for(i=j+1
21b20 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ; i<pLoop->u.btr
21b30 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20  ee.nEq; i++){.  
21b40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21b50 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
21b60 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20  ->pExpr==pX ){. 
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
21b80 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61  ssert( (pLoop->a
21b90 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61  LTerm[i]->eOpera
21ba0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a  tor & WO_IN) );.
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
21bd0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21bf0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
21c00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21c10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
21c20 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
21c30 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
21c40 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
21c50 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
21c60 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
21c70 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
21c80 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
21c90 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
21ca0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
21cb0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
21cc0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
21cd0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
21ce0 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
21cf0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
21d00 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
21d10 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
21d20 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
21d30 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
21d40 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20   XN_ROWID;.     
21d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21d60 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e      iColumn = XN
21d70 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
21d80 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
21d90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21da0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
21db0 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
21dc0 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
21dd0 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
21de0 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
21df0 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
21e00 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
21e10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
21e20 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
21e30 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
21e40 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
21e50 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
21e60 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
21e70 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
21e80 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
21e90 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
21ea0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21eb0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
21ec0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
21ed0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
21ee0 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
21ef0 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
21f00 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
21f10 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
21f20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
21f30 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
21f40 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
21f50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21f60 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
21f70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21f80 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
21f90 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
21fa0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
21fb0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
21fc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21fd0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
21fe0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
21ff0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
22000 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
22010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22020 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22030 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
22040 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22050 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
22060 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
22070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22080 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
22090 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
220a0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
220b0 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
220c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
220d0 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44  Column>=XN_ROWID
220e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
220f0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
22100 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
22110 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22120 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
22130 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
22140 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22150 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
22160 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
22170 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
22180 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22190 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
221a0 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70 49 6e   *pIdxExpr = pIn
221b0 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
221c0 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
221d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
221e0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
221f0 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64 78 45  p(pOBExpr, pIdxE
22200 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a 20 20  xpr, iCur) ){.  
22210 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
22220 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
22230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
22240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
22250 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44 20  olumn!=XN_ROWID 
22260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
22270 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
22280 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 49 6e  prNNCollSeq(pWIn
22290 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
222a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
222b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
222c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
222d0 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
222e0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
222f0 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
22300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22310 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
22320 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d  .btree.nIdxCol =
22330 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   j+1;.          
22340 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
22350 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22370 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28  if( isMatch && (
22380 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22390 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
223a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
223b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
223c0 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
223d0 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
223e0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
223f0 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
22400 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
22410 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
22420 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
22430 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
22440 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
22450 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
22460 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
22470 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
22480 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
22490 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
224a0 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
224b0 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
224c0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
224d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
224e0 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
224f0 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
22500 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
22510 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
22520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22530 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
22540 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
22550 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
22560 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  ==XN_ROWID ){.  
22570 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22580 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
22590 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
225a0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
225b0 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
225c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
225d0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
225e0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  T(i);.        }e
225f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
22600 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
22610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22620 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
22630 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
22640 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
22650 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
22660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
22670 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
22680 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
22690 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
226a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
226b0 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
226c0 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
226d0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
226e0 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
226f0 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
22700 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
22710 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
22720 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
22730 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
22740 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
22750 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
22760 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
22770 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
22780 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
22790 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
227a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
227b0 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
227c0 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
227d0 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
227e0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
227f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
22800 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
22810 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
22820 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65       Bitmask mTe
22830 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
22840 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
22850 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
22860 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
22870 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
22880 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d  .        mTerm =
22890 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
228a0 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  rUsage(&pWInfo->
228b0 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
228c0 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
228d0 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
228e0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
228f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22900 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
22910 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
22920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22930 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
22940 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
22950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22960 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
22970 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
22980 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
22990 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
229a0 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
229b0 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
229c0 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
229d0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
229e0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
229f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
22a00 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
22a10 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
22a20 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
22a30 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
22a40 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
22a50 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
22a60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22a70 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
22a80 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
22a90 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
22aa0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
22ab0 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
22ac0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
22ad0 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
22ae0 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
22af0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
22b00 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
22b10 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
22b20 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
22b30 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
22b40 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
22b50 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
22b60 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
22b70 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
22b80 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
22b90 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
22ba0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
22bb0 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
22bc0 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
22bd0 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
22be0 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
22bf0 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
22c00 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
22c10 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
22c20 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
22c30 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
22c40 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
22c50 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
22c60 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
22c70 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
22c80 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
22c90 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
22ca0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
22cb0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
22cc0 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
22cd0 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
22ce0 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
22cf0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
22d00 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
22d10 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
22d20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
22d30 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
22d40 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
22d50 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
22d60 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
22d70 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
22d80 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
22d90 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
22da0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
22db0 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
22dc0 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
22dd0 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
22de0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
22df0 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
22e00 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
22e10 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
22e20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
22e30 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
22e40 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
22e50 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
22e60 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22e70 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
22e80 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
22e90 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22ea0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
22eb0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
22ec0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
22ed0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
22ee0 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
22ef0 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
22f00 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
22f10 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
22f20 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
22f30 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
22f40 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
22f50 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
22f60 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
22f70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
22f80 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
22f90 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
22fa0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
22fb0 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
22fc0 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
22fd0 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
22fe0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
22ff0 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
23000 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
23010 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
23020 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
23030 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
23040 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
23050 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
23060 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
23070 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
23080 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
23090 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
230a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
230b0 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
230c0 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
230d0 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
230e0 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
230f0 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
23100 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
23110 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
23120 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
23130 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
23140 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
23150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
23160 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
23170 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
23180 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
23190 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
231a0 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
231b0 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
231c0 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
231d0 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
231e0 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
231f0 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
23200 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
23210 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
23220 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
23230 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
23240 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
23250 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
23260 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
23270 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
23280 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
23290 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
232a0 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
232b0 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
232c0 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
232d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
232e0 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
232f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
23300 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
23310 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
23320 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
23330 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
23340 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
23350 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20  = nRow + rScale 
23360 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74  + 16;..  /* Mult
23370 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77  iple by log(M) w
23380 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75  here M is the nu
23390 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
233a0 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ows..  ** Use th
233b0 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66  e LIMIT for M if
233c0 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a   it is smaller *
233d0 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  /.  if( (pWInfo-
233e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
233f0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d  ERE_USE_LIMIT)!=
23400 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  0 && pWInfo->iLi
23410 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20  mit<nRow ){.    
23420 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  nRow = pWInfo->i
23430 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f  Limit;.  }.  rSo
23440 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67  rtCost += estLog
23450 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e  (nRow);.  return
23460 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f   rSortCost;.}../
23470 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
23480 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
23490 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
234a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
234b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
234c0 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
234d0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
234e0 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
234f0 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
23500 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
23510 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
23520 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
23530 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
23540 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
23550 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
23560 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
23570 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
23580 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
23590 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
235a0 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
235b0 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
235c0 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
235d0 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
235e0 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
235f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23600 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23610 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
23620 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
23630 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
23640 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
23650 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
23660 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
23670 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
23680 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
23690 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
236a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
236b0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
236c0 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
236d0 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
236e0 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
236f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23700 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
23710 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
23720 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
23730 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
23740 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
23750 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
23760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23770 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
23780 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
23790 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
237a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
237b0 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
237c0 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
237d0 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
237f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
23800 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23820 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
23830 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
23840 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
23850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23860 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
23870 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
23880 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
23890 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
238a0 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
238b0 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
238c0 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
238d0 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20  Unsorted = 0;   
238e0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f   /* Maximum unso
238f0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73  rted cost of a s
23900 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20  et of path */.  
23910 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23930 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
23940 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
23950 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
23960 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
23970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
23980 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
23990 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
239a0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
239b0 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
239c0 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
239d0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
239e0 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
239f0 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
23a00 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
23a10 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
23a20 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
23a30 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
23a40 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
23a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
23a60 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
23a70 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
23a80 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
23a90 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
23aa0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
23ab0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
23ac0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
23ad0 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
23ae0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
23af0 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
23b00 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
23b10 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73  LogEst *aSortCos
23b20 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72  t = 0;    /* Sor
23b30 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c  ting and partial
23b40 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a   sorting costs *
23b50 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
23b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23b70 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
23b80 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
23b90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
23ba0 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
23bb0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
23bc0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
23bd0 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a  d at pSpace */..
23be0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
23bf0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
23c00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23c10 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
23c20 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
23c30 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
23c40 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
23c50 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
23c60 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
23c70 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
23c80 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
23c90 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
23ca0 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
23cb0 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
23cc0 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
23cd0 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
23ce0 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
23cf0 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
23d00 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
23d10 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
23d20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
23d30 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
23d40 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
23d50 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
23d60 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29  r.  (nRowEst=%d)
23d70 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
23d80 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74  .  /* If nRowEst
23d90 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
23da0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
23db0 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65  Y clause, ignore
23dc0 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a   it. In this.  *
23dd0 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f  * case the purpo
23de0 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
23df0 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  is to estimate t
23e00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
23e10 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  s returned.  ** 
23e20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71  by the overall q
23e30 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20  uery. Once this 
23e40 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65  estimate has bee
23e50 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20  n obtained, the 
23e60 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c  caller.  ** will
23e70 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
23e80 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74  ction a second t
23e90 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65  ime, passing the
23ea0 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65   estimate as the
23eb0 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61  .  ** nRowEst pa
23ec0 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69  rameter.  */.  i
23ed0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
23ee0 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
23ef0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64  t==0 ){.    nOrd
23f00 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
23f10 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  e{.    nOrderBy 
23f20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
23f30 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
23f40 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
23f50 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
23f60 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f  ce for aTo, aFro
23f70 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b  m and aSortCost[
23f80 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20  ] */.  nSpace = 
23f90 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
23fa0 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
23fb0 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
23fc0 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63  hoice*2;.  nSpac
23fd0 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  e += sizeof(LogE
23fe0 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a  st) * nOrderBy;.
23ff0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
24000 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
24010 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  db, nSpace);.  i
24020 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
24030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24040 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d  EM_BKPT;.  aTo =
24050 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
24060 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
24070 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
24080 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
24090 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
240a0 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
240b0 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
240c0 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
240d0 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
240e0 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
240f0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
24100 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
24110 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
24120 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72  X;.  }.  if( nOr
24130 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
24140 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
24150 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
24160 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69  nd it is not bei
24170 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20  ng ignored, set 
24180 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  up.    ** space 
24190 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73  for the aSortCos
241a0 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20  t[] array. Each 
241b0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
241c0 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20  SortCost array. 
241d0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
241e0 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69  zero - meaning i
241f0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
24200 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d  en initialized -
24210 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   or the.    ** c
24220 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
24230 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64  RowEst rows of d
24240 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69  ata where the fi
24250 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20  rst X terms of. 
24260 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
24270 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  BY clause are al
24280 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20  ready in order, 
24290 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61  where X is the a
242a0 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64  rray .    ** ind
242b0 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72  ex.  */.    aSor
242c0 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  tCost = (LogEst*
242d0 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  )pX;.    memset(
242e0 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69  aSortCost, 0, si
242f0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
24300 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
24310 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
24320 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t==0 || &pSpace[
24330 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
24340 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65  &aSortCost[nOrde
24350 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  rBy] );.  assert
24360 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c  ( aSortCost!=0 |
24370 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
24380 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a  ]==(char*)pX );.
24390 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73  .  /* Seed the s
243a0 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e  earch with a sin
243b0 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f  gle WherePath co
243c0 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68  ntaining zero Wh
243d0 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20  ereLoops..  **. 
243e0 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e   ** TUNING: Do n
243f0 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65  ot let the numbe
24400 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
24410 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66  go above 28.  If
24420 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f   the cost.  ** o
24430 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61  f computing an a
24440 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
24450 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20  s not paid back 
24460 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
24470 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74   28.  ** rows, t
24480 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hen do not use t
24490 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
244a0 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30  ex. */.  aFrom[0
244b0 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61  ].nRow = MIN(pPa
244c0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c  rse->nQueryLoop,
244d0 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34   48);  assert( 4
244e0 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
244f0 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20  (28) );.  nFrom 
24500 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 1;.  assert( a
24510 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
24520 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f  d==0 );.  if( nO
24530 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
24540 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72   If nLoop is zer
24550 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72  o, then there ar
24560 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20  e no FROM terms 
24570 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69  in the query. Si
24580 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  nce.    ** in th
24590 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72  is case the quer
245a0 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d  y may return a m
245b0 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f  aximum of one ro
245c0 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  w, the results. 
245d0 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64     ** are alread
245e0 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  y in the request
245f0 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73  ed order. Set is
24600 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65  Ordered to nOrde
24610 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  rBy to.    ** in
24620 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c  dicate this. Or,
24630 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65   if nLoop is gre
24640 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
24650 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  set isOrdered to
24660 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69  .    ** -1, indi
24670 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
24680 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f  result set may o
24690 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64  r may not be ord
246a0 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65  ered, .    ** de
246b0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c  pending on the l
246c0 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68  oops added to th
246d0 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20  e current plan. 
246e0 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   */.    aFrom[0]
246f0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f  .isOrdered = nLo
24700 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64  op>0 ? -1 : nOrd
24710 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  erBy;.  }..  /* 
24720 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
24730 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
24740 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
24750 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
24760 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
24770 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
24780 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
24790 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
247a0 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
247b0 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
247c0 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
247d0 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
247e0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
247f0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
24800 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
24810 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
24820 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
24830 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
24840 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
24850 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
24860 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
24870 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
24880 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
24890 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
248a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
248b0 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70  ws visited by (p
248c0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
248d0 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
248e0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
24900 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d  t of path (pFrom
24910 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
24920 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f      LogEst rUnso
24930 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
24940 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
24950 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d  d cost of (pFrom
24960 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
24970 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64      i8 isOrdered
24980 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
24990 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72  red;  /* isOrder
249a0 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57  ed for (pFrom+pW
249b0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
249c0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
249d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
249e0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72     /* Mask of sr
249f0 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e  c visited by (..
24a00 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
24a10 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
24a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24a30 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72  * Mask of rev-or
24a40 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e  der loops for (.
24a50 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  .) */..        i
24a60 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
24a70 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
24a80 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
24a90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
24aa0 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
24ab0 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
24ac0 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
24ad0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
24ae0 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ( (pWLoop->wsFla
24af0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
24b00 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72  INDEX)!=0 && pFr
24b10 6f 6d 2d 3e 6e 52 6f 77 3c 33 20 29 7b 0a 20 20  om->nRow<3 ){.  
24b20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
24b30 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74  t use an automat
24b40 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20  ic index if the 
24b50 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70  this loop is exp
24b60 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  ected.          
24b70 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74  ** to run less t
24b80 68 61 6e 20 31 2e 32 35 20 74 69 6d 65 73 2e 20  han 1.25 times. 
24b90 20 49 74 20 69 73 20 74 65 6d 70 74 69 6e 67 20   It is tempting 
24ba0 74 6f 20 61 6c 73 6f 20 65 78 63 6c 75 64 65 0a  to also exclude.
24bb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
24bc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 75 73 61  omatic index usa
24bd0 67 65 20 6f 6e 20 61 6e 20 6f 75 74 65 72 20 6c  ge on an outer l
24be0 6f 6f 70 2c 20 62 75 74 20 73 6f 6d 65 74 69 6d  oop, but sometim
24bf0 65 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 0a  es an automatic.
24c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
24c10 65 78 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  ex is useful in 
24c20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 6f  the outer loop o
24c30 66 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  f a correlated s
24c40 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  ubquery. */.    
24c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
24c60 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
24c70 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2) );.          
24c80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24c90 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
24ca0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
24cb0 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
24cc0 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
24cd0 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
24ce0 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
24cf0 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
24d00 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
24d10 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
24d20 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
24d30 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
24d40 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
24d50 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
24d60 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
24d70 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
24d80 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
24d90 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
24da0 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
24db0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
24dc0 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
24dd0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
24de0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
24df0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
24e00 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
24e10 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
24e20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
24e30 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
24e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24e50 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
24e60 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
24e70 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
24e80 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
24ea0 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
24eb0 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
24ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24ed0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
24ee0 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
24ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
24f00 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
24f10 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
24f20 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
24f30 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
24f40 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
24f50 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
24f60 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
24f70 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
24f80 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
24f90 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
24fa0 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
24fb0 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
24fc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43    }.          rC
24fe0 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
24ff0 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
25000 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  , aSortCost[isOr
25010 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20  dered]);..      
25020 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
25030 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
25040 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
25050 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
25060 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
25070 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
25080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25090 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
250a0 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
250b0 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
250c0 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
250d0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
250e0 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
250f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25100 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
25110 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
25120 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20  rUnsorted -= 2; 
25130 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69   /* TUNING:  Sli
25140 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76 6f  ght bias in favo
25150 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61  r of no-sort pla
25160 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ns */.        }.
25170 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
25180 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
25190 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
251a0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
251b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
251c0 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
251d0 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
251e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
251f0 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
25200 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
25210 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
25220 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
25230 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
25240 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
25250 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
25260 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
25270 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
25280 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
25290 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
252a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
252b0 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
252c0 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
252d0 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
252e0 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
252f0 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
25300 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
25310 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
25320 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
25330 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
25340 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
25350 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
25360 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
25370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25380 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
25390 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
253a0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
253b0 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
253c0 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
253d0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
253e0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
253f0 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
25400 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
25410 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25420 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
25430 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25440 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25460 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
25470 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
25480 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
25490 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
254a0 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
254b0 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
254c0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
254d0 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
254e0 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
254f0 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
25500 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
25510 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
25520 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
25530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25540 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
25550 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
25560 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
25570 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
25580 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
25590 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
255a0 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
255b0 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
255c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
255d0 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
255e0 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
255f0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25600 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25620 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25630 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
25640 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25650 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
25660 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
25670 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
25680 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
25690 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
256a0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
256b0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
256c0 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
256d0 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
256e0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
256f0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
25700 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25710 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
25720 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
25730 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
25750 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
25760 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61  is points it mea
25770 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ns that the new 
25780 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20  candidate path. 
25790 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
257a0 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
257b0 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
257c0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a  -so-far paths. *
257d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
257e0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
257f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25800 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
25810 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
25820 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
25830 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
25840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
25860 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
25870 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
25880 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
25890 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
258a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
258b0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
258c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
258d0 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
258e0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
258f0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25900 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25910 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25920 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
25930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25940 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
25950 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
25960 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
25970 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
25980 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25990 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
259a0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
259b0 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
259c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
259d0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
259e0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
259f0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
25a00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
25a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25a20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
25a30 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
25a40 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
25a50 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
25a60 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
25a70 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
25a80 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
25a90 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20 73  same isOrdered s
25aa0 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20  etting as the.  
25ab0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69          ** candi
25ac0 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63  date path.  Chec
25ad0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
25ae0 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
25af0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20   replace.       
25b00 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20     ** pTo or if 
25b10 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68  the candidate sh
25b20 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e  ould be skipped.
25b30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
25b40 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
25b50 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20 61  conditional is a
25b60 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74 6f  n expanded vecto
25b70 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75  r comparison equ
25b80 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20  ivalent to:.    
25b90 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d        **   (pTo-
25ba0 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77  >rCost,pTo->nRow
25bb0 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29  ,pTo->rUnsorted)
25bc0 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c   <= (rCost,nOut,
25bd0 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20  rUnsorted).     
25be0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25bf0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
25c00 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  <rCost .        
25c10 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
25c20 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20 20  t==rCost.       
25c30 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f 2d          && (pTo-
25c40 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20  >nRow<nOut.     
25c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
25c60 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75   (pTo->nRow==nOu
25c70 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  t && pTo->rUnsor
25c80 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a  ted<=rUnsorted).
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ca0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
25cb0 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b    ).          ){
25cc0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
25cd0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25ce0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
25cf0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25d00 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
25d10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25d20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
25d50 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
25d60 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
25d70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
25d80 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
25d90 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
25da0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
25db0 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
25dc0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
25dd0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
25de0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
25e00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25e10 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
25e20 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
25e30 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
25e40 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
25e50 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
25e60 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
25e70 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
25e80 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
25e90 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
25ea0 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65  ted, pTo->isOrde
25eb0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
25ec0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
25ed0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
25ee0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
25ef0 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20       /* Discard 
25f00 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
25f10 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  th from further 
25f20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f  consideration */
25f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
25f40 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
25f50 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
25f60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
25f70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25f80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25f90 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
25fa0 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
25fb0 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
25fc0 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68  aches here if th
25fd0 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  e candidate path
25fe0 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
25ff0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
26000 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c   pTo path.  Repl
26010 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65  ace pTo with the
26020 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23   candidate. */.#
26030 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
26040 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
26050 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
26060 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26070 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
26080 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26090 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
260a0 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
260b0 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
260c0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
260d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
260e0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
260f0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26100 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26110 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26130 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
26140 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
26150 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
26160 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26170 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
26180 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26190 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
261a0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
261b0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
261c0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
261d0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
261e0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
261f0 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
26200 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  d, pTo->isOrdere
26210 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
26220 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
26230 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
26240 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
26250 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
26260 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
26270 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
26280 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
26290 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
262a0 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
262b0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
262c0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
262d0 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
262e0 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
262f0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
26300 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
26310 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
26320 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
26330 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
26340 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26350 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
26360 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
26370 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
26380 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
26390 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
263a0 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
263b0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
263c0 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
263d0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
263e0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
263f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
26400 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
26410 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
26420 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
26430 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
26440 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
26450 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
26460 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
26470 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
26480 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
26490 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
264a0 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
264b0 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
264c0 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
264d0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
264e0 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
264f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26500 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
26510 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
26520 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
26530 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
26540 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
26550 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
26560 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26580 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26590 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
265a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
265b0 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
265c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
265d0 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
265e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
265f0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
26600 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
26610 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
26620 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
26630 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
26640 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
26650 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26660 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
26670 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
26680 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
26690 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
266a0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
266b0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
266c0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
266d0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
266e0 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
266f0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
26700 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
26710 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
26720 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
26730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26740 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
26750 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
26760 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
26770 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
26780 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26790 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
267a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
267b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
267c0 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
267d0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
267e0 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
267f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
26800 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
26810 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
26820 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
26830 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
26840 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
26850 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26860 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26870 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
26880 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
26890 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
268a0 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
268b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
268c0 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
268d0 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
268e0 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
268f0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
26900 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
26910 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
26920 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
26930 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
26940 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
26950 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
26960 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
26970 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
26980 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
26990 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
269a0 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
269b0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
269c0 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
269d0 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
269e0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
269f0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
26a00 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
26a10 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
26a20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
26a30 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
26a40 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
26a50 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
26a60 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
26a70 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
26a80 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
26a90 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
26aa0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
26ab0 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
26ac0 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
26ad0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
26ae0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
26af0 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
26b00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
26b10 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
26b20 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
26b30 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
26b40 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
26b50 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
26b60 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
26b70 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
26b80 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
26b90 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26ba0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26bb0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
26bc0 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
26bd0 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
26be0 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
26bf0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
26c00 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
26c10 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
26c20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
26c30 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
26c40 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
26c50 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
26c60 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
26c70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
26c80 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
26c90 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
26ca0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
26cb0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
26cc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
26cd0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
26ce0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26cf0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
26d00 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
26d10 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
26d20 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
26d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26d40 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
26d50 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
26d60 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
26d70 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
26d80 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
26d90 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
26da0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
26db0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
26dc0 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
26dd0 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
26de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
26df0 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72  32 wsFlags = pFr
26e00 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
26e10 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  1]->wsFlags;.   
26e20 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c         if( (wsFl
26e30 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
26e40 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  OW)==0 .        
26e50 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28     && (wsFlags&(
26e60 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
26e70 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48  COLUMN_IN))!=(WH
26e80 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
26e90 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20  LUMN_IN).       
26ea0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26eb0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
26ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
26ed0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
26ee0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
26ef0 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
26f00 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
26f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26f20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44         WHERE_ORD
26f30 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f  ERBY_LIMIT, nLoo
26f40 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
26f50 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b  p[nLoop-1], &m);
26f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26f70 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
26f80 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20   WHERE_IPK );.  
26f90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26fa0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
26fb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
26fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26fd0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72   rc==pWInfo->pOr
26fe0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
27000 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Info->bOrderedIn
27010 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20  nerLoop = 1;.   
27020 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27030 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a  o->revMask = m;.
27040 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27060 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27070 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
27080 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
27090 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
270a0 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
270b0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
270c0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
270d0 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
270e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
270f0 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
27100 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
27110 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
27120 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
27130 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
27140 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
27150 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
27160 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
27170 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
27180 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
27190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
271a0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
271b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
271c0 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
271d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
271e0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
271f0 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
27200 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
27210 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
27220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27230 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
27240 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
27250 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
27260 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
27270 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
27280 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
27290 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
272a0 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ace);.  return S
272b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
272c0 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20  ** Most queries 
272d0 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  use only a singl
272e0 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72  e table (they ar
272f0 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64  e not joins) and
27300 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20   have.** simple 
27310 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  == constraints a
27320 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66  gainst indexed f
27330 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75  ields.  This rou
27340 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a  tine attempts.**
27350 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73   to plan those s
27360 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e  imple cases usin
27370 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65  g much less cere
27380 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a  mony than the.**
27390 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
273a0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20   query planner, 
273b0 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c  and thereby yiel
273c0 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33  d faster sqlite3
273d0 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69  _prepare().** ti
273e0 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  mes for the comm
273f0 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  on case..**.** R
27400 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
27410 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68  n success, if th
27420 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20  is query can be 
27430 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a  handled by this.
27440 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65  ** no-frills que
27450 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74  ry planner.  Ret
27460 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73  urn zero if this
27470 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65   query needs the
27480 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72   .** general-pur
27490 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
274a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
274b0 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  t whereShortCut(
274c0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
274d0 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
274e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
274f0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
27500 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
27510 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
27520 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  WC;.  WhereTerm 
27530 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c  *pTerm;.  WhereL
27540 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e  oop *pLoop;.  in
27550 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b  t iCur;.  int j;
27560 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
27570 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
27580 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
27590 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
275a0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
275b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
275c0 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74  _SUBCLAUSE ) ret
275d0 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
275e0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
275f0 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20  t->nSrc>=1 );.  
27600 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
27610 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
27620 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
27630 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  b;.  if( IsVirtu
27640 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
27650 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  n 0;.  if( pItem
27660 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
27670 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27680 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
27690 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70  rsor;.  pWC = &p
276a0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
276b0 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  oop = pBuilder->
276c0 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  pNew;.  pLoop->w
276d0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c  sFlags = 0;.  pL
276e0 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  oop->nSkip = 0;.
276f0 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
27700 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
27710 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
27720 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29   WO_EQ|WO_IS, 0)
27730 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
27740 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
27750 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27760 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70  & WO_IS );.    p
27770 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
27780 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
27790 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
277a0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f  ONEROW;.    pLoo
277b0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  p->aLTerm[0] = p
277c0 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Term;.    pLoop-
277d0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
277e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
277f0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20  nEq = 1;.    /* 
27800 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
27810 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69  a rowid lookup i
27820 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f  s 10 */.    pLoo
27830 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f  p->rRun = 33;  /
27840 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 33==sqlite3Log
27850 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  Est(10) */.  }el
27860 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
27870 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
27880 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
27890 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
278a0 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20  t opMask;.      
278b0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
278c0 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
278d0 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
278e0 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
278f0 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20  Index(pIdx).    
27900 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72     || pIdx->pPar
27910 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20  tIdxWhere!=0 .  
27920 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b       || pIdx->nK
27930 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28  eyCol>ArraySize(
27940 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
27950 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e  ce) .      ) con
27960 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d  tinue;.      opM
27970 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71  ask = pIdx->uniq
27980 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51  NotNull ? (WO_EQ
27990 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b  |WO_IS) : WO_EQ;
279a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
279b0 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
279c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
279d0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
279e0 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
279f0 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d   iCur, j, 0, opM
27a00 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ask, pIdx);.    
27a10 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
27a20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27a30 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27a40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27a50 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
27a60 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
27a70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
27a80 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
27a90 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
27aa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
27ab0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
27ac0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
27ad0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
27ae0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
27af0 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
27b00 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
27b10 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
27b20 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
27b30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
27b40 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27b50 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
27b60 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
27b70 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
27b80 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
27b90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
27ba0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
27bb0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
27bc0 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
27bd0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
27be0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
27bf0 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
27c00 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
27c10 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
27c20 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
27c30 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
27c40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
27c50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
27c60 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
27c70 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
27c80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
27c90 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
27ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
27cb0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d  fo->sMaskSet.n==
27cc0 31 20 26 26 20 69 43 75 72 3d 3d 70 57 49 6e 66  1 && iCur==pWInf
27cd0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30  o->sMaskSet.ix[0
27ce0 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ] );.    pLoop->
27cf0 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a  maskSelf = 1; /*
27d00 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
27d10 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
27d20 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 2a  askSet, iCur); *
27d30 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  /.    pWInfo->a[
27d40 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
27d50 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
27d60 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
27d70 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
27d80 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
27d90 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
27da0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
27db0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
27dc0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
27dd0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
27de0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
27df0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
27e00 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
27e10 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
27e20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
27e30 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
27e40 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
27e50 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
27e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27e70 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
27e80 74 69 6f 6e 20 66 6f 72 20 65 78 70 72 49 73 44  tion for exprIsD
27e90 65 74 65 72 6d 69 6e 69 73 74 69 63 28 29 2e 0a  eterministic()..
27ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
27eb0 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e  prNodeIsDetermin
27ec0 69 73 74 69 63 28 57 61 6c 6b 65 72 20 2a 70 57  istic(Walker *pW
27ed0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
27ee0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
27ef0 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
27f00 4e 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  N && ExprHasProp
27f10 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 43  erty(pExpr, EP_C
27f20 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20 29 7b 0a  onstFunc)==0 ){.
27f30 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
27f40 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
27f50 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
27f60 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
27f70 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
27f80 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
27f90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27fa0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d  contains no non-
27fb0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51  deterministic SQ
27fc0 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  L .** functions.
27fd0 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   Do not consider
27fe0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
27ff0 69 63 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ic SQL functions
28000 20 74 68 61 74 20 61 72 65 20 0a 2a 2a 20 70 61   that are .** pa
28010 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
28020 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
28030 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
28040 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 45  sDeterministic(E
28050 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
28060 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
28070 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
28080 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
28090 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
280a0 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 44 65  k = exprNodeIsDe
280b0 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a 20 20 77  terministic;.  w
280c0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
280d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
280e0 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73 71 6c 69  WalkFail;.  sqli
280f0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
28100 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
28110 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Code;.}../*.** G
28120 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
28130 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
28140 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
28150 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
28160 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
28170 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
28180 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
28190 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
281a0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
281b0 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
281c0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
281d0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
281e0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
281f0 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
28200 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
28210 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
28220 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
28230 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
28240 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
28250 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
28260 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
28270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
28280 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
28290 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
282a0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
282b0 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
282c0 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
282d0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
282e0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
282f0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
28300 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
28310 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
28320 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
28330 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
28340 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
28350 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
28360 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
28370 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
28380 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
28390 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
283a0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
283b0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
283c0 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
283d0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
283e0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
283f0 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
28400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
28410 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
28420 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
28430 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
28440 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
28450 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
28460 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
28470 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
28480 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
28490 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
284a0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
284b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
284c0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
284d0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
284e0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
284f0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
28500 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
28520 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
28530 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
28540 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
28550 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
28560 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
28570 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
28580 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
28590 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
285a0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
285b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
285c0 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
285d0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
285e0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
285f0 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
28600 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
28610 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
28620 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
28630 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
28640 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
28650 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
28660 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
28670 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
28680 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
28690 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
286a0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
286b0 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
286c0 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
286d0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
286e0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
286f0 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
28700 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
28710 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
28720 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
28730 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
28740 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
28750 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
28760 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
28770 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
28780 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
28790 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
287a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
287b0 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
287c0 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
287d0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
287e0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
287f0 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
28800 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
28810 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
28820 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
28830 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
28840 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
28850 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
28860 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
28870 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
28880 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
28890 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
288a0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
288b0 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
288c0 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
288d0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
288e0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
288f0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
28900 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
28910 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
28920 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
28930 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
28940 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
28950 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
28960 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
28970 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
28980 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
28990 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
289a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
289b0 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
289c0 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
289d0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
289e0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
289f0 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
28a00 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
28a10 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
28a20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
28a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
28a40 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
28a50 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
28a60 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
28a70 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
28a80 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
28a90 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
28aa0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
28ab0 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
28ac0 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
28ad0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
28ae0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
28af0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
28b00 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
28b10 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
28b20 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
28b30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28b40 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
28b50 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
28b60 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
28b70 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
28b80 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
28b90 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
28ba0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
28bb0 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
28bc0 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
28bd0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
28be0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
28bf0 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
28c00 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
28c10 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
28c20 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
28c30 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
28c40 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
28c50 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
28c60 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
28c70 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
28c80 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
28c90 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
28ca0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
28cb0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
28cc0 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
28cd0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
28ce0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
28cf0 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
28d00 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
28d10 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
28d20 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
28d30 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
28d40 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
28d50 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
28d60 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
28d70 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
28d80 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
28d90 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
28da0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
28db0 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
28dc0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
28dd0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
28de0 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
28df0 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
28e00 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
28e10 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
28e20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
28e30 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
28e40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
28e50 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
28e60 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
28e70 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
28e80 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
28e90 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
28ea0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
28eb0 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
28ec0 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
28ed0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
28ee0 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
28ef0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
28f00 45 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  E is set, iIdxCu
28f10 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
28f20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
28f30 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
28f40 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
28f50 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
28f60 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
28f70 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
28f80 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
28f90 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
28fa0 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
28fb0 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
28fc0 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
28fd0 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
28fe0 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
28ff0 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
29000 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
29010 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
29020 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
29030 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
29040 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
29050 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
29060 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
29070 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
29080 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29090 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
290a0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
290b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
290c0 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52  List,      /* FR
290d0 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73  OM clause: A lis
290e0 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
290f0 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
29100 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
29110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29120 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
29130 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
29140 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41  rderBy,     /* A
29150 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
29160 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
29170 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
29180 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
29190 65 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72  et,   /* Query r
291a0 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27  esult set.  Req'
291b0 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  d for DISTINCT *
291c0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
291d0 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  gs,         /* T
291e0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
291f0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
29200 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
29210 20 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20   iAuxArg        
29220 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
29230 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73  _OR_SUBCLAUSE is
29240 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
29250 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f      ** If WHERE_
29280 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20  USE_LIMIT, then 
29290 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74  the limit amount
292a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
292b0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
292c0 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
292d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
292e0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
292f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
29300 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
29310 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
29320 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
29330 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
29340 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
29350 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
29360 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
29370 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
29380 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
29390 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
293a0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
293b0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
293c0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
293d0 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
293e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
293f0 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
29400 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
29410 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
29420 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
29430 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
29440 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
29450 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
29460 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
29470 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
29480 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
29490 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
294a0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
294b0 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
294c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
294d0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
294e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
294f0 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
29500 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
29510 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
29520 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
29530 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
29540 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
29550 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
29560 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
29570 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29590 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
295a0 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20    u8 bFordelete 
295b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
295c0 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
295d0 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70   or zero, as app
295e0 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61  ropriate */..  a
295f0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
29600 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
29610 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20  SS_MULTIROW)==0 
29620 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63  || (.        (wc
29630 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29640 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
29650 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77  )!=0 .     && (w
29660 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29670 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
29680 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  =0 .  ));..  /* 
29690 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52  Only one of WHER
296a0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f  E_OR_SUBCLAUSE o
296b0 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  r WHERE_USE_LIMI
296c0 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  T */.  assert( (
296d0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
296e0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
296f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
29700 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  || (wctrlFlags &
29710 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
29720 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61  )==0 );..  /* Va
29730 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
29740 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
29750 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
29760 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
29770 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20  izeof(sWLB));.. 
29780 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f   /* An ORDER/GRO
29790 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  UP BY clause of 
297a0 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72  more than 63 ter
297b0 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  ms cannot be opt
297c0 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74  imized */.  test
297d0 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26  case( pOrderBy &
297e0 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
297f0 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  r==BMS-1 );.  if
29800 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
29810 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42  rderBy->nExpr>=B
29820 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20  MS ) pOrderBy = 
29830 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  0;.  sWLB.pOrder
29840 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
29850 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
29860 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
29870 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
29880 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
29890 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
298a0 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
298b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
298c0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
298d0 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
298e0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
298f0 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
29900 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77  nctOpt) ){.    w
29910 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48  ctrlFlags &= ~WH
29920 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
29930 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  T;.  }..  /* The
29940 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
29950 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
29960 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
29970 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
29980 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
29990 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
299a0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
299b0 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
299c0 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
299d0 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
299e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
299f0 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
29a00 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
29a10 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
29a20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
29a30 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
29a40 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
29a50 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
29a60 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
29a70 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
29a80 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
29a90 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  he WHERE_OR_SUBC
29aa0 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65  LAUSE flag is se
29ab0 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
29ac0 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
29ad0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
29ae0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
29af0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
29b00 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
29b10 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
29b20 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
29b30 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
29b40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
29b50 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
29b60 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
29b70 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
29b80 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  SE) ? 1 : pTabLi
29b90 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
29ba0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
29bb0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
29bc0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
29bd0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
29be0 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
29bf0 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
29c00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
29c10 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
29c20 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
29c30 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
29c40 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
29c50 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
29c60 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
29c70 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
29c80 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
29c90 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
29ca0 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
29cb0 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
29cc0 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
29cd0 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
29ce0 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
29cf0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
29d00 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
29d10 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
29d20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
29d30 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
29d40 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
29d50 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
29d60 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
29d70 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
29d80 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
29d90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
29da0 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  NN(db, nByteWInf
29db0 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
29dc0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
29dd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29de0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
29df0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
29e00 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
29e10 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
29e20 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
29e30 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
29e40 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
29e50 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
29e60 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
29e70 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
29e80 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
29e90 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
29ea0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  e;.  pWInfo->pRe
29eb0 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
29ec0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
29ed0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
29ee0 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
29ef0 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
29f00 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
29f10 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
29f20 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
29f30 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
29f40 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
29f50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
29f60 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
29f70 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
29f80 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74    pWInfo->iLimit
29f90 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57   = iAuxArg;.  pW
29fa0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
29fb0 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
29fc0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65  nQueryLoop;.  me
29fd0 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f  mset(&pWInfo->nO
29fe0 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  BSat, 0, .      
29ff0 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72     offsetof(Wher
2a000 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66  eInfo,sWC) - off
2a010 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c  setof(WhereInfo,
2a020 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73  nOBSat));.  mems
2a030 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  et(&pWInfo->a[0]
2a040 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  , 0, sizeof(Wher
2a050 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a  eLoop)+nTabList*
2a060 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2a070 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l));.  assert( p
2a080 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2a090 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
2a0a0 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
2a0b0 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
2a0c0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
2a0d0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
2a0e0 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
2a0f0 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
2a100 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
2a110 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
2a120 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
2a130 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
2a140 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
2a150 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2a160 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
2a170 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
2a180 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
2a190 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2a1a0 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
2a1b0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
2a1c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
2a1d0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2a1e0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
2a1f0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
2a200 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
2a210 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2a220 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
2a230 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2a240 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
2a250 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
2a260 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
2a270 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
2a280 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
2a290 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
2a2a0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
2a2b0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
2a2c0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
2a2d0 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
2a2e0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
2a2f0 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
2a300 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
2a310 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
2a320 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
2a330 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
2a340 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a350 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
2a360 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2a370 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2a380 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2a390 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70  E;.    }.    Exp
2a3a0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
2a3b0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2a3c0 43 4f 4e 53 54 41 4e 54 20 52 4f 57 22 29 29 3b  CONSTANT ROW"));
2a3d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2a3e0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2a3f0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2a400 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2a410 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2a420 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2a430 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
2a440 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a450 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69  is assigned a bi
2a460 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20  tmask of 1<<N.. 
2a470 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2a480 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65   rule of the pre
2a490 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65  vious sentence e
2a4a0 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58  nsures thta if X
2a4b0 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
2a4c0 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  for.    ** a tab
2a4d0 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
2a4e0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2a4f0 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
2a500 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2a510 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77  f T..    ** Know
2a520 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
2a530 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2a540 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2a550 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20  left join is.   
2a560 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
2a570 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
2a580 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2a590 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2a5a0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2a5b0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2a5c0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20  c tables in.    
2a5d0 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2a5e0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2a5f0 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2a600 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2a610 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71  rmally.    ** eq
2a620 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
2a630 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
2a640 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
2a650 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  1 if the.    ** 
2a660 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2a670 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
2a680 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20      */.    ii = 
2a690 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
2a6a0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2a6b0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2a6c0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2a6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2a6e0 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
2a6f0 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
2a700 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
2a710 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c  >sWC);.    }whil
2a720 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69  e( (++ii)<pTabLi
2a730 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69  st->nSrc );.  #i
2a740 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a750 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69  G.    {.      Bi
2a760 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20  tmask mx = 0;.  
2a770 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2a780 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a790 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2a7a0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69  Bitmask m = sqli
2a7b0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
2a7c0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2a7d0 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
2a7e0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2a7f0 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20  rt( m>=mx );.   
2a800 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20       mx = m;.   
2a810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e     }.    }.  #en
2a820 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  dif.  }.  .  /* 
2a830 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2a840 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2a850 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
2a860 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
2a870 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2a880 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
2a890 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a8a0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a8b0 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70  nError;..  /* Sp
2a8c0 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52  ecial case: WHER
2a8d0 45 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20  E terms that do 
2a8e0 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
2a8f0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2a900 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61  oin.  ** (consta
2a910 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e  nt expressions).
2a920 20 45 76 61 6c 75 61 74 65 20 65 61 63 68 20 73   Evaluate each s
2a930 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75  uch term, and ju
2a940 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a  mp over all the.
2a950 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63    ** generated c
2a960 6f 64 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ode if the resul
2a970 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20  t is not true.  
2a980 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f  .  **.  ** Do no
2a990 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68 65  t do this if the
2a9a0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
2a9b0 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  ains non-determi
2a9c0 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73  nistic functions
2a9d0 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  .  ** that are n
2a9e0 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ot within a sub-
2a9f0 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
2aa00 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71  not strictly req
2aa10 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20  uired, but.  ** 
2aa20 70 72 65 73 65 72 76 65 73 20 53 51 4c 69 74 65  preserves SQLite
2aa30 27 73 20 6c 65 67 61 63 79 20 62 65 68 61 76 69  's legacy behavi
2aa40 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  our in the follo
2aa50 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a  wing two cases:.
2aa60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d    **.  **   FROM
2aa70 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f   ... WHERE rando
2aa80 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20  m()>0;          
2aa90 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28   -- eval random(
2aaa0 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20  ) once per row. 
2aab0 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
2aac0 48 45 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e  HERE (SELECT ran
2aad0 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76  dom())>0;  -- ev
2aae0 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
2aaf0 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20   overall.  */.  
2ab00 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
2ab10 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
2ab20 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
2ab30 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70  rm *pT = &sWLB.p
2ab40 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69  WC->a[ii];.    i
2ab50 66 28 20 70 54 2d 3e 77 74 46 6c 61 67 73 20 26  f( pT->wtFlags &
2ab60 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
2ab70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2ab80 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d  ( pT->prereqAll=
2ab90 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  =0 && (nTabList=
2aba0 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65  =0 || exprIsDete
2abb0 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45  rministic(pT->pE
2abc0 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73  xpr)) ){.      s
2abd0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2abe0 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45  e(pParse, pT->pE
2abf0 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
2ac00 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2ac10 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
2ac20 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  T->wtFlags |= TE
2ac30 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
2ac40 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
2ac50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2ac60 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2ac70 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
2ac80 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
2ac90 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
2aca0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
2acb0 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
2acc0 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
2acd0 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
2ace0 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
2acf0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
2ad00 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2ad10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2ad20 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
2ad30 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
2ad40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
2ad50 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
2ad60 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
2ad70 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
2ad80 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
2ad90 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
2ada0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
2adb0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
2adc0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
2add0 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
2ade0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
2adf0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
2ae00 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2ae10 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
2ae20 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
2ae30 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
2ae40 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2ae50 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73   0xffff ){.    s
2ae60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2ae70 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  f("*** Optimizer
2ae80 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72   Start *** (wctr
2ae90 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63  lFlags: 0x%x",wc
2aea0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  trlFlags);.    i
2aeb0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2aec0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
2aed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2aee0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c  DebugPrintf(", l
2aef0 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41  imit: %d", iAuxA
2af00 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rg);.    }.    s
2af10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2af20 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  f(")\n");.  }.  
2af30 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2af40 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2af50 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2af60 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2af70 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2af80 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2af90 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57  usePrint(sWLB.pW
2afa0 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
2afb0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
2afc0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
2afd0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
2afe0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2aff0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
2b000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2b010 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2b020 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
2b030 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2b040 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b050 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
2b060 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2b070 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2b080 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
2b090 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
2b0a0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2b0b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2b0c0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
2b0d0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
2b0e0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2b0f0 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2b130 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
2b140 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
2b150 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
2b160 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
2b170 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
2b180 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
2b190 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c  bel[i%(sizeof(zL
2b1a0 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20  abel)-1)];.     
2b1b0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2b1c0 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
2b1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2b1e0 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
2b1f0 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2b200 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
2b210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b220 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2b230 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
2b240 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2b250 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
2b260 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2b270 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
2b280 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
2b290 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b2a0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2b2b0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
2b2c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
2b2d0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
2b2e0 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
2b2f0 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
2b300 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
2b310 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
2b320 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20  = ALLBITS;.  }. 
2b330 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2b340 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
2b350 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
2b360 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2b370 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
2b380 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2b390 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2b3a0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2b3b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
2b3c0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
2b3d0 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
2b3e0 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
2b3f0 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
2b400 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
2b410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2b420 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
2b430 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
2b440 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
2b450 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
2b460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
2b470 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
2b480 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
2b490 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
2b4a0 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
2b4b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2b4c0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
2b4d0 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
2b4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b4f0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2b500 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2b510 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2b520 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b530 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2b540 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
2b550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b560 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
2b570 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2b580 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2b590 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b5a0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2b5b0 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
2b5c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b5d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2b5e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b5f0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
2b600 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
2b610 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
2b620 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2b630 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
2b640 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
2b650 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
2b660 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
2b670 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
2b680 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
2b690 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61  in that do not a
2b6a0 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
2b6b0 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62  ..  ** For a tab
2b6c0 6c 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74  le to not affect
2b6d0 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65   the result, the
2b6e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20   following must 
2b6f0 62 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  be true:.  **.  
2b700 2a 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72  **   1) The quer
2b710 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e  y must not be an
2b720 20 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a   aggregate..  **
2b730 20 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20     2) The table 
2b740 6d 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20  must be the RHS 
2b750 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
2b760 20 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72    **   3) Either
2b770 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2b780 62 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20  be DISTINCT, or 
2b790 65 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55  else the ON or U
2b7a0 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a  SING clause.  **
2b7b0 20 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61        must conta
2b7c0 69 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  in a constraint 
2b7d0 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20  that limits the 
2b7e0 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  scan of the tabl
2b7f0 65 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20  e to .  **      
2b800 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65  at most a single
2b810 20 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20   row..  **   4) 
2b820 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e  The table must n
2b830 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64  ot be referenced
2b840 20 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20   by any part of 
2b850 74 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a  the query apart.
2b860 20 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69    **      from i
2b870 74 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20  ts own USING or 
2b880 4f 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  ON clause..  **.
2b890 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
2b8a0 2c 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20  , given:.  **.  
2b8b0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2b8c0 42 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47  BLE t1(ipk INTEG
2b8d0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2b8e0 76 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v1);.  **     CR
2b8f0 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70  EATE TABLE t2(ip
2b900 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2b910 59 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a  Y KEY, v2);.  **
2b920 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2b930 45 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52  E t3(ipk INTEGER
2b940 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33   PRIMARY KEY, v3
2b950 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65  );.  **.  ** the
2b960 6e 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62  n table t2 can b
2b970 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
2b980 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2b990 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2b9a0 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74  CT v1, v3 FROM t
2b9b0 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45  1 .  **       LE
2b9c0 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47  FT JOIN t2 USING
2b9d0 20 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29   (t1.ipk=t2.ipk)
2b9e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2b9f0 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2ba00 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2ba10 20 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d   **.  ** or from
2ba20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ba30 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2ba40 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2ba50 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2ba60 4a 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20  JOIN t2.  **    
2ba70 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20     LEFT JOIN t3 
2ba80 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33  USING (t1.ipk=t3
2ba90 2e 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74  .ipk).  */.  not
2baa0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
2bab0 6b 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  k)0;.  if( pWInf
2bac0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
2bad0 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2baf0 2a 20 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e  * guarantees con
2bb00 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65  dition (1) above
2bb10 20 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69   */.   && Optimi
2bb20 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2bb30 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
2bb40 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
2bb50 69 6e 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61  int i;.    Bitma
2bb60 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
2bb70 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
2bb80 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
2bb90 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
2bba0 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
2bbb0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62  rBy ){.      tab
2bbc0 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57  Used |= sqlite3W
2bbd0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
2bbe0 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
2bbf0 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2bc00 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e  }.    for(i=pWIn
2bc10 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
2bc20 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; i--){.      
2bc30 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2bc40 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73  , *pEnd;.      s
2bc50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bc60 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2bc70 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
2bc80 3e 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[i].pWLoop;.  
2bc90 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49      pItem = &pWI
2bca0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2bcb0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20  [pLoop->iTab];. 
2bcc0 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d       if( (pItem-
2bcd0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2bce0 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e  T_LEFT)==0 ) con
2bcf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2bd00 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2bd10 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2bd20 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
2bd30 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2bd40 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
2bd50 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
2bd60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2bd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2bd80 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f   (tabUsed & pLoo
2bd90 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  p->maskSelf)!=0 
2bda0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bdb0 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
2bdc0 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
2bdd0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
2bde0 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
2bdf0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
2be00 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2be10 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2be20 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
2be30 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2be40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2be50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2be60 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
2be70 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
2be80 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
2be90 3e 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f  >pExpr->iRightJo
2bea0 69 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e  inTable!=pItem->
2beb0 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20  iCursor.        
2bec0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2bed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2bee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2bef0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2bf00 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e  pTerm<pEnd ) con
2bf10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45  tinue;.      WHE
2bf20 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
2bf30 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
2bf40 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
2bf50 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
2bf60 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
2bf70 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2bf80 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2bf90 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2bfa0 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2bfb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2bfc0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2bfd0 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2bfe0 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2bff0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2c000 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2c010 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
2c020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2c030 21 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  !=pWInfo->nLevel
2c040 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  -1 ){.        in
2c050 74 20 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66  t nByte = (pWInf
2c060 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a  o->nLevel-1-i) *
2c070 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76   sizeof(WhereLev
2c080 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  el);.        mem
2c090 6d 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b  move(&pWInfo->a[
2c0a0 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  i], &pWInfo->a[i
2c0b0 2b 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  +1], nByte);.   
2c0c0 20 20 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66     }.      pWInf
2c0d0 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
2c0e0 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
2c0f0 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
2c100 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
2c110 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2c120 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2c130 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
2c140 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
2c150 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
2c160 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2c170 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
2c180 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2c190 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
2c1a0 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
2c1b0 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
2c1c0 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
2c1d0 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
2c1e0 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
2c1f0 2a 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73  *.  ** A one-pas
2c200 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62  s approach can b
2c210 65 20 75 73 65 64 20 69 66 20 74 68 65 20 63 61  e used if the ca
2c220 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
2c230 65 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20  ed one.  ** and 
2c240 65 69 74 68 65 72 20 28 61 29 20 74 68 65 20 73  either (a) the s
2c250 63 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f  can visits at mo
2c260 73 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62  st one row or (b
2c270 29 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74  ) each.  ** of t
2c280 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2c290 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
2c2a0 20 20 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20     * the caller 
2c2b0 68 61 73 20 69 6e 64 69 63 61 74 65 64 20 74 68  has indicated th
2c2c0 61 74 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70  at a one-pass ap
2c2d0 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73  proach can be us
2c2e0 65 64 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68  ed.  **     with
2c2f0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28   multiple rows (
2c300 62 79 20 73 65 74 74 69 6e 67 20 57 48 45 52 45  by setting WHERE
2c310 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2c320 57 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a  W), and.  **   *
2c330 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
2c340 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
2c350 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20  e, and.  **   * 
2c360 65 69 74 68 65 72 20 74 68 65 20 73 63 61 6e 20  either the scan 
2c370 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65  does not use the
2c380 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
2c390 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   or the caller. 
2c3a0 20 2a 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c   **     is a DEL
2c3b0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57  ETE operation (W
2c3c0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2c3d0 4f 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69  OK is only speci
2c3e0 66 69 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f  fied.  **     fo
2c3f0 72 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a  r DELETE)..  **.
2c400 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75    ** The last qu
2c410 61 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62  alification is b
2c420 65 63 61 75 73 65 20 61 6e 20 55 50 44 41 54 45  ecause an UPDATE
2c430 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a   statement uses.
2c440 20 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61    ** WhereInfo.a
2c450 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74  iCurOnePass[1] t
2c460 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2c470 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65  her or not it re
2c480 61 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73  ally can.  ** us
2c490 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70  e a one-pass app
2c4a0 72 6f 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20  roach, and this 
2c4b0 69 73 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72  is not set accur
2c4c0 61 74 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a  ately for scans.
2c4d0 20 20 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68    ** that use th
2c4e0 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
2c4f0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2c500 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2c510 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2c520 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2c530 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2c540 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2c550 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2c560 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2c570 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
2c580 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
2c590 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2c5a0 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
2c5b0 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
2c5c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
2c5d0 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f  ;.    if( bOnero
2c5e0 77 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 30  w || (.        0
2c5f0 21 3d 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  !=(wctrlFlags & 
2c600 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2c610 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 26 26 20  LTIROW).     && 
2c620 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48  0==(wsFlags & WH
2c630 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2c640 29 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77  ).     && (0==(w
2c650 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2c660 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74  ULTI_OR) || (wct
2c670 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c680 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a  DUPLICATES_OK)).
2c690 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57      )){.      pW
2c6a0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d  Info->eOnePass =
2c6b0 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41   bOnerow ? ONEPA
2c6c0 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50  SS_SINGLE : ONEP
2c6d0 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20  ASS_MULTI;.     
2c6e0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
2c6f0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
2c700 62 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26  b) && (wsFlags &
2c710 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2c720 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2c730 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c740 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2c750 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
2c760 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50   bFordelete = OP
2c770 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a  FLAG_FORDELETE;.
2c780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c790 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
2c7a0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  WLoop->wsFlags =
2c7b0 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45   (wsFlags & ~WHE
2c7c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20  RE_IDX_ONLY);.  
2c7d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c7e0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
2c7f0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
2c800 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
2c810 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
2c820 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
2c830 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
2c840 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c    */.  for(ii=0,
2c850 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2c860 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
2c870 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
2c880 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2c890 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
2c8a0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
2c8b0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
2c8c0 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
2c8d0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2c8e0 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
2c8f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2c900 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
2c910 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
2c920 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2c930 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2c940 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
2c950 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
2c960 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2c970 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2c980 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2c990 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2c9a0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
2c9b0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
2c9c0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
2c9d0 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
2c9e0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
2c9f0 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
2ca00 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
2ca10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2ca20 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
2ca30 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2ca40 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2ca50 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
2ca60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2ca70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
2ca80 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
2ca90 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
2caa0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
2cab0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2cac0 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
2cad0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2cae0 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
2caf0 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
2cb00 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
2cb10 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2cb20 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
2cb30 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
2cb40 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
2cb50 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2cb60 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2cb70 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2cb80 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2cb90 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2cba0 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  USE)==0 ){.     
2cbb0 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2cbc0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  nRead;.      if(
2cbd0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2cbe0 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
2cbf0 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
2cc00 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
2cc10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
2cc20 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
2cc30 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2cc40 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
2cc50 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
2cc60 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
2cc70 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
2cc80 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
2cc90 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
2cca0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c  tem->iCursor==pL
2ccb0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b  evel->iTabCur );
2ccc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ccd0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2cce0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2ccf0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
2cd00 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
2cd10 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65  tcase( pWInfo->e
2cd20 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2cd30 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
2cd40 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
2cd50 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2cd60 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2cd70 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2cd80 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64  <BMS && HasRowid
2cd90 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
2cda0 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
2cdb0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
2cdc0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
2cdd0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
2cde0 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
2cdf0 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
2ce00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
2ce10 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e  v, -1, SQLITE_IN
2ce20 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
2ce30 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
2ce40 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
2ce50 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
2ce60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2ce70 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
2ce80 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  TS.      if( pLo
2ce90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2cea0 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex!=0 ){.       
2ceb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cec0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
2ced0 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65  EEKEQ|bFordelete
2cee0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
2cef0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
2cf00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cf10 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f  eChangeP5(v, bFo
2cf20 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  rdelete);.      
2cf30 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2cf40 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2cf50 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71  ED_MASK.      sq
2cf60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2cf70 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2cf80 73 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d  sUsed, pTabItem-
2cf90 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a  >iCursor, 0, 0,.
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
2cfc0 73 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d  st u8*)&pTabItem
2cfd0 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  ->colUsed, P4_IN
2cfe0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
2cff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2d000 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2d010 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2d020 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2d030 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
2d040 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2d050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2d060 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
2d070 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
2d080 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2d090 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
2d0a0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
2d0b0 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2d0c0 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75  ad;.      /* iAu
2d0d0 78 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73  xArg is always s
2d0e0 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
2d0f0 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53   value if ONEPAS
2d100 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f  S is possible */
2d110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2d120 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57  AuxArg!=0 || (pW
2d130 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2d140 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2d150 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a  _DESIRED)==0 );.
2d160 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2d170 77 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50  wid(pTab) && IsP
2d180 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2d190 49 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77  Ix).       && (w
2d1a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2d1b0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
2d1c0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
2d1d0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f      /* This is o
2d1e0 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52  ne term of an OR
2d1f0 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73  -optimization us
2d200 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20  ing the PRIMARY 
2d210 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20  KEY of a.       
2d220 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49   ** WITHOUT ROWI
2d230 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65  D table.  No nee
2d240 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65  d for a separate
2d250 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2d260 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c    iIndexCur = pL
2d270 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20  evel->iTabCur;. 
2d280 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20         op = 0;. 
2d290 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2d2a0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
2d2b0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
2d2c0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2d2d0 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  J = pTabItem->pT
2d2e0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
2d2f0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2d300 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
2d310 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
2d320 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2d330 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20  ASS_DESIRED );. 
2d340 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c         while( AL
2d350 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d  WAYS(pJ) && pJ!=
2d360 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pIx ){.         
2d370 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20   iIndexCur++;.  
2d380 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d          pJ = pJ-
2d390 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2d3a0 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  }.        op = O
2d3b0 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
2d3c0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
2d3d0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69  urOnePass[1] = i
2d3e0 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2d3f0 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72  }else if( iAuxAr
2d400 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  g && (wctrlFlags
2d410 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2d420 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20  LAUSE)!=0 ){.   
2d430 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2d440 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20   iAuxArg;.      
2d450 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e    op = OP_Reopen
2d460 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
2d470 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
2d480 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
2d490 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
2d4a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
2d4b0 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
2d4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d4d0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
2d4e0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
2d4f0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
2d500 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
2d510 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
2d520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d530 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
2d540 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
2d550 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
2d560 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
2d570 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
2d580 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
2d590 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2d5a0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
2d5b0 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
2d5c0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
2d5d0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
2d5e0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
2d5f0 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
2d600 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
2d610 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
2d620 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2d630 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  N)==0.         &
2d640 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
2d650 6e 63 74 21 3d 57 48 45 52 45 5f 44 49 53 54 49  nct!=WHERE_DISTI
2d660 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20  NCT_ORDERED.    
2d670 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2d680 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2d690 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
2d6a0 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20  EEKEQ); /* Hint 
2d6b0 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20  to COMDB2 */.   
2d6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56       }.        V
2d6d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d6e0 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
2d6f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2d700 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2d710 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
2d720 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34   {.          u64
2d730 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20   colUsed = 0;.  
2d740 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20          int ii, 
2d750 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  jj;.          fo
2d760 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e  r(ii=0; ii<pIx->
2d770 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a  nColumn; ii++){.
2d780 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
2d790 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pIx->aiColumn[i
2d7a0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
2d7b0 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69  if( jj<0 ) conti
2d7c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2d7d0 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20   if( jj>63 ) jj 
2d7e0 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20  = 63;.          
2d7f0 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d    if( (pTabItem-
2d800 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
2d810 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e  IT(jj))==0 ) con
2d820 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2d830 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28     colUsed |= ((
2d840 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f  u64)1)<<(ii<63 ?
2d850 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20   ii : 63);.     
2d860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d880 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2d890 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78  umnsUsed, iIndex
2d8a0 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  Cur, 0, 0,.     
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29             (u8*)
2d8d0 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  &colUsed, P4_INT
2d8e0 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  64);.        }.#
2d8f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d900 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2d910 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20  ED_MASK */.     
2d920 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2d930 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65   iDb>=0 ) sqlite
2d940 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2d950 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
2d960 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
2d970 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2d980 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2d990 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2d9a0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2d9b0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
2d9c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
2d9d0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
2d9e0 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
2d9f0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2da00 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
2da10 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
2da20 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
2da30 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
2da40 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
2da50 61 6d 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  am..  */.  for(i
2da60 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
2da70 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
2da80 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
2da90 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
2daa0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2dab0 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
2dac0 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
2dad0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2dae0 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
2daf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2db00 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
2db10 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2db20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2db30 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
2db40 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2db50 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2db60 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
2db70 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
2db80 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
2db90 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2dba0 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
2dbb0 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
2dbc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2dbd0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2dbe0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
2dbf0 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
2dc00 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
2dc10 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
2dc20 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
2dc30 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2dc40 65 76 65 6c 2c 20 77 63 74 72 6c 46 6c 61 67 73  evel, wctrlFlags
2dc50 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76  .    );.    pLev
2dc60 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73  el->addrBody = s
2dc70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2dc80 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f  tAddr(v);.    no
2dc90 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33  tReady = sqlite3
2dca0 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70  WhereCodeOneLoop
2dcb0 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
2dcc0 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
2dcd0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
2dce0 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
2dcf0 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28  rCont;.    if( (
2dd00 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55  wsFlags&WHERE_MU
2dd10 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77  LTI_OR)==0 && (w
2dd20 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
2dd30 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2dd40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dd50 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
2dd60 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
2dd70 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
2dd80 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
2dd90 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
2dda0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2ddb0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
2ddc0 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
2ddd0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
2dde0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
2ddf0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
2de00 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
2de10 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
2de20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2de30 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2de40 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2de50 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
2de60 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
2de70 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2de80 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
2de90 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
2dea0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
2deb0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
2dec0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
2ded0 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
2dee0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2def0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
2df00 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
2df10 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
2df20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2df30 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2df40 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
2df50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2df60 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
2df70 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
2df80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2df90 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2dfa0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2dfb0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
2dfc0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2dfd0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
2dfe0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
2dff0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
2e000 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
2e010 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
2e020 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
2e030 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2e040 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2e050 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
2e060 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
2e070 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
2e080 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
2e090 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2e0a0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2e0b0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
2e0c0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2e0d0 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  _Noop ){.#ifndef
2e0e0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2e0f0 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e  SKIPAHEAD_DISTIN
2e100 43 54 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  CT.      int add
2e110 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20  rSeek = 0;.     
2e120 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
2e130 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2e140 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69   if( pWInfo->eDi
2e150 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
2e160 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20  STINCT_ORDERED. 
2e170 20 20 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e        && i==pWIn
2e180 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a  fo->nLevel-1  /*
2e190 20 54 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37   Ticket [ef93187
2e1a0 35 37 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31  57b152e3] 2017-1
2e1b0 30 2d 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26  0-21 */.       &
2e1c0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2e1d0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2e1e0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
2e1f0 28 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  (pIdx = pLoop->u
2e200 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e  .btree.pIndex)->
2e210 68 61 73 53 74 61 74 31 0a 20 20 20 20 20 20 20  hasStat1.       
2e220 26 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75  && (n = pLoop->u
2e230 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e  .btree.nIdxCol)>
2e240 30 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78  0.       && pIdx
2e250 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d  ->aiRowLogEst[n]
2e260 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b 0a 20 20  >=36.      ){.  
2e270 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70        int r1 = p
2e280 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2e290 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70         int j, op
2e2a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
2e2b0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<n; j++){.  
2e2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e2d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e2e0 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e  Column, pLevel->
2e2f0 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a  iIdxCur, j, r1+j
2e300 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e310 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2e320 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20  m += n+1;.      
2e330 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f    op = pLevel->o
2e340 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f  p==OP_Prev ? OP_
2e350 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b  SeekLT : OP_Seek
2e360 47 54 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  GT;.        addr
2e370 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  Seek = sqlite3Vd
2e380 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
2e390 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  p, pLevel->iIdxC
2e3a0 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20  ur, 0, r1, n);. 
2e3b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2e3c0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
2e3d0 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20  SeekLT);.       
2e3e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2e3f0 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
2e400 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2e410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e420 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76  OP_Goto, 1, pLev
2e430 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d  el->p2);.      }
2e440 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e450 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48  E_DISABLE_SKIPAH
2e460 45 41 44 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a  EAD_DISTINCT */.
2e470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2e480 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76 61 6e 63  mon case: Advanc
2e490 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
2e4a0 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
2e4b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e4c0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e4d0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73  drCont);.      s
2e4e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2e4f0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2e500 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2e510 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
2e520 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
2e530 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2e540 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2e550 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e560 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2e570 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2e580 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
2e590 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2e5a0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2e5b0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
2e5c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2e5d0 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2e5e0 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
2e5f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e600 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2e610 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2e620 20 69 66 28 20 61 64 64 72 53 65 65 6b 20 29 20   if( addrSeek ) 
2e630 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e640 65 72 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29  ere(v, addrSeek)
2e650 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2e660 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2e670 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2e680 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2e690 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
2e6a0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2e6b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2e6c0 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2e6d0 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2e6e0 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2e6f0 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2e700 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2e710 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e720 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e730 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2e740 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2e750 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2e760 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2e770 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2e780 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2e790 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e7a0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2e7b0 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2e7c0 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c    if( pIn->eEndL
2e7d0 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  oopOp!=OP_Noop )
2e7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2e7f0 70 49 6e 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  pIn->nPrefix ){.
2e800 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e810 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2e820 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f 70 65 2c  (v, OP_IfNoHope,
2e830 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2e840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e860 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2e870 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a 20 20 20  ntAddr(v)+2,.   
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
2e8a0 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e 50 72 65  iBase, pIn->nPre
2e8b0 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fix);.          
2e8c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2e8d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2e8e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e8f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
2e900 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
2e910 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
2e920 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
2e930 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e940 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2e950 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2e960 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
2e970 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
2e980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2e990 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2e9a0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2e9b0 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a  OP_NextIfOpen);.
2e9c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2e9e0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
2e9f0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
2ea00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2ea10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2ea20 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2ea30 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
2ea40 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  f( pLevel->addrS
2ea50 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  kip ){.      sql
2ea60 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
2ea70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2ea80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ea90 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73  ment((v, "next s
2eaa0 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c  kip-scan on %s",
2eab0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2eac0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
2ead0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eae0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
2eaf0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b  evel->addrSkip);
2eb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eb10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
2eb20 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32  evel->addrSkip-2
2eb30 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
2eb40 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
2eb50 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
2eb60 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2eb70 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20  addrLikeRep ){. 
2eb80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2eb90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
2eba0 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29  rJumpZero, (int)
2ebb0 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65  (pLevel->iLikeRe
2ebc0 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20  pCntr>>1),.     
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebe0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c     pLevel->addrL
2ebf0 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56  ikeRep);.      V
2ec00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2ec10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ec20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2ec30 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
2ec40 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
2ec50 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 61  wsFlags;.      a
2ec60 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2ec70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2ec80 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
2ec90 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76  ftJoin); VdbeCov
2eca0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2ecb0 61 73 73 65 72 74 28 20 28 77 73 20 26 20 57 48  assert( (ws & WH
2ecc0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2ecd0 20 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45 5f   || (ws & WHERE_
2ece0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
2ecf0 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
2ed00 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2ed10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
2ed20 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ert( pLevel->iTa
2ed30 62 43 75 72 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  bCur==pTabList->
2ed40 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2ed50 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  .iCursor );.    
2ed60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ed70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2ed80 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Row, pLevel->iTa
2ed90 62 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bCur);.      }. 
2eda0 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
2edb0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a 20  HERE_INDEXED) . 
2edc0 20 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26 20        || ((ws & 
2edd0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
2ede0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f  && pLevel->u.pCo
2edf0 76 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b 0a  vidx) .      ){.
2ee00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ee10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ee20 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
2ee30 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2ee40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
2ee50 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
2ee60 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
2ee70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ee80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
2ee90 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2eea0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2eeb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
2eed0 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
2eee0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2eef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ef00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2ef10 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  dr);.    }.    V
2ef20 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2ef30 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
2ef40 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a  loop%d: %s", i,.
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef60 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
2ef70 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2ef80 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
2ef90 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
2efa0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
2efb0 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
2efc0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2efd0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
2efe0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
2eff0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2f000 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f010 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
2f020 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
2f030 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
2f040 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2f050 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2f060 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
2f070 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2f080 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2f090 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20   int k, last;.  
2f0a0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2f0b0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
2f0c0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
2f0d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
2f0e0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2f0f0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2f100 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
2f110 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2f120 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2f130 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2f140 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2f150 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f  ->pWLoop;..    /
2f160 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69  * For a co-routi
2f170 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f  ne, change all O
2f180 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  P_Column referen
2f190 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ces to the table
2f1a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
2f1b0 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f  o-routine into O
2f1c0 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  P_Copy of result
2f1d0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
2f1e0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
2f1f0 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
2f200 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
2f210 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
2f220 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2f230 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73  ine ){.      tes
2f240 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
2f250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f260 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61  );.      transla
2f270 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70  teColumnToCopy(p
2f280 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61  Parse, pLevel->a
2f290 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
2f2a0 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
2f2d0 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
2f2e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2f2f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2f300 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
2f310 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
2f320 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
2f330 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
2f340 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
2f350 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
2f360 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
2f370 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
2f380 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
2f390 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
2f3a0 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
2f3b0 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
2f3c0 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
2f3d0 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
2f3e0 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
2f3f0 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
2f400 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
2f410 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
2f420 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
2f430 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
2f440 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
2f450 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
2f460 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
2f470 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
2f480 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
2f490 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
2f4a0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
2f4b0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
2f4c0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
2f4d0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
2f4e0 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
2f4f0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
2f500 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
2f510 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
2f520 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
2f530 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
2f540 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
2f550 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2f560 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
2f570 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
2f580 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
2f590 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2f5a0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
2f5b0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
2f5c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2f5d0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
2f5e0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
2f5f0 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
2f600 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20  .    if( pIdx.  
2f610 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65     && (pWInfo->e
2f620 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2f630 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69  _OFF || !HasRowi
2f640 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29  d(pIdx->pTable))
2f650 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  .     && !db->ma
2f660 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29  llocFailed.    )
2f670 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
2f680 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f690 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f6a0 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
2f6b0 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
2f6c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
2f6d0 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
2f6e0 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
2f6f0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
2f700 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
2f710 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2f720 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f730 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2f740 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23  ode==OP_Column.#
2f750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2f760 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
2f770 55 4e 43 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UNC.         || 
2f780 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2f790 4f 66 66 73 65 74 0a 23 65 6e 64 69 66 0a 20 20  Offset.#endif.  
2f7a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f7b0 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
2f7c0 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
2f7d0 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
2f7e0 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
2f7f0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2f800 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2f810 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
2f820 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
2f830 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
2f840 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
2f850 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
2f860 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
2f870 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
2f880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f890 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
2f8a0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2f8b0 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20  (pIdx, x);.     
2f8c0 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b       if( x>=0 ){
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
2f8e0 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20  ->p2 = x;.      
2f8f0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2f900 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2f910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2f930 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2f940 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2f950 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a 20 20 20  ==0 || x>=0 .   
2f960 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
2f970 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 29  Info->eOnePass )
2f980 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2f990 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2f9a0 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
2f9b0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
2f9c0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
2f9e0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
2f9f0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
2fa00 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2fa10 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52  code==OP_IfNullR
2fa20 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
2fa30 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
2fa40 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
2fa50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2fa60 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
2fa70 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
2fa80 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2fa90 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2faa0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2fab0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2fac0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
2fad0 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.