/ Hex Artifact Content
Login

Artifact caf0b6c9d31f22f0b2c91aba723858de52b5d665aaa89034099015aaf9bb8219:


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 61 64 64 42 74 72 65   ("BEGIN addBtre
15230 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64  eIdx(%s), nEq=%d
15240 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15250 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65            pProbe
15260 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75  ->zName, pNew->u
15270 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20  .btree.nEq));.. 
15280 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
15290 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
152a0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
152b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
152c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
152d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
152e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
152f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15300 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
15310 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
15320 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
15330 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
15340 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
15350 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73  ==0 );.    opMas
15360 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
15370 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
15380 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c  T|WO_LE|WO_ISNUL
15390 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69  L|WO_IS;.  }.  i
153a0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
153b0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
153c0 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
153d0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
153e0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
153f0 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
15400 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  e->nColumn );.. 
15410 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
15420 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
15430 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70    saved_nBtm = p
15440 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15450 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20  m;.  saved_nTop 
15460 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
15470 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53  nTop;.  saved_nS
15480 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69  kip = pNew->nSki
15490 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
154a0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
154b0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
154c0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
154d0 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
154e0 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
154f0 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
15500 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
15510 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
15520 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
15530 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
15540 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f  >iCursor, saved_
15550 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nEq,.           
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
15570 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
15580 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
15590 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
155a0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
155b0 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
155c0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
155d0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
155e0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
155f0 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
15600 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
15610 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
15620 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15630 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
15640 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
15650 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
15660 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
15670 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
15680 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
15690 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
156a0 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
156b0 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
156c0 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
156d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
156e0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
156f0 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
15700 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
15710 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
15720 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
15730 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
15740 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
15750 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
15760 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e    && indexColumn
15770 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20  NotNull(pProbe, 
15780 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29  saved_nEq).    )
15790 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
157a0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
157b0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
157c0 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
157d0 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
157e0 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
157f0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
15800 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
15810 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
15820 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
15830 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15840 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69  of a LIKE optimi
15850 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e  zation range con
15860 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74  straint.    ** t
15870 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77  o mix with a low
15880 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66  er range bound f
15890 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73  rom some other s
158a0 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  ource */.    if(
158b0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
158c0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26  & TERM_LIKEOPT &
158d0 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
158e0 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74  or==WO_LT ) cont
158f0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
15900 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53 20 63 6f   not allow IS co
15910 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20 74  nstraints from t
15920 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15930 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 68  to be used by th
15940 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20 74  e.    ** right t
15950 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
15960 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74  OIN.  Only const
15970 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e  raints in the ON
15980 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20 20   clause are.    
15990 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ** allowed */.  
159a0 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e    if( (pSrc->fg.
159b0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
159c0 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21  FT)!=0.     && !
159d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
159e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
159f0 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
15a00 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f 49 53  && (eOp & (WO_IS
15a10 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a  |WO_ISNULL))!=0.
15a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
15a30 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15a40 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
15a50 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
15a60 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 63  SNULL );.      c
15a70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
15a80 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65      if( IsUnique
15a90 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26 26  Index(pProbe) &&
15aa0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f   saved_nEq==pPro
15ab0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29 7b  be->nKeyCol-1 ){
15ac0 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
15ad0 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c  >bldFlags |= SQL
15ae0 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45 3b  ITE_BLDF_UNIQUE;
15af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15b00 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46    pBuilder->bldF
15b10 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42  lags |= SQLITE_B
15b20 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  LDF_INDEXED;.   
15b30 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46   }.    pNew->wsF
15b40 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
15b50 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lags;.    pNew->
15b60 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
15b70 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65  ved_nEq;.    pNe
15b80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
15b90 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20  = saved_nBtm;.  
15ba0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15bb0 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f  nTop = saved_nTo
15bc0 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  p;.    pNew->nLT
15bd0 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
15be0 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
15bf0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15c00 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15c10 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
15c20 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
15c30 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
15c40 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
15c50 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
15c60 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
15c70 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
15c80 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
15c90 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
15ca0 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
15cb0 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
15cc0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15cd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
15ce0 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
15cf0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15d00 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
15d10 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
15d20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
15d30 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
15d40 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
15d50 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
15d60 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
15d70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
15d80 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
15d90 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15da0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
15db0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
15dc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15dd0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15de0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
15df0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
15e00 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
15e10 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
15e20 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
15e30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15e40 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65   nIn = 46;  asse
15e50 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 46==sqlite3L
15e60 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20 20  ogEst(25) );..  
15e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
15e80 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74 75  ression may actu
15e90 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20 66  ally be of the f
15ea0 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28 53  orm (x, y) IN (S
15eb0 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20  ELECT...)..     
15ec0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
15ed0 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73 65  se there is a se
15ee0 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72 20  parate term for 
15ef0 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64 20  each of (x) and 
15f00 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  (y)..        ** 
15f10 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49 6e  However, the nIn
15f20 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f 75   multiplier shou
15f30 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69  ld only be appli
15f40 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63  ed once, not onc
15f50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  e.        ** for
15f60 20 65 61 63 68 20 73 75 63 68 20 74 65 72 6d 2e   each such term.
15f70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
15f80 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74 20  oop checks that 
15f90 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20 20  pTerm is the.   
15fa0 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73 75       ** first su
15fb0 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c 20  ch term in use, 
15fc0 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61 63  and sets nIn bac
15fd0 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69 73 20  k to 0 if it is 
15fe0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
15ff0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d  for(i=0; i<pNew-
16000 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b  >nLTerm-1; i++){
16010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16020 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26  New->aLTerm[i] &
16030 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  & pNew->aLTerm[i
16040 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72 20  ]->pExpr==pExpr 
16050 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ) nIn = 0;.     
16060 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16070 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
16080 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
16090 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
160a0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
160b0 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
160c0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
160d0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
160e0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
160f0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
16100 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
16110 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f  ert( nIn>0 );  /
16120 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73  * RHS always has
16130 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73   2 or more terms
16140 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a  ...  The parser.
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61            ** cha
16170 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20  nges "x IN (?)" 
16180 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20  into "x=?". */. 
16190 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
161a0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45   if( eOp & (WO_E
161b0 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
161c0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72    int iCol = pPr
161d0 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61  obe->aiColumn[sa
161e0 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20  ved_nEq];.      
161f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16200 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
16210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16220 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d  saved_nEq==pNew-
16230 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
16240 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
16250 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20 20  XN_ROWID .      
16260 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
16270 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
16280 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
16290 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
162a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
162b0 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62  iCol>=0 && pProb
162c0 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d  e->uniqNotNull==
162d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
162e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
162f0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
16300 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16310 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
16320 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
16330 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
16340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16350 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
16360 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
16370 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
16380 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
16390 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
163a0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
163b0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
163c0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
163d0 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
163e0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
163f0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
16400 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16410 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
16420 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
16430 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
16440 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
16450 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
16460 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
16470 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
16480 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
16490 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
164a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42       );.      pB
164b0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
164c0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
164d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
164e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
164f0 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
16500 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
16510 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
16520 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
16530 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
16540 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
16550 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
16560 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
16570 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
16580 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
16590 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
165a0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
165b0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
165c0 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
165d0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
165e0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
165f0 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
16600 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
16610 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
16620 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
16630 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
16640 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
16650 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
16660 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
16670 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
16680 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
16690 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
166a0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
166b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
166c0 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a  btree.nTop = 1;.
166d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
166e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
166f0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
16700 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
16710 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16720 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
16730 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
16740 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
16750 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
16760 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
16770 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
16780 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
16790 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72  tree.nTop = wher
167a0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
167b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
167c0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
167d0 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
167e0 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
167f0 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d   );.      pTop =
16800 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
16810 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
16820 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
16830 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
16860 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
16870 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
16880 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
16890 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
168a0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
168b0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
168c0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
168d0 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
168e0 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
168f0 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
16900 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
16910 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
16920 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
16930 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
16940 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
16950 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
16960 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
16970 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
16980 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
16990 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
169a0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
169b0 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
169c0 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
169d0 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
169e0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
169f0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
16a00 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
16a10 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16a20 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16a30 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16a40 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
16a50 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
16a60 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
16a70 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
16a80 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
16a90 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
16aa0 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
16ab0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
16ac0 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
16ad0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
16ae0 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
16af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16b00 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
16b10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
16b20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
16b30 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
16b40 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
16b50 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
16b60 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
16b70 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
16b80 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
16b90 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
16ba0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
16bb0 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
16bc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16bd0 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
16be0 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
16bf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16c00 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
16c10 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16c20 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
16c30 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
16c40 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
16c50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
16c60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16c70 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
16c80 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
16c90 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
16ca0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
16cb0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
16cc0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
16cd0 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
16ce0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
16cf0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
16d00 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
16d10 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
16d20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
16d30 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
16d40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
16d50 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
16d60 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
16d70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
16d80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16d90 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
16da0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
16db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16dc0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16dd0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
16de0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16df0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
16e00 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16e10 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16e20 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
16e30 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
16e40 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
16e50 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
16e60 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
16e70 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
16e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16e90 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
16ea0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
16eb0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
16ec0 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
16ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16ee0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16ef0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
16f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
16f30 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
16f40 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
16f50 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
16f60 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
16f70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16f80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
16f90 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
16fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16fb0 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
16fc0 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
16fd0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16fe0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
16ff0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
17000 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
17010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17020 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
17030 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
17040 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
17050 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
17060 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
17070 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
17080 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
17090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
170a0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
170b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
170c0 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
170d0 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
170e0 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
170f0 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
17100 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
17110 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
17120 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
17130 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
17140 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
17150 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
17160 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
17170 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
17180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
171a0 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
171b0 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
171c0 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
171d0 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
171e0 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
171f0 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
17200 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
17210 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
17220 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
17230 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
17240 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
17250 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
17260 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
17270 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
17280 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
17290 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
172a0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
172b0 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
172c0 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
172d0 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
172e0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
172f0 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
17300 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
17310 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
17320 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
17330 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
17340 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
17350 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
17360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
17370 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
17380 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
17390 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
173a0 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
173b0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
173c0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
173d0 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
173e0 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
173f0 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
17400 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
17410 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
17420 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
17430 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
17440 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
17450 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
17460 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
17470 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
17480 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
17490 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
174a0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
174b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
174c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
174d0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
174e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
174f0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
17500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17510 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
17520 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
17530 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
17540 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
17550 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
17560 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
17570 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
17580 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
17590 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
175a0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
175b0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
175c0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
175d0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
175e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
175f0 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
17600 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17610 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
17620 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
17630 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
17640 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
17650 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
17660 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
17670 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
17680 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
17690 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
176a0 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
176b0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
176c0 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
176d0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
176e0 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
176f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17700 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
17710 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
17720 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
17730 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
17740 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
17750 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
17760 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
17770 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
17780 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
17790 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
177a0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
177b0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
177c0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
177d0 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
177e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
177f0 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
17800 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
17810 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
17820 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
17830 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
17840 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
17850 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
17860 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
17870 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
17880 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
17890 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
178a0 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
178b0 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
178c0 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
178d0 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
178e0 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
178f0 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
17900 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
17910 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
17920 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
17930 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
17940 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
17950 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
17960 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
17970 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
17980 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
17990 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
179a0 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
179b0 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
179c0 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
179d0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
179e0 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
179f0 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
17a00 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
17a10 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
17a20 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72  can==0.   && pPr
17a30 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17a40 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
17a50 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
17a60 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
17a70 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
17a80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
17a90 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
17aa0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
17ab0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
17ac0 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
17ad0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
17ae0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
17af0 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
17b00 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
17b10 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
17b20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
17b30 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
17b40 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
17b50 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
17b60 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
17b70 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
17b80 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
17b90 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
17ba0 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
17bb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
17bc0 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
17bd0 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
17be0 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
17bf0 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
17c00 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
17c10 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
17c20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
17c30 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
17c40 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
17c50 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
17c60 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
17c70 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
17c80 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
17c90 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
17ca0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
17cb0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
17cc0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
17cd0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
17ce0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
17cf0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
17d00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
17d10 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
17d20 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  }..  WHERETRACE(
17d30 30 78 38 30 30 2c 20 28 22 45 4e 44 20 61 64 64  0x800, ("END add
17d40 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45  BtreeIdx(%s), nE
17d50 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a  q=%d, rc=%d\n",.
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e        pProbe->zN
17d80 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  ame, saved_nEq, 
17d90 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
17da0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17db0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
17dc0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
17dd0 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
17de0 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
17df0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
17e00 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
17e10 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
17e20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
17e30 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
17e40 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
17e50 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
17e60 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
17e70 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
17e80 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
17e90 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17ea0 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
17eb0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17ec0 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
17ed0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
17ee0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17ef0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17f00 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
17f10 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
17f20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
17f30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
17f40 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c  lExpr;.  int ii,
17f50 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
17f60 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
17f70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
17f80 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
17f90 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
17fa0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
17fb0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
17fc0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
17fd0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
17fe0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
17ff0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
18000 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
18010 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
18020 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
18030 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
18040 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
18050 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
18060 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
18070 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
18080 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
18090 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
180a0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
180b0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
180c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
180d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
180e0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
180f0 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64  (aColExpr = pInd
18100 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30  ex->aColExpr)!=0
18110 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
18120 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
18130 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
18140 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
18150 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21  x->aiColumn[jj]!
18160 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69  =XN_EXPR ) conti
18170 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
18180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
18190 61 72 65 53 6b 69 70 28 70 45 78 70 72 2c 61 43  areSkip(pExpr,aC
181a0 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
181b0 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
181c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
181d0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18200 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18210 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
18220 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
18230 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
18240 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
18250 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
18260 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
18270 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
18280 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
18290 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
182a0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
182b0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
182c0 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
182d0 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
182e0 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
182f0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
18300 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
18310 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
18320 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
18330 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
18340 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
18350 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18360 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
18370 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
18380 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
18390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
183a0 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
183b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
183c0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
183d0 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
183e0 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
183f0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
18400 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
18410 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
18420 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
18430 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
18440 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
18450 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
18460 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
18470 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
18480 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
18490 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
184a0 6d 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m;.  Parse *pPar
184b0 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  se = pWC->pWInfo
184c0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 68 69 6c  ->pParse;.  whil
184d0 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
184e0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28  K_AND ){.    if(
184f0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
18500 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70  tialIndex(iTab,p
18510 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74  WC,pWhere->pLeft
18520 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18530 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
18540 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20  e->pRight;.  }. 
18550 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
18560 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
18570 45 6e 61 62 6c 65 51 50 53 47 20 29 20 70 50 61  EnableQPSG ) pPa
18580 72 73 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  rse = 0;.  for(i
18590 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
185a0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
185b0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
185c0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
185d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
185e0 20 20 20 69 66 28 20 28 21 45 78 70 72 48 61 73     if( (!ExprHas
185f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18600 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20  EP_FromJoin) || 
18610 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
18620 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20  nTable==iTab).  
18630 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
18640 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61  rImpliesExpr(pPa
18650 72 73 65 2c 20 70 45 78 70 72 2c 20 70 57 68 65  rse, pExpr, pWhe
18660 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 29  re, iTab) .    )
18670 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
18680 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
18690 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
186a0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
186b0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
186c0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
186d0 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
186e0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
186f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
18700 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
18710 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
18720 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18730 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20   be.** a b-tree 
18740 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72  table, not a vir
18750 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
18760 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65  * The costs (Whe
18770 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20  reLoop.rRun) of 
18780 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73  the b-tree loops
18790 20 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66   added by this f
187a0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63  unction.** are c
187b0 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c  alculated as fol
187c0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  lows:.**.** For 
187d0 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73  a full scan, ass
187e0 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  uming the table 
187f0 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61  (or index) conta
18800 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a  ins nRow rows:.*
18810 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
18820 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20  nRow * 3.0      
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
18840 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
18850 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
18860 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20  Row * K         
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
18880 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67  scan of covering
18890 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
188a0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33  st = nRow * (K+3
188b0 2e 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  .0)             
188c0 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f     // scan of no
188d0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
188e0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69  .**.** where K i
188f0 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
18900 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65  n 1.1 and 3.0 se
18910 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  t based on the r
18920 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69  elative .** esti
18930 6d 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69  mated average si
18940 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
18950 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64  and table record
18960 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
18970 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72  index scan, wher
18980 65 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20  e nVisit is the 
18990 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  number of index 
189a0 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20  rows visited.** 
189b0 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64  by the scan, and
189c0 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75   nSeek is the nu
189d0 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65  mber of seek ope
189e0 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
189f0 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65   on .** the inde
18a00 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20  x b-tree:.**.** 
18a10 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b      cost = nSeek
18a20 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20   * (log(nRow) + 
18a30 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20  K * nVisit)     
18a40 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67       // covering
18a50 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f   index.**     co
18a60 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
18a70 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30  g(nRow) + (K+3.0
18a80 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f  ) * nVisit)    /
18a90 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  / non-covering i
18aa0 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  ndex.**.** Norma
18ab0 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e  lly, nSeek is 1.
18ac0 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72   nSeek values gr
18ad0 65 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d  eater than 1 com
18ae0 65 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a  e about if the .
18af0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
18b00 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28  includes "x IN (
18b10 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65  ....)" terms use
18b20 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78  d in place of "x
18b30 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a  =?". Or when .**
18b40 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20   implicit "x IN 
18b50 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
18b60 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61  bl)" terms are a
18b70 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63  dded for skip-sc
18b80 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ans..**.** The e
18b90 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20  stimated values 
18ba0 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e  (nRow, nVisit, n
18bb0 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74  Seek) often cont
18bc0 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75  ain a large amou
18bd0 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61  nt.** of uncerta
18be0 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20  inty.  For this 
18bf0 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20  reason, scoring 
18c00 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
18c10 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a  ick plans that.*
18c20 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20  * "do the least 
18c30 68 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74  harm" if the est
18c40 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63  imates are inacc
18c50 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d  urate.  For exam
18c60 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52  ple, a.** log(nR
18c70 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d  ow) factor is om
18c80 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e  itted from a non
18c90 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
18ca0 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  scan in order to
18cb0 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f  .** bias the sco
18cc0 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66  ring in favor of
18cd0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c   using an index,
18ce0 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74   since the worst
18cf0 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d  -case.** perform
18d00 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e  ance of using an
18d10 20 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65   index is far be
18d20 74 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f  tter than the wo
18d30 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d  rst-case perform
18d40 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c  ance.** of a ful
18d50 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f  l table scan..*/
18d60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18d70 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
18d80 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
18d90 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
18da0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
18db0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
18dc0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 20 20  tmask mPrereq   
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
18de0 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
18df0 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
18e00 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
18e10 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
18e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
18e30 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
18e40 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
18e50 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
18e60 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
18e70 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
18e80 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
18e90 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
18ea0 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
18eb0 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
18ec0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
18ed0 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77  /.  LogEst aiRow
18ee0 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20  EstPk[2];       
18ef0 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45  /* The aiRowLogE
18f00 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
18f10 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
18f20 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b    i16 aiColumnPk
18f30 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
18f40 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
18f50 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
18f60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c   index */.  SrcL
18f70 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
18f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
18f90 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
18fa0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18fb0 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54  tem *pSrc;  /* T
18fc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62  he FROM clause b
18fd0 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64  tree term to add
18fe0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
18ff0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
19000 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
19010 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
19020 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
19030 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
19040 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19050 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78  /.  int iSortIdx
19060 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
19070 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
19080 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20  */.  int b;     
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61   /* A boolean va
190b0 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  lue */.  LogEst 
190c0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
190d0 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f       /* number o
190e0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
190f0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
19100 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
19110 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
19120 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
19130 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
19140 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
19150 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
19160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
19170 73 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  sed WHERE clause
19180 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
19190 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
191a0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
191b0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20   queried */.  . 
191c0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
191d0 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f  ->pNew;.  pWInfo
191e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
191f0 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  nfo;.  pTabList 
19200 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
19210 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61  st;.  pSrc = pTa
19220 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
19230 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20  >iTab;.  pTab = 
19240 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
19250 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
19260 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73  C;.  assert( !Is
19270 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
19280 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ab) );..  if( pS
19290 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a  rc->pIBIndex ){.
192a0 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
192b0 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
192c0 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
192d0 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
192e0 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
192f0 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  pSrc->pIBIndex;.
19300 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
19310 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
19320 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
19330 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
19340 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
19350 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
19360 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
19370 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
19380 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
19390 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
193a0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
193b0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
193c0 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
193d0 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
193e0 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
193f0 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
19400 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
19410 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
19420 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
19430 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
19440 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
19450 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19460 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
19470 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
19480 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
19490 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
194a0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
194b0 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
194c0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43   = 1;.    sPk.nC
194d0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
194e0 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
194f0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
19500 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  Pk.aiRowLogEst =
19510 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
19520 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
19530 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
19540 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
19550 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52  ;.    sPk.szIdxR
19560 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62  ow = pTab->szTab
19570 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Row;.    aiRowEs
19580 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e  tPk[0] = pTab->n
19590 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61  RowLogEst;.    a
195a0 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30  iRowEstPk[1] = 0
195b0 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
195c0 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
195d0 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
195e0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
195f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
19600 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
19610 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
19620 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
19630 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
19640 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
19650 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
19660 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
19670 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
19680 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
19690 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
196a0 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
196b0 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e    rSize = pTab->
196c0 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c  nRowLogEst;.  rL
196d0 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
196e0 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66  rSize);..#ifndef
196f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19700 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f  OMATIC_INDEX.  /
19710 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
19720 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
19730 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 20  uilder->pOrSet  
19740 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20      /* Not part 
19750 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a  of an OR optimiz
19760 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28  ation */.   && (
19770 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
19780 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
19790 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 26  BCLAUSE)==0.   &
197a0 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  & (pWInfo->pPars
197b0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
197c0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
197d0 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e  !=0.   && pSrc->
197e0 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20 20 20  pIBIndex==0     
197f0 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45 58   /* Has no INDEX
19800 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ED BY clause */.
19810 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
19820 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f 2a 20  notIndexed   /* 
19830 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58  Has no NOT INDEX
19840 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  ED clause */.   
19850 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
19860 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  )         /* Not
19870 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
19880 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68  able. (FIXME: Wh
19890 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26  y not?) */.   &&
198a0 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72   !pSrc->fg.isCor
198b0 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61  related /* Not a
198c0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
198d0 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70  uery */.   && !p
198e0 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  Src->fg.isRecurs
198f0 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65  ive  /* Not a re
19900 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74  cursive common t
19910 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
19920 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20   */.  ){.    /* 
19930 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
19940 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
19950 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
19960 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
19970 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
19980 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
19990 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
199a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
199b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
199c0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
199d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
199e0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
199f0 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
19a00 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
19a10 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
19a20 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
19a30 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
19a40 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19a50 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
19a60 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
19a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
19a80 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
19a90 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
19aa0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
19ab0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
19ac0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
19ad0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
19ae0 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
19af0 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
19b00 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
19b10 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
19b20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
19b30 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  be X*N*log2(N) w
19b40 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
19b50 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
19b60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
19b70 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
19b80 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69  ed and where X i
19b90 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20  s 7 (LogEst=28) 
19ba0 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20  for normal.     
19bb0 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20     ** tables or 
19bc0 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29  1.375 (LogEst=4)
19bd0 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
19be0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
19bf0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
19c00 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72   of X is smaller
19c10 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
19c20 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61  ubqueries so tha
19c30 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  t the query plan
19c40 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ner.        ** w
19c50 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72  ill be more aggr
19c60 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e  essive about gen
19c70 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69  erating automati
19c80 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20  c indexes for.  
19c90 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f        ** those o
19ca0 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68  bjects, since th
19cb0 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74  ere is no opport
19cc0 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68  unity to add sch
19cd0 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ema.        ** i
19ce0 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65  ndexes on subque
19cf0 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20  ries and views. 
19d00 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
19d10 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
19d20 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a  ze + rSize + 4;.
19d30 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
19d40 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
19d50 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
19d60 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
19d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19d80 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20  pNew->rSetup += 
19d90 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  24;.        }.  
19da0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
19db0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
19dc0 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f  rSetup, pTab->co
19dd0 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
19de0 20 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74 75   if( pNew->rSetu
19df0 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65 74  p<0 ) pNew->rSet
19e00 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  up = 0;.        
19e10 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
19e20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
19e30 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
19e40 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
19e50 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
19e60 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
19e70 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
19e80 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
19e90 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
19ea0 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68   ** of knowing h
19eb0 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
19ec0 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
19ed0 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
19ee0 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
19ef0 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
19f00 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
19f10 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
19f20 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
19f30 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
19f40 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
19f50 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
19f60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19f70 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
19f80 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
19f90 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
19fa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
19fb0 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
19fc0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
19fd0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
19fe0 50 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  Prereq | pTerm->
19ff0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1a000 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1a010 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1a020 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1a030 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1a040 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a050 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
1a060 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
1a070 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
1a080 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73 20  s. If there was 
1a090 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1a0a0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
1a0b0 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 69  .  ** consider i
1a0c0 6e 64 65 78 20 70 50 72 6f 62 65 2e 20 20 2a 2f  ndex pProbe.  */
1a0d0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
1a0e0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
1a0f0 3b 20 0a 20 20 20 20 20 20 70 50 72 6f 62 65 3d  ; .      pProbe=
1a100 28 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20  (pSrc->pIBIndex 
1a110 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e  ? 0 : pProbe->pN
1a120 65 78 74 29 2c 20 69 53 6f 72 74 49 64 78 2b 2b  ext), iSortIdx++
1a130 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
1a140 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
1a150 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
1a160 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
1a170 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
1a180 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
1a190 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
1a1a0 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
1a1b0 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
1a1c0 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
1a1d0 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
1a1e0 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
1a1f0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
1a200 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
1a210 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
1a220 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
1a230 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1a240 28 20 70 50 72 6f 62 65 2d 3e 62 4e 6f 51 75 65  ( pProbe->bNoQue
1a250 72 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ry ) continue;. 
1a260 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
1a270 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
1a280 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
1a290 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
1a2a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1a2b0 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  nBtm = 0;.    pN
1a2c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70  ew->u.btree.nTop
1a2d0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1a2e0 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
1a2f0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
1a300 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
1a310 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
1a320 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1a330 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1a340 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70  = mPrereq;.    p
1a350 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
1a360 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
1a370 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
1a380 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
1a390 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
1a3a0 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
1a3b0 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
1a3c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
1a3d0 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
1a3e0 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
1a3f0 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
1a400 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
1a410 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
1a420 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1a430 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1a440 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
1a450 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
1a460 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
1a470 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
1a480 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
1a490 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1a4a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1a4b0 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
1a4c0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
1a4d0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
1a4e0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
1a4f0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
1a500 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
1a510 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
1a520 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
1a530 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
1a540 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
1a550 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
1a560 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1a570 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1a580 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1a590 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
1a5a0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
1a5b0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
1a5c0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1a5d0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a5e0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a5f0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
1a600 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
1a610 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
1a620 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
1a630 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
1a640 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
1a650 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
1a660 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1a670 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
1a680 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
1a690 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
1a6a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a6b0 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
1a6c0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
1a6d0 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
1a6e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
1a6f0 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
1a700 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
1a710 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
1a720 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
1a730 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1a740 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20  * Full scan via 
1a750 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
1a760 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21  f( b.       || !
1a770 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
1a780 20 20 20 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d        || pProbe-
1a790 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
1a7a0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d  0.       || ( m=
1a7b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
1a7c0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
1a7d0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
1a7e0 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52   (pProbe->szIdxR
1a7f0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
1a800 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  w).         && (
1a810 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1a820 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1a830 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
1a840 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1a850 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1a860 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
1a870 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
1a880 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
1a890 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1a8a0 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
1a8b0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
1a8c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
1a8d0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
1a8e0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
1a8f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1a900 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
1a910 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20   the index rows 
1a920 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20  is N*K, where K 
1a930 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  is.        ** be
1a940 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
1a950 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  0, depending on 
1a960 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
1a970 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  es of the.      
1a980 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74    ** index and t
1a990 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20  able rows. */.  
1a9a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1a9b0 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28   = rSize + 1 + (
1a9c0 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
1a9d0 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62  Row)/pTab->szTab
1a9e0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Row;.        if(
1a9f0 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m!=0 ){.       
1aa00 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1aa10 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
1aa20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61 64 64 20  index scan, add 
1aa30 69 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  in the cost of. 
1aa40 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e           ** doin
1aa50 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e  g table lookups.
1aa60 20 20 54 68 65 20 63 6f 73 74 20 77 69 6c 6c 20    The cost will 
1aa70 62 65 20 33 78 20 74 68 65 20 6e 75 6d 62 65 72  be 3x the number
1aa80 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
1aa90 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20   lookups.  Take 
1aaa0 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 57 48 45  into account WHE
1aab0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1aac0 74 68 61 74 20 63 61 6e 20 62 65 0a 20 20 20 20  that can be.    
1aad0 20 20 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69        ** satisfi
1aae0 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  ed using just th
1aaf0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 61  e index, and tha
1ab00 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
1ab10 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
1ab20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f  table lookup. */
1ab30 0a 20 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73  .          LogEs
1ab40 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a  t nLookup = rSiz
1ab50 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42 61 73 65  e + 16;  /* Base
1ab60 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20   cost:  N*3 */. 
1ab70 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
1ab80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1ab90 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
1aba0 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 57  sor;.          W
1abb0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 32  hereClause *pWC2
1abc0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1abd0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1abe0 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54  i=0; ii<pWC2->nT
1abf0 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
1ac00 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
1ac10 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 32  m *pTerm = &pWC2
1ac20 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20  ->a[ii];.       
1ac30 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
1ac40 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e  3ExprCoveredByIn
1ac50 64 65 78 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  dex(pTerm->pExpr
1ac60 2c 20 69 43 75 72 2c 20 70 50 72 6f 62 65 29 20  , iCur, pProbe) 
1ac70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ac80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ac90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1aca0 20 20 2f 2a 20 70 54 65 72 6d 20 63 61 6e 20 62    /* pTerm can b
1acb0 65 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  e evaluated usin
1acc0 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
1acd0 2e 20 20 53 6f 20 72 65 64 75 63 65 0a 20 20 20  .  So reduce.   
1ace0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1acf0 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
1ad00 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73  of table lookups
1ad10 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a   accordingly */.
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ad30 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1ad40 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=0 ){.         
1ad50 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20       nLookup += 
1ad60 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1ad70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1ad80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ad90 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20     nLookup--;.  
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1adb0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1adc0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   & (WO_EQ|WO_IS)
1add0 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39   ) nLookup -= 19
1ade0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1adf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ae00 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
1ae10 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1ae20 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1ae30 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b  New->rRun, nLook
1ae40 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  up);.        }. 
1ae50 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
1ae60 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
1ae70 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73  >rRun, pTab->cos
1ae80 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
1ae90 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
1aea0 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
1aeb0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   rSize);.       
1aec0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1aed0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1aee0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
1aef0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
1af00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
1af10 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
1af20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42   }.    }..    pB
1af30 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73  uilder->bldFlags
1af40 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77   = 0;.    rc = w
1af50 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1af60 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
1af70 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29  pSrc, pProbe, 0)
1af80 3b 0a 20 20 20 20 69 66 28 20 70 42 75 69 6c 64  ;.    if( pBuild
1af90 65 72 2d 3e 62 6c 64 46 6c 61 67 73 3d 3d 53 51  er->bldFlags==SQ
1afa0 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45  LITE_BLDF_INDEXE
1afb0 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  D ){.      /* If
1afc0 20 61 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 69 6e   a non-unique in
1afd0 64 65 78 20 69 73 20 75 73 65 64 2c 20 6f 72 20  dex is used, or 
1afe0 69 66 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  if a prefix of t
1aff0 68 65 20 6b 65 79 20 66 6f 72 0a 20 20 20 20 20  he key for.     
1b000 20 2a 2a 20 75 6e 69 71 75 65 20 69 6e 64 65 78   ** unique index
1b010 20 69 73 20 75 73 65 64 20 28 6d 61 6b 69 6e 67   is used (making
1b020 20 74 68 65 20 69 6e 64 65 78 20 66 75 6e 63 74   the index funct
1b030 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71  ionally non-uniq
1b040 75 65 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ue).      ** the
1b050 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
1b060 74 31 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  t1 data becomes 
1b070 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 63  important for sc
1b080 6f 72 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  oring the.      
1b090 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20  ** plan */.     
1b0a0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1b0b0 7c 3d 20 54 46 5f 53 74 61 74 73 55 73 65 64 3b  |= TF_StatsUsed;
1b0c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1b0d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1b0e0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
1b0f0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
1b100 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
1b110 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
1b120 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
1b130 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
1b140 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
1b150 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  f.  }.  return r
1b160 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1b170 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1b180 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72  LTABLE../*.** Ar
1b190 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20  gument pIdxInfo 
1b1a0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
1b1b0 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f  ated with all co
1b1c0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d  nstraints that m
1b1d0 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79  ay.** be used by
1b1e0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1b1f0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
1b200 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1b210 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66  >iTab. This.** f
1b220 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20  unction marks a 
1b230 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20  subset of those 
1b240 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1b250 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  le, invokes the.
1b260 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  ** xBestIndex me
1b270 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68  thod and adds th
1b280 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20  e returned plan 
1b290 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1b2a0 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20  ** A constraint 
1b2b0 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65  is marked usable
1b2c0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41   if:.**.**   * A
1b2d0 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20  rgument mUsable 
1b2e0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69  indicates that i
1b2f0 74 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ts prerequisites
1b300 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
1b310 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74  and.**.**   * It
1b320 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74   is not one of t
1b330 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65  he operators spe
1b340 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45  cified in the mE
1b350 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73  xclude mask pass
1b360 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65  ed.**     as the
1b370 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
1b380 20 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74   (which in pract
1b390 69 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f  ice is either WO
1b3a0 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  _IN or 0)..**.**
1b3b0 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65   Argument mPrere
1b3c0 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74  q is a mask of t
1b3d0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1b3e0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1b3f0 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  e the.** virtual
1b400 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
1b410 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64  on. These are ad
1b420 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73  ded to the plans
1b430 20 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a   prerequisites.*
1b440 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61  * before it is a
1b450 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1b460 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70  ..**.** Output p
1b470 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69  arameter *pbIn i
1b480 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
1b490 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20   the plan added 
1b4a0 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75  to pBuilder.** u
1b4b0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1b4c0 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20  WO_IN terms, or 
1b4d0 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
1b4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b4f0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1b500 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f  alOne(.  WhereLo
1b510 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1b520 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d  der,.  Bitmask m
1b530 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
1b540 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1b550 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
1b560 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20  st be used. */. 
1b570 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65   Bitmask mUsable
1b580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b590 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62   /* Mask of usab
1b5a0 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75  le tables */.  u
1b5b0 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20  16 mExclude,    
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5d0 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20  * Exclude terms 
1b5e0 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72  using these oper
1b5f0 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ators */.  sqlit
1b600 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1b610 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f  IdxInfo,   /* Po
1b620 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66  pulated object f
1b630 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  or xBestIndex */
1b640 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20  .  u16 mNoOmit, 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69     /* Do not omi
1b670 74 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69  t these constrai
1b680 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
1b690 49 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  In              
1b6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1b6b0 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1b6c0 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70  es an IN(...) op
1b6d0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c   */.){.  WhereCl
1b6e0 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
1b6f0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72  lder->pWC;.  str
1b700 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1b710 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
1b720 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
1b730 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1b740 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
1b750 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e  *pUsage = pIdxIn
1b760 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
1b770 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sage;.  int i;. 
1b780 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69   int mxTerm;.  i
1b790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b7a0 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1b7b0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1b7c0 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a  >pNew;.  Parse *
1b7d0 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65  pParse = pBuilde
1b7e0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  r->pWInfo->pPars
1b7f0 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  e;.  struct SrcL
1b800 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1b810 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e   &pBuilder->pWIn
1b820 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1b830 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69  pNew->iTab];.  i
1b840 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1b850 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
1b860 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72  traint;..  asser
1b870 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50  t( (mUsable & mP
1b880 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20  rereq)==mPrereq 
1b890 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a  );.  *pbIn = 0;.
1b8a0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1b8b0 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20   mPrereq;..  /* 
1b8c0 53 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66  Set the usable f
1b8d0 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65  lag on the subse
1b8e0 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  t of constraints
1b8f0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
1b900 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d    ** arguments m
1b910 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c  Usable and mExcl
1b920 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f  ude. */.  pIdxCo
1b930 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1b940 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1b950 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1b960 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1b970 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1b980 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1b990 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1b9a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1b9b0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78  m = &pWC->a[pIdx
1b9c0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
1b9d0 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  t];.    pIdxCons
1b9e0 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
1b9f0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1ba00 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61  ereqRight & mUsa
1ba10 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ble)==pTerm->pre
1ba20 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26  reqRight .     &
1ba30 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
1ba40 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d  tor & mExclude)=
1ba50 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1ba60 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1ba70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1ba80 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1ba90 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c   the output fiel
1baa0 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ds of the sqlite
1bab0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
1bac0 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73  ucture */.  mems
1bad0 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
1bae0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
1baf0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1bb00 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f  assert( pIdxInfo
1bb10 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1bb20 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49  tr==0 );.  pIdxI
1bb30 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
1bb40 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1bb50 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
1bb60 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1bb70 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78  umed = 0;.  pIdx
1bb80 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1bb90 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1bba0 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
1bbb0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
1bbc0 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35  timatedRows = 25
1bbd0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1bbe0 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49  xFlags = 0;.  pI
1bbf0 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20  dxInfo->colUsed 
1bc00 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1bc10 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a  )pSrc->colUsed;.
1bc20 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
1bc30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
1bc40 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1bc50 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61  od */.  rc = vta
1bc60 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
1bc70 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70  e, pSrc->pTab, p
1bc80 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  IdxInfo);.  if( 
1bc90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1bca0 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a  .  mxTerm = -1;.
1bcb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1bcc0 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
1bcd0 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  int );.  for(i=0
1bce0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1bcf0 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
1bd00 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65  rm[i] = 0;.  pNe
1bd10 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1bd20 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f  sk = 0;.  pIdxCo
1bd30 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1bd40 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1bd50 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1bd60 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1bd70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1bd80 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1bd90 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1bda0 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
1bdb0 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
1bdc0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
1bdd0 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
1bde0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1bdf0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  rm;.      int j 
1be00 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
1be10 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  mOffset;.      i
1be20 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
1be30 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20  raint.       || 
1be40 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e  j<0.       || j>
1be50 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
1be60 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
1be70 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
1be80 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d      || pIdxCons-
1be90 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20  >usable==0.     
1bea0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1beb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1bec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1bed0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1bee0 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1bef0 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1bf00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1bf10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1bf20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1bf30 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1bf40 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1bf50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bf60 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1bf70 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1bf80 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1bf90 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1bfa0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1bfb0 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1bfc0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1bfd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1bfe0 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1bff0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1c000 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1c010 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1c020 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1c030 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1c040 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c050 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1c060 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1c070 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1c080 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1c090 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1c0a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1c0b0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1c0c0 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1c0d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1c0e0 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1c0f0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1c100 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1c110 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1c120 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1c130 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1c140 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1c150 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1c160 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1c170 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1c180 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1c190 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1c1a0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1c1b0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1c1c0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1c1d0 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1c1e0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1c1f0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1c200 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1c210 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1c220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1c230 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1c240 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1c250 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1c260 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1c270 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1c280 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1c290 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1c2a0 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1c2b0 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1c2c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1c2d0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1c2e0 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a  sk &= ~mNoOmit;.
1c2f0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1c300 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73  = mxTerm+1;.  as
1c310 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
1c320 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
1c330 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
1c340 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
1c350 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
1c360 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c370 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
1c380 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1c390 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
1c3a0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1c3b0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1c3c0 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
1c3d0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
1c3e0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1c3f0 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
1c400 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1c410 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
1c420 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
1c430 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
1c440 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1c450 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1c460 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
1c470 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
1c480 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
1c490 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1c4a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1c4b0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1c4c0 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1c4d0 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1c4e0 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1c4f0 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1c500 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1c510 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1c520 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1c530 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1c540 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1c550 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1c560 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1c570 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1c580 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1c590 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1c5a0 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1c5b0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1c5c0 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1c5d0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1c5e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1c5f0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1c600 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1c610 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1c620 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c630 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1c640 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1c650 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1c660 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1c670 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1c680 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1c690 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1c6a0 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1c6b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c6c0 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1c6d0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1c6e0 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c700 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1c710 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1c720 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1c730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c740 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
1c750 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66  ion is invoked f
1c760 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42  rom within an xB
1c770 65 73 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62  estIndex() callb
1c780 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72  ack, it.** retur
1c790 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1c7a0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1c7b0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1c7c0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  the collation.**
1c7d0 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69   sequence associ
1c7e0 61 74 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e  ated with elemen
1c7f0 74 20 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73  t iCons of the s
1c800 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c810 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  o.aConstraint.**
1c820 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69   array. Or, if i
1c830 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72  Cons is out of r
1c840 61 6e 67 65 20 6f 72 20 74 68 65 72 65 20 69 73  ange or there is
1c850 20 6e 6f 20 61 63 74 69 76 65 20 78 42 65 73 74   no active xBest
1c860 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72  Index.** call, r
1c870 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  eturn NULL..*/.c
1c880 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1c890 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f  e3_vtab_collatio
1c8a0 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n(sqlite3_index_
1c8b0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
1c8c0 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20 48 69  int iCons){.  Hi
1c8d0 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20 2a 70  ddenIndexInfo *p
1c8e0 48 69 64 64 65 6e 20 3d 20 28 48 69 64 64 65 6e  Hidden = (Hidden
1c8f0 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49 64 78  IndexInfo*)&pIdx
1c900 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74  Info[1];.  const
1c910 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
1c920 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20  .  if( iCons>=0 
1c930 26 26 20 69 43 6f 6e 73 3c 70 49 64 78 49 6e 66  && iCons<pIdxInf
1c940 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  o->nConstraint )
1c950 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
1c960 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  C = 0;.    int i
1c970 54 65 72 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Term = pIdxInfo-
1c980 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 43 6f  >aConstraint[iCo
1c990 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns].iTermOffset;
1c9a0 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
1c9b0 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e 61 5b  pHidden->pWC->a[
1c9c0 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
1c9d0 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 20    if( pX->pLeft 
1c9e0 29 7b 0a 20 20 20 20 20 20 70 43 20 3d 20 73 71  ){.      pC = sq
1c9f0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1ca00 72 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65  reCollSeq(pHidde
1ca10 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  n->pParse, pX->p
1ca20 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
1ca30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  );.    }.    zRe
1ca40 74 20 3d 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e  t = (pC ? pC->zN
1ca50 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 29 3b  ame : "BINARY");
1ca60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1ca70 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  et;.}../*.** Add
1ca80 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1ca90 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
1caa0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
1cab0 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
1cac0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1cad0 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
1cae0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1caf0 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
1cb00 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
1cb10 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
1cb20 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
1cb30 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
1cb40 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71  ry, both mPrereq
1cb50 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
1cb60 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
1cb70 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72  Otherwise, mPrer
1cb80 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20  eq is a mask of 
1cb90 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  all FROM clause.
1cba0 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1cbb0 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1cbc0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1cbd0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1cbe0 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70  e and are.** sep
1cbf0 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1cc00 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1cc10 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1cc20 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68  N. Similarly, th
1cc30 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d  e.** mUnusable m
1cc40 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ask contains all
1cc50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
1cc60 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1cc70 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72  after the.** vir
1cc80 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61  tual table and a
1cc90 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  re separated fro
1cca0 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1ccb0 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a   one LEFT or .**
1ccc0 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a   CROSS JOIN. .**
1ccd0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1cce0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65   if the query we
1ccf0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  re:.**.**   ... 
1cd00 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54  FROM t1, t2 LEFT
1cd10 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74   JOIN t3, t4, vt
1cd20 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20   CROSS JOIN t5, 
1cd30 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d  t6;.**.** then m
1cd40 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e  Prereq correspon
1cd50 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61  ds to (t1, t2) a
1cd60 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20  nd mUnusable to 
1cd70 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20  (t5, t6)..**.** 
1cd80 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69  All the tables i
1cd90 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62  n mPrereq must b
1cda0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1cdb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1cdc0 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
1cdd0 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
1cde0 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
1cdf0 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
1ce00 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50  isfied by .** mP
1ce10 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65  rereq may be spe
1ce20 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1ce30 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1ce40 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1ce50 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1ce60 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1ce70 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1ce80 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1ce90 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1cea0 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1ceb0 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1cec0 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1ced0 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1cee0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1cef0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1cf00 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1cf10 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1cf20 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1cf30 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1cf40 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1cf50 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1cf60 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1cf70 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1cf80 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1cf90 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
1cfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1cfb0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1cfc0 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1cfd0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1cfe0 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1cff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1d000 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1d010 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1d020 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1d030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d040 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d050 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d060 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1d070 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1d080 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1d090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1d0a0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1d0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d0c0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1d0d0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1d0e0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1d0f0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1d100 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1d110 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d120 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1d130 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1d140 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1d150 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1d160 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1d170 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1d180 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1d190 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1d1a0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1d1b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d1c0 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1d1d0 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1d200 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1d210 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1d220 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1d230 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d250 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1d260 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1d270 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  n */.  u16 mNoOm
1d280 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  it;..  assert( (
1d290 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61  mPrereq & mUnusa
1d2a0 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1d2b0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1d2c0 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1d2d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1d2e0 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1d2f0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1d300 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1d310 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1d320 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1d330 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1d340 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1d350 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1d360 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1d370 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1d380 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1d390 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
1d3a0 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
1d3b0 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69    &mNoOmit);.  i
1d3c0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1d3d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1d3e0 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  PT;.  pNew->rSet
1d3f0 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1d400 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1d410 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
1d420 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1d430 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1d440 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1d450 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1d460 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
1d470 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
1d480 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  size(pParse->db,
1d490 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
1d4a0 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
1d4b0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1d4c0 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74  >db, p);.    ret
1d4d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1d4e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1d4f0 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73   First call xBes
1d500 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1d510 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  l constraints us
1d520 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45  able. */.  WHERE
1d530 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1d540 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1d550 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72  usable\n"));.  r
1d560 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d570 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c  VirtualOne(pBuil
1d580 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c  der, mPrereq, AL
1d590 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f  LBITS, 0, p, mNo
1d5a0 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20  Omit, &bIn);..  
1d5b0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  /* If the call t
1d5c0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  o xBestIndex() w
1d5d0 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e  ith all terms en
1d5e0 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61  abled produced a
1d5f0 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20   plan.  ** that 
1d600 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1d610 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c   any source tabl
1d620 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20  es (IOW: a plan 
1d630 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a  with mBest==0),.
1d640 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1d650 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d  is no point in m
1d660 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65  aking any furthe
1d670 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  r calls to xBest
1d680 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69  Index() .  ** si
1d690 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  nce they will al
1d6a0 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  l return the sam
1d6b0 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65  e result (if the
1d6c0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20   xBestIndex().  
1d6d0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1d6e0 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20  n is sane). */. 
1d6f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d700 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28  OK && (mBest = (
1d710 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1d720 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a  mPrereq))!=0 ){.
1d730 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1d740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d750 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
1d760 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1d770 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  eqs seen */.    
1d780 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  int seenZeroNoIN
1d790 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1d7a0 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72   Plan with no pr
1d7b0 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28  ereqs and no IN(
1d7c0 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ...) seen */.   
1d7d0 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d   Bitmask mPrev =
1d7e0 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   0;.    Bitmask 
1d7f0 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a  mBestNoIn = 0;..
1d800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c      /* If the pl
1d810 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74  an produced by t
1d820 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  he earlier call 
1d830 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1d840 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a  term, call.    *
1d850 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61  * xBestIndex aga
1d860 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69  in, this time wi
1d870 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73  th IN(...) terms
1d880 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
1d890 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20    if( bIn ){.   
1d8a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1d8b0 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1d8c0 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77  ne: all usable w
1d8d0 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20  /o IN\n"));.    
1d8e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d8f0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1d900 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1d910 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42  r, mPrereq, ALLB
1d920 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d  ITS, WO_IN, p, m
1d930 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20  NoOmit, &bIn);. 
1d940 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e       assert( bIn
1d950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65  ==0 );.      mBe
1d960 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70  stNoIn = pNew->p
1d970 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1d980 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73  ;.      if( mBes
1d990 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  tNoIn==0 ){.    
1d9a0 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31      seenZero = 1
1d9b0 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  ;.        seenZe
1d9c0 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1d9d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d9e0 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  * Call xBestInde
1d9f0 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  x once for each 
1da00 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f  distinct value o
1da10 66 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26  f (prereqRight &
1da20 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20   ~mPrereq) .    
1da30 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  ** in the set of
1da40 20 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c   terms that appl
1da50 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
1da60 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1da70 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72   */.    while( r
1da80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1da90 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1daa0 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74     Bitmask mNext
1dab0 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20   = ALLBITS;.    
1dac0 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e    assert( mNext>
1dad0 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
1dae0 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1daf0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1db00 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d   Bitmask mThis =
1db10 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   (.            p
1db20 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72  WC->a[p->aConstr
1db30 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
1db40 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74  set].prereqRight
1db50 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20   & ~mPrereq.    
1db60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1db70 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26  f( mThis>mPrev &
1db80 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20  & mThis<mNext ) 
1db90 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20  mNext = mThis;. 
1dba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72       }.      mPr
1dbb0 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20  ev = mNext;.    
1dbc0 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c    if( mNext==ALL
1dbd0 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20  BITS ) break;.  
1dbe0 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d      if( mNext==m
1dbf0 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d  Best || mNext==m
1dc00 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69  BestNoIn ) conti
1dc10 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45  nue;.      WHERE
1dc20 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1dc30 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65  VirtualOne: mPre
1dc40 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25  v=%04llx mNext=%
1dc50 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  04llx\n",.      
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1dc80 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33  )mPrev, (sqlite3
1dc90 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b  _uint64)mNext));
1dca0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1dcb0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1dcc0 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1dcd0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1dce0 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20   mNext|mPrereq, 
1dcf0 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  0, p, mNoOmit, &
1dd00 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1dd10 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50  pNew->prereq==mP
1dd20 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20  rereq ){.       
1dd30 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20   seenZero = 1;. 
1dd40 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d         if( bIn==
1dd50 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1dd60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1dd70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1dd80 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  he calls to xBes
1dd90 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20  tIndex() in the 
1dda0 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e  above loop did n
1ddb0 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  ot find a plan. 
1ddc0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1ddd0 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1dde0 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65  bles at all (i.e
1ddf0 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64  . one guaranteed
1de00 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73   to be.    ** us
1de10 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61  able), make a ca
1de20 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c  ll here with all
1de30 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64   source tables d
1de40 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69  isabled */.    i
1de50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1de60 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20   && seenZero==0 
1de70 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1de80 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1de90 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1dea0 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20  sabled\n"));.   
1deb0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1dec0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1ded0 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1dee0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1def0 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  ereq, 0, p, mNoO
1df00 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1df10 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1df20 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1df30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1df40 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78  f the calls to x
1df50 42 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65  BestIndex() have
1df60 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74   so far failed t
1df70 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  o find a plan.  
1df80 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1df90 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1dfa0 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64  les at all and d
1dfb0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49  oes not use an I
1dfc0 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70  N(...).    ** op
1dfd0 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66  erator, make a f
1dfe0 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74  inal call to obt
1dff0 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a  ain one here.  *
1e000 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1e010 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a  LITE_OK && seenZ
1e020 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20  eroNoIN==0 ){.  
1e030 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1e040 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1e050 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1e060 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29  d and w/o IN\n")
1e070 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1e080 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1e090 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1e0a0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1e0b0 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49  q, mPrereq, WO_I
1e0c0 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  N, p, mNoOmit, &
1e0d0 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bIn);.    }.  }.
1e0e0 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f  .  if( p->needTo
1e0f0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1e100 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
1e110 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
1e120 62 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e  bFreeNN(pParse->
1e130 64 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  db, p);.  return
1e140 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1e150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e160 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
1e170 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
1e180 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
1e190 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
1e1a0 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
1e1b0 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
1e1c0 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
1e1d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e1e0 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a  whereLoopAddOr(.
1e1f0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1e200 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20  er *pBuilder, . 
1e210 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1e220 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1e230 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1e240 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1e250 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1e260 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1e270 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1e280 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1e290 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1e2a0 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1e2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1e2c0 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1e2d0 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1e2e0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1e2f0 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1e300 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1e310 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1e320 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e330 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1e340 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1e350 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1e360 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1e370 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1e380 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1e390 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1e3a0 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1e3b0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1e3c0 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1e3d0 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1e3e0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1e3f0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1e400 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1e410 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1e420 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1e430 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1e440 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1e450 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1e460 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1e470 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1e480 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1e490 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1e4a0 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1e4b0 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1e4c0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1e4d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1e4e0 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1e4f0 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1e500 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1e510 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1e520 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1e530 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1e540 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1e550 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1e560 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1e570 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1e580 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1e590 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1e5a0 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1e5b0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1e5c0 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1e5d0 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1e5e0 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1e5f0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1e600 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1e610 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1e620 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1e630 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1e640 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1e650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e660 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1e670 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1e680 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1e690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1e6a0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1e6b0 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1e6c0 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1e6d0 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1e6e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1e6f0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1e700 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1e710 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1e720 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1e730 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1e740 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1e750 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1e760 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1e770 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1e780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e790 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1e7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1e7b0 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1e7c0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1e7d0 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1e7e0 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1e7f0 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1e800 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1e810 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1e820 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1e830 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1e840 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1e850 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1e860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e870 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1e880 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1e890 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1e8a0 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53  reClausePrint(sS
1e8b0 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20  ubBuild.pWC);.  
1e8c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1e8d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e8e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1e8f0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1e900 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1e910 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1e920 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1e930 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1e940 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  ild, mPrereq, mU
1e950 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1e960 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1e970 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1e980 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1e990 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
1e9a0 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a  uild, mPrereq);.
1e9b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e9c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e9e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e9f0 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c  ddOr(&sSubBuild,
1ea00 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1ea10 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1ea20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ea30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1ea40 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1ea50 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1ea60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1ea70 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1ea80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ea90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1eaa0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1eab0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1eac0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1ead0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1eae0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1eaf0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1eb00 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1eb10 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1eb20 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1eb30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1eb40 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1eb50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1eb60 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1eb70 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1eb80 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1eba0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1ebb0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1ebc0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1ebd0 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1ec00 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1ec10 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1ec20 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1ec50 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1ec60 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1ec70 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ec90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1eca0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1ecb0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1ecc0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1ecd0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1ece0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1ecf0 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1ed00 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1ed10 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1ed20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1ed30 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1ed40 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1ed50 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1ed60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1ed70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ed80 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1ed90 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1eda0 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1edb0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1edc0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1edd0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1ede0 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1edf0 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1ee00 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1ee10 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1ee20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1ee30 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1ee40 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1ee50 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1ee60 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1ee70 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1ee80 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1ee90 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1eea0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1eeb0 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1eec0 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1eed0 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1eee0 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1eef0 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1ef00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1ef10 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1ef20 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1ef30 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1ef40 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1ef50 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1ef60 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1ef70 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1ef80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ef90 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1efa0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1efb0 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1efc0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1efd0 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1efe0 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1eff0 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1f000 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1f010 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1f020 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1f030 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1f040 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1f050 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1f060 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1f070 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1f080 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1f090 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1f0a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1f0b0 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1f0c0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1f0d0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1f0e0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1f0f0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1f100 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1f110 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1f120 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1f130 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1f140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f150 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f160 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1f170 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1f180 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1f190 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1f1a0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1f1b0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1f1c0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1f1d0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1f1e0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1f1f0 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1f200 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
1f210 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
1f220 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
1f230 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
1f240 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
1f250 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f260 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f270 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f280 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61  tem *pEnd = &pTa
1f290 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d  bList->a[pWInfo-
1f2a0 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69  >nLevel];.  sqli
1f2b0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
1f2c0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1f2d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f2e0 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  OK;.  WhereLoop 
1f2f0 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f  *pNew;.  u8 prio
1f300 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a  rJointype = 0;..
1f310 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
1f320 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
1f330 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
1f340 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
1f350 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1f360 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
1f370 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
1f380 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
1f390 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49  =pTabList->a; pI
1f3a0 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b  tem<pEnd; iTab++
1f3b0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f3c0 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1f3d0 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  e = 0;.    pNew-
1f3e0 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  >iTab = iTab;.  
1f3f0 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66    pNew->maskSelf
1f400 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
1f410 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1f420 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
1f430 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
1f440 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  f( ((pItem->fg.j
1f450 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
1f460 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  ntype) & (JT_LEF
1f470 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
1f480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1f490 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
1f4a0 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73  ue when pItem is
1f4b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f4c0 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20   term on the.   
1f4d0 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64     ** right-hand
1f4e0 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20  -side of a LEFT 
1f4f0 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20  or CROSS JOIN.  
1f500 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71  */.      mPrereq
1f510 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
1f520 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79  .    priorJointy
1f530 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a  pe = pItem->fg.j
1f540 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66  ointype;.#ifndef
1f550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1f560 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
1f570 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1f580 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1f590 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f5a0 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  _item *p;.      
1f5b0 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b  for(p=&pItem[1];
1f5c0 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
1f5d0 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73         if( mUnus
1f5e0 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a  able || (p->fg.j
1f5f0 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
1f600 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b  FT|JT_CROSS)) ){
1f610 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73  .          mUnus
1f620 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57  able |= sqlite3W
1f630 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1f640 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1f650 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1f660 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f670 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1f680 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
1f690 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1f6a0 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1f6b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1f6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1f6d0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  UALTABLE */.    
1f6e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1f6f0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
1f700 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1f710 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1f740 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1f750 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1f760 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1f770 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1f780 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1f790 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1f7a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f7b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1f7c0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1f7d0 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1f7e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1f7f0 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1f800 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1f810 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1f820 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1f830 68 65 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 6th.** parame
1f840 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1f850 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1f860 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1f870 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1f880 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1f890 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1f8a0 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1f8b0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1f8c0 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1f8d0 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1f8e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1f8f0 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1f900 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1f910 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1f920 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1f930 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1f940 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1f950 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
1f960 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
1f970 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
1f980 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
1f990 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
1f9a0 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
1f9b0 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
1f9c0 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
1f9d0 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
1f9e0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1f9f0 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
1fa00 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
1fa10 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
1fa20 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
1fa30 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
1fa40 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
1fa50 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
1fa60 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
1fa70 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
1fa80 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
1fa90 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
1faa0 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
1fab0 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1fac0 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1fad0 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
1fae0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1faf0 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
1fb00 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
1fb10 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
1fb20 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
1fb30 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
1fb40 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
1fb50 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
1fb60 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
1fb70 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
1fb80 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
1fb90 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1fba0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
1fbb0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
1fbc0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1fbd0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1fbe0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
1fbf0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
1fc00 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
1fc10 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
1fc20 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
1fc30 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
1fc40 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
1fc50 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
1fc60 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1fc70 20 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55     /* WHERE_GROU
1fc80 50 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54  PBY or _DISTINCT
1fc90 42 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c  BY or _ORDERBY_L
1fca0 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  IMIT */.  u16 nL
1fcb0 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1fcc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1fcd0 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1fce0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1fcf0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1fd00 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1fd10 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1fd20 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1fd30 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1fd40 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1fd50 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1fd60 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1fd70 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1fd80 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1fd90 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1fda0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1fdb0 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1fdc0 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1fdd0 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1fde0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1fdf0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1fe00 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1fe10 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1fe20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1fe30 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1fe40 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1fe50 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1fe60 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1fe70 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1fe80 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1fe90 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1fea0 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1feb0 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1fec0 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1fed0 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1fee0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1fef0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1ff00 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20   eqOpMask;      
1ff10 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71     /* Allowed eq
1ff20 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73  uality operators
1ff30 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
1ff40 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
1ff50 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
1ff60 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
1ff70 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
1ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1ff90 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
1ffa0 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
1ffb0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
1ffc0 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
1ffd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
1ffe0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
1fff0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
20000 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
20010 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20020 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
20030 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
20040 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
20050 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
20060 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20070 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20090 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
200a0 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
200b0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
200c0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
200d0 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
200e0 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
200f0 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
20100 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
20110 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
20120 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
20130 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
20140 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
20150 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
20160 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
20170 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
20180 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
20190 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
201a0 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
201b0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
201c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
201d0 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
201e0 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
201f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20200 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
20210 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
20220 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
20230 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
20240 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
20250 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
20260 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
20270 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20280 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
20290 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
202a0 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
202b0 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
202c0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
202d0 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
202e0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
202f0 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
20300 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
20310 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
20320 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
20330 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
20340 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
20350 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
20360 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20370 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
20380 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
20390 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
203a0 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
203b0 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
203c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
203d0 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
203e0 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
203f0 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
20400 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
20410 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
20420 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
20430 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
20440 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
20450 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
20460 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
20470 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
20480 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
20490 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
204a0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
204b0 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
204c0 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
204d0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
204e0 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
204f0 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
20500 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
20510 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
20520 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
20530 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
20540 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
20550 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
20560 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
20570 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
20580 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
20590 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
205a0 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
205b0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
205c0 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
205d0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
205e0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
205f0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
20600 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
20610 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
20620 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
20630 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
20640 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
20650 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
20660 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
20670 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
20680 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
20690 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
206a0 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
206b0 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
206c0 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
206d0 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
206e0 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
206f0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
20700 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
20710 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
20720 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
20730 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
20740 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
20750 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
20760 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
20770 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
20780 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
20790 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
207a0 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
207b0 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
207c0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
207d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
207e0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
207f0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
20800 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
20810 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
20820 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
20830 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
20840 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
20850 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
20860 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
20870 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
20880 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
20890 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
208a0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
208b0 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
208c0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
208d0 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
208e0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
208f0 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
20900 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
20910 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
20920 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
20930 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
20940 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
20950 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
20960 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
20970 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20  = 0;.  eqOpMask 
20980 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20  = WO_EQ | WO_IS 
20990 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69  | WO_ISNULL;.  i
209a0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
209b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
209c0 4d 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c  MIT ) eqOpMask |
209d0 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69  = WO_IN;.  for(i
209e0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
209f0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
20a00 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
20a10 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
20a20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
20a30 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
20a40 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
20a50 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f     if( iLoop<nLo
20a60 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  op ){.      pLoo
20a70 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p = pPath->aLoop
20a80 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69  [iLoop];.      i
20a90 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
20aa0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
20ab0 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  MIT ) continue;.
20ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ad0 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a   pLoop = pLast;.
20ae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
20af0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
20b00 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
20b10 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
20b20 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
20b30 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
20b40 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
20b50 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
20b60 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
20b70 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20  btree.nIdxCol = 
20b80 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75  0;.    }.    iCu
20b90 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
20ba0 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
20bb0 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20  Tab].iCursor;.. 
20bc0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
20bd0 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ny ORDER BY term
20be0 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c   X that is a col
20bf0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
20c00 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
20c10 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20  urrent loop for 
20c20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74  which there is t
20c30 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
20c40 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f  .    ** clause o
20c50 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20  f the form X IS 
20c60 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74  NULL or X=? that
20c70 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
20c80 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  outer.    ** loo
20c90 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ps..    */.    f
20ca0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
20cb0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
20cc0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
20cd0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
20ce0 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72  e;.      pOBExpr
20cf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
20d00 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
20d10 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
20d20 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
20d30 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
20d40 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
20d50 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
20d60 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
20d70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20d80 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
20d90 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57  hereFindTerm(&pW
20da0 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c  Info->sWC, iCur,
20db0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
20dc0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
20dd0 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79            ~ready
20de0 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a  , eqOpMask, 0);.
20df0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
20e00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
20e10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
20e20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
20e30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
20e40 4e 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79  N terms are only
20e50 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69   valid for sorti
20e60 6e 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ng in the ORDER 
20e70 42 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20  BY LIMIT .      
20e80 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
20e90 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79  n, and then only
20ea0 20 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74   if they are act
20eb0 75 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20  ually used.     
20ec0 20 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65     ** by the que
20ed0 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20  ry plan */.     
20ee0 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
20ef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
20f00 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20  DERBY_LIMIT );. 
20f10 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
20f20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  j<pLoop->nLTerm 
20f30 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d  && pTerm!=pLoop-
20f40 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29  >aLTerm[j]; j++)
20f50 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  {}.        if( j
20f60 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  >=pLoop->nLTerm 
20f70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20f80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
20f90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
20fa0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d  (WO_EQ|WO_IS))!=
20fb0 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
20fc0 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
20fd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20fe0 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28  xprCollSeqMatch(
20ff0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
21000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21010 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
21020 5d 2e 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e  ].pExpr, pTerm->
21030 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pExpr)==0 ){.   
21040 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21060 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
21070 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
21080 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a  K_IS );.      }.
21090 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
210a0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
210b0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
210c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
210d0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
210e0 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
210f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21100 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
21110 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
21120 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
21130 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
21140 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
21150 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
21160 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
21170 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
21180 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
21190 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
211a0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
211b0 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
211c0 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
211d0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
211e0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
211f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
21200 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
21210 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
21220 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
21230 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
21240 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
21250 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
21260 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44  umn-1]==XN_ROWID
21270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21280 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48             || !H
21290 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
212a0 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
212b0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
212c0 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65  t = IsUniqueInde
212d0 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  x(pIndex);.     
212e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
212f0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
21300 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
21310 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
21320 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
21330 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
21340 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
21350 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
21360 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
21370 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
21380 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
21390 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
213a0 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
213b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
213c0 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72  bOnce = 1; /* Tr
213d0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
213e0 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
213f0 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61  op */..        a
21400 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d  ssert( j>=pLoop-
21410 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20  >u.btree.nEq .  
21420 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
21430 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d  oop->aLTerm[j]==
21440 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53  0)==(j<pLoop->nS
21450 6b 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  kip).        );.
21460 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
21470 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
21480 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53   && j>=pLoop->nS
21490 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
214a0 20 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70   u16 eOp = pLoop
214b0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
214c0 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20  erator;..       
214d0 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
214e0 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53  == and IS and IS
214f0 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c  NULL terms.  (Al
21500 73 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73  so skip IN terms
21510 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   when.          
21520 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f  ** doing WHERE_O
21530 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f  RDERBY_LIMIT pro
21540 63 65 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20  cessing). .     
21550 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
21560 20 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72    ** If the curr
21570 65 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f  ent term is a co
21580 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f  lumn of an ((?,?
21590 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29  ) IN (SELECT...)
215a0 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
215b0 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77  expression for w
215c0 68 69 63 68 20 74 68 65 20 53 45 4c 45 43 54 20  hich the SELECT 
215d0 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
215e0 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20  n one column,.  
215f0 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b          ** check
21600 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
21610 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64  only column used
21620 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f   by this loop. O
21630 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
21640 20 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20      ** if it is 
21650 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  one of two or mo
21660 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  re, none of the 
21670 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20  columns can be. 
21680 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
21690 69 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20  idered to match 
216a0 61 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  an ORDER BY term
216b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
216c0 69 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d  if( (eOp & eqOpM
216d0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
216e0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
216f0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
21700 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21710 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
21720 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
21730 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
21740 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
21750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21760 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
21770 20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73   .          }els
21780 65 20 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70  e if( ALWAYS(eOp
21790 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20   & WO_IN) ){.   
217a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41           /* ALWA
217b0 59 53 28 29 20 6a 75 73 74 69 66 69 63 61 74 69  YS() justificati
217c0 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71  on: eOp is an eq
217d0 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20  uality operator 
217e0 64 75 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20  due to the.     
217f0 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f         ** j<pLoo
21800 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63  p->u.btree.nEq c
21810 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e  onstraint above.
21820 20 20 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f    Any equality o
21830 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
21840 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69   ** than WO_IN i
21850 73 20 63 61 70 74 75 72 65 64 20 62 79 20 74 68  s captured by th
21860 65 20 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e  e previous "if".
21870 20 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20    So this one.  
21880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
21890 61 79 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f  ays has to be WO
218a0 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  _IN. */.        
218b0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
218c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
218d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
218e0 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69      for(i=j+1; i
218f0 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
21900 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nEq; i++){.     
21910 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f           if( pLo
21920 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
21930 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20  Expr==pX ){.    
21940 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21950 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt( (pLoop->aLTe
21960 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[i]->eOperator
21970 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20   & WO_IN) );.   
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e               bOn
21990 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
219a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
219c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
219d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
219e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
219f0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
21a00 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
21a10 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
21a20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
21a30 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
21a40 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
21a50 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
21a60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21a70 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29      if( pIndex )
21a80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
21a90 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
21aa0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
21ab0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49       revIdx = pI
21ac0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
21ad0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
21ae0 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  f( iColumn==pInd
21af0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ex->pTable->iPKe
21b00 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e  y ) iColumn = XN
21b10 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
21b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21b30 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
21b40 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
21b50 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
21b60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
21b70 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
21b80 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
21b90 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
21ba0 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
21bb0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
21bc0 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
21bd0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
21be0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
21bf0 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
21c00 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
21c10 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
21c20 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
21c30 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
21c40 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
21c50 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
21c60 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
21c70 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
21c80 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
21c90 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
21ca0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
21cb0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
21cc0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
21cd0 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
21ce0 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
21cf0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
21d00 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
21d10 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
21d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21d30 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
21d40 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
21d50 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
21d60 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
21d70 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
21d80 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
21d90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21da0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
21db0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
21dc0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
21dd0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
21de0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
21df0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21e00 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
21e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21e20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21e30 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
21e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
21e50 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
21e60 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
21e70 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
21e80 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
21e90 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
21ea0 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b  umn>=XN_ROWID ){
21eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21ec0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
21ed0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
21ee0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
21ef0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
21f00 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
21f10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
21f20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
21f30 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
21f40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21f60 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
21f70 49 64 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78  IdxExpr = pIndex
21f80 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
21f90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
21fa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21fb0 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70  xprCompareSkip(p
21fc0 4f 42 45 78 70 72 2c 20 70 49 64 78 45 78 70 72  OBExpr, pIdxExpr
21fd0 2c 20 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20  , iCur) ){.     
21fe0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21ff0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
22000 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22010 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
22020 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn!=XN_ROWID ){.
22030 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22040 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
22050 4e 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  NCollSeq(pWInfo-
22060 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
22070 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
22080 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22090 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
220a0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
220b0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
220c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
220d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
220e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
220f0 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b  ree.nIdxCol = j+
22100 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d  1;.          isM
22110 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
22120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
22140 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
22150 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22160 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
22170 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
22180 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
22190 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
221a0 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
221b0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
221c0 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
221d0 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
221e0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
221f0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
22200 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
22210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
22220 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
22230 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
22240 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
22250 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
22260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22270 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
22280 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
22290 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
222a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
222b0 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
222c0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
222d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
222e0 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
222f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22300 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
22310 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
22320 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
22330 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
22340 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22350 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
22360 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
22370 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
22380 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
22390 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
223a0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
223b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
223c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
223d0 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
223e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
223f0 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c  ==0 || j<nKeyCol
22400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22410 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
22420 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
22430 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
22440 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
22450 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22460 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
22480 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
22490 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
224a0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
224b0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
224c0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
224d0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
224e0 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
224f0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
22500 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
22510 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
22520 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
22530 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
22540 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
22550 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
22560 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
22570 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
22580 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
22590 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
225a0 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
225b0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
225c0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
225d0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
225e0 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
225f0 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b    Bitmask mTerm;
22600 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
22610 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
22620 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22630 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
22640 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
22650 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71        mTerm = sq
22660 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
22670 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
22680 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20  skSet,p);.      
22690 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26    if( mTerm==0 &
226a0 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
226b0 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f  Constant(p) ) co
226c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
226d0 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65  if( (mTerm&~orde
226e0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
226f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
22700 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
22710 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
22720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
22730 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
22740 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
22750 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
22760 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
22770 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
22780 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
22790 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65  return (i8)nOrde
227a0 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  rBy;.  if( !isOr
227b0 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
227c0 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42     for(i=nOrderB
227d0 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  y-1; i>0; i--){.
227e0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
227f0 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31  = MASKBIT(i) - 1
22800 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53  ;.      if( (obS
22810 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72  at&m)==m ) retur
22820 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n i;.    }.    r
22830 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
22840 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  eturn -1;.}.../*
22850 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
22860 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
22870 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b   set in the mask
22880 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
22890 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a  e3WhereBegin(),.
228a0 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61  ** the planner a
228b0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
228c0 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72  specified pOrder
228d0 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61  By list is actua
228e0 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42  lly a GROUP.** B
228f0 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73  Y clause - and s
22900 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74  o any order that
22910 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20   groups rows as 
22920 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69  required satisfi
22930 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  es the.** reques
22940 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  t..**.** Normall
22950 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  y, in this case 
22960 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
22970 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65  le for the calle
22980 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  r to determine.*
22990 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
229a0 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65   the rows are re
229b0 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76  ally being deliv
229c0 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f  ered in sorted o
229d0 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74  rder, or.** just
229e0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   in some other o
229f0 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64  rder that provid
22a00 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
22a10 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65  grouping. Howeve
22a20 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  r,.** if the WHE
22a30 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66  RE_SORTBYGROUP f
22a40 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73  lag is also pass
22a50 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
22a60 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a  reBegin(), then.
22a70 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
22a80 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f   may be called o
22a90 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  n the returned W
22aa0 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  hereInfo object.
22ab0 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
22ac0 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20  rue if the rows 
22ad0 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73  really will be s
22ae0 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65  orted in the spe
22af0 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72  cified order, or
22b00 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77   false.** otherw
22b10 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ise..**.** For e
22b20 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
22b30 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
22b40 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
22b50 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  x, Y);.**.** the
22b60 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  n.**.**   SELECT
22b70 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
22b80 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59   BY x,y ORDER BY
22b90 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72   x,y;   -- IsSor
22ba0 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45  ted()==1.**   SE
22bb0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
22bc0 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45  ROUP BY y,x ORDE
22bd0 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49  R BY y,x;   -- I
22be0 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a  sSorted()==0.*/.
22bf0 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
22c00 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e  IsSorted(WhereIn
22c10 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61  fo *pWInfo){.  a
22c20 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
22c30 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22c40 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61  E_GROUPBY );.  a
22c50 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
22c60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22c70 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b  E_SORTBYGROUP );
22c80 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
22c90 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66  ->sorted;.}..#if
22ca0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
22cb0 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
22cc0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
22cd0 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
22ce0 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
22cf0 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
22d00 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
22d10 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
22d20 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
22d30 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
22d40 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22d50 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
22d60 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
22d70 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
22d80 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
22d90 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
22da0 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
22db0 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
22dc0 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
22dd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
22de0 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  rn the cost of s
22df0 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73  orting nRow rows
22e00 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
22e10 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a  the keys have .*
22e20 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d  * nOrderby colum
22e30 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ns and that the 
22e40 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f  first nSorted co
22e50 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64  lumns are alread
22e60 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a  y in.** order..*
22e70 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
22e80 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
22e90 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
22ea0 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20  WInfo,.  LogEst 
22eb0 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64  nRow,.  int nOrd
22ec0 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72  erBy,.  int nSor
22ed0 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49  ted.){.  /* TUNI
22ee0 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
22ef0 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74  st of a full ext
22f00 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72  ernal sort, wher
22f10 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65  e N is .  ** the
22f20 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
22f30 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a  to sort is:.  **
22f40 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
22f50 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
22f60 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72  )..  ** .  ** Or
22f70 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62  , if the order-b
22f80 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74  y clause has X t
22f90 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68  erms but only th
22fa0 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74  e last Y .  ** t
22fb0 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20  erms are out of 
22fc0 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63  order, then bloc
22fd0 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72  k-sorting will r
22fe0 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20  educe the .  ** 
22ff0 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a  sorting cost to:
23000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
23010 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
23020 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20  og(N)) * (Y/X). 
23030 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f   **.  ** The (Y/
23040 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65  X) term is imple
23050 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61  mented using sta
23060 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61  ck variable rSca
23070 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20  le.  ** below.  
23080 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61  */.  LogEst rSca
23090 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20  le, rSortCost;. 
230a0 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
230b0 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74  y>0 && 66==sqlit
230c0 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
230d0 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69  .  rScale = sqli
230e0 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65  te3LogEst((nOrde
230f0 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30  rBy-nSorted)*100
23100 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b  /nOrderBy) - 66;
23110 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e  .  rSortCost = n
23120 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  Row + rScale + 1
23130 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c  6;..  /* Multipl
23140 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72  e by log(M) wher
23150 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e M is the numbe
23160 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
23170 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c  ..  ** Use the L
23180 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74  IMIT for M if it
23190 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   is smaller */. 
231a0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
231b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
231c0 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26  _USE_LIMIT)!=0 &
231d0 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  & pWInfo->iLimit
231e0 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f  <nRow ){.    nRo
231f0 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d  w = pWInfo->iLim
23200 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43  it;.  }.  rSortC
23210 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52  ost += estLog(nR
23220 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53  ow);.  return rS
23230 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
23240 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
23250 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
23260 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
23270 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
23280 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
23290 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
232a0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
232b0 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
232c0 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
232d0 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
232e0 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
232f0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
23300 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
23310 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
23320 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
23330 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
23340 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
23350 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
23360 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
23370 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
23380 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
23390 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
233a0 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
233b0 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
233c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
233d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
233e0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
233f0 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
23400 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
23410 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
23420 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
23430 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
23440 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
23450 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
23460 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
23470 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23480 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
23490 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
234a0 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
234b0 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
234c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
234d0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
234e0 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
234f0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
23500 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23510 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
23520 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23540 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23550 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23580 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
23590 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
235a0 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
235b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
235c0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
235d0 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
235e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
235f0 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
23600 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
23610 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
23620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23630 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
23640 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
23650 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
23660 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23670 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
23680 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
23690 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
236a0 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
236b0 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
236c0 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
236d0 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
236e0 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
236f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23700 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
23710 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
23720 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
23730 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
23740 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
23750 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
23760 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
23770 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
23780 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
23790 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
237a0 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
237b0 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
237c0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
237d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
237e0 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
237f0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
23800 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
23810 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
23820 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
23830 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
23840 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
23850 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
23860 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
23870 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
23880 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
23890 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
238a0 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
238b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
238c0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
238d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
238e0 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
238f0 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
23900 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
23910 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
23920 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
23930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
23940 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
23950 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
23960 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
23970 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
23980 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
23990 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
239a0 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
239b0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
239c0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
239d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
239e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
239f0 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
23a00 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
23a10 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
23a20 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
23a30 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
23a40 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
23a50 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
23a60 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
23a70 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
23a80 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
23a90 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
23aa0 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
23ab0 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
23ac0 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
23ad0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
23ae0 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
23af0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
23b00 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
23b10 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
23b20 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
23b30 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
23b40 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
23b50 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
23b60 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
23b70 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
23b80 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
23b90 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
23ba0 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
23bb0 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
23bc0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
23bd0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
23be0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
23bf0 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
23c00 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
23c10 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
23c20 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
23c30 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
23c40 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
23c50 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
23c60 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
23c70 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
23c80 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
23c90 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
23ca0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
23cb0 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
23cc0 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
23cd0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
23ce0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
23cf0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
23d00 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
23d10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
23d20 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
23d30 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
23d40 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
23d50 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
23d60 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
23d70 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
23d80 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
23d90 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
23da0 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
23db0 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
23dc0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
23dd0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
23de0 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
23df0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
23e00 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
23e10 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57  BKPT;.  aTo = (W
23e20 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
23e30 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
23e40 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
23e50 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
23e60 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
23e70 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
23e80 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
23e90 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
23ea0 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
23eb0 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
23ec0 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
23ed0 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
23ee0 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
23ef0 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
23f00 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
23f10 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
23f20 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
23f30 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
23f40 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
23f50 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
23f60 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
23f70 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
23f80 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
23f90 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
23fa0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
23fb0 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
23fc0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
23fd0 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
23fe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
23ff0 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
24000 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
24010 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
24020 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
24030 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
24040 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
24050 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
24060 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
24070 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
24080 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
24090 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
240a0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
240b0 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
240c0 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
240d0 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
240e0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
240f0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
24100 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
24110 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
24120 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
24130 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
24140 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
24150 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
24160 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
24170 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
24180 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
24190 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
241a0 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
241b0 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
241c0 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
241d0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
241e0 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
241f0 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
24200 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
24210 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
24220 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
24230 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
24240 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
24250 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
24260 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
24270 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
24280 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
24290 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
242a0 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
242b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
242c0 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
242d0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
242e0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
242f0 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
24300 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
24310 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
24320 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
24330 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
24340 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
24350 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
24360 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
24370 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
24380 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
24390 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
243a0 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
243b0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
243c0 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
243d0 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
243e0 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
243f0 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
24400 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
24410 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
24420 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
24430 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
24440 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
24450 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
24460 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
24470 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
24480 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
24490 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
244a0 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
244b0 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
244c0 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
244d0 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
244e0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
244f0 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
24500 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
24510 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
24520 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
24530 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
24540 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
24550 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
24560 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
24570 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
24580 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
24590 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
245a0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
245b0 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
245c0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
245d0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
245e0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
245f0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
24600 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
24610 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
24620 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
24630 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
24640 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
24650 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
24660 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24670 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
24680 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
24690 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
246a0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
246b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
246c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
246d0 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
246e0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
246f0 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
24700 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
24710 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
24720 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
24730 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
24740 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
24750 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
24760 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
24770 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
24780 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
24790 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
247c0 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
247d0 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
247e0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
24800 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
24810 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
24820 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
24830 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
24840 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
24850 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
24860 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
24870 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
24880 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
24890 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
248a0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
248b0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
248c0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
248d0 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d  EX)!=0 && pFrom-
248e0 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20 20  >nRow<10 ){.    
248f0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
24900 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  use an automatic
24910 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68   index if the th
24920 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63  is loop is expec
24930 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
24940 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61   to run less tha
24950 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20  n 2 times. */.  
24960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24970 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
24980 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
24990 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
249a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
249b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
249c0 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64  pWLoop is a cand
249d0 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20  idate to be the 
249e0 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20  next loop. .    
249f0 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69      ** Compute i
24a00 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20  ts cost */.     
24a10 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
24a20 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
24a30 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
24a40 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
24a50 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
24a60 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
24a70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
24a80 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f  (rUnsorted, pFro
24a90 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20  m->rUnsorted);. 
24aa0 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46         nOut = pF
24ab0 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
24ac0 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
24ad0 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f    maskNew = pFro
24ae0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
24af0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
24b00 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
24b10 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20  dered<0 ){.     
24b20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
24b30 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
24b40 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
24b50 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
24b60 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
24b70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
24b80 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  m, pWInfo->wctrl
24b90 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c                iL
24bb0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65  oop, pWLoop, &re
24bc0 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  vMask);.        
24bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24be0 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
24bf0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
24c00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24c10 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26   isOrdered>=0 &&
24c20 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65   isOrdered<nOrde
24c30 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
24c40 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69   if( aSortCost[i
24c50 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a  sOrdered]==0 ){.
24c60 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
24c70 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
24c80 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43   = whereSortingC
24c90 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  ost(.           
24ca0 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f       pWInfo, nRo
24cb0 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20  wEst, nOrderBy, 
24cc0 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
24cd0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
24cf0 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
24d00 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
24d10 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  d, aSortCost[isO
24d20 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20  rdered]);..     
24d30 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24d40 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20  0x002,.         
24d50 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74       ("---- sort
24d60 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25   cost=%-3d (%d/%
24d70 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  d) increases cos
24d80 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22  t %3d to %-3d\n"
24d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24da0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
24db0 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79  ered], (nOrderBy
24dc0 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72  -isOrdered), nOr
24dd0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
24de0 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
24df0 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20  , rCost));.     
24e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24e10 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73      rCost = rUns
24e20 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
24e30 20 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20 32 3b   rUnsorted -= 2;
24e40 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 53 6c    /* TUNING:  Sl
24e50 69 67 68 74 20 62 69 61 73 20 69 6e 20 66 61 76  ight bias in fav
24e60 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20 70 6c  or of no-sort pl
24e70 61 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ans */.        }
24e80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
24e90 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
24ea0 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
24eb0 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f  ded to the set o
24ec0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43  f.        ** mxC
24ed0 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61  hoice best-so-fa
24ee0 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20  r paths..       
24ef0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
24f00 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e  irst look for an
24f10 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61   existing path a
24f20 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  mong best-so-far
24f30 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a   paths.        *
24f40 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68  * that covers th
24f50 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  e same set of lo
24f60 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
24f70 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20  same isOrdered. 
24f80 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e         ** settin
24f90 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74  g as the current
24fa0 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e   path candidate.
24fb0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24fc0 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20      ** The term 
24fd0 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  "((pTo->isOrdere
24fe0 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38  d^isOrdered)&0x8
24ff0 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61  0)==0" is equiva
25000 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  lent.        ** 
25010 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  to (pTo->isOrder
25020 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72  ed==(-1))==(isOr
25030 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f  dered==(-1))" fo
25040 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20  r the range.    
25050 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20      ** of legal 
25060 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64  values for isOrd
25070 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20  ered, -1..64..  
25080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25090 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
250a0 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
250b0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
250c0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
250d0 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
250e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70            && ((p
250f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
25100 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d  Ordered)&0x80)==
25110 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  0.          ){. 
25120 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
25130 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
25140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
25150 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
25160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25170 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
25180 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
25190 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74  one of the exist
251a0 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ing best-so-far 
251b0 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20  paths match the 
251c0 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20  candidate. */.  
251d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
251e0 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20  =mxChoice.      
251f0 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d       && (rCost>m
25200 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d  xCost || (rCost=
25210 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f  =mxCost && rUnso
25220 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64  rted>=mxUnsorted
25230 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
25240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25250 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69  he current candi
25260 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65  date is no bette
25270 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68  r than any of th
25280 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  e mxChoice.     
25290 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20         ** paths 
252a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
252b0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66   best-so-far buf
252c0 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64  fer.  So discard
252d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
252e0 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61  this candidate a
252f0 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f  s not viable. */
25300 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
25310 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25320 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
25330 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25340 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
25350 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25360 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25370 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
25380 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
25390 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
253a0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
253b0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
253c0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
253d0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e  rCost, nOut, rUn
253e0 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  sorted,.        
253f0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
25400 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
25410 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
25420 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
25430 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
25440 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25460 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
25470 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65  his points it me
25480 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77  ans that the new
25490 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a   candidate path.
254a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
254b0 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ds to be added t
254c0 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
254d0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20  t-so-far paths. 
254e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
254f0 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
25500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
25510 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
25520 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
25530 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
25540 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
25550 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
25560 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
25570 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
25580 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
25590 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
255a0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
255b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
255c0 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
255d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
255e0 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
255f0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
25600 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25610 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
25620 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
25630 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
25640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25650 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
25660 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
25670 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  %3d,%3d order=%c
25680 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
25690 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
256a0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
256b0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
256c0 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64   nOut, rUnsorted
256d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
256e0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
256f0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
25700 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
25710 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
25720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25730 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65     /* Control re
25740 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65  aches here if be
25750 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70  st-so-far path p
25760 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72  To=aTo[jj] cover
25770 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
25780 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  ** same set of l
25790 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
257a0 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 20   same isOrdered 
257b0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20  setting as the. 
257c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64           ** cand
257d0 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65  idate path.  Che
257e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
257f0 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
25800 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  d replace.      
25810 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66      ** pTo or if
25820 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
25830 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
25840 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a  ..          ** .
25850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
25860 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69 73 20   conditional is 
25870 61 6e 20 65 78 70 61 6e 64 65 64 20 76 65 63 74  an expanded vect
25880 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 71  or comparison eq
25890 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 20  uivalent to:.   
258a0 20 20 20 20 20 20 20 2a 2a 20 20 20 28 70 54 6f         **   (pTo
258b0 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f  ->rCost,pTo->nRo
258c0 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  w,pTo->rUnsorted
258d0 29 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f 75 74  ) <= (rCost,nOut
258e0 2c 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20  ,rUnsorted).    
258f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25900 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
25910 74 3c 72 43 6f 73 74 20 0a 20 20 20 20 20 20 20  t<rCost .       
25920 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
25930 73 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20 20 20  st==rCost.      
25940 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 6f           && (pTo
25950 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20 20 20  ->nRow<nOut.    
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
25970 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f  | (pTo->nRow==nO
25980 75 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f  ut && pTo->rUnso
25990 72 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65 64 29  rted<=rUnsorted)
259a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
259b0 20 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20     ).           
259c0 20 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 29     ).          )
259d0 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
259e0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
259f0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
25a00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25a10 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25a30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a50 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
25a60 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
25a70 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
25a90 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
25aa0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
25ab0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72  , rCost, nOut, r
25ac0 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20  Unsorted,.      
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
25ae0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
25af0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
25b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25b10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25b20 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
25b30 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
25b40 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
25b60 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
25b70 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
25b80 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
25b90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
25ba0 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f        pTo->rUnso
25bb0 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64  rted, pTo->isOrd
25bc0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
25bd0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25be0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
25bf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
25c00 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
25c10 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
25c20 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
25c30 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
25c40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
25c50 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
25c60 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
25c70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25c80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
25c90 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
25ca0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
25cb0 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
25cc0 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
25cd0 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
25ce0 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
25cf0 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
25d00 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
25d10 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
25d20 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
25d30 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
25d40 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25d50 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25d70 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25d80 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
25d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25da0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
25db0 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
25dc0 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
25dd0 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  %3d,%3d order=%c
25de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25df0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
25e00 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
25e10 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
25e20 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a  Out, rUnsorted,.
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
25e50 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25e60 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
25e70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25e80 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f  ntf("  was %s co
25e90 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
25ea0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
25ec0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
25ed0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
25ee0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
25ef0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
25f00 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74      pTo->rUnsort
25f10 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  ed, pTo->isOrder
25f20 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
25f30 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
25f50 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
25f60 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
25f70 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
25f80 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
25f90 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
25fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
25fb0 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
25fc0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
25fd0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
25fe0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
25ff0 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
26000 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
26010 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
26020 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
26030 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
26040 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72  o->rUnsorted = r
26050 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
26060 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
26070 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
26080 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
26090 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
260a0 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
260b0 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
260c0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
260d0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
260e0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
260f0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
26100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
26110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26120 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
26130 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
26140 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54   mxUnsorted = aT
26150 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
26160 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
26170 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
26180 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
26190 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
261a0 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
261b0 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20  t>mxCost .      
261c0 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e         || (pTo->
261d0 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
261e0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e   pTo->rUnsorted>
261f0 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20  mxUnsorted) .   
26200 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
26210 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
26220 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55               mxU
26240 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72  nsorted = pTo->r
26250 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
26260 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
26270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26290 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
262a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
262b0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
262c0 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
262d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
262e0 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20  ace & 0x02 ){.  
262f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26300 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
26310 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
26320 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
26330 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
26340 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
26350 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
26360 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26370 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
26380 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
26390 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
263a0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
263b0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
263c0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
263d0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
263e0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
263f0 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f  rdered>=0 ? (pTo
26400 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29  ->isOrdered+'0')
26410 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
26420 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
26430 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  red>0 ){.       
26440 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26450 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
26460 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
26470 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
26480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
26490 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
264a0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
264b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
264c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
264d0 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
264e0 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
264f0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
26500 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
26510 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
26520 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
26530 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
26540 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
26550 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
26560 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
26570 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26580 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
26590 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
265a0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
265b0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
265c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
265d0 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
265e0 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
265f0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
26600 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
26610 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
26620 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
26630 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69  = aFrom;.  for(i
26640 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  i=1; ii<nFrom; i
26650 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  i++){.    if( pF
26660 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d  rom->rCost>aFrom
26670 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72  [ii].rCost ) pFr
26680 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b  om = &aFrom[ii];
26690 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
266a0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
266b0 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
266c0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
266d0 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
266e0 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
266f0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
26700 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
26710 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
26720 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
26730 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
26740 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
26750 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
26760 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
26770 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
26780 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
26790 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
267a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
267b0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
267c0 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
267d0 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
267e0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
267f0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
26800 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
26810 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26820 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
26830 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
26840 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
26850 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
26860 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
26870 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
26880 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
26890 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
268a0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
268b0 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
268c0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
268d0 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
268e0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
268f0 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
26900 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
26910 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
26920 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
26930 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74  =pWInfo->pResult
26940 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
26950 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
26960 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
26970 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
26980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
26990 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
269a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
269b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
269c0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
269d0 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
269e0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
269f0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
26a00 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
26a10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
26a20 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
26a30 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
26a40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26a50 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
26a60 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
26a70 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
26a80 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
26a90 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
26aa0 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  op;.      if( pW
26ab0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20  Info->nOBSat<=0 
26ac0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
26ad0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
26ae0 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70         if( nLoop
26af0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
26b00 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46  u32 wsFlags = pF
26b10 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
26b20 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  -1]->wsFlags;.  
26b30 20 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46          if( (wsF
26b40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
26b50 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  ROW)==0 .       
26b60 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26      && (wsFlags&
26b70 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
26b80 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57  _COLUMN_IN))!=(W
26b90 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43  HERE_IPK|WHERE_C
26ba0 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20  OLUMN_IN).      
26bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26bc0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30     Bitmask m = 0
26bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
26be0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
26bf0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
26c00 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
26c10 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
26c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26c30 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
26c40 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
26c50 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
26c60 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
26c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
26c80 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
26c90 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20  & WHERE_IPK );. 
26ca0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
26cb0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
26cc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
26cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26ce0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ( rc==pWInfo->pO
26cf0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
26d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26d10 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49  WInfo->bOrderedI
26d20 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20  nnerLoop = 1;.  
26d30 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
26d40 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b  fo->revMask = m;
26d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26d60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26d70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26d80 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
26d90 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
26da0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
26db0 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
26dc0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
26dd0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
26de0 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e  >nExpr && nLoop>
26df0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  0.    ){.      B
26e00 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
26e10 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
26e20 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
26e30 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
26e40 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
26e50 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
26e60 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
26e70 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
26e80 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
26e90 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29  &revMask.      )
26ea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26eb0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
26ec0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
26ed0 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
26ee0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
26ef0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
26f00 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  ->sorted = 1;.  
26f10 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
26f20 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
26f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26f40 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
26f50 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
26f60 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
26f70 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
26f80 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
26f90 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
26fa0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53  3DbFreeNN(db, pS
26fb0 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
26fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26fd0 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
26fe0 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
26ff0 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
27000 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
27010 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
27020 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
27030 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
27040 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
27050 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
27060 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
27070 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
27080 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
27090 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
270a0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
270b0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
270c0 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
270d0 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
270e0 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
270f0 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
27100 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
27110 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
27120 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
27130 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
27140 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
27150 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
27160 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
27170 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
27180 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
27190 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
271a0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
271b0 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
271c0 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
271d0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
271e0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
271f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
27200 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
27210 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
27220 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
27230 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
27240 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
27250 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
27260 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
27270 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
27280 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
27290 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
272a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
272b0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
272c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
272d0 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65  R_SUBCLAUSE ) re
272e0 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
272f0 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
27300 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
27310 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
27320 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
27330 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
27340 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
27350 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
27360 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
27370 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
27380 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
27390 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
273a0 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
273b0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
273c0 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
273d0 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
273e0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
273f0 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
27400 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74  .  pTerm = sqlit
27410 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
27420 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
27430 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30  , WO_EQ|WO_IS, 0
27440 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
27450 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
27460 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27470 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
27480 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
27490 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
274a0 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
274b0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
274c0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
274d0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
274e0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
274f0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
27500 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
27510 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
27520 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
27530 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
27540 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
27550 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
27560 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
27570 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
27580 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
27590 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
275a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
275b0 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20  nt opMask;.     
275c0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
275d0 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
275e0 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
275f0 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
27600 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20  eIndex(pIdx).   
27610 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
27620 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
27630 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
27640 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
27650 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
27660 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
27670 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70  ntinue;.      op
27680 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69  Mask = pIdx->uni
27690 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45  qNotNull ? (WO_E
276a0 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51  Q|WO_IS) : WO_EQ
276b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
276c0 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
276d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
276e0 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
276f0 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
27700 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70  , iCur, j, 0, op
27710 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
27720 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
27730 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
27740 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
27750 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27760 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
27770 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
27780 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
27790 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
277a0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
277b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
277c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
277d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
277e0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
277f0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
27800 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
27810 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
27820 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  m->colUsed & ~co
27830 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64  lumnsInIndex(pId
27840 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x))==0 ){.      
27850 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
27860 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
27870 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
27880 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
27890 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
278a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
278b0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
278c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
278d0 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20   pIdx;.      /* 
278e0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
278f0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c  a unique index l
27900 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20  ookup is 15 */. 
27910 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e       pLoop->rRun
27920 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73   = 39;  /* 39==s
27930 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29  qlite3LogEst(15)
27940 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
27950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27960 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
27970 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
27980 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a  ut = (LogEst)1;.
27990 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
279a0 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
279b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49  .    assert( pWI
279c0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d  nfo->sMaskSet.n=
279d0 3d 31 20 26 26 20 69 43 75 72 3d 3d 70 57 49 6e  =1 && iCur==pWIn
279e0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69 78 5b  fo->sMaskSet.ix[
279f0 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  0] );.    pLoop-
27a00 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b 20 2f  >maskSelf = 1; /
27a10 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  * sqlite3WhereGe
27a20 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
27a30 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20  MaskSet, iCur); 
27a40 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  */.    pWInfo->a
27a50 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
27a60 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
27a70 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
27a80 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
27a90 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
27aa0 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
27ab0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
27ac0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
27ad0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
27ae0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
27af0 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
27b00 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
27b10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
27b20 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
27b30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27b40 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
27b50 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
27b60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27b70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
27b80 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
27b90 63 74 69 6f 6e 20 66 6f 72 20 65 78 70 72 49 73  ction for exprIs
27ba0 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 29 2e  Deterministic().
27bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
27bc0 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69  xprNodeIsDetermi
27bd0 6e 69 73 74 69 63 28 57 61 6c 6b 65 72 20 2a 70  nistic(Walker *p
27be0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
27bf0 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
27c00 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
27c10 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  ON && ExprHasPro
27c20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
27c30 43 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20 29 7b  ConstFunc)==0 ){
27c40 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
27c50 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
27c60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27c70 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
27c80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
27c90 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
27ca0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27cb0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e 6f 6e   contains no non
27cc0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53  -deterministic S
27cd0 51 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  QL .** functions
27ce0 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65  . Do not conside
27cf0 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  r non-determinis
27d00 74 69 63 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  tic SQL function
27d10 73 20 74 68 61 74 20 61 72 65 20 0a 2a 2a 20 70  s that are .** p
27d20 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63  art of sub-selec
27d30 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  t statements..*/
27d40 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
27d50 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28  IsDeterministic(
27d60 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
27d70 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
27d80 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
27d90 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
27da0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
27db0 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 44  ck = exprNodeIsD
27dc0 65 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a 20 20  eterministic;.  
27dd0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
27de0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
27df0 74 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73 71 6c  tWalkFail;.  sql
27e00 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
27e10 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
27e20 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
27e30 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
27e40 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
27e50 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
27e60 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
27e70 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
27e80 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
27e90 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
27ea0 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
27eb0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
27ec0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
27ed0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
27ee0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
27ef0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
27f00 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
27f10 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
27f20 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
27f30 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
27f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
27f50 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
27f60 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
27f70 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
27f80 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
27f90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
27fa0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
27fb0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
27fc0 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
27fd0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
27fe0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
27ff0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
28000 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
28010 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
28020 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
28030 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
28040 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
28050 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
28060 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
28070 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
28080 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
28090 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
280a0 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
280b0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
280c0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
280d0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
280e0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
280f0 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
28100 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
28110 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
28120 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
28130 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
28140 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
28150 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
28160 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
28170 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
28180 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
28190 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
281a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
281b0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
281c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
281d0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
281e0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
281f0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
28200 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
28210 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
28240 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
28250 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
28270 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
28280 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
28290 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
282a0 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
282b0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
282c0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
282d0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
282e0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
282f0 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
28300 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
28310 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
28320 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
28330 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
28340 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
28350 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
28360 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
28370 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
28380 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
28390 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
283a0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
283b0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
283c0 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
283d0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
283e0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
283f0 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
28400 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
28410 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
28420 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
28430 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
28440 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
28450 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
28460 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
28470 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
28480 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
28490 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
284a0 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
284b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
284c0 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
284d0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
284e0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
284f0 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
28500 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
28510 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
28520 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
28530 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
28540 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
28550 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
28560 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
28570 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
28580 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
28590 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
285a0 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
285b0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
285c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
285d0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
285e0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
285f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
28600 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
28610 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
28620 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
28630 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
28640 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
28650 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
28660 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
28670 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
28680 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
28690 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
286a0 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
286b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
286c0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
286d0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
286e0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
286f0 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
28700 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
28710 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
28720 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
28730 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
28740 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28750 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
28760 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
28770 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
28780 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
28790 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
287a0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
287b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
287c0 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
287d0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
287e0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
287f0 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
28800 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
28810 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
28820 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
28830 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
28840 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28850 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
28860 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
28870 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
28880 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
28890 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
288a0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
288b0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
288c0 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
288d0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
288e0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
288f0 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
28900 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
28910 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
28920 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
28930 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
28940 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
28950 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
28960 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
28970 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
28980 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
28990 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
289a0 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
289b0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
289c0 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
289d0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
289e0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
289f0 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
28a00 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
28a10 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
28a20 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
28a30 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
28a40 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
28a50 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
28a60 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
28a70 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
28a80 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
28a90 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
28aa0 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
28ab0 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
28ac0 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68  BY clause (or th
28ad0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
28ae0 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  e.** if the WHER
28af0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
28b00 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c  s set in wctrlFl
28b10 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54  ags) of a SELECT
28b20 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66   statement.** if
28b30 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
28b40 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
28b50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
28b60 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
28b70 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
28b80 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
28b90 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
28ba0 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79  t, then pOrderBy
28bb0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
28bc0 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61  The iIdxCur para
28bd0 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72  meter is the cur
28be0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
28bf0 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20   index.  If .** 
28c00 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28c10 53 45 20 69 73 20 73 65 74 2c 20 69 49 64 78 43  SE is set, iIdxC
28c20 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
28c30 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
28c40 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f  dex.** to use fo
28c50 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
28c60 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45  essing.  The WHE
28c70 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  RE clause should
28c80 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65   use this.** spe
28c90 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49  cific cursor.  I
28ca0 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  f WHERE_ONEPASS_
28cb0 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20  DESIRED is set, 
28cc0 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a  then iIdxCur is.
28cd0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72  ** the first cur
28ce0 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  sor in an array 
28cf0 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  of cursors for a
28d00 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64  ll indices.  iId
28d10 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  xCur should.** b
28d20 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  e used to comput
28d30 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
28d40 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69  e cursor dependi
28d50 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65  ng on which inde
28d60 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f  x is.** used..*/
28d70 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
28d80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
28d90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
28da0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28db0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
28dc0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
28dd0 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46  bList,      /* F
28de0 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69  ROM clause: A li
28df0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
28e00 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
28e10 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
28e20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
28e30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28e40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
28e50 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
28e60 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20  An ORDER BY (or 
28e70 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65  GROUP BY) clause
28e80 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  , or NULL */.  E
28e90 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74  xprList *pResult
28ea0 53 65 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20  Set,   /* Query 
28eb0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71  result set.  Req
28ec0 27 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  'd for DISTINCT 
28ed0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
28ee0 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
28ef0 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  The WHERE_* flag
28f00 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
28f10 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
28f20 74 20 69 41 75 78 41 72 67 20 20 20 20 20 20 20  t iAuxArg       
28f30 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
28f40 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69  E_OR_SUBCLAUSE i
28f50 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
28f60 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45       ** If WHERE
28f90 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e  _USE_LIMIT, then
28fa0 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e   the limit amoun
28fb0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  t */.){.  int nB
28fc0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
28fd0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
28fe0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
28ff0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
29000 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
29010 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
29020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
29030 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
29040 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
29050 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
29060 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
29070 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
29080 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
29090 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
290a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
290b0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
290c0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
290d0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
290e0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
290f0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
29100 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
29110 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
29120 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
29130 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
29140 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
29150 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
29160 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
29170 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
29180 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
29190 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
291a0 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
291b0 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
291c0 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
291d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
291e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
291f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
29200 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
29210 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
29220 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
29230 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29240 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
29250 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
29260 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
29270 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
29280 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
292a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
292b0 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65  .  u8 bFordelete
292c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
292d0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
292e0 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70  E or zero, as ap
292f0 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20  propriate */..  
29300 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
29310 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
29320 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
29330 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
29340 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29350 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
29360 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
29370 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29380 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
29390 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  ==0 .  ));..  /*
293a0 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45   Only one of WHE
293b0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
293c0 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  or WHERE_USE_LIM
293d0 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  IT */.  assert( 
293e0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
293f0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
29400 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
29410 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20   || (wctrlFlags 
29420 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
29430 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56  T)==0 );..  /* V
29440 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
29450 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
29460 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
29470 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
29480 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
29490 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
294a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
294b0 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
294c0 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
294d0 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
294e0 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
294f0 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
29500 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
29510 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
29520 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
29530 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
29540 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
29550 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
29560 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
29570 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
29580 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
29590 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
295a0 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
295b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
295c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
295d0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
295e0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
295f0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
29600 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
29610 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
29620 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
29630 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
29640 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
29650 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
29660 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
29670 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
29680 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
29690 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
296a0 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
296b0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
296c0 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
296d0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
296e0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
296f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29700 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
29710 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
29720 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
29730 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
29740 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
29750 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
29760 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
29770 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
29780 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
29790 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
297a0 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  the WHERE_OR_SUB
297b0 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73  CLAUSE flag is s
297c0 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
297d0 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
297e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
297f0 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
29800 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
29810 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
29820 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
29830 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
29840 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
29850 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
29860 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
29870 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
29880 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29890 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  USE) ? 1 : pTabL
298a0 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
298b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
298c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
298d0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
298e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
298f0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
29900 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
29910 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
29920 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
29930 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
29940 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
29950 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
29960 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
29970 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
29980 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
29990 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
299a0 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
299b0 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
299c0 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
299d0 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
299e0 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
299f0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
29a00 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
29a10 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
29a20 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
29a30 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
29a40 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
29a50 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
29a60 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
29a70 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
29a80 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
29a90 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
29aa0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
29ab0 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e  wNN(db, nByteWIn
29ac0 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72  fo + sizeof(Wher
29ad0 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64  eLoop));.  if( d
29ae0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
29b00 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
29b10 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
29b20 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
29b30 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
29b40 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
29b50 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
29b60 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
29b70 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
29b80 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
29b90 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
29ba0 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  o->pWhere = pWhe
29bb0 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52  re;.  pWInfo->pR
29bc0 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75  esultSet = pResu
29bd0 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  ltSet;.  pWInfo-
29be0 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
29bf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72   = pWInfo->aiCur
29c00 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b  OnePass[1] = -1;
29c10 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
29c20 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
29c30 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
29c40 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
29c50 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
29c60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
29c70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
29c80 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
29c90 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69  .  pWInfo->iLimi
29ca0 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70  t = iAuxArg;.  p
29cb0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
29cc0 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
29cd0 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d  >nQueryLoop;.  m
29ce0 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e  emset(&pWInfo->n
29cf0 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20  OBSat, 0, .     
29d00 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65      offsetof(Whe
29d10 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66  reInfo,sWC) - of
29d20 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f  fsetof(WhereInfo
29d30 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d  ,nOBSat));.  mem
29d40 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30  set(&pWInfo->a[0
29d50 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65  ], 0, sizeof(Whe
29d60 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74  reLoop)+nTabList
29d70 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
29d80 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el));.  assert( 
29d90 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
29da0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b  ==ONEPASS_OFF );
29db0 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66    /* ONEPASS def
29dc0 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a  aults to OFF */.
29dd0 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
29de0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
29df0 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
29e00 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
29e10 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
29e20 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
29e30 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
29e40 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
29e50 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
29e60 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29e70 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
29e80 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
29e90 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
29ea0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
29eb0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
29ec0 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
29ed0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
29ee0 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
29ef0 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
29f00 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
29f10 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
29f20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
29f30 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
29f40 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
29f50 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
29f60 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
29f70 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
29f80 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e  seInit(&pWInfo->
29f90 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  sWC, pWInfo);.  
29fa0 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69  sqlite3WhereSpli
29fb0 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
29fc0 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
29fd0 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
29fe0 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
29ff0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
2a000 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
2a010 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
2a020 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
2a030 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Sat = pOrderBy->
2a040 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77  nExpr;.    if( w
2a050 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a060 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2a070 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
2a080 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2a090 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2a0a0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  UE;.    }.  }els
2a0b0 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  e{.    /* Assign
2a0c0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2a0d0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2a0e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2a0f0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  M clause..    **
2a100 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  .    ** The N-th
2a110 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2a120 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
2a130 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
2a140 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20  f 1<<N..    **. 
2a150 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f     ** The rule o
2a160 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
2a170 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
2a180 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
2a190 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 20   bitmask for.   
2a1a0 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74   ** a table T, t
2a1b0 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62  hen X-1 is the b
2a1c0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f  itmask for all o
2a1d0 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74  ther tables to t
2a1e0 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20  he left of T..  
2a1f0 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
2a200 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2a210 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2a220 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2a230 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70  in is.    ** imp
2a240 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2a250 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20 20  #3015..    **.  
2a260 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2a270 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2a280 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2a290 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2a2a0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61 62  s in.    ** pTab
2a2b0 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2a2c0 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2a2d0 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2a2e0 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2a2f0 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20      ** equal to 
2a300 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
2a310 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
2a320 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
2a330 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f  e.    ** WHERE_O
2a340 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
2a350 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
2a360 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20 20      ii = 0;.    
2a370 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  do{.      create
2a380 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2a390 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2a3a0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
2a3b0 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
2a3c0 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
2a3d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
2a3e0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
2a3f0 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 69      }while( (++i
2a400 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  i)<pTabList->nSr
2a410 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51  c );.  #ifdef SQ
2a420 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
2a430 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2a440 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  x = 0;.      for
2a450 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2a460 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2a470 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2a480 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
2a490 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
2a4a0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2a4b0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2a4c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d       assert( m>=
2a4d0 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 78  mx );.        mx
2a4e0 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = m;.      }.  
2a4f0 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
2a500 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  .  .  /* Analyze
2a510 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2a520 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2a530 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2a540 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
2a550 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
2a560 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2a570 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2a580 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2a590 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
2a5a0 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d 73  ase: WHERE terms
2a5b0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 66   that do not ref
2a5c0 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73  er to any tables
2a5d0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20 2a   in the join.  *
2a5e0 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  * (constant expr
2a5f0 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75 61  essions). Evalua
2a600 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65 72  te each such ter
2a610 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65 72  m, and jump over
2a620 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67 65   all the.  ** ge
2a630 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66 20  nerated code if 
2a640 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
2a650 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a 20  t true.  .  **. 
2a660 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   ** Do not do th
2a670 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65 73  is if the expres
2a680 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
2a690 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
2a6a0 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74  functions.  ** t
2a6b0 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
2a6c0 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  in a sub-select.
2a6d0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74 72   This is not str
2a6e0 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c 20  ictly required, 
2a6f0 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72 76  but.  ** preserv
2a700 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67 61  es SQLite's lega
2a710 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  cy behaviour in 
2a720 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2a730 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20 20  o cases:.  **.  
2a740 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2a750 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b 20  ERE random()>0; 
2a760 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76 61            -- eva
2a770 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2a780 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20 46  per row.  **   F
2a790 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28 53  ROM ... WHERE (S
2a7a0 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29 3e  ELECT random())>
2a7b0 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64  0;  -- eval rand
2a7c0 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61 6c  om() once overal
2a7d0 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  l.  */.  for(ii=
2a7e0 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
2a7f0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2a800 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 20    WhereTerm *pT 
2a810 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  = &sWLB.pWC->a[i
2a820 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  i];.    if( pT->
2a830 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20  prereqAll==0 && 
2a840 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20  (nTabList==0 || 
2a850 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73  exprIsDeterminis
2a860 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20  tic(pT->pExpr)) 
2a870 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a880 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2a890 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70  se, pT->pExpr, p
2a8a0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
2a8b0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2a8c0 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46  );.      pT->wtF
2a8d0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
2a8e0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
2a8f0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2a900 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2a910 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
2a920 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2a930 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2a940 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2a950 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
2a960 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2a970 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
2a980 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
2a990 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
2a9a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2a9b0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2a9c0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2a9d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2a9e0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2a9f0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
2aa00 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
2aa10 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
2aa20 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
2aa30 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
2aa40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2aa50 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
2aa60 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
2aa70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2aa80 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
2aa90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
2aaa0 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
2aab0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2aac0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
2aad0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
2aae0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2aaf0 65 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66  ereTrace & 0xfff
2ab00 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
2ab10 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a  DebugPrintf("***
2ab20 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
2ab30 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73   *** (wctrlFlags
2ab40 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61  : 0x%x",wctrlFla
2ab50 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74  gs);.    if( wct
2ab60 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ab70 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  USE_LIMIT ){.   
2ab80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ab90 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20  rintf(", limit: 
2aba0 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20  %d", iAuxArg);. 
2abb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2abc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e  DebugPrintf(")\n
2abd0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  ");.  }.  if( sq
2abe0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2abf0 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69  & 0x100 ){ /* Di
2ac00 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20  splay all terms 
2ac10 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2ac20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  use */.    sqlit
2ac30 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
2ac40 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  nt(sWLB.pWC);.  
2ac50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
2ac60 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77  nTabList!=1 || w
2ac70 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57  hereShortCut(&sW
2ac80 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  LB)==0 ){.    rc
2ac90 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
2aca0 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69  ll(&sWLB);.    i
2acb0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
2acc0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2acd0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2ace0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
2acf0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2ad00 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69  race ){    /* Di
2ad10 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
2ad20 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2ad30 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  ts */.      Wher
2ad40 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20  eLoop *p;.      
2ad50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61  int i;.      sta
2ad60 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
2ad70 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34  Label[] = "01234
2ad80 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b  56789abcdefghijk
2ad90 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22  lmnopqrstuvwyxz"
2ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
2add0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
2ade0 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20  RSTUVWYXZ";.    
2adf0 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
2ae00 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20  pLoops, i=0; p; 
2ae10 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  p=p->pNextLoop, 
2ae20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  i++){.        p-
2ae30 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25  >cId = zLabel[i%
2ae40 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2d  (sizeof(zLabel)-
2ae50 31 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65  1)];.        whe
2ae60 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73  reLoopPrint(p, s
2ae70 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  WLB.pWC);.      
2ae80 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
2ae90 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53   .    wherePathS
2aea0 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29  olver(pWInfo, 0)
2aeb0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2aec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2aed0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2aee0 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
2aef0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
2af00 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53        wherePathS
2af10 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57  olver(pWInfo, pW
2af20 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29  Info->nRowOut+1)
2af30 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  ;.       if( db-
2af40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2af50 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2af60 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
2af70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2af80 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62  rderBy==0 && (db
2af90 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2afa0 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d  _ReverseOrder)!=
2afb0 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f  0 ){.     pWInfo
2afc0 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42  ->revMask = ALLB
2afd0 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ITS;.  }.  if( p
2afe0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e  Parse->nErr || N
2aff0 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EVER(db->mallocF
2b000 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f  ailed) ){.    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 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
2b030 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2b040 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
2b050 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
2b060 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2b070 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
2b080 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
2b090 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
2b0a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
2b0b0 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20  OBSat>0 ){.     
2b0c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2b0d0 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64  ntf(" ORDERBY=%d
2b0e0 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f  ,0x%llx", pWInfo
2b0f0 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f  ->nOBSat, pWInfo
2b100 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20  ->revMask);.    
2b110 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57  }.    switch( pW
2b120 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
2b130 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
2b140 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2b150 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
2b160 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b170 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
2b180 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ique");.        
2b190 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2b1a0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2b1b0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2b1c0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2b1d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2b1e0 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72    DISTINCT=order
2b1f0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
2b200 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2b210 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
2b220 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2b230 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2b240 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2b250 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64    DISTINCT=unord
2b260 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
2b270 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2b280 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2b290 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
2b2a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
2b2b0 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   ii<pWInfo->nLev
2b2c0 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  el; ii++){.     
2b2d0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
2b2e0 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
2b2f0 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  Loop, sWLB.pWC);
2b300 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b310 66 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  f..  /* Attempt 
2b320 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
2b330 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
2b340 74 20 64 6f 20 6e 6f 74 20 61 66 66 65 63 74 20  t do not affect 
2b350 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2a  the result..  **
2b360 20 46 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 20   For a table to 
2b370 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72  not affect the r
2b380 65 73 75 6c 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  esult, the follo
2b390 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75  wing must be tru
2b3a0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  e:.  **.  **   1
2b3b0 29 20 54 68 65 20 71 75 65 72 79 20 6d 75 73 74  ) The query must
2b3c0 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
2b3d0 67 61 74 65 2e 0a 20 20 2a 2a 20 20 20 32 29 20  gate..  **   2) 
2b3e0 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  The table must b
2b3f0 65 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 4c  e the RHS of a L
2b400 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20  EFT JOIN..  **  
2b410 20 33 29 20 45 69 74 68 65 72 20 74 68 65 20 71   3) Either the q
2b420 75 65 72 79 20 6d 75 73 74 20 62 65 20 44 49 53  uery must be DIS
2b430 54 49 4e 43 54 2c 20 6f 72 20 65 6c 73 65 20 74  TINCT, or else t
2b440 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2b450 6c 61 75 73 65 0a 20 20 2a 2a 20 20 20 20 20 20  lause.  **      
2b460 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 63  must contain a c
2b470 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6c  onstraint that l
2b480 69 6d 69 74 73 20 74 68 65 20 73 63 61 6e 20 6f  imits the scan o
2b490 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 0a  f the table to .
2b4a0 20 20 2a 2a 20 20 20 20 20 20 61 74 20 6d 6f 73    **      at mos
2b4b0 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a  t a single row..
2b4c0 20 20 2a 2a 20 20 20 34 29 20 54 68 65 20 74 61    **   4) The ta
2b4d0 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ble must not be 
2b4e0 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 61 6e  referenced by an
2b4f0 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 71 75  y part of the qu
2b500 65 72 79 20 61 70 61 72 74 0a 20 20 2a 2a 20 20  ery apart.  **  
2b510 20 20 20 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e      from its own
2b520 20 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61   USING or ON cla
2b530 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  use..  **.  ** F
2b540 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65  or example, give
2b550 6e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  n:.  **.  **    
2b560 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2b570 28 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49  (ipk INTEGER PRI
2b580 4d 41 52 59 20 4b 45 59 2c 20 76 31 29 3b 0a 20  MARY KEY, v1);. 
2b590 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
2b5a0 41 42 4c 45 20 74 32 28 69 70 6b 20 49 4e 54 45  ABLE t2(ipk INTE
2b5b0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2b5c0 20 76 32 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43   v2);.  **     C
2b5d0 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 69  REATE TABLE t3(i
2b5e0 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  pk INTEGER PRIMA
2b5f0 52 59 20 4b 45 59 2c 20 76 33 29 3b 0a 20 20 2a  RY KEY, v3);.  *
2b600 2a 0a 20 20 2a 2a 20 74 68 65 6e 20 74 61 62 6c  *.  ** then tabl
2b610 65 20 74 32 20 63 61 6e 20 62 65 20 6f 6d 69 74  e t2 can be omit
2b620 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c  ted from the fol
2b630 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
2b640 2a 20 20 20 20 20 53 45 4c 45 43 54 20 76 31 2c  *     SELECT v1,
2b650 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a   v3 FROM t1 .  *
2b660 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49  *       LEFT JOI
2b670 4e 20 74 32 20 55 53 49 4e 47 20 28 74 31 2e 69  N t2 USING (t1.i
2b680 70 6b 3d 74 32 2e 69 70 6b 29 0a 20 20 2a 2a 20  pk=t2.ipk).  ** 
2b690 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20        LEFT JOIN 
2b6a0 74 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b  t3 USING (t1.ipk
2b6b0 3d 74 33 2e 69 70 6b 29 0a 20 20 2a 2a 0a 20 20  =t3.ipk).  **.  
2b6c0 2a 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a  ** or from:.  **
2b6d0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2b6e0 20 44 49 53 54 49 4e 43 54 20 76 31 2c 20 76 33   DISTINCT v1, v3
2b6f0 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20   FROM t1 .  **  
2b700 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2b710 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46  2.  **       LEF
2b720 54 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20  T JOIN t3 USING 
2b730 28 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a  (t1.ipk=t3.ipk).
2b740 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
2b750 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2b760 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
2b770 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65  vel>=2.   && pRe
2b780 73 75 6c 74 53 65 74 21 3d 30 20 20 20 20 20 20  sultSet!=0      
2b790 20 20 20 20 20 20 20 20 20 2f 2a 20 67 75 61 72           /* guar
2b7a0 61 6e 74 65 65 73 20 63 6f 6e 64 69 74 69 6f 6e  antees condition
2b7b0 20 28 31 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20   (1) above */.  
2b7c0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2b7d0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2b7e0 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
2b7f0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
2b800 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62  .    Bitmask tab
2b810 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68  Used = sqlite3Wh
2b820 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
2b830 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75  (pMaskSet, pResu
2b840 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ltSet);.    if( 
2b850 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b  sWLB.pOrderBy ){
2b860 0a 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c  .      tabUsed |
2b870 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2b880 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
2b890 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65  kSet, sWLB.pOrde
2b8a0 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rBy);.    }.    
2b8b0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
2b8c0 65 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d  evel-1; i>=1; i-
2b8d0 2d 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  -){.      WhereT
2b8e0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
2b8f0 64 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  d;.      struct 
2b900 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2b910 74 65 6d 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  tem;.      pLoop
2b920 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
2b930 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 70 49  pWLoop;.      pI
2b940 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
2b950 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2b960 2d 3e 69 54 61 62 5d 3b 0a 20 20 20 20 20 20 69  ->iTab];.      i
2b970 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
2b980 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
2b990 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
2b9a0 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72  .      if( (wctr
2b9b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
2b9c0 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30  ANT_DISTINCT)==0
2b9d0 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2b9e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2b9f0 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20  RE_ONEROW)==0.  
2ba00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
2ba10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2ba20 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
2ba30 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
2ba40 6b 53 65 6c 66 29 21 3d 30 20 29 20 63 6f 6e 74  kSelf)!=0 ) cont
2ba50 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 6e 64  inue;.      pEnd
2ba60 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b   = sWLB.pWC->a +
2ba70 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d   sWLB.pWC->nTerm
2ba80 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
2ba90 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70  m=sWLB.pWC->a; p
2baa0 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d  Term<pEnd; pTerm
2bab0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2bac0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
2bad0 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
2bae0 53 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20  Self)!=0 ){.    
2baf0 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
2bb00 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
2bb10 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
2bb20 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Join).          
2bb30 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72   || pTerm->pExpr
2bb40 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2bb50 65 21 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e!=pItem->iCurso
2bb60 72 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  r.          ){. 
2bb70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2bb80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bba0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
2bbb0 70 45 6e 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  pEnd ) continue;
2bbc0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
2bbd0 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64  E(0xffff, ("-> d
2bbe0 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20  rop loop %c not 
2bbf0 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e  used\n", pLoop->
2bc00 63 49 64 29 29 3b 0a 20 20 20 20 20 20 6e 6f 74  cId));.      not
2bc10 52 65 61 64 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d  Ready &= ~pLoop-
2bc20 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2bc30 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e   for(pTerm=sWLB.
2bc40 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45  pWC->a; pTerm<pE
2bc50 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2bc60 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2bc70 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
2bc80 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
2bc90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2bca0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
2bcb0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
2bcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2bcd0 20 20 20 20 20 69 66 28 20 69 21 3d 70 57 49 6e       if( i!=pWIn
2bce0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a  fo->nLevel-1 ){.
2bcf0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
2bd00 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65  e = (pWInfo->nLe
2bd10 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69 7a 65 6f  vel-1-i) * sizeo
2bd20 66 28 57 68 65 72 65 4c 65 76 65 6c 29 3b 0a 20  f(WhereLevel);. 
2bd30 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
2bd40 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70  pWInfo->a[i], &p
2bd50 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e  WInfo->a[i+1], n
2bd60 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Byte);.      }. 
2bd70 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65       pWInfo->nLe
2bd80 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61  vel--;.      nTa
2bd90 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  bList--;.    }. 
2bda0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
2bdb0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
2bdc0 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
2bdd0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
2bde0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
2bdf0 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
2be00 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
2be10 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
2be20 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
2be30 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2be40 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
2be50 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
2be60 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
2be70 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
2be80 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
2be90 72 69 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  riate..  **.  **
2bea0 20 41 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72   A one-pass appr
2beb0 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64  oach can be used
2bec0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   if the caller h
2bed0 61 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 65  as requested one
2bee0 0a 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72  .  ** and either
2bef0 20 28 61 29 20 74 68 65 20 73 63 61 6e 20 76 69   (a) the scan vi
2bf00 73 69 74 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65  sits at most one
2bf10 20 72 6f 77 20 6f 72 20 28 62 29 20 65 61 63 68   row or (b) each
2bf20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  .  ** of the fol
2bf30 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2bf40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 74  .  **.  **   * t
2bf50 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 69 6e  he caller has in
2bf60 64 69 63 61 74 65 64 20 74 68 61 74 20 61 20 6f  dicated that a o
2bf70 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  ne-pass approach
2bf80 20 63 61 6e 20 62 65 20 75 73 65 64 0a 20 20 2a   can be used.  *
2bf90 2a 20 20 20 20 20 77 69 74 68 20 6d 75 6c 74 69  *     with multi
2bfa0 70 6c 65 20 72 6f 77 73 20 28 62 79 20 73 65 74  ple rows (by set
2bfb0 74 69 6e 67 20 57 48 45 52 45 5f 4f 4e 45 50 41  ting WHERE_ONEPA
2bfc0 53 53 5f 4d 55 4c 54 49 52 4f 57 29 2c 20 61 6e  SS_MULTIROW), an
2bfd0 64 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 74  d.  **   * the t
2bfe0 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
2bff0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 61 6e 64  rtual table, and
2c000 0a 20 20 2a 2a 20 20 20 2a 20 65 69 74 68 65 72  .  **   * either
2c010 20 74 68 65 20 73 63 61 6e 20 64 6f 65 73 20 6e   the scan does n
2c020 6f 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70  ot use the OR op
2c030 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 72 20 74 68  timization or th
2c040 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 20 20  e caller.  **   
2c050 20 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 70    is a DELETE op
2c060 65 72 61 74 69 6f 6e 20 28 57 48 45 52 45 5f 44  eration (WHERE_D
2c070 55 50 4c 49 43 41 54 45 53 5f 4f 4b 20 69 73 20  UPLICATES_OK is 
2c080 6f 6e 6c 79 20 73 70 65 63 69 66 69 65 64 0a 20  only specified. 
2c090 20 2a 2a 20 20 20 20 20 66 6f 72 20 44 45 4c 45   **     for DELE
2c0a0 54 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  TE)..  **.  ** T
2c0b0 68 65 20 6c 61 73 74 20 71 75 61 6c 69 66 69 63  he last qualific
2c0c0 61 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ation is because
2c0d0 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
2c0e0 6d 65 6e 74 20 75 73 65 73 0a 20 20 2a 2a 20 57  ment uses.  ** W
2c0f0 68 65 72 65 49 6e 66 6f 2e 61 69 43 75 72 4f 6e  hereInfo.aiCurOn
2c100 65 50 61 73 73 5b 31 5d 20 74 6f 20 64 65 74 65  ePass[1] to dete
2c110 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2c120 20 6e 6f 74 20 69 74 20 72 65 61 6c 6c 79 20 63   not it really c
2c130 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 20 6f 6e  an.  ** use a on
2c140 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 2c  e-pass approach,
2c150 20 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74   and this is not
2c160 20 73 65 74 20 61 63 63 75 72 61 74 65 6c 79 20   set accurately 
2c170 66 6f 72 20 73 63 61 6e 73 0a 20 20 2a 2a 20 74  for scans.  ** t
2c180 68 61 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f  hat use the OR o
2c190 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  ptimization..  *
2c1a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2c1b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c1c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2c1d0 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
2c1e0 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
2c1f0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2c200 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2c210 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  SIRED)!=0 ){.   
2c220 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70   int wsFlags = p
2c230 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2c240 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
2c250 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28   int bOnerow = (
2c260 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c270 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20  ONEROW)!=0;.    
2c280 69 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28  if( bOnerow || (
2c290 0a 20 20 20 20 20 20 20 20 30 21 3d 28 77 63 74  .        0!=(wct
2c2a0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c2b0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2c2c0 29 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73  ).     && 0==(ws
2c2d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2c2e0 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
2c2f0 20 26 26 20 28 30 3d 3d 28 77 73 46 6c 61 67 73   && (0==(wsFlags
2c300 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2c310 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
2c320 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
2c330 41 54 45 53 5f 4f 4b 29 29 0a 20 20 20 20 29 29  ATES_OK)).    ))
2c340 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2c350 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72  eOnePass = bOner
2c360 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e  ow ? ONEPASS_SIN
2c370 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55  GLE : ONEPASS_MU
2c380 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48  LTI;.      if( H
2c390 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74  asRowid(pTabList
2c3a0 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20  ->a[0].pTab) && 
2c3b0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2c3c0 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
2c3d0 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
2c3e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2c3f0 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b  PASS_MULTIROW ){
2c400 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64  .          bFord
2c410 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46  elete = OPFLAG_F
2c420 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  ORDELETE;.      
2c430 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e    }.        pWIn
2c440 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
2c450 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c  >wsFlags = (wsFl
2c460 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58  ags & ~WHERE_IDX
2c470 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a  _ONLY);.      }.
2c480 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2c490 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
2c4a0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
2c4b0 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
2c4c0 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
2c4d0 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
2c4e0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2c4f0 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
2c500 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
2c510 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
2c520 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
2c530 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2c540 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
2c550 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
2c560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2c570 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
2c580 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
2c590 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
2c5a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2c5b0 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
2c5c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2c5d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2c5e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
2c5f0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2c600 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
2c610 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2c620 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
2c630 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
2c640 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2c650 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
2c660 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2c670 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
2c680 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
2c690 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
2c6a0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
2c6b0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
2c6c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2c6d0 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
2c6e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2c6f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2c700 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2c710 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
2c720 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2c730 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
2c740 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
2c750 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
2c760 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2c770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c780 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
2c790 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
2c7a0 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
2c7b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
2c7c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2c7d0 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
2c7e0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
2c7f0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
2c800 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2c810 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2c820 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
2c830 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2c840 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
2c850 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2c860 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2c870 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2c880 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
2c890 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
2c8a0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
2c8b0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
2c8c0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2c8d0 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
2c8e0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2c8f0 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
2c900 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
2c910 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
2c920 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
2c930 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
2c940 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
2c950 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
2c960 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
2c970 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2c980 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2c990 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2c9a0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
2c9b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c9c0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2c9d0 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2c9e0 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
2c9f0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
2ca00 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2ca10 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2ca20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
2ca30 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
2ca40 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
2ca50 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
2ca60 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
2ca70 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
2ca80 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
2ca90 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
2caa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cab0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
2cac0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2cad0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
2cae0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2caf0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
2cb00 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2cb10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2cb20 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
2cb30 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
2cb40 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
2cb50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cb60 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2cb70 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c  , OPFLAG_SEEKEQ|
2cb80 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2cb90 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2cba0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2cbb0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cbc0 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74  eP5(v, bFordelet
2cbd0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  e);.      }.#ifd
2cbe0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2cbf0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2cc00 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  K.      sqlite3V
2cc10 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
2cc20 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
2cc30 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2cc40 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  or, 0, 0,.      
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a        (const u8*
2cc70 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  )&pTabItem->colU
2cc80 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
2cc90 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2cca0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
2ccb0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
2ccc0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
2ccd0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
2cce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ccf0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2cd00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
2cd10 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
2cd20 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
2cd30 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2cd40 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
2cd50 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  ;.      int op =
2cd60 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
2cd70 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69      /* iAuxArg i
2cd80 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
2cd90 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
2cda0 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70   if ONEPASS is p
2cdb0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ossible */.     
2cdc0 20 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67   assert( iAuxArg
2cdd0 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e  !=0 || (pWInfo->
2cde0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2cdf0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2ce00 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
2ce10 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2ce20 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  ab) && IsPrimary
2ce30 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20  KeyIndex(pIx).  
2ce40 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2ce50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2ce60 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20  UBCLAUSE)!=0.   
2ce70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2ce80 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
2ce90 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
2cea0 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
2ceb0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
2cec0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
2ced0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
2cee0 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
2cef0 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
2cf00 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
2cf10 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
2cf20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
2cf30 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
2cf40 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
2cf50 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41  >eOnePass!=ONEPA
2cf60 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
2cf70 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54    Index *pJ = pT
2cf80 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49  abItem->pTab->pI
2cf90 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49  ndex;.        iI
2cfa0 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72  ndexCur = iAuxAr
2cfb0 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  g;.        asser
2cfc0 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  t( wctrlFlags & 
2cfd0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2cfe0 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  SIRED );.       
2cff0 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
2d000 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b  J) && pJ!=pIx ){
2d010 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65  .          iInde
2d020 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  xCur++;.        
2d030 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74    pJ = pJ->pNext
2d040 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d050 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
2d060 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
2d070 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2d080 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43  ass[1] = iIndexC
2d090 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ur;.      }else 
2d0a0 69 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28  if( iAuxArg && (
2d0b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d0c0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2d0d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2d0e0 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41  IndexCur = iAuxA
2d0f0 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  rg;.        op =
2d100 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20   OP_ReopenIdx;. 
2d110 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d120 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2d130 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2d140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
2d150 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
2d160 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2d170 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
2d180 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
2d190 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
2d1a0 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e  sert( iIndexCur>
2d1b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2d1c0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  op ){.        sq
2d1d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2d1e0 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72  v, op, iIndexCur
2d1f0 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
2d200 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2d210 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
2d220 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
2d230 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c  .        if( (pL
2d240 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2d250 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
2d260 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
2d270 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2d280 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
2d290 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50  RANGE|WHERE_SKIP
2d2a0 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20  SCAN))==0.      
2d2b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2d2c0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
2d2d0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a  ORDERBY_MIN)==0.
2d2e0 20 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e           && pWIn
2d2f0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57  fo->eDistinct!=W
2d300 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2d310 44 45 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b  DERED.        ){
2d320 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d330 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2d340 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
2d350 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
2d360 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
2d370 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2d380 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2d390 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66  Ix->zName));.#if
2d3a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2d3b0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2d3c0 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  SK.        {.   
2d3d0 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73         u64 colUs
2d3e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
2d3f0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
2d400 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
2d410 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d  ; ii<pIx->nColum
2d420 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
2d430 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e        jj = pIx->
2d440 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20  aiColumn[ii];.  
2d450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2d460 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
2d470 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
2d480 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a  j>63 ) jj = 63;.
2d490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d4a0 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  (pTabItem->colUs
2d4b0 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29  ed & MASKBIT(jj)
2d4c0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
2d4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
2d4e0 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29  Used |= ((u64)1)
2d4f0 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20  <<(ii<63 ? ii : 
2d500 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  63);.          }
2d510 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d520 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2d530 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2d540 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30  ed, iIndexCur, 0
2d550 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73       (u8*)&colUs
2d580 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ed, P4_INT64);. 
2d590 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
2d5a0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
2d5b0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2d5c0 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  K */.      }.   
2d5d0 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
2d5e0 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
2d5f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2d600 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
2d610 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
2d620 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2d630 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
2d640 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d650 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2d660 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
2d670 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2d680 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
2d690 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
2d6a0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
2d6b0 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
2d6c0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
2d6d0 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
2d6e0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
2d6f0 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
2d700 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
2d710 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
2d720 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  ){.    int addrE
2d730 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20  xplain;.    int 
2d740 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
2d750 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
2d760 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67  [ii];.    wsFlag
2d770 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  s = pLevel->pWLo
2d780 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66  op->wsFlags;.#if
2d790 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d7a0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2d7b0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2d7c0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2d7d0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
2d7e0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
2d7f0 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
2d800 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
2d810 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a  , &pWInfo->sWC,.
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d830 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2d840 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74  vel->iFrom], not
2d850 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
2d860 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2d870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2d880 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2d890 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  r;.    }.#endif.
2d8a0 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20      addrExplain 
2d8b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2d8c0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
2d8d0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54        pParse, pT
2d8e0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
2d8f0 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
2d900 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20  m, wctrlFlags.  
2d910 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d    );.    pLevel-
2d920 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
2d930 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2d940 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
2d950 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ady = sqlite3Whe
2d960 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  reCodeOneLoopSta
2d970 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
2d980 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2d990 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2d9a0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2d9b0 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
2d9c0 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
2d9d0 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
2d9e0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f  lFlags&WHERE_OR_
2d9f0 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2da00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2da10 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
2da20 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
2da30 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
2da40 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
2da50 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
2da60 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2da70 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
2da80 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
2da90 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2daa0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2dab0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2dac0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2dad0 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2dae0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2daf0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2db00 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2db10 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2db20 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2db30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2db40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2db50 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
2db60 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
2db70 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
2db80 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
2db90 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
2dba0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2dbb0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2dbc0 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
2dbd0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
2dbe0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2dbf0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2dc00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2dc10 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2dc20 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
2dc30 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65  l *pLevel;.  Whe
2dc40 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
2dc50 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2dc60 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2dc70 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
2dc80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2dc90 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
2dca0 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
2dcb0 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
2dcc0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
2dcd0 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
2dce0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69  -core"));.  sqli
2dcf0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2dd00 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2dd10 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
2dd20 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
2dd30 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
2dd40 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2dd50 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
2dd60 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2dd70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  WLoop;.    if( p
2dd80 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
2dd90 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  op ){.#ifndef SQ
2dda0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2ddb0 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 0a  PAHEAD_DISTINCT.
2ddc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
2ddd0 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e  ek = 0;.      In
2dde0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20  dex *pIdx;.     
2ddf0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66   int n;.      if
2de00 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
2de10 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
2de20 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20 20  NCT_ORDERED.    
2de30 20 20 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f 2d     && i==pWInfo-
2de40 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54 69  >nLevel-1  /* Ti
2de50 63 6b 65 74 20 5b 65 66 39 33 31 38 37 35 37 62  cket [ef9318757b
2de60 31 35 32 65 33 5d 20 32 30 31 37 2d 31 30 2d 32  152e3] 2017-10-2
2de70 31 20 2a 2f 0a 20 20 20 20 20 20 20 26 26 20 28  1 */.       && (
2de80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2de90 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
2dea0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 49  =0.       && (pI
2deb0 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
2dec0 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73  ree.pIndex)->has
2ded0 53 74 61 74 31 0a 20 20 20 20 20 20 20 26 26 20  Stat1.       && 
2dee0 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  (n = pLoop->u.bt
2def0 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20  ree.nIdxCol)>0. 
2df00 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61        && pIdx->a
2df10 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33  iRowLogEst[n]>=3
2df20 36 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  6.      ){.     
2df30 20 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72     int r1 = pPar
2df40 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2df50 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20      int j, op;. 
2df60 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2df70 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<n; j++){.     
2df80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2df90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2dfa0 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  umn, pLevel->iId
2dfb0 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a  xCur, j, r1+j);.
2dfc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dfd0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2dfe0 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f  = n+1;.        o
2dff0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  p = pLevel->op==
2e000 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65  OP_Prev ? OP_See
2e010 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b  kLT : OP_SeekGT;
2e020 0a 20 20 20 20 20 20 20 20 61 64 64 72 53 65 65  .        addrSee
2e030 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  k = sqlite3VdbeA
2e040 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
2e050 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
2e060 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20   0, r1, n);.    
2e070 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2e080 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
2e090 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64  kLT);.        Vd
2e0a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2e0b0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a  op==OP_SeekGT);.
2e0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e0d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e0e0 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  Goto, 1, pLevel-
2e0f0 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  >p2);.      }.#e
2e100 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2e110 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44  ISABLE_SKIPAHEAD
2e120 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20  _DISTINCT */.   
2e130 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e     /* The common
2e140 20 63 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74   case: Advance t
2e150 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a  o the next row *
2e160 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2e170 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2e180 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
2e190 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
2e1a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2e1b0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
2e1c0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2e1d0 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
2e1e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e1f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
2e200 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
2e210 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2e220 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2e230 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
2e240 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
2e250 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2e260 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2e270 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
2e280 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e290 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2e2a0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69  p==OP_VNext);.#i
2e2b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2e2c0 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2e2d0 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66  ISTINCT.      if
2e2e0 28 20 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c  ( addrSeek ) sql
2e2f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2e300 28 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23  (v, addrSeek);.#
2e310 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2e320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e330 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2e340 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2e350 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
2e360 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2e370 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
2e380 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
2e390 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
2e3a0 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
2e3b0 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
2e3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e3d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2e3e0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
2e3f0 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
2e400 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
2e410 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
2e420 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
2e430 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
2e440 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
2e450 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2e460 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
2e470 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  op+1);.        i
2e480 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  f( pIn->eEndLoop
2e490 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
2e4a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e4b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
2e4c0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
2e4d0 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
2e4e0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
2e4f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e500 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2e510 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2e520 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
2e530 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
2e540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2e550 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2e560 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2e570 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a  OP_NextIfOpen);.
2e580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e590 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2e5a0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
2e5b0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
2e5c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2e5d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2e5e0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2e5f0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
2e600 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  f( pLevel->addrS
2e610 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  kip ){.      sql
2e620 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
2e630 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2e640 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e650 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73  ment((v, "next s
2e660 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c  kip-scan on %s",
2e670 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e680 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
2e690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e6a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
2e6b0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b  evel->addrSkip);
2e6c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e6d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c  beJumpHere(v, pL
2e6e0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32  evel->addrSkip-2
2e6f0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
2e700 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
2e710 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
2e720 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2e730 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20  addrLikeRep ){. 
2e740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e750 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
2e760 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29  rJumpZero, (int)
2e770 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65  (pLevel->iLikeRe
2e780 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20  pCntr>>1),.     
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c     pLevel->addrL
2e7b0 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56  ikeRep);.      V
2e7c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2e7d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e7e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2e7f0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
2e800 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e  int ws = pLoop->
2e810 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 61  wsFlags;.      a
2e820 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2e830 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2e840 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
2e850 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76  ftJoin); VdbeCov
2e860 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2e870 61 73 73 65 72 74 28 20 28 77 73 20 26 20 57 48  assert( (ws & WH
2e880 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2e890 20 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45 5f   || (ws & WHERE_
2e8a0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
2e8b0 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
2e8c0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2e8d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
2e8e0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ert( pLevel->iTa
2e8f0 62 43 75 72 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  bCur==pTabList->
2e900 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2e910 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  .iCursor );.    
2e920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e930 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2e940 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Row, pLevel->iTa
2e950 62 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bCur);.      }. 
2e960 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
2e970 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a 20  HERE_INDEXED) . 
2e980 20 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26 20        || ((ws & 
2e990 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
2e9a0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f  && pLevel->u.pCo
2e9b0 76 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b 0a  vidx) .      ){.
2e9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e9d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2e9e0 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
2e9f0 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2ea00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
2ea10 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
2ea20 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
2ea30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ea40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
2ea50 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2ea60 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2ea70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ea80 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
2ea90 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
2eaa0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2eab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eac0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2ead0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  dr);.    }.    V
2eae0 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2eaf0 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
2eb00 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a  loop%d: %s", i,.
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
2eb30 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2eb40 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
2eb50 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
2eb60 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
2eb70 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
2eb80 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2eb90 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
2eba0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
2ebb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2ebc0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ebd0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
2ebe0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
2ebf0 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
2ec00 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2ec10 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2ec20 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
2ec30 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2ec40 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2ec50 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20   int k, last;.  
2ec60 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2ec70 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
2ec80 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
2ec90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
2eca0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2ecb0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2ecc0 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
2ecd0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2ece0 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2ecf0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2ed00 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2ed10 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f  ->pWLoop;..    /
2ed20 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69  * For a co-routi
2ed30 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f  ne, change all O
2ed40 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  P_Column referen
2ed50 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ces to the table
2ed60 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
2ed70 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f  o-routine into O
2ed80 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  P_Copy of result
2ed90 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
2eda0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
2edb0 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
2edc0 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
2edd0 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
2ede0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2edf0 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73  ine ){.      tes
2ee00 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
2ee10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ee20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61  );.      transla
2ee30 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70  teColumnToCopy(p
2ee40 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61  Parse, pLevel->a
2ee50 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
2ee60 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee80 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
2ee90 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
2eea0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2eeb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2eec0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
2eed0 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
2eee0 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
2eef0 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
2ef00 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
2ef10 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
2ef20 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
2ef30 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
2ef40 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
2ef50 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
2ef60 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
2ef70 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
2ef80 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
2ef90 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
2efa0 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
2efb0 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
2efc0 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
2efd0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
2efe0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
2eff0 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
2f000 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
2f010 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
2f020 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
2f030 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
2f040 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
2f050 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
2f060 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
2f070 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
2f080 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
2f090 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
2f0a0 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
2f0b0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
2f0c0 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
2f0d0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
2f0e0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
2f0f0 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
2f100 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
2f110 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2f120 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
2f130 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
2f140 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
2f150 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2f160 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
2f170 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
2f180 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2f190 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
2f1a0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
2f1b0 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
2f1c0 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20  .    if( pIdx.  
2f1d0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65     && (pWInfo->e
2f1e0 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2f1f0 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69  _OFF || !HasRowi
2f200 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29  d(pIdx->pTable))
2f210 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  .     && !db->ma
2f220 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29  llocFailed.    )
2f230 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
2f240 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f250 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f260 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
2f270 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
2f280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
2f290 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
2f2a0 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
2f2b0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
2f2c0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
2f2d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2f2e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f2f0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2f300 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 0a 23  ode==OP_Column.#
2f310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2f320 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
2f330 55 4e 43 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UNC.         || 
2f340 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2f350 4f 66 66 73 65 74 0a 23 65 6e 64 69 66 0a 20 20  Offset.#endif.  
2f360 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2f370 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
2f380 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
2f390 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
2f3a0 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
2f3b0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2f3c0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2f3d0 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
2f3e0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
2f3f0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
2f400 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
2f410 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
2f420 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
2f430 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
2f440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f450 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
2f460 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2f470 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20  (pIdx, x);.     
2f480 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b       if( x>=0 ){
2f490 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
2f4a0 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20  ->p2 = x;.      
2f4b0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2f4c0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2f4d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f4e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2f4f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2f500 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2f510 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a 20 20 20  ==0 || x>=0 .   
2f520 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
2f530 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 29  Info->eOnePass )
2f540 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2f550 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2f560 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
2f570 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
2f580 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2f590 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
2f5a0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
2f5b0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
2f5c0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2f5d0 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75 6c 6c 52  code==OP_IfNullR
2f5e0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
2f5f0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
2f600 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
2f610 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f620 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
2f630 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
2f640 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2f650 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2f660 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2f670 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2f680 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
2f690 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.