/ Hex Artifact Content
Login

Artifact 9915929594a8c6bf8ca8d6e02a4f7e632948fa523712ab647490d18855a43656:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78  Int.h"../*.** Ex
0360: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
0370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
0380: 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  end of sqlite3_i
0390: 6e 64 65 78 5f 69 6e 66 6f 20 62 75 74 20 6e 6f  ndex_info but no
03a0: 74 0a 2a 2a 20 76 69 73 69 62 6c 65 20 74 6f 20  t.** visible to 
03b0: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 66  the xBestIndex f
03c0: 75 6e 63 74 69 6f 6e 2c 20 61 74 20 6c 65 61 73  unction, at leas
03d0: 74 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 2e 20  t not directly. 
03e0: 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   The.** sqlite3_
03f0: 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  vtab_collation()
0400: 20 69 6e 74 65 72 66 61 63 65 20 6b 6e 6f 77 73   interface knows
0410: 20 68 6f 77 20 74 6f 20 72 65 61 63 68 20 69 74   how to reach it
0420: 2c 20 68 6f 77 65 76 65 72 2e 0a 2a 2a 0a 2a 2a  , however..**.**
0430: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
0440: 6e 6f 74 20 61 6e 20 41 50 49 20 61 6e 64 20 63  not an API and c
0450: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  an be changed fr
0460: 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20 74  om one release t
0470: 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 2e 20 20  o the.** next.  
0480: 41 73 20 6c 6f 6e 67 20 61 73 20 61 6c 6c 6f 63  As long as alloc
0490: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 61  ateIndexInfo() a
04a0: 6e 64 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  nd sqlite3_vtab_
04b0: 63 6f 6c 6c 61 74 69 6f 6e 28 29 0a 2a 2a 20 61  collation().** a
04c0: 67 72 65 65 20 6f 6e 20 74 68 65 20 73 74 72 75  gree on the stru
04d0: 63 74 75 72 65 2c 20 61 6c 6c 20 77 69 6c 6c 20  cture, all will 
04e0: 62 65 20 77 65 6c 6c 2e 0a 2a 2f 0a 74 79 70 65  be well..*/.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 48 69 64 64 65  def struct Hidde
0500: 6e 49 6e 64 65 78 49 6e 66 6f 20 48 69 64 64 65  nIndexInfo Hidde
0510: 6e 49 6e 64 65 78 49 6e 66 6f 3b 0a 73 74 72 75  nIndexInfo;.stru
0520: 63 74 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  ct HiddenIndexIn
0530: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
0540: 73 65 20 2a 70 57 43 3b 20 20 20 2f 2a 20 54 68  se *pWC;   /* Th
0550: 65 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 62  e Where clause b
0560: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0570: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0580: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
0590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
05a0: 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .};../* Forward 
05b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d  declaration of m
05c0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
05d0: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
05e0: 73 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57  size(sqlite3*, W
05f0: 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b  hereLoop*, int);
0600: 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72 69 61 62  ../* Test variab
0610: 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  le that can be s
0620: 65 74 20 74 6f 20 65 6e 61 62 6c 65 20 57 48 45  et to enable WHE
0630: 52 45 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  RE tracing */.#i
0640: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0650: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
0660: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
0670: 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69 74 65  /***/ int sqlite
0680: 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
0690: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
06a0: 52 65 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d  Return the estim
06b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
06c0: 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20  utput rows from 
06d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  a WHERE clause.*
06e0: 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69 74 65 33  /.LogEst sqlite3
06f0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
0700: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
0710: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0720: 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0740: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  n one of the WHE
0750: 52 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78  RE_DISTINCT_xxxx
0760: 78 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69  x values to indi
0770: 63 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a  cate how this.**
0780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0790: 74 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f  turns outputs fo
07a0: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
07b0: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
07c0: 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
07d0: 69 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a  inct(WhereInfo *
07e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
07f0: 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  n pWInfo->eDisti
0800: 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nct;.}../*.** Re
0810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0820: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65   WHERE clause re
0830: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
0840: 44 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a  DER BY order..**
0850: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0860: 20 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64   the output need
0870: 73 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a  s to be sorted..
0880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0890: 65 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65  ereIsOrdered(Whe
08a0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
08c0: 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a  ->nOBSat;.}../*.
08d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
08e0: 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  f the innermost 
08f0: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57 48 45 52  loop of the WHER
0900: 45 20 63 6c 61 75 73 65 20 69 6d 70 6c 65 6d 65  E clause impleme
0910: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ntation.** retur
0920: 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52  ns rows in ORDER
0930: 20 42 59 20 6f 72 64 65 72 20 66 6f 72 20 63 6f   BY order for co
0940: 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66 20 74 68  mplete run of th
0950: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2a  e inner loop..**
0960: 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75 6c 74 69  .** Across multi
0970: 70 6c 65 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ple iterations o
0980: 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2c 20 74  f outer loops, t
0990: 68 65 20 6f 75 74 70 75 74 20 72 6f 77 73 20 6e  he output rows n
09a0: 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 73 6f  eed not be.** so
09b0: 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e 67 20 61  rted.  As long a
09c0: 73 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65  s rows are sorte
09d0: 64 20 66 6f 72 20 6a 75 73 74 20 74 68 65 20 69  d for just the i
09e0: 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70 2c 20 74  nnermost loop, t
09f0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 63  his.** routine c
0a00: 61 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a  an return TRUE..
0a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
0a20: 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
0a30: 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  oop(WhereInfo *p
0a40: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
0a50: 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
0a60: 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d 0a 0a 2f  dInnerLoop;.}../
0a70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0a80: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
0a90: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
0aa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
0ab0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
0ac0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
0ad0: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
0ae0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
0af0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
0b00: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
0b10: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
0b20: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
0b30: 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b  >iContinue!=0 );
0b40: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
0b50: 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  ->iContinue;.}..
0b60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0b70: 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72   VDBE address or
0b80: 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
0b90: 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  o in order to br
0ba0: 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20  eak.** out of a 
0bb0: 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  WHERE loop..*/.i
0bc0: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  nt sqlite3WhereB
0bd0: 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49  reakLabel(WhereI
0be0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
0bf0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0c00: 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Break;.}../*.** 
0c10: 52 65 74 75 72 6e 20 4f 4e 45 50 41 53 53 5f 4f  Return ONEPASS_O
0c20: 46 46 20 28 30 29 20 69 66 20 61 6e 20 55 50 44  FF (0) if an UPD
0c30: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
0c40: 61 74 65 6d 65 6e 74 20 69 73 20 75 6e 61 62 6c  atement is unabl
0c50: 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61 74 65 20  e to.** operate 
0c60: 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20  directly on the 
0c70: 72 6f 77 69 73 20 72 65 74 75 72 6e 65 64 20 62  rowis returned b
0c80: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
0c90: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45  .  Return.** ONE
0ca0: 50 41 53 53 5f 53 49 4e 47 4c 45 20 28 31 29 20  PASS_SINGLE (1) 
0cb0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
0cc0: 20 63 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 64   can operation d
0cd0: 69 72 65 63 74 6c 79 20 62 65 63 61 75 73 65 20  irectly because 
0ce0: 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  only.** a single
0cf0: 20 72 6f 77 20 69 73 20 74 6f 20 62 65 20 63 68   row is to be ch
0d00: 61 6e 67 65 64 2e 20 20 52 65 74 75 72 6e 20 4f  anged.  Return O
0d10: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 28 32 29  NEPASS_MULTI (2)
0d20: 20 69 66 20 74 68 65 20 6f 6e 65 2d 70 61 73 73   if the one-pass
0d30: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
0d40: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
0d50: 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20  multiple .**.** 
0d60: 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  If the ONEPASS o
0d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
0d80: 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75  sed (if this rou
0d90: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
0da0: 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20  e).** then also 
0db0: 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65  write the indice
0dc0: 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72  s of open cursor
0dd0: 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53  s used by ONEPAS
0de0: 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b  S.** into aiCur[
0df0: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e  0] and aiCur[1].
0e00: 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20    iaCur[0] gets 
0e10: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
0e20: 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  e data.** table 
0e30: 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74  and iaCur[1] get
0e40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  s the cursor use
0e50: 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72  d by an auxiliar
0e60: 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68  y index..** Eith
0e70: 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  er value may be 
0e80: 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
0e90: 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  hat cursor is no
0ea0: 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63  t used..** Any c
0eb0: 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20  ursors returned 
0ec0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f  will have been o
0ed0: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
0ee0: 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30  g..**.** aiCur[0
0ef0: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62  ] and aiCur[1] b
0f00: 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68  oth get -1 if th
0f10: 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c  e where-clause l
0f20: 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  ogic is.** unabl
0f30: 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45  e to use the ONE
0f40: 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
0f50: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
0f60: 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28  3WhereOkOnePass(
0f70: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0f80: 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a  o, int *aiCur){.
0f90: 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20    memcpy(aiCur, 
0fa0: 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
0fb0: 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Pass, sizeof(int
0fc0: 29 2a 32 29 3b 0a 23 69 66 64 65 66 20 57 48 45  )*2);.#ifdef WHE
0fd0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
0fe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
0ff0: 72 65 54 72 61 63 65 20 26 26 20 70 57 49 6e 66  reTrace && pWInf
1000: 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
1010: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
1020: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1030: 74 66 28 22 25 73 20 63 75 72 73 6f 72 73 3a 20  tf("%s cursors: 
1040: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
1050: 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50     pWInfo->eOneP
1060: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
1070: 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53 53 5f 53  GLE ? "ONEPASS_S
1080: 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45 50 41 53  INGLE" : "ONEPAS
1090: 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20 20 20 20  S_MULTI",.      
10a0: 20 20 20 61 69 43 75 72 5b 30 5d 2c 20 61 69 43     aiCur[0], aiC
10b0: 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  ur[1]);.  }.#end
10c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  if.  return pWIn
10d0: 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a  fo->eOnePass;.}.
10e0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
10f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20  content of pSrc 
1100: 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74  into pDest.*/.st
1110: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f  atic void whereO
1120: 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74  rMove(WhereOrSet
1130: 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72   *pDest, WhereOr
1140: 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44  Set *pSrc){.  pD
1150: 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e  est->n = pSrc->n
1160: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74  ;.  memcpy(pDest
1170: 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44  ->a, pSrc->a, pD
1180: 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44  est->n*sizeof(pD
1190: 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a  est->a[0]));.}..
11a0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73  /*.** Try to ins
11b0: 65 72 74 20 61 20 6e 65 77 20 70 72 65 72 65 71  ert a new prereq
11c0: 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72  uisite/cost entr
11d0: 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  y into the Where
11e0: 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a  OrSet pSet..**.*
11f0: 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20  * The new entry 
1200: 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
1210: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
1220: 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  y, or it might b
1230: 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f  e.** appended, o
1240: 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 69  r it might be di
1250: 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61  scarded.  Do wha
1260: 74 65 76 65 72 20 69 73 20 74 68 65 20 72 69 67  tever is the rig
1270: 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74  ht thing.** so t
1280: 68 61 74 20 70 53 65 74 20 6b 65 65 70 73 20 74  hat pSet keeps t
1290: 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73  he N_OR_COST bes
12a0: 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73  t entries seen s
12b0: 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  o far..*/.static
12c0: 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65   int whereOrInse
12d0: 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74  rt(.  WhereOrSet
12e0: 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20   *pSet,      /* 
12f0: 54 68 65 20 57 68 65 72 65 4f 72 53 65 74 20 74  The WhereOrSet t
1300: 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a  o be updated */.
1310: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
1320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72  ,        /* Prer
1330: 65 71 75 69 73 69 74 65 73 20 6f 66 20 74 68 65  equisites of the
1340: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
1350: 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20 20 20  LogEst rRun,    
1360: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f         /* Run-co
1370: 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  st of the new en
1380: 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  try */.  LogEst 
1390: 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
13a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
13b0: 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77  puts for the new
13c0: 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75   entry */.){.  u
13d0: 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43  16 i;.  WhereOrC
13e0: 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  ost *p;.  for(i=
13f0: 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d  pSet->n, p=pSet-
1400: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b  >a; i>0; i--, p+
1410: 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e  +){.    if( rRun
1420: 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72  <=p->rRun && (pr
1430: 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71  ereq & p->prereq
1440: 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20  )==prereq ){.   
1450: 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49     goto whereOrI
1460: 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20  nsert_done;.    
1470: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75  }.    if( p->rRu
1480: 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70  n<=rRun && (p->p
1490: 72 65 72 65 71 20 26 20 70 72 65 72 65 71 29 3d  rereq & prereq)=
14a0: 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20  =p->prereq ){.  
14b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
14d0: 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20  et->n<N_OR_COST 
14e0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74  ){.    p = &pSet
14f0: 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a  ->a[pSet->n++];.
1500: 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f      p->nOut = nO
1510: 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ut;.  }else{.   
1520: 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20   p = pSet->a;.  
1530: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65    for(i=1; i<pSe
1540: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
1550: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53    if( p->rRun>pS
1560: 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20  et->a[i].rRun ) 
1570: 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b  p = pSet->a + i;
1580: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1590: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72  ->rRun<=rRun ) r
15a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65  eturn 0;.  }.whe
15b0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a  reOrInsert_done:
15c0: 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70  .  p->prereq = p
15d0: 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e  rereq;.  p->rRun
15e0: 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70   = rRun;.  if( p
15f0: 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d  ->nOut>nOut ) p-
1600: 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20  >nOut = nOut;.  
1610: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1620: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
1630: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
1640: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
1650: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
1660: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
1670: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
1680: 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33  .Bitmask sqlite3
1690: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 57 68 65  WhereGetMask(Whe
16a0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
16b0: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
16c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
16d0: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
16e0: 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42  n<=(int)sizeof(B
16f0: 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66  itmask)*8 );.  f
1700: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
1710: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
1720: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
1730: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
1740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41  .      return MA
1750: 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
1760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1770: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1780: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
1790: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
17a0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
17b0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
17c0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
17d0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
17e0: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
17f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1800: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
1810: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
1820: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
1830: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
1840: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
1850: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
1860: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
1870: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
1880: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
1890: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
18a0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
18b0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
18c0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
18d0: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
18e0: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
18f0: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
1900: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
1910: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
1920: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  r;.}../*.** Adva
1930: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
1940: 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d  WhereTerm that m
1950: 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67  atches according
1960: 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61   to the criteria
1970: 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20  .** established 
1980: 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f  when the pScan o
1990: 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61  bject was initia
19a0: 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63  lized by whereSc
19b0: 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74  anInit()..** Ret
19c0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
19d0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61  e are no more ma
19e0: 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d  tching WhereTerm
19f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  s..*/.static Whe
1a00: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
1a10: 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20  nNext(WhereScan 
1a20: 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69  *pScan){.  int i
1a30: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1a40: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e  /* The cursor on
1a50: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
1a60: 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36 20 69 43  term */.  i16 iC
1a70: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f  olumn;         /
1a80: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20  * The column on 
1a90: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
1aa0: 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b  erm.  -1 for IPK
1ab0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20   */.  Expr *pX; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
1ae0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68  g tested */.  Wh
1af0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1b00: 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20     /* Shorthand 
1b10: 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a  for pScan->pWC *
1b20: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1b30: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20  Term;    /* The 
1b40: 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65  term being teste
1b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70  d */.  int k = p
1b60: 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57  Scan->k;    /* W
1b70: 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63  here to start sc
1b80: 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  anning */..  ass
1b90: 65 72 74 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ert( pScan->iEqu
1ba0: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
1bb0: 76 20 29 3b 0a 20 20 70 57 43 20 3d 20 70 53 63  v );.  pWC = pSc
1bc0: 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68 69 6c 65  an->pWC;.  while
1bd0: 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  (1){.    iColumn
1be0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
1bf0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
1c00: 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  -1];.    iCur = 
1c10: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70 53 63  pScan->aiCur[pSc
1c20: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
1c30: 20 20 20 61 73 73 65 72 74 28 20 70 57 43 21 3d     assert( pWC!=
1c40: 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
1c50: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
1c60: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
1c70: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
1c80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1c90: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1ca0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
1cb0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
1cc0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
1cd0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69 43  .         && (iC
1ce0: 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50 52 0a 20  olumn!=XN_EXPR. 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
1d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1d10: 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e 70 45 78  eSkip(pTerm->pEx
1d20: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
1d60: 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20 20 20 20  r,iCur)==0).    
1d70: 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e       && (pScan->
1d80: 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20 21 45 78  iEquiv<=1 || !Ex
1d90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1da0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
1db0: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
1dc0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1dd0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1de0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29  ator & WO_EQUIV)
1df0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
1e00: 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c  & pScan->nEquiv<
1e10: 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d  ArraySize(pScan-
1e20: 3e 61 69 43 75 72 29 0a 20 20 20 20 20 20 20 20  >aiCur).        
1e30: 20 20 20 26 26 20 28 70 58 20 3d 20 73 71 6c 69     && (pX = sqli
1e40: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1e50: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
1e60: 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70 3d 3d 54  >pRight))->op==T
1e70: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1e80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1e90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
1ea0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1eb0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
1ec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1ed0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 69     if( pScan->ai
1ee0: 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62  Cur[j]==pX->iTab
1ef0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
1f00: 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 69 43 6f    && pScan->aiCo
1f10: 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e 69 43 6f  lumn[j]==pX->iCo
1f20: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1f30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
1f70: 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  ==pScan->nEquiv 
1f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f90: 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d   pScan->aiCur[j]
1fa0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1fc0: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  an->aiColumn[j] 
1fd0: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
1ff0: 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b 0a 20 20  an->nEquiv++;.  
2000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2020: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2030: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
2040: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
2060: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
2070: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
2080: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
2090: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
20a0: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
20b0: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
20c0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
20d0: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
20e0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
20f0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
2100: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
2110: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
2120: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
2130: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
2140: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2150: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2160: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
2170: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
2180: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
21d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
21e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
2210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
2250: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
2260: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2270: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
2280: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2290: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
22a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22b0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
22c0: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
22d0: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
22f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2310: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2320: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2330: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
2340: 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20  O_IS))!=0.      
2350: 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20         && (pX = 
2360: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
2370: 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ight)->op==TK_CO
2380: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LUMN.           
2390: 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d    && pX->iTable=
23a0: 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d  =pScan->aiCur[0]
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
23c0: 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53   pX->iColumn==pS
23d0: 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  can->aiColumn[0]
23e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2400: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
2410: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
2420: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2430: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2450: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
2460: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
2470: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
2480: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
2490: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
24a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24c0: 20 20 70 57 43 20 3d 20 70 57 43 2d 3e 70 4f 75    pWC = pWC->pOu
24d0: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
24e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 57  ;.    }while( pW
24f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  C!=0 );.    if( 
2500: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3e 3d 70  pScan->iEquiv>=p
2510: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 20 62  Scan->nEquiv ) b
2520: 72 65 61 6b 3b 0a 20 20 20 20 70 57 43 20 3d 20  reak;.    pWC = 
2530: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
2540: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
2550: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
2560: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2570: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2580: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
2590: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
25a0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
25b0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
25c0: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
25d0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
25e0: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
25f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2600: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2610: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2620: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2630: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
2640: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
2650: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2660: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
2670: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
2680: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
2690: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
26a0: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
26b0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
26c0: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
26d0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
26e0: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
26f0: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2700: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2710: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2720: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2730: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
2740: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
2750: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
2760: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2770: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
2780: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
2790: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27a0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
27b0: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
27c0: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
27d0: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
27e0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
27f0: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2800: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2810: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2820: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2830: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
2840: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
2850: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
2860: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2870: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
2880: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
2890: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
28a0: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
28b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
28c0: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
28d0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
28e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
28f0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2900: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2910: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2920: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2930: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2940: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2950: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2970: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
2980: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29a0: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
29b0: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
29c0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
29d0: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
29e0: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
29f0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2a10: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2a20: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2a30: 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72  .){.  pScan->pOr
2a40: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
2a50: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
2a60: 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70    pScan->pIdxExp
2a70: 72 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  r = 0;.  pScan->
2a80: 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 70 53  idxaff = 0;.  pS
2a90: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2aa0: 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 20 29   0;.  if( pIdx )
2ab0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 43  {.    int j = iC
2ac0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75  olumn;.    iColu
2ad0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
2ae0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
2af0: 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52  iColumn==XN_EXPR
2b00: 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d   ){.      pScan-
2b10: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2b20: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2b30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 53  .pExpr;.      pS
2b40: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
2b50: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
2b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2b70: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
2b80: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
2b90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2ba0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65  XN_ROWID;.    }e
2bb0: 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e  lse if( iColumn>
2bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61  =0 ){.      pSca
2bd0: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78  n->idxaff = pIdx
2be0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2bf0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
2c00: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a  ;.      pScan->z
2c10: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d  CollName = pIdx-
2c20: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
2c30: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  }.  }else if( iC
2c40: 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29  olumn==XN_EXPR )
2c50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2c60: 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d    }.  pScan->opM
2c70: 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20  ask = opMask;.  
2c80: 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20  pScan->k = 0;.  
2c90: 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20  pScan->aiCur[0] 
2ca0: 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d  = iCur;.  pScan-
2cb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69  >aiColumn[0] = i
2cc0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d  Column;.  pScan-
2cd0: 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70  >nEquiv = 1;.  p
2ce0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31  Scan->iEquiv = 1
2cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65  ;.  return where
2d00: 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b  ScanNext(pScan);
2d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
2d20: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
2d30: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d40: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
2d50: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
2d60: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
2d70: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2d80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
2d90: 74 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66  table iCur or of
2da0: 20 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69   index pIdx.** i
2db0: 66 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f  f pIdx!=0 and <o
2dc0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  p> is one of the
2dd0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
2de0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
2df0: 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72  by.** the op par
2e00: 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20  ameter.  Return 
2e10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2e20: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2e30: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2e40: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
2e50: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
2e60: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
2e70: 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  es of table iCur
2e80: 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  .  .** Search fo
2e90: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  r terms matching
2ea0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2eb0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a  column of pIdx.*
2ec0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68  * rather than th
2ed0: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
2ee0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
2ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  r..**.** The ter
2f00: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
2f10: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
2f20: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
2f30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
2f40: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2f50: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
2f60: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
2f70: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
2f80: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
2f90: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
2fa0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
2fb0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
2fc0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
2fd0: 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c  ** aiCur[]/iaCol
2fe0: 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c  umn[] arrays hol
2ff0: 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  d X and all its 
3000: 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65  equivalents. The
3010: 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f  re are 11.** slo
3020: 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69  ts in aiCur[]/ai
3030: 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74  Column[] so that
3040: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
3050: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
3060: 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20   to 10.** other 
3070: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
3080: 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72  s.  Hence a sear
3090: 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65  ch for X will re
30a0: 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58  turn <expr> if X
30b0: 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32  =A1.** and A1=A2
30c0: 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e   and A2=A3 and .
30d0: 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e  .. and A9=A10 an
30e0: 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a  d A10=<expr>..**
30f0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
3100: 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
3110: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3120: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
3130: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
3140: 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20  ** then try for 
3150: 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20  the one with no 
3160: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20  dependencies on 
3170: 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65  <expr> - in othe
3180: 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a  r words where.**
3190: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e   <expr> is a con
31a0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
31b0: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
31c0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72  Only return entr
31d0: 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  ies of.** the fo
31e0: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
31f0: 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d  ere Y is a colum
3200: 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62  n in another tab
3210: 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f  le if no terms o
3220: 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58  f.** the form "X
3230: 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70   <op> <const-exp
3240: 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20  r>" exist.   If 
3250: 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20  no terms with a 
3260: 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20  constant RHS.** 
3270: 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65  exist, try to re
3280: 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74  turn a term that
3290: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f   does not use WO
32a0: 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65  _EQUIV..*/.Where
32b0: 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65  Term *sqlite3Whe
32c0: 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68  reFindTerm(.  Wh
32d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
32e0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
32f0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
3300: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
3310: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
3320: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
3330: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
3340: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
3350: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
3360: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
3370: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
3380: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
3390: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
33a0: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
33b0: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
33c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
33d0: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
33e0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
33f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
3400: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
3410: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
3420: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
3430: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
3440: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
3450: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
3460: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
3470: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
3480: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
3490: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
34a0: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
34b0: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
34c0: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57  .  op &= WO_EQ|W
34d0: 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70  O_IS;.  while( p
34e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
34f0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f  prereqRight & no
3500: 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
3510: 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65      if( p->prere
3520: 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d  qRight==0 && (p-
3530: 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d  >eOperator&op)!=
3540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
3550: 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61  tcase( p->eOpera
3560: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
3570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
3580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3590: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
35a0: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
35b0: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
35c0: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
35d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
35e0: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
35f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
3600: 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72  arches pList for
3610: 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d   an entry that m
3620: 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d  atches the iCol-
3630: 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  th column.** of 
3640: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
3650: 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70  * If such an exp
3660: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3670: 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70  , its index in p
3680: 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74  List->a[] is ret
3690: 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20  urned. If.** no 
36a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
36b0: 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  und, -1 is retur
36c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
36d0: 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28  nt findIndexCol(
36e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
36f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3700: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3710: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3720: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
3730: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3740: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73  ession list to s
3750: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
3760: 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  Base,           
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3780: 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61  rsor for table a
3790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
37a0: 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
37b0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37d0: 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d  x to match colum
37e0: 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43  n of */.  int iC
37f0: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
3800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
3810: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20  umn of index to 
3820: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
3830: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
3840: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
3850: 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a  >azColl[iCol];..
3860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
3870: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3880: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3890: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
38a0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
38b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
38c0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
38d0: 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43  MN.     && p->iC
38e0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
38f0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20  olumn[iCol].    
3900: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
3910: 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Base.    ){.    
3920: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
3940: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
3950: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3960: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  r);.      if( 0=
3970: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
3980: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
3990: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
39a0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
39b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
39c0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
39d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
39e0: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
39f0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
3a00: 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 0a 2a  dx is NOT NULL.*
3a10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
3a20: 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
3a30: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
3a40: 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6a 3b   iCol){.  int j;
3a50: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
3a60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3a70: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
3a80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
3a90: 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  .  j = pIdx->aiC
3aa0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 69  olumn[iCol];.  i
3ab0: 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 72  f( j>=0 ){.    r
3ac0: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
3ad0: 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  le->aCol[j].notN
3ae0: 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ull;.  }else if(
3af0: 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   j==(-1) ){.    
3b00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
3b10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  e{.    assert( j
3b20: 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20 20 72 65  ==(-2) );.    re
3b30: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41 73 73 75  turn 0;  /* Assu
3b40: 6d 65 20 61 6e 20 69 6e 64 65 78 65 64 20 65 78  me an indexed ex
3b50: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 6c 77  pression can alw
3b60: 61 79 73 20 79 69 65 6c 64 20 61 20 4e 55 4c 4c  ays yield a NULL
3b70: 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   */..  }.}../*.*
3b80: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
3b90: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
3ba0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61  pression-list pa
3bb0: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
3bc0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
3bd0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a   redundant..**.*
3be0: 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73  * A DISTINCT lis
3bf0: 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69  t is redundant i
3c00: 66 20 61 6e 79 20 73 75 62 73 65 74 20 6f 66 20  f any subset of 
3c10: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
3c20: 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6c  he.** DISTINCT l
3c30: 69 73 74 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ist are collecti
3c40: 76 65 6c 79 20 75 6e 69 71 75 65 20 61 6e 64 20  vely unique and 
3c50: 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6e 6f 6e  individually non
3c60: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
3c70: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
3c80: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
3c90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3ca0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3cb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
3cc0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
3ce0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
3cf0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3d00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
3d10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3d20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3d30: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
3d40: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
3d50: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
3d60: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
3d70: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
3d80: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
3d90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3db0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
3dc0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
3dd0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
3de0: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
3df0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3e00: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
3e10: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
3e20: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
3e30: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
3e40: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
3e50: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
3e60: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
3e70: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
3e80: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
3e90: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
3ea0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
3eb0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
3ec0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
3ed0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
3ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
3ef0: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
3f00: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
3f10: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
3f20: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
3f30: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
3f40: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
3f50: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
3f60: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
3f70: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
3f80: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
3f90: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
3fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
3fb0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
3fc0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
3fd0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
3fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
3ff0: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
4000: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
4010: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
4020: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
4030: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
4040: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4050: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
4060: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
4070: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
4080: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
4090: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
40a0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
40b0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
40c0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
40d0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
40e0: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
40f0: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
4100: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
4110: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
4120: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
4130: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
4140: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
4150: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
4160: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
4170: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4180: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
4190: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
41a0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
41b0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
41c0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
41d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
41e0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
41f0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
4200: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
4210: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
4220: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
4230: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
4240: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
4250: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
4260: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
4270: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
4280: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
4290: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
42a0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
42b0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
42c0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
42d0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
42e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
42f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
4300: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
4310: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
4320: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
4340: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
4350: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
4360: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
4370: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 2c  m(pWC, iBase, i,
4380: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
4390: 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
43a0: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 49 6e        if( findIn
43b0: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
43c0: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
43d0: 20 70 49 64 78 2c 20 69 29 3c 30 20 29 20 62 72   pIdx, i)<0 ) br
43e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
43f0: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
4400: 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d 3d 30 20  ull(pIdx, i)==0 
4410: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4430: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
4440: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
4450: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
4460: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
4470: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
4480: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
4490: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
44a0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
44b0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
44c0: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
44d0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
44e0: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
44f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
4500: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
4510: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
4520: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
4530: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
4540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4550: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
4560: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
4570: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
4580: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
4590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45a0: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
45b0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
45c0: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
45d0: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
45e0: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 77  s into OP_Copy w
45f0: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73  hen the table is
4600: 20 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 20   being accessed 
4610: 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 0a  via co-routine .
4620: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  ** instead of vi
4630: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 0a  a table lookup..
4640: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 49 6e  **.** If the bIn
4650: 63 72 52 6f 77 69 64 20 70 61 72 61 6d 65 74 65  crRowid paramete
4660: 72 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e 79  r is 0, then any
4670: 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73 74 72 75   OP_Rowid instru
4680: 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63 75 72  ctions on.** cur
4690: 73 6f 72 20 69 54 61 62 43 75 72 20 61 72 65 20  sor iTabCur are 
46a0: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
46b0: 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c 20 69 66   OP_Null. Or, if
46c0: 20 62 49 6e 63 72 52 6f 77 69 64 20 69 73 20 6e   bIncrRowid is n
46d0: 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  on-zero,.** then
46e0: 20 65 61 63 68 20 4f 50 5f 52 6f 77 69 64 20 69   each OP_Rowid i
46f0: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
4700: 74 6f 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  to an instructio
4710: 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  n to increment t
4720: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
4730: 65 64 20 69 6e 20 69 74 73 20 6f 75 74 70 75 74  ed in its output
4740: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 73 74   register..*/.st
4750: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
4760: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
4770: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4780: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4790: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
47a0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
47b0: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
47c0: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
47d0: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
47e0: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
47f0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
4800: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
4810: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
4820: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4830: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4840: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4850: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4860: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4870: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4880: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4890: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
48a0: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
48b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
48c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
48d0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  ;.  VdbeOp *pOp 
48e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
48f0: 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20  Op(v, iStart);. 
4900: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
4910: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4920: 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 50 61  dr(v);.  if( pPa
4930: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4940: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4950: 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c 69    for(; iStart<i
4960: 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70  End; iStart++, p
4970: 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Op++){.    if( p
4980: 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72 20  Op->p1!=iTabCur 
4990: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
49b0: 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
49c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
49d0: 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20  = OP_Copy;.     
49e0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e   pOp->p1 = pOp->
49f0: 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b 0a  p2 + iRegister;.
4a00: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4a10: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pOp->p3;.      p
4a20: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
4a30: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
4a40: 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
4a50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
4a60: 63 72 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  crRowid ){.     
4a70: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
4a80: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
4a90: 20 69 6e 20 74 68 65 20 50 32 20 6f 70 65 72 61   in the P2 opera
4aa0: 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f 52 6f 77  nd of the OP_Row
4ab0: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  id. */.        p
4ac0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4ad0: 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20 20 20 20  AddImm;.        
4ae0: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70  pOp->p1 = pOp->p
4af0: 32 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  2;.        pOp->
4b00: 70 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  p2 = 1;.      }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
4b20: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
4b30: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
4b40: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >p1 = 0;.       
4b50: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
4b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
4b80: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
4b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
4ba0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
4bb0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
4bc0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
4bd0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
4be0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
4bf0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
4c00: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
4c10: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
4c20: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
4c30: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
4c40: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
4c50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4c60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
4c70: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
4c80: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
4c90: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
4ca0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
4cb0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4cc0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4cd0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ce0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4cf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4d00: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4d10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4d20: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
4d30: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
4d40: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
4d50: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
4d60: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
4d70: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4d80: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
4d90: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4da0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
4db0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
4dc0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
4dd0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
4de0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
4df0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
4e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
4e10: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
4e20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4e30: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
4e40: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
4e50: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
4e60: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
4e70: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4e80: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
4e90: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
4ea0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
4eb0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
4ec0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4ed0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
4ee0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
4ef0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
4f00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4f10: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4f20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
4f30: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
4f40: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
4f50: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
4f60: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
4f70: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
4f80: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
4f90: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
4fa0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
4fb0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
4fc0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4fd0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
4fe0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
4ff0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5000: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
5010: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
5020: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5030: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
5040: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
5050: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
5060: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
5070: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5080: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
5090: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
50a0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
50b0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
50c0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
50d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
50e0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
50f0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
5100: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
5110: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
5120: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
5130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5140: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
5150: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
5160: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
5170: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
5180: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
5190: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
51a0: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
51b0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
51c0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
51d0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
51e0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
51f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5200: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5210: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
5220: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
5230: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
5240: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
5250: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
5260: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5270: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
5280: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
5290: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
52a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
52c0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
52d0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
52e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
52f0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
5300: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
5310: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
5320: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5330: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
5340: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d  (WO_EQ|WO_IS))==
5350: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5360: 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
5370: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
5380: 29 20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  ) .   && !ExprHa
5390: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
53a0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
53b0: 6f 69 6e 29 0a 20 20 20 26 26 20 28 70 54 65 72  oin).   && (pTer
53c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
53d0: 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 2f  O_IS).  ){.    /
53e0: 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  * Cannot use an 
53f0: 49 53 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  IS term from the
5400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73   WHERE clause as
5410: 20 61 6e 20 69 6e 64 65 78 20 64 72 69 76 65 72   an index driver
5420: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
5430: 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  RHS of a LEFT JO
5440: 49 4e 2e 20 53 75 63 68 20 61 20 74 65 72 6d 20  IN. Such a term 
5450: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
5460: 20 69 66 20 69 74 20 69 73 20 66 72 6f 6d 0a 20   if it is from. 
5470: 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 63 6c 61     ** the ON cla
5480: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74  use.  */.    ret
5490: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
54a0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
54b0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
54c0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
54d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
54e0: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
54f0: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
5500: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
5510: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
5520: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
5540: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
5550: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
5560: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
5570: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
5580: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
5590: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
55a0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
55b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
55c0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
55d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
55e0: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
55f0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
5600: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
5610: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
5620: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
5630: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
5640: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
5650: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
5660: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
5670: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
5680: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
5690: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
56a0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
56b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
56d0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
56e0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
56f0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5700: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5710: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5720: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5730: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5740: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5750: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
5760: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
5770: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5790: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
57a0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
57b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
57c0: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
57d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
57e0: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
57f0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5810: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5820: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5830: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5840: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5850: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
5860: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
5870: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5880: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
5890: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
58a0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
58b0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
58c0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
58e0: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
58f0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5900: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5930: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5940: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5950: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
5960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5970: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
5980: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
5990: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
59a0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
59c0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
59d0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
59e0: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
59f0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5a00: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
5a10: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
5a20: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
5a30: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5a40: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
5a50: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
5a60: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
5a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
5a80: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
5a90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5ac0: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ae0: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
5af0: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
5b00: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5b10: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5b20: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
5b30: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
5b40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
5b50: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
5b60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
5b70: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
5b80: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5ba0: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
5bb0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
5bc0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
5bd0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
5be0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
5bf0: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
5c00: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
5c10: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
5c20: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
5c30: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
5c40: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
5c50: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5c70: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
5c80: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
5c90: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
5ca0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
5cb0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
5cc0: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
5cd0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
5ce0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
5cf0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5d00: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
5d10: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5d20: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
5d30: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
5d40: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
5d50: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
5d60: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
5d70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5d80: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
5d90: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
5da0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
5db0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
5dd0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
5de0: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
5df0: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
5e00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5e10: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
5e20: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
5e30: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
5e40: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
5e50: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
5e60: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
5e70: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
5e80: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
5e90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5ea0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5eb0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
5ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
5ed0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
5ee0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
5ef0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
5f00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
5f10: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
5f20: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
5f30: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
5f40: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
5f50: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
5f60: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
5f70: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
5f80: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
5f90: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
5fa0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
5fb0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
5fc0: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
5fd0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5fe0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
5ff0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
6000: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6010: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6020: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
6030: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
6040: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
6050: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
6060: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
6070: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
6080: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6090: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
60a0: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
60b0: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
60d0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
6100: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
6110: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
6120: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
6130: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6140: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
6150: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
6160: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6170: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6180: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
6190: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
61a0: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
61b0: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
61c0: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
61d0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
61e0: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
61f0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6220: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
6230: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  xpr, 0));.    }.
6240: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
6250: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
6260: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
6270: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
6280: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
6290: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
62a0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
62b0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
62c0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
62d0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
62e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
62f0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
6300: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6310: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
6320: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
6330: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6340: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
6350: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
6360: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
6370: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
6380: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
6390: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
63a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
63b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
63c0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
63d0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
63e0: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
63f0: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
6400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
6410: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
6420: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
6430: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20   nKeyCol+1) ){. 
6440: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
6450: 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65  d_auto_index_cre
6460: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ate;.        }. 
6470: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
6480: 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20  Term[nKeyCol++] 
6490: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
64a0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
64b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
64c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
64d0: 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c  KeyCol>0 );.  pL
64e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
64f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
6500: 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c   = nKeyCol;.  pL
6510: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
6520: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
6530: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
6540: 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54       | WHERE_AUT
6570: 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  O_INDEX;..  /* C
6580: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6590: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
65a0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
65b0: 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
65c0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
65d0: 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
65e0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
65f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
6600: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
6610: 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
6620: 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
6630: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6640: 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
6650: 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
6660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
6670: 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
6680: 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
6690: 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
66a0: 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
66b0: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
66c0: 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
66d0: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
66e0: 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
66f0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
6700: 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
6710: 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
6720: 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
6730: 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
6740: 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
6750: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
6760: 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
6770: 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
6780: 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31  tCol = MIN(BMS-1
6790: 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a  ,pTable->nCol);.
67a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
67b0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
67c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
67d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
67e0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
67f0: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
6800: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
6810: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
6820: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
6830: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
6840: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
6850: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
6860: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
6870: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
6880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ;.  }..  /* Cons
6890: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
68a0: 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
68b0: 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
68c0: 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65  .  pIdx = sqlite
68d0: 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62  3AllocateIndexOb
68e0: 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c  ject(pParse->db,
68f0: 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26   nKeyCol+1, 0, &
6900: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
6910: 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20   pIdx==0 ) goto 
6920: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
6930: 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  reate;.  pLoop->
6940: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
6950: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
6960: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
6970: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
6980: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
6990: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
69a0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
69b0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
69c0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
69d0: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
69e0: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
69f0: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
6a00: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
6a10: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
6a20: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
6a30: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
6a40: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
6a50: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
6a60: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
6a70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
6a80: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
6a90: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
6aa0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
6ab0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
6ac0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
6ad0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
6ae0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6af0: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
6b00: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
6b10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b20: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
6b30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
6b40: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
6b50: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
6b60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
6b70: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
6b80: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
6b90: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43  ->azColl[n] = pC
6ba0: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
6bb0: 6d 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42  me : sqlite3StrB
6bc0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6e  INARY;.        n
6bd0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6be0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6bf0: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
6c00: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
6c10: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
6c20: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6c30: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
6c40: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
6c50: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
6c60: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
6c70: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
6c80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6c90: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
6ca0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
6cb0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6cc0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6cd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6ce0: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6cf0: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6d00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
6d10: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
6d20: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
6d30: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
6d40: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
6d50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
6d60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6d70: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
6d80: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6d90: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
6da0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
6db0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
6dc0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
6dd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6de0: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49 64 78  XN_ROWID;.  pIdx
6df0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
6e00: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
6e10: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
6e20: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
6e30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
6e40: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
6e50: 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49   );.  pLevel->iI
6e60: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
6e70: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
6e80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6e90: 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
6ea0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6eb0: 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20  , nKeyCol+1);.  
6ec0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
6ed0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
6ee0: 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d  pIdx);.  VdbeCom
6ef0: 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
6f00: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
6f10: 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
6f20: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6f30: 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
6f40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
6f50: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
6f60: 29 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  );.  pTabItem = 
6f70: 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  &pWC->pWInfo->pT
6f80: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
6f90: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20  ->iFrom];.  if( 
6fa0: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6fb0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6fc0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
6fd0: 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
6fe0: 75 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75  urn;.    addrCou
6ff0: 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  nter = sqlite3Vd
7000: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7010: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
7020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7030: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
7040: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
7050: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
7060: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
7070: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71     addrTop =  sq
7080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7090: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
70a0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65  Yield);.    Vdbe
70b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
70c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
70d0: 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
70e0: 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
70f0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
7100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
7110: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
7120: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
7130: 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
7140: 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76  TabCur); VdbeCov
7150: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
7160: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
7170: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
7180: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
7190: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
71a0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
71b0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
71c0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
71d0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
71e0: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
71f0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
7200: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
7210: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
7220: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7230: 72 73 65 29 3b 0a 20 20 72 65 67 42 61 73 65 20  rse);.  regBase 
7240: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
7250: 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 20 20 20  eIndexKey(.     
7260: 20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70   pParse, pIdx, p
7270: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
7280: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
7290: 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c   0, 0.  );.  sql
72a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
72b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
72c0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
72d0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
72e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
72f0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
7300: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69  SEEKRESULT);.  i
7310: 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71  f( pPartial ) sq
7320: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7330: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
7340: 75 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49  ue);.  if( pTabI
7350: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
7360: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
7380: 76 2c 20 61 64 64 72 43 6f 75 6e 74 65 72 2c 20  v, addrCounter, 
7390: 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20  regBase+n);.    
73a0: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
73b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
73c0: 65 64 20 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c  ed );.    transl
73d0: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
73e0: 70 50 61 72 73 65 2c 20 61 64 64 72 54 6f 70 2c  pParse, addrTop,
73f0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7410: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
7420: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
7430: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
7440: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
7450: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
7460: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
7470: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
7480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7490: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
74a0: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
74b0: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
74c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
74d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
74e0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
74f0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
7500: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
7510: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7520: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
7530: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7540: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7550: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
7560: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
7570: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
7580: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
7590: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
75a0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
75b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
75c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
75d0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
75e0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
75f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
7610: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
7620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7630: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
7640: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7650: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7660: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
7670: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7680: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
7690: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
76a0: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
76b0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
76c0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
76d0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
76e0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
76f0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
7700: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
7710: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7720: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7730: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7740: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7750: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7760: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7770: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7790: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
77a0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
77b0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
77c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
77d0: 45 52 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ERE clause being
77e0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
77f0: 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
7800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7810: 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77  * Ignore terms w
7820: 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65 71  ith these prereq
7830: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7840: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
7850: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
7860: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
7870: 68 61 74 20 69 73 20 74 68 65 20 76 74 61 62 20  hat is the vtab 
7880: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7890: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
78a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
78b0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
78c0: 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20   u16 *pmNoOmit  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d   /* Mask of term
78f0: 73 20 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f  s not to omit */
7900: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
7910: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
7920: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7930: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
7940: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
7950: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7960: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
7970: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
7980: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7990: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
79a0: 70 55 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74  pUsage;.  struct
79b0: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
79c0: 20 2a 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65   *pHidden;.  Whe
79d0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
79e0: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
79f0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7a00: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
7a10: 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30   u16 mNoOmit = 0
7a20: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
7a30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
7a40: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
7a50: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
7a60: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
7a70: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
7a80: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
7a90: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
7aa0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
7ab0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
7ac0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
7ad0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
7ae0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
7af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7b00: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7b10: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7b20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7b30: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7b40: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7b50: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7b60: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7b70: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7b80: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7ba0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7bb0: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
7bc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7bd0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7be0: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
7bf0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7c00: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7c10: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7c20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7c30: 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29  (WO_EQUIV))==0 )
7c40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7c50: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7c60: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7c70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7c80: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
7c90: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
7ca0: 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b   );.    nTerm++;
7cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
7cc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7cd0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
7ce0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
7cf0: 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
7d00: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
7d10: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
7d20: 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
7d30: 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
7d40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7d50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
7d60: 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
7d70: 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
7d80: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
7d90: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
7da0: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
7db0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7dc0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
7dd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
7de0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
7df0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
7e00: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
7e10: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
7e20: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
7e30: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
7e40: 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
7e50: 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
7e60: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
7e70: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
7e80: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
7e90: 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
7ea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7eb0: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7ec0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
7ed0: 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
7ef0: 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
7f00: 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
7f10: 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
7f40: 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
7f50: 4f 72 64 65 72 42 79 20 2b 20 73 69 7a 65 6f 66  OrderBy + sizeof
7f60: 28 2a 70 48 69 64 64 65 6e 29 20 29 3b 0a 20 20  (*pHidden) );.  
7f70: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
7f80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fa0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
7fb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7fc0: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
7fd0: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
7fe0: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
7ff0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8000: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
8010: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
8020: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
8030: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
8040: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
8050: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
8060: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
8070: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
8080: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
8090: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
80a0: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
80b0: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 48 69 64 64  ds..  */.  pHidd
80c0: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 48 69 64  en = (struct Hid
80d0: 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70  denIndexInfo*)&p
80e0: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
80f0: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
8100: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8110: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 48 69 64  onstraint*)&pHid
8120: 64 65 6e 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  den[1];.  pIdxOr
8130: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
8140: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8150: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
8160: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
8170: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
8180: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
8190: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
81a0: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
81b0: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
81c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
81d0: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
81e0: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
81f0: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
8200: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
8210: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
8220: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
8230: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
8240: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
8250: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8260: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
8270: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
8280: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
8290: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
82a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
82b0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
82c0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
82d0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 70 48 69    pUsage;..  pHi
8330: 64 64 65 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  dden->pWC = pWC;
8340: 0a 20 20 70 48 69 64 64 65 6e 2d 3e 70 50 61 72  .  pHidden->pPar
8350: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8360: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
8370: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
8380: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
8390: 2b 2b 29 7b 0a 20 20 20 20 75 31 36 20 6f 70 3b  ++){.    u16 op;
83a0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
83b0: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
83c0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
83d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
83e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
83f0: 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29  ht & mUnusable )
8400: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
8410: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
8420: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
8430: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
8440: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
8450: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
8460: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
8470: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8480: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8490: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
84a0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
84b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
84c0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
84d0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
84e0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
84f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
8500: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
8510: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
8520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8530: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
8540: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
8550: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
8560: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c  sert( pTerm->u.l
8570: 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20  eftColumn>=(-1) 
8580: 29 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  );.    pIdxCons[
8590: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
85a0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
85b0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
85c0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
85d0: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 70 54 65 72  i;.    op = pTer
85e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
85f0: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
8600: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
8610: 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f  WO_EQ;.    if( o
8620: 70 3d 3d 57 4f 5f 41 55 58 20 29 7b 0a 20 20 20  p==WO_AUX ){.   
8630: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8640: 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63  p = pTerm->eMatc
8650: 68 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  hOp;.    }else i
8660: 66 28 20 6f 70 20 26 20 28 57 4f 5f 49 53 4e 55  f( op & (WO_ISNU
8670: 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  LL|WO_IS) ){.   
8680: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 53     if( op==WO_IS
8690: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
86a0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
86b0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
86c0: 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b  NSTRAINT_ISNULL;
86d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86e0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
86f0: 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ].op = SQLITE_IN
8700: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
8710: 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
8720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
8730: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
8740: 29 6f 70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  )op;.      /* Th
8750: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
8760: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
8770: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
8780: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
8790: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57  e.      ** the W
87a0: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
87b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
87c0: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
87d0: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20  cal.  The.      
87e0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
87f0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
8800: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20   fact. */.      
8810: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
8820: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8830: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
8840: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
8850: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8860: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
8870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
8880: 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
8890: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
88a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
88b0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
88c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
88d0: 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GT );.      asse
88e0: 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
88f0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8900: 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_GE );.      a
8910: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
8920: 70 65 72 61 74 6f 72 26 28 57 4f 5f 49 4e 7c 57  perator&(WO_IN|W
8930: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
8940: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
8950: 41 55 58 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  AUX) );..      i
8960: 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  f( op & (WO_LT|W
8970: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8980: 29 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  ).       && sqli
8990: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
89a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
89b0: 69 67 68 74 29 20 0a 20 20 20 20 20 20 29 7b 0a  ight) .      ){.
89c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 31 36          if( i<16
89d0: 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31   ) mNoOmit |= (1
89e0: 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   << i);.        
89f0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20  if( op==WO_LT ) 
8a00: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a10: 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20   WO_LE;.        
8a20: 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20  if( op==WO_GT ) 
8a30: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8a40: 20 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 0a   WO_GE;.      }.
8a50: 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a      }..    j++;.
8a60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
8a70: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
8a80: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8a90: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8aa0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
8ab0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
8ac0: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
8ad0: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
8ae0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
8af0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
8b00: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
8b10: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f   *pmNoOmit = mNo
8b20: 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Omit;.  return p
8b30: 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  IdxInfo;.}../*.*
8b40: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65  * The table obje
8b50: 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73  ct reference pas
8b60: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
8b70: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8b80: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
8b90: 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20  ust represent a 
8ba0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
8bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  his function inv
8bc0: 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e  okes the xBestIn
8bd0: 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  dex().** method 
8be0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
8bf0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71  able with the sq
8c00: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8c10: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
8c20: 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20  comes in as the 
8c30: 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3rd argument to 
8c40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8c50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8c60: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
8c70: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
8c80: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
8c90: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
8ca0: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
8cb0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
8cc0: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
8cd0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
8ce0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
8cf0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8d00: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
8d10: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
8d20: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
8d30: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
8d40: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
8d50: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8d60: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
8d70: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8d80: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
8d90: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
8da0: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
8db0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
8dc0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
8dd0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
8de0: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
8df0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
8e00: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
8e10: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
8e20: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
8e30: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
8e40: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
8e50: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
8e60: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43   int rc;..  TRAC
8e70: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
8e80: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
8e90: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
8ea0: 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
8eb0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
8ec0: 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
8ed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8ee0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8ef0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
8f00: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
8f10: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
8f20: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
8f30: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
8f40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8f60: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
8f70: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
8f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8f90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8fa0: 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
8fb0: 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
8fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8fd0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8fe0: 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
8ff0: 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f   = 0;..#if 0.  /
9000: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20  * This error is 
9010: 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68  now caught by th
9020: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53  e caller..  ** S
9030: 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74  earch for "xBest
9040: 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
9050: 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f  n" below */.  fo
9060: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
9070: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
9080: 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
9090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
90a0: 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
90b0: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
90c0: 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
90d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
90f0: 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
9100: 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
9110: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
9120: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
9130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9140: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
9150: 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
9160: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
9170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9180: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
9190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
91a0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
91b0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
91c0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
91d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
91e0: 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
91f0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
9200: 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
9210: 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
9220: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
9230: 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
9240: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
9250: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52  ows less than pR
9260: 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  ec.**    aStat[1
9270: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
9280: 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
9290: 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52   to pRec.**.** R
92a0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
92b0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68  of the sample th
92c0: 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65  at is the smalle
92d0: 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a  st sample that.*
92e0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
92f0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
9300: 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ec. Note that th
9310: 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
9320: 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f  an index.** into
9330: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9340: 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20  rray - it is an 
9350: 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72  index into a vir
9360: 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70  tual set of samp
9370: 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  les.** based on 
9380: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9390: 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68  aSample[] and th
93a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
93b0: 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a  ds in record .**
93c0: 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69   pRec. .*/.stati
93d0: 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
93e0: 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
93f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
9400: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9410: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
9420: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
9430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9440: 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
9450: 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55  domain of */.  U
9460: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
9470: 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65  Rec,       /* Ve
9480: 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74  ctor of values t
9490: 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
94a0: 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20  int roundUp,    
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
94c0: 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e  ound up if true.
94d0: 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20    Round down if 
94e0: 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63  false */.  tRowc
94f0: 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20  nt *aStat       
9500: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73         /* OUT: s
9510: 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72  tats written her
9520: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53  e */.){.  IndexS
9530: 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d  ample *aSample =
9540: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
9550: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72   Index of requir
9580: 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71  ed stats in anEq
9590: 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  [] etc. */.  int
95a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
95c0: 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c  x of first sampl
95d0: 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69  e >= pRec */.  i
95e0: 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
95f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
9600: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
9610: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
9620: 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
9630: 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20  int iMin = 0;   
9640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9650: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e  mallest sample n
9660: 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f  ot yet tested */
9670: 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
96a0: 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
96b0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
96c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
96d0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
96e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
96f0: 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
9700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9710: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
9720: 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63   pRec */.  tRowc
9730: 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20  nt iLower = 0;  
9740: 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d         /* anLt[]
9750: 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72   + anEq[] of lar
9760: 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63  gest sample pRec
9770: 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65   is > */..#ifnde
9780: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9790: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
97a0: 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
97b0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
97c0: 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ec!=0 );.  asser
97d0: 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  t( pIdx->nSample
97e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
97f0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26  pRec->nField>0 &
9800: 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d  & pRec->nField<=
9810: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
9820: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62   );..  /* Do a b
9830: 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20  inary search to 
9840: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73  find the first s
9850: 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68  ample greater th
9860: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a  an or equal.  **
9870: 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65   to pRec. If pRe
9880: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  c contains a sin
9890: 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73  gle field, the s
98a0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f  et of samples to
98b0: 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20   search.  ** is 
98c0: 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70  simply the aSamp
98d0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74  le[] array. If t
98e0: 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53  he samples in aS
98f0: 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  ample[] contain 
9900: 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f  more.  ** than o
9910: 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66  ne fields, all f
9920: 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ields following 
9930: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
9940: 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nored..  **.  **
9950: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9960: 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72  s N fields, wher
9970: 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  e N is more than
9980: 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65   one, then as we
9990: 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73  ll as the.  ** s
99a0: 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c  amples in aSampl
99b0: 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74  e[] (truncated t
99c0: 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65  o N fields), the
99d0: 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73   search also has
99e0: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65   to.  ** conside
99f0: 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68  r prefixes of th
9a00: 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72  ose samples. For
9a10: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
9a20: 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a   set of samples.
9a30: 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20    ** in aSample 
9a40: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
9a50: 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28    aSample[0] = (
9a60: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9a70: 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c  aSample[1] = (a,
9a80: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61   10) .  **     a
9a90: 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20  Sample[2] = (b, 
9aa0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9ab0: 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30  mple[3] = (c, 10
9ac0: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  0) .  **     aSa
9ad0: 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30  mple[4] = (c, 10
9ae0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  5).  **.  ** The
9af0: 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  n the search spa
9b00: 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c  ce should ideall
9b10: 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73  y be the samples
9b20: 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a   above and the .
9b30: 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66    ** unique pref
9b40: 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e  ixes [a], [b] an
9b50: 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65  d [c]. But since
9b60: 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f   that is hard to
9b70: 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a   organize, .  **
9b80: 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c   the code actual
9b90: 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73  ly searches this
9ba0: 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set:.  **.  ** 
9bb0: 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a      0: (a) .  **
9bc0: 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a       1: (a, 5) .
9bd0: 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20    **     2: (a, 
9be0: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a  10) .  **     3:
9bf0: 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20   (a, 10) .  **  
9c00: 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20     4: (b) .  ** 
9c10: 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20      5: (b, 5) . 
9c20: 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a   **     6: (c) .
9c30: 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20    **     7: (c, 
9c40: 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38  100) .  **     8
9c50: 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20  : (c, 105).  ** 
9c60: 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a      9: (c, 105).
9c70: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61    **.  ** For ea
9c80: 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  ch sample in the
9c90: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9ca0: 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20  , N samples are 
9cb0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
9cc0: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61   ** effective sa
9cd0: 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74  mple array. In t
9ce0: 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65  he above, sample
9cf0: 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61  s 0 and 1 are ba
9d00: 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d  sed on .  ** sam
9d10: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20  ple aSample[0]. 
9d20: 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20  Samples 2 and 3 
9d30: 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74  on aSample[1] et
9d40: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74  c..  **.  ** Oft
9d50: 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20  en, sample i of 
9d60: 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  each block of N 
9d70: 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65  effective sample
9d80: 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c  s has (i+1) fiel
9d90: 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c  ds..  ** Except,
9da0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79   each sample may
9db0: 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
9dc0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69  ensure that it i
9dd0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9de0: 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  r.  ** equal to 
9df0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d  the previous sam
9e00: 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79  ple in the array
9e10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9e20: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20  n the above, .  
9e30: 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74  ** sample 2 is t
9e40: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
9e50: 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20  of a block of N 
9e60: 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66  samples, so at f
9e70: 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70  irst it .  ** ap
9e80: 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68  pears that it sh
9e90: 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20  ould be 1 field 
9ea0: 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72  in size. However
9eb0: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  , that would mak
9ec0: 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c  e it .  ** small
9ed0: 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31  er than sample 1
9ee0: 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20  , so the binary 
9ef0: 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74  search would not
9f00: 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75   work. As a resu
9f10: 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  lt, .  ** it is 
9f20: 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20  extended to two 
9f30: 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c  fields. The dupl
9f40: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73  icates that this
9f50: 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20   creates do not 
9f60: 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20  .  ** cause any 
9f70: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
9f80: 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e   nField = pRec->
9f90: 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d  nField;.  iCol =
9fa0: 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20   0;.  iSample = 
9fb0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20  pIdx->nSample * 
9fc0: 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20  nField;.  do{.  
9fd0: 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20    int iSamp;    
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d  /* Index in aSam
a000: 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61  ple[] of test sa
a010: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mple */.    int 
a020: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
a030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a040: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
a050: 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a   test sample */.
a060: 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d  .    iTest = (iM
a070: 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20  in+iSample)/2;. 
a080: 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74     iSamp = iTest
a090: 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69   / nField;.    i
a0a0: 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20  f( iSamp>0 ){.  
a0b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f      /* The propo
a0c0: 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61  sed effective sa
a0d0: 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78  mple is a prefix
a0e0: 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   of sample aSamp
a0f0: 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20  le[iSamp]..     
a100: 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79   ** Specifically
a110: 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70  , the shortest p
a120: 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73  refix of at leas
a130: 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69  t (1 + iTest%nFi
a140: 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66  eld) .      ** f
a150: 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72  ields that is gr
a160: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
a170: 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76  revious effectiv
a180: 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20  e sample.  */.  
a190: 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74      for(n=(iTest
a1a0: 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20   % nField) + 1; 
a1b0: 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a  n<nField; n++){.
a1c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
a1d0: 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c  ple[iSamp-1].anL
a1e0: 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b  t[n-1]!=aSample[
a1f0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
a200: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a210: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a220: 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31     n = iTest + 1
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65  ;.    }..    pRe
a240: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20  c->nField = n;. 
a250: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
a260: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a270: 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e(aSample[iSamp]
a280: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  .n, aSample[iSam
a290: 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20  p].p, pRec);.   
a2a0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
a2b0: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
a2c0: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
a2d0: 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b  [n-1] + aSample[
a2e0: 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d  iSamp].anEq[n-1]
a2f0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
a300: 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
a310: 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20  e if( res==0 && 
a320: 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  n<nField ){.    
a330: 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
a340: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
a350: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
a360: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
a370: 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d   res = -1;.    }
a380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d  else{.      iSam
a390: 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20  ple = iTest;.   
a3a0: 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20     iCol = n-1;. 
a3b0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
a3c0: 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70  es && iMin<iSamp
a3d0: 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d  le );.  i = iSam
a3e0: 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23  ple / nField;..#
a3f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a400: 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  UG.  /* The foll
a410: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
a420: 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68  tements check th
a430: 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  at the binary se
a440: 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61  arch code.  ** a
a450: 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72  bove found the r
a460: 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69  ight answer. Thi
a470: 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e  s block serves n
a480: 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a  o purpose other.
a490: 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76    ** than to inv
a4a0: 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e  oke the asserts.
a4b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
a4c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a4d0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  led==0 ){.    if
a4e0: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
a4f0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
a500: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70   is true, then p
a510: 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61  Rec must be equa
a520: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a  l to sample i. *
a530: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a540: 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  i<pIdx->nSample 
a550: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a560: 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
a570: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
a580: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a590: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
a5a0: 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  =sqlite3VdbeReco
a5b0: 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
a5c0: 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
a5d0: 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20  i].p, pRec) .   
a5e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a5f0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a600: 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  led .      );.  
a610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a620: 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78  * Unless i==pIdx
a630: 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63  ->nSample, indic
a640: 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20  ating that pRec 
a650: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  is larger than. 
a660: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70       ** all samp
a670: 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70  les in the aSamp
a680: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63  le[] array, pRec
a690: 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
a6a0: 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
a6b0: 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c  ** (iCol+1) fiel
a6c0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a6d0: 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20  le i.  */.      
a6e0: 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d  assert( i<=pIdx-
a6f0: 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30  >nSample && i>=0
a700: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
a710: 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b  nField = iCol+1;
a720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a730: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
a750: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a760: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a770: 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
a780: 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20  .p, pRec)>0.    
a790: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a7a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a7b0: 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ed );..      /* 
a7c0: 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c  if i==0 and iCol
a7d0: 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ==0, then record
a7e0: 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72   pRec is smaller
a7f0: 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   than all sample
a800: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
a810: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a820: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
a830: 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70   (iCol>0) then p
a840: 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  Rec must.      *
a850: 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  * be greater tha
a860: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
a870: 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70  e (iCol) field p
a880: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
a890: 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28  i..      ** If (
a8a0: 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20  i>0), then pRec 
a8b0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65  must also be gre
a8c0: 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ater than sample
a8d0: 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20   (i-1).  */.    
a8e0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
a8f0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a900: 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  ield = iCol;.   
a910: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a920: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
a930: 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d  mpare(aSample[i]
a940: 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70  .n, aSample[i].p
a950: 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20  , pRec)<=0.     
a960: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
a970: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a980: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
a990: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
a9a0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
a9b0: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
a9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
a9d0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
a9e0: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
a9f0: 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  i-1].n, aSample[
aa00: 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a  i-1].p, pRec)<0.
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
aa20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
aa30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
aa40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
aa50: 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
aa60: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
aa70: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
aa80: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65     /* Record pRe
aa90: 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61  c is equal to sa
aaa0: 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73  mple i */.    as
aab0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65  sert( iCol==nFie
aac0: 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61  ld-1 );.    aSta
aad0: 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[0] = aSample[i
aae0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
aaf0: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
ab00: 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f  mple[i].anEq[iCo
ab10: 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l];.  }else{.   
ab20: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
ab30: 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20  t, the (iCol+1) 
ab40: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
ab50: 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
ab60: 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20  e first .    ** 
ab70: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
ab80: 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63  reater than pRec
ab90: 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78  . Or, if i==pIdx
aba0: 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70  ->nSample then p
abb0: 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61  Rec.    ** is la
abc0: 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  rger than all sa
abd0: 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72  mples in the arr
abe0: 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  ay. */.    tRowc
abf0: 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b  nt iUpper, iGap;
ac00: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78  .    if( i>=pIdx
ac10: 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
ac20: 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69     iUpper = sqli
ac30: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
ac40: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
ac50: 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
ac60: 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
ac70: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
ac80: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  iCol];.    }..  
ac90: 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
aca0: 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
acb0: 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
acc0: 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
acd0: 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
acf0: 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
ad00: 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
ad10: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
ad20: 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
ad30: 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
ad40: 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
ad50: 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74   iGap;.    aStat
ad60: 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67  [1] = pIdx->aAvg
ad70: 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  Eq[nField-1];.  
ad80: 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
ad90: 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  the pRec->nField
ada0: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
adb0: 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70  turning.  */.  p
adc0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
add0: 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69  ield;.  return i
ade0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
adf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ae00: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
ae10: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
ae20: 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
ae30: 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
ae40: 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
ae50: 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
ae60: 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
ae70: 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
ae80: 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
ae90: 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
aea0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
aeb0: 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
aec0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
aed0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
aee0: 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
aef0: 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
af00: 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
af10: 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
af20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
af30: 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
af40: 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
af50: 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
af60: 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
af70: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
af80: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
af90: 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
afa0: 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
afb0: 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
afc0: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
afd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
afe0: 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
aff0: 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
b000: 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
b010: 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
b020: 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
b030: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
b040: 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
b050: 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
b060: 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
b070: 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
b080: 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
b090: 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
b0a0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
b0b0: 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
b0c0: 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
b0d0: 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
b0e0: 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
b0f0: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
b100: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
b110: 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
b120: 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
b130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
b140: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
b150: 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
b160: 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
b170: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
b180: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
b190: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74  _STAT4./*.** Ret
b1a0: 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  urn the affinity
b1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f   for a single co
b1c0: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
b1d0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
b1e0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b1f0: 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62  nity(sqlite3 *db
b200: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
b210: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65  nt iCol){.  asse
b220: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
b230: 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Col<pIdx->nColum
b240: 6e 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78  n );.  if( !pIdx
b250: 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20  ->zColAff ){.   
b260: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
b270: 78 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c  xAffinityStr(db,
b280: 20 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75   pIdx)==0 ) retu
b290: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  rn SQLITE_AFF_BL
b2a0: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
b2b0: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69   pIdx->zColAff[i
b2c0: 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Col];.}.#endif..
b2d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b2e0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b2f0: 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TAT4./* .** This
b300: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
b310: 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  led to estimate 
b320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b330: 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a  ws visited by a.
b340: 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e  ** range-scan on
b350: 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64   a skip-scan ind
b360: 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ex. For example:
b370: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
b380: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
b390: 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45  , b, c);.**   SE
b3a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
b3b0: 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42  HERE a=? AND c B
b3c0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a  ETWEEN ? AND ?;.
b3d0: 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f  **.** Value pLoo
b3e0: 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65  p->nOut is curre
b3f0: 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
b400: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
b410: 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73   of rows .** vis
b420: 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e  ited for scannin
b430: 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e  g (a=? AND b=?).
b440: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b450: 65 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69  educes that esti
b460: 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65  mate .** by some
b470: 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75   factor to accou
b480: 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45  nt for the (c BE
b490: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65  TWEEN ? AND ?) e
b4a0: 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a  xpression based.
b4b0: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20  ** on the stat4 
b4c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64  data for the ind
b4d0: 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69  ex. this scan wi
b4e0: 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d  ll be peformed m
b4f0: 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
b500: 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  s (once for each
b510: 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69   (a,b) combinati
b520: 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  on that matches 
b530: 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69  a=?) is dealt wi
b540: 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  th .** by the ca
b550: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64  ller..**.** It d
b560: 6f 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e  oes this by scan
b570: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
b580: 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20   stat4 samples, 
b590: 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73  comparing values
b5a0: 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72  .** extracted fr
b5b0: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
b5c0: 70 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f  pper with the co
b5d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
b5e0: 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61  mn in each.** sa
b5f0: 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55  mple. If L and U
b600: 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20   are the number 
b610: 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64  of samples found
b620: 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
b630: 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20   or.** equal to 
b640: 74 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61  the values extra
b650: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b660: 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
b670: 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a  ectively, and.**
b680: 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20   N is the total 
b690: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b6a0: 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f  s, the pLoop->nO
b6b0: 75 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75  ut value is adju
b6c0: 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  sted.** as follo
b6d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74  ws:.**.**   nOut
b6e0: 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28   = nOut * ( min(
b6f0: 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a  U - L, 1) / N ).
b700: 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20  **.** If pLower 
b710: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61  is NULL, or a va
b720: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
b730: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b740: 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73   term, L is.** s
b750: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70  et to zero. If p
b760: 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Upper is NULL, o
b770: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
b780: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
b790: 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73  om it,.** U is s
b7a0: 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e  et to N..**.** N
b7b0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  ormally, this fu
b7c0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44  nction sets *pbD
b7d0: 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20  one to 1 before 
b7e0: 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76  returning. Howev
b7f0: 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c  er,.** if no val
b800: 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ue can be extrac
b810: 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20  ted from either 
b820: 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72  pLower or pUpper
b830: 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20   (and so the.** 
b840: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
b850: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64  number of rows d
b860: 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73  elivered remains
b870: 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62   unchanged), *pb
b880: 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20  Done.** is left 
b890: 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  as is..**.** If 
b8a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b8b0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
b8c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b8d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
b8e0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  * SQLITE_OK..*/.
b8f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
b900: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
b910: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b920: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
b930: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
b940: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
b950: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
b960: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
b970: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
b980: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
b990: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b9a0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b9b0: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
b9c0: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
b9d0: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
b9e0: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
b9f0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
ba00: 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64  pLoop,    /* Upd
ba10: 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61  ate the .nOut va
ba20: 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  lue of this loop
ba30: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e   */.  int *pbDon
ba40: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e          /* Se
ba50: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20  t to true if at 
ba60: 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20  least one expr. 
ba70: 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  value extracted 
ba80: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
ba90: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
baa0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
bab0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
bac0: 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69  tree.nEq;.  sqli
bad0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
bae0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77  ->db;.  int nLow
baf0: 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e  er = -1;.  int n
bb00: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70  Upper = p->nSamp
bb10: 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  le+1;.  int rc =
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
bb30: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e   aff = sqlite3In
bb40: 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  dexColumnAffinit
bb50: 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20  y(db, p, nEq);. 
bb60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bb70: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  .  .  sqlite3_va
bb80: 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  lue *p1 = 0;    
bb90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
bba0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
bbb0: 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ower */.  sqlite
bbc0: 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b  3_value *p2 = 0;
bbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
bbe0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
bbf0: 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71  m pUpper */.  sq
bc00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
bc10: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
bc20: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
bc30: 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a   from record */.
bc40: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
bc50: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
bc60: 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c  pParse, p->azCol
bc70: 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70  l[nEq]);.  if( p
bc80: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20  Lower ){.    rc 
bc90: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
bca0: 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
bcb0: 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  se, pLower->pExp
bcc0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
bcd0: 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72  &p1);.    nLower
bce0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
bcf0: 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51  pUpper && rc==SQ
bd00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
bd10: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
bd20: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
bd30: 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45  arse, pUpper->pE
bd40: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
bd50: 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70  , &p2);.    nUpp
bd60: 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d  er = p2 ? 0 : p-
bd70: 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20  >nSample;.  }.. 
bd80: 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b   if( p1 || p2 ){
bd90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bda0: 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66  int nDiff;.    f
bdb0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
bdc0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53  TE_OK && i<p->nS
bdd0: 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
bde0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
bdf0: 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70  tat4Column(db, p
be00: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  ->aSample[i].p, 
be10: 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  p->aSample[i].n,
be20: 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20   nEq, &pVal);.  
be30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
be40: 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20  TE_OK && p1 ){. 
be50: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
be60: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
be70: 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p1, pVal, pCo
be80: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
be90: 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72   res>=0 ) nLower
bea0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20  _OK && p2 ){.   
bed0: 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
bee0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
bef0: 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p2, pVal, pColl
bf00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
bf10: 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b  es>=0 ) nUpper++
bf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bf30: 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70      nDiff = (nUp
bf40: 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20  per - nLower);. 
bf50: 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20     if( nDiff<=0 
bf60: 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20  ) nDiff = 1;..  
bf70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
bf80: 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
bf90: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73  nd lower bound s
bfa0: 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68  pecified, and th
bfb0: 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e .    ** compar
bfc0: 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74  isons indicate t
bfd0: 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hat they are clo
bfe0: 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65  se together, use
bff0: 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20   the fallback.  
c000: 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73    ** method (ass
c010: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61  ume that the sca
c020: 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66  n visits 1/64 of
c030: 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65   the rows) for e
c040: 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a  stimating.    **
c050: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c060: 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68  ows visited. Oth
c070: 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65  erwise, estimate
c080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c090: 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ows.    ** using
c0a0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c0b0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61  ribed in the hea
c0c0: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
c0d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
c0e0: 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21  /.    if( nDiff!
c0f0: 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20  =1 || pUpper==0 
c100: 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a  || pLower==0 ){.
c110: 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73        int nAdjus
c120: 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45  t = (sqlite3LogE
c130: 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d  st(p->nSample) -
c140: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
c150: 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c  Diff));.      pL
c160: 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64  oop->nOut -= nAd
c170: 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44  just;.      *pbD
c180: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57  one = 1;.      W
c190: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
c1a0: 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61  ("range skip-sca
c1b0: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
c1c0: 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74  u  adjust=%d est
c1d0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65     nLower, nUppe
c200: 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70  r, nAdjust*-1, p
c210: 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20  Loop->nOut));.  
c220: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
c230: 20 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e    assert( *pbDon
c240: 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  e==0 );.  }..  s
c250: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c260: 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  p1);.  sqlite3Va
c270: 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73  lueFree(p2);.  s
c280: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
c290: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
c2a0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c2b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c2c0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c2e0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
c2f0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
c300: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
c310: 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
c320: 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
c330: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
c340: 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
c350: 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
c360: 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
c370: 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
c380: 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
c390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c3a0: 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
c3b0: 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
c3c0: 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
c3d0: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
c3e0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c3f0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
c400: 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
c410: 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
c420: 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
c430: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
c440: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c450: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c470: 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
c480: 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
c4d0: 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
c4e0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
c4f0: 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
c500: 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
c510: 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
c520: 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
c530: 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
c540: 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
c550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
c560: 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e  e in (pBuilder->
c570: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
c580: 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  q) is the number
c590: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
c5a0: 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20   column subject 
c5b0: 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  to the range con
c5c0: 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
c5d0: 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
c5e0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61  umber of.** equa
c5f0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
c600: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
c610: 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
c620: 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
c630: 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20  le,.** assuming 
c640: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
c650: 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
c660: 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
c670: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c680: 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
c690: 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
c6a0: 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
c6b0: 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31   nEq is set to 1
c6c0: 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
c6d0: 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
c6e0: 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  , b, is the seco
c6f0: 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  nd .** left-most
c700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
c710: 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
c720: 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
c730: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
c740: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
c750: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
c760: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
c770: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  to 0..**.** When
c780: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c790: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74  s called, *pnOut
c7a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
c7b0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f  qlite3LogEst() o
c7c0: 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
c7d0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65  of rows that the
c7e0: 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65   index scan is e
c7f0: 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74  xpected to visit
c800: 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e   without .** con
c810: 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e  sidering the ran
c820: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ge constraints. 
c830: 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65  If nEq is 0, the
c840: 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20  n *pnOut is the 
c850: 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f  number of .** ro
c860: 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ws in the index.
c870: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
c880: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75  or occurs, *pnOu
c890: 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72  t is adjusted (r
c8a0: 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63  educed).** to ac
c8b0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61  count for the ra
c8c0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
c8d0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
c8e0: 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
c8f0: 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
c900: 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
c910: 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
c920: 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
c930: 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67  .** used, a sing
c940: 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  le range inequal
c950: 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
c960: 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
c970: 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a  a factor of 4. .
c980: 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66  ** and a pair of
c990: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
c9a0: 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
c9b0: 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
c9c0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
c9d0: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
c9e0: 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a  actor of 64..*/.
c9f0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
ca00: 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
ca10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ca20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ca30: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
ca40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
ca50: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
ca60: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
ca70: 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
ca80: 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
ca90: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
caa0: 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
cab0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
cac0: 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
cad0: 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
cae0: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
caf0: 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
cb00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
cb10: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
cb20: 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
cb30: 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
cb40: 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
cb50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
cb60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cb70: 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
cb80: 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
cb90: 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
cba0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
cbb0: 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
cbc0: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
cbd0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
cbe0: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
cbf0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
cc00: 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
cc10: 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
cc20: 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  leCol ){.    if(
cc30: 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e   nEq==pBuilder->
cc40: 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20  nRecValid ){.   
cc50: 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72     UnpackedRecor
cc60: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
cc70: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20  er->pRec;.      
cc80: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
cc90: 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70      int nBtm = p
cca0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
ccb0: 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  tm;.      int nT
ccc0: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
ccd0: 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20  ree.nTop;..     
cce0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
ccf0: 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
cd00: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
cd10: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
cd20: 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
cd30: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
cd40: 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
cd50: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
cd60: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
cd70: 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
cd80: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
cd90: 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
cda0: 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
cdb0: 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
cdc0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
cdd0: 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
cde0: 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
cdf0: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
ce00: 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
ce10: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
ce20: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
ce30: 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
ce40: 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
ce50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ce60: 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
ce70: 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
ce80: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
ce90: 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
cea0: 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
ceb0: 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
cec0: 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
ced0: 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
cee0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
cef0: 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
cf00: 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
cf10: 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
cf20: 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
cf30: 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
cf40: 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
cf50: 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
cf60: 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
cf70: 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
cf80: 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
cf90: 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
cfa0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
cfb0: 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
cfc0: 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
cfd0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
cfe0: 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
cff0: 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
d000: 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
d010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d020: 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
d030: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d040: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
d050: 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
d060: 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
d070: 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
d080: 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
d090: 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
d0a0: 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
d0b0: 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
d0c0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
d0d0: 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
d0e0: 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
d0f0: 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
d100: 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
d110: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
d120: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
d130: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
d140: 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
d150: 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
d160: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d170: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
d180: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
d190: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
d1a0: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
d1b0: 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
d1c0: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
d1d0: 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
d1e0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d1f0: 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
d200: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
d210: 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
d220: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
d230: 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
d240: 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
d250: 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
d260: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
d270: 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
d280: 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
d290: 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
d2a0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
d2b0: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
d2c0: 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
d2d0: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
d2e0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
d2f0: 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
d300: 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
d310: 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
d320: 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
d330: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d340: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
d350: 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30  er = p->nRowEst0
d360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d370: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20         /* Note: 
d380: 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
d390: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
d3a0: 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
d3b0: 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
d3c0: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20          ** have 
d3d0: 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77  been requested w
d3e0: 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20  hen testing key 
d3f0: 24 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c  $P in whereEqual
d400: 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20  ScanEst().  */. 
d410: 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
d420: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d430: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d440: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
d450: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70  0];.        iUpp
d460: 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d  er = a[0] + a[1]
d470: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d480: 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d   assert( pLower=
d490: 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65  =0 || (pLower->e
d4a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
d4b0: 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
d4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
d4d0: 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70  pper==0 || (pUpp
d4e0: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
d4f0: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
d500: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
d510: 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  t( p->aSortOrder
d520: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
d530: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e   p->aSortOrder[n
d540: 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Eq] ){.        /
d550: 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70  * The roles of p
d560: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
d570: 20 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72   are swapped for
d580: 20 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f   a DESC index */
d590: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
d5a0: 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72  ereTerm*, pLower
d5b0: 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20  , pUpper);.     
d5c0: 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74     SWAP(int, nBt
d5d0: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  m, nTop);.      
d5e0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
d5f0: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
d600: 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65   on the iLower e
d610: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
d620: 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$L). */.      
d630: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
d640: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
d670: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
d680: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
d690: 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
d6a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
d6b0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d6c0: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d6d0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d6e0: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
d6f0: 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Btm, nEq, &n);. 
d700: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
d710: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
d730: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
d740: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
d750: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
d760: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d770: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d780: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
d790: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
d7a0: 20 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64            iLwrId
d7b0: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
d7c0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d7d0: 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 0, a);.      
d7e0: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
d7f0: 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
d800: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
d810: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d820: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d830: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d840: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d850: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d860: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d880: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d890: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d8a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d8b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d8c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d8d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d8e0: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d900: 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   Values extracte
d910: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
d920: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
d930: 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
d940: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
d950: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d960: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
d970: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
d980: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f  pRec, pExpr, nTo
d990: 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20  p, nEq, &n);.   
d9a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d9b0: 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20  ITE_OK && n ){. 
d9c0: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
d9d0: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
d9e0: 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47   u16 mask = WO_G
d9f0: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
da00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
da10: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
da20: 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28  pr)>n ) mask = (
da30: 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20  WO_LE|WO_LT);.  
da40: 20 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20          iUprIdx 
da50: 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
da60: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
da70: 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   1, a);.        
da80: 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
da90: 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
daa0: 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b  tor & mask) ? a[
dab0: 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
dac0: 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
dad0: 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
dae0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
daf0: 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
db00: 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
db10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
db20: 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
db30: 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
db40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
db50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
db60: 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
db70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
db80: 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
db90: 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
dba0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  er);.          /
dbb0: 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f  * TUNING:  If bo
dbc0: 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c  th iUpper and iL
dbd0: 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64  ower are derived
dbe0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
dbf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70           ** samp
dc00: 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  le, then assume 
dc10: 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65  they are 4x more
dc20: 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69   selective.  Thi
dc30: 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20  s brings.       
dc40: 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61     ** the estima
dc50: 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20  ted selectivity 
dc60: 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74  more in line wit
dc70: 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20  h what it would 
dc80: 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
dc90: 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74  if estimated wit
dca0: 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20  hout the use of 
dcb0: 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20  STAT3/4 tables. 
dcc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
dcd0: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
dce0: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
dcf0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
dd00: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
dd10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dd20: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
dd30: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
dd40: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
dd50: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
dd70: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
dd80: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
dd90: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
dda0: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
ddb0: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
ddc0: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
ddd0: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
de00: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
de10: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
de20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
de30: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
de40: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
de50: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
de60: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
de70: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
de80: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
de90: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
dea0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
deb0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
dec0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
ded0: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
dee0: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
def0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
df00: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
df10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
df20: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
df30: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
df40: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
df50: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
df60: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
df70: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
df80: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
df90: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
dfa0: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
dfb0: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
dfc0: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
dfd0: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
dfe0: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
dff0: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e000: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e010: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e020: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e030: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e040: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e050: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e060: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e070: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e080: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e090: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e0a0: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e0b0: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e0c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e0d0: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e0e0: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e0f0: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e100: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e110: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e120: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e130: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e140: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e150: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e160: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e170: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e180: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e190: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e1a0: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e1b0: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e1c0: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e1d0: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e1e0: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e1f0: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e200: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e210: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e220: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e230: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
e240: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
e250: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
e260: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
e290: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
e2a0: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
e2b0: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
e2c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e2d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e2e0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
e2f0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
e300: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
e310: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
e320: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
e330: 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
e340: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e350: 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
e360: 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
e370: 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
e380: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
e390: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
e3a0: 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
e3b0: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
e3c0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
e3d0: 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
e3e0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
e3f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
e400: 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
e410: 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
e420: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
e430: 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
e440: 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
e450: 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
e460: 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
e470: 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
e480: 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
e490: 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
e4a0: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
e4b0: 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
e4c0: 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
e4d0: 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
e4e0: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
e4f0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
e500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
e510: 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
e520: 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
e530: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e540: 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
e550: 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
e560: 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
e570: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
e580: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
e590: 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
e5a0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
e5b0: 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
e5c0: 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
e5d0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
e5e0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
e5f0: 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
e600: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
e610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e620: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
e630: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
e640: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
e650: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
e660: 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45  lder,.  Expr *pE
e670: 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
e680: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
e690: 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
e6a0: 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
e6b0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
e6c0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
e6d0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
e6e0: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
e6f0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
e700: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
e710: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
e720: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
e730: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
e740: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e  .btree.nEq;.  Un
e750: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
e760: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
e770: 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Rec;.  int rc;  
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
e7a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
e7b0: 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
e7d0: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
e7e0: 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
e7f0: 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
e800: 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
e810: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
e820: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
e830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e840: 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
e850: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
e860: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
e870: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
e880: 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
e890: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
e8a0: 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
e8b0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
e8c0: 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
e8d0: 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
e8e0: 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
e8f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
e900: 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
e910: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
e920: 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
e930: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
e940: 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
e950: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
e960: 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
e970: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
e980: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e990: 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
e9a0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
e9b0: 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
e9c0: 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
e9d0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
e9e0: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
e9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ea00: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
ea10: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
ea20: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
ea30: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c  &pRec, pExpr, 1,
ea40: 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20   nEq-1, &bOk);. 
ea50: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
ea60: 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63  = pRec;.  if( rc
ea70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
ea80: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62  turn rc;.  if( b
ea90: 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Ok==0 ) return S
eaa0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
eab0: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
eac0: 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20  Valid = nEq;..  
ead0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
eae0: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
eaf0: 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41  , a);.  WHERETRA
eb00: 43 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69  CE(0x10,("equali
eb10: 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20  ty scan regions 
eb20: 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20  %s(%d): %d\n",. 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d    p->zName, nEq-
eb50: 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  1, (int)a[1]));.
eb60: 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
eb70: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
eb80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
eba0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
ebb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ebc0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
ebd0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
ebe0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ebf0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
ec00: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
ec10: 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
ec20: 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
ec30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
ec40: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ec50: 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
ec60: 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
ec70: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
ec80: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
ec90: 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
eca0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
ecb0: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
ecc0: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
ecd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
ece0: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
ecf0: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
ed00: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
ed10: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
ed20: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
ed30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ed40: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
ed50: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
ed60: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
ed70: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
ed80: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
ed90: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
eda0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
edb0: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
edc0: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
edd0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
ede0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
edf0: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
ee00: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
ee10: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
ee20: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ee30: 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
ee40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ee50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
ee60: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
ee70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ee80: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
ee90: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
eea0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
eeb0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
eec0: 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
eed0: 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
eee0: 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
eef0: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
ef00: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
ef10: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
ef20: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
ef30: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
ef40: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
ef50: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
ef60: 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
ef70: 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
ef80: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
ef90: 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
efa0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
efb0: 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
efc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
efd0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
efe0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
eff0: 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
f000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f010: 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
f020: 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
f030: 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
f040: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
f050: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
f060: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
f070: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f090: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
f0b0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
f0c0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f0d0: 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
f0e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f0f0: 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
f100: 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
f110: 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
f120: 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
f130: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
f140: 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
f150: 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
f160: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f170: 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
f180: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f1a0: 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
f1b0: 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
f1c0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
f1d0: 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
f1e0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
f1f0: 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
f200: 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
f210: 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
f220: 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
f230: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
f240: 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
f250: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f260: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f270: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
f280: 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
f290: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f2a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
f2b0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
f2c0: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
f2d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f2e0: 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
f2f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
f300: 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
f310: 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
f320: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f330: 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
f340: 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
f350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f360: 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63   zType[4];.    c
f370: 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20  har zLeft[50];. 
f380: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
f390: 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20   "...", 4);.    
f3a0: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
f3b0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
f3c0: 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27  L ) zType[0] = '
f3d0: 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  V';.    if( pTer
f3e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f3f0: 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65  O_EQUIV  ) zType
f400: 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69  [1] = 'E';.    i
f410: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
f420: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
f430: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
f440: 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a  zType[2] = 'L';.
f450: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
f460: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
f470: 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71  NGLE ){.      sq
f480: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
f490: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
f4a0: 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d  ft,"left={%d:%d}
f4b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f4c0: 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
f4d0: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
f4e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
f4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f500: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f510: 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26  or & WO_OR)!=0 &
f520: 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e  & pTerm->u.pOrIn
f530: 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo!=0 ){.      s
f540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f550: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f560: 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30  eft,"indexable=0
f570: 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20  x%lld", .       
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
f5a0: 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20  ->indexable);.  
f5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f5c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f5d0: 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c  sizeof(zLeft),zL
f5e0: 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70  eft,"left=%d", p
f5f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f600: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f610: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f620: 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d  .       "TERM-%-
f630: 33 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70  3d %p %s %-12s p
f640: 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30  rob=%-3d op=0x%0
f650: 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34  3x wtFlags=0x%04
f660: 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  x",.       iTerm
f670: 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
f680: 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72  zLeft, pTerm->tr
f690: 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20  uthProb,.       
f6a0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f6b0: 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  , pTerm->wtFlags
f6c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
f6d0: 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->iField ){.    
f6e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f6f0: 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64  intf(" iField=%d
f700: 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65  \n", pTerm->iFie
f710: 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ld);.    }else{.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f730: 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
f740: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f750: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
f760: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
f770: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
f780: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
f790: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
f7a0: 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
f7b0: 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  te content of a 
f7c0: 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76  WhereClause.*/.v
f7d0: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
f7e0: 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72  ClausePrint(Wher
f7f0: 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
f800: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f810: 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; i<pWC->nTerm;
f820: 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65   i++){.    where
f830: 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e  TermPrint(&pWC->
f840: 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  a[i], i);.  }.}.
f850: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f860: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f870: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  D./*.** Print a 
f880: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
f890: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70   for debugging p
f8a0: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
f8b0: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f8c0: 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20  Print(WhereLoop 
f8d0: 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  *p, WhereClause 
f8e0: 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e  *pWC){.  WhereIn
f8f0: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
f900: 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  ->pWInfo;.  int 
f910: 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e  nb = 1+(pWInfo->
f920: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33  pTabList->nSrc+3
f930: 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72  )/4;.  struct Sr
f940: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
f950: 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
f960: 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
f970: 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
f980: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
f990: 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d    Bitmask mAll =
f9a0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
f9b0: 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73  (nb*4)) - 1;.  s
f9c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f9d0: 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
f9e0: 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
f9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa00: 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
fa10: 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
fa20: 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20  nb, p->prereq & 
fa30: 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mAll);.  sqlite3
fa40: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
fa50: 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
fa60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
fa70: 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
fa80: 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
fa90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
faa0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
fab0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
fac0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
fad0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
fae0: 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e   if( p->u.btree.
faf0: 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65  pIndex && (zName
fb00: 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
fb10: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  ndex->zName)!=0 
fb20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
fb30: 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
fb40: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
fb50: 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
fb60: 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
fb70: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
fb80: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
fb90: 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
fba0: 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
fbb0: 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
fbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fbd0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fbe0: 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
fbf0: 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
fc00: 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fc20: 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
fc30: 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
fc40: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
fc50: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
fc60: 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
fc70: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fc80: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
fc90: 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
fca0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
fcb0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
fcc0: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
fcd0: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
fce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fcf0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
fd00: 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
fd10: 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
fd20: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
fd30: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
fd40: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
fd50: 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
fd60: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
fd70: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
fd80: 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26  if( p->wsFlags &
fd90: 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20   WHERE_SKIPSCAN 
fda0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
fdb0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
fdc0: 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73  5x %d-%d", p->ws
fdd0: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
fde0: 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65  ,p->nSkip);.  }e
fdf0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
fe00: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
fe10: 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
fe20: 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
fe30: 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  m);.  }.  sqlite
fe40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
fe50: 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
fe60: 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
fe70: 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20  Run, p->nOut);. 
fe80: 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26   if( p->nLTerm &
fe90: 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54  & (sqlite3WhereT
fea0: 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
feb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
fec0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
fed0: 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
fee0: 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
fef0: 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  int(p->aLTerm[i]
ff00: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
ff10: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
ff20: 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
ff30: 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
ff40: 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
ff50: 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
ff60: 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
ff70: 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
ff80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
ff90: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
ffa0: 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
ffb0: 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
ffc0: 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
ffd0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
ffe0: 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
fff0: 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
10000 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
10010 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
10020 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
10030 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
10040 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
10050 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
10060 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10070 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
10080 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10090 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
100a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
100b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
100c0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
100d0 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
100e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
100f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
10100 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
10110 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10120 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10130 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
10140 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
10150 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
10160 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10170 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
10180 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
10190 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
101a0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
101b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101c0 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
101d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
101e0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
101f0 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
10200 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10210 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  NN(db, p->u.btre
10220 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
10230 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
10240 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
10250 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
10260 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
10270 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
10280 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
10290 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
102a0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
102b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
102c0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
102d0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
102e0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
102f0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
10300 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
10310 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
10320 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
10330 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
10340 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
10350 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
10360 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
10370 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
10380 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
10390 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
103a0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
103b0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
103c0 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
103d0 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
103e0 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
103f0 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
10400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
10410 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
10420 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
10430 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
10440 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
10450 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65  )*n);.  if( paNe
10460 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
10470 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10480 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
10490 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
104a0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
104b0 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
104c0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
104d0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
104e0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
104f0 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
10500 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
10510 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
10520 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
10530 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10540 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
10550 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
10560 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
10570 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
10580 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10590 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
105a0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
105b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
105c0 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
105d0 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
105e0 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
105f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
10600 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
10610 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
10620 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
10630 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
10640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10650 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10660 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
10670 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
10680 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
10690 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
106a0 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
106b0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
106c0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
106d0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
106e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
106f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
10700 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
10710 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
10720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
10730 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
10740 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
10750 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
10760 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
10770 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
10780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10790 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
107a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
107b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
107c0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
107d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
107e0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
107f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
10800 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
10810 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
10820 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
10830 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
10840 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
10850 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
10860 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
10870 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
10880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
10890 72 74 28 20 70 57 49 6e 66 6f 21 3d 30 20 29 3b  rt( pWInfo!=0 );
108a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
108b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
108c0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
108d0 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57  el *pLevel = &pW
108e0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
108f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10900 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10910 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10920 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10940 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
10950 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
10960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
10970 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
10980 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73  Clear(&pWInfo->s
10990 57 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 57  WC);.  while( pW
109a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
109b0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
109c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70   = pWInfo->pLoop
109d0 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  s;.    pWInfo->p
109e0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
109f0 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 4c  Loop;.    whereL
10a00 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
10a10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
10a20 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
10a30 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  fo);.}../*.** Re
10a40 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
10a50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10a60 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
10a70 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
10a80 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
10a90 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
10aa0 20 20 28 32 29 20 20 58 20 75 73 65 73 20 66 65    (2)  X uses fe
10ab0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
10ac0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 0a 2a 2a   terms than Y.**
10ad0 20 20 20 28 33 29 20 20 45 76 65 72 79 20 57 48     (3)  Every WH
10ae0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10af0 75 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73  used by X is als
10b00 6f 20 75 73 65 64 20 62 79 20 59 0a 2a 2a 20 20  o used by Y.**  
10b10 20 28 34 29 20 20 58 20 73 6b 69 70 73 20 61 74   (4)  X skips at
10b20 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
10b30 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 20 20  olumns as Y.**  
10b40 20 28 35 29 20 20 49 66 20 58 20 69 73 20 61 20   (5)  If X is a 
10b50 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
10b60 74 68 61 6e 20 59 20 69 73 20 74 6f 6f 0a 2a 2a  than Y is too.**
10b70 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 28  .** Conditions (
10b80 32 29 20 61 6e 64 20 28 33 29 20 6d 65 61 6e 20  2) and (3) mean 
10b90 74 68 61 74 20 58 20 69 73 20 61 20 22 70 72 6f  that X is a "pro
10ba0 70 65 72 20 73 75 62 73 65 74 22 20 6f 66 20 59  per subset" of Y
10bb0 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  ..** If X is a p
10bc0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
10bd0 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
10be0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
10bf0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
10c00 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
10c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
10c20 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
10c30 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
10c40 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
10c50 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
10c60 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
10c70 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 34 29 0a   Constraint (4).
10c80 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10c90 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
10ca0 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
10cb0 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
10cc0 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
10cd0 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
10ce0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
10cf0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 20  er subset of Y. 
10d00 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 0a   Constraint (5).
10d10 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
10d20 61 75 73 65 20 61 20 63 6f 76 65 72 69 6e 67 20  ause a covering 
10d30 69 6e 64 65 78 20 70 72 6f 62 61 62 6c 79 20 64  index probably d
10d40 65 73 65 72 76 65 73 20 74 6f 20 68 61 76 65 20  eserves to have 
10d50 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a 2a 2a 20  a lower cost.** 
10d60 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  than a non-cover
10d70 69 6e 67 20 69 6e 64 65 78 20 65 76 65 6e 20 69  ing index even i
10d80 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65 72  f it is a proper
10d90 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   subset..*/.stat
10da0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10db0 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10dc0 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
10dd0 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
10de0 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
10df0 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
10e00 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
10e10 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
10e20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
10e30 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
10e40 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
10e50 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
10e60 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
10e70 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
10e80 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
10e90 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
10ea0 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
10eb0 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
10ec0 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
10ed0 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
10ee0 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
10ef0 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
10f00 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
10f10 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
10f20 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10f30 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
10f40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
10f50 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
10f60 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
10f70 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
10f80 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
10f90 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
10fa0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
10fb0 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
10fc0 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
10fd0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
10fe0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
10ff0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
11000 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
11010 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
11020 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11030 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
11040 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
11050 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
11060 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
11070 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
11080 20 7d 0a 20 20 69 66 28 20 28 70 58 2d 3e 77 73   }.  if( (pX->ws
11090 46 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  Flags&WHERE_IDX_
110a0 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 26 26 20  ONLY)!=0 .   && 
110b0 28 70 59 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  (pY->wsFlags&WHE
110c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
110d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
110e0 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
110f0 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  (5) */.  }.  ret
11100 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63  urn 1;  /* All c
11110 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a  onditions meet *
11120 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  /.}../*.** Try t
11130 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73  o adjust the cos
11140 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70  t of WhereLoop p
11150 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73  Template upwards
11160 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f   or downwards so
11170 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
11180 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20    (1) pTemplate 
11190 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20  costs less than 
111a0 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
111b0 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20  oops that are a 
111c0 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20  proper.**       
111d0 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c  subset of pTempl
111e0 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  ate.**.**   (2) 
111f0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
11200 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74  more than any ot
11210 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  her WhereLoops f
11220 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61  or which pTempla
11230 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  te.**       is a
11240 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a   proper subset..
11250 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68  **.** To say "Wh
11260 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70  ereLoop X is a p
11270 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
11280 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20  Y" means that X 
11290 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48  uses fewer.** WH
112a0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
112b0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
112c0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
112d0 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
112e0 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73   X is.** also us
112f0 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74  ed by Y..*/.stat
11300 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
11310 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
11320 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
11330 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
11340 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
11350 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11360 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11370 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11380 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
11390 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
113a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
113b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
113c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
113d0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
113e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
113f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11400 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
11410 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
11420 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
11430 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
11440 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
11450 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
11460 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
11470 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
11480 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a  ** subset p. */.
11490 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
114a0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
114b0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
114c0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
114e0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
114f0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11500 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11510 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b  un, p->nOut-1));
11520 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11530 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11540 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11550 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11560 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t - 1;.    }else
11570 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68   if( whereLoopCh
11580 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
11590 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20  t(pTemplate, p) 
115a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
115b0 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  st pTemplate cos
115c0 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74  t upward so that
115d0 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20   it is costlier 
115e0 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20  than p since.   
115f0 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20     ** pTemplate 
11600 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
11610 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20  et of p */.     
11620 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
11630 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61  ,("subset cost a
11640 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20  djustment %d,%d 
11650 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  to %d,%d\n",.   
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
11680 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Run, pTemplate->
11690 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  nOut, p->rRun, p
116a0 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20  ->nOut+1));.    
116b0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
116c0 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
116d0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
116e0 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
116f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11700 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
11710 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
11720 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
11730 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
11740 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 72 65 70  at can be.** rep
11750 6c 61 63 65 64 20 62 79 20 70 54 65 6d 70 6c 61  laced by pTempla
11760 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11770 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d 70 6c 61   NULL if pTempla
11780 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
11790 6e 67 20 6f 6e 20 74 68 65 20 57 68 65 72 65 4c  ng on the WhereL
117a0 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20  oop list..** In 
117b0 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
117c0 54 65 6d 70 6c 61 74 65 20 6f 75 67 68 74 20 74  Template ought t
117d0 6f 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  o be dropped fro
117e0 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
117f0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
11800 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
11810 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
11820 74 65 20 63 61 6e 20 72 65 70 6c 61 63 65 2c 20  te can replace, 
11830 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
11840 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
11850 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
11860 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
11870 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20 61 6e 79  nnot replace any
11880 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
11890 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
118a0 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
118b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
118c0 73 74 20 61 73 20 61 20 6e 65 77 20 65 6e 74 72  st as a new entr
118d0 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  y, then return a
118e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
118f0 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  ** tail of the l
11900 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
11910 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
11920 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
11930 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
11940 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
11950 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
11960 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
11970 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
11980 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
11990 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
119a0 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
119b0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
119c0 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
119d0 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
119e0 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
119f0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
11a00 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
11a10 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
11a20 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
11a30 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
11a40 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
11a50 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
11a60 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
11a70 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
11a80 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
11a90 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
11aa0 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
11ab0 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
11ac0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
11ad0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
11ae0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
11af0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
11b00 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
11b10 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
11b20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
11b30 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
11b40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
11b50 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
11b60 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
11b70 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
11b80 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
11b90 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
11ba0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
11bb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
11bc0 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
11bd0 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
11be0 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
11bf0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
11c00 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
11c10 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
11c20 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
11c30 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
11c40 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
11c50 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
11c60 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
11c70 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
11c80 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
11c90 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
11ca0 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
11cb0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
11cc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11cd0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11ce0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
11cf0 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
11d00 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
11d10 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
11d20 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
11d30 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
11d40 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
11d50 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
11d60 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
11d70 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
11d80 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
11d90 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69   index. Unless i
11da0 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e  t is a skip-scan
11db0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d  . */.    if( (p-
11dc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
11dd0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a  _AUTO_INDEX)!=0.
11de0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
11df0 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20  te->nSkip)==0.  
11e00 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e20 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
11e30 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11e40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
11e50 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a  E_COLUMN_EQ)!=0.
11e60 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72       && (p->prer
11e70 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11e80 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
11e90 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29  te->prereq.    )
11ea0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11eb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11ec0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11ed0 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74  op p is better t
11ee0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70  han pTemplate, p
11ef0 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a  Template can be.
11f00 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64      ** discarded
11f10 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  .  WhereLoop p i
11f20 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20  s better if:.   
11f30 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73   **   (1)  p has
11f40 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
11f50 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70  ncies than pTemp
11f60 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  late, and.    **
11f70 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e     (2)  p has an
11f80 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
11f90 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c  cost than pTempl
11fa0 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ate.    */.    i
11fb0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11fc0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11fd0 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20  q)==p->prereq   
11fe0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
11ff0 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70   && p->rSetup<=p
12000 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
12030 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54    && p->rRun<=pT
12040 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
12070 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70     && p->nOut<=p
12080 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20      /* (2c) */. 
120b0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
120c0 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72  rn 0;  /* Discar
120d0 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  d pTemplate */. 
120e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
120f0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77  pTemplate is alw
12100 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20  ays better than 
12110 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20  p, then cause p 
12120 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
12130 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54  n.    ** with pT
12140 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c  emplate.  pTempl
12150 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68  ate is better th
12160 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20  an p if:.    ** 
12170 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65    (1)  pTemplate
12180 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
12190 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c  endences than p,
121a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
121b0 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
121c0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
121d0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a  er cost than p..
121e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
121f0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12200 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12210 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12220 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20  q   /* (1)  */. 
12230 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d      && p->rRun>=
12240 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
12270 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
12280 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74  ->nOut>=pTemplat
12290 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
122c0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
122d0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
122e0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
122f0 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56   ); /* SETUP-INV
12300 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a  ARIANT above */.
12310 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f        break;   /
12320 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20  * Cause p to be 
12330 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70  overwritten by p
12340 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
12350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
12360 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pPrev;.}../*.** 
12370 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63  Insert or replac
12380 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  e a WhereLoop en
12390 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65  try using the te
123a0 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e  mplate supplied.
123b0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
123c0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  ng WhereLoop ent
123d0 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72  ry might be over
123e0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e  written if the n
123f0 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69  ew template.** i
12400 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73  s better and has
12410 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
12420 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d  ies.  Or the tem
12430 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67  plate will be ig
12440 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20  nored.** and no 
12450 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75  insert will occu
12460 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  r if an existing
12470 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61   WhereLoop is fa
12480 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20  ster and has.** 
12490 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
124a0 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70  es than the temp
124b0 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65  late.  Otherwise
124c0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
124d0 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73   is.** added bas
124e0 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61  ed on the templa
124f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  te..**.** If pBu
12500 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12510 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77   not NULL then w
12520 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  e care about onl
12530 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
12540 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
12550 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
12560 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
12570 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
12580 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
12590 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
125a0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
125b0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
125c0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
125d0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
125e0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
125f0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12600 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
12610 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
12620 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
12630 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
12640 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
12650 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
12660 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
12670 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
12680 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  ate if the.** ne
12690 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65  w template is be
126a0 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79  tter.  Loops may
126b0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
126c0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
126d0 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20   .** conditions 
126e0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
126f0 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65    (1)  They have
12700 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a   the same iTab..
12710 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20  **    (2)  They 
12720 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53  have the same iS
12730 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33  ortIdx..**    (3
12740 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12750 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65  has same or fewe
12760 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12770 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
12780 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20  loop.**    (4)  
12790 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
127a0 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
127b0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65  er cost than the
127c0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f   current loop.*/
127d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
127e0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72  eLoopInsert(Wher
127f0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
12800 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f  uilder, WhereLoo
12810 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
12820 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
12830 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65  rev, *p;.  Where
12840 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12850 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12870 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
12880 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
12890 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
128a0 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
128b0 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
128c0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
128d0 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
128e0 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
128f0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
12900 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69  rSet!=0 ){.    i
12910 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c  f( pTemplate->nL
12920 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52  Term ){.#if WHER
12930 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
12940 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75       u16 n = pBu
12950 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e  ilder->pOrSet->n
12960 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a  ;.      int x =.
12970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
12980 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
12990 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
129a0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
129b0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
129f0 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
12a00 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12a10 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12a20 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12a30 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12a50 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
12a60 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
12a70 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
12a80 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12a90 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12aa0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
12ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12ad0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
12ae0 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
12af0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12b00 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
12b10 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
12b20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
12b30 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
12b40 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
12b50 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
12b60 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12b70 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
12b80 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
12b90 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
12ba0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
12bb0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
12bc0 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
12bd0 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
12be0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
12bf0 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
12c00 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
12c10 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
12c20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12c30 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
12c40 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12c50 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
12c60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12c70 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29  ntf("   skip: ")
12c80 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
12c90 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
12ca0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12cb0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cd0 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
12ce0 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
12cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
12d00 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
12d10 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
12d20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
12d30 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
12d40 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
12d50 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
12d60 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
12d70 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
12d80 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
12d90 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
12da0 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
12db0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12dc0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
12dd0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12de0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12df0 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
12e00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
12e10 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20  rintf("replace: 
12e20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
12e30 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69  oopPrint(p, pBui
12e40 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12e50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12e60 69 6e 74 66 28 22 20 20 20 77 69 74 68 3a 20 22  intf("   with: "
12e70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12e90 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a  Printf("    add:
12ea0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   ");.    }.    w
12eb0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12ec0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12ed0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12ee0 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12ef0 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12f00 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12f10 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12f20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12f30 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12f40 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12f50 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
12f60 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
12f70 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
12f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12f90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
12fa0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
12fb0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
12fc0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
12fd0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12fe0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12ff0 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
13000 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
13010 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
13020 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
13030 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
13040 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
13050 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
13060 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
13070 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
13080 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
13090 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
130a0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
130b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
130c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
130d0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
130e0 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
130f0 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
13100 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
13110 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
13120 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
13130 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
13140 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
13150 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
13160 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
13170 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
13180 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
13190 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
131a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
131b0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
131c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
131d0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
131e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
131f0 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
13200 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
13210 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
13220 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
13230 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
13240 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
13250 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
13260 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
13270 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
13280 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
13290 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
132a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
132b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
132c0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
132d0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
132e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
132f0 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
13300 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
13310 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
13320 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
13330 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
13350 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
13360 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
13370 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
13380 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
13390 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
133a0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
133b0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
133c0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
133d0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
133e0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
133f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
13400 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
13410 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
13420 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
13430 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
13440 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
13450 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
13460 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
13470 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
13480 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
13490 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
134a0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
134b0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
134c0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
134d0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
134e0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
134f0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
13500 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
13510 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
13520 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
13530 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
13540 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
13550 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
13560 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
13570 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
13580 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
13590 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
135a0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
135b0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
135c0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
135d0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
135e0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
135f0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
13600 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
13610 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13620 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
13630 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
13640 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
13650 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
13660 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
13670 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
13680 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
13690 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
136a0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
136b0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
136c0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
136d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
136e0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
136f0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
13700 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
13710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13720 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
13730 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
13740 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
13750 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
13760 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
13770 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
13780 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
13790 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
137a0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
137b0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
137c0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
137d0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
137e0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
137f0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13800 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13810 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13820 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13830 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13840 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13850 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13860 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13870 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
13880 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
13890 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
138a0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
138b0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
138c0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
138d0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
138e0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
138f0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13900 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13910 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13920 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13930 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13940 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13960 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13970 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
13980 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
13990 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
139a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
139b0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
139c0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
139d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
139e0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
139f0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13a00 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13a10 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13a20 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13a30 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13a40 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13a50 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13a60 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13a70 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
13a80 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
13a90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
13aa0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
13ab0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
13ac0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
13ad0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13ae0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13af0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13b00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13b10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13b20 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13b30 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13b40 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13b50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13b60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13b70 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
13b80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13b90 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
13ba0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
13bb0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
13bc0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
13bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13be0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13bf0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
13c00 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
13c10 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
13c20 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
13c30 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
13c40 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13c50 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
13c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
13c70 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
13c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
13c90 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
13ca0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
13cb0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
13cc0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
13cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
13ce0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
13cf0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
13d00 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
13d10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13d20 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
13d30 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
13d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d50 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
13d60 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
13d70 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13d80 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
13d90 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
13da0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
13db0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
13dc0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
13dd0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
13de0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
13df0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
13e00 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
13e10 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
13e20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
13e30 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13e40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13e50 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
13e60 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
13e70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
13e80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13e90 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
13ea0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
13eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13ec0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
13ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13ee0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13f00 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13f10 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13f40 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13f50 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
13f60 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
13f70 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
13f80 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
13f90 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
13fa0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
13fb0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
13fc0 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
13fd0 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
13fe0 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
13ff0 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
14000 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
14010 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
14020 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
14030 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
14040 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
14050 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
14060 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
14070 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
14080 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
14090 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
140a0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
140b0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
140c0 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
140d0 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
140e0 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
140f0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
14100 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
14110 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
14120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
14130 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
14140 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
14150 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
14160 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
14170 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 3..*/.static i
14180 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63  nt whereRangeVec
14190 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20  torLen(.  Parse 
141a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
141b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
141c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  t */.  int iCur,
141d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
141e0 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49  ursor open on pI
141f0 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
14200 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
14210 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
14220 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75  used for a inequ
14230 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
14240 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
14250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14260 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71  mber of prior eq
14270 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14280 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78  ts on same index
14290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
142a0 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68  *pTerm     /* Th
142b0 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c  e vector inequal
142c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
142d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
142e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
142f0 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70  torSize(pTerm->p
14300 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
14310 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d  int i;..  nCmp =
14320 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78   MIN(nCmp, (pIdx
14330 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29  ->nColumn - nEq)
14340 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
14350 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
14360 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61  /* Test if compa
14370 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d  rison i of pTerm
14380 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   is compatible w
14390 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45  ith column (i+nE
143a0 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  q) .    ** of th
143b0 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c  e index. If not,
143c0 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20   exit the loop. 
143d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
143e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
14400 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  son affinity */.
14410 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
14420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14430 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c    /* Indexed col
14440 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f  umns affinity */
14450 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
14460 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
14470 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
14480 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14490 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  nce */.    Expr 
144a0 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pLhs = pTerm->p
144b0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
144c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
144d0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73  ;.    Expr *pRhs
144e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
144f0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
14500 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45   pRhs->flags & E
14510 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
14520 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
14530 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
14540 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14560 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78    pRhs = pRhs->x
14570 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
14580 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  pr;.    }..    /
14590 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
145a0 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70   LHS of the comp
145b0 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
145c0 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  mn reference to.
145d0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
145e0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
145f0 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c  ight source tabl
14600 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
14610 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65  sort.    ** orde
14620 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  r of the index c
14630 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d  olumn is the sam
14640 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72  e as the sort or
14650 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  der of the.    *
14660 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78  * leftmost index
14670 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20   column.  */.   
14680 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
14690 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
146a0 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
146b0 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
146c0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
146d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
146e0 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78  q] .     || pIdx
146f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e  ->aSortOrder[i+n
14700 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74  Eq]!=pIdx->aSort
14710 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29  Order[nEq].    )
14720 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14730 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
14740 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  se( pLhs->iColum
14750 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20  n==XN_ROWID );. 
14760 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
14770 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14780 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
14790 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
147a0 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73  ;.    idxaff = s
147b0 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
147c0 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e  nAffinity(pIdx->
147d0 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43  pTable, pLhs->iC
147e0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
147f0 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72  aff!=idxaff ) br
14800 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20  eak;..    pColl 
14810 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14820 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14830 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
14850 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14860 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14870 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
14880 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
14890 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a  +nEq]) ) break;.
148a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
148b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
148c0 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
148d0 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
148e0 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
148f0 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
14900 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
14910 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
14920 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
14930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14940 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
14950 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14960 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
14970 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
14980 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14990 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
149a0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
149b0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
149c0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
149d0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
149e0 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
149f0 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
14a00 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
14a10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
14a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14a30 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
14a40 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
14a50 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14a60 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14a70 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
14a80 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
14a90 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
14aa0 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
14ab0 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
14ac0 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
14ad0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
14ae0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
14af0 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
14b00 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
14b10 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
14b20 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
14b30 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
14b40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14b50 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
14b60 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
14b70 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
14b80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
14b90 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
14ba0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
14bb0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
14bc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14bd0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
14be0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14bf0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
14c00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
14c10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14c20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
14c30 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
14c40 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c60 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
14c70 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
14c80 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
14c90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
14ca0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
14cb0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
14cc0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
14cd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
14ce0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
14cf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14d00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14d10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14d20 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
14d30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14d40 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
14d50 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14d60 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
14d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
14d80 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
14d90 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14da0 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
14db0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
14dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
14dd0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
14de0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
14df0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
14e20 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
14e30 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
14e40 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
14e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14e60 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
14e70 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
14e80 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
14e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14ea0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14eb0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
14ec0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
14ed0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
14ee0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14ef0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
14f00 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
14f10 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
14f20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14f30 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14f40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
14f50 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42  /.  u16 saved_nB
14f60 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tm;             
14f70 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14f80 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
14f90 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20  .btree.nBtm */. 
14fa0 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b   u16 saved_nTop;
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14fd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14fe0 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31  ree.nTop */.  u1
14ff0 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15010 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
15020 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
15030 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
15040 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
15050 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
15060 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
15070 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
15080 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
15090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
150a0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
150b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
150c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
150d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
150e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
150f0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
15100 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15120 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
15130 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
15140 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
15150 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
15160 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
15170 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
15180 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
15190 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
151a0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
151b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
151c0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
151d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
151e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
151f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15200 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57  _NOMEM_BKPT;.  W
15210 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
15220 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64 42   ("BEGIN %s.addB
15230 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
15240 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
15260 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61  obe->pTable->zNa
15270 6d 65 2c 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  me,pProbe->zName
15280 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
15290 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
152a0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
152b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
152c0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
152d0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
152e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
152f0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
15300 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
15310 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
15320 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
15330 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
15340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15350 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
15360 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
15370 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
15380 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
15390 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
153a0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
153b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
153c0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
153d0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
153e0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
153f0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
15400 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
15410 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
15420 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
15430 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
15440 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
15450 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
15460 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
15470 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
15480 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
15490 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
154a0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
154b0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
154c0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
154d0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
154e0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
154f0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
15500 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
15510 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
15520 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
15530 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
15540 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
15550 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
15560 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
15590 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
155a0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
155b0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
155c0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
155d0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
155e0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
155f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15600 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
15610 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
15620 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
15630 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
15640 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
15650 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
15660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
15670 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
15680 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
15690 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
156a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
156b0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
156c0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
156d0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
156e0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
156f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15700 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
15710 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
15720 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15730 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
15740 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
15750 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
15760 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
15770 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
15780 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
15790 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
157a0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
157b0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
157c0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
157d0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
157e0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
157f0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15800 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15810 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15820 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15830 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15840 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
15850 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
15860 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15870 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15880 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
15890 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
158a0 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
158b0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
158c0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
158d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
158e0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
158f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15900 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15910 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15920 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  low constraints 
15930 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63  from the WHERE c
15940 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
15950 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   by the.    ** r
15960 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
15970 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79  LEFT JOIN.  Only
15980 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
15990 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72  the ON clause ar
159a0 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  e.    ** allowed
159b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72   */.    if( (pSr
159c0 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  c->fg.jointype &
159d0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
159e0 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
159f0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
15a00 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15a10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
15a20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
15a30 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49     if( IsUniqueI
15a40 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26 26 20  ndex(pProbe) && 
15a50 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
15a60 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29 7b 0a  e->nKeyCol-1 ){.
15a70 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
15a80 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  bldFlags |= SQLI
15a90 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45 3b 0a  TE_BLDF_UNIQUE;.
15aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ab0 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15ac0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15ad0 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  DF_INDEXED;.    
15ae0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  }.    pNew->wsFl
15af0 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15b00 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
15b10 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15b20 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15b30 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
15b40 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 20   saved_nBtm;.   
15b50 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15b60 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
15b70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
15b80 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
15b90 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
15ba0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
15bb0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
15bc0 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
15bd0 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
15be0 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15bf0 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
15c00 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
15c10 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
15c20 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
15c30 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
15c40 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20  ->maskSelf;..   
15c50 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d   assert( nInMul=
15c60 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  =0.        || (p
15c70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
15c80 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
15c90 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
15ca0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15cb0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
15cc0 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  N)!=0 .        |
15cd0 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15ce0 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
15cf0 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20  N)!=0 .    );.. 
15d00 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
15d10 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
15d20 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
15d30 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 4c 6f  >pExpr;.      Lo
15d40 67 45 73 74 20 4d 2c 20 6c 6f 67 4b 3b 0a 20 20  gEst M, logK;.  
15d50 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15d60 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15d70 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
15d80 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
15d90 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
15da0 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
15db0 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
15dc0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ows */.        i
15dd0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49  nt i;.        nI
15de0 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
15df0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
15e00 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20  st(25) );..     
15e10 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
15e20 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c  sion may actuall
15e30 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  y be of the form
15e40 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45   (x, y) IN (SELE
15e50 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20  CT...)..        
15e60 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
15e70 74 68 65 72 65 20 69 73 20 61 20 73 65 70 61 72  there is a separ
15e80 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63  ate term for eac
15e90 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29  h of (x) and (y)
15ea0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77  ..        ** How
15eb0 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75  ever, the nIn mu
15ec0 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20  ltiplier should 
15ed0 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20  only be applied 
15ee0 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20  once, not once. 
15ef0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61         ** for ea
15f00 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68  ch such term. Th
15f10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
15f20 20 63 68 65 63 6b 73 20 74 68 61 74 20 70 54 65   checks that pTe
15f30 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  rm is the.      
15f40 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20    ** first such 
15f50 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64  term in use, and
15f60 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74   sets nIn back t
15f70 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  o 0 if it is not
15f80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
15f90 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c  (i=0; i<pNew->nL
15fa0 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  Term-1; i++){.  
15fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
15fc0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70  ->aLTerm[i] && p
15fd0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  New->aLTerm[i]->
15fe0 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e  pExpr==pExpr ) n
15ff0 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  In = 0;.        
16000 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
16010 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
16020 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
16030 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
16040 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16050 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
16060 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
16070 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
16080 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
16090 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
160a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
160b0 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
160c0 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
160d0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
160e0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
16110 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
16120 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20  o "x=?". */.    
16130 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
16140 72 6f 62 65 2d 3e 68 61 73 53 74 61 74 31 20 29  robe->hasStat1 )
16150 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 74  {.        /* Let
16160 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4e  :.        **   N
16170 20 3d 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d   = the total num
16180 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16190 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
161a0 20 2a 2a 20 20 20 4b 20 3d 20 74 68 65 20 6e 75   **   K = the nu
161b0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
161c0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
161d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20  e IN operator.  
161e0 20 20 20 20 20 20 2a 2a 20 20 20 4d 20 3d 20 74        **   M = t
161f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16200 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16210 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 73 20  hat match terms 
16220 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
16230 2a 2a 20 20 20 20 20 20 20 74 6f 20 74 68 65 20  **       to the 
16240 6c 65 66 74 20 69 6e 20 74 68 65 20 73 61 6d 65  left in the same
16250 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
16260 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  IN operator is o
16270 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  n.        **    
16280 20 20 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74     the left-most
16290 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2c 20 4d   index column, M
162a0 3d 3d 4e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ==N..        **.
162b0 20 20 20 20 20 20 20 20 2a 2a 20 47 69 76 65 6e          ** Given
162c0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
162d0 20 61 62 6f 76 65 2c 20 69 74 20 69 73 20 62 65   above, it is be
162e0 74 74 65 72 20 74 6f 20 6f 6d 69 74 20 74 68 65  tter to omit the
162f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20   IN operator.   
16300 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
16310 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 61 6e   index lookup an
16320 64 20 69 6e 73 74 65 61 64 20 64 6f 20 61 20 73  d instead do a s
16330 63 61 6e 20 6f 66 20 74 68 65 20 4d 20 65 6c 65  can of the M ele
16340 6d 65 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  ments,.        *
16350 2a 20 74 65 73 74 69 6e 67 20 65 61 63 68 20 73  * testing each s
16360 63 61 6e 6e 65 64 20 72 6f 77 20 61 67 61 69 6e  canned row again
16370 73 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  st the IN operat
16380 6f 72 20 73 65 70 61 72 61 74 65 6c 79 2c 20 69  or separately, i
16390 66 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  f:.        **.  
163a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
163b0 4d 2a 6c 6f 67 28 4b 29 20 3c 20 4b 2a 6c 6f 67  M*log(K) < K*log
163c0 28 4e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  (N).        **. 
163d0 20 20 20 20 20 20 20 2a 2a 20 4f 75 72 20 65 73         ** Our es
163e0 74 69 6d 61 74 65 73 20 66 6f 72 20 4d 2c 20 4b  timates for M, K
163f0 2c 20 61 6e 64 20 4e 20 6d 69 67 68 74 20 62 65  , and N might be
16400 20 69 6e 61 63 63 75 72 61 74 65 2c 20 73 6f 20   inaccurate, so 
16410 77 65 20 62 75 69 6c 64 20 69 6e 0a 20 20 20 20  we build in.    
16420 20 20 20 20 2a 2a 20 61 20 73 61 66 65 74 79 20      ** a safety 
16430 6d 61 72 67 69 6e 20 6f 66 20 32 20 28 4c 6f 67  margin of 2 (Log
16440 45 73 74 3a 20 31 30 29 20 74 68 61 74 20 66 61  Est: 10) that fa
16450 76 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 49  vors using the I
16460 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 20  N operator.     
16470 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 69     ** with the i
16480 6e 64 65 78 2c 20 61 73 20 75 73 69 6e 67 20 61  ndex, as using a
16490 6e 20 69 6e 64 65 78 20 68 61 73 20 62 65 74 74  n index has bett
164a0 65 72 20 77 6f 72 73 74 2d 63 61 73 65 20 62 65  er worst-case be
164b0 68 61 76 69 6f 72 2e 0a 20 20 20 20 20 20 20 20  havior..        
164c0 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
164d0 68 61 76 65 20 72 65 61 6c 20 73 71 6c 69 74 65  have real sqlite
164e0 5f 73 74 61 74 31 20 64 61 74 61 2c 20 61 6c 77  _stat1 data, alw
164f0 61 79 73 20 70 72 65 66 65 72 20 74 6f 20 75 73  ays prefer to us
16500 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
16510 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
16520 2a 2f 0a 20 20 20 20 20 20 20 20 4d 20 3d 20 70  */.        M = p
16530 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
16540 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20  st[saved_nEq];. 
16550 20 20 20 20 20 20 20 6c 6f 67 4b 20 3d 20 65 73         logK = es
16560 74 4c 6f 67 28 6e 49 6e 29 3b 0a 20 20 20 20 20  tLog(nIn);.     
16570 20 20 20 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20     if( M + logK 
16580 2b 20 31 30 20 3c 20 6e 49 6e 20 2b 20 72 4c 6f  + 10 < nIn + rLo
16590 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
165a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
165b0 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  40,.            
165c0 28 22 53 63 61 6e 20 70 72 65 66 65 72 72 65 64  ("Scan preferred
165d0 20 6f 76 65 72 20 49 4e 20 6f 70 65 72 61 74 6f   over IN operato
165e0 72 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f  r on column %d o
165f0 66 20 5c 22 25 73 5c 22 20 28 25 64 3c 25 64 29  f \"%s\" (%d<%d)
16600 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16610 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72    saved_nEq, pPr
16620 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f  obe->zName, M+lo
16630 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53  gK+10, nIn+rLogS
16640 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
16650 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16670 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
16680 78 34 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x40,.           
16690 20 28 22 49 4e 20 6f 70 65 72 61 74 6f 72 20 70   ("IN operator p
166a0 72 65 66 65 72 72 65 64 20 6f 6e 20 63 6f 6c 75  referred on colu
166b0 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22 20  mn %d of \"%s\" 
166c0 28 25 64 3e 3d 25 64 29 5c 6e 22 2c 0a 20 20 20  (%d>=%d)\n",.   
166d0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 5f            saved_
166e0 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  nEq, pProbe->zNa
166f0 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e  me, M+logK+10, n
16700 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20  In+rLogSize));. 
16710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16720 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
16730 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
16740 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 7d 65 6c  LUMN_IN;.    }el
16750 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
16760 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20  _EQ|WO_IS) ){.  
16770 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
16780 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
16790 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20  saved_nEq];.    
167a0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
167b0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
167c0 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  EQ;.      assert
167d0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65  ( saved_nEq==pNe
167e0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  w->u.btree.nEq )
167f0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
16800 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20  ==XN_ROWID .    
16810 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26     || (iCol>=0 &
16820 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73  & nInMul==0 && s
16830 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65  aved_nEq==pProbe
16840 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20  ->nKeyCol-1).   
16850 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66     ){.        if
16860 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
16870 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   || pProbe->uniq
16880 4e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20 20 20 20  NotNull .       
16890 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d 3e 6e 4b    || (pProbe->nK
168a0 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 50 72 6f  eyCol==1 && pPro
168b0 62 65 2d 3e 6f 6e 45 72 72 6f 72 20 26 26 20 65  be->onError && e
168c0 4f 70 3d 3d 57 4f 5f 45 51 29 20 0a 20 20 20 20  Op==WO_EQ) .    
168d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
168e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
168f0 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
16900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16910 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
16920 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
16930 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
16940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16950 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
16960 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
16970 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16980 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16990 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  MN_NULL;.    }el
169a0 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
169b0 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
169c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
169d0 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20  p & WO_GT );.   
169e0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
169f0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
16a00 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16a10 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
16a20 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
16a30 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65  LIMIT;.      pNe
16a40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
16a50 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74  = whereRangeVect
16a60 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20  orLen(.         
16a70 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69   pParse, pSrc->i
16a80 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20  Cursor, pProbe, 
16a90 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d  saved_nEq, pTerm
16aa0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
16ab0 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
16ac0 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
16ad0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
16ae0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
16af0 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20  KEOPT ){.       
16b00 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61   /* Range contra
16b10 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66  ints that come f
16b20 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  rom the LIKE opt
16b30 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20  imization are.  
16b40 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
16b50 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a  used in pairs. *
16b60 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d  /.        pTop =
16b70 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20   &pTerm[1];.    
16b80 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 6f      assert( (pTo
16b90 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  p-(pTerm->pWC->a
16ba0 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e  ))<pTerm->pWC->n
16bb0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
16bc0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74  assert( pTop->wt
16bd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
16be0 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20  EOPT );.        
16bf0 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f  assert( pTop->eO
16c00 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
16c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  ;.        if( wh
16c20 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
16c30 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
16c40 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
16c50 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20   /* OOM */.     
16c60 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
16c70 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
16c80 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20  = pTop;.        
16c90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16ca0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
16cb0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16cc0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31  u.btree.nTop = 1
16cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16ce0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
16cf0 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c  t( eOp & (WO_LT|
16d00 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20  WO_LE) );.      
16d10 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
16d20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
16d30 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
16d40 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_LE );.      pN
16d50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
16d60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
16d70 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  E|WHERE_TOP_LIMI
16d80 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  T;.      pNew->u
16d90 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68  .btree.nTop = wh
16da0 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65  ereRangeVectorLe
16db0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  n(.          pPa
16dc0 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  rse, pSrc->iCurs
16dd0 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65  or, pProbe, save
16de0 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20  d_nEq, pTerm.   
16df0 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70     );.      pTop
16e00 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
16e10 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
16e20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
16e30 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
16e60 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
16e70 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
16e80 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
16e90 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
16ea0 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
16eb0 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
16ec0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
16ed0 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
16ee0 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
16ef0 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
16f00 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
16f10 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
16f20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
16f30 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
16f40 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
16f50 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
16f60 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
16f70 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
16f80 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
16f90 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
16fa0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
16fb0 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
16fc0 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
16fd0 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
16fe0 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
16ff0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
17000 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
17010 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
17020 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
17030 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
17040 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
17050 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
17060 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
17070 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
17080 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
17090 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
170a0 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
170b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
170c0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
170d0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
170e0 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
170f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17100 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
17110 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17120 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
17130 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
17140 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  L|WO_EQ|WO_IN|WO
17150 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61  _IS) );..      a
17160 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
17170 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
17180 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
17190 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26  ->truthProb<=0 &
171a0 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  & pProbe->aiColu
171b0 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30  mn[saved_nEq]>=0
171c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
171d0 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e  rt( (eOp & WO_IN
171e0 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20  ) || nIn==0 );. 
171f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17200 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a   eOp & WO_IN );.
17210 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17220 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
17230 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
17240 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
17250 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
17260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17270 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
17280 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77  AT4.        tRow
17290 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  cnt nOut = 0;.  
172a0 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c        if( nInMul
172b0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
172c0 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65   pProbe->nSample
172d0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e   .         && pN
172e0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
172f0 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65  =pProbe->nSample
17300 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  Col.         && 
17310 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d  ((eOp & WO_IN)==
17320 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  0 || !ExprHasPro
17330 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
17340 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17350 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
17360 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
17370 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
17380 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
17390 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  ( (eOp & (WO_EQ|
173a0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29  WO_ISNULL|WO_IS)
173b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
173c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
173d0 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  p & WO_EQ );.   
173e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
173f0 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29  e( eOp & WO_IS )
17400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
17410 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17420 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
17430 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
17440 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
17450 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
17460 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
17470 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
17480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17490 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
174a0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
174b0 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
174c0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
174d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
174e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
174f0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
17500 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
17510 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17530 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
17540 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74  /* Jump out of t
17550 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f  he pTerm loop */
17560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
17570 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
17580 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
17590 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f  sqlite3LogEst(nO
175a0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
175b0 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e   if( pNew->nOut>
175c0 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65  saved_nOut ) pNe
175d0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
175e0 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  nOut;.          
175f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
17600 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nIn;.          }
17610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17620 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29     if( nOut==0 )
17630 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
17640 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
17650 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62  ->nOut += (pProb
17660 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
17670 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
17680 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d  RowLogEst[nEq-1]
17690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
176a0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
176b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176c0 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
176d0 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69  ere is no likeli
176e0 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73  hood() value, as
176f0 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20  sume that a .   
17700 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c           ** "col
17710 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73   IS NULL" expres
17720 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69  sion matches twi
17730 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20  ce as many rows 
17740 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
17750 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20  as (col=?). */. 
17760 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
17770 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20  >nOut += 10;.   
17780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17790 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
177a0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f  ..    /* Set rCo
177b0 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73  stIdx to the cos
177c0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65  t of visiting se
177d0 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69  lected rows in i
177e0 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a  ndex. Add.    **
177f0 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75   it to pNew->rRu
17800 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72  n, which is curr
17810 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
17820 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64   cost of the ind
17830 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  ex.    ** seek o
17840 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  nly. Then, if th
17850 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
17860 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20  ring index, add 
17870 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
17880 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  ** visiting the 
17890 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
178a0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
178b0 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d  rCostIdx = pNew-
178c0 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a  >nOut + 1 + (15*
178d0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
178e0 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a  )/pSrc->pTab->sz
178f0 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  TabRow;.    pNew
17900 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
17910 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
17920 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20  ze, rCostIdx);. 
17930 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
17940 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
17950 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
17960 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
17970 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
17980 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
17990 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e  ew->rRun, pNew->
179a0 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20  nOut + 16);.    
179b0 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d  }.    ApplyCostM
179c0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
179d0 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54  rRun, pProbe->pT
179e0 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  able->costMult);
179f0 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
17a00 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
17a10 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
17a20 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
17a30 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
17a40 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
17a50 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
17a60 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
17a70 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
17a80 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  , rSize);.    rc
17a90 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
17aa0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
17ab0 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
17ac0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
17ad0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
17ae0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  ){.      pNew->n
17af0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
17b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17b10 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
17b20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a  nOutUnadjusted;.
17b30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
17b40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
17b50 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
17b60 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77  ==0.     && pNew
17b70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
17b80 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  robe->nColumn.  
17b90 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
17ba0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
17bb0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
17bc0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
17bd0 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  +nIn);.    }.   
17be0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
17bf0 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66  ved_nOut;.#ifdef
17c00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17c10 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
17c20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
17c30 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
17c40 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  d;.#endif.  }.  
17c50 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
17c60 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70  aved_prereq;.  p
17c70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
17c80 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
17c90 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
17ca0 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b  tm = saved_nBtm;
17cb0 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
17cc0 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
17cd0 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  op;.  pNew->nSki
17ce0 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
17cf0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
17d00 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
17d10 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
17d20 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
17d30 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
17d40 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f  ved_nLTerm;..  /
17d50 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67  * Consider using
17d60 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20   a skip-scan if 
17d70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
17d80 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
17d90 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c  aints.  ** avail
17da0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66  able for the lef
17db0 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20  t-most terms of 
17dc0 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69  the index, and i
17dd0 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20 20  f the average.  
17de0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  ** number of rep
17df0 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74  eats in the left
17e00 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61  -most terms is a
17e10 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a  t least 18. .  *
17e20 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63  *.  ** The magic
17e30 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73 65   number 18 is se
17e40 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61  lected on the ba
17e50 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e  sis that scannin
17e60 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69  g 17 rows.  ** i
17e70 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
17e80 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20  quicker than an 
17e90 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e  index seek (even
17ea0 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20 69   though if the i
17eb0 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ndex.  ** contai
17ec0 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e  ns fewer than 2^
17ed0 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d  17 rows we assum
17ee0 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f  e otherwise in o
17ef0 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20  ther parts of.  
17f00 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e  ** the code). An
17f10 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  d, even if it is
17f20 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20   not, it should 
17f30 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20  not be too much 
17f40 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e  slower. .  ** On
17f50 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
17f60 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b 73   the extra seeks
17f70 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65   could end up be
17f80 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  ing significantl
17f90 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65  y.  ** more expe
17fa0 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73  nsive.  */.  ass
17fb0 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33  ert( 42==sqlite3
17fc0 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20  LogEst(18) );.  
17fd0 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73  if( saved_nEq==s
17fe0 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26  aved_nSkip.   &&
17ff0 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72   saved_nEq+1<pPr
18000 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20  obe->nKeyCol.   
18010 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69  && pProbe->noSki
18020 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70  pScan==0.   && p
18030 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
18040 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e  st[saved_nEq+1]>
18050 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  =42  /* TUNING: 
18060 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70  Minimum for skip
18070 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28  -scan */.   && (
18080 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65  rc = whereLoopRe
18090 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
180a0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d  New->nLTerm+1))=
180b0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a  =SQLITE_OK.  ){.
180c0 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72      LogEst nIter
180d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
180e0 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70  ree.nEq++;.    p
180f0 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20  New->nSkip++;.  
18100 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
18110 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
18120 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   0;.    pNew->ws
18130 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53  Flags |= WHERE_S
18140 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74  KIPSCAN;.    nIt
18150 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  er = pProbe->aiR
18160 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
18170 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
18180 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
18190 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77  nEq+1];.    pNew
181a0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b  ->nOut -= nIter;
181b0 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
181c0 20 42 65 63 61 75 73 65 20 75 6e 63 65 72 74 61   Because uncerta
181d0 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65 73  inties in the es
181e0 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70  timates for skip
181f0 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20  -scan queries,. 
18200 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37     ** add a 1.37
18210 35 20 66 75 64 67 65 20 66 61 63 74 6f 72 20 74  5 fudge factor t
18220 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e  o make skip-scan
18230 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c   slightly less l
18240 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49  ikely. */.    nI
18250 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68  ter += 5;.    wh
18260 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
18270 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
18280 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74  Src, pProbe, nIt
18290 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20  er + nInMul);.  
182a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
182b0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70  aved_nOut;.    p
182c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
182d0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
182e0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
182f0 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20  saved_nSkip;.   
18300 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
18310 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
18320 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43    }..  WHERETRAC
18330 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44 20 25  E(0x800, ("END %
18340 73 2e 61 64 64 42 74 72 65 65 49 64 78 28 25 73  s.addBtreeIdx(%s
18350 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64  ), nEq=%d, rc=%d
18360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18370 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62             pProb
18380 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  e->pTable->zName
18390 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c  , pProbe->zName,
183a0 20 73 61 76 65 64 5f 6e 45 71 2c 20 72 63 29 29   saved_nEq, rc))
183b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
183c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
183d0 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
183e0 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
183f0 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
18400 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
18410 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
18420 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
18430 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
18440 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
18450 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
18460 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
18470 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
18480 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
18490 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
184a0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
184b0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
184c0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
184d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
184e0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
184f0 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
18500 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
18510 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
18520 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
18530 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
18540 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45  prList *pOB;.  E
18550 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70  xprList *aColExp
18560 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  r;.  int ii, jj;
18570 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
18580 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
18590 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
185a0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
185b0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
185c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
185d0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
185e0 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
185f0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
18600 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
18610 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
18620 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
18630 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
18640 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
18650 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
18660 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
18670 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
18680 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
18690 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
186a0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
186b0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
186c0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
186d0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
186e0 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
186f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
18700 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f    }else if( (aCo
18710 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  lExpr = pIndex->
18720 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a  aColExpr)!=0 ){.
18730 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
18740 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
18750 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
18760 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
18770 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f  iColumn[jj]!=XN_
18780 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
18790 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
187a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
187b0 6b 69 70 28 70 45 78 70 72 2c 61 43 6f 6c 45 78  kip(pExpr,aColEx
187c0 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c  pr->a[jj].pExpr,
187d0 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20  iCursor)==0 ){. 
187e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
187f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
18800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18810 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18820 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18830 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
18840 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
18850 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
18860 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
18870 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
18880 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
18890 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
188a0 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
188b0 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
188c0 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
188d0 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
188e0 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
188f0 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
18900 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
18910 65 72 6d 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  erm;.  Parse *pP
18920 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
18930 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 68  fo->pParse;.  wh
18940 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
18950 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69  =TK_AND ){.    i
18960 66 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  f( !whereUsableP
18970 61 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62  artialIndex(iTab
18980 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65  ,pWC,pWhere->pLe
18990 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
189a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
189b0 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  ere->pRight;.  }
189c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
189d0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
189e0 45 5f 45 6e 61 62 6c 65 51 50 53 47 20 29 20 70  E_EnableQPSG ) p
189f0 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 66 6f 72  Parse = 0;.  for
18a00 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
18a10 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
18a20 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
18a30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
18a40 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
18a50 0a 20 20 20 20 69 66 28 20 28 21 45 78 70 72 48  .    if( (!ExprH
18a60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18a70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c  , EP_FromJoin) |
18a80 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
18a90 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a  oinTable==iTab).
18aa0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
18ab0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
18ac0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 57  Parse, pExpr, pW
18ad0 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20  here, iTab) .   
18ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18af0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
18b00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18b10 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
18b20 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
18b30 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
18b40 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72  of the join wher
18b50 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69  e the table.** i
18b60 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
18b70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
18b80 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
18b90 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
18ba0 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
18bb0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
18bc0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
18bd0 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57  .** The costs (W
18be0 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f  hereLoop.rRun) o
18bf0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f  f the b-tree loo
18c00 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69 73  ps added by this
18c10 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65   function.** are
18c20 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66   calculated as f
18c30 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f  ollows:.**.** Fo
18c40 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61  r a full scan, a
18c50 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c  ssuming the tabl
18c60 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e  e (or index) con
18c70 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a  tains nRow rows:
18c80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
18c90 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20  = nRow * 3.0    
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63  // full-table sc
18cc0 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  an.**     cost =
18cd0 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20   nRow * K       
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18cf0 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69  / scan of coveri
18d00 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
18d10 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b  cost = nRow * (K
18d20 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20 20  +3.0)           
18d30 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
18d40 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18d50 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b  ex.**.** where K
18d60 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74 77   is a value betw
18d70 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20  een 1.1 and 3.0 
18d80 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
18d90 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73   relative .** es
18da0 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20  timated average 
18db0 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
18dc0 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f  x and table reco
18dd0 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  rds..**.** For a
18de0 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68  n index scan, wh
18df0 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74 68  ere nVisit is th
18e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  e number of inde
18e10 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a  x rows visited.*
18e20 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61  * by the scan, a
18e30 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20  nd nSeek is the 
18e40 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f  number of seek o
18e50 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
18e60 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e  ed on .** the in
18e70 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a  dex b-tree:.**.*
18e80 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
18e90 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18ea0 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20  + K * nVisit)   
18eb0 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69         // coveri
18ec0 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20  ng index.**     
18ed0 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
18ee0 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33  log(nRow) + (K+3
18ef0 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20  .0) * nVisit)   
18f00 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67   // non-covering
18f10 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72   index.**.** Nor
18f20 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20  mally, nSeek is 
18f30 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20  1. nSeek values 
18f40 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20 63  greater than 1 c
18f50 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68 65  ome about if the
18f60 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73   .** WHERE claus
18f70 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e  e includes "x IN
18f80 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75   (....)" terms u
18f90 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
18fa0 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a  "x=?". Or when .
18fb0 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49  ** implicit "x I
18fc0 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
18fd0 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65   tbl)" terms are
18fe0 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d   added for skip-
18ff0 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  scans..**.** The
19000 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75 65   estimated value
19010 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c  s (nRow, nVisit,
19020 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f   nSeek) often co
19030 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61 6d  ntain a large am
19040 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72  ount.** of uncer
19050 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68 69  tainty.  For thi
19060 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e  s reason, scorin
19070 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  g is designed to
19080 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61 74   pick plans that
19090 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61 73  .** "do the leas
190a0 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20 65  t harm" if the e
190b0 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e 61  stimates are ina
190c0 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65 78  ccurate.  For ex
190d0 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28  ample, a.** log(
190e0 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73 20  nRow) factor is 
190f0 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20 6e  omitted from a n
19100 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
19110 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72 20  x scan in order 
19120 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20 73  to.** bias the s
19130 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72 20  coring in favor 
19140 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
19150 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72  x, since the wor
19160 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f  st-case.** perfo
19170 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67 20  rmance of using 
19180 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72 20  an index is far 
19190 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 20  better than the 
191a0 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66 6f  worst-case perfo
191b0 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66  rmance.** of a f
191c0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull table scan..
191d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
191e0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
191f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
19200 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
19210 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
19220 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
19230 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20  Bitmask mPrereq 
19240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
19250 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
19260 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
19270 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
19280 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
19290 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
192a0 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
192b0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
192c0 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
192d0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
192e0 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
192f0 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
19300 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
19310 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
19320 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
19330 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
19340 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69 52   */.  LogEst aiR
19350 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20  owEstPk[2];     
19360 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f    /* The aiRowLo
19370 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  gEst[] value for
19380 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
19390 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
193a0 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
193b0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
193c0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
193d0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
193e0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
193f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19400 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19410 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19420 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
19430 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
19440 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
19450 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
19460 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
19470 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
19480 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
19490 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
194a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
194b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
194c0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
194d0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
194e0 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
194f0 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
19520 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
19530 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
19540 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
19550 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
19560 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
19570 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
19580 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
19590 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
195a0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
195b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
195c0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
195d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
195e0 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
195f0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
19600 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
19610 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
19620 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
19630 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
19640 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
19650 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
19660 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
19670 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
19680 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
19690 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
196a0 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
196b0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
196c0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
196d0 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
196e0 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
196f0 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
19700 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29  pSrc->pIBIndex )
19710 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
19720 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
19730 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
19740 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
19750 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
19760 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  = pSrc->pIBIndex
19770 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48  ;.  }else if( !H
19780 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
19790 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54  .    pProbe = pT
197a0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  ab->pIndex;.  }e
197b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
197c0 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
197d0 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
197e0 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
197f0 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
19800 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
19810 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
19820 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
19830 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
19840 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
19850 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
19860 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
19870 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
19880 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
19890 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
198a0 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
198b0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
198c0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
198d0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
198e0 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
198f0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
19900 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
19910 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
19920 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43  );.    sPk.nKeyC
19930 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  ol = 1;.    sPk.
19940 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
19950 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20   sPk.aiColumn = 
19960 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20  &aiColumnPk;.   
19970 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74   sPk.aiRowLogEst
19980 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20   = aiRowEstPk;. 
19990 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d     sPk.onError =
199a0 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
199b0 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54   sPk.pTable = pT
199c0 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64  ab;.    sPk.szId
199d0 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54  xRow = pTab->szT
199e0 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77  abRow;.    aiRow
199f0 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d  EstPk[0] = pTab-
19a00 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20  >nRowLogEst;.   
19a10 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
19a20 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   0;.    pFirst =
19a30 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
19a40 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
19a50 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  c->fg.notIndexed
19a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
19a70 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
19a80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
19a90 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
19aa0 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
19ab0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
19ac0 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
19ad0 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
19ae0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
19af0 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
19b00 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
19b10 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
19b20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62  }.  rSize = pTab
19b30 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
19b40 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
19b50 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  g(rSize);..#ifnd
19b60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19b70 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
19b80 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
19b90 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
19ba0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
19bb0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72        /* Not par
19bc0 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d  t of an OR optim
19bd0 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26  ization */.   &&
19be0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
19bf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
19c00 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20  SUBCLAUSE)==0.  
19c10 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
19c20 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
19c30 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
19c40 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
19c50 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20 20  ->pIBIndex==0   
19c60 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44     /* Has no IND
19c70 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 2a  EXED BY clause *
19c80 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
19c90 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20 2f  g.notIndexed   /
19ca0 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44  * Has no NOT IND
19cb0 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20  EXED clause */. 
19cc0 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
19cd0 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ab)         /* N
19ce0 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ot WITHOUT ROWID
19cf0 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20   table. (FIXME: 
19d00 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20  Why not?) */.   
19d10 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 43  && !pSrc->fg.isC
19d20 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74  orrelated /* Not
19d30 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
19d40 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26 20  bquery */.   && 
19d50 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63 75  !pSrc->fg.isRecu
19d60 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20  rsive  /* Not a 
19d70 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e  recursive common
19d80 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
19d90 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f  n. */.  ){.    /
19da0 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d  * Generate auto-
19db0 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73  index WhereLoops
19dc0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
19dd0 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68  m *pTerm;.    Wh
19de0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20  ereTerm *pWCEnd 
19df0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
19e00 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70  nTerm;.    for(p
19e10 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d  Term=pWC->a; rc=
19e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
19e30 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
19e40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
19e50 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
19e60 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
19e70 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
19e80 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61        if( termCa
19e90 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
19ea0 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20  m, pSrc, 0) ){. 
19eb0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
19ec0 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
19ed0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69        pNew->nSki
19ee0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  p = 0;.        p
19ef0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
19f00 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
19f10 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
19f20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
19f30 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
19f40 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  rm;.        /* T
19f50 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20  UNING: One-time 
19f60 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69  cost for computi
19f70 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ng the automatic
19f80 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20   index is.      
19f90 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74    ** estimated t
19fa0 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29  o be X*N*log2(N)
19fb0 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
19fc0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19fd0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
19fe0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
19ff0 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58  exed and where X
1a000 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38   is 7 (LogEst=28
1a010 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20  ) for normal.   
1a020 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f       ** tables o
1a030 72 20 30 2e 35 20 28 4c 6f 67 45 73 74 3d 2d 31  r 0.5 (LogEst=-1
1a040 30 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  0) for views and
1a050 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
1a060 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
1a070 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c  ** of X is small
1a080 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64  er for views and
1a090 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74   subqueries so t
1a0a0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c  hat the query pl
1a0b0 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  anner.        **
1a0c0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67   will be more ag
1a0d0 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67  gressive about g
1a0e0 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61  enerating automa
1a0f0 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a  tic indexes for.
1a100 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65          ** those
1a110 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20   objects, since 
1a120 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f  there is no oppo
1a130 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73  rtunity to add s
1a140 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a  chema.        **
1a150 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71   indexes on subq
1a160 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73  ueries and views
1a170 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
1a180 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67  w->rSetup = rLog
1a190 53 69 7a 65 20 2b 20 72 53 69 7a 65 3b 0a 20 20  Size + rSize;.  
1a1a0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
1a1b0 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70  pSelect==0 && (p
1a1c0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1a1d0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
1a1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1a1f0 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 38  ew->rSetup += 28
1a200 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1a210 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1a220 3e 72 53 65 74 75 70 20 2d 3d 20 31 30 3b 0a 20  >rSetup -= 10;. 
1a230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a240 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
1a250 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75  lier(pNew->rSetu
1a260 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  p, pTab->costMul
1a270 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a280 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29  pNew->rSetup<0 )
1a290 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1a2a0 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  0;.        /* TU
1a2b0 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
1a2c0 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
1a2d0 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
1a2e0 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
1a2f0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
1a300 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
1a310 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
1a320 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
1a330 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
1a340 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
1a350 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
1a360 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
1a370 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
1a380 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
1a390 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
1a3a0 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
1a3b0 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
1a3c0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1a3d0 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
1a3e0 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
1a3f0 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
1a400 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1a410 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1a420 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
1a430 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
1a440 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1a450 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
1a460 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
1a470 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
1a480 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
1a490 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
1a4a0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1a4b0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1a4c0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
1a4d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
1a4e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
1a4f0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
1a500 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1a510 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 49 66   all indices. If
1a520 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
1a530 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1a540 20 74 68 65 6e 20 6f 6e 6c 79 20 0a 20 20 2a 2a   then only .  **
1a550 20 63 6f 6e 73 69 64 65 72 20 69 6e 64 65 78 20   consider index 
1a560 70 50 72 6f 62 65 2e 20 20 2a 2f 0a 20 20 66 6f  pProbe.  */.  fo
1a570 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
1a580 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 0a 20 20  K && pProbe; .  
1a590 20 20 20 20 70 50 72 6f 62 65 3d 28 70 53 72 63      pProbe=(pSrc
1a5a0 2d 3e 70 49 42 49 6e 64 65 78 20 3f 20 30 20 3a  ->pIBIndex ? 0 :
1a5b0 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 2c   pProbe->pNext),
1a5c0 20 69 53 6f 72 74 49 64 78 2b 2b 0a 20 20 29 7b   iSortIdx++.  ){
1a5d0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
1a5e0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
1a5f0 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
1a600 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
1a610 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  ex(pSrc->iCursor
1a620 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
1a630 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
1a640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a650 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72   pNew->iTab!=pSr
1a660 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  c->iCursor );  /
1a670 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38  * See ticket [98
1a680 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20  d973b8f5] */.   
1a690 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
1a6a0 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69   Partial index i
1a6b0 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72  nappropriate for
1a6c0 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
1a6d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 72     }.    if( pPr
1a6e0 6f 62 65 2d 3e 62 4e 6f 51 75 65 72 79 20 29 20  obe->bNoQuery ) 
1a6f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 53  continue;.    rS
1a700 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
1a710 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
1a720 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1a730 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
1a740 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
1a750 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
1a760 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b  .btree.nTop = 0;
1a770 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
1a780 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1a790 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
1a7a0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1a7b0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
1a7c0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
1a7d0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72  ew->prereq = mPr
1a7e0 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ereq;.    pNew->
1a7f0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
1a800 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1a810 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
1a820 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
1a830 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
1a840 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
1a850 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
1a860 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
1a870 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
1a880 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
1a890 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
1a8a0 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
1a8b0 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
1a8c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1a8d0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
1a8e0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
1a8f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
1a900 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
1a910 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
1a920 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1a930 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
1a940 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1a950 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
1a960 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
1a970 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
1a980 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
1a990 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
1a9a0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
1a9b0 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
1a9c0 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
1a9d0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
1a9e0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
1a9f0 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
1aa00 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
1aa10 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
1aa20 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
1aa30 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
1aa40 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
1aa50 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
1aa60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1aa70 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1aa80 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
1aa90 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
1aaa0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
1aab0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
1aac0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
1aad0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
1aae0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
1aaf0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
1ab00 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
1ab10 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
1ab20 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
1ab30 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
1ab40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
1ab50 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
1ab60 20 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49   pProbe->colNotI
1ab70 64 78 65 64 3b 0a 20 20 20 20 20 20 20 20 70 4e  dxed;.        pN
1ab80 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
1ab90 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
1aba0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
1abb0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
1abc0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
1abd0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
1abe0 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
1abf0 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
1ac00 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
1ac10 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
1ac20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
1ac30 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20  Where!=0.       
1ac40 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
1ac50 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
1ac60 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
1ac70 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d       && (pProbe-
1ac80 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
1ac90 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20  szTabRow).      
1aca0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1acb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1acc0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
1acd0 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
1ace0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1acf0 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
1ad00 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
1ad10 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
1ad20 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1ad30 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
1ad40 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
1ad50 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
1ad60 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1ad70 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
1ad80 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  x : 0;..        
1ad90 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76  /* The cost of v
1ada0 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  isiting the inde
1adb0 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77  x rows is N*K, w
1adc0 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20  here K is.      
1add0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31    ** between 1.1
1ade0 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64   and 3.0, depend
1adf0 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  ing on the relat
1ae00 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
1ae10 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1ae20 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73  x and table rows
1ae30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
1ae40 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1ae50 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
1ae60 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
1ae70 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
1ae80 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
1ae90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1aea0 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
1aeb0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
1aec0 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f  n, add in the co
1aed0 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  st of.          
1aee0 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c  ** doing table l
1aef0 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73  ookups.  The cos
1af00 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65  t will be 3x the
1af10 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
1af20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e       ** lookups.
1af30 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f    Take into acco
1af40 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  unt WHERE clause
1af50 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1af60 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
1af70 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
1af80 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20  just the index, 
1af90 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  and that do not 
1afa0 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20 20  require a.      
1afb0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f      ** table loo
1afc0 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  kup. */.        
1afd0 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70    LogEst nLookup
1afe0 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20   = rSize + 16;  
1aff0 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e  /* Base cost:  N
1b000 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  *3 */.          
1b010 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1b020 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
1b030 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  c->iCursor;.    
1b040 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
1b050 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66  e *pWC2 = &pWInf
1b060 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20  o->sWC;.        
1b070 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1b080 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  WC2->nTerm; ii++
1b090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  ){.            W
1b0a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
1b0b0 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a  = &pWC2->a[ii];.
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b0d0 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65  !sqlite3ExprCove
1b0e0 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d  redByIndex(pTerm
1b0f0 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70  ->pExpr, iCur, p
1b100 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
1b110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b120 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b130 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72           /* pTer
1b140 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  m can be evaluat
1b150 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  ed using just th
1b160 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64  e index.  So red
1b170 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1b180 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64 20  ** the expected 
1b190 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20  number of table 
1b1a0 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e  lookups accordin
1b1b0 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  gly */.         
1b1c0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
1b1d0 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f              nLoo
1b1f0 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  kup += pTerm->tr
1b200 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20  uthProb;.       
1b210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b220 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75            nLooku
1b230 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p--;.           
1b240 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1b250 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1b260 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75  |WO_IS) ) nLooku
1b270 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20  p -= 19;.       
1b280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20   }.          .  
1b2a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1b2b0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
1b2c0 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
1b2d0 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20  , nLookup);.    
1b2e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
1b2f0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1b300 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1b310 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1b320 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
1b330 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
1b340 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
1b350 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1b360 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1b370 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1b380 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
1b390 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
1b3a0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1b3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b3c0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62  .    pBuilder->b
1b3d0 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ldFlags = 0;.   
1b3e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b3f0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
1b400 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
1b410 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  obe, 0);.    if(
1b420 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1b430 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46  ags==SQLITE_BLDF
1b440 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1b450 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e    /* If a non-un
1b460 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73  ique index is us
1b470 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66  ed, or if a pref
1b480 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f  ix of the key fo
1b490 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75  r.      ** uniqu
1b4a0 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  e index is used 
1b4b0 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65  (making the inde
1b4c0 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e  x functionally n
1b4d0 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20  on-unique).     
1b4e0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c   ** then the sql
1b4f0 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20 62  ite_stat1 data b
1b500 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74  ecomes important
1b510 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65   for scoring the
1b520 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a  .      ** plan *
1b530 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  /.      pTab->ta
1b540 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61  bFlags |= TF_Sta
1b550 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69  tsUsed;.    }.#i
1b560 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b570 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
1b580 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
1b590 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
1b5a0 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
1b5b0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
1b5c0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
1b5d0 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
1b5e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
1b5f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1b600 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b610 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f  _VIRTUALTABLE../
1b620 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
1b630 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64  dxInfo is alread
1b640 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  y populated with
1b650 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1b660 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20   that may.** be 
1b670 75 73 65 64 20 62 79 20 74 68 65 20 76 69 72 74  used by the virt
1b680 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69  ual table identi
1b690 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
1b6a0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68  ->pNew->iTab. Th
1b6b0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  is.** function m
1b6c0 61 72 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66  arks a subset of
1b6d0 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e   those constrain
1b6e0 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b  ts usable, invok
1b6f0 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49  es the.** xBestI
1b700 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20  ndex method and 
1b710 61 64 64 73 20 74 68 65 20 72 65 74 75 72 6e 65  adds the returne
1b720 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64  d plan to pBuild
1b730 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73  er..**.** A cons
1b740 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64  traint is marked
1b750 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a   usable if:.**.*
1b760 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d  *   * Argument m
1b770 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73  Usable indicates
1b780 20 74 68 61 74 20 69 74 73 20 70 72 65 72 65 71   that its prereq
1b790 75 69 73 69 74 65 73 20 61 72 65 20 61 76 61 69  uisites are avai
1b7a0 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  lable, and.**.**
1b7b0 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f     * It is not o
1b7c0 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
1b7d0 6f 72 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ors specified in
1b7e0 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61   the mExclude ma
1b7f0 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20  sk passed.**    
1b800 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20 61   as the fourth a
1b810 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69  rgument (which i
1b820 6e 20 70 72 61 63 74 69 63 65 20 69 73 20 65 69  n practice is ei
1b830 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29  ther WO_IN or 0)
1b840 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
1b850 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
1b860 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
1b870 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
1b880 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  d before the.** 
1b890 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
1b8a0 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65   question. These
1b8b0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
1b8c0 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69  e plans prerequi
1b8d0 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  sites.** before 
1b8e0 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 70  it is added to p
1b8f0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f  Builder..**.** O
1b900 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
1b910 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20  *pbIn is set to 
1b920 74 72 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e  true if the plan
1b930 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64   added to pBuild
1b940 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f  er.** uses one o
1b950 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72  r more WO_IN ter
1b960 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ms, or false oth
1b970 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1b980 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1b990 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1b9a0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1b9b0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69   *pBuilder,.  Bi
1b9c0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9e0 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   Mask of tables 
1b9f0 74 68 61 74 20 6d 75 73 74 20 62 65 20 75 73 65  that must be use
1ba00 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  d. */.  Bitmask 
1ba10 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  mUsable,        
1ba20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1ba30 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73  of usable tables
1ba40 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75   */.  u16 mExclu
1ba50 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
1ba60 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65        /* Exclude
1ba70 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65   terms using the
1ba80 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  se operators */.
1ba90 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1baa0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
1bab0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f    /* Populated o
1bac0 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73 74 49  bject for xBestI
1bad0 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  ndex */.  u16 mN
1bae0 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  oOmit,          
1baf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1bb00 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63  not omit these c
1bb10 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
1bb20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20  int *pbIn       
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
1bb50 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28  plan uses an IN(
1bb60 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ...) op */.){.  
1bb70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1bb80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1bb90 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
1bba0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1bbb0 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
1bbc0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1bbd0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1bbe0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d  _usage *pUsage =
1bbf0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
1bc00 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69  traintUsage;.  i
1bc10 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65  nt i;.  int mxTe
1bc20 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  rm;.  int rc = S
1bc30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1bc40 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42  eLoop *pNew = pB
1bc50 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1bc60 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1bc70 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1bc80 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75  ->pParse;.  stru
1bc90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1bca0 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65  *pSrc = &pBuilde
1bcb0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  r->pWInfo->pTabL
1bcc0 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
1bcd0 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  b];.  int nConst
1bce0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
1bcf0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->nConstraint;..
1bd00 20 20 61 73 73 65 72 74 28 20 28 6d 55 73 61 62    assert( (mUsab
1bd10 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d  le & mPrereq)==m
1bd20 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49  Prereq );.  *pbI
1bd30 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  n = 0;.  pNew->p
1bd40 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b  rereq = mPrereq;
1bd50 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75  ..  /* Set the u
1bd60 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68  sable flag on th
1bd70 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73  e subset of cons
1bd80 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69  traints identifi
1bd90 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75  ed by .  ** argu
1bda0 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e  ments mUsable an
1bdb0 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20  d mExclude. */. 
1bdc0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1bdd0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1bde0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1bdf0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1be00 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1be10 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1be20 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1be30 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72  +){.    WhereTer
1be40 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
1be50 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65  >a[pIdxCons->iTe
1be60 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70  rmOffset];.    p
1be70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1be80 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54  = 0;.    if( (pT
1be90 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1bea0 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65   & mUsable)==pTe
1beb0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
1bec0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1bed0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78  >eOperator & mEx
1bee0 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b  clude)==0.    ){
1bef0 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  .      pIdxCons-
1bf00 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
1bf10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
1bf20 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
1bf30 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ut fields of the
1bf40 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1bf50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f  nfo structure */
1bf60 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
1bf70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
1bf80 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69  ge[0])*nConstrai
1bf90 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nt);.  assert( p
1bfa0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1bfb0 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a  reeIdxStr==0 );.
1bfc0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
1bfd0 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
1bfe0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
1bff0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1c000 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1c010 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1c020 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
1c030 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
1c040 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49  ouble)2;.  pIdxI
1c050 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
1c060 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49  ws = 25;.  pIdxI
1c070 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20  nfo->idxFlags = 
1c080 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63  0;.  pIdxInfo->c
1c090 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65  olUsed = (sqlite
1c0a0 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f  3_int64)pSrc->co
1c0b0 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76  lUsed;..  /* Inv
1c0c0 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  oke the virtual 
1c0d0 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78  table xBestIndex
1c0e0 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72  () method */.  r
1c0f0 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
1c100 78 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e  x(pParse, pSrc->
1c110 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
1c120 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1c130 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d  rn rc;..  mxTerm
1c140 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
1c150 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
1c160 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
1c170 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1c180 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
1c190 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
1c1a0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1c1b0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
1c1c0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1c1d0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1c1e0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1c1f0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1c200 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1c210 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1c220 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1c230 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72  +){.    int iTer
1c240 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65 72  m;.    if( (iTer
1c250 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
1c260 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
1c270 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
1c280 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20  rm *pTerm;.     
1c290 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e   int j = pIdxCon
1c2a0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
1c2b0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
1c2c0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
1c2d0 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
1c2e0 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65    || j>=pWC->nTe
1c2f0 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  rm.       || pNe
1c300 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1c310 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  !=0.       || pI
1c320 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d  dxCons->usable==
1c330 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
1c340 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c350 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42  sg(pParse,"%s.xB
1c360 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63  estIndex malfunc
1c370 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62  tion",pSrc->pTab
1c380 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1c390 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
1c3a0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1c3b0 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20  IdxStr );.      
1c3c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c3d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
1c3e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1c3f0 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term==nConstrain
1c400 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  t-1 );.      tes
1c410 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
1c420 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1c430 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29  ==pWC->nTerm-1 )
1c440 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1c450 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
1c460 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
1c470 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
1c480 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
1c490 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
1c4a0 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
1c4b0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
1c4c0 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
1c4d0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54     if( iTerm>mxT
1c4e0 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69  erm ) mxTerm = i
1c4f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74  Term;.      test
1c500 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20  case( iTerm==15 
1c510 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c520 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
1c530 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c        if( iTerm<
1c540 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e  16 && pUsage[i].
1c550 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76  omit ) pNew->u.v
1c560 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20  tab.omitMask |= 
1c570 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  1<<iTerm;.      
1c580 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1c590 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
1c5a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1c5b0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
1c5c0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
1c5d0 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
1c5e0 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
1c5f0 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
1c600 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c610 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
1c620 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
1c630 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  erms.        ** 
1c640 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
1c650 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ly related to th
1c660 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75  e order of outpu
1c670 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20  t terms and.    
1c680 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
1c690 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
1c6a0 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
1c6b0 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
1c6c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67  e.        ** tog
1c6d0 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  ether.  */.     
1c6e0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
1c6f0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
1c700 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e  ;.        pIdxIn
1c710 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20  fo->idxFlags &= 
1c720 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43  ~SQLITE_INDEX_SC
1c730 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  AN_UNIQUE;.     
1c740 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73     *pbIn = 1; as
1c750 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20  sert( (mExclude 
1c760 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20  & WO_IN)==0 );. 
1c770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c780 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1c790 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f  omitMask &= ~mNo
1c7a0 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e  Omit;..  pNew->n
1c7b0 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31  LTerm = mxTerm+1
1c7c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
1c7d0 6d 78 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  mxTerm; i++){.  
1c7e0 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65    if( pNew->aLTe
1c7f0 72 6d 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  rm[i]==0 ){.    
1c800 20 20 2f 2a 20 54 68 65 20 6e 6f 6e 2d 7a 65 72    /* The non-zer
1c810 6f 20 61 72 67 76 49 64 78 20 76 61 6c 75 65 73  o argvIdx values
1c820 20 6d 75 73 74 20 62 65 20 63 6f 6e 74 69 67 75   must be contigu
1c830 6f 75 73 2e 20 20 52 61 69 73 65 20 61 6e 0a 20  ous.  Raise an. 
1c840 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66       ** error if
1c850 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 2a 2f   they are not */
1c860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1c870 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1c880 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1c890 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1c8a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1c8b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
1c8c0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
1c8d0 65 65 49 64 78 53 74 72 20 29 3b 0a 20 20 20 20  eeIdxStr );.    
1c8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c8f0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
1c900 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1c910 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
1c920 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d  LSlot );.  pNew-
1c930 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1c940 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1c950 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  m;.  pNew->u.vta
1c960 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1c970 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1c980 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49  eIdxStr;.  pIdxI
1c990 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1c9a0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65  dxStr = 0;.  pNe
1c9b0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1c9c0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1c9d0 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Str;.  pNew->u.v
1c9e0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1c9f0 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1ca00 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1ca10 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
1ca20 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1ca30 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1ca40 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e   0;.  pNew->rRun
1ca50 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1ca60 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
1ca70 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1ca80 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  st);.  pNew->nOu
1ca90 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1caa0 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
1cab0 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f  matedRows);..  /
1cac0 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1cad0 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1cae0 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1caf0 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1cb00 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1cb10 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1cb20 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1cb30 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1cb40 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  se. */.  if( pId
1cb50 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1cb60 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  & SQLITE_INDEX_S
1cb70 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  CAN_UNIQUE ){.  
1cb80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1cb90 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
1cba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1cbb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1cbc0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1cbd0 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
1cbe0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1cbf0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
1cc00 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1cc10 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
1cc20 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
1cc30 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1cc40 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1cc50 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1cc60 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1cc70 30 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d  0xffff, ("  bIn=
1cc80 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c  %d prereqIn=%04l
1cc90 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34  lx prereqOut=%04
1cca0 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1ccc0 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  bIn, (sqlite3_ui
1ccd0 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20  nt64)mPrereq,.  
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1cd00 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65  t64)(pNew->prere
1cd10 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b  q & ~mPrereq)));
1cd20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1cd30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ../*.** If this 
1cd40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1cd50 6b 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ked from within 
1cd60 61 6e 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  an xBestIndex() 
1cd70 63 61 6c 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20  callback, it.** 
1cd80 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
1cd90 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
1cda0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
1cdb0 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  e of the collati
1cdc0 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  on.** sequence a
1cdd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
1cde0 6c 65 6d 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20  lement iCons of 
1cdf0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
1ce00 78 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69  x_info.aConstrai
1ce10 6e 74 0a 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c  nt.** array. Or,
1ce20 20 69 66 20 69 43 6f 6e 73 20 69 73 20 6f 75 74   if iCons is out
1ce30 20 6f 66 20 72 61 6e 67 65 20 6f 72 20 74 68 65   of range or the
1ce40 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
1ce50 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61  xBestIndex.** ca
1ce60 6c 6c 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ll, return NULL.
1ce70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1ce80 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c  sqlite3_vtab_col
1ce90 6c 61 74 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69  lation(sqlite3_i
1cea0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
1ceb0 6e 66 6f 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b  nfo, int iCons){
1cec0 0a 20 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e  .  HiddenIndexIn
1ced0 66 6f 20 2a 70 48 69 64 64 65 6e 20 3d 20 28 48  fo *pHidden = (H
1cee0 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29  iddenIndexInfo*)
1cef0 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
1cf00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
1cf10 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e   = 0;.  if( iCon
1cf20 73 3e 3d 30 20 26 26 20 69 43 6f 6e 73 3c 70 49  s>=0 && iCons<pI
1cf30 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
1cf40 69 6e 74 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53  int ){.    CollS
1cf50 65 71 20 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20  eq *pC = 0;.    
1cf60 69 6e 74 20 69 54 65 72 6d 20 3d 20 70 49 64 78  int iTerm = pIdx
1cf70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1cf80 74 5b 69 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66  t[iCons].iTermOf
1cf90 66 73 65 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  fset;.    Expr *
1cfa0 70 58 20 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57  pX = pHidden->pW
1cfb0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
1cfc0 72 3b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  r;.    if( pX->p
1cfd0 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Left ){.      pC
1cfe0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1cff0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1d000 48 69 64 64 65 6e 2d 3e 70 50 61 72 73 65 2c 20  Hidden->pParse, 
1d010 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
1d020 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
1d030 20 20 7a 52 65 74 20 3d 20 28 70 43 20 3f 20 70    zRet = (pC ? p
1d040 43 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  C->zName : "BINA
1d050 52 59 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RY");.  }.  retu
1d060 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
1d070 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1d080 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1d090 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
1d0a0 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
1d0b0 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
1d0c0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
1d0d0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
1d0e0 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
1d0f0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
1d100 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1d110 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
1d120 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
1d130 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50  e query, both mP
1d140 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e  rereq and.** mUn
1d150 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74  usable are set t
1d160 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
1d170 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73  mPrereq is a mas
1d180 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  k of all FROM cl
1d190 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ause.** entries 
1d1a0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
1d1b0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1d1c0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
1d1d0 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a  clause and are.*
1d1e0 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  * separated from
1d1f0 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
1d200 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  one LEFT or CROS
1d210 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c  S JOIN. Similarl
1d220 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61  y, the.** mUnusa
1d230 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  ble mask contain
1d240 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
1d250 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  e entries that o
1d260 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a  ccur after the.*
1d270 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
1d280 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74 65  and are separate
1d290 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1d2a0 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1d2b0 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e  r .** CROSS JOIN
1d2c0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  . .**.** For exa
1d2d0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1d2e0 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ry were:.**.**  
1d2f0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32   ... FROM t1, t2
1d300 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74   LEFT JOIN t3, t
1d310 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e  4, vt CROSS JOIN
1d320 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74   t5, t6;.**.** t
1d330 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72  hen mPrereq corr
1d340 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20  esponds to (t1, 
1d350 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c  t2) and mUnusabl
1d360 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a  e to (t5, t6)..*
1d370 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62  *.** All the tab
1d380 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d  les in mPrereq m
1d390 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1d3a0 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
1d3b0 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61  t virtual .** ta
1d3c0 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d  ble. So any term
1d3d0 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20  s for which all 
1d3e0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1d3f0 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 0a  e satisfied by .
1d400 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62  ** mPrereq may b
1d410 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 22  e specified as "
1d420 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63  usable" in all c
1d430 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1d440 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65  ex. .** Converse
1d450 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  ly, all tables i
1d460 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74  n mUnusable must
1d470 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
1d480 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
1d490 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
1d4a0 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  so any terms for
1d4b0 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72 65   which the prere
1d4c0 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70  quisites overlap
1d4d0 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62   with.** mUnusab
1d4e0 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
1d4f0 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61   be configured a
1d500 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66  s "not-usable" f
1d510 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  or xBestIndex..*
1d520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1d530 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1d540 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1d550 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1d560 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
1d570 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1d580 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1d590 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
1d5a0 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75  * Tables that mu
1d5b0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
1d5c0 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fore this one */
1d5d0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1d5e0 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  able            
1d5f0 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1d600 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
1d610 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fter this one */
1d620 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1d630 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d640 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d650 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  e */.  WhereInfo
1d660 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
1d670 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
1d680 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
1d690 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d6b0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1d6c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1d6d0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1d6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d6f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1d700 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d710 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
1d720 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1d730 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1d740 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1d750 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20  dex_info *p;    
1d760 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
1d770 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64  pass to xBestInd
1d780 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ex() */.  int nC
1d790 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1d7a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d7b0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1d7c0 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49  in p */.  int bI
1d7d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1d7e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d7f0 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e  f plan uses IN(.
1d800 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ..) operator */.
1d810 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1d820 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65  w;.  Bitmask mBe
1d830 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1d840 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64    /* Tables used
1d850 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c   by best possibl
1d860 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
1d870 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65  mNoOmit;..  asse
1d880 72 74 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d  rt( (mPrereq & m
1d890 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a  Unusable)==0 );.
1d8a0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
1d8b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
1d8c0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1d8d0 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20  pParse;.  pWC = 
1d8e0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1d8f0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1d900 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
1d910 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1d920 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
1d930 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ];.  assert( IsV
1d940 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
1d950 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f  b) );.  p = allo
1d960 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
1d970 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73  arse, pWC, mUnus
1d980 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69  able, pSrc, pBui
1d990 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  lder->pOrderBy, 
1d9a0 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29  .      &mNoOmit)
1d9b0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1d9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1d9d0 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d  EM_BKPT;.  pNew-
1d9e0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
1d9f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1da00 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1da10 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
1da20 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
1da30 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1da40 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e   0;.  nConstrain
1da50 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  t = p->nConstrai
1da60 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
1da70 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
1da80 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  ->db, pNew, nCon
1da90 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
1daa0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1dab0 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1dac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dad0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1dae0 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c  .  /* First call
1daf0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1db00 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  th all constrain
1db10 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20  ts usable. */.  
1db20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
1db30 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64  , ("BEGIN %s.add
1db40 56 69 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53  Virtual()\n", pS
1db50 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
1db60 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
1db70 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1db80 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65  lOne: all usable
1db90 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68  \n"));.  rc = wh
1dba0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1dbb0 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1dbc0 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1dbd0 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1dbe0 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  &bIn);..  /* If 
1dbf0 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73  the call to xBes
1dc00 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1dc10 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20  l terms enabled 
1dc20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a  produced a plan.
1dc30 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1dc40 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 73  ot require any s
1dc50 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f  ource tables (IO
1dc60 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d  W: a plan with m
1dc70 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74  Best==0),.  ** t
1dc80 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
1dc90 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20  point in making 
1dca0 61 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c  any further call
1dcb0 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1dcc0 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  ) .  ** since th
1dcd0 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75  ey will all retu
1dce0 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  rn the same resu
1dcf0 6c 74 20 28 69 66 20 74 68 65 20 78 42 65 73 74  lt (if the xBest
1dd00 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70  Index().  ** imp
1dd10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73  lementation is s
1dd20 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ane). */.  if( r
1dd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dd40 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e  (mBest = (pNew->
1dd50 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1dd60 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  q))!=0 ){.    in
1dd70 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20  t seenZero = 0; 
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dd90 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69  rue if a plan wi
1dda0 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65  th no prereqs se
1ddb0 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65  en */.    int se
1ddc0 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20  enZeroNoIN = 0; 
1ddd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20          /* Plan 
1dde0 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1ddf0 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73  and no IN(...) s
1de00 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  een */.    Bitma
1de10 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20  sk mPrev = 0;.  
1de20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e    Bitmask mBestN
1de30 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oIn = 0;..    /*
1de40 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f   If the plan pro
1de50 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61 72  duced by the ear
1de60 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61  lier call uses a
1de70 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20  n IN(...) term, 
1de80 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73  call.    ** xBes
1de90 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68  tIndex again, th
1dea0 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28  is time with IN(
1deb0 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62  ...) terms disab
1dec0 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  led. */.    if( 
1ded0 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45  bIn ){.      WHE
1dee0 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1def0 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1df00 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c  l usable w/o IN\
1df10 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n"));.      rc =
1df20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1df30 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20  tualOne(.       
1df40 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72     pBuilder, mPr
1df50 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57  ereq, ALLBITS, W
1df60 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  O_IN, p, mNoOmit
1df70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61  , &bIn);.      a
1df80 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b  ssert( bIn==0 );
1df90 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e  .      mBestNoIn
1dfa0 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20   = pNew->prereq 
1dfb0 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20  & ~mPrereq;.    
1dfc0 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d    if( mBestNoIn=
1dfd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
1dfe0 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20  enZero = 1;.    
1dff0 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e      seenZeroNoIN
1e000 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1e010 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c    }..    /* Call
1e020 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65   xBestIndex once
1e030 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e   for each distin
1e040 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65  ct value of (pre
1e050 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1e060 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20  req) .    ** in 
1e070 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73  the set of terms
1e080 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74   that apply to t
1e090 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75  he current virtu
1e0a0 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
1e0b0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1e0c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e0d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74  int i;.      Bit
1e0e0 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c  mask mNext = ALL
1e0f0 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65  BITS;.      asse
1e100 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20  rt( mNext>0 );. 
1e110 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1e120 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1e130 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
1e140 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20  sk mThis = (.   
1e150 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b           pWC->a[
1e160 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
1e170 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
1e180 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1e190 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b  rereq.        );
1e1a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 68  .        if( mTh
1e1b0 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69  is>mPrev && mThi
1e1c0 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20  s<mNext ) mNext 
1e1d0 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d  = mThis;.      }
1e1e0 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d  .      mPrev = m
1e1f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Next;.      if( 
1e200 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29  mNext==ALLBITS )
1e210 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
1e220 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c  ( mNext==mBest |
1e230 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f  | mNext==mBestNo
1e240 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  In ) continue;. 
1e250 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1e260 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1e270 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c  lOne: mPrev=%04l
1e280 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c  lx mNext=%04llx\
1e290 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e2a0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1e2b0 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76  te3_uint64)mPrev
1e2c0 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1e2d0 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  4)mNext));.     
1e2e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e2f0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1e300 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1e310 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74  , mPrereq, mNext
1e320 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20  |mPrereq, 0, p, 
1e330 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1e340 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
1e350 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20  prereq==mPrereq 
1e360 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a  ){.        seenZ
1e370 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ero = 1;.       
1e380 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1e390 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1e3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e3b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c     /* If the cal
1e3c0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1e3d0 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  () in the above 
1e3e0 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e  loop did not fin
1e3f0 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  d a plan.    ** 
1e400 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f  that requires no
1e410 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61   source tables a
1e420 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20  t all (i.e. one 
1e430 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1e440 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c  .    ** usable),
1e450 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72   make a call her
1e460 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63  e with all sourc
1e470 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65  e tables disable
1e480 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  d */.    if( rc=
1e490 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65  =SQLITE_OK && se
1e4a0 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20  enZero==0 ){.   
1e4b0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e4c0 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1e4d0 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1e4e0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1e4f0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1e500 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1e510 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1e520 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20  rereq, mPrereq, 
1e530 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  0, p, mNoOmit, &
1e540 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1e550 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72  bIn==0 ) seenZer
1e560 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d  oNoIN = 1;.    }
1e570 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1e580 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1e590 64 65 78 28 29 20 68 61 76 65 20 73 6f 20 66 61  dex() have so fa
1e5a0 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64  r failed to find
1e5b0 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74   a plan.    ** t
1e5c0 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20  hat requires no 
1e5d0 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74  source tables at
1e5e0 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f   all and does no
1e5f0 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29  t use an IN(...)
1e600 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1e610 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63  , make a final c
1e620 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e  all to obtain on
1e630 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20  e here.  */.    
1e640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e650 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  K && seenZeroNoI
1e660 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48  N==0 ){.      WH
1e670 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1e680 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1e690 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  ll disabled and 
1e6a0 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20  w/o IN\n"));.   
1e6b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1e6c0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1e6d0 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1e6e0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1e6f0 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  ereq, WO_IN, p, 
1e700 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1e710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e720 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
1e730 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
1e740 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a  ree(p->idxStr);.
1e750 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1e760 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  N(pParse->db, p)
1e770 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
1e780 78 38 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61  x800, ("END %s.a
1e790 64 64 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d  ddVirtual(), rc=
1e7a0 25 64 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  %d\n", pSrc->pTa
1e7b0 62 2d 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a  b->zName, rc));.
1e7c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1e7d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e7e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e7f0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  E */../*.** Add 
1e800 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65  WhereLoop entrie
1e810 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74  s to handle OR t
1e820 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b  erms.  This work
1e830 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20  s for either.** 
1e840 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61  btrees or virtua
1e850 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
1e860 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1e870 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c  pAddOr(.  WhereL
1e880 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1e890 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b  lder, .  Bitmask
1e8a0 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74   mPrereq, .  Bit
1e8b0 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29  mask mUnusable.)
1e8c0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
1e8d0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1e8e0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
1e8f0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
1e900 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
1e910 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1e920 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
1e930 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e940 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
1e950 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
1e960 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
1e970 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
1e980 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
1e990 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73   sSum, sCur;.  s
1e9a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e9b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
1e9c0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1e9d0 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  pWC;.  pWCEnd = 
1e9e0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
1e9f0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
1ea00 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1ea10 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
1ea20 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
1ea30 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
1ea40 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
1ea50 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
1ea60 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
1ea70 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
1ea80 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
1ea90 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
1eaa0 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
1eab0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
1eac0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1ead0 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
1eae0 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
1eaf0 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
1eb00 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
1eb10 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
1eb20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
1eb30 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
1eb40 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1eb50 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
1eb60 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
1eb70 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
1eb80 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
1eb90 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1eba0 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
1ebb0 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1ebc0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
1ebd0 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
1ebe0 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
1ebf0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1ec00 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1ec10 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1ec20 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
1ec30 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ec40 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70  0x200, ("Begin p
1ec50 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
1ec60 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
1ec70 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  ));.      for(pO
1ec80 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
1ec90 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
1eca0 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
1ecb0 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
1ecc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ecd0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
1ece0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1ecf0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
1ed00 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
1ed10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ed20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1ed30 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
1ed40 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1ed50 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
1ed60 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
1ed70 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
1ed80 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
1ed90 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
1eda0 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
1edb0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
1edc0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1edd0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
1ede0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1edf0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
1ee00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ee10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1ee20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1ee30 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
1ee40 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  0;.#ifdef WHERET
1ee50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
1ee60 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ee70 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d  0x200, ("OR-term
1ee80 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64   %d of %p has %d
1ee90 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a   subterms:\n", .
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d     (int)(pOrTerm
1eec0 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72  -pOrWC->a), pTer
1eed0 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43  m, sSubBuild.pWC
1eee0 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  ->nTerm));.     
1eef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
1ef00 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30  ereTrace & 0x400
1ef10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1ef20 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
1ef30 50 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e  Print(sSubBuild.
1ef40 70 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pWC);.        }.
1ef50 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1ef60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ef70 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1ef80 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
1ef90 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
1efa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1efb0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1efc0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1efd0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1efe0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
1eff0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
1f000 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f010 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1f020 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  e(&sSubBuild, mP
1f030 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20  rereq);.        
1f040 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1f050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1f070 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53  ereLoopAddOr(&sS
1f080 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1f090 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1f0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f0b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1f0c0 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d  TE_OK || sCur.n=
1f0d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1f0e0 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20  ( sCur.n==0 ){. 
1f0f0 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
1f100 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
1f110 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1f120 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a  lse if( once ){.
1f130 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1f140 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43  rMove(&sSum, &sC
1f150 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ur);.          o
1f160 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1f170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f180 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72    WhereOrSet sPr
1f190 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ev;.          wh
1f1a0 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76  ereOrMove(&sPrev
1f1b0 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20  , &sSum);.      
1f1c0 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
1f1d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1f1e0 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b  0; i<sPrev.n; i+
1f1f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1f200 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e  for(j=0; j<sCur.
1f210 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1f220 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e         whereOrIn
1f230 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65  sert(&sSum, sPre
1f240 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20  v.a[i].prereq | 
1f250 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71  sCur.a[j].prereq
1f260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1f280 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1f290 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20  Prev.a[i].rRun, 
1f2a0 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c  sCur.a[j].rRun),
1f2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1f2d0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1f2e0 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73  rev.a[i].nOut, s
1f2f0 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b  Cur.a[j].nOut));
1f300 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f330 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
1f340 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 1;.      pNew-
1f350 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
1f360 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rm;.      pNew->
1f370 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1f380 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
1f390 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1f3a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  ;.      pNew->iS
1f3b0 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
1f3c0 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e    memset(&pNew->
1f3d0 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65  u, 0, sizeof(pNe
1f3e0 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f  w->u));.      fo
1f3f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1f400 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e  E_OK && i<sSum.n
1f410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f420 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65  /* TUNING: Curre
1f430 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  ntly sSum.a[i].r
1f440 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  Run is set to th
1f450 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73  e sum of the cos
1f460 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ts.        ** of
1f470 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72   all sub-scans r
1f480 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
1f490 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c  R-scan. However,
1f4a0 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67   due to rounding
1f4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
1f4c0 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68  rs, it may be th
1f4d0 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  at the cost of t
1f4e0 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71  he OR-scan is eq
1f4f0 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20  ual to its.     
1f500 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e     ** most expen
1f510 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41  sive sub-scan. A
1f520 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  dd the smallest 
1f530 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79  possible penalty
1f540 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71   .        ** (eq
1f550 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74  uivalent to mult
1f560 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74  iplying the cost
1f570 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73   by 1.07) to ens
1f580 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20  ure that .      
1f590 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e    ** this does n
1f5a0 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72  ot happen. Other
1f5b0 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20  wise, for WHERE 
1f5c0 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20  clauses such as 
1f5d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  the.        ** f
1f5e0 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74  ollowing where t
1f5f0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1f600 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20   on "y":.       
1f610 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
1f620 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68     WHERE likelih
1f630 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f  ood(x=?, 0.99) O
1f640 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a  R y=?.        **
1f650 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1f660 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63  planner may elec
1f670 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68  t to "OR" togeth
1f680 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  er a full-table 
1f690 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20  scan and an.    
1f6a0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f      ** index loo
1f6b0 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73  kup. And other s
1f6c0 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73  imilarly odd res
1f6d0 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ults.  */.      
1f6e0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
1f6f0 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20  Sum.a[i].rRun + 
1f700 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
1f710 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69  >nOut = sSum.a[i
1f720 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ].nOut;.        
1f730 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73  pNew->prereq = s
1f740 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b  Sum.a[i].prereq;
1f750 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1f760 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1f770 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1f780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
1f790 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1f7a0 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20  "End processing 
1f7b0 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1f7c0 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a   pTerm));.    }.
1f7d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
1f7f0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
1f800 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
1f810 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
1f820 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
1f830 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
1f840 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
1f850 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1f860 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1f870 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
1f880 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20   mPrereq = 0;.  
1f890 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d  Bitmask mPrior =
1f8a0 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
1f8b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1f8c0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
1f8d0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1f8e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f8f0 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53  Item;.  struct S
1f900 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e  rcList_item *pEn
1f910 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  d = &pTabList->a
1f920 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d  [pWInfo->nLevel]
1f930 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1f940 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1f950 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
1f960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
1f970 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1f980 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70   u8 priorJointyp
1f990 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  e = 0;..  /* Loo
1f9a0 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65  p over the table
1f9b0 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66  s in the join, f
1f9c0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1f9d0 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42  t */.  pNew = pB
1f9e0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1f9f0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e  whereLoopInit(pN
1fa00 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d  ew);.  for(iTab=
1fa10 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73  0, pItem=pTabLis
1fa20 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64  t->a; pItem<pEnd
1fa30 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b  ; iTab++, pItem+
1fa40 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
1fa50 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  mUnusable = 0;. 
1fa60 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
1fa70 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
1fa80 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
1fa90 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
1faa0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
1fab0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
1fac0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
1fad0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c  em->fg.jointype|
1fae0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26  priorJointype) &
1faf0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1fb00 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
1fb10 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69   /* This conditi
1fb20 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  on is true when 
1fb30 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f  pItem is the FRO
1fb40 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e  M clause term on
1fb50 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69   the.      ** ri
1fb60 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  ght-hand-side of
1fb70 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53   a LEFT or CROSS
1fb80 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20   JOIN.  */.     
1fb90 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f   mPrereq = mPrio
1fba0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
1fbb0 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74  orJointype = pIt
1fbc0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
1fbd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fbe0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1fbf0 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
1fc00 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1fc10 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
1fc20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1fc30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70  ;.      for(p=&p
1fc40 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b  Item[1]; p<pEnd;
1fc50 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   p++){.        i
1fc60 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20  f( mUnusable || 
1fc70 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  (p->fg.jointype 
1fc80 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
1fc90 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20  OSS)) ){.       
1fca0 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20     mUnusable |= 
1fcb0 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1fcc0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1fcd0 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f  skSet, p->iCurso
1fce0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1fcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1fd00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1fd10 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
1fd20 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1fd30 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  e);.    }else.#e
1fd40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1fd50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1fd60 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
1fd70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1fd80 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
1fd90 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d   mPrereq);.    }
1fda0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fdb0 49 54 45 5f 4f 4b 20 26 26 20 70 42 75 69 6c 64  ITE_OK && pBuild
1fdc0 65 72 2d 3e 70 57 43 2d 3e 68 61 73 4f 72 20 29  er->pWC->hasOr )
1fdd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1fde0 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1fdf0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1fe00 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1fe10 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1fe20 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1fe30 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1fe40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1fe50 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1fe60 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1fe70 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1fe80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1fe90 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1fea0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1feb0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1fec0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1fed0 68 65 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 6th.** parame
1fee0 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1fef0 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1ff00 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1ff10 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1ff20 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1ff30 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1ff40 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1ff50 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1ff60 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1ff70 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1ff80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ff90 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1ffa0 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1ffb0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1ffc0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1ffd0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1ffe0 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1fff0 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
20000 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
20010 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
20020 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
20030 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
20040 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
20050 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
20060 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
20070 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
20080 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
20090 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
200a0 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
200b0 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
200c0 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
200d0 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
200e0 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
200f0 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
20100 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
20110 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
20120 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
20130 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
20140 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
20150 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
20160 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
20170 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
20180 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
20190 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
201a0 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
201b0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
201c0 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
201d0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
201e0 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
201f0 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
20200 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
20210 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
20220 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
20230 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
20240 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
20250 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
20260 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
20270 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
20280 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
20290 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
202a0 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
202b0 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
202c0 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
202d0 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
202e0 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
202f0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
20300 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
20310 20 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55     /* WHERE_GROU
20320 50 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54  PBY or _DISTINCT
20330 42 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c  BY or _ORDERBY_L
20340 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  IMIT */.  u16 nL
20350 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
20360 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
20370 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
20380 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
20390 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
203a0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
203b0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
203c0 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
203d0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
203e0 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
203f0 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
20400 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
20410 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
20420 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
20430 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
20440 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
20450 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
20460 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
20470 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
20480 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
20490 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
204a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
204b0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
204c0 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
204d0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
204e0 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
204f0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20500 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
20510 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
20520 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
20530 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
20540 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
20550 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
20560 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
20570 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
20580 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
20590 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
205a0 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20   eqOpMask;      
205b0 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71     /* Allowed eq
205c0 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73  uality operators
205d0 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
205e0 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
205f0 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
20600 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
20610 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
20620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
20630 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
20640 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
20650 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
20660 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
20670 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
20680 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
20690 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
206a0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
206b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
206c0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
206d0 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
206e0 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
206f0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
20700 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20710 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20730 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
20740 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
20750 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
20760 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
20770 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
20780 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
20790 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
207a0 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
207b0 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
207c0 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
207d0 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
207e0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
207f0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
20800 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
20810 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
20820 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
20830 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
20840 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
20850 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
20860 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
20870 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
20880 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
20890 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
208a0 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
208b0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
208c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
208d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
208e0 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
208f0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
20900 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
20910 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20920 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
20930 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
20940 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
20950 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
20960 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
20970 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
20980 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
20990 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
209a0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
209b0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
209c0 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
209d0 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
209e0 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
209f0 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
20a00 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20a10 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
20a20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
20a30 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
20a40 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
20a50 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
20a60 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
20a70 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
20a80 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
20a90 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
20aa0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
20ab0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
20ac0 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
20ad0 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
20ae0 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
20af0 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
20b00 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
20b10 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
20b20 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
20b30 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
20b40 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
20b50 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
20b60 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
20b70 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
20b80 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
20b90 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
20ba0 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
20bb0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
20bc0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
20bd0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
20be0 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
20bf0 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
20c00 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
20c10 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
20c20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
20c30 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
20c40 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
20c50 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
20c60 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
20c70 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
20c80 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
20c90 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
20ca0 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
20cb0 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
20cc0 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
20cd0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
20ce0 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
20cf0 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
20d00 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
20d10 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
20d20 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
20d30 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
20d40 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
20d50 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
20d60 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
20d70 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
20d80 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
20d90 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
20da0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
20db0 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
20dc0 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
20dd0 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
20de0 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
20df0 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
20e00 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
20e10 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
20e20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
20e30 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
20e40 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
20e50 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
20e60 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
20e70 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
20e80 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
20e90 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
20ea0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
20eb0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
20ec0 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
20ed0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
20ee0 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
20ef0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
20f00 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
20f10 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
20f20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
20f30 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
20f40 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
20f50 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
20f60 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
20f70 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
20f80 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
20f90 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
20fa0 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
20fb0 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
20fc0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
20fd0 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
20fe0 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
20ff0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
21000 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
21010 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20  = 0;.  eqOpMask 
21020 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20  = WO_EQ | WO_IS 
21030 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69  | WO_ISNULL;.  i
21040 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
21050 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
21060 4d 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c  MIT ) eqOpMask |
21070 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69  = WO_IN;.  for(i
21080 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
21090 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
210a0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
210b0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
210c0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
210d0 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
210e0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
210f0 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f     if( iLoop<nLo
21100 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  op ){.      pLoo
21110 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p = pPath->aLoop
21120 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69  [iLoop];.      i
21130 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
21140 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
21150 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  MIT ) continue;.
21160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21170 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a   pLoop = pLast;.
21180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
21190 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
211a0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
211b0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
211c0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
211d0 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
211e0 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
211f0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
21200 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
21210 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20  btree.nIdxCol = 
21220 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75  0;.    }.    iCu
21230 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
21240 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
21250 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20  Tab].iCursor;.. 
21260 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
21270 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ny ORDER BY term
21280 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c   X that is a col
21290 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
212a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
212b0 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20  urrent loop for 
212c0 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74  which there is t
212d0 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
212e0 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f  .    ** clause o
212f0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20  f the form X IS 
21300 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74  NULL or X=? that
21310 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
21320 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  outer.    ** loo
21330 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ps..    */.    f
21340 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
21350 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
21360 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
21370 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
21380 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72  e;.      pOBExpr
21390 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
213a0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
213b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
213c0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
213d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
213e0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
213f0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
21400 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
21410 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21420 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
21430 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57  hereFindTerm(&pW
21440 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c  Info->sWC, iCur,
21450 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
21460 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
21470 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79            ~ready
21480 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a  , eqOpMask, 0);.
21490 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
214a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
214b0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
214c0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
214d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
214e0 4e 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79  N terms are only
214f0 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69   valid for sorti
21500 6e 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ng in the ORDER 
21510 42 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20  BY LIMIT .      
21520 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
21530 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79  n, and then only
21540 20 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74   if they are act
21550 75 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20  ually used.     
21560 20 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65     ** by the que
21570 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20  ry plan */.     
21580 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
21590 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
215a0 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20  DERBY_LIMIT );. 
215b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
215c0 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  j<pLoop->nLTerm 
215d0 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d  && pTerm!=pLoop-
215e0 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29  >aLTerm[j]; j++)
215f0 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  {}.        if( j
21600 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  >=pLoop->nLTerm 
21610 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21620 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
21630 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
21640 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d  (WO_EQ|WO_IS))!=
21650 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
21660 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
21670 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21680 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 28  xprCollSeqMatch(
21690 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
216a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
216b0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
216c0 5d 2e 70 45 78 70 72 2c 20 70 54 65 72 6d 2d 3e  ].pExpr, pTerm->
216d0 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pExpr)==0 ){.   
216e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
216f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21700 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
21710 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
21720 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a  K_IS );.      }.
21730 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
21740 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
21750 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
21760 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21770 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
21780 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
21790 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
217a0 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
217b0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
217c0 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
217d0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
217e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
217f0 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
21800 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
21810 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
21820 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
21830 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21840 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
21850 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
21860 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
21870 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
21880 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
21890 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
218a0 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
218b0 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
218c0 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
218d0 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
218e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
218f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
21900 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44  umn-1]==XN_ROWID
21910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21920 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48             || !H
21930 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
21940 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
21950 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
21960 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65  t = IsUniqueInde
21970 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  x(pIndex);.     
21980 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
21990 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
219a0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
219b0 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
219c0 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
219d0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
219e0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
219f0 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
21a00 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
21a10 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
21a20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
21a30 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
21a40 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
21a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
21a60 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72  bOnce = 1; /* Tr
21a70 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
21a80 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
21a90 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61  op */..        a
21aa0 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d  ssert( j>=pLoop-
21ab0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20  >u.btree.nEq .  
21ac0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
21ad0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d  oop->aLTerm[j]==
21ae0 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53  0)==(j<pLoop->nS
21af0 6b 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  kip).        );.
21b00 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c          if( j<pL
21b10 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
21b20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53   && j>=pLoop->nS
21b30 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
21b40 20 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70   u16 eOp = pLoop
21b50 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
21b60 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20  erator;..       
21b70 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
21b80 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53  == and IS and IS
21b90 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c  NULL terms.  (Al
21ba0 73 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73  so skip IN terms
21bb0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   when.          
21bc0 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f  ** doing WHERE_O
21bd0 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f  RDERBY_LIMIT pro
21be0 63 65 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20  cessing). .     
21bf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
21c00 20 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72    ** If the curr
21c10 65 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f  ent term is a co
21c20 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f  lumn of an ((?,?
21c30 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29  ) IN (SELECT...)
21c40 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
21c50 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77  expression for w
21c60 68 69 63 68 20 74 68 65 20 53 45 4c 45 43 54 20  hich the SELECT 
21c70 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
21c80 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20  n one column,.  
21c90 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b          ** check
21ca0 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
21cb0 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64  only column used
21cc0 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f   by this loop. O
21cd0 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
21ce0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20      ** if it is 
21cf0 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  one of two or mo
21d00 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  re, none of the 
21d10 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20  columns can be. 
21d20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
21d30 69 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20  idered to match 
21d40 61 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  an ORDER BY term
21d50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
21d60 69 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d  if( (eOp & eqOpM
21d70 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
21d80 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
21d90 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
21da0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21db0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
21dc0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
21dd0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
21de0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
21df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21e00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
21e10 20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73   .          }els
21e20 65 20 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70  e if( ALWAYS(eOp
21e30 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20   & WO_IN) ){.   
21e40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41           /* ALWA
21e50 59 53 28 29 20 6a 75 73 74 69 66 69 63 61 74 69  YS() justificati
21e60 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71  on: eOp is an eq
21e70 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20  uality operator 
21e80 64 75 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20  due to the.     
21e90 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f         ** j<pLoo
21ea0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63  p->u.btree.nEq c
21eb0 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e  onstraint above.
21ec0 20 20 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f    Any equality o
21ed0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
21ee0 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69   ** than WO_IN i
21ef0 73 20 63 61 70 74 75 72 65 64 20 62 79 20 74 68  s captured by th
21f00 65 20 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e  e previous "if".
21f10 20 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20    So this one.  
21f20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
21f30 61 79 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f  ays has to be WO
21f40 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  _IN. */.        
21f50 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
21f60 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
21f70 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
21f80 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69      for(i=j+1; i
21f90 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
21fa0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nEq; i++){.     
21fb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f           if( pLo
21fc0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
21fd0 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20  Expr==pX ){.    
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21ff0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt( (pLoop->aLTe
22000 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[i]->eOperator
22010 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20   & WO_IN) );.   
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e               bOn
22030 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
22040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22060 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22080 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
22090 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
220a0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
220b0 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
220c0 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
220d0 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
220e0 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
220f0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
22100 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22110 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29      if( pIndex )
22120 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
22130 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
22140 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
22150 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49       revIdx = pI
22160 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
22170 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
22180 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  f( iColumn==pInd
22190 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ex->pTable->iPKe
221a0 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e  y ) iColumn = XN
221b0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
221c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
221d0 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
221e0 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
221f0 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
22200 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
22210 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
22220 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
22230 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
22240 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
22250 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
22260 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
22270 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
22280 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
22290 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
222a0 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
222b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
222c0 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
222d0 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
222e0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
222f0 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
22300 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
22310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
22320 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
22330 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
22340 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
22350 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
22360 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
22370 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
22380 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
22390 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
223a0 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
223b0 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
223c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
223d0 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
223e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
223f0 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
22400 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
22410 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
22420 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
22430 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22440 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
22450 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
22460 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
22470 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
22480 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
22490 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
224a0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
224b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
224c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
224d0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
224e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
224f0 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
22500 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
22510 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
22520 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
22530 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
22540 75 6d 6e 3e 3d 58 4e 5f 52 4f 57 49 44 20 29 7b  umn>=XN_ROWID ){
22550 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22560 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
22570 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
22580 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
22590 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
225a0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
225b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
225c0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
225d0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
225e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
225f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22600 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
22610 49 64 78 45 78 70 72 20 3d 20 70 49 6e 64 65 78  IdxExpr = pIndex
22620 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
22630 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22640 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
22650 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70  xprCompareSkip(p
22660 4f 42 45 78 70 72 2c 20 70 49 64 78 45 78 70 72  OBExpr, pIdxExpr
22670 2c 20 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20  , iCur) ){.     
22680 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22690 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
226a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
226b0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
226c0 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn!=XN_ROWID ){.
226d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
226e0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
226f0 4e 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  NCollSeq(pWInfo-
22700 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
22710 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
22720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22730 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
22740 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
22750 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
22760 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22780 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
22790 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b  ree.nIdxCol = j+
227a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d  1;.          isM
227b0 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
227c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
227d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
227e0 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
227f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22800 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
22810 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
22820 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
22830 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
22840 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
22850 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
22860 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
22870 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
22880 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
22890 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
228a0 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
228b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
228c0 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
228d0 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
228e0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
228f0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
22900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22910 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
22920 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
22930 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
22940 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22950 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
22960 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
22970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
22980 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
22990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
229a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
229b0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
229c0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
229d0 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
229e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
229f0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
22a00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
22a10 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
22a20 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
22a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
22a40 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
22a50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
22a60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
22a70 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
22a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
22a90 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c  ==0 || j<nKeyCol
22aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22ab0 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
22ac0 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
22ae0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
22af0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22b00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
22b20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
22b30 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
22b40 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
22b50 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
22b60 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
22b70 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
22b80 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
22b90 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
22ba0 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
22bb0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
22bc0 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
22bd0 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
22be0 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
22bf0 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
22c00 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
22c10 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
22c20 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
22c30 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
22c40 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
22c50 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
22c60 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
22c70 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
22c80 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
22c90 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b    Bitmask mTerm;
22ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
22cb0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
22cc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22cd0 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
22ce0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
22cf0 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71        mTerm = sq
22d00 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
22d10 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
22d20 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20  skSet,p);.      
22d30 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26    if( mTerm==0 &
22d40 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
22d50 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f  Constant(p) ) co
22d60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22d70 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65  if( (mTerm&~orde
22d80 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
22d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
22da0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
22db0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
22dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
22dd0 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
22de0 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
22df0 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
22e00 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
22e10 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
22e20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
22e30 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65  return (i8)nOrde
22e40 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  rBy;.  if( !isOr
22e50 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
22e60 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42     for(i=nOrderB
22e70 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  y-1; i>0; i--){.
22e80 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
22e90 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31  = MASKBIT(i) - 1
22ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53  ;.      if( (obS
22eb0 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72  at&m)==m ) retur
22ec0 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n i;.    }.    r
22ed0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
22ee0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  eturn -1;.}.../*
22ef0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
22f00 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
22f10 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b   set in the mask
22f20 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
22f30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a  e3WhereBegin(),.
22f40 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61  ** the planner a
22f50 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
22f60 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72  specified pOrder
22f70 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61  By list is actua
22f80 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42  lly a GROUP.** B
22f90 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73  Y clause - and s
22fa0 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74  o any order that
22fb0 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20   groups rows as 
22fc0 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69  required satisfi
22fd0 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  es the.** reques
22fe0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  t..**.** Normall
22ff0 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  y, in this case 
23000 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
23010 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65  le for the calle
23020 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  r to determine.*
23030 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
23040 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65   the rows are re
23050 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76  ally being deliv
23060 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f  ered in sorted o
23070 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74  rder, or.** just
23080 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   in some other o
23090 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64  rder that provid
230a0 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
230b0 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65  grouping. Howeve
230c0 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  r,.** if the WHE
230d0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66  RE_SORTBYGROUP f
230e0 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73  lag is also pass
230f0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
23100 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a  reBegin(), then.
23110 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
23120 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f   may be called o
23130 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  n the returned W
23140 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  hereInfo object.
23150 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
23160 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20  rue if the rows 
23170 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73  really will be s
23180 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65  orted in the spe
23190 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72  cified order, or
231a0 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77   false.** otherw
231b0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ise..**.** For e
231c0 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
231d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
231e0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
231f0 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  x, Y);.**.** the
23200 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  n.**.**   SELECT
23210 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
23220 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59   BY x,y ORDER BY
23230 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72   x,y;   -- IsSor
23240 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45  ted()==1.**   SE
23250 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
23260 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45  ROUP BY y,x ORDE
23270 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49  R BY y,x;   -- I
23280 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a  sSorted()==0.*/.
23290 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
232a0 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e  IsSorted(WhereIn
232b0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61  fo *pWInfo){.  a
232c0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
232d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
232e0 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61  E_GROUPBY );.  a
232f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
23300 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23310 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b  E_SORTBYGROUP );
23320 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
23330 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66  ->sorted;.}..#if
23340 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
23350 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
23360 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
23370 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
23380 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
23390 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
233a0 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
233b0 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
233c0 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
233d0 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
233e0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
233f0 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
23400 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
23410 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
23420 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
23430 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
23440 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
23450 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
23460 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
23470 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
23480 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  rn the cost of s
23490 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73  orting nRow rows
234a0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
234b0 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a  the keys have .*
234c0 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d  * nOrderby colum
234d0 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ns and that the 
234e0 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f  first nSorted co
234f0 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64  lumns are alread
23500 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a  y in.** order..*
23510 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
23520 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
23530 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
23540 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20  WInfo,.  LogEst 
23550 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64  nRow,.  int nOrd
23560 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72  erBy,.  int nSor
23570 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49  ted.){.  /* TUNI
23580 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
23590 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74  st of a full ext
235a0 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72  ernal sort, wher
235b0 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65  e N is .  ** the
235c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
235d0 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a  to sort is:.  **
235e0 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
235f0 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
23600 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72  )..  ** .  ** Or
23610 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62  , if the order-b
23620 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74  y clause has X t
23630 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68  erms but only th
23640 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74  e last Y .  ** t
23650 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20  erms are out of 
23660 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63  order, then bloc
23670 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72  k-sorting will r
23680 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20  educe the .  ** 
23690 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a  sorting cost to:
236a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
236b0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
236c0 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20  og(N)) * (Y/X). 
236d0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f   **.  ** The (Y/
236e0 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65  X) term is imple
236f0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61  mented using sta
23700 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61  ck variable rSca
23710 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20  le.  ** below.  
23720 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61  */.  LogEst rSca
23730 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20  le, rSortCost;. 
23740 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
23750 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74  y>0 && 66==sqlit
23760 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
23770 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69  .  rScale = sqli
23780 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65  te3LogEst((nOrde
23790 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30  rBy-nSorted)*100
237a0 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b  /nOrderBy) - 66;
237b0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e  .  rSortCost = n
237c0 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  Row + rScale + 1
237d0 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c  6;..  /* Multipl
237e0 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72  e by log(M) wher
237f0 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e M is the numbe
23800 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
23810 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c  ..  ** Use the L
23820 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74  IMIT for M if it
23830 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   is smaller */. 
23840 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
23850 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23860 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26  _USE_LIMIT)!=0 &
23870 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  & pWInfo->iLimit
23880 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f  <nRow ){.    nRo
23890 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d  w = pWInfo->iLim
238a0 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43  it;.  }.  rSortC
238b0 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52  ost += estLog(nR
238c0 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53  ow);.  return rS
238d0 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
238e0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
238f0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
23900 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
23910 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
23920 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
23930 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
23940 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
23950 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
23960 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
23970 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
23980 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
23990 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
239a0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
239b0 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
239c0 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
239d0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
239e0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
239f0 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
23a00 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
23a10 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
23a20 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
23a30 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
23a40 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
23a50 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
23a60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
23a70 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23a80 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
23a90 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
23aa0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
23ab0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
23ac0 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
23ad0 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
23ae0 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
23af0 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
23b00 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
23b10 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23b20 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
23b30 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
23b40 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
23b50 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
23b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23b70 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
23b80 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
23b90 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
23ba0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23bb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
23bc0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23bd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23be0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23bf0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23c20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
23c30 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
23c40 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
23c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23c60 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
23c70 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
23c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
23c90 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
23ca0 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
23cb0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
23cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23cd0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
23ce0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
23cf0 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
23d00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23d10 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
23d20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
23d30 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
23d40 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
23d50 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
23d60 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
23d70 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
23d80 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
23d90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23da0 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
23db0 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
23dc0 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
23dd0 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
23de0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
23df0 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
23e00 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
23e10 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
23e20 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
23e30 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
23e40 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
23e50 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
23e60 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
23e70 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
23e80 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
23e90 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
23ea0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
23eb0 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
23ec0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
23ed0 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
23ee0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
23ef0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
23f00 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
23f10 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
23f20 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
23f30 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
23f40 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
23f50 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
23f60 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
23f70 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
23f80 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
23f90 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
23fa0 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
23fb0 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
23fc0 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
23fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
23fe0 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
23ff0 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
24000 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
24010 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
24020 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
24030 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
24040 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
24050 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
24060 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
24070 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
24080 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
24090 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
240a0 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
240b0 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
240c0 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
240d0 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
240e0 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
240f0 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
24100 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
24110 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
24120 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
24130 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
24140 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
24150 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
24160 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
24170 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
24180 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
24190 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
241a0 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
241b0 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
241c0 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
241d0 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
241e0 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
241f0 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
24200 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
24210 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
24220 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
24230 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
24240 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
24250 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
24260 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
24270 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
24280 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
24290 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
242a0 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
242b0 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
242c0 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
242d0 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
242e0 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
242f0 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
24300 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
24310 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
24320 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
24330 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
24340 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
24350 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
24360 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
24370 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
24380 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
24390 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
243a0 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
243b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
243c0 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
243d0 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
243e0 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
243f0 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
24400 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
24410 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
24420 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
24430 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
24440 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
24450 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
24460 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
24470 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
24480 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
24490 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
244a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
244b0 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57  BKPT;.  aTo = (W
244c0 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
244d0 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
244e0 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
244f0 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
24500 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
24510 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
24520 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
24530 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
24540 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
24550 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
24560 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
24570 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
24580 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
24590 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
245a0 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
245b0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
245c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
245d0 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
245e0 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
245f0 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
24600 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
24610 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
24620 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
24630 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
24640 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
24650 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
24660 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
24670 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
24680 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
24690 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
246a0 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
246b0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
246c0 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
246d0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
246e0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
246f0 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
24700 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
24710 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
24720 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
24730 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
24740 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
24750 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
24760 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
24770 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
24780 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
24790 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
247a0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
247b0 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
247c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
247d0 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
247e0 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
247f0 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
24800 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
24810 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
24820 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
24830 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
24840 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
24850 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
24860 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
24870 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
24880 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
24890 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
248a0 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
248b0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
248c0 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
248d0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
248e0 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
248f0 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
24900 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
24910 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
24920 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
24930 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
24940 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
24950 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
24960 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
24970 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
24980 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
24990 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
249a0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
249b0 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
249c0 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
249d0 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
249e0 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
249f0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
24a00 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
24a10 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
24a20 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
24a30 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
24a40 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
24a50 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
24a60 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
24a70 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
24a80 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
24a90 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
24aa0 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
24ab0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
24ac0 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
24ad0 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
24ae0 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
24af0 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
24b00 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
24b10 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
24b20 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
24b30 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
24b40 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
24b50 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
24b60 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
24b70 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
24b80 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
24b90 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
24ba0 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
24bb0 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
24bc0 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
24bd0 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
24be0 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
24bf0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
24c00 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
24c10 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
24c20 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
24c30 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
24c40 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
24c50 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
24c60 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
24c70 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
24c80 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
24c90 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
24ca0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
24cb0 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
24cc0 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
24cd0 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
24ce0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
24cf0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
24d00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24d10 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
24d20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
24d30 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
24d40 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
24d50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24d60 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
24d70 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
24d80 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
24d90 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
24da0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
24db0 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
24dc0 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
24dd0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
24de0 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
24df0 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
24e00 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
24e10 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
24e20 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
24e30 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
24e60 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
24e70 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
24e80 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
24e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
24ea0 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
24eb0 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
24ec0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
24ed0 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
24ee0 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
24ef0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
24f00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
24f10 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
24f20 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
24f30 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
24f40 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
24f50 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
24f60 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
24f70 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d  EX)!=0 && pFrom-
24f80 3e 6e 52 6f 77 3c 33 20 29 7b 0a 20 20 20 20 20  >nRow<3 ){.     
24f90 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75       /* Do not u
24fa0 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  se an automatic 
24fb0 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68 69  index if the thi
24fc0 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74  s loop is expect
24fd0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
24fe0 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e  to run less than
24ff0 20 31 2e 32 35 20 74 69 6d 65 73 2e 20 20 49 74   1.25 times.  It
25000 20 69 73 20 74 65 6d 70 74 69 6e 67 20 74 6f 20   is tempting to 
25010 61 6c 73 6f 20 65 78 63 6c 75 64 65 0a 20 20 20  also exclude.   
25020 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
25030 74 69 63 20 69 6e 64 65 78 20 75 73 61 67 65 20  tic index usage 
25040 6f 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  on an outer loop
25050 2c 20 62 75 74 20 73 6f 6d 65 74 69 6d 65 73 20  , but sometimes 
25060 61 6e 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20  an automatic.   
25070 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
25080 69 73 20 75 73 65 66 75 6c 20 69 6e 20 74 68 65  is useful in the
25090 20 6f 75 74 65 72 20 6c 6f 6f 70 20 6f 66 20 61   outer loop of a
250a0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
250b0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
250c0 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
250d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
250e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
250f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
25100 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ..        /* At 
25110 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
25120 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
25130 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
25140 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
25150 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
25160 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
25170 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74  Unsorted = sqlit
25180 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f  e3LogEstAdd(pWLo
25190 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
251a0 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
251b0 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
251c0 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
251d0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
251e0 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72  sorted, pFrom->r
251f0 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20  Unsorted);.     
25200 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
25210 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
25220 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
25230 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
25240 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
25250 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
25260 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
25270 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d<0 ){.         
25280 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65   isOrdered = whe
25290 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
252a0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
252d0 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
252e0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
252f0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
25300 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
25310 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
25320 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  k);.        }els
25330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
25340 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
25350 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
25360 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
25370 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f  rdered>=0 && isO
25380 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20  rdered<nOrderBy 
25390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
253a0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
253b0 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ered]==0 ){.    
253c0 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
253d0 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77  t[isOrdered] = w
253e0 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
253f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25400 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74   pWInfo, nRowEst
25410 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72  , nOrderBy, isOr
25420 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20  dered.          
25430 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
25440 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
25450 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25460 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61  Add(rUnsorted, a
25470 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
25480 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ed]);..         
25490 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
254a0 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
254b0 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73   ("---- sort cos
254c0 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69  t=%-3d (%d/%d) i
254d0 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33  ncreases cost %3
254e0 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20  d to %-3d\n",.  
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f               aSo
25500 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
25510 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f  ], (nOrderBy-isO
25520 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42  rdered), nOrderB
25530 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  y, .            
25540 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43     rUnsorted, rC
25550 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ost));.        }
25560 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25570 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65  rCost = rUnsorte
25580 64 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55 6e  d;.          rUn
25590 73 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f 2a  sorted -= 2;  /*
255a0 20 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68 74   TUNING:  Slight
255b0 20 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20 6f   bias in favor o
255c0 66 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73 20  f no-sort plans 
255d0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  */.        }..  
255e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
255f0 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20  o see if pWLoop 
25600 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20  should be added 
25610 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20  to the set of.  
25620 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63        ** mxChoic
25630 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  e best-so-far pa
25640 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ths..        **.
25650 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74          ** First
25660 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   look for an exi
25670 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67  sting path among
25680 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
25690 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  hs.        ** th
256a0 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61  at covers the sa
256b0 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
256c0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
256d0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
256e0 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73     ** setting as
256f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74   the current pat
25700 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20  h candidate..   
25710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25720 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70  ** The term "((p
25730 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
25740 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d  Ordered)&0x80)==
25750 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  0" is equivalent
25760 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28  .        ** to (
25770 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  pTo->isOrdered==
25780 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65  (-1))==(isOrdere
25790 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68  d==(-1))" for th
257a0 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  e range.        
257b0 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75  ** of legal valu
257c0 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64  es for isOrdered
257d0 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20  , -1..64..      
257e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
257f0 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (jj=0, pTo=aTo; 
25800 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54  jj<nTo; jj++, pT
25810 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
25820 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f  if( pTo->maskLoo
25830 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20  p==maskNew.     
25840 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e        && ((pTo->
25850 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
25860 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20  red)&0x80)==0.  
25870 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25880 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25890 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
258a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
258b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
258c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
258d0 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
258e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20          /* None 
258f0 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
25900 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
25910 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64  s match the cand
25920 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  idate. */.      
25930 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
25940 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
25950 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73   && (rCost>mxCos
25960 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43  t || (rCost==mxC
25970 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64  ost && rUnsorted
25980 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20  >=mxUnsorted)). 
25990 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
259a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
259b0 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65  urrent candidate
259c0 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68   is no better th
259d0 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78  an any of the mx
259e0 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
259f0 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72     ** paths curr
25a00 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73  ently in the bes
25a10 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e  t-so-far buffer.
25a20 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20    So discard.   
25a30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
25a40 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f   candidate as no
25a50 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66  t viable. */.#if
25a60 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
25a70 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
25a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25a90 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
25aa0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
25ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25ac0 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
25ad0 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
25ae0 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  %3d,%3d order=%c
25af0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
25b00 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
25b10 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
25b20 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
25b30 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
25b40 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
25b50 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
25b60 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
25b70 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25b80 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
25b90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
25ba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
25bb0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  }.          /* I
25bc0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
25bd0 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20  points it means 
25be0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e  that the new can
25bf0 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20  didate path.    
25c00 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74        ** needs t
25c10 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
25c20 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f  e set of best-so
25c30 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20  -far paths. */. 
25c40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
25c50 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
25c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
25c70 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
25c80 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
25c90 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
25ca0 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
25cb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25cd0 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
25ce0 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
25cf0 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
25d00 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
25d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
25d20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20  = mxI;.         
25d30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
25d40 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
25d50 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
25d60 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
25d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
25d80 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25d90 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
25da0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25db0 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
25dc0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
25dd0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
25de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25df0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
25e00 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
25e10 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
25e20 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20  t, rUnsorted,.  
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25e40 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
25e50 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
25e70 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
25e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25e90 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
25ea0 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73  s here if best-s
25eb0 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61  o-far path pTo=a
25ec0 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68  To[jj] covers th
25ed0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
25ee0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
25ef0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
25f00 65 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74  e isOrdered sett
25f10 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20  ing as the.     
25f20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74       ** candidat
25f30 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74  e path.  Check t
25f40 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e  o see if the can
25f50 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65  didate should re
25f60 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20  place.          
25f70 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65  ** pTo or if the
25f80 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
25f90 64 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  d be skipped..  
25fa0 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
25fb0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6e        ** The con
25fc0 64 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20 65  ditional is an e
25fd0 78 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20 63  xpanded vector c
25fe0 6f 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76 61  omparison equiva
25ff0 6c 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20 20  lent to:.       
26000 20 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72 43     **   (pTo->rC
26010 6f 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70 54  ost,pTo->nRow,pT
26020 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c 3d  o->rUnsorted) <=
26030 20 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55 6e   (rCost,nOut,rUn
26040 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20  sorted).        
26050 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
26060 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43  f( pTo->rCost<rC
26070 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
26080 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
26090 72 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20  rCost.          
260a0 20 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e 52       && (pTo->nR
260b0 6f 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20 20  ow<nOut.        
260c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
260d0 54 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20 26  To->nRow==nOut &
260e0 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  & pTo->rUnsorted
260f0 3c 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20  <=rUnsorted).   
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
26110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
26120 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23 69  .          ){.#i
26130 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
26140 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
26150 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
26160 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
26170 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
26180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26190 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
261b0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
261c0 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
261d0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
261e0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
261f0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
26200 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
26210 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f  ost, nOut, rUnso
26220 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26230 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
26240 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
26250 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
26260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26270 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
26280 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
26290 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
262a0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
262b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
262c0 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
262d0 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
262e0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64    pTo->rUnsorted
26310 2c 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  , pTo->isOrdered
26320 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
26330 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
26340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
26350 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
26360 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
26370 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
26380 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
26390 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
263a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
263b0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
263c0 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
263d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
263e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
263f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26400 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
26410 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
26420 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
26430 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
26440 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
26450 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
26460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
26470 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
26480 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
26490 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
264a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
264b0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
264c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
264d0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
264e0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
264f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26500 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
26510 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
26520 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c  s cost=%-3d,%3d,
26530 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
26550 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
26560 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
26570 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
26580 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
26590 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
265a0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
265b0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
265d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
265e0 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
265f0 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65  -3d,%3d,%3d orde
26600 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
26610 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
26620 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
26630 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
26640 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20  pTo->rUnsorted, 
26670 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
26680 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
26690 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
266a0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
266b0 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
266c0 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73      /* pWLoop is
266d0 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20   a winner.  Add 
266e0 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  it to the set of
266f0 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
26700 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73          pTo->mas
26710 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d  kLoop = pFrom->m
26720 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
26730 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
26740 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70      pTo->revLoop
26750 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
26760 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20      pTo->nRow = 
26770 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54  nOut;.        pT
26780 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  o->rCost = rCost
26790 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
267a0 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f  Unsorted = rUnso
267b0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54  rted;.        pT
267c0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69  o->isOrdered = i
267d0 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
267e0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
267f0 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  oop, pFrom->aLoo
26800 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  p, sizeof(WhereL
26810 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20  oop*)*iLoop);.  
26820 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70        pTo->aLoop
26830 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70  [iLoop] = pWLoop
26840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  ;.        if( nT
26850 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  o>=mxChoice ){. 
26860 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30           mxI = 0
26870 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f  ;.          mxCo
26880 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73  st = aTo[0].rCos
26890 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55  t;.          mxU
268a0 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d  nsorted = aTo[0]
268b0 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  .nRow;.         
268c0 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26   for(jj=1, pTo=&
268d0 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f  aTo[1]; jj<mxCho
268e0 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  ice; jj++, pTo++
268f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
26900 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78  f( pTo->rCost>mx
26910 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  Cost .          
26920 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73     || (pTo->rCos
26930 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f  t==mxCost && pTo
26940 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e  ->rUnsorted>mxUn
26950 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20  sorted) .       
26960 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26970 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70        mxCost = p
26980 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
26990 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72           mxUnsor
269a0 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f  ted = pTo->rUnso
269b0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  rted;.          
269c0 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20      mxI = jj;.  
269d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
269e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
269f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26a00 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
26a10 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e  CE_ENABLED  /* >
26a20 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  =2 */.    if( sq
26a30 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26a40 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20  & 0x02 ){.      
26a50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26a60 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
26a70 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
26a80 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
26a90 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
26aa0 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
26ab0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
26ac0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26ad0 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33  tf(" %s cost=%-3
26ae0 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65  d nrow=%-3d orde
26af0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
26b00 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26b10 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
26b20 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
26b30 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
26b40 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
26b50 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73  ed>=0 ? (pTo->is
26b60 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27  Ordered+'0') : '
26b70 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ?');.        if(
26b80 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
26b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
26ba0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26bb0 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
26bc0 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
26bd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26be0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26bf0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
26c00 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
26c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
26c20 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
26c30 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
26c40 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
26c50 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
26c60 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
26c70 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
26c80 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
26c90 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
26ca0 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
26cb0 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
26cc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
26cd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26ce0 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
26cf0 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
26d00 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53  3DbFreeNN(db, pS
26d10 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
26d20 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
26d30 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
26d40 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
26d50 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
26d60 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
26d70 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
26d80 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
26d90 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
26da0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
26db0 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
26dc0 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
26dd0 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
26de0 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
26df0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
26e00 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
26e10 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
26e20 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
26e30 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
26e40 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
26e50 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
26e60 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
26e70 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
26e80 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
26e90 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
26ea0 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
26eb0 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
26ec0 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
26ed0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
26ee0 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
26ef0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
26f00 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
26f10 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
26f20 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
26f30 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
26f40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26f50 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
26f60 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
26f70 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
26f80 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
26f90 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
26fa0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
26fb0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
26fc0 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
26fd0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
26fe0 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
26ff0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
27000 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
27010 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
27020 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
27030 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
27040 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
27050 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
27060 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
27070 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
27080 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
27090 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
270a0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
270b0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
270c0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
270d0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
270e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
270f0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
27100 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
27110 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27120 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
27130 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
27140 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
27150 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
27160 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
27170 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
27180 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
27190 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
271a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
271b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
271c0 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
271d0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70 57  rdered;.      pW
271e0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
271f0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
27200 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
27210 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20  ->nOBSat<=0 ){. 
27220 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e         pWInfo->n
27230 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
27240 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29     if( nLoop>0 )
27250 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
27260 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d 2d  wsFlags = pFrom-
27270 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d  >aLoop[nLoop-1]-
27280 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  >wsFlags;.      
27290 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
272a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
272b0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
272c0 26 26 20 28 77 73 46 6c 61 67 73 26 28 57 48 45  && (wsFlags&(WHE
272d0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c  RE_IPK|WHERE_COL
272e0 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52 45  UMN_IN))!=(WHERE
272f0 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  _IPK|WHERE_COLUM
27300 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20  N_IN).          
27310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
27320 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
27330 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63            int rc
27340 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
27350 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
27360 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
27370 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20 20  derBy, pFrom,.  
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52 42      WHERE_ORDERB
273a0 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31  Y_LIMIT, nLoop-1
273b0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
273c0 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20  Loop-1], &m);.  
273d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
273e0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
273f0 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20 20  ERE_IPK );.     
27400 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27410 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
27420 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
27430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27440 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
27450 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
27460 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
27470 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
27480 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
27490 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
274a0 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20  revMask = m;.   
274b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
274c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
274d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
274e0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
274f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27500 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
27510 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
27520 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
27530 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
27540 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
27550 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
27560 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
27570 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
27580 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
27590 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
275a0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
275b0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
275c0 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
275d0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
275e0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
275f0 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
27600 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
27610 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
27620 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
27630 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
27640 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
27650 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
27660 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
27670 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
27680 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
27690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
276a0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
276b0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
276c0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
276d0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
276e0 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
276f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
27700 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65  reeNN(db, pSpace
27710 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27720 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27730 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
27740 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
27750 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
27760 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
27770 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
27780 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
27790 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
277a0 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
277b0 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
277c0 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
277d0 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
277e0 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
277f0 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
27800 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
27810 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
27820 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
27830 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
27840 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
27850 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
27860 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
27870 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
27880 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
27890 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
278a0 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
278b0 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
278c0 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
278d0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
278e0 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
278f0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
27900 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
27910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27920 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
27930 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27940 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
27950 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
27960 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27970 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
27980 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
27990 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
279a0 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
279b0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
279c0 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
279d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
279e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70  ndex *pIdx;..  p
279f0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
27a00 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
27a10 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27a20 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
27a30 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e  BCLAUSE ) return
27a40 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
27a50 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
27a60 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
27a70 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
27a80 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
27a90 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
27aa0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
27ab0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
27ac0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
27ad0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
27ae0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
27af0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
27b00 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
27b10 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
27b20 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
27b30 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
27b40 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
27b50 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
27b60 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
27b70 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
27b80 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
27b90 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
27ba0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
27bb0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27bc0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27bd0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
27be0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
27bf0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
27c00 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
27c10 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
27c20 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
27c30 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
27c40 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
27c50 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
27c60 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
27c70 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
27c80 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
27c90 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
27ca0 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
27cb0 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
27cc0 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
27cd0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
27ce0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
27cf0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
27d00 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
27d10 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
27d20 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
27d30 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
27d40 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
27d50 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
27d60 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
27d70 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
27d80 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
27d90 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
27da0 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
27db0 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
27dc0 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
27dd0 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
27de0 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
27df0 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
27e00 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
27e10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
27e20 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
27e30 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
27e40 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
27e50 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
27e60 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
27e70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
27e80 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
27e90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
27ea0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
27eb0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
27ec0 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
27ed0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
27ee0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
27ef0 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
27f00 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
27f10 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
27f20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
27f30 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
27f40 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
27f50 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
27f60 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
27f70 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
27f80 6f 6c 55 73 65 64 20 26 20 70 49 64 78 2d 3e 63  olUsed & pIdx->c
27f90 6f 6c 4e 6f 74 49 64 78 65 64 29 3d 3d 30 20 29  olNotIdxed)==0 )
27fa0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
27fb0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
27fc0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
27fd0 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
27fe0 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
27ff0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
28000 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
28010 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
28020 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
28030 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28040 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
28050 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
28060 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
28070 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
28080 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
28090 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
280a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
280b0 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
280c0 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
280d0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
280e0 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
280f0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
28100 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73  = pLoop;.    ass
28110 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61  ert( pWInfo->sMa
28120 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43  skSet.n==1 && iC
28130 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ur==pWInfo->sMas
28140 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20  kSet.ix[0] );.  
28150 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
28160 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65  f = 1; /* sqlite
28170 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
28180 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
28190 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70   iCur); */.    p
281a0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
281b0 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
281c0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
281d0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
281e0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
281f0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
28200 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
28210 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
28220 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
28230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
28240 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
28250 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
28260 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
28270 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
28280 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
28290 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
282a0 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
282b0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
282c0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
282d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  n 0;.}../*.** He
282e0 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
282f0 72 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  r exprIsDetermin
28300 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  istic()..*/.stat
28310 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
28320 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 57  sDeterministic(W
28330 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28340 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
28350 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
28360 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
28370 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
28380 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e  xpr, EP_ConstFun
28390 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 61  c)==0 ){.    pWa
283a0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
283b0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
283c0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
283d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
283e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
283f0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 65 78  n true if the ex
28400 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
28410 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  s no non-determi
28420 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66  nistic SQL .** f
28430 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74  unctions. Do not
28440 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65   consider non-de
28450 74 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20  terministic SQL 
28460 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
28470 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73  re .** part of s
28480 75 62 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ub-select statem
28490 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
284a0 69 6e 74 20 65 78 70 72 49 73 44 65 74 65 72 6d  int exprIsDeterm
284b0 69 6e 69 73 74 69 63 28 45 78 70 72 20 2a 70 29  inistic(Expr *p)
284c0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
284d0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
284e0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
284f0 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
28500 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
28510 72 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69  rNodeIsDetermini
28520 73 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63  stic;.  w.xSelec
28530 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
28540 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
28550 6c 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  l;.  sqlite3Walk
28560 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
28570 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
28580 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28590 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
285a0 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
285b0 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
285c0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
285d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
285e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
285f0 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
28600 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
28610 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
28620 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
28630 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
28640 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
28650 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
28660 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
28670 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
28680 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
28690 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
286a0 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
286b0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
286c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
286d0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
286e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
286f0 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
28700 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
28710 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
28720 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
28730 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
28740 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
28750 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
28760 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
28770 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
28780 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
28790 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
287a0 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
287b0 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
287c0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
287d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
287e0 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
287f0 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
28800 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
28810 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
28820 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
28830 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
28840 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
28850 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
28860 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
28870 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
28880 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
28890 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
288a0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
288b0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
288c0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
288d0 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
288e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
288f0 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
28900 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
28910 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
28920 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
28930 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28950 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
28960 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
28990 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
289a0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
289d0 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
289e0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
289f0 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
28a00 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
28a10 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
28a20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
28a30 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
28a40 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
28a50 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
28a60 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
28a70 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
28a80 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
28a90 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
28aa0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
28ab0 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
28ac0 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
28ad0 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
28ae0 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
28af0 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
28b00 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
28b10 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
28b20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
28b30 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
28b40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
28b50 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
28b60 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
28b70 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
28b80 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
28b90 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
28ba0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
28bb0 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
28bc0 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
28bd0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
28be0 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
28bf0 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
28c00 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
28c10 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
28c20 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
28c30 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
28c40 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
28c50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
28c60 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
28c70 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
28c80 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
28c90 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
28ca0 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
28cb0 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
28cc0 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
28cd0 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
28ce0 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
28cf0 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
28d00 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
28d10 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
28d20 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
28d30 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
28d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
28d50 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
28d60 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
28d70 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
28d80 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
28d90 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
28da0 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
28db0 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
28dc0 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
28dd0 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
28de0 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
28df0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
28e00 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
28e10 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
28e20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
28e30 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
28e40 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
28e50 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
28e60 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
28e70 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
28e80 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
28e90 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
28ea0 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
28eb0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
28ec0 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
28ed0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
28ee0 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
28ef0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
28f00 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
28f10 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
28f20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
28f30 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
28f40 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
28f50 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
28f60 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
28f70 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
28f80 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
28f90 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
28fa0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
28fb0 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
28fc0 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
28fd0 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
28fe0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
28ff0 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
29000 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
29010 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
29020 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
29030 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
29040 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
29050 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
29060 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
29070 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
29080 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
29090 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
290a0 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
290b0 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
290c0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
290d0 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
290e0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
290f0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
29100 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
29110 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
29120 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
29130 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
29140 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
29150 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
29160 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
29170 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
29180 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
29190 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
291a0 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
291b0 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
291c0 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
291d0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
291e0 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
291f0 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
29200 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29210 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29220 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
29230 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
29240 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
29250 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
29260 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
29270 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
29280 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
29290 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
292a0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
292b0 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
292c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
292d0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
292e0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
292f0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
29300 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
29310 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
29320 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
29330 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
29340 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
29350 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   If .** WHERE_OR
29360 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
29370 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68  t, iIdxCur is th
29380 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
29390 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74  of an index.** t
293a0 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61  o use for OR cla
293b0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
293c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
293d0 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69  e should use thi
293e0 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75  s.** specific cu
293f0 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f  rsor.  If WHERE_
29400 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
29410 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64  is set, then iId
29420 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66  xCur is.** the f
29430 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61  irst cursor in a
29440 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f  n array of curso
29450 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
29460 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f  es.  iIdxCur sho
29470 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  uld.** be used t
29480 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70  o compute the ap
29490 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72  propriate cursor
294a0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
294b0 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20  ich index is.** 
294c0 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  used..*/.WhereIn
294d0 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
294e0 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
294f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29500 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
29510 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
29520 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
29530 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
29540 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
29550 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
29560 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
29570 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
29580 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
29590 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
295a0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
295b0 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52       /* An ORDER
295c0 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
295d0 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
295e0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
295f0 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f  *pResultSet,   /
29600 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74 20 73  * Query result s
29610 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44  et.  Req'd for D
29620 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36  ISTINCT */.  u16
29630 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
29640 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
29650 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
29660 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
29670 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72   */.  int iAuxAr
29680 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
29690 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   If WHERE_OR_SUB
296a0 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
296b0 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
296c0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
296e0 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  If WHERE_USE_LIM
296f0 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d  IT, then the lim
29700 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a  it amount */.){.
29710 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
29720 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29730 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
29740 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
29750 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
29760 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
29770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29780 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
29790 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
297a0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
297b0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
297c0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
297d0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
297e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
297f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
29800 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
29810 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
29820 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
29830 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
29840 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
29850 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
29860 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
29870 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
29880 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
29890 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
298a0 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
298b0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
298c0 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
298d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
298e0 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
298f0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
29900 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
29910 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
29920 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
29930 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
29940 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29950 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
29960 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
29970 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
299a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
299b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
299c0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
299d0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
299e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
299f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29a00 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46   code */.  u8 bF
29a10 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  ordelete = 0;   
29a20 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f        /* OPFLAG_
29a30 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72  FORDELETE or zer
29a40 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  o, as appropriat
29a50 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
29a60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
29a70 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
29a80 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20  IROW)==0 || (.  
29a90 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67        (wctrlFlag
29aa0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
29ab0 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
29ac0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
29ad0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
29ae0 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29  BCLAUSE)==0 .  )
29af0 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  );..  /* Only on
29b00 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55  e of WHERE_OR_SU
29b10 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45  BCLAUSE or WHERE
29b20 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  _USE_LIMIT */.  
29b30 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
29b40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
29b50 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
29b60 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
29b70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29b80 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  USE_LIMIT)==0 );
29b90 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
29ba0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
29bb0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
29bc0 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
29bd0 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
29be0 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
29bf0 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
29c00 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
29c10 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
29c20 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
29c30 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
29c40 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
29c50 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
29c60 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
29c70 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
29c80 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
29c90 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
29ca0 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
29cb0 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
29cc0 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
29cd0 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
29ce0 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
29cf0 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
29d00 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
29d10 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
29d20 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
29d30 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
29d40 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
29d50 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
29d60 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
29d70 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
29d80 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
29d90 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
29da0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
29db0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
29dc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
29dd0 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
29de0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
29df0 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
29e00 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
29e10 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
29e20 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
29e30 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
29e40 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
29e50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29e60 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
29e70 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
29e80 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
29e90 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
29ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
29eb0 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
29ec0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
29ed0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
29ee0 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
29ef0 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
29f00 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
29f10 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
29f20 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
29f30 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
29f40 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
29f50 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
29f60 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
29f70 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
29f80 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
29f90 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
29fa0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
29fb0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
29fc0 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
29fd0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
29fe0 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31  R_SUBCLAUSE) ? 1
29ff0 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
2a000 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
2a010 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2a020 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
2a030 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
2a040 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
2a050 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
2a060 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
2a070 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2a080 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
2a090 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
2a0a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a0b0 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
2a0c0 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2a0d0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
2a0e0 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
2a0f0 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
2a100 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
2a110 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
2a120 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
2a130 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
2a140 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
2a150 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
2a160 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
2a170 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
2a180 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
2a190 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
2a1a0 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
2a1b0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2a1c0 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2a1d0 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2a1e0 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2a1f0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2a200 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
2a210 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
2a220 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
2a230 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2a240 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2a250 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2a260 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
2a270 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
2a280 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2a290 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
2a2a0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2a2b0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
2a2c0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
2a2d0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
2a2e0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
2a2f0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72  .  pWInfo->pWher
2a300 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57  e = pWhere;.  pW
2a310 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
2a320 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
2a330 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2a340 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
2a350 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2a360 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
2a370 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
2a380 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2a390 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
2a3a0 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
2a3b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a3c0 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
2a3d0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2a3e0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2a3f0 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
2a400 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
2a410 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
2a420 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2a430 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  oop;.  memset(&p
2a440 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30  WInfo->nOBSat, 0
2a450 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73  , .         offs
2a460 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73  etof(WhereInfo,s
2a470 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57  WC) - offsetof(W
2a480 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29  hereInfo,nOBSat)
2a490 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  );.  memset(&pWI
2a4a0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  nfo->a[0], 0, si
2a4b0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b  zeof(WhereLoop)+
2a4c0 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28  nTabList*sizeof(
2a4d0 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2a4e0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2a4f0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2a500 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
2a510 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
2a520 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
2a530 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
2a540 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
2a550 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
2a560 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
2a570 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
2a580 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
2a590 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
2a5a0 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
2a5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2a5c0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2a5d0 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
2a5e0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
2a5f0 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
2a600 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a610 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
2a620 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
2a630 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2a640 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2a650 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2a660 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2a670 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2a680 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2a690 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2a6a0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2a6b0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2a6c0 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
2a6d0 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
2a6e0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
2a6f0 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
2a700 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
2a710 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
2a720 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
2a730 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2a740 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
2a750 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
2a760 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
2a770 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
2a780 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
2a790 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2a7a0 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
2a7b0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2a7c0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
2a7d0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2a7e0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2a7f0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
2a800 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  }.    ExplainQue
2a810 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
2a820 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53 54 41 4e  0, "SCAN CONSTAN
2a830 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d 65 6c 73  T ROW"));.  }els
2a840 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  e{.    /* Assign
2a850 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2a860 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2a870 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2a880 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  M clause..    **
2a890 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  .    ** The N-th
2a8a0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2a8b0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
2a8c0 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
2a8d0 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a 20  f 1<<N..    **. 
2a8e0 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f     ** The rule o
2a8f0 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
2a900 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
2a910 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
2a920 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 20   bitmask for.   
2a930 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74   ** a table T, t
2a940 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62  hen X-1 is the b
2a950 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f  itmask for all o
2a960 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74  ther tables to t
2a970 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20  he left of T..  
2a980 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
2a990 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2a9a0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2a9b0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2a9c0 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70  in is.    ** imp
2a9d0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2a9e0 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20 20  #3015..    **.  
2a9f0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2aa00 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2aa10 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2aa20 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2aa30 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61 62  s in.    ** pTab
2aa40 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2aa50 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2aa60 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2aa70 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2aa80 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20      ** equal to 
2aa90 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
2aaa0 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
2aab0 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
2aac0 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f 4f  e.    ** WHERE_O
2aad0 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
2aae0 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
2aaf0 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20 20      ii = 0;.    
2ab00 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  do{.      create
2ab10 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2ab20 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
2ab30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73  Cursor);.      s
2ab40 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
2ab50 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
2ab60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
2ab70 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
2ab80 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 69      }while( (++i
2ab90 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  i)<pTabList->nSr
2aba0 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51  c );.  #ifdef SQ
2abb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
2abc0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2abd0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  x = 0;.      for
2abe0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
2abf0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
2ac00 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2ac10 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
2ac20 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
2ac30 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2ac40 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2ac50 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d       assert( m>=
2ac60 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 78  mx );.        mx
2ac70 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = m;.      }.  
2ac80 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
2ac90 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  .  .  /* Analyze
2aca0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2acb0 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
2acc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2acd0 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
2ace0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
2acf0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2ad00 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2ad10 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2ad20 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
2ad30 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d 73  ase: WHERE terms
2ad40 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 66   that do not ref
2ad50 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 73  er to any tables
2ad60 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20 2a   in the join.  *
2ad70 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  * (constant expr
2ad80 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75 61  essions). Evalua
2ad90 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65 72  te each such ter
2ada0 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65 72  m, and jump over
2adb0 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67 65   all the.  ** ge
2adc0 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66 20  nerated code if 
2add0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
2ade0 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a 20  t true.  .  **. 
2adf0 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   ** Do not do th
2ae00 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65 73  is if the expres
2ae10 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
2ae20 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
2ae30 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74  functions.  ** t
2ae40 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74 68  hat are not with
2ae50 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  in a sub-select.
2ae60 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74 72   This is not str
2ae70 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c 20  ictly required, 
2ae80 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72 76  but.  ** preserv
2ae90 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67 61  es SQLite's lega
2aea0 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  cy behaviour in 
2aeb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2aec0 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20 20  o cases:.  **.  
2aed0 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48  **   FROM ... WH
2aee0 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b 20  ERE random()>0; 
2aef0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76 61            -- eva
2af00 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20  l random() once 
2af10 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20 46  per row.  **   F
2af20 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28 53  ROM ... WHERE (S
2af30 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29 3e  ELECT random())>
2af40 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64  0;  -- eval rand
2af50 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61 6c  om() once overal
2af60 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  l.  */.  for(ii=
2af70 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
2af80 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2af90 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 20    WhereTerm *pT 
2afa0 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  = &sWLB.pWC->a[i
2afb0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  i];.    if( pT->
2afc0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2afd0 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75  IRTUAL ) continu
2afe0 65 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e 70  e;.    if( pT->p
2aff0 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20 28  rereqAll==0 && (
2b000 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 65  nTabList==0 || e
2b010 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
2b020 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20 29  ic(pT->pExpr)) )
2b030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2b040 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2b050 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70 57  e, pT->pExpr, pW
2b060 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2b070 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2b080 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46 6c  ;.      pT->wtFl
2b090 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2b0a0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
2b0b0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2b0c0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2b0d0 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
2b0e0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
2b0f0 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
2b100 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
2b110 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29 20  WC, pResultSet) 
2b120 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2b130 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67  DISTINCT marking
2b140 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20   is pointless.  
2b150 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20  Ignore it. */.  
2b160 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2b170 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2b180 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
2b190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2b1a0 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
2b1b0 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45    /* Try to ORDE
2b1c0 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20  R BY the result 
2b1d0 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74  set to make dist
2b1e0 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20  inct processing 
2b1f0 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20  easier */.      
2b200 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b210 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54  gs |= WHERE_DIST
2b220 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57  INCTBY;.      pW
2b230 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
2b240 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 20   pResultSet;.   
2b250 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
2b260 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65  struct the Where
2b270 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2b280 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
2b290 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
2b2a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2b2b0 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66 66  reTrace & 0xffff
2b2c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b2d0 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20  ebugPrintf("*** 
2b2e0 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
2b2f0 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a  *** (wctrlFlags:
2b300 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67   0x%x",wctrlFlag
2b310 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  s);.    if( wctr
2b320 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
2b330 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  SE_LIMIT ){.    
2b340 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b350 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25  intf(", limit: %
2b360 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20  d", iAuxArg);.  
2b370 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2b380 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22  ebugPrintf(")\n"
2b390 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
2b3a0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2b3b0 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73   0x100 ){ /* Dis
2b3c0 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
2b3d0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2b3e0 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
2b3f0 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
2b400 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d  t(sWLB.pWC);.  }
2b410 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
2b420 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68  TabList!=1 || wh
2b430 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c  ereShortCut(&sWL
2b440 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  B)==0 ){.    rc 
2b450 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  = whereLoopAddAl
2b460 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66  l(&sWLB);.    if
2b470 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
2b480 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a  eBeginError;.  .
2b490 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2b4a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2b4b0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2b4c0 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73  ace ){    /* Dis
2b4d0 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
2b4e0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2b4f0 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65  s */.      Where
2b500 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
2b510 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
2b520 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c  ic const char zL
2b530 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35  abel[] = "012345
2b540 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c  6789abcdefghijkl
2b550 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a  mnopqrstuvwyxz".
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
2b590 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2b5a0 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
2b5b0 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
2b5c0 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
2b5d0 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
2b5e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
2b5f0 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 28  cId = zLabel[i%(
2b600 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2d 31  sizeof(zLabel)-1
2b610 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
2b620 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
2b630 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
2b640 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2b650 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
2b660 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
2b670 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2b680 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2b690 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2b6a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2b6b0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
2b6c0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
2b6d0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
2b6e0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
2b6f0 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
2b700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2b710 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2b720 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
2b730 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
2b740 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
2b750 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2b760 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
2b770 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
2b780 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49  >revMask = ALLBI
2b790 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  TS;.  }.  if( pP
2b7a0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
2b7b0 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
2b7c0 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
2b7d0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2b7e0 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
2b7f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2b800 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2b810 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
2b820 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2b830 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
2b840 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
2b850 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
2b860 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
2b870 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
2b880 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2b890 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
2b8a0 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
2b8b0 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
2b8c0 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
2b8d0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
2b8e0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
2b8f0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
2b900 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2b910 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
2b920 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2b930 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
2b940 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
2b950 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2b960 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
2b970 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
2b980 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2b990 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2b9a0 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
2b9b0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
2b9c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2b9d0 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
2b9e0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
2b9f0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2ba00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
2ba10 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
2ba20 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
2ba30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ba40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2ba50 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
2ba60 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2ba70 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
2ba80 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
2ba90 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2baa0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
2bab0 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
2bac0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2bad0 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
2bae0 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72  o omit tables fr
2baf0 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74  om the join that
2bb00 20 64 6f 20 6e 6f 74 20 61 66 66 65 63 74 20 74   do not affect t
2bb10 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2a 20  he result..  ** 
2bb20 46 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 20 6e  For a table to n
2bb30 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 72 65  ot affect the re
2bb40 73 75 6c 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  sult, the follow
2bb50 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75 65  ing must be true
2bb60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29  :.  **.  **   1)
2bb70 20 54 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   The query must 
2bb80 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
2bb90 61 74 65 2e 0a 20 20 2a 2a 20 20 20 32 29 20 54  ate..  **   2) T
2bba0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
2bbb0 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45   the RHS of a LE
2bbc0 46 54 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 20 20 20  FT JOIN..  **   
2bbd0 33 29 20 45 69 74 68 65 72 20 74 68 65 20 71 75  3) Either the qu
2bbe0 65 72 79 20 6d 75 73 74 20 62 65 20 44 49 53 54  ery must be DIST
2bbf0 49 4e 43 54 2c 20 6f 72 20 65 6c 73 65 20 74 68  INCT, or else th
2bc00 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2bc10 61 75 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d  ause.  **      m
2bc20 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f  ust contain a co
2bc30 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6c 69  nstraint that li
2bc40 6d 69 74 73 20 74 68 65 20 73 63 61 6e 20 6f 66  mits the scan of
2bc50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 0a 20   the table to . 
2bc60 20 2a 2a 20 20 20 20 20 20 61 74 20 6d 6f 73 74   **      at most
2bc70 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
2bc80 20 2a 2a 20 20 20 34 29 20 54 68 65 20 74 61 62   **   4) The tab
2bc90 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 72  le must not be r
2bca0 65 66 65 72 65 6e 63 65 64 20 62 79 20 61 6e 79  eferenced by any
2bcb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 71 75 65   part of the que
2bcc0 72 79 20 61 70 61 72 74 0a 20 20 2a 2a 20 20 20  ry apart.  **   
2bcd0 20 20 20 66 72 6f 6d 20 69 74 73 20 6f 77 6e 20     from its own 
2bce0 55 53 49 4e 47 20 6f 72 20 4f 4e 20 63 6c 61 75  USING or ON clau
2bcf0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  se..  **.  ** Fo
2bd00 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
2bd10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2bd20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2bd30 69 70 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ipk INTEGER PRIM
2bd40 41 52 59 20 4b 45 59 2c 20 76 31 29 3b 0a 20 20  ARY KEY, v1);.  
2bd50 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2bd60 42 4c 45 20 74 32 28 69 70 6b 20 49 4e 54 45 47  BLE t2(ipk INTEG
2bd70 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2bd80 76 32 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v2);.  **     CR
2bd90 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 69 70  EATE TABLE t3(ip
2bda0 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2bdb0 59 20 4b 45 59 2c 20 76 33 29 3b 0a 20 20 2a 2a  Y KEY, v3);.  **
2bdc0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 61 62 6c 65  .  ** then table
2bdd0 20 74 32 20 63 61 6e 20 62 65 20 6f 6d 69 74 74   t2 can be omitt
2bde0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c  ed from the foll
2bdf0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
2be00 20 20 20 20 20 53 45 4c 45 43 54 20 76 31 2c 20       SELECT v1, 
2be10 76 33 20 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a  v3 FROM t1 .  **
2be20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
2be30 20 74 32 20 55 53 49 4e 47 20 28 74 31 2e 69 70   t2 USING (t1.ip
2be40 6b 3d 74 32 2e 69 70 6b 29 0a 20 20 2a 2a 20 20  k=t2.ipk).  **  
2be50 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74       LEFT JOIN t
2be60 33 20 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d  3 USING (t1.ipk=
2be70 74 33 2e 69 70 6b 29 0a 20 20 2a 2a 0a 20 20 2a  t3.ipk).  **.  *
2be80 2a 20 6f 72 20 66 72 6f 6d 3a 0a 20 20 2a 2a 0a  * or from:.  **.
2be90 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2bea0 44 49 53 54 49 4e 43 54 20 76 31 2c 20 76 33 20  DISTINCT v1, v3 
2beb0 46 52 4f 4d 20 74 31 20 0a 20 20 2a 2a 20 20 20  FROM t1 .  **   
2bec0 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32      LEFT JOIN t2
2bed0 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2bee0 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2bef0 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2bf00 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2bf10 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2bf20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2bf30 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
2bf40 75 6c 74 53 65 74 21 3d 30 20 20 20 20 20 20 20  ultSet!=0       
2bf50 20 20 20 20 20 20 20 20 2f 2a 20 67 75 61 72 61          /* guara
2bf60 6e 74 65 65 73 20 63 6f 6e 64 69 74 69 6f 6e 20  ntees condition 
2bf70 28 31 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  (1) above */.   
2bf80 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2bf90 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2bfa0 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
2bfb0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
2bfc0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
2bfd0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65  sed = sqlite3Whe
2bfe0 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2bff0 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
2c000 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
2c010 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  WLB.pOrderBy ){.
2c020 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d        tabUsed |=
2c030 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2c040 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
2c050 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
2c060 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  By);.    }.    f
2c070 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  or(i=pWInfo->nLe
2c080 76 65 6c 2d 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d  vel-1; i>=1; i--
2c090 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2c0a0 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
2c0b0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
2c0c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c0d0 65 6d 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  em;.      pLoop 
2c0e0 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2c0f0 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 70 49 74  WLoop;.      pIt
2c100 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
2c110 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2c120 3e 69 54 61 62 5d 3b 0a 20 20 20 20 20 20 69 66  >iTab];.      if
2c130 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  ( (pItem->fg.joi
2c140 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2c150 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c160 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2c170 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2c180 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
2c190 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2c1a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2c1b0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
2c1c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f     ){.        co
2c1d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2c1e0 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
2c1f0 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
2c200 53 65 6c 66 29 21 3d 30 20 29 20 63 6f 6e 74 69  Self)!=0 ) conti
2c210 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  nue;.      pEnd 
2c220 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
2c230 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
2c240 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2c250 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2c260 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2c270 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2c280 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2c290 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2c2a0 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2c2b0 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
2c2c0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2c2d0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2c2e0 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  oin).           
2c2f0 7c 7c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  || pTerm->pExpr-
2c300 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2c310 21 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  !=pItem->iCursor
2c320 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
2c330 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2c340 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2c360 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
2c370 45 6e 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  End ) continue;.
2c380 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
2c390 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72  (0xffff, ("-> dr
2c3a0 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75  op loop %c not u
2c3b0 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63  sed\n", pLoop->c
2c3c0 49 64 29 29 3b 0a 20 20 20 20 20 20 6e 6f 74 52  Id));.      notR
2c3d0 65 61 64 79 20 26 3d 20 7e 70 4c 6f 6f 70 2d 3e  eady &= ~pLoop->
2c3e0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
2c3f0 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2c400 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2c410 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2c420 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2c430 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2c440 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2c450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
2c460 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2c470 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
2c480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c490 20 20 20 20 69 66 28 20 69 21 3d 70 57 49 6e 66      if( i!=pWInf
2c4a0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  o->nLevel-1 ){. 
2c4b0 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
2c4c0 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   = (pWInfo->nLev
2c4d0 65 6c 2d 31 2d 69 29 20 2a 20 73 69 7a 65 6f 66  el-1-i) * sizeof
2c4e0 28 57 68 65 72 65 4c 65 76 65 6c 29 3b 0a 20 20  (WhereLevel);.  
2c4f0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70        memmove(&p
2c500 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 20 26 70 57  WInfo->a[i], &pW
2c510 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d 2c 20 6e 42  Info->a[i+1], nB
2c520 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
2c530 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
2c540 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
2c550 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
2c560 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
2c570 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
2c580 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
2c590 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
2c5a0 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
2c5b0 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
2c5c0 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
2c5d0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
2c5e0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
2c5f0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
2c600 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
2c610 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
2c620 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
2c630 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
2c640 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
2c650 69 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  iate..  **.  ** 
2c660 41 20 6f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f  A one-pass appro
2c670 61 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 20  ach can be used 
2c680 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  if the caller ha
2c690 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 65 0a  s requested one.
2c6a0 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
2c6b0 28 61 29 20 74 68 65 20 73 63 61 6e 20 76 69 73  (a) the scan vis
2c6c0 69 74 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  its at most one 
2c6d0 72 6f 77 20 6f 72 20 28 62 29 20 65 61 63 68 0a  row or (b) each.
2c6e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c    ** of the foll
2c6f0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2c700 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 74 68    **.  **   * th
2c710 65 20 63 61 6c 6c 65 72 20 68 61 73 20 69 6e 64  e caller has ind
2c720 69 63 61 74 65 64 20 74 68 61 74 20 61 20 6f 6e  icated that a on
2c730 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
2c740 63 61 6e 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  can be used.  **
2c750 20 20 20 20 20 77 69 74 68 20 6d 75 6c 74 69 70       with multip
2c760 6c 65 20 72 6f 77 73 20 28 62 79 20 73 65 74 74  le rows (by sett
2c770 69 6e 67 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  ing WHERE_ONEPAS
2c780 53 5f 4d 55 4c 54 49 52 4f 57 29 2c 20 61 6e 64  S_MULTIROW), and
2c790 0a 20 20 2a 2a 20 20 20 2a 20 74 68 65 20 74 61  .  **   * the ta
2c7a0 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 72  ble is not a vir
2c7b0 74 75 61 6c 20 74 61 62 6c 65 2c 20 61 6e 64 0a  tual table, and.
2c7c0 20 20 2a 2a 20 20 20 2a 20 65 69 74 68 65 72 20    **   * either 
2c7d0 74 68 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  the scan does no
2c7e0 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70 74  t use the OR opt
2c7f0 69 6d 69 7a 61 74 69 6f 6e 20 6f 72 20 74 68 65  imization or the
2c800 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 20 20 20   caller.  **    
2c810 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65   is a DELETE ope
2c820 72 61 74 69 6f 6e 20 28 57 48 45 52 45 5f 44 55  ration (WHERE_DU
2c830 50 4c 49 43 41 54 45 53 5f 4f 4b 20 69 73 20 6f  PLICATES_OK is o
2c840 6e 6c 79 20 73 70 65 63 69 66 69 65 64 0a 20 20  nly specified.  
2c850 2a 2a 20 20 20 20 20 66 6f 72 20 44 45 4c 45 54  **     for DELET
2c860 45 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  E)..  **.  ** Th
2c870 65 20 6c 61 73 74 20 71 75 61 6c 69 66 69 63 61  e last qualifica
2c880 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
2c890 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
2c8a0 65 6e 74 20 75 73 65 73 0a 20 20 2a 2a 20 57 68  ent uses.  ** Wh
2c8b0 65 72 65 49 6e 66 6f 2e 61 69 43 75 72 4f 6e 65  ereInfo.aiCurOne
2c8c0 50 61 73 73 5b 31 5d 20 74 6f 20 64 65 74 65 72  Pass[1] to deter
2c8d0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2c8e0 6e 6f 74 20 69 74 20 72 65 61 6c 6c 79 20 63 61  not it really ca
2c8f0 6e 0a 20 20 2a 2a 20 75 73 65 20 61 20 6f 6e 65  n.  ** use a one
2c900 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 2c 20  -pass approach, 
2c910 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
2c920 73 65 74 20 61 63 63 75 72 61 74 65 6c 79 20 66  set accurately f
2c930 6f 72 20 73 63 61 6e 73 0a 20 20 2a 2a 20 74 68  or scans.  ** th
2c940 61 74 20 75 73 65 20 74 68 65 20 4f 52 20 6f 70  at use the OR op
2c950 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  timization..  */
2c960 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2c970 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2c980 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2c990 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
2c9a0 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
2c9b0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2c9c0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2c9d0 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  IRED)!=0 ){.    
2c9e0 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57  int wsFlags = pW
2c9f0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2ca00 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2ca10 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77  int bOnerow = (w
2ca20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2ca30 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69  NEROW)!=0;.    i
2ca40 66 28 20 62 4f 6e 65 72 6f 77 20 7c 7c 20 28 0a  f( bOnerow || (.
2ca50 20 20 20 20 20 20 20 20 30 21 3d 28 77 63 74 72          0!=(wctr
2ca60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2ca70 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2ca80 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46  .     && 0==(wsF
2ca90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2caa0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2cab0 26 26 20 28 30 3d 3d 28 77 73 46 6c 61 67 73 20  && (0==(wsFlags 
2cac0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2cad0 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
2cae0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
2caf0 54 45 53 5f 4f 4b 29 29 0a 20 20 20 20 29 29 7b  TES_OK)).    )){
2cb00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2cb10 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
2cb20 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
2cb30 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
2cb40 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
2cb50 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
2cb60 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
2cb70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2cb80 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2cb90 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
2cba0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2cbb0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
2cbc0 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
2cbd0 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
2cbe0 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
2cbf0 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
2cc00 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2cc10 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
2cc20 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
2cc30 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
2cc40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
2cc50 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
2cc60 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
2cc70 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
2cc80 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
2cc90 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
2cca0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2ccb0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
2ccc0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
2ccd0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
2cce0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
2ccf0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
2cd00 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
2cd10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
2cd20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2cd30 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2cd40 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
2cd50 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
2cd60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2cd70 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
2cd80 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2cd90 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2cda0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
2cdb0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2cdc0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
2cdd0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2cde0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2cdf0 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
2ce00 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2ce10 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2ce20 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2ce30 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
2ce40 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2ce50 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
2ce60 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
2ce70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ce80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ce90 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
2cea0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2ceb0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2cec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2ced0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2cee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2cef0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2cf00 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2cf10 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2cf20 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2cf30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cf40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2cf50 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2cf60 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2cf70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
2cf80 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
2cf90 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
2cfa0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
2cfb0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
2cfc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2cfd0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2cfe0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2cff0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d000 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2d010 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2d020 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
2d030 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2d040 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
2d050 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
2d060 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2d070 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2d080 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2d090 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
2d0a0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2d0b0 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
2d0c0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2d0d0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2d0e0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2d0f0 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
2d100 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
2d110 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
2d120 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
2d130 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2d140 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2d150 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2d160 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
2d170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d180 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2d190 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2d1a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2d1b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2d1c0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2d1d0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2d1e0 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
2d1f0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
2d200 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2d210 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2d220 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2d230 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2d240 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2d250 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2d260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d270 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2d280 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2d290 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
2d2a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d2b0 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
2d2c0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2d2d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2d2e0 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
2d2f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
2d300 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
2d310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d320 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2d330 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
2d340 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2d350 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2d360 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
2d370 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2d380 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
2d390 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2d3a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d3b0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2d3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d3d0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2d3e0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2d3f0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2d400 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
2d430 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
2d440 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
2d450 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2d460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2d470 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2d480 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2d490 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2d4a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d4b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d4c0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2d4d0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2d4e0 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
2d4f0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2d500 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
2d510 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2d520 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2d530 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
2d540 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 61   always set to a
2d550 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
2d560 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
2d570 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
2d580 61 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21  assert( iAuxArg!
2d590 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
2d5a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2d5b0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2d5c0 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
2d5d0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2d5e0 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
2d5f0 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
2d600 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2d610 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2d620 42 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20  BCLAUSE)!=0.    
2d630 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2d640 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d  This is one term
2d650 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69   of an OR-optimi
2d660 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  zation using the
2d670 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
2d680 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54  a.        ** WIT
2d690 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2d6a0 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61  .  No need for a
2d6b0 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20   separate index 
2d6c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  */.        iInde
2d6d0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
2d6e0 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20  TabCur;.        
2d6f0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  op = 0;.      }e
2d700 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  lse if( pWInfo->
2d710 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
2d720 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20  S_OFF ){.       
2d730 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61   Index *pJ = pTa
2d740 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e  bItem->pTab->pIn
2d750 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e  dex;.        iIn
2d760 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
2d770 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d780 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2d790 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2d7a0 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  IRED );.        
2d7b0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a  while( ALWAYS(pJ
2d7c0 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a  ) && pJ!=pIx ){.
2d7d0 20 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78            iIndex
2d7e0 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Cur++;.         
2d7f0 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b   pJ = pJ->pNext;
2d800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d810 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2d820 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2d830 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2d840 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75  ss[1] = iIndexCu
2d850 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
2d860 66 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77  f( iAuxArg && (w
2d870 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2d880 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
2d890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  =0 ){.        iI
2d8a0 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72  ndexCur = iAuxAr
2d8b0 67 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  g;.        op = 
2d8c0 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20  OP_ReopenIdx;.  
2d8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d8e0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
2d8f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2d900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
2d910 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2d920 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2d930 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
2d940 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
2d950 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
2d960 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
2d970 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 );.      if( o
2d980 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
2d990 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2d9a0 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c  , op, iIndexCur,
2d9b0 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29   pIx->tnum, iDb)
2d9c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d9d0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
2d9e0 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
2d9f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
2da00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2da10 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21  ERE_CONSTRAINT)!
2da20 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2da30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2da40 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
2da50 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53  ANGE|WHERE_SKIPS
2da60 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  CAN))==0.       
2da70 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2da80 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
2da90 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20  RDERBY_MIN)==0. 
2daa0 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
2dab0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48  o->eDistinct!=WH
2dac0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2dad0 45 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b 0a  ERED.        ){.
2dae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2daf0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2db00 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b   OPFLAG_SEEKEQ);
2db10 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44   /* Hint to COMD
2db20 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  B2 */.        }.
2db30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2db40 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2db50 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64  x->zName));.#ifd
2db60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2db70 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2db80 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  K.        {.    
2db90 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65        u64 colUse
2dba0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
2dbb0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20   int ii, jj;.   
2dbc0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
2dbd0 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   ii<pIx->nColumn
2dbe0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2dbf0 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61       jj = pIx->a
2dc00 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20  iColumn[ii];.   
2dc10 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c           if( jj<
2dc20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2dc30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2dc40 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20  >63 ) jj = 63;. 
2dc50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2dc60 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2dc70 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29  d & MASKBIT(jj))
2dc80 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
2dca0 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c  sed |= ((u64)1)<
2dcb0 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36  <(ii<63 ? ii : 6
2dcc0 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
2dcd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dce0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
2dcf0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
2dd00 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c  d, iIndexCur, 0,
2dd10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd30 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65      (u8*)&colUse
2dd40 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  d, P4_INT64);.  
2dd50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
2dd60 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
2dd70 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2dd80 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2dd90 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  }.    if( iDb>=0
2dda0 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
2ddb0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2ddc0 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
2ddd0 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
2dde0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2ddf0 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
2de00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2de10 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2de20 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
2de30 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2de40 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
2de50 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
2de60 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
2de70 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
2de80 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
2de90 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
2dea0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
2deb0 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
2dec0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
2ded0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
2dee0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78  {.    int addrEx
2def0 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77  plain;.    int w
2df00 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  sFlags;.    pLev
2df10 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2df20 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  ii];.    wsFlags
2df30 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2df40 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e  p->wsFlags;.#ifn
2df50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2df60 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
2df70 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2df80 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2df90 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
2dfa0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2dfb0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2dfc0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2dfd0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20   &pWInfo->sWC,. 
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2dff0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2e000 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52  el->iFrom], notR
2e010 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
2e020 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2e030 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2e040 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2e050 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2e060 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d     addrExplain =
2e070 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2e080 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
2e090 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
2e0a0 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 77  bList, pLevel, w
2e0b0 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b  ctrlFlags.    );
2e0c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2e0d0 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
2e0e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2e0f0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2e100 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  = sqlite3WhereCo
2e110 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2e120 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
2e130 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
2e140 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
2e150 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
2e160 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
2e170 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
2e180 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61  ==0 && (wctrlFla
2e190 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  gs&WHERE_OR_SUBC
2e1a0 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2e1b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
2e1c0 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
2e1d0 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2e1e0 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
2e1f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e200 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
2e210 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2e220 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
2e230 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
2e240 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
2e250 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
2e260 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
2e270 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
2e280 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
2e290 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2e2a0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2e2b0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2e2c0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2e2d0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2e2e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e2f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2e300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2e310 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
2e320 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
2e330 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e340 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2e350 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2e360 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
2e370 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
2e380 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
2e390 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
2e3a0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
2e3b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2e3c0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2e3d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2e3e0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
2e3f0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
2e400 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2e410 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2e420 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2e430 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2e440 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2e450 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2e460 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
2e470 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2e480 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
2e490 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  e"));.  sqlite3E
2e4a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2e4b0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
2e4c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2e4d0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2e4e0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2e4f0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2e500 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2e510 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2e520 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  p;.    if( pLeve
2e530 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2e540 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e550 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2e560 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  AD_DISTINCT.    
2e570 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d    int addrSeek =
2e580 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
2e590 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  *pIdx;.      int
2e5a0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   n;.      if( pW
2e5b0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2e5c0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2e5d0 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26  ORDERED.       &
2e5e0 26 20 69 3d 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65  & i==pWInfo->nLe
2e5f0 76 65 6c 2d 31 20 20 2f 2a 20 54 69 63 6b 65 74  vel-1  /* Ticket
2e600 20 5b 65 66 39 33 31 38 37 35 37 62 31 35 32 65   [ef9318757b152e
2e610 33 5d 20 32 30 31 37 2d 31 30 2d 32 31 20 2a 2f  3] 2017-10-21 */
2e620 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2e630 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2e640 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2e650 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d        && (pIdx =
2e660 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e670 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74  pIndex)->hasStat
2e680 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d  1.       && (n =
2e690 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2e6a0 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20  nIdxCol)>0.     
2e6b0 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2e6c0 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2e6d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2e6e0 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2e6f0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2e700 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2e710 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2e720 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2e730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e740 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2e750 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2e760 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2e770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2e780 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2e790 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2e7a0 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2e7b0 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2e7c0 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2e7d0 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2e7e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e7f0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2e800 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2e810 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2e820 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2e830 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2e840 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2e850 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2e860 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2e870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2e890 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2e8a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2e8b0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2e8c0 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2e8d0 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2e8e0 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2e8f0 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2e900 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2e910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2e920 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2e930 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2e940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e950 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2e960 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2e970 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2e980 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2e990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e9a0 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2e9b0 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2e9c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2e9d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2e9e0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2e9f0 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2ea00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2ea10 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2ea20 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2ea30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2ea40 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2ea50 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65  P_VNext);.#ifnde
2ea60 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2ea70 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49  _SKIPAHEAD_DISTI
2ea80 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64  NCT.      if( ad
2ea90 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33  drSeek ) sqlite3
2eaa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2eab0 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69  addrSeek);.#endi
2eac0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2ead0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2eae0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2eaf0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2eb00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2eb10 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2eb20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2eb30 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2eb40 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2eb50 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2eb60 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2eb70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2eb80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2eb90 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2eba0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2ebb0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2ebc0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2ebd0 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2ebe0 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2ebf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ec00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ec10 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2ec20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ec30 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2ec40 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2ec50 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 6e 50       if( pIn->nP
2ec60 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20  refix ){.       
2ec70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2ec80 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2ec90 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20  ERE_IN_EARLYOUT 
2eca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2ecb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ecc0 49 6e 74 28 76 2c 20 4f 50 5f 49 66 4e 6f 48 6f  Int(v, OP_IfNoHo
2ecd0 70 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  pe, pLevel->iIdx
2ece0 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
2ed10 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 0a  rrentAddr(v)+2,.
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2ed40 6e 2d 3e 69 42 61 73 65 2c 20 70 49 6e 2d 3e 6e  n->iBase, pIn->n
2ed50 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Prefix);.       
2ed60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2ed70 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
2ed80 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2ed90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2eda0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2edb0 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2edc0 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2edd0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2ede0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2edf0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2ee00 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2ee10 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  opOp==OP_Prev);.
2ee20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2ee30 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2ee40 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2ee50 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Next);.        }
2ee60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ee70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ee80 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
2ee90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2eea0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2eeb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2eec0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2eed0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2eee0 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
2eef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2ef00 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2ef10 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2ef20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ef30 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20  "next skip-scan 
2ef40 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75  on %s", pLoop->u
2ef50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
2ef60 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
2ef70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2ef80 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2ef90 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71  rSkip);.      sq
2efa0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2efb0 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2efc0 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a  rSkip-2);.    }.
2efd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
2efe0 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
2eff0 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70  _BLOBS.    if( p
2f000 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2f010 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ep ){.      sqli
2f020 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f030 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
2f040 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e  , (int)(pLevel->
2f050 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29  iLikeRepCntr>>1)
2f060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f070 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
2f080 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
2f090 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2f0a0 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
2f0b0 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
2f0c0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2f0d0 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
2f0e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
2f0f0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
2f100 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2f110 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
2f120 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
2f130 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2f150 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
2f160 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26  NLY)==0 || (ws &
2f170 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
2f180 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2f190 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
2f1a0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
2f1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
2f1c0 65 6c 2d 3e 69 54 61 62 43 75 72 3d 3d 70 54 61  el->iTabCur==pTa
2f1d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2f1e0 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20  >iFrom].iCursor 
2f1f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f200 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2f210 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
2f220 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
2f230 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f240 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2f250 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  XED) .       || 
2f260 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  ((ws & WHERE_MUL
2f270 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c  TI_OR) && pLevel
2f280 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20  ->u.pCovidx) .  
2f290 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
2f2a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f2b0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
2f2c0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
2f2d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f2e0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
2f2f0 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
2f300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f310 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2f320 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
2f330 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
2f340 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
2f350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f360 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2f370 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
2f380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2f390 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f3a0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
2f3b0 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65  }.    VdbeModule
2f3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2f3d0 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
2f3e0 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  s", i,.         
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
2f400 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2f410 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70  pLevel->iFrom].p
2f420 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2f430 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
2f440 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
2f450 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
2f460 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
2f470 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
2f480 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
2f490 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2f4a0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
2f4b0 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72  Break);..  asser
2f4c0 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
2f4d0 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  l<=pTabList->nSr
2f4e0 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  c );.  for(i=0, 
2f4f0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2f500 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
2f510 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  el; i++, pLevel+
2f520 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c  +){.    int k, l
2f530 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20  ast;.    VdbeOp 
2f540 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20  *pOp;.    Index 
2f550 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
2f560 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2f570 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
2f580 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2f590 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2f5a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
2f5b0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2f5c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
2f5d0 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  0 );.    pLoop =
2f5e0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2f5f0 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63  ..    /* For a c
2f600 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67  o-routine, chang
2f610 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e all OP_Column 
2f620 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2f630 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
2f640 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  * the co-routine
2f650 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66   into OP_Copy of
2f660 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65   result containe
2f670 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  d in a register.
2f680 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64  .    ** OP_Rowid
2f690 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c   becomes OP_Null
2f6a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f6b0 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
2f6c0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
2f6d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
2f6e0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2f6f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
2f700 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
2f710 6f 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c  oCopy(pParse, pL
2f720 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20  evel->addrBody, 
2f730 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
2f740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
2f760 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
2f770 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  , 0);.      cont
2f780 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2f790 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e   /* If this scan
2f7a0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
2f7b0 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73  make VDBE code s
2f7c0 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
2f7d0 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
2f7e0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
2f7f0 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20  instead of from 
2f800 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20  the table where 
2f810 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f  possible.  In so
2f820 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20  me cases.    ** 
2f830 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
2f840 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74  n prevents the t
2f850 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62  able from ever b
2f860 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68  eing read, which
2f870 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c   can.    ** yiel
2f880 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20  d a significant 
2f890 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
2f8a0 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  t..    ** .    *
2f8b0 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
2f8c0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
2f8d0 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
2f8e0 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
2f8f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
2f900 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
2f910 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
2f920 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
2f930 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
2f940 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
2f950 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
2f960 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
2f970 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
2f980 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
2f990 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
2f9a0 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
2f9b0 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
2f9c0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
2f9d0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
2f9e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
2f9f0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
2fa00 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
2fa10 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2fa20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
2fa30 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2fa40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2fa50 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2fa60 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
2fa70 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2fa80 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2fa90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2faa0 70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57  pIdx.     && (pW
2fab0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2fac0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21  ONEPASS_OFF || !
2fad0 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
2fae0 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20  Table)).     && 
2faf0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
2fb00 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c  d.    ){.      l
2fb10 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
2fb20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2fb30 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
2fb40 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
2fb50 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
2fb60 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
2fb70 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
2fb80 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
2fb90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
2fba0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
2fbb0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
2fbc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
2fbd0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
2fbe0 6f 6c 75 6d 6e 0a 23 69 66 64 65 66 20 53 51 4c  olumn.#ifdef SQL
2fbf0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
2fc00 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
2fc10 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f      || pOp->opco
2fc20 64 65 3d 3d 4f 50 5f 4f 66 66 73 65 74 0a 23 65  de==OP_Offset.#e
2fc30 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a  ndif.        ){.
2fc40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
2fc50 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
2fc60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
2fc70 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20  x->pTable==pTab 
2fc80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2fc90 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2fca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fcb0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
2fcc0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
2fcd0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
2fce0 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
2fcf0 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20  aiColumn[x];.   
2fd00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2fd10 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
2fd20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78     }.          x
2fd30 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
2fd40 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29  OfIndex(pIdx, x)
2fd50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fd60 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x>=0 ){.        
2fd70 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b      pOp->p2 = x;
2fd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
2fd90 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2fda0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2fdb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
2fdc0 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
2fdd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2fde0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e  X_ONLY)==0 || x>
2fdf0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2fe00 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e    || pWInfo->eOn
2fe10 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20  ePass );.       
2fe20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
2fe30 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
2fe40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
2fe50 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2fe60 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2fe70 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
2fe80 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
2fe90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fea0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2feb0 49 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  IfNullRow ){.   
2fec0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
2fed0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2fee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ff00 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
2ff10 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
2ff20 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2ff30 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2ff40 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
2ff50 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
2ff60 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.