/ Hex Artifact Content
Login

Artifact 6ff3ef076485dd71efbbabcc7ddc0473c04a9bdcb524128939757b002466f2d1:


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 49 6e 20 74 68 65 20 4f 52 44 45 52 20  ** In the ORDER 
08e0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
08f0: 61 74 69 6f 6e 2c 20 69 66 20 74 68 65 20 69 6e  ation, if the in
0900: 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 73  ner-most loop is
0910: 20 6b 6e 6f 77 6e 0a 2a 2a 20 74 6f 20 65 6d 69   known.** to emi
0920: 74 20 72 6f 77 73 20 69 6e 20 69 6e 63 72 65 61  t rows in increa
0930: 73 69 6e 67 20 6f 72 64 65 72 2c 20 61 6e 64 20  sing order, and 
0940: 69 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  if the last row 
0950: 65 6d 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a  emitted by the.*
0960: 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f  * inner-most loo
0970: 70 20 64 69 64 20 6e 6f 74 20 66 69 74 20 77 69  p did not fit wi
0980: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  thin the sorter,
0990: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 73 6b 69   then we can ski
09a0: 70 20 61 6c 6c 0a 2a 2a 20 73 75 62 73 65 71 75  p all.** subsequ
09b0: 65 6e 74 20 72 6f 77 73 20 66 6f 72 20 74 68 65  ent rows for the
09c0: 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69   current iterati
09d0: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  on of the inner 
09e0: 6c 6f 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  loop (because th
09f0: 65 79 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  ey.** will not f
0a00: 69 74 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  it in the sorter
0a10: 20 65 69 74 68 65 72 29 20 61 6e 64 20 63 6f 6e   either) and con
0a20: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 73  tinue with the s
0a30: 65 63 6f 6e 64 20 69 6e 6e 65 72 0a 2a 2a 20 6c  econd inner.** l
0a40: 6f 6f 70 20 2d 20 74 68 65 20 6c 6f 6f 70 20 69  oop - the loop i
0a50: 6d 6d 65 64 69 61 74 65 6c 79 20 6f 75 74 73 69  mmediately outsi
0a60: 64 65 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  de the inner-mos
0a70: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  t..**.** When a 
0a80: 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  row does not fit
0a90: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 28   in the sorter (
0aa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 6f 72 74  because the sort
0ab0: 65 72 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  er already.** ho
0ac0: 6c 64 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  lds LIMIT+OFFSET
0ad0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 73   rows that are s
0ae0: 6d 61 6c 6c 65 72 29 2c 20 74 68 65 6e 20 61 20  maller), then a 
0af0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
0b00: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 72 65 74  the.** label ret
0b10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
0b20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
0b30: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
0b40: 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  MIT optimization
0b50: 20 61 70 70 6c 69 65 73 2c 20 74 68 65 20 6a 75   applies, the ju
0b60: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73  mp destination s
0b70: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20  hould.** be the 
0b80: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72  continuation for
0b90: 20 74 68 65 20 73 65 63 6f 6e 64 2d 69 6e 6e 65   the second-inne
0ba0: 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20 20 49 66  r-most loop.  If
0bb0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
0bc0: 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a 61 74   LIMIT optimizat
0bd0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ion does not app
0be0: 6c 79 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ly, then the jum
0bf0: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 68  p destination sh
0c00: 6f 75 6c 64 0a 2a 2a 20 62 65 20 74 68 65 20 63  ould.** be the c
0c10: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 66 6f 72 20  ontinuation for 
0c20: 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c  the inner-most l
0c30: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  oop..**.** It is
0c40: 20 61 6c 77 61 79 73 20 73 61 66 65 20 66 6f 72   always safe for
0c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
0c60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74   return the cont
0c70: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  inuation of the.
0c80: 2a 2a 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  ** inner-most lo
0c90: 6f 70 2c 20 69 6e 20 74 68 65 20 73 65 6e 73 65  op, in the sense
0ca0: 20 74 68 61 74 20 61 20 63 6f 72 72 65 63 74 20   that a correct 
0cb0: 61 6e 73 77 65 72 20 77 69 6c 6c 20 72 65 73 75  answer will resu
0cc0: 6c 74 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 69  lt.  .** Returni
0cd0: 6e 67 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ng the continuat
0ce0: 69 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ion the second i
0cf0: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 61 6e 20  nner loop is an 
0d00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
0d10: 74 68 61 74 20 6d 69 67 68 74 20 6d 61 6b 65 20  that might make 
0d20: 74 68 65 20 63 6f 64 65 20 72 75 6e 20 61 20 6c  the code run a l
0d30: 69 74 74 6c 65 20 66 61 73 74 65 72 2c 20 62 75  ittle faster, bu
0d40: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  t should not cha
0d50: 6e 67 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  nge.** the final
0d60: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
0d70: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
0d80: 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c  rByLimitOptLabel
0d90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0da0: 66 6f 29 7b 0a 20 20 57 68 65 72 65 4c 65 76 65  fo){.  WhereLeve
0db0: 6c 20 2a 70 49 6e 6e 65 72 3b 0a 20 20 69 66 28  l *pInner;.  if(
0dc0: 20 21 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72   !pWInfo->bOrder
0dd0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
0de0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
0df0: 42 59 20 4c 49 4d 49 54 20 6f 70 74 69 6d 69 7a  BY LIMIT optimiz
0e00: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ation does not a
0e10: 70 70 6c 79 2e 20 20 4a 75 6d 70 20 74 6f 20 74  pply.  Jump to t
0e20: 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 69  he .    ** conti
0e30: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  nuation of the i
0e40: 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 2e 20  nner-most loop. 
0e50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 57  */.    return pW
0e60: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
0e70: 0a 20 20 7d 0a 20 20 70 49 6e 6e 65 72 20 3d 20  .  }.  pInner = 
0e80: 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66  &pWInfo->a[pWInf
0e90: 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 3b 0a 20 20  o->nLevel-1];.  
0ea0: 61 73 73 65 72 74 28 20 70 49 6e 6e 65 72 2d 3e  assert( pInner->
0eb0: 61 64 64 72 4e 78 74 21 3d 30 20 29 3b 0a 20 20  addrNxt!=0 );.  
0ec0: 72 65 74 75 72 6e 20 70 49 6e 6e 65 72 2d 3e 61  return pInner->a
0ed0: 64 64 72 4e 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ddrNxt;.}../*.**
0ee0: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
0ef0: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
0f00: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
0f10: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e 75  order to continu
0f20: 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
0f30: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
0f40: 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c  ow of a WHERE cl
0f50: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
0f60: 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
0f70: 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  eLabel(WhereInfo
0f80: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73   *pWInfo){.  ass
0f90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ert( pWInfo->iCo
0fa0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 72  ntinue!=0 );.  r
0fb0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43  eturn pWInfo->iC
0fc0: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
0fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
0fe0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
0ff0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
1000: 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a   order to break.
1010: 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52  ** out of a WHER
1020: 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  E loop..*/.int s
1030: 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
1040: 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20  Label(WhereInfo 
1050: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
1060: 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  rn pWInfo->iBrea
1070: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
1080: 72 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28  rn ONEPASS_OFF (
1090: 30 29 20 69 66 20 61 6e 20 55 50 44 41 54 45 20  0) if an UPDATE 
10a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10b0: 65 6e 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ent is unable to
10c0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 64 69 72 65  .** operate dire
10d0: 63 74 6c 79 20 6f 6e 20 74 68 65 20 72 6f 77 69  ctly on the rowi
10e0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
10f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
1100: 65 74 75 72 6e 0a 2a 2a 20 4f 4e 45 50 41 53 53  eturn.** ONEPASS
1110: 5f 53 49 4e 47 4c 45 20 28 31 29 20 69 66 20 74  _SINGLE (1) if t
1120: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  he statement can
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 72 65 63   operation direc
1140: 74 6c 79 20 62 65 63 61 75 73 65 20 6f 6e 6c 79  tly because only
1150: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  .** a single row
1160: 20 69 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65   is to be change
1170: 64 2e 20 20 52 65 74 75 72 6e 20 4f 4e 45 50 41  d.  Return ONEPA
1180: 53 53 5f 4d 55 4c 54 49 20 28 32 29 20 69 66 20  SS_MULTI (2) if 
1190: 74 68 65 20 6f 6e 65 2d 70 61 73 73 0a 2a 2a 20  the one-pass.** 
11a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
11b0: 20 62 65 20 75 73 65 64 20 6f 6e 20 6d 75 6c 74   be used on mult
11c0: 69 70 6c 65 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iple .**.** If t
11d0: 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
11e0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
11f0: 28 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65  (if this routine
1200: 20 72 65 74 75 72 6e 73 20 74 72 75 65 29 0a 2a   returns true).*
1210: 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  * then also writ
1220: 65 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  e the indices of
1230: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 75 73   open cursors us
1240: 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a 2a 2a  ed by ONEPASS.**
1250: 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d 20 61   into aiCur[0] a
1260: 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20 69 61  nd aiCur[1].  ia
1270: 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68 65 20  Cur[0] gets the 
1280: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 64 61  cursor of the da
1290: 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  ta.** table and 
12a0: 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20 74 68  iaCur[1] gets th
12b0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  e cursor used by
12c0: 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 69 6e   an auxiliary in
12d0: 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72 20 76  dex..** Either v
12e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31 2c 20  alue may be -1, 
12f0: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1300: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 75 73  cursor is not us
1310: 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72 73 6f  ed..** Any curso
1320: 72 73 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  rs returned will
1330: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1340: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  d for writing..*
1350: 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20 61 6e  *.** aiCur[0] an
1360: 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74 68 20  d aiCur[1] both 
1370: 67 65 74 20 2d 31 20 69 66 20 74 68 65 20 77 68  get -1 if the wh
1380: 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67 69 63  ere-clause logic
1390: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
13a0: 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53 53   use the ONEPASS
13b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
13c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
13d0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
13e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 69  eInfo *pWInfo, i
13f0: 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20 6d 65  nt *aiCur){.  me
1400: 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57 49 6e  mcpy(aiCur, pWIn
1410: 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
1420: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 29  , sizeof(int)*2)
1430: 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1440: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
1450: 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1460: 61 63 65 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  ace && pWInfo->e
1470: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
1480: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  _OFF ){.    sqli
1490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
14a0: 25 73 20 63 75 72 73 6f 72 73 3a 20 25 64 20 25  %s cursors: %d %
14b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
14c0: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
14d0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
14e0: 3f 20 22 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  ? "ONEPASS_SINGL
14f0: 45 22 20 3a 20 22 4f 4e 45 50 41 53 53 5f 4d 55  E" : "ONEPASS_MU
1500: 4c 54 49 22 2c 0a 20 20 20 20 20 20 20 20 20 61  LTI",.         a
1510: 69 43 75 72 5b 30 5d 2c 20 61 69 43 75 72 5b 31  iCur[0], aiCur[1
1520: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
1530: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
1540: 65 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  eOnePass;.}../*.
1550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6e 74  ** Move the cont
1560: 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e 74 6f  ent of pSrc into
1570: 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74 69 63   pDest.*/.static
1580: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d 6f 76   void whereOrMov
1590: 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a 70 44  e(WhereOrSet *pD
15a0: 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65 74 20  est, WhereOrSet 
15b0: 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73 74 2d  *pSrc){.  pDest-
15c0: 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a 20 20  >n = pSrc->n;.  
15d0: 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 61 2c  memcpy(pDest->a,
15e0: 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73 74 2d   pSrc->a, pDest-
15f0: 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73 74 2d  >n*sizeof(pDest-
1600: 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >a[0]));.}../*.*
1610: 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72 74 20  * Try to insert 
1620: 61 20 6e 65 77 20 70 72 65 72 65 71 75 69 73 69  a new prerequisi
1630: 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20 69 6e  te/cost entry in
1640: 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72 53 65  to the WhereOrSe
1650: 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  t pSet..**.** Th
1660: 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69 67 68  e new entry migh
1670: 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e 20 65  t overwrite an e
1680: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c 20 6f  xisting entry, o
1690: 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
16a0: 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20 69 74   appended, or it
16b0: 20 6d 69 67 68 74 20 62 65 20 64 69 73 63 61 72   might be discar
16c0: 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65 76 65  ded.  Do whateve
16d0: 72 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  r is the right t
16e0: 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61 74 20  hing.** so that 
16f0: 70 53 65 74 20 6b 65 65 70 73 20 74 68 65 20 4e  pSet keeps the N
1700: 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20 65 6e  _OR_COST best en
1710: 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20 66 61  tries seen so fa
1720: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1730: 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 0a   whereOrInsert(.
1740: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53    WhereOrSet *pS
1750: 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  et,      /* The 
1760: 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20 62 65  WhereOrSet to be
1770: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 42 69   updated */.  Bi
1780: 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20 20 20  tmask prereq,   
1790: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 69       /* Prerequi
17a0: 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e 65 77  sites of the new
17b0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
17c0: 73 74 20 72 52 75 6e 2c 20 20 20 20 20 20 20 20  st rRun,        
17d0: 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74 20 6f     /* Run-cost o
17e0: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
17f0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  */.  LogEst nOut
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1810: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1820: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
1830: 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 69  ry */.){.  u16 i
1840: 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73 74 20  ;.  WhereOrCost 
1850: 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53 65 74  *p;.  for(i=pSet
1860: 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61 3b 20  ->n, p=pSet->a; 
1870: 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29 7b 0a  i>0; i--, p++){.
1880: 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d 70 2d      if( rRun<=p-
1890: 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72 65 71  >rRun && (prereq
18a0: 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d 3d 70   & p->prereq)==p
18b0: 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 67  rereq ){.      g
18c0: 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73 65 72  oto whereOrInser
18d0: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  t_done;.    }.  
18e0: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
18f0: 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65 72 65  Run && (p->prere
1900: 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70 2d 3e  q & prereq)==p->
1910: 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  prereq ){.      
1920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1930: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 2d 3e    }.  if( pSet->
1940: 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b 0a 20  n<N_OR_COST ){. 
1950: 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e 61 5b     p = &pSet->a[
1960: 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20 20 20  pSet->n++];.    
1970: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
1980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1990: 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20 66 6f   pSet->a;.    fo
19a0: 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d 3e 6e  r(i=1; i<pSet->n
19b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c0: 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74 2d 3e  ( p->rRun>pSet->
19d0: 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20 3d 20  a[i].rRun ) p = 
19e0: 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20 20 20  pSet->a + i;.   
19f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 52   }.    if( p->rR
1a00: 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74 75 72  un<=rRun ) retur
1a10: 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65 4f 72  n 0;.  }.whereOr
1a20: 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20 20 70  Insert_done:.  p
1a30: 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
1a40: 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d 20 72  q;.  p->rRun = r
1a50: 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  Run;.  if( p->nO
1a60: 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e 4f 75  ut>nOut ) p->nOu
1a70: 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65 74 75  t = nOut;.  retu
1a80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
1a90: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
1aa0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1ab0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
1ac0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
1ad0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1ae0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 42 69 74   the set..*/.Bit
1af0: 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72  mask sqlite3Wher
1b00: 65 47 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61  eGetMask(WhereMa
1b10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
1b20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
1b30: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b40: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
1b50: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
1b60: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
1b70: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
1b80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1b90: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
1ba0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
1bc0: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
1bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1be0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1bf0: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
1c00: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
1c10: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
1c20: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
1c30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1c40: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
1c50: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
1c60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1c70: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
1c80: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
1c90: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
1ca0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
1cb0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
1cc0: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
1cd0: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
1ce0: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
1cf0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
1d00: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
1d10: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
1d20: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
1d40: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
1d50: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
1d60: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
1d70: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
1d80: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1da0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
1db0: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
1dc0: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
1dd0: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
1de0: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
1df0: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
1e00: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
1e10: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
1e20: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
1e30: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
1e40: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
1e50: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
1e60: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
1e70: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
1e80: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
1e90: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb0: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
1ec0: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
1ed0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 75 6d   */.  i16 iColum
1ee0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
1ef0: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
1f00: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
1f10: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
1f20: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1f40: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
1f50: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
1f60: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1f70: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
1f80: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
1f90: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fa0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
1fb0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
1fc0: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
1fd0: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
1fe0: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
1ff0: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
2000: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d   pScan->iEquiv<=
2010: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 3b  pScan->nEquiv );
2020: 0a 20 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  .  pWC = pScan->
2030: 70 57 43 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  pWC;.  while(1){
2040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
2050: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
2060: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
2070: 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61  .    iCur = pSca
2080: 6e 2d 3e 61 69 43 75 72 5b 70 53 63 61 6e 2d 3e  n->aiCur[pScan->
2090: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 61  iEquiv-1];.    a
20a0: 73 73 65 72 74 28 20 70 57 43 21 3d 30 20 29 3b  ssert( pWC!=0 );
20b0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66  .    do{.      f
20c0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
20d0: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
20e0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
20f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2100: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2110: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
2120: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
2130: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
2140: 20 20 20 20 20 20 26 26 20 28 69 43 6f 6c 75 6d        && (iColum
2150: 6e 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20 20  n!=XN_EXPR.     
2160: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2170: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2180: 70 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  p(pTerm->pExpr->
2190: 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
21c0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 2c 69 43  can->pIdxExpr,iC
21d0: 75 72 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ur)==0).        
21e0: 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75   && (pScan->iEqu
21f0: 69 76 3c 3d 31 20 7c 7c 20 21 45 78 70 72 48 61  iv<=1 || !ExprHa
2200: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2210: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2220: 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b  oin)).        ){
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2240: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2250: 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a   & WO_EQUIV)!=0.
2260: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
2270: 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61  can->nEquiv<Arra
2280: 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 69 43  ySize(pScan->aiC
2290: 75 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ur).           &
22a0: 26 20 28 70 58 20 3d 20 73 71 6c 69 74 65 33 45  & (pX = sqlite3E
22b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e  xprSkipCollateAn
22c0: 64 4c 69 6b 65 6c 79 28 70 54 65 72 6d 2d 3e 70  dLikely(pTerm->p
22d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e  Expr->pRight))->
22e0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  op.             
22f0: 20 20 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20    ==TK_COLUMN.  
2300: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2310: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
2320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2330: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
2340: 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  iv; j++){.      
2350: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61          if( pSca
2360: 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d  n->aiCur[j]==pX-
2370: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
2380: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
2390: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58  >aiColumn[j]==pX
23a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
23c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23f0: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
2400: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
2410: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43        pScan->aiC
2420: 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  ur[j] = pX->iTab
2430: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2440: 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d    pScan->aiColum
2450: 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  n[j] = pX->iColu
2460: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2470: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b    pScan->nEquiv+
2480: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24a0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
24b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
24c0: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
24d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24e0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
24f0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
2500: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
2510: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
2520: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
2530: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
2540: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2550: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
2570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
2590: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
25a0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25c0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
25d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25e0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
25f0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
2600: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2620: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2640: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2650: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
2660: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2670: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2680: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2690: 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 20 20  rse, pX);.      
26a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
26b0: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
26c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
26d0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
26e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
26f0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
2700: 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  ame, pScan->zCol
2710: 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
2720: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2730: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2740: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2750: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2760: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2770: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
2780: 49 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IS))!=0.        
2790: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
27a0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
27b0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
27c0: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
27d0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
27e0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 0a 20  Scan->aiCur[0]. 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2800: 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61  X->iColumn==pSca
2810: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 0a 20  n->aiColumn[0]. 
2820: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2830: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2840: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
2850: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
2860: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2870: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2890: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
28a0: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
28b0: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31    pScan->k = k+1
28c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
28d0: 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20  turn pTerm;.    
28e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2900: 70 57 43 20 3d 20 70 57 43 2d 3e 70 4f 75 74 65  pWC = pWC->pOute
2910: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
2920: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 57 43 21      }while( pWC!
2930: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  =0 );.    if( pS
2940: 63 61 6e 2d 3e 69 45 71 75 69 76 3e 3d 70 53 63  can->iEquiv>=pSc
2950: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 20 62 72 65  an->nEquiv ) bre
2960: 61 6b 3b 0a 20 20 20 20 70 57 43 20 3d 20 70 53  ak;.    pWC = pS
2970: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20  can->pOrigWC;.  
2980: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63    k = 0;.    pSc
2990: 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a 20 20  an->iEquiv++;.  
29a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 77  ./*.** This is w
29c0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 20 66  hereScanInit() f
29d0: 6f 72 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  or the case of a
29e0: 6e 20 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78  n index on an ex
29f0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 74 20  pression..** It 
2a00: 69 73 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  is factored out 
2a10: 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 20  into a separate 
2a20: 74 61 69 6c 2d 72 65 63 75 72 73 69 6f 6e 20 73  tail-recursion s
2a30: 75 62 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  ubroutine so tha
2a40: 74 0a 2a 2a 20 74 68 65 20 6e 6f 72 6d 61 6c 20  t.** the normal 
2a50: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 20  whereScanInit() 
2a60: 72 6f 75 74 69 6e 65 2c 20 77 68 69 63 68 20 69  routine, which i
2a70: 73 20 61 20 68 69 67 68 2d 72 75 6e 6e 65 72 2c  s a high-runner,
2a80: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6e 65 65   does not.** nee
2a90: 64 20 74 6f 20 70 75 73 68 20 72 65 67 69 73 74  d to push regist
2aa0: 65 72 73 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ers onto the sta
2ab0: 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 69 74  ck as part of it
2ac0: 73 20 70 72 6f 6c 6f 67 75 65 2e 0a 2a 2f 0a 73  s prologue..*/.s
2ad0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2ae0: 4e 4c 49 4e 45 20 57 68 65 72 65 54 65 72 6d 20  NLINE WhereTerm 
2af0: 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74 49 6e  *whereScanInitIn
2b00: 64 65 78 45 78 70 72 28 57 68 65 72 65 53 63 61  dexExpr(WhereSca
2b10: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 70 53 63  n *pScan){.  pSc
2b20: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 73 71 6c  an->idxaff = sql
2b30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
2b40: 28 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72  (pScan->pIdxExpr
2b50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  );.  return wher
2b60: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
2b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
2b80: 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c  alize a WHERE cl
2b90: 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a  ause scanner obj
2ba0: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
2bb0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
2bc0: 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52   first match.  R
2bd0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2be0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
2bf0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  es..**.** The sc
2c00: 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65  anner will be se
2c10: 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45 52  arching the WHER
2c20: 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49  E clause pWC.  I
2c30: 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66  t will look.** f
2c40: 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  or terms of the 
2c50: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
2c60: 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73 20  pr>" where X is 
2c70: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f  column iColumn o
2c80: 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e  f table.** iCur.
2c90: 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30     Or if pIdx!=0
2ca0: 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d   then X is colum
2cb0: 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  n iColumn of ind
2cc0: 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a  ex pIdx.  pIdx.*
2cd0: 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  * must be one of
2ce0: 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20   the indexes of 
2cf0: 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a  table iCur..**.*
2d00: 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20  * The <op> must 
2d10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  be one of the op
2d20: 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62 65  erators describe
2d30: 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a  d by opMask..**.
2d40: 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63 68  ** If the search
2d50: 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68   is for X and th
2d60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
2d70: 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66  ontains terms of
2d80: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59   the.** form X=Y
2d90: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2da0: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65  ne might also re
2db0: 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  turn terms of th
2dc0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70  e form.** "Y <op
2dd0: 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20  > <expr>".  The 
2de0: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
2df0: 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74 79   of transitivity
2e00: 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20   is limited,.** 
2e10: 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f  but is enough to
2e20: 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d   handle most com
2e30: 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20  monly occurring 
2e40: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
2e50: 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f  **.** If X is no
2e60: 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  t the INTEGER PR
2e70: 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58  IMARY KEY then X
2e80: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   must be compati
2e90: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  ble with.** inde
2ea0: 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x pIdx..*/.stati
2eb0: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
2ec0: 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68  reScanInit(.  Wh
2ed0: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  ereScan *pScan, 
2ee0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
2ef0: 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65  reScan object be
2f00: 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ing initialized 
2f10: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2f20: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pWC,       /* 
2f30: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2f40: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
2f50: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2f70: 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f  ursor to scan fo
2f80: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  r */.  int iColu
2f90: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2fa0: 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e  * Column to scan
2fb0: 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70   for */.  u32 op
2fc0: 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
2fd0: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29    /* Operator(s)
2fe0: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
2ff0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
3000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
3010: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
3020: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20  with this index 
3030: 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e 70  */.){.  pScan->p
3040: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
3050: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
3060: 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78 45  ;.  pScan->pIdxE
3070: 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  xpr = 0;.  pScan
3080: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
3090: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
30a0: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 6f   = 0;.  pScan->o
30b0: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
30c0: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
30d0: 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30    pScan->aiCur[0
30e0: 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63 61  ] = iCur;.  pSca
30f0: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->nEquiv = 1;. 
3100: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
3110: 20 31 3b 0a 20 20 69 66 28 20 70 49 64 78 20 29   1;.  if( pIdx )
3120: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 69 43  {.    int j = iC
3130: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43 6f 6c 75  olumn;.    iColu
3140: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
3150: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
3160: 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52  iColumn==XN_EXPR
3170: 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d   ){.      pScan-
3180: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
3190: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
31a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 53  .pExpr;.      pS
31b0: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
31c0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
31d0: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61  ;.      pScan->a
31e0: 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 58 4e 5f  iColumn[0] = XN_
31f0: 45 58 50 52 3b 0a 20 20 20 20 20 20 72 65 74 75  EXPR;.      retu
3200: 72 6e 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74  rn whereScanInit
3210: 49 6e 64 65 78 45 78 70 72 28 70 53 63 61 6e 29  IndexExpr(pScan)
3220: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3230: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
3240: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
3250: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
3260: 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65  XN_ROWID;.    }e
3270: 6c 73 65 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e  lse if( iColumn>
3280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 63 61  =0 ){.      pSca
3290: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78  n->idxaff = pIdx
32a0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
32b0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
32c0: 3b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a  ;.      pScan->z
32d0: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d  CollName = pIdx-
32e0: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
32f0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  }.  }else if( iC
3300: 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29  olumn==XN_EXPR )
3310: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3320: 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43    }.  pScan->aiC
3330: 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c 75  olumn[0] = iColu
3340: 6d 6e 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65  mn;.  return whe
3350: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
3360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
3370: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
3380: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3390: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
33a0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
33b0: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
33c0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
33d0: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
33e0: 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72 20  f table iCur or 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a  of index pIdx.**
3400: 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64 20   if pIdx!=0 and 
3410: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74  <op> is one of t
3420: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
3430: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
3440: 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70  d by.** the op p
3450: 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72  arameter.  Retur
3460: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3470: 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  he term.  Return
3480: 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e   0 if not found.
3490: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d  .**.** If pIdx!=
34a0: 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  0 then it must b
34b0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  e one of the ind
34c0: 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69 43  exes of table iC
34d0: 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68 20  ur.  .** Search 
34e0: 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68 69  for terms matchi
34f0: 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ng the iColumn-t
3500: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78  h column of pIdx
3510: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
3520: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
3530: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
3540: 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Cur..**.** The t
3550: 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67  erm returned mig
3560: 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69  ht by Y=<expr> i
3570: 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68  f there is anoth
3580: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  er constraint in
3590: 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
35a0: 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66  ause that specif
35b0: 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41  ies that X=Y.  A
35c0: 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69  ny such constrai
35d0: 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  nts will be.** i
35e0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
35f0: 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e   WO_EQUIV bit in
3600: 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65   the pTerm->eOpe
3610: 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68  rator field.  Th
3620: 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43  e.** aiCur[]/iaC
3630: 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68  olumn[] arrays h
3640: 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69 74  old X and all it
3650: 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20 54  s equivalents. T
3660: 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20 73  here are 11.** s
3670: 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f  lots in aiCur[]/
3680: 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68  aiColumn[] so th
3690: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
36a0: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
36b0: 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65  up to 10.** othe
36c0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c  r equivalent val
36d0: 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73 65  ues.  Hence a se
36e0: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
36f0: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
3700: 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d   X=A1.** and A1=
3710: 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e 64  A2 and A2=A3 and
3720: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
3730: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
3740: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
3750: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
3760: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
3770: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
3780: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
3790: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
37a0: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
37b0: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
37c0: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
37d0: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
37e0: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
37f0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
3800: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
3810: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
3820: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
3830: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
3840: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
3850: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
3860: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
3870: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
3880: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
3890: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
38a0: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
38b0: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
38c0: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
38d0: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
38e0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
38f0: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65  WO_EQUIV..*/.Whe
3900: 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33 57  reTerm *sqlite3W
3910: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20 20  hereFindTerm(.  
3920: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3930: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
3940: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
3950: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
3960: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
3970: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3980: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3990: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
39a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
39b0: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
39c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
39d0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
39e0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
39f0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
3a00: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3a20: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
3a30: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
3a40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
3a50: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
3a60: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
3a70: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
3a80: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
3a90: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
3aa0: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
3ab0: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
3ac0: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
3ad0: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
3ae0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
3af0: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
3b00: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
3b10: 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51  );.  op &= WO_EQ
3b20: 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28  |WO_IS;.  while(
3b30: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
3b40: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
3b50: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
3b60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
3b70: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
3b80: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29  p->eOperator&op)
3b90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
3ba0: 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65  estcase( p->eOpe
3bb0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
3bc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3bd0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
3be0: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
3bf0: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
3c00: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
3c10: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
3c20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3c30: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pResult;.}../*.*
3c40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3c50: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
3c60: 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  or an entry that
3c70: 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f   matches the iCo
3c80: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  l-th column.** o
3c90: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
3ca0: 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65  .** If such an e
3cb0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
3cc0: 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e  nd, its index in
3cd0: 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72   pList->a[] is r
3ce0: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e  eturned. If.** n
3cf0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  o expression is 
3d00: 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74  found, -1 is ret
3d10: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
3d20: 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f   int findIndexCo
3d30: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
3d40: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
3d50: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
3d70: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3d90: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
3da0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
3db0: 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20   iBase,         
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3dd0: 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65  Cursor for table
3de0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3df0: 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
3e00: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
3e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
3e20: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c  dex to match col
3e30: 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  umn of */.  int 
3e40: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3e60: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
3e70: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
3e80: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
3e90: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
3ea0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b  x->azColl[iCol];
3eb0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
3ec0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3ed0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
3ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
3ef0: 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79  CollateAndLikely
3f00: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
3f10: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
3f20: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
3f30: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
3f40: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
3f50: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
3f60: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
3f70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
3f80: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
3f90: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
3fa0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
3fb0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
3fc0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
3fd0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
3fe0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
3ff0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4000: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
4010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
4020: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
4030: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
4040: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
4050: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  of index pIdx is
4060: 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61   NOT NULL.*/.sta
4070: 74 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c  tic int indexCol
4080: 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78  umnNotNull(Index
4090: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
40a0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
40b0: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
40c0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
40d0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
40e0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20  >nColumn );.  j 
40f0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
4100: 5b 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e  [iCol];.  if( j>
4110: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4120: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
4130: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[j].notNull;.
4140: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28    }else if( j==(
4150: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
4160: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
4170: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32    assert( j==(-2
4180: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
4190: 30 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e  0;  /* Assume an
41a0: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
41b0: 69 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79  ion can always y
41c0: 69 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a  ield a NULL */..
41d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
41e0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
41f0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
4200: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
4210: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
4220: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
4230: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
4240: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
4250: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
4260: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
4270: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
4280: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
4290: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
42a0: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
42b0: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
42c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42d0: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
42e0: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
42f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
4300: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4310: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
4320: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
4330: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
4340: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
4350: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4360: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4370: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
4380: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
4390: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
43a0: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
43b0: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
43c0: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
43d0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
43e0: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
4410: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
4420: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
4430: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
4440: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
4450: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
4460: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
4470: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
4480: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
4490: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
44a0: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
44b0: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
44c0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
44d0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
44e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
44f0: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
4500: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
4510: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
4520: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
4530: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
4540: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
4550: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
4560: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
4570: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
4580: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
4590: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
45a0: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
45b0: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
45c0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
45d0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
45e0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
45f0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
4600: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
4610: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
4620: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
4630: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
4640: 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70  llateAndLikely(p
4650: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
4660: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
4670: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
4680: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
4690: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
46a0: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
46b0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
46c0: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
46d0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
46e0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
46f0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
4700: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
4710: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
4720: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
4730: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
4740: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
4750: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
4760: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
4770: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
4780: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4790: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
47a0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
47b0: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
47c0: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
47d0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
47e0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
47f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
4800: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
4810: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
4820: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
4830: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4840: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
4850: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
4860: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
4870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
4880: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
4890: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
48a0: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
48b0: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
48c0: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
48d0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
48e0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
48f0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
4900: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
4910: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
4920: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
4930: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
4940: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
4950: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
4960: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21  Next){.    if( !
4970: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
4980: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
4990: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
49a0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
49b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  +){.      if( 0=
49c0: 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e  =sqlite3WhereFin
49d0: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
49e0: 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  , i, ~(Bitmask)0
49f0: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
4a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  {.        if( fi
4a10: 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
4a20: 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
4a30: 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30 20  ase, pIdx, i)<0 
4a40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4a50: 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d 6e   if( indexColumn
4a60: 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69 29  NotNull(pIdx, i)
4a70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4a80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4a90: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( i==pIdx->nKey
4aa0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Col ){.      /* 
4ab0: 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69  This index impli
4ac0: 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54  es that the DIST
4ad0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69  INCT qualifier i
4ae0: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
4af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
4b10: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
4b20: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
4b30: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
4b40: 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61  nput value to ba
4b50: 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se 2..*/.static 
4b60: 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f  LogEst estLog(Lo
4b70: 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75 72  gEst N){.  retur
4b80: 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71  n N<=10 ? 0 : sq
4b90: 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d  lite3LogEst(N) -
4ba0: 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   33;.}../*.** Co
4bb0: 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  nvert OP_Column 
4bc0: 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43 6f  opcodes to OP_Co
4bd0: 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c 79  py in previously
4be0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2e   generated code.
4bf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4c00: 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67 65  ine runs over ge
4c10: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
4c20: 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65 73  e and translates
4c30: 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70   OP_Column.** op
4c40: 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43 6f  codes into OP_Co
4c50: 70 79 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  py when the tabl
4c60: 65 20 69 73 20 62 65 69 6e 67 20 61 63 63 65 73  e is being acces
4c70: 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74 69  sed via co-routi
4c80: 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  ne .** instead o
4c90: 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b  f via table look
4ca0: 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  up..**.** If the
4cb0: 20 69 41 75 74 6f 69 64 78 43 75 72 20 69 73 20   iAutoidxCur is 
4cc0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61  not zero, then a
4cd0: 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73 74  ny OP_Rowid inst
4ce0: 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20 63  ructions on.** c
4cf0: 75 72 73 6f 72 20 69 54 61 62 43 75 72 20 61 72  ursor iTabCur ar
4d00: 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
4d10: 74 6f 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 6f  to OP_Sequence o
4d20: 70 63 6f 64 65 20 66 6f 72 20 74 68 65 0a 2a 2a  pcode for the.**
4d30: 20 69 41 75 74 6f 69 64 78 43 75 72 20 63 75 72   iAutoidxCur cur
4d40: 73 6f 72 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  sor, in order to
4d50: 20 67 65 6e 65 72 61 74 65 20 75 6e 69 71 75 65   generate unique
4d60: 20 72 6f 77 69 64 73 20 66 6f 72 20 74 68 65 0a   rowids for the.
4d70: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ** automatic ind
4d80: 65 78 20 62 65 69 6e 67 20 67 65 6e 65 72 61 74  ex being generat
4d90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4da0: 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75  id translateColu
4db0: 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72 73  mnToCopy(.  Pars
4dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4dd0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
4de0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  xt */.  int iSta
4df0: 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rt,         /* T
4e00: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74 68  ranslate from th
4e10: 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  is opcode to the
4e20: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54   end */.  int iT
4e30: 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a  abCur,        /*
4e40: 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f   OP_Column/OP_Ro
4e50: 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  wid references t
4e60: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
4e70: 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72 2c    int iRegister,
4e80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72        /* The fir
4e90: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  st column is in 
4ea0: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
4eb0: 0a 20 20 69 6e 74 20 69 41 75 74 6f 69 64 78 43  .  int iAutoidxC
4ec0: 75 72 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ur     /* If non
4ed0: 2d 7a 65 72 6f 2c 20 63 75 72 73 6f 72 20 6f 66  -zero, cursor of
4ee0: 20 61 75 74 6f 69 6e 64 65 78 20 62 65 69 6e 67   autoindex being
4ef0: 20 67 65 6e 65 72 61 74 65 64 20 2a 2f 0a 29 7b   generated */.){
4f00: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4f10: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4f20: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
4f30: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
4f40: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
4f50: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
4f60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4f70: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
4f80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4f90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4fa0: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4fb0: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4fc0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4fd0: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4fe0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4ff0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
5000: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
5010: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
5020: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
5030: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
5040: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
5050: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
5060: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
5070: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
5080: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
5090: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
50a0: 20 20 20 69 66 28 20 69 41 75 74 6f 69 64 78 43     if( iAutoidxC
50b0: 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ur ){.        pO
50c0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53  p->opcode = OP_S
50d0: 65 71 75 65 6e 63 65 3b 0a 20 20 20 20 20 20 20  equence;.       
50e0: 20 70 4f 70 2d 3e 70 31 20 3d 20 69 41 75 74 6f   pOp->p1 = iAuto
50f0: 69 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  idxCur;.      }e
5100: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
5110: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
5120: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
5130: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >p1 = 0;.       
5140: 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
5150: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5160: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
5170: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
5180: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
5190: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
51a0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
51b0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
51c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
51d0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
51e0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
51f0: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
5200: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
5210: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
5220: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
5230: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
5240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5250: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
5260: 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52   && defined(WHER
5270: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
5280: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
5290: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
52a0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
52b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
52c0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
52d0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
52e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
52f0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
5300: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
5310: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
5320: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
5330: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
5340: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
5350: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
5360: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
5370: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
5380: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
5390: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
53a0: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
53b0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
53c0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
53d0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
53e0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
53f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
5400: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
5410: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5420: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
5430: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
5440: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
5450: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
5460: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
5470: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
5480: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
5490: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
54a0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
54b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
54c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
54d0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
54e0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
54f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5500: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
5510: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
5520: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
5530: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
5540: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
5550: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
5560: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
5570: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
5580: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
5590: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
55a0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
55b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
55c0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
55d0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
55e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
55f0: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
5600: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
5610: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5620: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
5630: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
5640: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
5650: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
5660: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
5670: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
5680: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
5690: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t);.  sqlite3Deb
56a0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
56b0: 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e  matedRows=%lld\n
56c0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52  ", p->estimatedR
56d0: 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ows);.}.#else.#d
56e0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
56f0: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
5700: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
5710: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
5720: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5730: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
5740: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
5750: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
5760: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
5770: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
5780: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
5790: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
57a0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
57b0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
57c0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
57d0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
57e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
57f0: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5800: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
5810: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
5820: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
5830: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
5840: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
5850: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5860: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
5870: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
5880: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
5890: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
58b0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
58c0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
58d0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
58e0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
58f0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
5900: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
5910: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5920: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
5930: 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d  (WO_EQ|WO_IS))==
5940: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5950: 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
5960: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
5970: 29 20 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  ) .   && !ExprHa
5980: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
5990: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
59a0: 6f 69 6e 29 0a 20 20 20 26 26 20 28 70 54 65 72  oin).   && (pTer
59b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
59c0: 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 2f  O_IS).  ){.    /
59d0: 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  * Cannot use an 
59e0: 49 53 20 74 65 72 6d 20 66 72 6f 6d 20 74 68 65  IS term from the
59f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 73   WHERE clause as
5a00: 20 61 6e 20 69 6e 64 65 78 20 64 72 69 76 65 72   an index driver
5a10: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
5a20: 52 48 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  RHS of a LEFT JO
5a30: 49 4e 2e 20 53 75 63 68 20 61 20 74 65 72 6d 20  IN. Such a term 
5a40: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
5a50: 20 69 66 20 69 74 20 69 73 20 66 72 6f 6d 0a 20   if it is from. 
5a60: 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 63 6c 61     ** the ON cla
5a70: 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74  use.  */.    ret
5a80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
5a90: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
5aa0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
5ab0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
5ac0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
5ad0: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
5ae0: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
5af0: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
5b00: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
5b10: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5b20: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
5b30: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
5b40: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
5b50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
5b60: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
5b70: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
5b80: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
5b90: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
5ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5bb0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
5bc0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5bd0: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
5be0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
5bf0: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
5c00: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
5c10: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
5c20: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
5c30: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
5c40: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
5c50: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
5c60: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
5c70: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
5c80: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
5c90: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
5ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5cc0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5cd0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
5ce0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
5cf0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5d00: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
5d10: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5d20: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
5d30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5d40: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
5d50: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
5d60: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
5d80: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
5d90: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
5da0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
5db0: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
5dc0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
5dd0: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
5de0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5e10: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
5e20: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
5e30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5e40: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
5e50: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
5e60: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
5e70: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
5e80: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
5e90: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
5ea0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
5eb0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
5ed0: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
5ee0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5ef0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
5f20: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
5f30: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
5f40: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5f60: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
5f70: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
5f80: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
5f90: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
5fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5fb0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
5fc0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
5fd0: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
5fe0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5ff0: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
6000: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
6010: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
6020: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
6030: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
6040: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
6050: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
6060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
6070: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
6080: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
60b0: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60d0: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
60e0: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
60f0: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
6100: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
6110: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
6120: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
6130: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
6140: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
6150: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
6160: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
6170: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6190: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
61a0: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
61b0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
61c0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
61d0: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
61e0: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
61f0: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
6200: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
6210: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
6220: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
6230: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
6240: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
6250: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6260: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
6270: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
6280: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
6290: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
62a0: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
62b0: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
62c0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
62d0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
62e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
62f0: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
6300: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
6310: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
6320: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
6330: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
6340: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  dexed */.  int a
6350: 64 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20  ddrCounter = 0; 
6360: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6370: 73 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20  s where integer 
6380: 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69  counter is initi
6390: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
63a0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
63b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
63c0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68   of registers wh
63d0: 65 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73  ere record is as
63e0: 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a  sembled */..  /*
63f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6400: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
6410: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
6420: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
6430: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
6440: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
6450: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
6460: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
6470: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
6480: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6490: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
64a0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
64b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
64c0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
64d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
64e0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
64f0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
6500: 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65  hat will be adde
6510: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20  d to the index. 
6520: 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20   ** and used to 
6530: 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75  match WHERE clau
6540: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
6550: 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b  /.  nKeyCol = 0;
6560: 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
6570: 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64  ->pTab;.  pWCEnd
6580: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
6590: 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20  nTerm];.  pLoop 
65a0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
65b0: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
65c0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
65d0: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
65e0: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
65f0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6600: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
6610: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
6620: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
6630: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20   EP_FromJoin)   
6640: 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79   /* prereq alway
6650: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20  s non-zero */.  
6660: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
6670: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
6680: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
6690: 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72    /*   for the r
66a0: 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20  ight-hand   */. 
66b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70          || pLoop
66c0: 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20  ->prereq!=0 );  
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66     /*   table of
66f0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
6700: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70      if( pLoop->p
6710: 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26  rereq==0.     &&
6720: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6730: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
6740: 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70  ==0.     && !Exp
6750: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6760: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6770: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
6780: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
6790: 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d  ant(pExpr, pSrc-
67a0: 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >iCursor) ){.   
67b0: 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71     pPartial = sq
67c0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
67d0: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  rse, pPartial,. 
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6800: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
6810: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
6820: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
6830: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
6840: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
6850: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
6860: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6870: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
6880: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
6890: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
68a0: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
68b0: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
68c0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
68d0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
68e0: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
68f0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
6900: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
6910: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
6920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
6930: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
6940: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
6950: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
6960: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
6970: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
6980: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
6990: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
69a0: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
69b0: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
69c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
69d0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
69e0: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
69f0: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
6a00: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
6a10: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
6a20: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
6a30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
6a40: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
6a50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a60: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
6a70: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
6a80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
6a90: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
6aa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
6ac0: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
6ad0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
6ae0: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
6af0: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
6b00: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
6b10: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
6b20: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
6b30: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
6b60: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
6b70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
6b80: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
6b90: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
6ba0: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
6bb0: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
6bc0: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
6bd0: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
6be0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
6bf0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
6c00: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
6c10: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
6c20: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
6c30: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
6c40: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
6c50: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
6c60: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
6c70: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
6c80: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
6c90: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
6ca0: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
6cb0: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
6cc0: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6cd0: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
6ce0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
6cf0: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
6d00: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
6d10: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
6d20: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
6d30: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
6d40: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
6d50: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
6d60: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
6d70: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
6d80: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
6d90: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
6da0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
6db0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6dc0: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
6dd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
6de0: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
6df0: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
6e00: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
6e10: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
6e20: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
6e30: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
6e40: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
6e50: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
6e60: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
6e70: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
6e80: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
6e90: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
6ea0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
6eb0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
6ec0: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
6ed0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
6ee0: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
6ef0: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
6f00: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
6f10: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6f20: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
6f30: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
6f40: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
6f50: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
6f60: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
6f70: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
6f80: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
6f90: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
6fa0: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
6fb0: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
6fc0: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
6fd0: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
6fe0: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
6ff0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
7000: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
7010: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
7020: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
7030: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
7040: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
7050: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
7060: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
7070: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
7080: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
7090: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
70a0: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
70b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
70c0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
70d0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
70e0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
70f0: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
7100: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
7110: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
7120: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
7130: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
7140: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
7150: 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 20  arse, pX);.     
7160: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
7170: 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
7180: 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
7190: 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49  e : sqlite3StrBI
71a0: 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b  NARY;.        n+
71b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
71c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
71d0: 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
71e0: 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
71f0: 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
7200: 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
7210: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
7220: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
7230: 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
7240: 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
7250: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
7260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7270: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
7280: 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
7290: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
72a0: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
72b0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73  x->azColl[n] = s
72c0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
72d0: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
72e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
72f0: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
7300: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
7310: 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
7320: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
7330: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
7340: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
7350: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
7360: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
7370: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
7380: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
7390: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b  .  assert( n==nK
73a0: 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d  eyCol );.  pIdx-
73b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58  >aiColumn[n] = X
73c0: 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d  N_ROWID;.  pIdx-
73d0: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
73e0: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a  ite3StrBINARY;..
73f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
7400: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
7410: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  */.  assert( pLe
7420: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
7430: 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
7440: 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
7450: 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
7460: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7470: 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
7480: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
7490: 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73   nKeyCol+1);.  s
74a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
74b0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
74c0: 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Idx);.  VdbeComm
74d0: 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
74e0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
74f0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
7500: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
7510: 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
7520: 2f 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  /.  pTabItem = &
7530: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61  pWC->pWInfo->pTa
7540: 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
7550: 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70  >iFrom];.  if( p
7560: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
7570: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7580: 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
7590: 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
75a0: 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e  rn;.    addrCoun
75b0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ter = sqlite3Vdb
75c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
75d0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
75e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
75f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
7600: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
7610: 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e  d, 0, pTabItem->
7620: 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
7630: 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c    addrTop =  sql
7640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7650: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
7660: 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
7670: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7680: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
7690: 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 25 73 22  "next row of %s"
76a0: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
76b0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  ->zName));.  }el
76c0: 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  se{.    addrTop 
76d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
76e0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
76f0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
7700: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
7710: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
7720: 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69  Partial ){.    i
7730: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
7740: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
7750: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
7760: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
7770: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
7780: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
7790: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
77a0: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
77b0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
77c0: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
77d0: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
77e0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
77f0: 72 73 65 29 3b 0a 20 20 72 65 67 42 61 73 65 20  rse);.  regBase 
7800: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
7810: 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 20 20 20  eIndexKey(.     
7820: 20 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70   pParse, pIdx, p
7830: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
7840: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
7850: 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c   0, 0.  );.  sql
7860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7870: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7880: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
7890: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
78a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
78b0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
78c0: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69  SEEKRESULT);.  i
78d0: 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71  f( pPartial ) sq
78e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
78f0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
7900: 75 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49  ue);.  if( pTabI
7910: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
7920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7930: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
7940: 76 2c 20 61 64 64 72 43 6f 75 6e 74 65 72 2c 20  v, addrCounter, 
7950: 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20  regBase+n);.    
7960: 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
7970: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7980: 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
7990: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
79a0: 72 3e 30 20 29 3b 0a 20 20 20 20 74 72 61 6e 73  r>0 );.    trans
79b0: 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
79c0: 28 70 50 61 72 73 65 2c 20 61 64 64 72 54 6f 70  (pParse, addrTop
79d0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
79e0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
7a00: 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
7a10: 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
7a20: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
7a30: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
7a40: 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65  op);.    pTabIte
7a50: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
7a60: 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ne = 0;.  }else{
7a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7a80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
7a90: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
7aa0: 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20  ur, addrTop+1); 
7ab0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7ac0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
7ad0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
7ae0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
7af0: 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
7b00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
7b10: 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
7b20: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7b30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7b40: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
7b50: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
7b60: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
7b70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
7b80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
7b90: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
7ba0: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
7bb0: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
7bc0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7bd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
7be0: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
7bf0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7c00: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
7c10: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7c20: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7c30: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
7c40: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7c50: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
7c60: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7c70: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
7c80: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
7c90: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
7ca0: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
7cb0: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
7cc0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
7cd0: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
7ce0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7cf0: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
7d00: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
7d10: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7d20: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7d30: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7d60: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7d70: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
7d80: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
7d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
7da0: 45 52 45 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ERE clause being
7db0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
7dc0: 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
7dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7de0: 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77  * Ignore terms w
7df0: 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65 71  ith these prereq
7e00: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7e10: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
7e20: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
7e30: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
7e40: 68 61 74 20 69 73 20 74 68 65 20 76 74 61 62 20  hat is the vtab 
7e50: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7e60: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
7e70: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
7e80: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
7e90: 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20   u16 *pmNoOmit  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d   /* Mask of term
7ec0: 73 20 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f  s not to omit */
7ed0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
7ee0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
7ef0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7f00: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
7f10: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
7f20: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7f30: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
7f40: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
7f50: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7f60: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
7f70: 70 55 73 61 67 65 3b 0a 20 20 73 74 72 75 63 74  pUsage;.  struct
7f80: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
7f90: 20 2a 70 48 69 64 64 65 6e 3b 0a 20 20 57 68 65   *pHidden;.  Whe
7fa0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7fb0: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7fc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7fd0: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
7fe0: 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30   u16 mNoOmit = 0
7ff0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
8000: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
8010: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
8020: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
8030: 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
8040: 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
8050: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
8060: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
8070: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
8080: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
8090: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
80a0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
80b0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
80c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
80d0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
80e0: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
80f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8100: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
8110: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
8120: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
8130: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
8140: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
8150: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
8160: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8170: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8180: 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
8190: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
81a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
81b0: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
81c0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
81d0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
81e0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
81f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
8200: 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29  (WO_EQUIV))==0 )
8210: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8220: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
8230: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
8240: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
8250: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
8260: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
8270: 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b   );.    nTerm++;
8280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8290: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
82a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
82b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
82c0: 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
82d0: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
82e0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
82f0: 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
8300: 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
8310: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8320: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
8330: 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
8340: 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
8350: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
8360: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
8370: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
8380: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
8390: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
83a0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
83b0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
83c0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
83d0: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
83e0: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
83f0: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
8400: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
8410: 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 20  >a[i].sortFlags 
8420: 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f  & KEYINFO_ORDER_
8430: 42 49 47 4e 55 4c 4c 20 29 20 62 72 65 61 6b 3b  BIGNULL ) break;
8440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
8450: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
8460: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
8470: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
8480: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
8490: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
84a0: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
84b0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
84c0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
84d0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
84e0: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
8510: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
8520: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
8530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
8550: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
8560: 79 29 2a 6e 4f 72 64 65 72 42 79 20 2b 20 73 69  y)*nOrderBy + si
8570: 7a 65 6f 66 28 2a 70 48 69 64 64 65 6e 29 20 29  zeof(*pHidden) )
8580: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
8590: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
85a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
85b0: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
85c0: 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y");.    return 
85d0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
85e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
85f0: 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
8600: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
8610: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8620: 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
8630: 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
8640: 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
8650: 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
8660: 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
8670: 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
8680: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
8690: 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
86a0: 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
86b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
86c0: 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
86d0: 48 69 64 64 65 6e 20 3d 20 28 73 74 72 75 63 74  Hidden = (struct
86e0: 20 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f   HiddenIndexInfo
86f0: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
8700: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
8710: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8720: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
8730: 70 48 69 64 64 65 6e 5b 31 5d 3b 0a 20 20 70 49  pHidden[1];.  pI
8740: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
8750: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
8760: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
8770: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
8780: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
8790: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
87a0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
87b0: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
87c0: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
87d0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
87e0: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
87f0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
8800: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
8810: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
8820: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8830: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
8840: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
8850: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
8860: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
8870: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
8880: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
8890: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
88a0: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
88b0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
88c0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
88d0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
88e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
88f0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
8940: 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 20 3d 20   pHidden->pWC = 
8950: 70 57 43 3b 0a 20 20 70 48 69 64 64 65 6e 2d 3e  pWC;.  pHidden->
8960: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
8970: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
8980: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
8990: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
89a0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 31 36  Term++){.    u16
89b0: 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65   op;.    if( pTe
89c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
89d0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
89e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
89f0: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
8a00: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
8a10: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
8a20: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
8a30: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
8a40: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
8a50: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
8a60: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
8a70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8aa0: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
8ab0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
8ac0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8ad0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
8ae0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8af0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
8b00: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
8b10: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8b20: 26 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d  & ~(WO_EQUIV))==
8b30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8b40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
8b50: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
8b60: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
8b70: 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e    if( (pSrc->fg.
8b80: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
8b90: 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21  FT)!=0.     && !
8ba0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8bb0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
8bc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
8bd0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
8be0: 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 7c 57 4f  ator & (WO_IS|WO
8bf0: 5f 49 53 4e 55 4c 4c 29 29 0a 20 20 20 20 29 7b  _ISNULL)).    ){
8c00: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 49 53  .      /* An "IS
8c10: 22 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  " term in the WH
8c20: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
8c30: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8c40: 6c 65 20 69 73 20 74 68 65 20 72 68 73 0a 20 20  le is the rhs.  
8c50: 20 20 20 20 2a 2a 20 6f 66 20 61 20 4c 45 46 54      ** of a LEFT
8c60: 20 4a 4f 49 4e 2e 20 44 6f 20 6e 6f 74 20 70 61   JOIN. Do not pa
8c70: 73 73 20 74 68 69 73 20 74 65 72 6d 20 74 6f 20  ss this term to 
8c80: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
8c90: 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  e.      ** imple
8ca0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 73 20 74 68  mentation, as th
8cb0: 69 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 69  is can lead to i
8cc0: 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73  ncorrect results
8cd0: 20 66 72 6f 6d 20 53 51 4c 20 73 75 63 68 0a 20   from SQL such. 
8ce0: 20 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20       ** as:.    
8cf0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
8d00: 22 4c 45 46 54 20 4a 4f 49 4e 20 76 74 61 62 20  "LEFT JOIN vtab 
8d10: 57 48 45 52 45 20 76 74 61 62 2e 63 6f 6c 20 49  WHERE vtab.col I
8d20: 53 20 4e 55 4c 4c 22 20 20 2a 2f 0a 20 20 20 20  S NULL"  */.    
8d30: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8d40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8d50: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
8d60: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
8d70: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8d80: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 63 6f  O_IS );.      co
8d90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
8da0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8db0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
8dc0: 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43  -1) );.    pIdxC
8dd0: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
8de0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
8df0: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
8e00: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
8e10: 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20  t = i;.    op = 
8e20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8e30: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
8e40: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
8e50: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 69  p = WO_EQ;.    i
8e60: 66 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20 29 7b  f( op==WO_AUX ){
8e70: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
8e80: 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  j].op = pTerm->e
8e90: 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 65 6c  MatchOp;.    }el
8ea0: 73 65 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f  se if( op & (WO_
8eb0: 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b  ISNULL|WO_IS) ){
8ec0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
8ed0: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
8ee0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
8ef0: 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  op = SQLITE_INDE
8f00: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e  X_CONSTRAINT_ISN
8f10: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
8f20: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f  {.        pIdxCo
8f30: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54  ns[j].op = SQLIT
8f40: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8f50: 4e 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d 0a 20  NT_IS;.      }. 
8f60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f70: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
8f80: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 2f   (u8)op;.      /
8f90: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
8fa0: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
8fb0: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
8fc0: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
8fd0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
8fe0: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
8ff0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9000: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
9010: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
9020: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
9030: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
9040: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
9050: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
9060: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
9070: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
9080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
9090: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
90a0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
90b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
90c0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
90d0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
90e0: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
90f0: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
9100: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9110: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
9120: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
9130: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9140: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
9150: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
9160: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
9170: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  IN|WO_EQ|WO_LT|W
9180: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
9190: 7c 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20 20 20  |WO_AUX) );..   
91a0: 20 20 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f     if( op & (WO_
91b0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
91c0: 4f 5f 47 45 29 0a 20 20 20 20 20 20 20 26 26 20  O_GE).       && 
91d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
91e0: 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  tor(pTerm->pExpr
91f0: 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20 20 20  ->pRight) .     
9200: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
9210: 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c  i<16 ) mNoOmit |
9220: 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20  = (1 << i);.    
9230: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c      if( op==WO_L
9240: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
9250: 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  op = WO_LE;.    
9260: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47      if( op==WO_G
9270: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
9280: 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20  op = WO_GE;.    
9290: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a    }.    }..    j
92a0: 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
92b0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
92c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
92d0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
92e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
92f0: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
9300: 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
9310: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
9320: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
9330: 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
9340: 69 5d 2e 73 6f 72 74 46 6c 61 67 73 20 26 20 4b  i].sortFlags & K
9350: 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45 53  EYINFO_ORDER_DES
9360: 43 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f  C;.  }..  *pmNoO
9370: 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20  mit = mNoOmit;. 
9380: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
9390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
93a0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
93b0: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
93c0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
93d0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
93e0: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
93f0: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
9400: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
9410: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
9420: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
9430: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
9440: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
9450: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
9460: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
9470: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
9480: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
9490: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
94a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
94b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
94c0: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
94d0: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
94e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
94f0: 61 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  an.** appropriat
9500: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
9510: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 72 65 74  returned.  A ret
9520: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  urn of SQLITE_CO
9530: 4e 53 54 52 41 49 4e 54 20 66 72 6f 6d 0a 2a 2a  NSTRAINT from.**
9540: 20 78 42 65 73 74 49 6e 64 65 78 20 69 73 20 6e   xBestIndex is n
9550: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
9560: 20 65 72 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f   error.  SQLITE_
9570: 43 4f 4e 53 54 52 41 49 4e 54 20 69 6e 64 69 63  CONSTRAINT indic
9580: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  ates that.** the
9590: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75   current configu
95a0: 72 61 74 69 6f 6e 20 6f 66 20 22 75 6e 75 73 61  ration of "unusa
95b0: 62 6c 65 22 20 66 6c 61 67 73 20 69 6e 20 73 71  ble" flags in sq
95c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
95d0: 20 63 61 6e 0a 2a 2a 20 6e 6f 74 20 72 65 73 75   can.** not resu
95e0: 6c 74 20 69 6e 20 61 20 76 61 6c 69 64 20 70 6c  lt in a valid pl
95f0: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  an..**.** Whethe
9600: 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f  r or not an erro
9610: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  r is returned, i
9620: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
9630: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
9640: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
9650: 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69  tually free p->i
9660: 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64  dxStr if p->need
9670: 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64  ToFreeIdxStr ind
9680: 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74  icates.** that t
9690: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e  his is required.
96a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
96b0: 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72  tabBestIndex(Par
96c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
96d0: 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33  e *pTab, sqlite3
96e0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
96f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
9700: 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
9710: 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
9720: 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74  ->db, pTab)->pVt
9730: 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ab;.  int rc;.. 
9740: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
9750: 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  S(p);.  rc = pVt
9760: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
9770: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
9780: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
9790: 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66  UTPUTS(p);..  if
97a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
97b0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f  && rc!=SQLITE_CO
97c0: 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
97d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
97e0: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
97f0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50  lite3OomFault(pP
9800: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  arse->db);.    }
9810: 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
9820: 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
9830: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9840: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
9850: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
9860: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
9870: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9880: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
9890: 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
98a0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
98b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
98c0: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
98d0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
98e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
98f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
9900: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9910: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
9920: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
9930: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f  E_ENABLE_STAT4./
9940: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
9950: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
9960: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
9970: 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
9980: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
9990: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
99a0: 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
99b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
99c0: 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
99d0: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
99e0: 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a   less than pRec.
99f0: 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
9a00: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
9a10: 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
9a20: 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pRec.**.** Retu
9a30: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
9a40: 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20  the sample that 
9a50: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  is the smallest 
9a60: 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69  sample that.** i
9a70: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9a80: 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e  r equal to pRec.
9a90: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
9aa0: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20  index is not an 
9ab0: 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68  index.** into th
9ac0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9ad0: 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64  y - it is an ind
9ae0: 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61  ex into a virtua
9af0: 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  l set of samples
9b00: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
9b10: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61   contents of aSa
9b20: 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e  mple[] and the n
9b30: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
9b40: 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52  in record .** pR
9b50: 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ec. .*/.static i
9b60: 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
9b70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9b80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9b90: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9ba0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
9bb0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9bd0: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
9be0: 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
9bf0: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
9c00: 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
9c10: 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
9c20: 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
9c30: 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
9c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
9c50: 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
9c60: 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
9c70: 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
9c80: 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
9c90: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
9ca0: 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
9cb0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
9cc0: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
9cd0: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
9ce0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
9cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9d00: 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
9d10: 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
9d20: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  etc. */.  int i;
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
9d50: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e  f first sample >
9d60: 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  = pRec */.  int 
9d70: 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  iSample;        
9d80: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
9d90: 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65  est sample large
9da0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
9db0: 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  to pRec */.  int
9dc0: 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
9dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
9de0: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
9df0: 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
9e00: 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9e20: 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
9e30: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9e60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
9e70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
9e80: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
9e90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9ea0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52   of fields in pR
9eb0: 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ec */.  tRowcnt 
9ec0: 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20  iLower = 0;     
9ed0: 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20      /* anLt[] + 
9ee0: 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73  anEq[] of larges
9ef0: 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73  t sample pRec is
9f00: 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   > */..#ifndef S
9f10: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
9f20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
9f30: 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66  pParse );.#endif
9f40: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21  .  assert( pRec!
9f50: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9f60: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
9f70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
9f80: 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  c->nField>0 && p
9f90: 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64  Rec->nField<=pId
9fa0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
9fb0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61  ..  /* Do a bina
9fc0: 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e  ry search to fin
9fd0: 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  d the first samp
9fe0: 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  le greater than 
9ff0: 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f  or equal.  ** to
a000: 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63   pRec. If pRec c
a010: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
a020: 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20   field, the set 
a030: 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65  of samples to se
a040: 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d  arch.  ** is sim
a050: 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ply the aSample[
a060: 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  ] array. If the 
a070: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
a080: 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  le[] contain mor
a090: 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  e.  ** than one 
a0a0: 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c  fields, all fiel
a0b0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ds following the
a0c0: 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72   first are ignor
a0d0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
a0e0: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e   pRec contains N
a0f0: 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e   fields, where N
a100: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
a110: 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20  e, then as well 
a120: 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70  as the.  ** samp
a130: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
a140: 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e   (truncated to N
a150: 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65   fields), the se
a160: 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f  arch also has to
a170: 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70  .  ** consider p
a180: 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65  refixes of those
a190: 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78   samples. For ex
a1a0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65  ample, if the se
a1b0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a  t of samples.  *
a1c0: 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a  * in aSample is:
a1d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61  .  **.  **     a
a1e0: 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20  Sample[0] = (a, 
a1f0: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
a200: 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30  mple[1] = (a, 10
a210: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
a220: 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20  ple[2] = (b, 5) 
a230: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a240: 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20  e[3] = (c, 100) 
a250: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
a260: 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a  e[4] = (c, 105).
a270: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
a280: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
a290: 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62  should ideally b
a2a0: 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62  e the samples ab
a2b0: 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ove and the .  *
a2c0: 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65  * unique prefixe
a2d0: 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b  s [a], [b] and [
a2e0: 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68  c]. But since th
a2f0: 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72  at is hard to or
a300: 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68  ganize, .  ** th
a310: 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20  e code actually 
a320: 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65  searches this se
a330: 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t:.  **.  **    
a340: 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20   0: (a) .  **   
a350: 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a    1: (a, 5) .  *
a360: 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29  *     2: (a, 10)
a370: 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61   .  **     3: (a
a380: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
a390: 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20  4: (b) .  **    
a3a0: 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a   5: (b, 5) .  **
a3b0: 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a       6: (c) .  *
a3c0: 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30  *     7: (c, 100
a3d0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28  ) .  **     8: (
a3e0: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20  c, 105).  **    
a3f0: 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   9: (c, 105).  *
a400: 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  *.  ** For each 
a410: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53  sample in the aS
a420: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e  ample[] array, N
a430: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65   samples are pre
a440: 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a  sent in the.  **
a450: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a460: 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20  e array. In the 
a470: 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30  above, samples 0
a480: 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64   and 1 are based
a490: 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   on .  ** sample
a4a0: 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d   aSample[0]. Sam
a4b0: 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20  ples 2 and 3 on 
a4c0: 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a  aSample[1] etc..
a4d0: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c    **.  ** Often,
a4e0: 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63   sample i of eac
a4f0: 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66  h block of N eff
a500: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68  ective samples h
a510: 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e  as (i+1) fields.
a520: 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61  .  ** Except, ea
a530: 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65  ch sample may be
a540: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73   extended to ens
a550: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67  ure that it is g
a560: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20  reater than or. 
a570: 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65   ** equal to the
a580: 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65   previous sample
a590: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46   in the array. F
a5a0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
a5b0: 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20  he above, .  ** 
a5c0: 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20  sample 2 is the 
a5d0: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20  first sample of 
a5e0: 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d  a block of N sam
a5f0: 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73  ples, so at firs
a600: 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61  t it .  ** appea
a610: 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  rs that it shoul
a620: 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20  d be 1 field in 
a630: 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  size. However, t
a640: 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  hat would make i
a650: 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20  t .  ** smaller 
a660: 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73  than sample 1, s
a670: 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
a680: 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f  rch would not wo
a690: 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  rk. As a result,
a6a0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74   .  ** it is ext
a6b0: 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65  ended to two fie
a6c0: 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61  lds. The duplica
a6d0: 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72  tes that this cr
a6e0: 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20  eates do not .  
a6f0: 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
a700: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46  blems..  */.  nF
a710: 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69  ield = pRec->nFi
a720: 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b  eld;.  iCol = 0;
a730: 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  iSample = pId
a740: 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69  x->nSample * nFi
a750: 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  eld;.  do{.    i
a760: 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20  nt iSamp;       
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a780: 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65  Index in aSample
a790: 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c  [] of test sampl
a7a0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  e */.    int n; 
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a7d0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65   of fields in te
a7e0: 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20  st sample */..  
a7f0: 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
a800: 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20  iSample)/2;.    
a810: 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20  iSamp = iTest / 
a820: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
a830: 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  iSamp>0 ){.     
a840: 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64   /* The proposed
a850: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
a860: 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  e is a prefix of
a870: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
a880: 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a  iSamp]..      **
a890: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
a8a0: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
a8b0: 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ix of at least (
a8c0: 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64  1 + iTest%nField
a8d0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c  ) .      ** fiel
a8e0: 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74  ds that is great
a8f0: 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
a900: 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73  ious effective s
a910: 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  ample.  */.     
a920: 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20   for(n=(iTest % 
a930: 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e  nField) + 1; n<n
a940: 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Field; n++){.   
a950: 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
a960: 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e  [iSamp-1].anLt[n
a970: 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61  -1]!=aSample[iSa
a980: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20  mp].anLt[n-1] ) 
a990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a9a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a9b0: 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20  n = iTest + 1;. 
a9c0: 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e     }..    pRec->
a9d0: 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20  nField = n;.    
a9e0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
a9f0: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
aa00: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c  Sample[iSamp].n,
aa10: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
aa20: 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66  p, pRec);.    if
aa30: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
aa40: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
aa50: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
aa60: 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61  1] + aSample[iSa
aa70: 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20  mp].anEq[n-1];. 
aa80: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
aa90: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t+1;.    }else i
aaa0: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e  f( res==0 && n<n
aab0: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69  Field ){.      i
aac0: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
aad0: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
aae0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
aaf0: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65  Test+1;.      re
ab00: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  s = -1;.    }els
ab10: 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65  e{.      iSample
ab20: 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20   = iTest;.      
ab30: 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20  iCol = n-1;.    
ab40: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
ab50: 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20  && iMin<iSample 
ab60: 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65  );.  i = iSample
ab70: 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64   / nField;..#ifd
ab80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ab90: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
aba0: 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
abb0: 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
abc0: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
abd0: 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
abe0: 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
abf0: 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
ac00: 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
ac10: 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
ac20: 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
ac30: 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
ac40: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
ac50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ac60: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
ac70: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
ac80: 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
ac90: 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63   true, then pRec
aca0: 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
acb0: 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20  o sample i. */. 
acc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
acd0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
ace0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
acf0: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
ad00: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
ad10: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
ad20: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
ad30: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
ad40: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
ad50: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
ad60: 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20  p, pRec) .      
ad70: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
ad80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ad90: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d   .      );.    }
ada0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
adb0: 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e  nless i==pIdx->n
adc0: 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69  Sample, indicati
add0: 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20  ng that pRec is 
ade0: 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
adf0: 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73    ** all samples
ae00: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
ae10: 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75  ] array, pRec mu
ae20: 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
ae30: 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  an the.      ** 
ae40: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
ae50: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
ae60: 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  i.  */.      ass
ae70: 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53  ert( i<=pIdx->nS
ae80: 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b  ample && i>=0 );
ae90: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
aea0: 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  eld = iCol+1;.  
aeb0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
aec0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
aed0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
aee0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
aef0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
af00: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
af10: 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
af20: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
af30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
af40: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  );..      /* if 
af50: 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30  i==0 and iCol==0
af60: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52  , then record pR
af70: 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ec is smaller th
af80: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20  an all samples. 
af90: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61       ** in the a
afa0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
afb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69  Otherwise, if (i
afc0: 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63  Col>0) then pRec
afd0: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
afe0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
aff0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28  r equal to the (
b000: 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66  iCol) field pref
b010: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a  ix of sample i..
b020: 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30        ** If (i>0
b030: 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  ), then pRec mus
b040: 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65  t also be greate
b050: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69  r than sample (i
b060: 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  -1).  */.      i
b070: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
b080: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
b090: 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  d = iCol;.      
b0a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b0b0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
b0c0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
b0d0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
b0e0: 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20  Rec)<=0.        
b0f0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
b100: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b110: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
b120: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
b130: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
b140: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
b150: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b160: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
b170: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
b180: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
b190: 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
b1a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
b1b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
b1c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
b1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b1e0: 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
b1f0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66  E_DEBUG */..  if
b200: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
b210: 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69  /* Record pRec i
b220: 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  s equal to sampl
b230: 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e i */.    asser
b240: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
b250: 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  1 );.    aStat[0
b260: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
b270: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
b280: 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
b290: 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
b2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b2b0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
b2c0: 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65  the (iCol+1) fie
b2d0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61  ld prefix of aSa
b2e0: 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
b2f0: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d  irst .    ** sam
b300: 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
b310: 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f  ter than pRec. O
b320: 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  r, if i==pIdx->n
b330: 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63  Sample then pRec
b340: 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65  .    ** is large
b350: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
b360: 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  es in the array.
b370: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
b380: 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
b390: 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e    if( i>=pIdx->n
b3a0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
b3b0: 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
b3c0: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
b3d0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
b3e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b3f0: 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
b400: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
b410: 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l];.    }..    i
b420: 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
b430: 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
b440: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
b450: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
b460: 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
b470: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
b480: 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
b490: 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
b4a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4b0: 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
b4c0: 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
b4d0: 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
b4e0: 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  ap;.    aStat[1]
b4f0: 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
b500: 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 7d 0a 0a  nField-1];.  }..
b510: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
b520: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
b530: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
b540: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
b550: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
b560: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
b570: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b580: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a  E_ENABLE_STAT4 *
b590: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  /../*.** If it i
b5a0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72  s not NULL, pTer
b5b0: 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74  m is a term that
b5c0: 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70   provides an upp
b5d0: 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62  er or lower.** b
b5e0: 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20  ound on a range 
b5f0: 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f  scan. Without co
b600: 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c  nsidering pTerm,
b610: 20 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64   it is estimated
b620: 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63   .** that the sc
b630: 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e  an will visit nN
b640: 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75  ew rows. This fu
b650: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
b660: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74  he number.** est
b670: 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73  imated to be vis
b680: 69 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e  ited after takin
b690: 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63  g pTerm into acc
b6a0: 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ount..**.** If t
b6b0: 68 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74  he user explicit
b6c0: 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c  ly specified a l
b6d0: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
b6e0: 65 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c  e for this term,
b6f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
b700: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
b710: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74   likelihood mult
b720: 69 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75  iplied by the nu
b730: 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74  mber of.** input
b740: 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65   rows. Otherwise
b750: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
b760: 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20  assumes that an 
b770: 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65  "IS NOT NULL" te
b780: 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65  rm.** has a like
b790: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20  lihood of 0.50, 
b7a0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65  and any other te
b7b0: 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  rm a likelihood 
b7c0: 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74  of 0.25..*/.stat
b7d0: 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52  ic LogEst whereR
b7e0: 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65  angeAdjust(Where
b7f0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67  Term *pTerm, Log
b800: 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67  Est nNew){.  Log
b810: 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b  Est nRet = nNew;
b820: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
b830: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
b840: 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
b850: 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65       nRet += pTe
b860: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
b870: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
b880: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
b890: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
b8a0: 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32  .      nRet -= 2
b8b0: 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
b8c0: 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 20==sqlite3Log
b8d0: 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a  Est(4) );.    }.
b8e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
b8f0: 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  t;.}...#ifdef SQ
b900: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
b910: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
b920: 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20  he affinity for 
b930: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
b940: 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  of an index..*/.
b950: 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65  char sqlite3Inde
b960: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
b970: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
b980: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43  ex *pIdx, int iC
b990: 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ol){.  assert( i
b9a0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
b9b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
b9c0: 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f    if( !pIdx->zCo
b9d0: 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20  lAff ){.    if( 
b9e0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
b9f0: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78  nityStr(db, pIdx
ba00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
ba10: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ba20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 49 64   }.  assert( pId
ba30: 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d  x->zColAff[iCol]
ba40: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
ba50: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43  pIdx->zColAff[iC
ba60: 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ol];.}.#endif...
ba70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ba80: 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  ABLE_STAT4./* .*
ba90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
baa0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
bab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
bac0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
bad0: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
bae0: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
baf0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
bb00: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
bb10: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
bb20: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
bb30: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
bb40: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
bb50: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
bb60: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
bb70: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
bb80: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
bb90: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
bba0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
bbb0: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
bbc0: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
bbd0: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
bbe0: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
bbf0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
bc00: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
bc10: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
bc20: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
bc30: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
bc40: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
bc50: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
bc60: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
bc70: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
bc80: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
bc90: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
bca0: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
bcb0: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
bcc0: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
bcd0: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
bce0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
bcf0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
bd00: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
bd10: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
bd20: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
bd30: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
bd40: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
bd50: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
bd60: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
bd70: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
bd80: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
bd90: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
bda0: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
bdb0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
bdc0: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
bdd0: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
bde0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bdf0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
be00: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
be10: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
be20: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
be30: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
be40: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
be50: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
be60: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
be70: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
be80: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
be90: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
bea0: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
beb0: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
bec0: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
bed0: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
bee0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
bef0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
bf00: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
bf10: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
bf20: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
bf30: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
bf40: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
bf50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
bf60: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
bf70: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
bf80: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
bf90: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
bfa0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
bfb0: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
bfc0: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
bfd0: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
bfe0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
bff0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
c000: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
c010: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
c020: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
c030: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
c040: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
c050: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c060: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
c070: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
c080: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
c090: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
c0a0: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
c0b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
c0c0: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
c0d0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
c0e0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
c0f0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
c100: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
c110: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
c120: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
c130: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
c140: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
c150: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
c160: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
c170: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
c180: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
c190: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
c1a0: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
c1b0: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
c1c0: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
c1d0: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
c1e0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
c1f0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
c200: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
c210: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
c220: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c230: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c240: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c250: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c260: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c270: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
c280: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
c290: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
c2a0: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
c2b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c2c0: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
c2d0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
c2e0: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
c2f0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
c300: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
c310: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
c320: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
c330: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
c340: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
c350: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
c360: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
c370: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
c380: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
c390: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
c3a0: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
c3b0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
c3c0: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
c3d0: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
c3e0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
c3f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
c400: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
c410: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
c420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c430: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
c440: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
c450: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
c460: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
c470: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
c480: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
c490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c4a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c4b0: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
c4c0: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
c4d0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
c4e0: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
c4f0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
c500: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
c510: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
c520: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
c530: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
c540: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
c550: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
c560: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
c570: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c580: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
c590: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
c5a0: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
c5b0: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
c5c0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
c5d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c5e0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
c5f0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
c600: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
c610: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
c620: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
c630: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
c640: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
c650: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
c660: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
c670: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
c680: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
c690: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
c6a0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
c6b0: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
c6c0: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
c6d0: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
c6e0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
c6f0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
c700: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
c710: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
c720: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
c730: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
c740: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
c750: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
c760: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
c770: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
c780: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
c790: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
c7a0: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
c7b0: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
c7c0: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
c7d0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
c7e0: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
c7f0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
c800: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
c810: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
c820: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
c830: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
c840: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
c850: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
c860: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
c870: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
c880: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
c890: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
c8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c8b0: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
c8c0: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
c8d0: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
c8e0: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
c8f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
c900: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
c910: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
c920: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
c930: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
c940: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
c950: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
c960: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
c990: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
c9a0: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
c9b0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
c9c0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
c9d0: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
c9e0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
c9f0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
ca00: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
ca10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
ca20: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
ca30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ca40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
ca50: 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  ABLE_STAT4 */../
ca60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ca70: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
ca80: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
ca90: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
caa0: 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
cab0: 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
cac0: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
cad0: 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
cae0: 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
caf0: 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
cb00: 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
cb10: 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
cb20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
cb30: 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
cb40: 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
cb50: 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
cb60: 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
cb70: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
cb80: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
cb90: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
cba0: 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
cbb0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
cbc0: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
cbd0: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
cbe0: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
cc10: 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
cc30: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
cc60: 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
cc70: 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
cc80: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
cc90: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
cca0: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
ccb0: 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
ccc0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ccd0: 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
cce0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
ccf0: 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
cd00: 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
cd10: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cd20: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f   the index.** co
cd30: 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
cd40: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
cd50: 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
cd60: 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
cd70: 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74  er of.** equalit
cd80: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70  y constraints op
cd90: 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
cda0: 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
cdb0: 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
cdc0: 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  .** assuming ind
cdd0: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c  ex p is on t1(a,
cde0: 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
cdf0: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
ce00: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
ce10: 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
ce20: 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
ce30: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
ce40: 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61  q is set to 1 (a
ce50: 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
ce60: 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62  ricted column, b
ce70: 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
ce80: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  .** left-most co
ce90: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
cea0: 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
ceb0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
cec0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
ced0: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
cee0: 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
cef0: 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
cf00: 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  0..**.** When th
cf10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
cf20: 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73  alled, *pnOut is
cf30: 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69   set to the sqli
cf40: 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74  te3LogEst() of t
cf50: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
cf60: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e  rows that the in
cf70: 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65  dex scan is expe
cf80: 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69  cted to visit wi
cf90: 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  thout .** consid
cfa0: 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20  ering the range 
cfb0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
cfc0: 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a  nEq is 0, then *
cfd0: 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d  pnOut is the num
cfe0: 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
cff0: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
d000: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
d010: 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
d020: 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
d030: 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
d040: 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
d050: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f   constraints pLo
d060: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a  wer and pUpper..
d070: 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  ** .** In the ab
d080: 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
d090: 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61  stat4 ANALYZE da
d0a0: 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64  ta, or if such d
d0b0: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
d0c0: 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20   used, a single 
d0d0: 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
d0e0: 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
d0f0: 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
d100: 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
d110: 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f  and a pair of co
d120: 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
d130: 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20  ND x<?) reduces 
d140: 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d  the expected num
d150: 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76  ber of.** rows v
d160: 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74  isited by a fact
d170: 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61  or of 64..*/.sta
d180: 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
d190: 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
d1a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d1b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
d1c0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
d1d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
d1e0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
d1f0: 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54  uilder,.  WhereT
d200: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
d210: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
d220: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
d230: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
d240: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
d250: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
d260: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
d270: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
d280: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
d290: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
d2a0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20  eLoop *pLoop    
d2b0: 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e   /* Modify the .
d2c0: 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e  nOut and maybe .
d2d0: 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29  rRun fields */.)
d2e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d2f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f  ITE_OK;.  int nO
d300: 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  ut = pLoop->nOut
d310: 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b  ;.  LogEst nNew;
d320: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d330: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 49  ENABLE_STAT4.  I
d340: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
d350: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
d360: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
d370: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
d380: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
d390: 6c 65 3e 30 20 26 26 20 41 4c 57 41 59 53 28 6e  le>0 && ALWAYS(n
d3a0: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
d3b0: 29 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  ).   && Optimiza
d3c0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
d3d0: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53  se->db, SQLITE_S
d3e0: 74 61 74 34 29 0a 20 20 29 7b 0a 20 20 20 20 69  tat4).  ){.    i
d3f0: 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
d400: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
d410: 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
d420: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
d430: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
d440: 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
d450: 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d        int nBtm =
d460: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d470: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nBtm;.      int 
d480: 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nTop = pLoop->u.
d490: 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20  btree.nTop;..   
d4a0: 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
d4b0: 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
d4c0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
d4d0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
d4e0: 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
d4f0: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
d500: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
d510: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
d520: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
d530: 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20  uery. The.      
d540: 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
d550: 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
d560: 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
d570: 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
d580: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65   the.      ** ke
d590: 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20  y-prefix formed 
d5a0: 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  by the nEq value
d5b0: 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  s matched agains
d5c0: 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d  t the nEq left-m
d5d0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ost.      ** col
d5e0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
d5f0: 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
d600: 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
d610: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
d620: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
d630: 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
d640: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
d650: 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
d660: 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a  ause it.      **
d670: 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
d680: 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
d690: 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
d6a0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
d6b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e  the.      ** ran
d6c0: 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
d6d0: 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
d6e0: 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
d6f0: 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
d700: 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69        ** if $L i
d710: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
d720: 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
d730: 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
d740: 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20  ($P) and .      
d750: 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
d760: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
d770: 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
d780: 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20  lues is used..  
d790: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d7a0: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
d7b0: 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
d7c0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
d7d0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d7e0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
d7f0: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d800: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
d810: 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
d820: 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
d830: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
d840: 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
d850: 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
d860: 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
d870: 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
d880: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
d890: 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
d8a0: 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
d8b0: 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
d8c0: 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
d8d0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
d8e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d8f0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
d900: 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20   bounds is then 
d910: 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77  just iUpper-iLow
d920: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
d930: 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
d940: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
d950: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
d960: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
d970: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
d980: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
d990: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
d9a0: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
d9b0: 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d   int iLwrIdx = -
d9c0: 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  2;   /* aSample[
d9d0: 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20  ] for the lower 
d9e0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
d9f0: 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b  nt iUprIdx = -1;
da00: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
da10: 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f  for the upper bo
da20: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  und */..      if
da30: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( pRec ){.      
da40: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
da50: 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64  ->nField!=pBuild
da60: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b  er->nRecValid );
da70: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
da80: 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72  Field = pBuilder
da90: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20  ->nRecValid;.   
daa0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
dab0: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
dac0: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
dad0: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
dae0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
daf0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
db00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
db10: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
db20: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
db30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
db40: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
db50: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
db60: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
db70: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
db80: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
db90: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
dba0: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
dbb0: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
dbc0: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
dbd0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
dbe0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
dbf0: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
dc00: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
dc10: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
dc20: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
dc30: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
dc40: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
dc50: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
dc60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
dc70: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
dc80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dc90: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
dca0: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
dcb0: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
dcc0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
dcd0: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
dce0: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
dcf0: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
dd00: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
dd10: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
dd20: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
dd30: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
dd40: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
dd50: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
dd60: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
dd70: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
dd80: 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e       SWAP(int, n
dd90: 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  Btm, nTop);.    
dda0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
ddb0: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
ddc0: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
ddd0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
dde0: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
ddf0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
de00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
de30: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
de40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
de50: 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
de60: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
de70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
de80: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
de90: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
dea0: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
deb0: 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b   nBtm, nEq, &n);
dec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
ded0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
dee0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
def0: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
df00: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
df10: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
df20: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
df30: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
df40: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
df50: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
df60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
df70: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
df80: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
df90: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
dfa0: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
dfb0: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
dfc0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
dfd0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
dfe0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
dff0: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
e000: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
e010: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
e020: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
e030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e040: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
e050: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
e060: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
e070: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
e080: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
e090: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
e0a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
e0d0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
e0e0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
e0f0: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
e100: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
e110: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e120: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
e130: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
e140: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
e150: 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Top, nEq, &n);. 
e160: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
e170: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
e180: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
e190: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
e1a0: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
e1b0: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
e1c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e1d0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
e1e0: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
e1f0: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
e200: 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
e210: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
e220: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
e230: 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
e240: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
e250: 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
e260: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
e270: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
e280: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
e290: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
e2a0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
e2b0: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
e2c0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
e2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e2e0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
e2f0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
e300: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e310: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e320: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
e330: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
e340: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
e350: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
e360: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
e370: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
e380: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
e390: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
e3a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
e3b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
e3c0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
e3d0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
e3e0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
e3f0: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
e400: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
e410: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
e420: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
e430: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
e440: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
e450: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
e460: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
e470: 66 20 53 54 41 54 34 20 74 61 62 6c 65 73 2e 20  f STAT4 tables. 
e480: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
e490: 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64   iLwrIdx==iUprId
e4a0: 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20  x ) nNew -= 20; 
e4b0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
e4c0: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
e4d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e4e0: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
e4f0: 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
e500: 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
e510: 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
e520: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e530: 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
e540: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
e550: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
e560: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e570: 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34  CE(0x10, ("STAT4
e580: 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e   range scan: %u.
e590: 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  .%u  est=%d\n",.
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
e5c0: 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70  iLower, (u32)iUp
e5d0: 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20  per, nOut));.   
e5e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e5f0: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
e600: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
e610: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
e620: 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c  anEst(pParse, pL
e630: 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c  ower, pUpper, pL
e640: 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20  oop, &bDone);.  
e650: 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20      if( bDone ) 
e660: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e670: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
e680: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
e690: 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
e6a0: 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64  PARAMETER(pBuild
e6b0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
e6c0: 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
e6d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
e6e0: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
e6f0: 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67   (pUpper->wtFlag
e700: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
e710: 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  =0 );.  nNew = w
e720: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
e730: 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
e740: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
e750: 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
e760: 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55   nNew);..  /* TU
e770: 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
e780: 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20  s both an upper 
e790: 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  and lower limit 
e7a0: 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69  and neither limi
e7b0: 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70  t.  ** has an ap
e7c0: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
e7d0: 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20  d likelihood(), 
e7e0: 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
e7f0: 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
e800: 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
e810: 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
e820: 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
e830: 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
e840: 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
e850: 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
e860: 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
e870: 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
e880: 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
e890: 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
e8a0: 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
e8b0: 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
e8c0: 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
e8d0: 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
e8e0: 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
e8f0: 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
e900: 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65   pLower && pLowe
e910: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26  r->truthProb>0 &
e920: 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70  & pUpper && pUpp
e930: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
e940: 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32  ){.    nNew -= 2
e950: 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d  0;.  }..  nOut -
e960: 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20  = (pLower!=0) + 
e970: 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69  (pUpper!=0);.  i
e980: 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65  f( nNew<10 ) nNe
e990: 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e  w = 10;.  if( nN
e9a0: 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d  ew<nOut ) nOut =
e9b0: 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e   nNew;.#if defin
e9c0: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
e9d0: 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f  ABLED).  if( pLo
e9e0: 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b  op->nOut>nOut ){
e9f0: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
ea00: 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61  0x10,("Range sca
ea10: 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72  n lowers nOut fr
ea20: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c      pLoop->nOut,
ea50: 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e   nOut));.  }.#en
ea60: 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  dif.  pLoop->nOu
ea70: 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
ea80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ea90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
eaa0: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a  ENABLE_STAT4./*.
eab0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
eac0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
ead0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
eae0: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
eaf0: 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
eb00: 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
eb10: 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
eb20: 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
eb30: 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
eb40: 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
eb50: 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
eb60: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
eb70: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
eb80: 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
eb90: 73 74 61 74 34 20 68 69 73 74 6f 67 72 61 6d 20  stat4 histogram 
eba0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
ebb0: 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
ebc0: 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
ebd0: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
ebe0: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
ebf0: 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
ec00: 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
ec10: 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
ec20: 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
ec30: 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
ec40: 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
ec50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
ec60: 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
ec70: 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
ec80: 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
ec90: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
eca0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
ecb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ecc0: 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
ecd0: 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
ece0: 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
ecf0: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
ed00: 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
ed10: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
ed20: 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
ed30: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
ed40: 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
ed50: 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
ed60: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
ed70: 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
ed80: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
ed90: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
eda0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
edb0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
edc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
edd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ede0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
edf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ee00: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
ee10: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
ee20: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
ee30: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ee40: 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
ee50: 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
ee60: 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
ee70: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
ee80: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
ee90: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
eea0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
eeb0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
eec0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
eed0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
eee0: 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
eef0: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
ef00: 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
ef10: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
ef20: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e  lder->pRec;.  in
ef30: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ef40: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
ef50: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
ef60: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
ef70: 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
ef80: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
ef90: 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
efa0: 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
efb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
efc0: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
efd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
efe0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
eff0: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
f000: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f010: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
f020: 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
f030: 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
f040: 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
f050: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
f060: 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
f070: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
f080: 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
f090: 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
f0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
f0b0: 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
f0c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
f0d0: 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
f0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f0f0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
f100: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
f110: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
f120: 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
f130: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
f140: 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
f150: 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
f160: 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
f170: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
f180: 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
f190: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
f1a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f1b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
f1c0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
f1d0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
f1e0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
f1f0: 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26  xpr, 1, nEq-1, &
f200: 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
f210: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
f220: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f230: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
f240: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
f250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
f260: 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
f270: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
f280: 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
f290: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
f2a0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
f2b0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
f2c0: 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
f2d0: 65 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25  egions %s(%d): %
f2e0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
f2f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
f300: 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61  e, nEq-1, (int)a
f310: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
f320: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
f330: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
f340: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
f350: 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64  E_STAT4 */..#ifd
f360: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f370: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
f380: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
f390: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
f3a0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
f3b0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
f3c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
f3d0: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
f3e0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
f3f0: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
f400: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
f410: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
f420: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
f430: 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
f440: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
f450: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
f460: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
f470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f480: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
f490: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
f4a0: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
f4b0: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
f4c0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
f4d0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
f4e0: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
f4f0: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
f500: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
f510: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
f520: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
f530: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
f540: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
f550: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
f560: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
f570: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
f580: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
f590: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
f5a0: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
f5b0: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
f5c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f5d0: 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
f5e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f5f0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
f600: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
f610: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
f620: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
f630: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
f640: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
f650: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
f660: 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
f670: 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
f680: 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
f690: 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
f6a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f6b0: 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
f6c0: 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
f6d0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
f6e0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
f6f0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
f700: 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c   i64 nRow0 = sql
f710: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
f720: 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  p->aiRowLogEst[0
f730: 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ]);.  int nRecVa
f740: 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
f750: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
f760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f770: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
f780: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
f790: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
f7a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
f7b0: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
f7c0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
f7d0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
f7e0: 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
f7f0: 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
f800: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f810: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f840: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f850: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
f860: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
f870: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
f880: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
f890: 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f  {.    nEst = nRo
f8a0: 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w0;.    rc = whe
f8b0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
f8c0: 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
f8d0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
f8e0: 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
f8f0: 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
f900: 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
f910: 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
f920: 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
f930: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f940: 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
f950: 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77  t > nRow0 ) nRow
f960: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
f970: 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
f980: 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
f990: 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20  E(0x10,("IN row 
f9a0: 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64  estimate: est=%d
f9b0: 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
f9c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
f9d0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
f9e0: 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  d==nRecValid );.
f9f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
fa00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fa10: 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a  ENABLE_STAT4 */.
fa20: 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
fa30: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
fa40: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74  * Print the cont
fa50: 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65  ent of a WhereTe
fa60: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  rm object.*/.sta
fa70: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65  tic void whereTe
fa80: 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72  rmPrint(WhereTer
fa90: 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54  m *pTerm, int iT
faa0: 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
fab0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
fac0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fad0: 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e  TERM-%-3d NULL\n
fae0: 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  ", iTerm);.  }el
faf0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79  se{.    char zTy
fb00: 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68 61 72 20  pe[4];.    char 
fb10: 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20 20 20 6d  zLeft[50];.    m
fb20: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
fb30: 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  .", 4);.    if( 
fb40: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
fb50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
fb60: 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a  zType[0] = 'V';.
fb70: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
fb80: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
fb90: 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
fba0: 3d 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45  = 'E';.    if( E
fbb0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fbc0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
fbd0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70  FromJoin) ) zTyp
fbe0: 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20  e[2] = 'L';.    
fbf0: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
fc00: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
fc10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fc20: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
fc30: 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22  f(zLeft),zLeft,"
fc40: 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a 20  left={%d:%d}",. 
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
fc70: 74 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e  tCursor, pTerm->
fc80: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a 20  u.leftColumn);. 
fc90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
fca0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fcb0: 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26 20 70 54   WO_OR)!=0 && pT
fcc0: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21 3d  erm->u.pOrInfo!=
fcd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
fce0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
fcf0: 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c  of(zLeft),zLeft,
fd00: 22 69 6e 64 65 78 61 62 6c 65 3d 30 78 25 6c 6c  "indexable=0x%ll
fd10: 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  d", .           
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
fd30: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
fd40: 64 65 78 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  dexable);.    }e
fd50: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
fd60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
fd70: 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c  of(zLeft),zLeft,
fd80: 22 6c 65 66 74 3d 25 64 22 2c 20 70 54 65 72 6d  "left=%d", pTerm
fd90: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
fda0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fdb0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
fdc0: 20 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25      "TERM-%-3d %
fdd0: 70 20 25 73 20 25 2d 31 32 73 20 70 72 6f 62 3d  p %s %-12s prob=
fde0: 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 20 77  %-3d op=0x%03x w
fdf0: 74 46 6c 61 67 73 3d 30 78 25 30 34 78 22 2c 0a  tFlags=0x%04x",.
fe00: 20 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54         iTerm, pT
fe10: 65 72 6d 2c 20 7a 54 79 70 65 2c 20 7a 4c 65 66  erm, zType, zLef
fe20: 74 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  t, pTerm->truthP
fe30: 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72  rob,.       pTer
fe40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54  m->eOperator, pT
fe50: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20  erm->wtFlags);. 
fe60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 46     if( pTerm->iF
fe70: 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 73 71  ield ){.      sq
fe80: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
fe90: 28 22 20 69 46 69 65 6c 64 3d 25 64 5c 6e 22 2c  (" iField=%d\n",
fea0: 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 29 3b   pTerm->iField);
feb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fec0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
fed0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
fee0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  }.    sqlite3Tre
fef0: 65 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65  eViewExpr(0, pTe
ff00: 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  rm->pExpr, 0);. 
ff10: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
ff20: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
ff30: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68 6f  NABLED./*.** Sho
ff40: 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  w the complete c
ff50: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
ff60: 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69 64 20  eClause.*/.void 
ff70: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
ff80: 73 65 50 72 69 6e 74 28 57 68 65 72 65 43 6c 61  sePrint(WhereCla
ff90: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
ffa0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ffb0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
ffc0: 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65 72 6d  ){.    whereTerm
ffd0: 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b 69 5d  Print(&pWC->a[i]
ffe0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , i);.  }.}.#end
fff0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
10000 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
10010 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
10020 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
10030 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
10040 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
10050 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
10060 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
10070 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
10080 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
10090 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
100a0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
100b0 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
100c0 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b  List->nSrc+3)/4;
100d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
100e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
100f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
10100 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
10110 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
10120 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69  Item->pTab;.  Bi
10130 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28  tmask mAll = (((
10140 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a  Bitmask)1)<<(nb*
10150 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74  4)) - 1;.  sqlit
10160 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
10170 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c  c%2d.%0*llx.%0*l
10180 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20  lx", p->cId,.   
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70    p->iTab, nb, p
101b0 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20  ->maskSelf, nb, 
101c0 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41 6c 6c  p->prereq & mAll
101d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
101e0 67 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c  gPrintf(" %12s",
101f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10200 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
10210 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
10220 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
10230 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
10240 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
10250 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
10260 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
10270 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28   *zName;.    if(
10280 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
10290 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70  ex && (zName = p
102a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
102b0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
102c0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
102d0 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
102e0 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29  autoindex_", 17)
102f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
10300 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nt i = sqlite3St
10310 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20  rlen30(zName) - 
10320 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
10330 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  ( zName[i]!='_' 
10340 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a  ) i--;.        z
10350 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20  Name += i;.     
10360 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10370 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d  DebugPrintf(".%-
10380 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c  16s %2d", zName,
10390 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29   p->u.btree.nEq)
103a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
103b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
103c0 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29  rintf("%20s","")
103d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
103e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
103f0 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e    if( p->u.vtab.
10400 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  idxStr ){.      
10410 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
10420 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c  ntf("(%d,\"%s\",
10430 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %x)",.          
10440 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
10450 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
10460 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76  b.idxStr, p->u.v
10470 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
10480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10490 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
104a0 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70  ntf("(%d,%x)", p
104b0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
104c0 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
104d0 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
104e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
104f0 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b  tf(" %-19s", z);
10500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10510 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(z);.  }.  if( 
10520 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10530 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20  RE_SKIPSCAN ){. 
10540 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
10550 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 25  rintf(" f %05x %
10560 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67  d-%d", p->wsFlag
10570 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e  s, p->nLTerm,p->
10580 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  nSkip);.  }else{
10590 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
105a0 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
105b0 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
105c0 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
105d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
105e0 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20  ugPrintf(" cost 
105f0 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e  %d,%d,%d\n", p->
10600 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c  rSetup, p->rRun,
10610 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28   p->nOut);.  if(
10620 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
10630 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
10640 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a   & 0x100)!=0 ){.
10650 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10660 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54  or(i=0; i<p->nLT
10670 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
10680 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
10690 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29  p->aLTerm[i], i)
106a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
106b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
106c0 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ert bulk memory 
106d0 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65  into a valid Whe
106e0 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20  reLoop that can 
106f0 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  be passed.** to 
10700 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68  whereLoopClear h
10710 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74  armlessly..*/.st
10720 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10730 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f  oopInit(WhereLoo
10740 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65  p *p){.  p->aLTe
10750 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70  rm = p->aLTermSp
10760 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d  ace;.  p->nLTerm
10770 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f   = 0;.  p->nLSlo
10780 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d  t = ArraySize(p-
10790 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20  >aLTermSpace);. 
107a0 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b   p->wsFlags = 0;
107b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
107c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20  the WhereLoop.u 
107d0 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68  union.  Leave Wh
107e0 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69  ereLoop.pLTerm i
107f0 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntact..*/.static
10800 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
10810 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65  learUnion(sqlite
10820 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
10830 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77   *p){.  if( p->w
10840 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
10850 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45  VIRTUALTABLE|WHE
10860 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29  RE_AUTO_INDEX) )
10870 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  {.    if( (p->ws
10880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
10890 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26  RTUALTABLE)!=0 &
108a0 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  & p->u.vtab.need
108b0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Free ){.      sq
108c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e  lite3_free(p->u.
108d0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
108e0 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65      p->u.vtab.ne
108f0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
10900 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53    p->u.vtab.idxS
10910 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  tr = 0;.    }els
10920 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67  e if( (p->wsFlag
10930 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
10940 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75  NDEX)!=0 && p->u
10950 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
10960 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10970 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
10980 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
10990 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73  ColAff);.      s
109a0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
109b0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
109c0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
109d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
109e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
109f0 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
10a00 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
10a10 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
10a20 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
10a30 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10a40 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
10a50 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10a60 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
10a70 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
10a80 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
10a90 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
10aa0 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
10ab0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
10ac0 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
10ad0 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
10ae0 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
10af0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10b00 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
10b10 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
10b20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
10b30 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10b40 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
10b50 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10b60 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
10b70 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
10b80 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
10b90 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
10ba0 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
10bb0 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
10bc0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
10bd0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
10be0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
10bf0 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
10c00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10c10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d  _NOMEM_BKPT;.  m
10c20 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
10c30 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
10c40 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
10c50 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
10c60 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
10c70 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
10c80 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
10c90 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
10ca0 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
10cb0 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
10cc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10cd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
10ce0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
10cf0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
10d00 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
10d10 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
10d20 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
10d30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
10d40 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
10d50 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
10d60 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
10d70 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
10d80 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
10d90 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
10da0 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
10db0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
10dc0 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
10dd0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
10de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10df0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  M_BKPT;.  }.  me
10e00 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
10e10 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
10e20 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
10e30 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
10e40 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
10e50 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
10e60 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
10e70 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
10e80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
10e90 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
10ea0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
10eb0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
10ec0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
10ed0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10ee0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
10ef0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
10f00 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
10f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10f20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10f30 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
10f40 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
10f50 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10f60 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
10f70 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10f80 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
10f90 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
10fa0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
10fb0 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
10fc0 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
10fd0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
10fe0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10ff0 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
11000 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
11010 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
11020 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
11030 70 57 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 66  pWInfo!=0 );.  f
11040 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
11050 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
11060 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
11070 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
11080 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ->a[i];.    if( 
11090 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26  pLevel->pWLoop &
110a0 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  & (pLevel->pWLoo
110b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
110c0 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20  RE_IN_ABLE) ){. 
110d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
110e0 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
110f0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
11100 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
11110 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61  3WhereClauseClea
11120 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  r(&pWInfo->sWC);
11130 0a 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f  .  while( pWInfo
11140 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
11150 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
11160 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
11170 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
11180 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
11190 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44  ;.    whereLoopD
111a0 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
111b0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
111c0 65 4e 4e 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  eNN(db, pWInfo);
111d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
111e0 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20   TRUE if all of 
111f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
11200 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
11210 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
11220 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
11230 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
11240 29 20 20 58 20 75 73 65 73 20 66 65 77 65 72 20  )  X uses fewer 
11250 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11260 6d 73 20 74 68 61 6e 20 59 0a 2a 2a 20 20 20 28  ms than Y.**   (
11270 33 29 20 20 45 76 65 72 79 20 57 48 45 52 45 20  3)  Every WHERE 
11280 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
11290 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73   by X is also us
112a0 65 64 20 62 79 20 59 0a 2a 2a 20 20 20 28 34 29  ed by Y.**   (4)
112b0 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61    X skips at lea
112c0 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d  st as many colum
112d0 6e 73 20 61 73 20 59 0a 2a 2a 20 20 20 28 35 29  ns as Y.**   (5)
112e0 20 20 49 66 20 58 20 69 73 20 61 20 63 6f 76 65    If X is a cove
112f0 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 61 6e  ring index, than
11300 20 59 20 69 73 20 74 6f 6f 0a 2a 2a 0a 2a 2a 20   Y is too.**.** 
11310 43 6f 6e 64 69 74 69 6f 6e 73 20 28 32 29 20 61  Conditions (2) a
11320 6e 64 20 28 33 29 20 6d 65 61 6e 20 74 68 61 74  nd (3) mean that
11330 20 58 20 69 73 20 61 20 22 70 72 6f 70 65 72 20   X is a "proper 
11340 73 75 62 73 65 74 22 20 6f 66 20 59 2e 0a 2a 2a  subset" of Y..**
11350 20 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65   If X is a prope
11360 72 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68  r subset of Y th
11370 65 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72  en Y is a better
11380 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68   choice and ough
11390 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c  t.** to have a l
113a0 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73  ower cost.  This
113b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
113c0 20 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20   TRUE when that 
113d0 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f  cost .** relatio
113e0 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65  nship is inverte
113f0 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  d and needs to b
11400 65 20 61 64 6a 75 73 74 65 64 2e 20 20 43 6f 6e  e adjusted.  Con
11410 73 74 72 61 69 6e 74 20 28 34 29 0a 2a 2a 20 77  straint (4).** w
11420 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65  as added because
11430 20 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d   if X uses skip-
11440 73 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59  scan less than Y
11450 20 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a   it still might.
11460 2a 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77  ** deserve a low
11470 65 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20  er cost even if 
11480 69 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  it is a proper s
11490 75 62 73 65 74 20 6f 66 20 59 2e 20 20 43 6f 6e  ubset of Y.  Con
114a0 73 74 72 61 69 6e 74 20 28 35 29 0a 2a 2a 20 77  straint (5).** w
114b0 61 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65  as added because
114c0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
114d0 78 20 70 72 6f 62 61 62 6c 79 20 64 65 73 65 72  x probably deser
114e0 76 65 73 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  ves to have a lo
114f0 77 65 72 20 63 6f 73 74 0a 2a 2a 20 74 68 61 6e  wer cost.** than
11500 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
11510 69 6e 64 65 78 20 65 76 65 6e 20 69 66 20 69 74  index even if it
11520 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
11530 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
11540 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
11550 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
11560 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
11570 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
11580 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
11590 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
115a0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
115b0 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
115c0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
115d0 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
115e0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
115f0 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
11600 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
11610 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
11620 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
11630 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
11640 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
11650 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
11660 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
11670 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11680 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
11690 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
116a0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
116b0 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
116c0 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
116d0 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
116e0 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
116f0 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
11700 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
11710 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
11720 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
11730 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
11740 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
11750 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
11760 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11770 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
11780 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
11790 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
117a0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
117b0 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
117c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
117d0 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
117e0 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
117f0 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
11800 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
11810 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
11820 20 69 66 28 20 28 70 58 2d 3e 77 73 46 6c 61 67   if( (pX->wsFlag
11830 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  s&WHERE_IDX_ONLY
11840 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 59 2d  )!=0 .   && (pY-
11850 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49  >wsFlags&WHERE_I
11860 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
11870 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11880 20 43 6f 6e 73 74 72 61 69 6e 74 20 28 35 29 20   Constraint (5) 
11890 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
118a0 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69  1;  /* All condi
118b0 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a  tions meet */.}.
118c0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64  ./*.** Try to ad
118d0 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66  just the cost of
118e0 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70   WhereLoop pTemp
118f0 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72 20  late upwards or 
11900 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20  downwards so.** 
11910 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  that:.**.**   (1
11920 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
11930 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20  s less than any 
11940 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
11950 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f 70   that are a prop
11960 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73  er.**       subs
11970 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a  et of pTemplate.
11980 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d  **.**   (2) pTem
11990 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65  plate costs more
119a0 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20   than any other 
119b0 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77  WhereLoops for w
119c0 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a  hich pTemplate.*
119d0 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72 6f  *       is a pro
119e0 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a  per subset..**.*
119f0 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c  * To say "WhereL
11a00 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70 65  oop X is a prope
11a10 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d  r subset of Y" m
11a20 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65 73  eans that X uses
11a30 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20   fewer.** WHERE 
11a40 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
11a50 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
11a60 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
11a70 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
11a80 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62  s.** also used b
11a90 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  y Y..*/.static v
11aa0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  oid whereLoopAdj
11ab0 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68  ustCost(const Wh
11ac0 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72  ereLoop *p, Wher
11ad0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
11ae0 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c  ){.  if( (pTempl
11af0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
11b00 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
11b10 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11b20 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  (; p; p=p->pNext
11b30 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70  Loop){.    if( p
11b40 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
11b50 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e  e->iTab ) contin
11b60 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  ue;.    if( (p->
11b70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
11b80 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f  INDEXED)==0 ) co
11b90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11ba0 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
11bb0 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20  ProperSubset(p, 
11bc0 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20  pTemplate) ){.  
11bd0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54      /* Adjust pT
11be0 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77  emplate cost dow
11bf0 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  nward so that it
11c00 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61 6e   is cheaper than
11c10 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73   its .      ** s
11c20 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20  ubset p. */.    
11c30 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
11c40 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74 20  0,("subset cost 
11c50 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64  adjustment %d,%d
11c60 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20   to %d,%d\n",.  
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11c90 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rRun, pTemplate-
11ca0 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20  >nOut, p->rRun, 
11cb0 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20  p->nOut-1));.   
11cc0 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
11cd0 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20  un = p->rRun;.  
11ce0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
11cf0 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20  Out = p->nOut - 
11d00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
11d10 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
11d20 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 54  rProperSubset(pT
11d30 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20  emplate, p) ){. 
11d40 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
11d50 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70  Template cost up
11d60 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20  ward so that it 
11d70 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e  is costlier than
11d80 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a   p since.      *
11d90 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  * pTemplate is a
11da0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
11db0 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45  f p */.      WHE
11dc0 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
11dd0 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
11de0 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
11df0 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
11e20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
11e30 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
11e40 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut+1));.      pT
11e50 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
11e60 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
11e70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
11e80 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20   p->nOut + 1;.  
11e90 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11ea0 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73 74   Search the list
11eb0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69   of WhereLoops i
11ec0 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e  n *ppPrev lookin
11ed0 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63  g for one that c
11ee0 61 6e 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65  an be.** replace
11ef0 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a  d by pTemplate..
11f00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  **.** Return NUL
11f10 4c 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64  L if pTemplate d
11f20 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f  oes not belong o
11f30 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  n the WhereLoop 
11f40 6c 69 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  list..** In othe
11f50 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
11f60 6c 61 74 65 20 6f 75 67 68 74 20 74 6f 20 62 65  late ought to be
11f70 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 66 75   dropped from fu
11f80 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
11f90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58  ion..**.** If pX
11fa0 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   is a WhereLoop 
11fb0 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63  that pTemplate c
11fc0 61 6e 20 72 65 70 6c 61 63 65 2c 20 74 68 65 6e  an replace, then
11fd0 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c   return the.** l
11fe0 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20  ink that points 
11ff0 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to pX..**.** If 
12000 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74  pTemplate cannot
12010 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
12020 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  sting element of
12030 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65   the list but ne
12040 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64  eds.** to be add
12050 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 61  ed to the list a
12060 73 20 61 20 6e 65 77 20 65 6e 74 72 79 2c 20 74  s a new entry, t
12070 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
12080 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74  nter to the.** t
12090 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ail of the list.
120a0 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
120b0 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70  Loop **whereLoop
120c0 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68  FindLesser(.  Wh
120d0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
120e0 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  ,.  const WhereL
120f0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29  oop *pTemplate.)
12100 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  {.  WhereLoop *p
12110 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72  ;.  for(p=(*ppPr
12120 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26  ev); p; ppPrev=&
12130 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d  p->pNextLoop, p=
12140 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66  *ppPrev){.    if
12150 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
12160 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d  late->iTab || p-
12170 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70  >iSortIdx!=pTemp
12180 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29  late->iSortIdx )
12190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69  {.      /* If ei
121a0 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72  ther the iTab or
121b0 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73   iSortIdx values
121c0 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f   for two WhereLo
121d0 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  op are different
121e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
121f0 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  hose WhereLoops 
12200 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
12210 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79  dered separately
12220 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20  .  Neither is.  
12230 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61      ** a candida
12240 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  te to replace th
12250 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  e other. */.    
12260 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
12270 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  }.    /* In the 
12280 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
12290 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74  tation, the rSet
122a0 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  up value is eith
122b0 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f  er zero.    ** o
122c0 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75  r the cost of bu
122d0 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
122e0 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e  tic index (NlogN
122f0 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a  ) and the NlogN.
12300 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
12310 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c  me for compatibl
12320 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f  e WhereLoops. */
12330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12340 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65  rSetup==0 || pTe
12350 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d  mplate->rSetup==
12360 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
12370 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70      || p->rSetup
12380 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  ==pTemplate->rSe
12390 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77  tup );..    /* w
123a0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
123b0 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61  () always genera
123c0 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20  tes and inserts 
123d0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
123e0 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  dex.    ** case 
123f0 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f  first.  Hence co
12400 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61  mpatible candida
12410 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  te WhereLoops ne
12420 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65  ver have a large
12430 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e  r.    ** rSetup.
12440 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50   Call this SETUP
12450 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20  -INVARIANT */.  
12460 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
12470 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
12480 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
12490 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67  * Any loop using
124a0 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64   an appliation-d
124b0 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72  efined index (or
124c0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a   PRIMARY KEY or.
124d0 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f      ** UNIQUE co
124e0 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f  nstraint) with o
124f0 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f  ne or more == co
12500 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65 74  nstraints is bet
12510 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
12520 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
12530 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ex. Unless it is
12540 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f   a skip-scan. */
12550 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
12560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
12570 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20  O_INDEX)!=0.    
12580 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
12590 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26  nSkip)==0.     &
125a0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
125b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
125c0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26  DEXED)!=0.     &
125d0 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  & (pTemplate->ws
125e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
125f0 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20  LUMN_EQ)!=0.    
12600 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26   && (p->prereq &
12610 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
12620 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
12630 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20  prereq.    ){.  
12640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12650 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73  ..    /* If exis
12660 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70  ting WhereLoop p
12670 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
12680 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70  pTemplate, pTemp
12690 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  late can be.    
126a0 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57  ** discarded.  W
126b0 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65  hereLoop p is be
126c0 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20  tter if:.    ** 
126d0 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20    (1)  p has no 
126e0 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65  more dependencie
126f0 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  s than pTemplate
12700 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
12710 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75  2)  p has an equ
12720 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  al or lower cost
12730 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a   than pTemplate.
12740 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
12750 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
12760 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
12770 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20  p->prereq    /* 
12780 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20  (1)  */.     && 
12790 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70  p->rSetup<=pTemp
127a0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20  late->rSetup    
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
127c0 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
127d0 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c   p->rRun<=pTempl
127e0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12800 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26  * (2b) */.     &
12810 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70  & p->nOut<=pTemp
12820 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29  /* (2c) */.    )
12850 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
12860 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54  ;  /* Discard pT
12870 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
12880 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d  ..    /* If pTem
12890 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20  plate is always 
128a0 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74  better than p, t
128b0 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62  hen cause p to b
128c0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20  e overwritten.  
128d0 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
128e0 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ate.  pTemplate 
128f0 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
12900 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31   if:.    **   (1
12910 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73  )  pTemplate has
12920 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65   no more depende
12930 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64  nces than p, and
12940 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
12950 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20  Template has an 
12960 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
12970 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20  ost than p..    
12980 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
12990 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
129a0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
129b0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20  plate->prereq   
129c0 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
129d0 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d  && p->rRun>=pTem
129e0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20          /* (2a) 
12a10 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
12a20 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut>=pTemplate->n
12a30 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29  /* (2b) */.    )
12a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12a70 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
12a80 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20  late->rSetup ); 
12a90 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  /* SETUP-INVARIA
12aa0 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20  NT above */.    
12ab0 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61    break;   /* Ca
12ac0 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72  use p to be over
12ad0 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70  written by pTemp
12ae0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  late */.    }.  
12af0 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65  }.  return ppPre
12b00 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  v;.}../*.** Inse
12b10 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20  rt or replace a 
12b20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
12b30 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  using the templa
12b40 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a  te supplied..**.
12b50 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57  ** An existing W
12b60 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d  hereLoop entry m
12b70 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74  ight be overwrit
12b80 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74  ten if the new t
12b90 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65  emplate.** is be
12ba0 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77  tter and has few
12bb0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  er dependencies.
12bc0 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74    Or the templat
12bd0 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  e will be ignore
12be0 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65  d.** and no inse
12bf0 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66  rt will occur if
12c00 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12c10 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72  reLoop is faster
12c20 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65   and has.** fewe
12c30 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  r dependencies t
12c40 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  han the template
12c50 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e  .  Otherwise a n
12c60 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ew WhereLoop is.
12c70 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f  ** added based o
12c80 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a  n the template..
12c90 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65  **.** If pBuilde
12ca0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74  r->pOrSet is not
12cb0 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61   NULL then we ca
12cc0 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68  re about only th
12cd0 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74  e.** prerequisit
12ce0 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20  es and rRun and 
12cf0 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68  nOut costs of th
12d00 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20  e N best loops. 
12d10 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61   That.** informa
12d20 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64  tion is gathered
12d30 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72   in the pBuilder
12d40 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e  ->pOrSet object.
12d50 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a    This special.*
12d60 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64  * processing mod
12d70 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66  e is used only f
12d80 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
12d90 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57  cessing..**.** W
12da0 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  hen accumulating
12db0 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20   multiple loops 
12dc0 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e  (when pBuilder->
12dd0 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20  pOrSet is NULL) 
12de0 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68  we.** still migh
12df0 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69  t overwrite simi
12e00 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74  lar loops with t
12e10 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  he new template 
12e20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65  if the.** new te
12e30 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
12e40 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
12e50 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
12e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
12e70 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
12e80 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
12e90 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
12ea0 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
12eb0 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
12ec0 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
12ed0 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
12ee0 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
12ef0 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
12f00 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
12f10 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
12f20 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
12f30 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
12f40 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
12f50 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
12f60 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61  rent loop.*/.sta
12f70 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
12f80 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f  pInsert(WhereLoo
12f90 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
12fa0 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  er, WhereLoop *p
12fb0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65  Template){.  Whe
12fc0 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
12fd0 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p;.  WhereInfo
12fe0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
12ff0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73  der->pWInfo;.  s
13000 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
13010 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
13020 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
13030 20 53 74 6f 70 20 74 68 65 20 73 65 61 72 63 68   Stop the search
13040 20 6f 6e 63 65 20 77 65 20 68 69 74 20 74 68 65   once we hit the
13050 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73   query planner s
13060 65 61 72 63 68 20 6c 69 6d 69 74 20 2a 2f 0a 20  earch limit */. 
13070 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 69   if( pBuilder->i
13080 50 6c 61 6e 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  PlanLimit==0 ){.
13090 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
130a0 78 66 66 66 66 66 66 66 66 2c 28 22 3d 3d 3d 20  xffffffff,("=== 
130b0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 73 65  query planner se
130c0 61 72 63 68 20 6c 69 6d 69 74 20 72 65 61 63 68  arch limit reach
130d0 65 64 20 3d 3d 3d 5c 6e 22 29 29 3b 0a 20 20 20  ed ===\n"));.   
130e0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70   if( pBuilder->p
130f0 4f 72 53 65 74 20 29 20 70 42 75 69 6c 64 65 72  OrSet ) pBuilder
13100 2d 3e 70 4f 72 53 65 74 2d 3e 6e 20 3d 20 30 3b  ->pOrSet->n = 0;
13110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13120 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 70  TE_DONE;.  }.  p
13130 42 75 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69  Builder->iPlanLi
13140 6d 69 74 2d 2d 3b 0a 0a 20 20 2f 2a 20 49 66 20  mit--;..  /* If 
13150 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
13160 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
13170 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
13180 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
13190 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
131a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
131b0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
131c0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
131d0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a  late->nLTerm ){.
131e0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
131f0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36  NABLED.      u16
13200 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
13210 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20  OrSet->n;.      
13220 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
13230 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
13240 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
13250 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
13260 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
13270 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
132a0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
132b0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
132c0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
132d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
132e0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
132f0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
13300 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
13310 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
13320 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
13330 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
13340 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
13350 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
13360 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
13370 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  if.    }.    ret
13380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13390 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
133a0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
133b0 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
133c0 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
133d0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
133e0 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
133f0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
13400 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
13410 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
13420 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
13430 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
13440 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
13450 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
13460 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
13470 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
13480 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
13490 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
134a0 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
134b0 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
134c0 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
134d0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
134e0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
134f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
13500 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
13510 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13520 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
13530 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
13540 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
13550 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
13560 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
13570 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
13580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
13590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
135a0 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
135b0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
135c0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
135d0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
135e0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
135f0 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
13600 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
13610 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
13620 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
13630 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
13640 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
13650 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
13660 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
13670 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
13680 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13690 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
136a0 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
136b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
136c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
136d0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
136e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
136f0 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
13700 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
13710 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
13720 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20 20 7d   with: ");.    }
13730 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
13740 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
13750 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20      add: ");.   
13760 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70   }.    whereLoop
13770 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
13780 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
13790 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
137a0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( p==0 ){.    /*
137b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
137c0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64  WhereLoop to add
137d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
137e0 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a  he list */.    *
137f0 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c  ppPrev = p = sql
13800 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
13810 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65  N(db, sizeof(Whe
13820 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66  reLoop));.    if
13830 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13850 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  T;.    whereLoop
13860 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
13870 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
13880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
13890 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
138a0 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
138b0 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
138c0 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
138d0 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
138e0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
138f0 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
13900 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
13910 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
13920 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
13930 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
13940 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
13950 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
13960 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
13970 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
13980 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
13990 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
139a0 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
139b0 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
139c0 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
139d0 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
139e0 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62  f( ppTail==0 ) b
139f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44  reak;.      pToD
13a00 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20  el = *ppTail;.  
13a10 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d      if( pToDel==
13a20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
13a30 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65   *ppTail = pToDe
13a40 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69  l->pNextLoop;.#i
13a50 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
13a60 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
13a70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13a80 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
13a90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13aa0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
13ab0 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20   delete: ");.   
13ac0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
13ad0 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
13ae0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
13af0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13b00 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
13b10 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
13b20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77    }.  }.  rc = w
13b30 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c  hereLoopXfer(db,
13b40 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a   p, pTemplate);.
13b50 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
13b60 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
13b70 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
13b80 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
13b90 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
13ba0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
13bb0 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  dex && pIndex->i
13bc0 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
13bd0 44 58 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20 20  DXTYPE_IPK ){.  
13be0 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
13bf0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
13c00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
13c20 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  t the WhereLoop.
13c30 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77  nOut value downw
13c40 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ard to account f
13c50 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  or terms of the.
13c60 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
13c70 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
13c80 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63  he loop but whic
13c90 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62  h are not used b
13ca0 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  y an.** index..*
13cb0 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48  .** For every WH
13cc0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
13cd0 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
13ce0 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
13cf0 20 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61   and which has a
13d00 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
13d10 74 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f  ty assigned by o
13d20 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69  ne of the likeli
13d30 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c  hood(),.** likel
13d40 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79  y(), or unlikely
13d50 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  () SQL functions
13d60 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74  , reduce the est
13d70 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a  imated number.**
13d80 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
13d90 62 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  by the probabili
13da0 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ty specified..**
13db0 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72  .** TUNING:  For
13dc0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
13dd0 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73  use term that is
13de0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
13df0 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68   index.** and wh
13e00 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ich does not hav
13e10 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72  e an assigned tr
13e20 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c  uth probability,
13e30 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64   heuristics.** d
13e40 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61  escribed below a
13e50 72 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74  re used to try t
13e60 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74  o estimate the t
13e70 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13e80 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65  ..** TODO --> Pe
13e90 72 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f  rhaps this is so
13ea0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75  mething that cou
13eb0 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62  ld be improved b
13ec0 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c  y better.** tabl
13ed0 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a  e statistics..**
13ee0 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a  .** Heuristic 1:
13ef0 20 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74    Estimate the t
13f00 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13f10 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65   as 93.75%.  The
13f20 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65   93.75%.** value
13f30 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
13f40 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74  -1 in LogEst not
13f50 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d  ation, so this m
13f60 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a  eans decrement.*
13f70 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  * the WhereLoop.
13f80 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65  nOut field for e
13f90 76 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20  very such WHERE 
13fa0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a  clause term..**.
13fb0 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20  ** Heuristic 2: 
13fc0 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
13fd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
13fe0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
13ff0 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22  of the.** form "
14000 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50  x==EXPR" and EXP
14010 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  R is not a const
14020 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e  ant 0 or 1, then
14030 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a   make sure the.*
14040 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72  * final output r
14050 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e  ow estimate is n
14060 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  o greater than 1
14070 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  /4 of the total 
14080 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
14090 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
140a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
140b0 20 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d   assume that x==
140c0 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72  EXPR will filter
140d0 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74  .** out at least
140e0 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73   3 out of 4 rows
140f0 2e 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31  .  If EXPR is -1
14100 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   or 0 or 1, then
14110 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78   maybe the.** "x
14120 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c  " column is bool
14130 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f  ean or else -1 o
14140 72 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f  r 0 or 1 is a co
14150 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c  mmon default val
14160 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22  ue.** on the "x"
14170 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69   column and so i
14180 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
14190 20 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20   cap the output 
141a0 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20  row estimate.** 
141b0 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f  at 1/2 instead o
141c0 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63  f 1/4..*/.static
141d0 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f   void whereLoopO
141e0 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57  utputAdjust(.  W
141f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
14200 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
14210 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
14220 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
14230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
14240 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e  p to adjust down
14250 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ward */.  LogEst
14260 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20   nRow           
14270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
14280 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ws in the entire
14290 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57   table */.){.  W
142a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
142b0 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20   *pX;.  Bitmask 
142c0 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70  notAllowed = ~(p
142d0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f  Loop->prereq|pLo
142e0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20  op->maskSelf);. 
142f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 4c 6f 67   int i, j;.  Log
14300 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30 3b  Est iReduce = 0;
14310 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f      /* pLoop->nO
14320 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78  ut should not ex
14330 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75 63  ceed nRow-iReduc
14340 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
14350 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
14360 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
14370 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  EX)==0 );.  for(
14380 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
14390 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
143a0 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
143b0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
143c0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  m!=0 );.    if( 
143d0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
143e0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
143f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
14400 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
14410 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
14420 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
14430 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
14440 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
14450 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
14460 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
14470 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
14480 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
14490 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
144a0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
144b0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
144c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
144d0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
144e0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
144f0 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
14500 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
14510 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
14520 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
14530 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
14540 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
14550 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
14560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
14570 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
14580 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
14590 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
145a0 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
145b0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
145c0 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
145d0 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
145e0 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
145f0 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
14600 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
14610 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
14620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14630 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
14640 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
14650 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
14660 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
14670 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
14680 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
14690 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
146a0 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
146b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
146c0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
146d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
146e0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
146f0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
14700 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
14710 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
14720 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b  .          int k
14730 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14740 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14750 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
14760 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  S );.          i
14770 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
14780 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
14790 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
147a0 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
147b0 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
147c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
147d0 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
147e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
147f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
14800 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
14810 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
14820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14830 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
14840 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
14850 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
14860 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
14870 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65  ce;.}../* .** Te
14880 72 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76 65  rm pTerm is a ve
14890 63 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61  ctor range compa
148a0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
148b0 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   The first compa
148c0 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  rison.** in the 
148d0 76 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70  vector can be op
148e0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f  timized using co
148f0 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20  lumn nEq of the 
14900 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66  index. This.** f
14910 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
14920 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
14930 20 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65   of vector eleme
14940 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  nts that can be 
14950 75 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  used.** as part 
14960 6f 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d  of the range com
14970 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  parison..**.** F
14980 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
14990 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
149a0 2a 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f  **   WHERE a = ?
149b0 20 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e   AND (b, c, d) >
149c0 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a   (?, ?, ?).**.**
149d0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a   and the index:.
149e0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
149f0 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20  NDEX ... ON (a, 
14a00 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a  b, c, d, e).**.*
14a10 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
14a20 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e  tion would be in
14a30 76 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31  voked with nEq=1
14a40 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
14a50 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20  rned in.** this 
14a60 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74  case is 3..*/.st
14a70 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
14a80 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
14a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14aa0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14ab0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
14ac0 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
14ad0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
14ae0 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e   on pIdx */.  In
14af0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
14b00 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
14b10 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  to be used for a
14b20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
14b30 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  traint */.  int 
14b40 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
14b50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
14b60 69 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ior equality con
14b70 73 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65  straints on same
14b80 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
14b90 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20  eTerm *pTerm    
14ba0 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69   /* The vector i
14bb0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
14bc0 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  aint */.){.  int
14bd0 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45   nCmp = sqlite3E
14be0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54  xprVectorSize(pT
14bf0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
14c00 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  t);.  int i;..  
14c10 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c  nCmp = MIN(nCmp,
14c20 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20   (pIdx->nColumn 
14c30 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69  - nEq));.  for(i
14c40 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =1; i<nCmp; i++)
14c50 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66  {.    /* Test if
14c60 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66   comparison i of
14c70 20 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74   pTerm is compat
14c80 69 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ible with column
14c90 20 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a   (i+nEq) .    **
14ca0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
14cb0 66 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20  f not, exit the 
14cc0 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68  loop.  */.    ch
14cd0 61 72 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  ar aff;         
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14cf0 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
14d00 74 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69  ty */.    char i
14d10 64 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20  dxaff = 0;      
14d20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14d30 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  ed columns affin
14d40 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  ity */.    CollS
14d50 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
14d60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
14d70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e  arison collation
14d80 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20   sequence */.   
14d90 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54   Expr *pLhs = pT
14da0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
14db0 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  t->x.pList->a[i]
14dc0 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
14dd0 20 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e   *pRhs = pTerm->
14de0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
14df0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
14e00 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
14e10 74 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20  t ){.      pRhs 
14e20 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63  = pRhs->x.pSelec
14e30 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
14e40 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
14e50 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
14e60 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  Rhs->x.pList->a[
14e70 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
14e80 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
14e90 61 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  at the LHS of th
14ea0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
14eb0 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
14ec0 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ce to.    ** the
14ed0 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66   right column of
14ee0 20 74 68 65 20 72 69 67 68 74 20 73 6f 75 72 63   the right sourc
14ef0 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61  e table. And tha
14f00 74 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a  t the sort.    *
14f10 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69  * order of the i
14f20 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74  ndex column is t
14f30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
14f40 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  ort order of the
14f50 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74  .    ** leftmost
14f60 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20   index column.  
14f70 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  */.    if( pLhs-
14f80 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
14f90 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54       || pLhs->iT
14fa0 61 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20  able!=iCur .    
14fb0 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d   || pLhs->iColum
14fc0 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n!=pIdx->aiColum
14fd0 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c  n[i+nEq] .     |
14fe0 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
14ff0 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d  er[i+nEq]!=pIdx-
15000 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
15010 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
15020 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
15030 74 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e  testcase( pLhs->
15040 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
15050 44 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73  D );.    aff = s
15060 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
15070 69 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69  inity(pRhs, sqli
15080 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
15090 70 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61  pLhs));.    idxa
150a0 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
150b0 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
150c0 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c  pIdx->pTable, pL
150d0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  hs->iColumn);.  
150e0 20 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66    if( aff!=idxaf
150f0 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  f ) break;..    
15100 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
15110 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
15120 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
15130 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28  , pRhs);.    if(
15140 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61   pColl==0 ) brea
15150 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
15160 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
15170 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
15180 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62  Coll[i+nEq]) ) b
15190 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
151a0 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn i;.}../*.** A
151b0 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
151c0 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
151d0 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
151e0 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
151f0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
15200 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
15210 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
15220 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15230 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
15240 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
15250 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
15260 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
15270 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
15280 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
15290 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
152a0 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
152b0 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
152c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
152d0 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
152e0 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
152f0 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
15300 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
15310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15320 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
15330 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
15340 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
15350 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
15360 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
15370 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
15380 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
15390 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
153a0 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
153b0 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
153c0 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
153d0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
153e0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
153f0 20 49 66 20 70 50 72 6f 62 65 2d 3e 69 64 78 54   If pProbe->idxT
15400 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
15410 59 50 45 5f 49 50 4b 2c 20 74 68 61 74 20 6d 65  YPE_IPK, that me
15420 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 0a 2a  ans pIndex is .*
15430 2a 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  * a fake index u
15440 73 65 64 20 66 6f 72 20 74 68 65 20 49 4e 54 45  sed for the INTE
15450 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
15460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15470 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
15480 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
15490 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
154a0 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
154b0 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
154c0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
154d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
154e0 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
154f0 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
15500 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
15510 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15530 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
15540 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
15550 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
15560 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
15570 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
15580 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
15590 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
155a0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
155b0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
155c0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
155d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
155e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
155f0 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
15600 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15610 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
15620 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15630 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
15640 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15650 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
15660 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
15670 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
15680 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
15690 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
156a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
156b0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
156c0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
156d0 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
156e0 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
156f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
15700 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
15710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
15720 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
15730 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
15740 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
15750 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
15760 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
15770 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
15780 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
15790 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
157a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
157b0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
157c0 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
157d0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
157e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
157f0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
15800 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
15810 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
15820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15830 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
15840 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
15850 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
15860 31 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20  16 saved_nBtm;  
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15880 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
15890 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
158a0 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20  e.nBtm */.  u16 
158b0 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20  saved_nTop;     
158c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
158d0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
158e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
158f0 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  Top */.  u16 sav
15900 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
15910 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
15920 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
15930 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75  ew->nSkip */.  u
15940 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
15950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15960 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
15970 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
15980 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61  s */.  LogEst sa
15990 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
159a0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
159b0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
159c0 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
159d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
159e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
159f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15a00 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
15a30 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
15a40 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
15a50 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
15a60 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
15a70 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
15a80 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
15a90 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d  Top = 0, *pBtm =
15aa0 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62   0; /* Top and b
15ab0 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73  ottom range cons
15ac0 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e  traints */..  pN
15ad0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
15ae0 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
15af0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
15b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15b10 4d 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54  M_BKPT;.  WHERET
15b20 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45  RACE(0x800, ("BE
15b30 47 49 4e 20 25 73 2e 61 64 64 42 74 72 65 65 49  GIN %s.addBtreeI
15b40 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 5c 6e  dx(%s), nEq=%d\n
15b50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15b60 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e          pProbe->
15b70 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 70 50  pTable->zName,pP
15b80 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65  robe->zName, pNe
15b90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 29  w->u.btree.nEq))
15ba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
15bb0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
15bc0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
15bd0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
15be0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15bf0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
15c00 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
15c10 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15c20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
15c30 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
15c40 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
15c50 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
15c60 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
15c70 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f  nBtm==0 );.    o
15c80 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
15c90 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
15ca0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49  WO_LT|WO_LE|WO_I
15cb0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d  SNULL|WO_IS;.  }
15cc0 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
15cd0 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
15ce0 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
15cf0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
15d00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
15d10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
15d20 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
15d30 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d  ;..  saved_nEq =
15d40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15d50 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d  Eq;.  saved_nBtm
15d60 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
15d70 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e  .nBtm;.  saved_n
15d80 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  Top = pNew->u.bt
15d90 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65  ree.nTop;.  save
15da0 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e  d_nSkip = pNew->
15db0 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
15dc0 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
15dd0 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
15de0 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
15df0 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
15e00 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
15e10 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
15e20 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
15e30 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
15e40 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
15e50 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
15e60 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61  Src->iCursor, sa
15e70 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20  ved_nEq,.       
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
15ea0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
15eb0 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20   = 0;.  rSize = 
15ec0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
15ed0 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69  Est[0];.  rLogSi
15ee0 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
15ef0 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d  e);.  for(; rc==
15f00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
15f10 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
15f20 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
15f30 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f  an)){.    u16 eO
15f40 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  p = pTerm->eOper
15f50 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74  ator;   /* Short
15f60 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e  hand for pTerm->
15f70 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
15f80 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78   LogEst rCostIdx
15f90 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75  ;.    LogEst nOu
15fa0 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20  tUnadjusted;    
15fb0 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f      /* nOut befo
15fc0 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52  re IN() and WHER
15fd0 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f  E adjustments */
15fe0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
15ff0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16000 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20  ENABLE_STAT4.   
16010 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
16020 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
16030 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
16040 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
16050 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
16060 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
16070 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
16080 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
16090 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
160a0 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
160b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
160c0 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
160d0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
160e0 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
160f0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
16100 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
16110 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
16120 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
16130 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
16140 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
16150 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
16160 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
16170 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
16180 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
16190 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
161a0 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
161b0 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
161c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
161d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
161e0 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
161f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
16200 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
16210 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
16220 61 6c 6c 6f 77 20 63 6f 6e 73 74 72 61 69 6e 74  allow constraint
16230 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  s from the WHERE
16240 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
16250 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
16260 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
16270 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e  a LEFT JOIN.  On
16280 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ly constraints i
16290 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
162a0 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77  are.    ** allow
162b0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  ed */.    if( (p
162c0 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
162d0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
162e0 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
162f0 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
16300 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
16310 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
16320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
16330 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75  .    if( IsUniqu
16340 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26  eIndex(pProbe) &
16350 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
16360 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29  obe->nKeyCol-1 )
16370 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
16380 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
16390 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45  LITE_BLDF_UNIQUE
163a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
163b0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
163c0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
163d0 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20  BLDF_INDEXED;.  
163e0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73    }.    pNew->ws
163f0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
16400 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
16410 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
16420 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
16430 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
16440 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
16450 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
16460 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
16470 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  op;.    pNew->nL
16480 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
16490 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
164a0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
164b0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
164c0 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
164d0 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
164e0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
164f0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
16500 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
16510 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
16520 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
16530 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
16540 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
16550 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
16560 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
16570 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
16580 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
16590 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
165a0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
165b0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
165c0 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
165d0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
165e0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
165f0 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
16600 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
16610 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
16620 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
16630 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
16640 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16660 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16670 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
16680 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
16690 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
166a0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
166b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
166c0 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  ;.        nIn = 
166d0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
166e0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
166f0 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  5) );..        /
16700 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
16710 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
16720 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78 2c   of the form (x,
16730 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e   y) IN (SELECT..
16740 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  .)..        ** I
16750 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
16760 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65 20  e is a separate 
16770 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f 66  term for each of
16780 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20 20   (x) and (y)..  
16790 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
167a0 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70  , the nIn multip
167b0 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  lier should only
167c0 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63 65   be applied once
167d0 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20  , not once.     
167e0 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 73     ** for each s
167f0 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66 6f  uch term. The fo
16800 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65  llowing loop che
16810 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20 69  cks that pTerm i
16820 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
16830 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72 6d   first such term
16840 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65 74   in use, and set
16850 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30 20  s nIn back to 0 
16860 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f  if it is not. */
16870 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
16880 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ; i<pNew->nLTerm
16890 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
168a0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c      if( pNew->aL
168b0 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d  Term[i] && pNew-
168c0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
168d0 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20 3d  r==pExpr ) nIn =
168e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
168f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
16900 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
16910 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
16920 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
16930 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
16940 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
16950 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
16960 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
16970 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
16980 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
16990 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
169a0 70 50 72 6f 62 65 2d 3e 68 61 73 53 74 61 74 31  pProbe->hasStat1
169b0 20 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   ){.        LogE
169c0 73 74 20 4d 2c 20 6c 6f 67 4b 2c 20 73 61 66 65  st M, logK, safe
169d0 74 79 4d 61 72 67 69 6e 3b 0a 20 20 20 20 20 20  tyMargin;.      
169e0 20 20 2f 2a 20 4c 65 74 3a 0a 20 20 20 20 20 20    /* Let:.      
169f0 20 20 2a 2a 20 20 20 4e 20 3d 20 74 68 65 20 74    **   N = the t
16a00 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  otal number of r
16a10 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
16a20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 4b 20  .        **   K 
16a30 3d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  = the number of 
16a40 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 52  entries on the R
16a50 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
16a60 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  rator.        **
16a70 20 20 20 4d 20 3d 20 74 68 65 20 6e 75 6d 62 65     M = the numbe
16a80 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
16a90 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
16aa0 68 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 0a  h terms to the .
16ab0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
16ac0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 69 6e 20   to the left in 
16ad0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
16ae0 20 49 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   If the IN opera
16af0 74 6f 72 20 69 73 20 6f 6e 0a 20 20 20 20 20 20  tor is on.      
16b00 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 6c    **       the l
16b10 65 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78 20 63  eft-most index c
16b20 6f 6c 75 6d 6e 2c 20 4d 3d 3d 4e 2e 0a 20 20 20  olumn, M==N..   
16b30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16b40 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 64 65 66  ** Given the def
16b50 69 6e 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20  initions above, 
16b60 69 74 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  it is better to 
16b70 6f 6d 69 74 20 74 68 65 20 49 4e 20 6f 70 65 72  omit the IN oper
16b80 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ator.        ** 
16b90 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 6c  from the index l
16ba0 6f 6f 6b 75 70 20 61 6e 64 20 69 6e 73 74 65 61  ookup and instea
16bb0 64 20 64 6f 20 61 20 73 63 61 6e 20 6f 66 20 74  d do a scan of t
16bc0 68 65 20 4d 20 65 6c 65 6d 65 6e 74 73 2c 0a 20  he M elements,. 
16bd0 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 69 6e         ** testin
16be0 67 20 65 61 63 68 20 73 63 61 6e 6e 65 64 20 72  g each scanned r
16bf0 6f 77 20 61 67 61 69 6e 73 74 20 74 68 65 20 49  ow against the I
16c00 4e 20 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72  N operator separ
16c10 61 74 65 6c 79 2c 20 69 66 3a 0a 20 20 20 20 20  ately, if:.     
16c20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16c30 20 20 20 20 20 20 20 20 4d 2a 6c 6f 67 28 4b 29          M*log(K)
16c40 20 3c 20 4b 2a 6c 6f 67 28 4e 29 0a 20 20 20 20   < K*log(N).    
16c50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16c60 2a 20 4f 75 72 20 65 73 74 69 6d 61 74 65 73 20  * Our estimates 
16c70 66 6f 72 20 4d 2c 20 4b 2c 20 61 6e 64 20 4e 20  for M, K, and N 
16c80 6d 69 67 68 74 20 62 65 20 69 6e 61 63 63 75 72  might be inaccur
16c90 61 74 65 2c 20 73 6f 20 77 65 20 62 75 69 6c 64  ate, so we build
16ca0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   in.        ** a
16cb0 20 73 61 66 65 74 79 20 6d 61 72 67 69 6e 20 6f   safety margin o
16cc0 66 20 32 20 28 4c 6f 67 45 73 74 3a 20 31 30 29  f 2 (LogEst: 10)
16cd0 20 74 68 61 74 20 66 61 76 6f 72 73 20 75 73 69   that favors usi
16ce0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
16cf0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  or.        ** wi
16d00 74 68 20 74 68 65 20 69 6e 64 65 78 2c 20 61 73  th the index, as
16d10 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
16d20 68 61 73 20 62 65 74 74 65 72 20 77 6f 72 73 74  has better worst
16d30 2d 63 61 73 65 20 62 65 68 61 76 69 6f 72 2e 0a  -case behavior..
16d40 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
16d50 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 72 65 61   do not have rea
16d60 6c 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  l sqlite_stat1 d
16d70 61 74 61 2c 20 61 6c 77 61 79 73 20 70 72 65 66  ata, always pref
16d80 65 72 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  er to use.      
16d90 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a    ** the index..
16da0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16db0 20 20 20 4d 20 3d 20 70 50 72 6f 62 65 2d 3e 61     M = pProbe->a
16dc0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
16dd0 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 6c  _nEq];.        l
16de0 6f 67 4b 20 3d 20 65 73 74 4c 6f 67 28 6e 49 6e  ogK = estLog(nIn
16df0 29 3b 0a 20 20 20 20 20 20 20 20 73 61 66 65 74  );.        safet
16e00 79 4d 61 72 67 69 6e 20 3d 20 31 30 3b 20 20 2f  yMargin = 10;  /
16e10 2a 20 54 55 4e 49 4e 47 3a 20 65 78 74 72 61 20  * TUNING: extra 
16e20 77 65 69 67 68 74 20 66 6f 72 20 69 6e 64 65 78  weight for index
16e30 65 64 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ed IN */.       
16e40 20 69 66 28 20 4d 20 2b 20 6c 6f 67 4b 20 2b 20   if( M + logK + 
16e50 73 61 66 65 74 79 4d 61 72 67 69 6e 20 3c 20 6e  safetyMargin < n
16e60 49 6e 20 2b 20 72 4c 6f 67 53 69 7a 65 20 29 7b  In + rLogSize ){
16e70 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
16e80 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20 20  TRACE(0x40,.    
16e90 20 20 20 20 20 20 20 20 28 22 53 63 61 6e 20 70          ("Scan p
16ea0 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 49 4e  referred over IN
16eb0 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20 63 6f 6c   operator on col
16ec0 75 6d 6e 20 25 64 20 6f 66 20 5c 22 25 73 5c 22  umn %d of \"%s\"
16ed0 20 28 25 64 3c 25 64 29 5c 6e 22 2c 0a 20 20 20   (%d<%d)\n",.   
16ee0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 5f            saved_
16ef0 6e 45 71 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  nEq, pProbe->zNa
16f00 6d 65 2c 20 4d 2b 6c 6f 67 4b 2b 31 30 2c 20 6e  me, M+logK+10, n
16f10 49 6e 2b 72 4c 6f 67 53 69 7a 65 29 29 3b 0a 20  In+rLogSize));. 
16f20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
16f30 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
16f40 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  {.          WHER
16f50 45 54 52 41 43 45 28 30 78 34 30 2c 0a 20 20 20  ETRACE(0x40,.   
16f60 20 20 20 20 20 20 20 20 20 28 22 49 4e 20 6f 70           ("IN op
16f70 65 72 61 74 6f 72 20 70 72 65 66 65 72 72 65 64  erator preferred
16f80 20 6f 6e 20 63 6f 6c 75 6d 6e 20 25 64 20 6f 66   on column %d of
16f90 20 5c 22 25 73 5c 22 20 28 25 64 3e 3d 25 64 29   \"%s\" (%d>=%d)
16fa0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16fb0 20 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 50 72    saved_nEq, pPr
16fc0 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 4d 2b 6c 6f  obe->zName, M+lo
16fd0 67 4b 2b 31 30 2c 20 6e 49 6e 2b 72 4c 6f 67 53  gK+10, nIn+rLogS
16fe0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ize));.        }
16ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17000 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
17010 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
17020 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
17030 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
17040 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  S) ){.      int 
17050 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
17060 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45  iColumn[saved_nE
17070 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  q];.      pNew->
17080 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
17090 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
170a0 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f    assert( saved_
170b0 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72  nEq==pNew->u.btr
170c0 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20  ee.nEq );.      
170d0 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  if( iCol==XN_ROW
170e0 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69  ID .       || (i
170f0 43 6f 6c 3e 3d 30 20 26 26 20 6e 49 6e 4d 75 6c  Col>=0 && nInMul
17100 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71  ==0 && saved_nEq
17110 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
17120 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  l-1).      ){.  
17130 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
17140 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 72 6f  XN_ROWID || pPro
17150 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  be->uniqNotNull 
17160 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50  .         || (pP
17170 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  robe->nKeyCol==1
17180 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
17190 72 6f 72 20 26 26 20 65 4f 70 3d 3d 57 4f 5f 45  ror && eOp==WO_E
171a0 51 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Q) .        ){. 
171b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
171c0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
171d0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  ONEROW;.        
171e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
171f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
17200 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54  = WHERE_UNQ_WANT
17210 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ED;.        }.  
17220 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
17230 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
17240 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
17250 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
17260 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
17270 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
17280 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
17290 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
172a0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
172b0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
172c0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
172d0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
172e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
172f0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
17300 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
17310 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
17320 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52  ee.nBtm = whereR
17330 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20  angeVectorLen(. 
17340 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
17350 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
17360 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
17370 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29  q, pTerm.      )
17380 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
17390 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
173a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
173b0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
173c0 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b   TERM_LIKEOPT ){
173d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  .        /* Rang
173e0 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61  e contraints tha
173f0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20  t come from the 
17400 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
17410 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  n are.        **
17420 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20   always used in 
17430 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  pairs. */.      
17440 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b    pTop = &pTerm[
17450 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
17460 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d  rt( (pTop-(pTerm
17470 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d  ->pWC->a))<pTerm
17480 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a  ->pWC->nTerm );.
17490 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
174a0 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20  pTop->wtFlags & 
174b0 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a  TERM_LIKEOPT );.
174c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
174d0 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pTop->eOperator=
174e0 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =WO_LT );.      
174f0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
17500 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
17510 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
17520 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
17530 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
17540 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
17550 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a  Term++] = pTop;.
17560 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
17570 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
17580 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
17590 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
175a0 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  nTop = 1;.      
175b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
175c0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
175d0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
175e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
175f0 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b  ( eOp & WO_LT );
17600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17610 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a   eOp & WO_LE );.
17620 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
17630 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
17640 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
17650 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
17660 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17670 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Top = whereRange
17680 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
17690 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
176a0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
176b0 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
176c0 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
176d0 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
176e0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
176f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
17700 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
17710 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
17720 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
17730 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
17740 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
17750 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
17760 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e  is point pNew->n
17770 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
17780 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
17790 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20   expected to.   
177a0 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62   ** be visited b
177b0 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  y the index scan
177c0 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72   before consider
177d0 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20  ing term pTerm, 
177e0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  or the.    ** va
177f0 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20  lues of nIn and 
17800 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72  nInMul. In other
17810 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67   words, assuming
17820 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
17830 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65  * "x IN(...)" te
17840 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64  rms are replaced
17850 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54   with "x = ?". T
17860 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  his block update
17870 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  s.    ** the val
17880 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
17890 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
178a0 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e  pTerm (but not n
178b0 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a  In/nInMul).  */.
178c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
178d0 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
178e0 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ut );.    if( pN
178f0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
17900 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
17910 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
17920 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73  ust nOut using s
17930 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
17940 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
17950 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  at4.      ** dat
17960 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74  a, using some ot
17970 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a  her estimate.  *
17980 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  /.      whereRan
17990 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
179a0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d  , pBuilder, pBtm
179b0 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20  , pTop, pNew);. 
179c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
179d0 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77  int nEq = ++pNew
179e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
179f0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
17a00 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
17a10 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29  _EQ|WO_IN|WO_IS)
17a20 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
17a30 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
17a40 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20  aved_nOut );.   
17a50 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
17a60 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50  uthProb<=0 && pP
17a70 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
17a80 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a  aved_nEq]>=0 ){.
17a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17aa0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
17ab0 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
17ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17ad0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
17ae0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
17af0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
17b00 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
17b10 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
17b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
17b30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17b40 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
17b50 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
17b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
17b70 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
17b80 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
17b90 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
17ba0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17bb0 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
17bc0 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
17bd0 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
17be0 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
17bf0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
17c00 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
17c10 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 20 26  ect)).         &
17c20 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
17c30 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
17c40 5f 53 74 61 74 34 29 0a 20 20 20 20 20 20 20 20  _Stat4).        
17c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
17c60 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
17c70 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
17c80 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57     if( (eOp & (W
17c90 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
17ca0 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  O_IS))!=0 ){.   
17cb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
17cc0 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29  e( eOp & WO_EQ )
17cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
17ce0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
17cf0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
17d00 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
17d10 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
17d20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17d30 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17d40 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
17d50 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  der, pExpr->pRig
17d60 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  ht, &nOut);.    
17d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17d80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
17d90 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61  ereInScanEst(pPa
17da0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
17db0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  Expr->x.pList, &
17dc0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
17dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
17de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
17df0 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
17e00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
17e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17e20 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20  OK ) break;     
17e30 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74       /* Jump out
17e40 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f   of the pTerm lo
17e50 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  op */.          
17e60 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20  if( nOut ){.    
17e70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
17e80 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
17e90 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st(nOut);.      
17ea0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
17eb0 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20  nOut>saved_nOut 
17ec0 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73  ) pNew->nOut = s
17ed0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20  aved_nOut;.     
17ee0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
17ef0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
17f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17f10 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
17f20 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  ==0 ).#endif.   
17f30 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
17f40 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28   pNew->nOut += (
17f50 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
17f60 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62  Est[nEq] - pProb
17f70 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
17f80 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  Eq-1]);.        
17f90 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
17fa0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
17fb0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
17fc0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
17fd0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
17fe0 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  e, assume that a
17ff0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
18000 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65   "col IS NULL" e
18010 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
18020 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20  s twice as many 
18030 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20 20  rows .          
18040 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e    ** as (col=?).
18050 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
18060 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30  pNew->nOut += 10
18070 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18090 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
180a0 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68  t rCostIdx to th
180b0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
180c0 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73  ng selected rows
180d0 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20   in index. Add. 
180e0 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77     ** it to pNew
180f0 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73  ->rRun, which is
18100 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
18110 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  o the cost of th
18120 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73  e index.    ** s
18130 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20  eek only. Then, 
18140 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  if this is a non
18150 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c  -covering index,
18160 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66   add the cost of
18170 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67  .    ** visiting
18180 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
18190 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f   main table.  */
181a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
181b0 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
181c0 77 3e 30 20 29 3b 0a 20 20 20 20 72 43 6f 73 74  w>0 );.    rCost
181d0 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
181e0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
181f0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
18200 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
18210 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
18220 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
18230 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
18240 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
18250 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
18260 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
18270 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
18280 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
18290 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
182a0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
182b0 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
182c0 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
182d0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
182e0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
182f0 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
18300 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
18310 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
18320 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
18330 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
18340 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
18350 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
18360 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
18370 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18380 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
18390 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
183a0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
183b0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
183c0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
183d0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
183e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
183f0 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
18400 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18410 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
18420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
18430 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
18440 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
18450 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
18460 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
18470 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
18480 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
18490 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
184a0 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
184b0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
184c0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
184d0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
184e0 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
184f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
18500 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
18510 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
18520 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
18530 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
18540 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
18550 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
18560 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
18570 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
18580 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18590 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
185a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
185b0 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74  nBtm = saved_nBt
185c0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  m;.  pNew->u.btr
185d0 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
185e0 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  nTop;.  pNew->nS
185f0 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
18600 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  p;.  pNew->wsFla
18610 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
18620 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  gs;.  pNew->nOut
18630 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
18640 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
18650 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20  saved_nLTerm;.. 
18660 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69   /* Consider usi
18670 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  ng a skip-scan i
18680 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  f there are no W
18690 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
186a0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61  traints.  ** ava
186b0 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ilable for the l
186c0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f  eft-most terms o
186d0 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
186e0 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a   if the average.
186f0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
18700 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65  epeats in the le
18710 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73  ft-most terms is
18720 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20   at least 18. . 
18730 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67   **.  ** The mag
18740 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20  ic number 18 is 
18750 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20  selected on the 
18760 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e  basis that scann
18770 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a  ing 17 rows.  **
18780 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
18790 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61  s quicker than a
187a0 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76  n index seek (ev
187b0 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65  en though if the
187c0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74   index.  ** cont
187d0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
187e0 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73  2^17 rows we ass
187f0 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e  ume otherwise in
18800 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a   other parts of.
18810 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20    ** the code). 
18820 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20  And, even if it 
18830 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c  is not, it shoul
18840 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63  d not be too muc
18850 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20  h slower. .  ** 
18860 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
18870 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65  d, the extra see
18880 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20  ks could end up 
18890 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e  being significan
188a0 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78  tly.  ** more ex
188b0 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61  pensive.  */.  a
188c0 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74  ssert( 42==sqlit
188d0 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a  e3LogEst(18) );.
188e0 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d    if( saved_nEq=
188f0 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20  =saved_nSkip.   
18900 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70  && saved_nEq+1<p
18910 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20  Probe->nKeyCol. 
18920 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53    && pProbe->noS
18930 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26  kipScan==0.   &&
18940 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
18950 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
18960 53 6b 69 70 53 63 61 6e 29 0a 20 20 20 26 26 20  SkipScan).   && 
18970 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
18980 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
18990 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  >=42  /* TUNING:
189a0 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69   Minimum for ski
189b0 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20  p-scan */.   && 
189c0 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52  (rc = whereLoopR
189d0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
189e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29  pNew->nLTerm+1))
189f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  ==SQLITE_OK.  ){
18a00 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65  .    LogEst nIte
18a10 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  r;.    pNew->u.b
18a20 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
18a30 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20  pNew->nSkip++;. 
18a40 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
18a50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
18a60 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
18a70 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
18a80 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
18a90 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
18aa0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
18ab0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
18ac0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
18ad0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
18ae0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
18af0 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
18b00 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72 74    Because uncert
18b10 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65  ainties in the e
18b20 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69  stimates for ski
18b30 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a  p-scan queries,.
18b40 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33      ** add a 1.3
18b50 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72 20  75 fudge factor 
18b60 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61  to make skip-sca
18b70 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20  n slightly less 
18b80 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e  likely. */.    n
18b90 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77  Iter += 5;.    w
18ba0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18bb0 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
18bc0 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
18bd0 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20  ter + nInMul);. 
18be0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
18bf0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
18c00 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
18c10 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
18c20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
18c30 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
18c40 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18c50 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
18c60 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52 41  .  }..  WHERETRA
18c70 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44 20  CE(0x800, ("END 
18c80 25 73 2e 61 64 64 42 74 72 65 65 49 64 78 28 25  %s.addBtreeIdx(%
18c90 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25  s), nEq=%d, rc=%
18ca0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f              pPro
18cc0 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  be->pTable->zNam
18cd0 65 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  e, pProbe->zName
18ce0 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 72 63 29  , saved_nEq, rc)
18cf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18d10 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f  True if it is po
18d20 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64  ssible that pInd
18d30 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66  ex might be usef
18d40 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ul in.** impleme
18d50 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
18d60 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75  BY clause in pBu
18d70 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ilder..**.** Ret
18d80 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75  urn False if pBu
18d90 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63  ilder does not c
18da0 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20  ontain an ORDER 
18db0 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20  BY clause or.** 
18dc0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
18dd0 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f  ay for pIndex to
18de0 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d   be useful in im
18df0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a  plementing that.
18e00 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
18e10 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
18e20 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70  t indexMightHelp
18e30 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57  WithOrderBy(.  W
18e40 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
18e50 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64  *pBuilder,.  Ind
18e60 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e  ex *pIndex,.  in
18e70 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45  t iCursor.){.  E
18e80 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20  xprList *pOB;.  
18e90 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78  ExprList *aColEx
18ea0 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  pr;.  int ii, jj
18eb0 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ;..  if( pIndex-
18ec0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65  >bUnordered ) re
18ed0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
18ee0 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  OB = pBuilder->p
18ef0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
18f00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18f10 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
18f20 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  OB->nExpr; ii++)
18f30 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
18f40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
18f50 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b  kipCollateAndLik
18f60 65 6c 79 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ely(pOB->a[ii].p
18f70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
18f80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18f90 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
18fa0 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
18fb0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
18fc0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
18fd0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
18fe0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
18ff0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
19000 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
19010 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
19020 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19030 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
19040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19050 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20  e if( (aColExpr 
19060 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  = pIndex->aColEx
19070 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pr)!=0 ){.      
19080 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
19090 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
190a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
190b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
190c0 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29  n[jj]!=XN_EXPR )
190d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
190e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
190f0 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45  prCompareSkip(pE
19100 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b  xpr,aColExpr->a[
19110 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f  jj].pExpr,iCurso
19120 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
19130 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19160 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n 0;.}../* Check
19170 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
19180 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
19190 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
191a0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
191b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
191c0 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
191d0 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
191e0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
191f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19200 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
19210 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
19220 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19230 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
19240 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
19250 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
19260 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
19270 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50   pWC->pWInfo->pP
19280 61 72 73 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  arse;.  while( p
19290 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
192a0 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68  D ){.    if( !wh
192b0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
192c0 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70  Index(iTab,pWC,p
192d0 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20  Where->pLeft) ) 
192e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57  return 0;.    pW
192f0 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
19300 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Right;.  }.  if(
19310 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
19320 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62  gs & SQLITE_Enab
19330 6c 65 51 50 53 47 20 29 20 70 50 61 72 73 65 20  leQPSG ) pParse 
19340 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
19350 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
19360 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
19370 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
19380 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
19390 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
193a0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21  Expr;.    if( (!
193b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
193c0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
193d0 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
193e0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
193f0 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c  Tab).     && sql
19400 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
19410 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
19420 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
19430 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
19440 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
19450 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19460 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
19470 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
19480 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
19490 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
194a0 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
194b0 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65  .** is identifie
194c0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
194d0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
194e0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
194f0 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
19500 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
19510 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
19520 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73  e..**.** The cos
19530 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52  ts (WhereLoop.rR
19540 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65  un) of the b-tre
19550 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79  e loops added by
19560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
19570 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  * are calculated
19580 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
19590 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63  ** For a full sc
195a0 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  an, assuming the
195b0 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78   table (or index
195c0 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  ) contains nRow 
195d0 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rows:.**.**     
195e0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e  cost = nRow * 3.
195f0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
19600 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62       // full-tab
19610 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63  le scan.**     c
19620 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20  ost = nRow * K  
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63      // scan of c
19650 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
19660 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
19670 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20   * (K+3.0)      
19680 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
19690 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  n of non-coverin
196a0 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68  g index.**.** wh
196b0 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65  ere K is a value
196c0 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
196d0 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f   3.0 set based o
196e0 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a  n the relative .
196f0 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65  ** estimated ave
19700 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65  rage size of the
19710 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
19720 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
19730 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61  For an index sca
19740 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20  n, where nVisit 
19750 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19760 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69   index rows visi
19770 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63  ted.** by the sc
19780 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73  an, and nSeek is
19790 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
197a0 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  eek operations r
197b0 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74  equired on .** t
197c0 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a  he index b-tree:
197d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
197e0 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
197f0 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69  Row) + K * nVisi
19800 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63  t)          // c
19810 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
19820 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
19830 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
19840 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69   (K+3.0) * nVisi
19850 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76  t)    // non-cov
19860 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
19870 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65  * Normally, nSee
19880 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61  k is 1. nSeek va
19890 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
198a0 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69  n 1 come about i
198b0 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  f the .** WHERE 
198c0 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20  clause includes 
198d0 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65  "x IN (....)" te
198e0 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63  rms used in plac
198f0 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77  e of "x=?". Or w
19900 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74  hen .** implicit
19910 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78   "x IN (SELECT x
19920 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d   FROM tbl)" term
19930 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20  s are added for 
19940 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  skip-scans..**.*
19950 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20  * The estimated 
19960 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56  values (nRow, nV
19970 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74  isit, nSeek) oft
19980 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72  en contain a lar
19990 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  ge amount.** of 
199a0 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f  uncertainty.  Fo
199b0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73  r this reason, s
199c0 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e  coring is design
199d0 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73  ed to pick plans
199e0 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65   that.** "do the
199f0 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20   least harm" if 
19a00 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72  the estimates ar
19a10 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46  e inaccurate.  F
19a20 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a  or example, a.**
19a30 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f   log(nRow) facto
19a40 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
19a50 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  m a non-covering
19a60 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f   index scan in o
19a70 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20  rder to.** bias 
19a80 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66  the scoring in f
19a90 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e  avor of using an
19aa0 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68   index, since th
19ab0 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20  e worst-case.** 
19ac0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75  performance of u
19ad0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73  sing an index is
19ae0 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e   far better than
19af0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20   the worst-case 
19b00 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f  performance.** o
19b10 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
19b20 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
19b30 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
19b40 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
19b50 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
19b60 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
19b70 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
19b80 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  */.  Bitmask mPr
19b90 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20 20  ereq            
19ba0 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
19bb0 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
19bc0 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
19bd0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
19be0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
19bf0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
19c00 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
19c10 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19c30 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
19c40 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
19c50 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
19c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19c70 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
19c80 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
19c90 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
19ca0 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
19cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
19cc0 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
19cd0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
19ce0 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
19cf0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
19d00 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
19d10 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
19d20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
19d30 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
19d40 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
19d50 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
19d60 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
19d70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
19d80 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
19d90 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
19da0 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
19db0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
19dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
19dd0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
19de0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
19df0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
19e00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19e10 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
19e20 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
19e30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19e40 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
19e50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19e60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
19e70 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
19e80 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
19e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
19ea0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
19eb0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
19ec0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
19ee0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
19ef0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19f00 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
19f10 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19f20 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
19f30 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
19f40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
19f50 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
19f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
19f70 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
19f80 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
19f90 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19fa0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
19fb0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
19fc0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
19fd0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
19fe0 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
19ff0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
1a000 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
1a010 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
1a020 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
1a030 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
1a040 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
1a050 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
1a060 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
1a070 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a080 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
1a090 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
1a0a0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
1a0b0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42  robe = pSrc->pIB
1a0c0 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
1a0d0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1a0e0 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
1a0f0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1a100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a110 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
1a120 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
1a130 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
1a140 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
1a150 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
1a160 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
1a170 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
1a180 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1a190 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
1a1a0 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
1a1b0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
1a1c0 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
1a1d0 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
1a1e0 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
1a1f0 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
1a200 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
1a210 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1a220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a230 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
1a240 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
1a250 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
1a260 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
1a270 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
1a280 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
1a290 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
1a2a0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
1a2b0 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
1a2c0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
1a2d0 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
1a2e0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
1a2f0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
1a300 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
1a310 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
1a320 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
1a330 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
1a340 73 50 6b 2e 69 64 78 54 79 70 65 20 3d 20 53 51  sPk.idxType = SQ
1a350 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 49 50 4b  LITE_IDXTYPE_IPK
1a360 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
1a370 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
1a380 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
1a390 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
1a3a0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
1a3b0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
1a3c0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67      if( pSrc->fg
1a3d0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
1a3e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1a3f0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
1a400 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
1a410 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
1a420 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
1a430 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
1a440 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
1a450 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
1a460 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
1a470 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
1a480 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
1a490 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
1a4a0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
1a4b0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
1a4c0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
1a4d0 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
1a4e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
1a4f0 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
1a500 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
1a510 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
1a520 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20  der->pOrSet     
1a530 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20   /* Not part of 
1a540 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  an OR optimizati
1a550 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49  on */.   && (pWI
1a560 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1a570 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
1a580 41 55 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28  AUSE)==0.   && (
1a590 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1a5a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a5b0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
1a5c0 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42  .   && pSrc->pIB
1a5d0 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a  Index==0      /*
1a5e0 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
1a5f0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
1a600 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  && !pSrc->fg.not
1a610 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73  Indexed   /* Has
1a620 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
1a630 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
1a640 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20  HasRowid(pTab)  
1a650 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49         /* Not WI
1a660 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1a670 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e  e. (FIXME: Why n
1a680 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70  ot?) */.   && !p
1a690 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  Src->fg.isCorrel
1a6a0 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f  ated /* Not a co
1a6b0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
1a6c0 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  y */.   && !pSrc
1a6d0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
1a6e0 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72    /* Not a recur
1a6f0 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
1a700 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
1a710 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
1a720 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
1a730 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
1a740 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1a750 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
1a760 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
1a770 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
1a780 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
1a790 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
1a7a0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
1a7b0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
1a7c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1a7d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
1a7e0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
1a7f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a800 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
1a810 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
1a820 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
1a830 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
1a840 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
1a850 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
1a860 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a870 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
1a880 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
1a890 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
1a8a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
1a8b0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
1a8c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1a8d0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
1a8e0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
1a8f0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
1a900 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
1a910 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
1a920 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
1a930 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1a940 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
1a950 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
1a960 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
1a970 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
1a980 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
1a990 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
1a9a0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 30 2e 35  ** tables or 0.5
1a9b0 20 28 4c 6f 67 45 73 74 3d 2d 31 30 29 20 66 6f   (LogEst=-10) fo
1a9c0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
1a9d0 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
1a9e0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
1a9f0 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
1aa00 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
1aa10 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
1aa20 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
1aa30 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
1aa40 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
1aa50 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
1aa60 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
1aa70 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
1aa80 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
1aa90 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
1aaa0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
1aab0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
1aac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1aad0 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
1aae0 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
1aaf0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
1ab00 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
1ab10 2b 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  + rSize;.       
1ab20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1ab30 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e  ct==0 && (pTab->
1ab40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1ab50 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
1ab60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1ab70 53 65 74 75 70 20 2b 3d 20 32 38 3b 0a 20 20 20  Setup += 28;.   
1ab80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ab90 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1aba0 75 70 20 2d 3d 20 31 30 3b 0a 20 20 20 20 20 20  up -= 10;.      
1abb0 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
1abc0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1abd0 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54  pNew->rSetup, pT
1abe0 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1abf0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
1ac00 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77  >rSetup<0 ) pNew
1ac10 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1ac20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1ac30 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b   Each index look
1ac40 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77  up yields 20 row
1ac50 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
1ac60 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   This.        **
1ac70 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   is more than th
1ac80 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66  e usual guess of
1ac90 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20   10 rows, since 
1aca0 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20  we have no way. 
1acb0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f         ** of kno
1acc0 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69  wing how selecti
1acd0 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  ve the index wil
1ace0 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e  l ultimately be.
1acf0 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20    It would.     
1ad00 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72     ** not be unr
1ad10 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  easonable to mak
1ad20 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63  e this value muc
1ad30 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20  h larger. */.   
1ad40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1ad50 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34  = 43;  assert( 4
1ad60 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1ad70 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (20) );.        
1ad80 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1ad90 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
1ada0 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
1adb0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
1adc0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1add0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20  E_AUTO_INDEX;.  
1ade0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1adf0 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70  eq = mPrereq | p
1ae00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1ae10 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1ae20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
1ae30 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
1ae40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae50 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1ae60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
1ae70 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
1ae80 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
1ae90 69 6e 64 69 63 65 73 2e 20 49 66 20 74 68 65 72  indices. If ther
1aea0 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
1aeb0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1aec0 20 6f 6e 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73   only .  ** cons
1aed0 69 64 65 72 20 69 6e 64 65 78 20 70 50 72 6f 62  ider index pProb
1aee0 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  e.  */.  for(; r
1aef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1af00 70 50 72 6f 62 65 3b 20 0a 20 20 20 20 20 20 70  pProbe; .      p
1af10 50 72 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49 42  Probe=(pSrc->pIB
1af20 49 6e 64 65 78 20 3f 20 30 20 3a 20 70 50 72 6f  Index ? 0 : pPro
1af30 62 65 2d 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72  be->pNext), iSor
1af40 74 49 64 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20  tIdx++.  ){.    
1af50 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
1af60 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
1af70 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
1af80 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53  ePartialIndex(pS
1af90 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43  rc->iCursor, pWC
1afa0 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
1afb0 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
1afc0 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65 77    testcase( pNew
1afd0 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43  ->iTab!=pSrc->iC
1afe0 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65  ursor );  /* See
1aff0 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62   ticket [98d973b
1b000 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f  8f5] */.      co
1b010 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74  ntinue;  /* Part
1b020 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72  ial index inappr
1b030 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73  opriate for this
1b040 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a   query */.    }.
1b050 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1b060 62 4e 6f 51 75 65 72 79 20 29 20 63 6f 6e 74 69  bNoQuery ) conti
1b070 6e 75 65 3b 0a 20 20 20 20 72 53 69 7a 65 20 3d  nue;.    rSize =
1b080 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
1b090 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65  gEst[0];.    pNe
1b0a0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
1b0b0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
1b0c0 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a  btree.nBtm = 0;.
1b0d0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
1b0e0 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20  e.nTop = 0;.    
1b0f0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  pNew->nSkip = 0;
1b100 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
1b110 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
1b120 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
1b130 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1b140 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
1b150 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b  rereq = mPrereq;
1b160 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
1b170 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  = rSize;.    pNe
1b180 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
1b190 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
1b1a0 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65  b = indexMightHe
1b1b0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42  lpWithOrderBy(pB
1b1c0 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20  uilder, pProbe, 
1b1d0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  pSrc->iCursor);.
1b1e0 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41      /* The ONEPA
1b1f0 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73  SS_DESIRED flags
1b200 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f   never occurs to
1b210 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45  gether with ORDE
1b220 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65  R BY */.    asse
1b230 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  rt( (pWInfo->wct
1b240 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1b250 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
1b260 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20  ==0 || b==0 );. 
1b270 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
1b280 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
1b290 44 58 54 59 50 45 5f 49 50 4b 20 29 7b 0a 20 20  DXTYPE_IPK ){.  
1b2a0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70      /* Integer p
1b2b0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
1b2c0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
1b2d0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1b2e0 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  IPK;..      /* F
1b2f0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
1b300 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  /.      pNew->iS
1b310 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
1b320 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20  rtIdx : 0;.     
1b330 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
1b340 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   of full table s
1b350 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20  can is (N*3.0). 
1b360 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
1b370 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36  Run = rSize + 16
1b380 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73  ;.      ApplyCos
1b390 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
1b3a0 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
1b3b0 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77  stMult);.      w
1b3c0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
1b3d0 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
1b3e0 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63  rSize);.      rc
1b3f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1b400 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1b410 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  w);.      pNew->
1b420 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
1b430 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
1b440 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
1b450 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a       Bitmask m;.
1b460 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65        if( pProbe
1b470 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a  ->isCovering ){.
1b480 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
1b490 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44  Flags = WHERE_ID
1b4a0 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
1b4b0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20  NDEXED;.        
1b4c0 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  m = 0;.      }el
1b4d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  se{.        m = 
1b4e0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
1b4f0 70 50 72 6f 62 65 2d 3e 63 6f 6c 4e 6f 74 49 64  pProbe->colNotId
1b500 78 65 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xed;.        pNe
1b510 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d  w->wsFlags = (m=
1b520 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58  =0) ? (WHERE_IDX
1b530 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45  _ONLY|WHERE_INDE
1b540 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44  XED) : WHERE_IND
1b550 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  EXED;.      }.. 
1b560 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61       /* Full sca
1b570 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20  n via index */. 
1b580 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20       if( b.     
1b590 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
1b5a0 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 70  Tab).       || p
1b5b0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
1b5c0 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20 7c  here!=0.       |
1b5d0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
1b5e0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
1b5f0 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
1b600 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e      && (pProbe->
1b610 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
1b620 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20  zTabRow).       
1b630 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1b640 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1b650 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1b660 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
1b670 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b680 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
1b690 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
1b6a0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
1b6b0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
1b6c0 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
1b6d0 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
1b6e0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1b6f0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
1b700 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
1b710 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   : 0;..        /
1b720 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69  * The cost of vi
1b730 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  siting the index
1b740 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68   rows is N*K, wh
1b750 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20  ere K is.       
1b760 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20   ** between 1.1 
1b770 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69  and 3.0, dependi
1b780 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ng on the relati
1b790 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a  ve sizes of the.
1b7a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1b7b0 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e   and table rows.
1b7c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1b7d0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
1b7e0 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
1b7f0 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
1b800 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
1b810 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
1b820 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b830 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
1b840 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
1b850 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f 73  , add in the cos
1b860 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  t of.          *
1b870 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f  * doing table lo
1b880 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73 74  okups.  The cost
1b890 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65 20   will be 3x the 
1b8a0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1b8b0 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20      ** lookups. 
1b8c0 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75   Take into accou
1b8d0 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
1b8e0 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62  terms that can b
1b8f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1b900 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 6a  atisfied using j
1b910 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20 61  ust the index, a
1b920 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  nd that do not r
1b930 65 71 75 69 72 65 20 61 0a 20 20 20 20 20 20 20  equire a.       
1b940 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b     ** table look
1b950 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  up. */.         
1b960 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20   LogEst nLookup 
1b970 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f  = rSize + 16;  /
1b980 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a  * Base cost:  N*
1b990 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  3 */.          i
1b9a0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
1b9b0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1b9c0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
1b9d0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1b9e0 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66 6f   *pWC2 = &pWInfo
1b9f0 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20 20  ->sWC;.         
1ba00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
1ba10 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  C2->nTerm; ii++)
1ba20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 68  {.            Wh
1ba30 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
1ba40 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20   &pWC2->a[ii];. 
1ba50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
1ba60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72  sqlite3ExprCover
1ba70 65 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d 2d  edByIndex(pTerm-
1ba80 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70 50  >pExpr, iCur, pP
1ba90 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
1baa0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bac0 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d          /* pTerm
1bad0 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
1bae0 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  d using just the
1baf0 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64 75   index.  So redu
1bb00 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ce.            *
1bb10 2a 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  * the expected n
1bb20 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20 6c  umber of table l
1bb30 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e 67  ookups according
1bb40 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ly */.          
1bb50 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
1bb60 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
1bb70 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b             nLook
1bb80 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  up += pTerm->tru
1bb90 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20  thProb;.        
1bba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbb0 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70           nLookup
1bbc0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
1bbd0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1bbe0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
1bbf0 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70  WO_IS) ) nLookup
1bc00 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20 20   -= 19;.        
1bc10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1bc20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  }.          .   
1bc30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
1bc40 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1bc50 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
1bc60 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20   nLookup);.     
1bc70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
1bc80 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
1bc90 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
1bca0 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
1bcb0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
1bcc0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
1bcd0 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
1bce0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1bcf0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1bd00 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1bd10 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1bd20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
1bd30 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
1bd40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bd50 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c      pBuilder->bl
1bd60 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  dFlags = 0;.    
1bd70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1bd80 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
1bd90 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
1bda0 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  be, 0);.    if( 
1bdb0 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61  pBuilder->bldFla
1bdc0 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f  gs==SQLITE_BLDF_
1bdd0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
1bde0 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69   /* If a non-uni
1bdf0 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65  que index is use
1be00 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66 69  d, or if a prefi
1be10 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f 72  x of the key for
1be20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65  .      ** unique
1be30 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 28   index is used (
1be40 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65 78  making the index
1be50 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f   functionally no
1be60 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20 20  n-unique).      
1be70 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69  ** then the sqli
1be80 74 65 5f 73 74 61 74 31 20 64 61 74 61 20 62 65  te_stat1 data be
1be90 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74 20  comes important 
1bea0 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65 0a  for scoring the.
1beb0 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f        ** plan */
1bec0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
1bed0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61 74  Flags |= TF_Stat
1bee0 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66  sUsed;.    }.#if
1bef0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bf00 45 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  E_STAT4.    sqli
1bf10 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
1bf20 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
1bf30 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
1bf40 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
1bf50 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
1bf60 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ec = 0;.#endif. 
1bf70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bf80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bf90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1bfa0 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLE../*.** Argum
1bfb0 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20  ent pIdxInfo is 
1bfc0 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
1bfd0 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74  d with all const
1bfe0 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a  raints that may.
1bff0 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74 68  ** be used by th
1c000 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1c010 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
1c020 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
1c030 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ab. This.** func
1c040 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62  tion marks a sub
1c050 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  set of those con
1c060 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c  straints usable,
1c070 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
1c080 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
1c090 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 72  d and adds the r
1c0a0 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20  eturned plan to 
1c0b0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
1c0c0 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  A constraint is 
1c0d0 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66  marked usable if
1c0e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75  :.**.**   * Argu
1c0f0 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64  ment mUsable ind
1c100 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73 20  icates that its 
1c110 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1c120 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64  e available, and
1c130 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73  .**.**   * It is
1c140 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   not one of the 
1c150 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69 66  operators specif
1c160 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c  ied in the mExcl
1c170 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a  ude mask passed.
1c180 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66 6f  **     as the fo
1c190 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77  urth argument (w
1c1a0 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63 65  hich in practice
1c1b0 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e   is either WO_IN
1c1c0 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72   or 0)..**.** Ar
1c1d0 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69  gument mPrereq i
1c1e0 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c  s a mask of tabl
1c1f0 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1c200 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1c210 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  he.** virtual ta
1c220 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e  ble in question.
1c230 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65 64   These are added
1c240 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72   to the plans pr
1c250 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62  erequisites.** b
1c260 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64 65  efore it is adde
1c270 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  d to pBuilder..*
1c280 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61  *.** Output para
1c290 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73  meter *pbIn is s
1c2a0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  et to true if th
1c2b0 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20  e plan added to 
1c2c0 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73  pBuilder.** uses
1c2d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f   one or more WO_
1c2e0 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c  IN terms, or fal
1c2f0 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
1c300 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1c310 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1c320 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ne(.  WhereLoopB
1c330 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1c340 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  ,.  Bitmask mPre
1c350 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
1c360 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
1c370 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1c380 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69  be used. */.  Bi
1c390 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20  tmask mUsable,  
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3b0 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20   Mask of usable 
1c3c0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20  tables */.  u16 
1c3d0 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20  mExclude,       
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1c3f0 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69  xclude terms usi
1c400 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f  ng these operato
1c410 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
1c420 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
1c430 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c  Info,   /* Popul
1c440 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20  ated object for 
1c450 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
1c460 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20  u16 mNoOmit,    
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74  /* Do not omit t
1c490 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hese constraints
1c4a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20   */.  int *pbIn 
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
1c4d0 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20  ue if plan uses 
1c4e0 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f  an IN(...) op */
1c4f0 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  .){.  WhereClaus
1c500 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65  e *pWC = pBuilde
1c510 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74  r->pWC;.  struct
1c520 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1c530 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
1c540 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
1c550 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1c560 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
1c570 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
1c580 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
1c590 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
1c5a0 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  t mxTerm;.  int 
1c5b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c5c0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1c5d0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1c5e0 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew;.  Parse *pPa
1c5f0 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  rse = pBuilder->
1c600 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1c610 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c620 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70  _item *pSrc = &p
1c630 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
1c640 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1c650 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20  w->iTab];.  int 
1c660 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
1c670 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
1c680 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  int;..  assert( 
1c690 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72  (mUsable & mPrer
1c6a0 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a  eq)==mPrereq );.
1c6b0 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70    *pbIn = 0;.  p
1c6c0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
1c6d0 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74  rereq;..  /* Set
1c6e0 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
1c6f0 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f   on the subset o
1c700 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64  f constraints id
1c710 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a  entified by .  *
1c720 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61  * arguments mUsa
1c730 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65  ble and mExclude
1c740 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20  . */.  pIdxCons 
1c750 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
1c760 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1c770 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
1c780 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
1c790 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1c7a0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
1c7b0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68  xCons++){.    Wh
1c7c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
1c7d0 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e   &pWC->a[pIdxCon
1c7e0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b  s->iTermOffset];
1c7f0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
1c800 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  sable = 0;.    i
1c810 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1c820 71 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65  qRight & mUsable
1c830 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  )==pTerm->prereq
1c840 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20 28  Right .     && (
1c850 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c860 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a   & mExclude)==0.
1c870 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64      ){.      pId
1c880 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1c890 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1c8a0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1c8b0 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20  e output fields 
1c8c0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
1c8d0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
1c8e0 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ure */.  memset(
1c8f0 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
1c900 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f  f(pUsage[0])*nCo
1c910 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73  nstraint);.  ass
1c920 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ert( pIdxInfo->n
1c930 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
1c940 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f  =0 );.  pIdxInfo
1c950 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
1c960 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1c970 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1c980 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1c990 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  d = 0;.  pIdxInf
1c9a0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1c9b0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
1c9c0 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
1c9d0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1c9e0 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
1c9f0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1ca00 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  ags = 0;.  pIdxI
1ca10 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28  nfo->colUsed = (
1ca20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53  sqlite3_int64)pS
1ca30 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20  rc->colUsed;..  
1ca40 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69  /* Invoke the vi
1ca50 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73  rtual table xBes
1ca60 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1ca70 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65  */.  rc = vtabBe
1ca80 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
1ca90 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78  pSrc->pTab, pIdx
1caa0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20  Info);.  if( rc 
1cab0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
1cac0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1cad0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1cae0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
1caf0 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 53 51  ethod returns SQ
1cb00 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
1cb10 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1cb20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61    ** that the pa
1cb30 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
1cb40 74 69 6f 6e 20 6f 66 20 70 61 72 61 6d 65 74 65  tion of paramete
1cb50 72 73 20 70 72 6f 76 69 64 65 64 20 69 73 20 75  rs provided is u
1cb60 6e 75 73 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  nusable..      *
1cb70 2a 20 4d 61 6b 65 20 6e 6f 20 65 6e 74 72 69 65  * Make no entrie
1cb80 73 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 74 61  s in the loop ta
1cb90 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ble..      */.  
1cba0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1cbb0 78 66 66 66 66 2c 20 28 22 20 20 5e 5e 5e 5e 2d  xffff, ("  ^^^^-
1cbc0 2d 2d 20 6e 6f 6e 2d 76 69 61 62 6c 65 20 70 6c  -- non-viable pl
1cbd0 61 6e 20 72 65 6a 65 63 74 65 64 21 5c 6e 22 29  an rejected!\n")
1cbe0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1cbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1cc00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1cc10 20 20 7d 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20    }..  mxTerm = 
1cc20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  -1;.  assert( pN
1cc30 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
1cc40 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72  straint );.  for
1cc50 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1cc60 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
1cc70 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
1cc80 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1cc90 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49  itMask = 0;.  pI
1cca0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1ccb0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1ccc0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1ccd0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1cce0 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1ccf0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1cd00 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1cd10 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a  .    int iTerm;.
1cd20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
1cd30 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
1cd40 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
1cd50 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1cd60 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  *pTerm;.      in
1cd70 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e  t j = pIdxCons->
1cd80 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
1cd90 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
1cda0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
1cdb0 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c   || j<0.       |
1cdc0 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
1cdd0 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
1cde0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
1cdf0 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43  .       || pIdxC
1ce00 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20  ons->usable==0. 
1ce10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ce20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ce30 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74  pParse,"%s.xBest
1ce40 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
1ce50 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  n",pSrc->pTab->z
1ce60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Name);.        t
1ce70 65 73 74 63 61 73 65 28 20 70 49 64 78 49 6e 66  estcase( pIdxInf
1ce80 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1ce90 53 74 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72  Str );.        r
1cea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1ceb0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
1cec0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1ced0 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  m==nConstraint-1
1cee0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1cef0 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
1cf00 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70    testcase( j==p
1cf10 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20  WC->nTerm-1 );. 
1cf20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
1cf30 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70  C->a[j];.      p
1cf40 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
1cf50 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1cf60 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1cf70 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
1cf80 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  lot );.      pNe
1cf90 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1cfa0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1cfb0 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
1cfc0 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
1cfd0 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  m;.      testcas
1cfe0 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a  e( iTerm==15 );.
1cff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d000 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
1d010 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20     if( iTerm<16 
1d020 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  && pUsage[i].omi
1d030 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  t ) pNew->u.vtab
1d040 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c  .omitMask |= 1<<
1d050 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  iTerm;.      if(
1d060 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1d070 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
1d080 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76  {.        /* A v
1d090 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
1d0a0 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
1d0b0 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
1d0c0 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
1d0d0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
1d0e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1d0f0 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
1d100 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
1d110 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
1d120 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1d130 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f  related to the o
1d140 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74  rder of output t
1d150 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20  erms and.       
1d160 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
1d170 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
1d180 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
1d190 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
1d1a0 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68         ** togeth
1d1b0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
1d1c0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1d1d0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1d1e0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1d1f0 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51  >idxFlags &= ~SQ
1d200 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
1d210 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20  UNIQUE;.        
1d220 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72  *pbIn = 1; asser
1d230 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57  t( (mExclude & W
1d240 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  O_IN)==0 );.    
1d250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d260 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
1d270 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69  tMask &= ~mNoOmi
1d280 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  t;..  pNew->nLTe
1d290 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
1d2a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 54   for(i=0; i<=mxT
1d2b0 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  erm; i++){.    i
1d2c0 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  f( pNew->aLTerm[
1d2d0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  i]==0 ){.      /
1d2e0 2a 20 54 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 61  * The non-zero a
1d2f0 72 67 76 49 64 78 20 76 61 6c 75 65 73 20 6d 75  rgvIdx values mu
1d300 73 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  st be contiguous
1d310 2e 20 20 52 61 69 73 65 20 61 6e 0a 20 20 20 20  .  Raise an.    
1d320 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 74 68    ** error if th
1d330 65 79 20 61 72 65 20 6e 6f 74 20 2a 2f 0a 20 20  ey are not */.  
1d340 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d350 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78  Msg(pParse,"%s.x
1d360 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e  BestIndex malfun
1d370 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61  ction",pSrc->pTa
1d380 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1d390 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 49   testcase( pIdxI
1d3a0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1d3b0 64 78 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72  dxStr );.      r
1d3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1d3d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
1d3e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
1d3f0 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
1d400 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ot );.  pNew->u.
1d410 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
1d420 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
1d430 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1d440 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1d450 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1d460 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f  xStr;.  pIdxInfo
1d470 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1d480 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  tr = 0;.  pNew->
1d490 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
1d4a0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1d4b0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1d4c0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38  .isOrdered = (i8
1d4d0 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  )(pIdxInfo->orde
1d4e0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20  rByConsumed ?.  
1d4f0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
1d500 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70  rderBy : 0);.  p
1d510 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1d520 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20  .  pNew->rRun = 
1d530 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
1d540 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
1d550 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
1d560 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
1d570 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
1d580 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1d590 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53  edRows);..  /* S
1d5a0 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  et the WHERE_ONE
1d5b0 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20  ROW flag if the 
1d5c0 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74  xBestIndex() met
1d5d0 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20  hod indicated.  
1d5e0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1d5f0 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1d600 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1d610 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1d620 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e   */.  if( pIdxIn
1d630 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53  fo->idxFlags & S
1d640 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1d650 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70  _UNIQUE ){.    p
1d660 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
1d670 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1d680 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1d690 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1d6a0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20  RE_ONEROW;.  }. 
1d6b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1d6c0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1d6d0 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65  pNew);.  if( pNe
1d6e0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1d6f0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
1d700 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
1d710 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1d720 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1d730 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  edFree = 0;.  }.
1d740 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
1d750 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20  fff, ("  bIn=%d 
1d760 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20  prereqIn=%04llx 
1d770 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78  prereqOut=%04llx
1d780 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d790 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e             *pbIn
1d7a0 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1d7b0 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20  4)mPrereq,.     
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1d7e0 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26  )(pNew->prereq &
1d7f0 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20   ~mPrereq)));.. 
1d800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d810 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
1d820 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1d830 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20   from within an 
1d840 78 42 65 73 74 49 6e 64 65 78 28 29 20 63 61 6c  xBestIndex() cal
1d850 6c 62 61 63 6b 2c 20 69 74 0a 2a 2a 20 72 65 74  lback, it.** ret
1d860 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
1d870 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1d880 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
1d890 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a  f the collation.
1d8a0 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f  ** sequence asso
1d8b0 63 69 61 74 65 64 20 77 69 74 68 20 65 6c 65 6d  ciated with elem
1d8c0 65 6e 74 20 69 43 6f 6e 73 20 6f 66 20 74 68 65  ent iCons of the
1d8d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1d8e0 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 0a  nfo.aConstraint.
1d8f0 2a 2a 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66  ** array. Or, if
1d900 20 69 43 6f 6e 73 20 69 73 20 6f 75 74 20 6f 66   iCons is out of
1d910 20 72 61 6e 67 65 20 6f 72 20 74 68 65 72 65 20   range or there 
1d920 69 73 20 6e 6f 20 61 63 74 69 76 65 20 78 42 65  is no active xBe
1d930 73 74 49 6e 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c  stIndex.** call,
1d940 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
1d950 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1d960 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74  ite3_vtab_collat
1d970 69 6f 6e 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  ion(sqlite3_inde
1d980 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
1d990 2c 20 69 6e 74 20 69 43 6f 6e 73 29 7b 0a 20 20  , int iCons){.  
1d9a0 48 69 64 64 65 6e 49 6e 64 65 78 49 6e 66 6f 20  HiddenIndexInfo 
1d9b0 2a 70 48 69 64 64 65 6e 20 3d 20 28 48 69 64 64  *pHidden = (Hidd
1d9c0 65 6e 49 6e 64 65 78 49 6e 66 6f 2a 29 26 70 49  enIndexInfo*)&pI
1d9d0 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 63 6f 6e  dxInfo[1];.  con
1d9e0 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
1d9f0 30 3b 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d  0;.  if( iCons>=
1da00 30 20 26 26 20 69 43 6f 6e 73 3c 70 49 64 78 49  0 && iCons<pIdxI
1da10 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
1da20 20 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   ){.    CollSeq 
1da30 2a 70 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  *pC = 0;.    int
1da40 20 69 54 65 72 6d 20 3d 20 70 49 64 78 49 6e 66   iTerm = pIdxInf
1da50 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
1da60 43 6f 6e 73 5d 2e 69 54 65 72 6d 4f 66 66 73 65  Cons].iTermOffse
1da70 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  t;.    Expr *pX 
1da80 3d 20 70 48 69 64 64 65 6e 2d 3e 70 57 43 2d 3e  = pHidden->pWC->
1da90 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
1daa0 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
1dab0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 20 3d 20  t ){.      pC = 
1dac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1dad0 72 65 43 6f 6c 6c 53 65 71 28 70 48 69 64 64 65  reCollSeq(pHidde
1dae0 6e 2d 3e 70 50 61 72 73 65 2c 20 70 58 29 3b 0a  n->pParse, pX);.
1daf0 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d      }.    zRet =
1db00 20 28 70 43 20 3f 20 70 43 2d 3e 7a 4e 61 6d 65   (pC ? pC->zName
1db10 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   : sqlite3StrBIN
1db20 41 52 59 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ARY);.  }.  retu
1db30 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
1db40 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1db50 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1db60 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
1db70 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
1db80 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
1db90 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
1dba0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
1dbb0 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
1dbc0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
1dbd0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1dbe0 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
1dbf0 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
1dc00 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50  e query, both mP
1dc10 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e  rereq and.** mUn
1dc20 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74  usable are set t
1dc30 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
1dc40 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73  mPrereq is a mas
1dc50 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  k of all FROM cl
1dc60 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ause.** entries 
1dc70 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
1dc80 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1dc90 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
1dca0 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a  clause and are.*
1dcb0 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  * separated from
1dcc0 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
1dcd0 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  one LEFT or CROS
1dce0 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c  S JOIN. Similarl
1dcf0 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61  y, the.** mUnusa
1dd00 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  ble mask contain
1dd10 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
1dd20 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  e entries that o
1dd30 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a  ccur after the.*
1dd40 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
1dd50 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74 65  and are separate
1dd60 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1dd70 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1dd80 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e  r .** CROSS JOIN
1dd90 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  . .**.** For exa
1dda0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1ddb0 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ry were:.**.**  
1ddc0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32   ... FROM t1, t2
1ddd0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74   LEFT JOIN t3, t
1dde0 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e  4, vt CROSS JOIN
1ddf0 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74   t5, t6;.**.** t
1de00 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72  hen mPrereq corr
1de10 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20  esponds to (t1, 
1de20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c  t2) and mUnusabl
1de30 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a  e to (t5, t6)..*
1de40 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62  *.** All the tab
1de50 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d  les in mPrereq m
1de60 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1de70 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
1de80 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61  t virtual .** ta
1de90 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d  ble. So any term
1dea0 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20  s for which all 
1deb0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1dec0 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 0a  e satisfied by .
1ded0 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62  ** mPrereq may b
1dee0 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 22  e specified as "
1def0 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63  usable" in all c
1df00 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1df10 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65  ex. .** Converse
1df20 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  ly, all tables i
1df30 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74  n mUnusable must
1df40 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
1df50 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
1df60 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
1df70 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  so any terms for
1df80 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72 65   which the prere
1df90 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70  quisites overlap
1dfa0 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62   with.** mUnusab
1dfb0 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
1dfc0 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61   be configured a
1dfd0 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66  s "not-usable" f
1dfe0 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  or xBestIndex..*
1dff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1e000 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1e010 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1e020 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1e030 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
1e040 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1e050 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1e060 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
1e070 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75  * Tables that mu
1e080 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
1e090 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fore this one */
1e0a0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1e0b0 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  able            
1e0c0 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1e0d0 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
1e0e0 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fter this one */
1e0f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1e100 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e110 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e120 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  e */.  WhereInfo
1e130 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
1e140 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
1e150 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
1e160 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e180 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1e190 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1e1a0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1e1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e1c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1e1d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e1e0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
1e1f0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1e200 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1e210 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1e220 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20  dex_info *p;    
1e230 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
1e240 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64  pass to xBestInd
1e250 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ex() */.  int nC
1e260 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1e270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e280 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1e290 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49  in p */.  int bI
1e2a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1e2b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e2c0 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e  f plan uses IN(.
1e2d0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ..) operator */.
1e2e0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1e2f0 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65  w;.  Bitmask mBe
1e300 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e310 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64    /* Tables used
1e320 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c   by best possibl
1e330 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
1e340 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65  mNoOmit;..  asse
1e350 72 74 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d  rt( (mPrereq & m
1e360 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a  Unusable)==0 );.
1e370 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
1e380 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
1e390 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1e3a0 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20  pParse;.  pWC = 
1e3b0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1e3c0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1e3d0 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
1e3e0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1e3f0 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
1e400 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ];.  assert( IsV
1e410 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
1e420 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f  b) );.  p = allo
1e430 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
1e440 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73  arse, pWC, mUnus
1e450 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69  able, pSrc, pBui
1e460 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  lder->pOrderBy, 
1e470 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29  .      &mNoOmit)
1e480 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1e490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1e4a0 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d  EM_BKPT;.  pNew-
1e4b0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
1e4c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1e4d0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1e4e0 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
1e4f0 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
1e500 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1e510 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e   0;.  nConstrain
1e520 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  t = p->nConstrai
1e530 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
1e540 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
1e550 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  ->db, pNew, nCon
1e560 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
1e570 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1e580 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1e590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e5a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1e5b0 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c  .  /* First call
1e5c0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1e5d0 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  th all constrain
1e5e0 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20  ts usable. */.  
1e5f0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
1e600 2c 20 28 22 42 45 47 49 4e 20 25 73 2e 61 64 64  , ("BEGIN %s.add
1e610 56 69 72 74 75 61 6c 28 29 5c 6e 22 2c 20 70 53  Virtual()\n", pS
1e620 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
1e630 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
1e640 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1e650 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65  lOne: all usable
1e660 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68  \n"));.  rc = wh
1e670 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1e680 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1e690 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1e6a0 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1e6b0 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  &bIn);..  /* If 
1e6c0 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73  the call to xBes
1e6d0 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1e6e0 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20  l terms enabled 
1e6f0 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a  produced a plan.
1e700 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1e710 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 73  ot require any s
1e720 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f  ource tables (IO
1e730 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d  W: a plan with m
1e740 42 65 73 74 3d 3d 30 29 0a 20 20 2a 2a 20 61 6e  Best==0).  ** an
1e750 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  d does not use a
1e760 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  n IN(...) operat
1e770 6f 72 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  or, then there i
1e780 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61  s no point in ma
1e790 6b 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 66  king .  ** any f
1e7a0 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
1e7b0 78 42 65 73 74 49 6e 64 65 78 28 29 20 73 69 6e  xBestIndex() sin
1e7c0 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  ce they will all
1e7d0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1e7e0 0a 20 20 2a 2a 20 72 65 73 75 6c 74 20 28 69 66  .  ** result (if
1e7f0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
1e800 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
1e810 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20   is sane). */.  
1e820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e830 4b 20 26 26 20 28 28 6d 42 65 73 74 20 3d 20 28  K && ((mBest = (
1e840 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1e850 6d 50 72 65 72 65 71 29 29 21 3d 30 20 7c 7c 20  mPrereq))!=0 || 
1e860 62 49 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  bIn) ){.    int 
1e870 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e890 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1e8a0 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1e8b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1e8c0 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1e8d0 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1e8e0 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1e8f0 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1e900 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1e910 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1e920 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1e930 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1e940 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1e950 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1e960 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1e970 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1e980 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1e990 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1e9a0 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1e9b0 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1e9c0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1e9d0 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1e9e0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1e9f0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1ea00 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1ea10 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1ea20 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1ea30 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1ea40 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1ea50 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1ea60 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1ea70 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  &bIn);.      ass
1ea80 65 72 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20  ert( bIn==0 );. 
1ea90 20 20 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d       mBestNoIn =
1eaa0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20   pNew->prereq & 
1eab0 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ~mPrereq;.      
1eac0 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30  if( mBestNoIn==0
1ead0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1eae0 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1eaf0 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d    seenZeroNoIN =
1eb00 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1eb10 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78  }..    /* Call x
1eb20 42 65 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66  BestIndex once f
1eb30 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e 63 74  or each distinct
1eb40 20 76 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65   value of (prere
1eb50 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1eb60 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  q) .    ** in th
1eb70 65 20 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74  e set of terms t
1eb80 68 61 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65  hat apply to the
1eb90 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1eba0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
1ebb0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1ebc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1ebd0 74 20 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  t i;.      Bitma
1ebe0 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49  sk mNext = ALLBI
1ebf0 54 53 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  TS;.      assert
1ec00 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20  ( mNext>0 );.   
1ec10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1ec20 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
1ec30 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1ec40 20 6d 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20   mThis = (.     
1ec50 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d         pWC->a[p-
1ec60 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
1ec70 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
1ec80 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65  reqRight & ~mPre
1ec90 72 65 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  req.        );. 
1eca0 20 20 20 20 20 20 20 69 66 28 20 6d 54 68 69 73         if( mThis
1ecb0 3e 6d 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c  >mPrev && mThis<
1ecc0 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20  mNext ) mNext = 
1ecd0 6d 54 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mThis;.      }. 
1ece0 20 20 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65       mPrev = mNe
1ecf0 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  xt;.      if( mN
1ed00 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62  ext==ALLBITS ) b
1ed10 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1ed20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20  mNext==mBest || 
1ed30 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e  mNext==mBestNoIn
1ed40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ed50 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1ed60 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1ed70 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78  ne: mPrev=%04llx
1ed80 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22   mNext=%04llx\n"
1ed90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eda0 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1edb0 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20  3_uint64)mPrev, 
1edc0 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1edd0 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72  mNext));.      r
1ede0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1edf0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1ee00 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1ee10 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d  mPrereq, mNext|m
1ee20 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1ee30 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1ee40 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1ee50 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1ee60 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1ee70 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1ee80 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1ee90 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1eea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1eeb0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1eec0 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1eed0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1eee0 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1eef0 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1ef00 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1ef10 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1ef20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1ef30 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1ef40 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1ef50 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1ef60 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1ef70 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1ef80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1ef90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1efa0 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1efb0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1efc0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1efd0 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1efe0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1eff0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1f000 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1f010 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1f020 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c  req, mPrereq, 0,
1f030 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1f040 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  n);.      if( bI
1f050 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e  n==0 ) seenZeroN
1f060 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  oIN = 1;.    }..
1f070 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1f080 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1f090 78 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20  x() have so far 
1f0a0 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1f0b0 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61   plan.    ** tha
1f0c0 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f  t requires no so
1f0d0 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61  urce tables at a
1f0e0 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ll and does not 
1f0f0 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20  use an IN(...). 
1f100 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20     ** operator, 
1f110 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c  make a final cal
1f120 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20  l to obtain one 
1f130 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
1f140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f150 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d  && seenZeroNoIN=
1f160 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  =0 ){.      WHER
1f170 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1f180 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1f190 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f   disabled and w/
1f1a0 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1f1b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1f1c0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1f1d0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1f1e0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1f1f0 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  eq, WO_IN, p, mN
1f200 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1f210 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1f220 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1f230 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1f240 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1f250 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1f260 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1f270 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
1f280 30 30 2c 20 28 22 45 4e 44 20 25 73 2e 61 64 64  00, ("END %s.add
1f290 56 69 72 74 75 61 6c 28 29 2c 20 72 63 3d 25 64  Virtual(), rc=%d
1f2a0 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
1f2b0 3e 7a 4e 61 6d 65 2c 20 72 63 29 29 3b 0a 20 20  >zName, rc));.  
1f2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f2d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f2e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1f2f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1f300 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1f310 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1f320 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1f330 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1f340 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1f350 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1f360 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1f370 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1f380 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1f390 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1f3a0 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1f3b0 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1f3c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1f3d0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1f3e0 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1f3f0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1f400 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1f410 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1f420 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1f430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f440 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1f450 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1f460 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1f470 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1f480 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1f490 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1f4a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f4b0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1f4c0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1f4d0 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1f4e0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1f4f0 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1f500 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1f510 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1f520 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1f530 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1f540 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1f550 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1f560 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1f570 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1f580 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1f590 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1f5a0 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1f5b0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1f5c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f5d0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1f5e0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1f5f0 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1f600 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1f610 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1f620 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1f630 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1f640 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1f650 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1f660 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1f670 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1f680 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1f690 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1f6a0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1f6b0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1f6c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1f6d0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1f6e0 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1f6f0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1f700 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1f710 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1f720 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1f730 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f740 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1f750 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1f760 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1f770 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1f780 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1f790 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1f7a0 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1f7b0 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1f7c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f7d0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1f7e0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1f7f0 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1f800 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1f810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f820 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1f830 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1f840 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f850 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1f860 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1f870 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1f880 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1f890 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1f8a0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1f8b0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1f8c0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1f8d0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1f8e0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1f8f0 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1f900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f910 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1f920 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f930 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1f940 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1f950 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1f960 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1f970 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1f980 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1f990 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1f9c0 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1f9d0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1f9e0 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1f9f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1fa00 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1fa10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1fa20 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1fa30 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1fa40 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1fa50 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1fa60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1fa70 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1fa80 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1fa90 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1faa0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1fab0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1fac0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1fad0 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1fae0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1faf0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1fb00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1fb10 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1fb20 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1fb30 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1fb40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fb60 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1fb70 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1fb80 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1fb90 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1fba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1fbb0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1fbc0 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1fbd0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1fbe0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1fbf0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1fc00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1fc10 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1fc20 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1fc30 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1fc40 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1fc50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1fc60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1fc70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fc80 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1fc90 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1fca0 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1fcb0 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1fcc0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1fcd0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1fce0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1fcf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1fd00 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1fd10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1fd20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1fd30 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1fd40 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1fd50 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1fd80 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1fd90 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1fda0 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fdd0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1fde0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1fdf0 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1fe00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fe10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fe20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1fe30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1fe40 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1fe50 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1fe60 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1fe70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1fe80 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1fe90 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1fea0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1feb0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1fec0 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1fed0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1fee0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1fef0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1ff00 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1ff10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1ff20 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1ff30 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1ff40 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1ff50 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1ff60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1ff70 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1ff80 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1ff90 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1ffa0 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1ffb0 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1ffc0 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1ffd0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1ffe0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1fff0 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
20000 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
20010 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
20020 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
20030 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
20040 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
20050 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
20060 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
20070 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
20080 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
20090 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
200a0 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
200b0 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
200c0 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
200d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
200e0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
200f0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
20100 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
20110 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
20120 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
20130 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
20140 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
20150 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
20160 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
20170 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
20180 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
20190 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
201a0 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
201b0 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
201c0 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
201d0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
201e0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
201f0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
20200 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
20210 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
20220 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
20230 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
20240 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
20250 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
20260 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
20270 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
20280 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
20290 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
202a0 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
202b0 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
202c0 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
202d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
202e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
202f0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
20300 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
20310 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
20320 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
20330 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
20340 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
20350 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
20360 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
20370 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
20380 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
20390 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
203a0 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
203b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
203c0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
203d0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
203e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
203f0 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
20400 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
20410 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
20420 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
20430 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20440 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
20450 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
20460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
20470 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
20480 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
20490 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
204a0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
204b0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
204c0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
204d0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
204e0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
204f0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
20500 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 69  );.  pBuilder->i
20510 50 6c 61 6e 4c 69 6d 69 74 20 3d 20 53 51 4c 49  PlanLimit = SQLI
20520 54 45 5f 51 55 45 52 59 5f 50 4c 41 4e 4e 45 52  TE_QUERY_PLANNER
20530 5f 4c 49 4d 49 54 3b 0a 20 20 66 6f 72 28 69 54  _LIMIT;.  for(iT
20540 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
20550 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70  List->a; pItem<p
20560 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74  End; iTab++, pIt
20570 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  em++){.    Bitma
20580 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30  sk mUnusable = 0
20590 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  ;.    pNew->iTab
205a0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 42 75   = iTab;.    pBu
205b0 69 6c 64 65 72 2d 3e 69 50 6c 61 6e 4c 69 6d 69  ilder->iPlanLimi
205c0 74 20 2b 3d 20 53 51 4c 49 54 45 5f 51 55 45 52  t += SQLITE_QUER
205d0 59 5f 50 4c 41 4e 4e 45 52 5f 4c 49 4d 49 54 5f  Y_PLANNER_LIMIT_
205e0 49 4e 43 52 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  INCR;.    pNew->
205f0 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
20600 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
20610 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
20620 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
20630 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
20640 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c  em->fg.jointype|
20650 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26  priorJointype) &
20660 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
20670 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
20680 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69   /* This conditi
20690 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  on is true when 
206a0 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f  pItem is the FRO
206b0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e  M clause term on
206c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69   the.      ** ri
206d0 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  ght-hand-side of
206e0 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53   a LEFT or CROSS
206f0 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20   JOIN.  */.     
20700 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f   mPrereq = mPrio
20710 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
20720 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74  orJointype = pIt
20730 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
20740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20750 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
20760 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
20770 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
20780 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
20790 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
207a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70  ;.      for(p=&p
207b0 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b  Item[1]; p<pEnd;
207c0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   p++){.        i
207d0 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20  f( mUnusable || 
207e0 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  (p->fg.jointype 
207f0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
20800 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20  OSS)) ){.       
20810 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20     mUnusable |= 
20820 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
20830 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
20840 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f  skSet, p->iCurso
20850 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
20860 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
20870 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
20880 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
20890 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
208a0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  e);.    }else.#e
208b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
208c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
208d0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
208e0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
208f0 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c  dBtree(pBuilder,
20900 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d   mPrereq);.    }
20910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20920 49 54 45 5f 4f 4b 20 26 26 20 70 42 75 69 6c 64  ITE_OK && pBuild
20930 65 72 2d 3e 70 57 43 2d 3e 68 61 73 4f 72 20 29  er->pWC->hasOr )
20940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
20950 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
20960 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
20970 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
20980 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
20990 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
209a0 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
209b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
209c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
209d0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
209e0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 69 74 20        /* We hit 
209f0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
20a00 72 20 73 65 61 72 63 68 20 6c 69 6d 69 74 20 73  r search limit s
20a10 65 74 20 62 79 20 69 50 6c 61 6e 4c 69 6d 69 74  et by iPlanLimit
20a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
20a30 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
20a40 41 52 4e 49 4e 47 2c 20 22 61 62 62 72 65 76 69  ARNING, "abbrevi
20a50 61 74 65 64 20 71 75 65 72 79 20 61 6c 67 6f 72  ated query algor
20a60 69 74 68 6d 20 73 65 61 72 63 68 22 29 3b 0a 20  ithm search");. 
20a70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20a80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
20a90 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
20aa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
20ab0 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f  .  }..  whereLoo
20ac0 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29  pClear(db, pNew)
20ad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20ae0 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20  ../*.** Examine 
20af0 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74  a WherePath (wit
20b00 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
20b10 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72  f the extra Wher
20b20 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36 74 68  eLoop of the 6th
20b30 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20  .** parameters) 
20b40 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74  to see if it out
20b50 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65  puts rows in the
20b60 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52   requested ORDER
20b70 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50   BY.** (or GROUP
20b80 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71   BY) without req
20b90 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74  uiring a separat
20ba0 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  e sort operation
20bb0 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20  .  Return N:.** 
20bc0 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74  .**   N>0:   N t
20bd0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
20be0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
20bf0 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
20c00 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f  ==0:  No terms o
20c10 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20c20 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
20c30 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20  ied.**   N<0:   
20c40 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20  Unknown yet how 
20c50 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52  many terms of OR
20c60 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20  DER BY might be 
20c70 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a  satisfied.   .**
20c80 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
20c90 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
20ca0 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
20cb0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
20cc0 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
20cd0 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
20ce0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
20cf0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
20d00 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
20d10 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
20d20 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
20d30 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
20d40 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
20d50 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
20d60 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65  STINCT do not re
20d70 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70  quire rows to ap
20d80 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74  pear in any part
20d90 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20  icular order as 
20da0 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76  long.** as equiv
20db0 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67  alent rows are g
20dc0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
20dd0 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50    Thus for GROUP
20de0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
20df0 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
20e00 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61   terms can be ma
20e10 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64  tched in any ord
20e20 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20  er.  With ORDER 
20e30 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64  BY, the .** pOrd
20e40 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20  erBy terms must 
20e50 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74  be matched in st
20e60 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67  rict left-to-rig
20e70 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ht order..*/.sta
20e80 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68  tic i8 wherePath
20e90 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
20ea0 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
20eb0 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
20ec0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
20ed0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
20ee0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
20ef0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
20f00 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
20f10 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
20f20 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
20f30 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
20f40 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
20f50 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
20f60 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
20f70 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
20f80 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f 72 20   _DISTINCTBY or 
20f90 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a  _ORDERBY_LIMIT *
20fa0 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
20fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20fc0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
20fd0 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
20fe0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
20ff0 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
21000 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
21010 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
21020 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
21030 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
21040 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
21050 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
21060 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
21070 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
21080 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
21090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
210a0 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
210b0 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
210d0 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
210e0 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
210f0 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
21100 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
21110 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
21120 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
21130 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
21140 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
21150 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
21160 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
21170 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
21180 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
21190 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
211a0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
211b0 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
211c0 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
211d0 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
211e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
211f0 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d  e */.  u16 eqOpM
21200 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ask;         /* 
21210 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69 74 79  Allowed equality
21220 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
21230 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  u16 nKeyCol;    
21240 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21250 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
21260 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  n pIndex */.  u1
21270 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
21280 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
21290 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63  ber of ordered c
212a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
212b0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72  dex */.  u16 nOr
212c0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
212d0 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69  * Number terms i
212e0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
212f0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
21300 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
21310 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65   /* Index of Whe
21320 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20  reLoop in pPath 
21330 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20  being processed 
21340 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
21350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21360 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
21370 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
21380 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
21390 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72   number for curr
213a0 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ent WhereLoop */
213b0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
213c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
213d0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
213e0 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f  in table iCur */
213f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
21400 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72  oop = 0; /* Curr
21410 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65  ent WhereLoop be
21420 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a  ing processed. *
21430 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
21440 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73  Term;     /* A s
21450 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
21460 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21470 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70  /.  Expr *pOBExp
21480 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  r;        /* An 
21490 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
214a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
214b0 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  use */.  CollSeq
214c0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f   *pColl;       /
214d0 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69  * COLLATE functi
214e0 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52  on from an ORDER
214f0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20   BY clause term 
21500 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
21510 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ex;        /* Th
21520 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  e index associat
21530 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f  ed with pLoop */
21540 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21550 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
21560 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
21570 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
21580 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20    Bitmask obSat 
21590 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  = 0;    /* Mask 
215a0 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
215b0 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66  s satisfied so f
215c0 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ar */.  Bitmask 
215d0 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a  obDone;       /*
215e0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44   Mask of all ORD
215f0 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
21600 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69   Bitmask orderDi
21610 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20  stinctMask;  /* 
21620 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c  Mask of all well
21630 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a  -ordered loops *
21640 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64  /.  Bitmask read
21650 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
21660 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72  /* Mask of inner
21670 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a   loops */..  /*.
21680 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
21690 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e  WhereLoop is "on
216a0 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e  e-row" if it gen
216b0 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74  erates no more t
216c0 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77  han one.  ** row
216d0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57   of output.  A W
216e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d  hereLoop is one-
216f0 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  row if all of th
21700 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21710 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20  true:.  **  (a) 
21720 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  All index column
21730 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45  s match with WHE
21740 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20  RE_COLUMN_EQ..  
21750 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65  **  (b) The inde
21760 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a  x is unique.  **
21770 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77   Any WhereLoop w
21780 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c  ith an WHERE_COL
21790 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e  UMN_EQ constrain
217a0 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69  t on the rowid i
217b0 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20  s one-row..  ** 
217c0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
217d0 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76  ereLoop will hav
217e0 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52  e the WHERE_ONER
217f0 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73  OW bit set in ws
21800 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Flags..  **.  **
21810 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
21820 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d  eLoop is "order-
21830 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65  distinct" if the
21840 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
21850 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57  from.  ** that W
21860 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72  hereLoop that ar
21870 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  e in the ORDER B
21880 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66  Y clause are dif
21890 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
218a0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
218b0 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65   WhereLoop.  Eve
218c0 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
218d0 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69  Loop is automati
218e0 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72  cally.  ** order
218f0 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57  -distinct.   A W
21900 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61  hereLoop that ha
21910 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s no columns in 
21920 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21930 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  use.  ** is not 
21940 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
21950 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
21960 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74  inct is not quit
21970 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65  e the same as be
21980 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20  ing.  ** UNIQUE 
21990 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63  since a UNIQUE c
219a0 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63  olumn or index c
219b0 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
219c0 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a   rows that .  **
219d0 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55   are NULL and NU
219e0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  LL values are eq
219f0 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65  uivalent for the
21a00 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65   purpose of orde
21a10 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a  r-distinct..  **
21a20 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
21a30 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d  tinct, the colum
21a40 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55  ns must be UNIQU
21a50 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  E and NOT NULL..
21a60 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f    **.  ** The ro
21a70 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20  wid for a table 
21a80 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45  is always UNIQUE
21a90 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f   and NOT NULL so
21aa0 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20   whenever the.  
21ab0 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73  ** rowid appears
21ac0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
21ad0 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72   clause, the cor
21ae0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
21af0 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74  Loop is.  ** aut
21b00 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72  omatically order
21b10 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a  -distinct..  */.
21b20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
21b30 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  rBy!=0 );.  if( 
21b40 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a  nLoop && Optimiz
21b50 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
21b60 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79  , SQLITE_OrderBy
21b70 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  IdxJoin) ) retur
21b80 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79  n 0;..  nOrderBy
21b90 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
21ba0 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  pr;.  testcase( 
21bb0 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20  nOrderBy==BMS-1 
21bc0 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42  );.  if( nOrderB
21bd0 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e  y>BMS-1 ) return
21be0 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f   0;  /* Cannot o
21bf0 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c  ptimize overly l
21c00 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a  arge ORDER BYs *
21c10 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69  /.  isOrderDisti
21c20 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e  nct = 1;.  obDon
21c30 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64  e = MASKBIT(nOrd
21c40 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72  erBy)-1;.  order
21c50 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30  DistinctMask = 0
21c60 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20  ;.  ready = 0;. 
21c70 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45   eqOpMask = WO_E
21c80 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49  Q | WO_IS | WO_I
21c90 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74  SNULL;.  if( wct
21ca0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21cb0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
21cc0 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49  eqOpMask |= WO_I
21cd0 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  N;.  for(iLoop=0
21ce0 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ; isOrderDistinc
21cf0 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e  t && obSat<obDon
21d00 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f  e && iLoop<=nLoo
21d10 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
21d20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72   if( iLoop>0 ) r
21d30 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  eady |= pLoop->m
21d40 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
21d50 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a   iLoop<nLoop ){.
21d60 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50        pLoop = pP
21d70 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
21d80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77 63 74  ];.      if( wct
21d90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21da0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20  ORDERBY_LIMIT ) 
21db0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65  continue;.    }e
21dc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  lse{.      pLoop
21dd0 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a   = pLast;.    }.
21de0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21df0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
21e00 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
21e10 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
21e20 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
21e30 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e   ) obSat = obDon
21e40 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
21e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 63      }else if( wc
21e60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21e70 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
21e80 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
21e90 72 65 65 2e 6e 44 69 73 74 69 6e 63 74 43 6f 6c  ree.nDistinctCol
21ea0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21eb0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
21ec0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
21ed0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
21ee0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
21ef0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
21f00 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
21f10 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
21f20 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
21f30 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
21f40 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
21f50 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
21f60 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
21f70 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
21f80 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
21f90 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
21fa0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
21fb0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
21fc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
21fd0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
21fe0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
21ff0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
22000 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
22010 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22020 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c  rSkipCollateAndL
22030 69 6b 65 6c 79 28 70 4f 72 64 65 72 42 79 2d 3e  ikely(pOrderBy->
22040 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
22050 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
22060 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
22070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22080 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
22090 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
220a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
220b0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
220c0 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
220d0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
220e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
22110 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
22120 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
22130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22140 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
22150 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
22160 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
22170 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
22180 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
22190 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
221a0 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
221b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
221c0 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
221d0 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
221e0 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
221f0 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
22200 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
22210 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
22220 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
22230 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
22240 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
22250 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
22260 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
22270 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
22280 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
22290 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
222a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
222b0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
222c0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
222d0 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
222e0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
222f0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
22300 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
22310 6f 6c 6c 53 65 71 4d 61 74 63 68 28 70 57 49 6e  ollSeqMatch(pWIn
22320 66 6f 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20  fo->pParse, .   
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22340 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
22350 78 70 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  xpr, pTerm->pExp
22360 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
22370 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
22390 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
223a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
223b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
223c0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
223d0 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
223e0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
223f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
22400 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
22410 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
22420 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
22430 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
22440 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
22450 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
22460 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
22470 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
22480 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
22490 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
224a0 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
224b0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
224c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
224d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
224e0 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
224f0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
22500 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
22510 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
22520 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
22530 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
22540 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
22550 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
22560 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
22570 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
22580 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
22590 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20  1]==XN_ROWID.   
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
225c0 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
225d0 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  le));.        is
225e0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
225f0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
22600 6e 64 65 78 29 0a 20 20 20 20 20 20 20 20 20 20  ndex).          
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
22630 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
22640 43 41 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 7d  CAN)==0;.      }
22650 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
22660 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
22670 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
22680 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
22690 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
226a0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
226b0 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
226c0 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
226d0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
226e0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
226f0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
22700 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
22710 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
22720 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
22730 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
22740 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
22750 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
22760 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
22770 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
22780 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
22790 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
227a0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
227b0 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
227c0 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
227d0 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
227e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
227f0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
22800 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
22810 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
22820 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
22830 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
22840 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
22850 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
22860 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
22870 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
22880 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
22890 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
228a0 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
228b0 73 73 69 6e 67 29 2e 20 20 45 78 63 65 70 74 2c  ssing).  Except,
228c0 20 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 0a 20   IS and ISNULL. 
228d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
228e0 73 20 69 6d 70 6c 79 20 74 68 61 74 20 74 68 65  s imply that the
228f0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 55 4e   index is not UN
22900 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 69 6e  IQUE NOT NULL in
22910 20 77 68 69 63 68 20 63 61 73 65 0a 20 20 20 20   which case.    
22920 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 6f        ** the loo
22930 70 20 6e 65 65 64 20 74 6f 20 62 65 20 6d 61 72  p need to be mar
22940 6b 65 64 20 61 73 20 6e 6f 74 20 6f 72 64 65 72  ked as not order
22950 2d 64 69 73 74 69 6e 63 74 20 62 65 63 61 75 73  -distinct becaus
22960 65 20 69 74 20 63 61 6e 0a 20 20 20 20 20 20 20  e it can.       
22970 20 20 20 2a 2a 20 68 61 76 65 20 72 65 70 65 61     ** have repea
22980 74 65 64 20 4e 55 4c 4c 20 72 6f 77 73 2e 0a 20  ted NULL rows.. 
22990 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
229a0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
229b0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
229c0 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28  a column of an (
229d0 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  (?,?) IN (SELECT
229e0 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20 20  ...)) .         
229f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66   ** expression f
22a00 6f 72 20 77 68 69 63 68 20 74 68 65 20 53 45 4c  or which the SEL
22a10 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  ECT returns more
22a20 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
22a30 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  ,.          ** c
22a40 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
22a50 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20  the only column 
22a60 75 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f  used by this loo
22a70 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  p. Otherwise,.  
22a80 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74          ** if it
22a90 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f   is one of two o
22aa0 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20  r more, none of 
22ab0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20  the columns can 
22ac0 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
22ad0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d 61  considered to ma
22ae0 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  tch an ORDER BY 
22af0 74 65 72 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  term..          
22b00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
22b10 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b   (eOp & eqOpMask
22b20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22b30 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 28 57      if( eOp & (W
22b40 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20  O_ISNULL|WO_IS) 
22b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22b60 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
22b70 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
22b80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22b90 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
22ba0 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
22bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
22bc0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
22be0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
22bf0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
22c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
22c10 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
22c20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
22c30 41 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  AYS(eOp & WO_IN)
22c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22c50 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74  /* ALWAYS() just
22c60 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69  ification: eOp i
22c70 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70  s an equality op
22c80 65 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68  erator due to th
22c90 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22ca0 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
22cb0 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74  e.nEq constraint
22cc0 20 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75   above.  Any equ
22cd0 61 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20  ality other.    
22ce0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
22cf0 57 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65  WO_IN is capture
22d00 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
22d10 73 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73  s "if".  So this
22d20 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20   one.           
22d30 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74   ** always has t
22d40 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20  o be WO_IN. */. 
22d50 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
22d60 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  *pX = pLoop->aLT
22d70 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20  erm[j]->pExpr;. 
22d80 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
22d90 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75  =j+1; i<pLoop->u
22da0 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29  .btree.nEq; i++)
22db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22dc0 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
22dd0 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
22de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22df0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
22e00 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f  p->aLTerm[i]->eO
22e10 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
22e20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22e30 20 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20      bOnce = 0;. 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
22e50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22e60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22e70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
22e80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
22e90 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f     /* Get the co
22ea0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74  lumn number in t
22eb0 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d  he table (iColum
22ec0 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65  n) and sort orde
22ed0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65  r.        ** (re
22ee0 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d  vIdx) for the j-
22ef0 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
22f00 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
22f10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
22f20 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
22f30 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
22f40 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
22f50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
22f60 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f  dx = pIndex->aSo
22f70 72 74 4f 72 64 65 72 5b 6a 5d 20 26 20 4b 45 59  rtOrder[j] & KEY
22f80 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45 53 43 3b  INFO_ORDER_DESC;
22f90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22fa0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
22fb0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
22fc0 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57  iColumn = XN_ROW
22fd0 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
22fe0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
22ff0 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
23000 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
23010 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
23020 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
23030 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
23040 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
23050 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
23060 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
23070 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
23080 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
23090 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
230a0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
230b0 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
230c0 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
230d0 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
230e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
230f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
23100 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
23110 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
23120 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
23130 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
23140 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
23150 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23160 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
23170 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
23180 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
23190 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
231a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
231b0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
231c0 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
231d0 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
231e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d    */.        isM
231f0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
23200 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
23210 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
23220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
23230 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
23240 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
23250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
23260 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23270 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64  prSkipCollateAnd
23280 4c 69 6b 65 6c 79 28 70 4f 72 64 65 72 42 79 2d  Likely(pOrderBy-
23290 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
232a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
232b0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
232c0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
232d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
232e0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
232f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
23300 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
23310 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
23320 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
23330 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
23340 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
23350 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
23360 20 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57   iColumn>=XN_ROW
23370 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
23380 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
23390 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
233a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
233b0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
233c0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
233d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
233e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
233f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
23400 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
23410 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
23420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
23430 70 72 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70  pr *pIdxExpr = p
23440 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
23450 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
23460 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
23470 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
23480 6b 69 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64  kip(pOBExpr, pId
23490 78 45 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a  xExpr, iCur) ){.
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
234b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
234c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
234d0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
234e0 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49  iColumn!=XN_ROWI
234f0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
23500 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23510 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57  ExprNNCollSeq(pW
23520 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
23530 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
23540 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
23550 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
23560 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
23570 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
23580 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
23590 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
235a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 63            if( wc
235b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
235c0 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
235d0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
235e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 44 69 73 74 69  ->u.btree.nDisti
235f0 6e 63 74 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20  nctCol = j+1;.  
23600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23610 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
23620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
23630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23640 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
23650 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
23660 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
23670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23680 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
23690 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
236a0 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
236b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
236c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
236d0 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
236e0 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
236f0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
23700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23710 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
23720 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
23730 72 65 76 49 64 78 29 21 3d 28 70 4f 72 64 65 72  revIdx)!=(pOrder
23740 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61  By->a[i].sortFla
23750 67 73 26 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52  gs&KEYINFO_ORDER
23760 5f 44 45 53 43 29 20 29 7b 0a 20 20 20 20 20 20  _DESC) ){.      
23770 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
23780 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
237a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
237b0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 28  rev = revIdx ^ (
237c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
237d0 6f 72 74 46 6c 61 67 73 20 26 20 4b 45 59 49 4e  ortFlags & KEYIN
237e0 46 4f 5f 4f 52 44 45 52 5f 44 45 53 43 29 3b 0a  FO_ORDER_DESC);.
237f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23800 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
23810 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
23820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
23830 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
23840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23850 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
23860 61 74 63 68 20 26 26 20 28 70 4f 72 64 65 72 42  atch && (pOrderB
23870 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67  y->a[i].sortFlag
23880 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45  s & KEYINFO_ORDE
23890 52 5f 42 49 47 4e 55 4c 4c 29 20 29 7b 0a 20 20  R_BIGNULL) ){.  
238a0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
238b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
238c0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  q ){.           
238d0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
238e0 7c 3d 20 57 48 45 52 45 5f 42 49 47 4e 55 4c 4c  |= WHERE_BIGNULL
238f0 5f 53 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20  _SORT;.         
23900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23910 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
23920 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23940 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20  f( isMatch ){.  
23950 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
23960 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b  umn==XN_ROWID ){
23970 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
23980 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
23990 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
239a0 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
239b0 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
239c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
239d0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
239e0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
239f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23a00 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
23a10 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
23a20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
23a30 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
23a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23a50 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
23a60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
23a70 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
23a80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
23a90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
23aa0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
23ab0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
23ac0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
23ad0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
23ae0 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
23af0 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
23b00 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
23b10 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
23b20 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
23b30 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
23b40 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
23b50 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
23b60 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
23b70 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
23b80 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
23b90 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
23ba0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
23bb0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
23bc0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
23bd0 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
23be0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
23bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23c00 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
23c10 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
23c20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
23c30 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  mTerm;.        i
23c40 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
23c50 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
23c60 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
23c70 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
23c80 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72  pr;.        mTer
23c90 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
23ca0 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66  ExprUsage(&pWInf
23cb0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
23cc0 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
23cd0 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
23ce0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
23cf0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23d00 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
23d10 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
23d20 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
23d30 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
23d40 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
23d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23d60 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
23d70 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
23d80 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
23d90 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
23da0 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
23db0 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
23dc0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
23dd0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
23de0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
23df0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
23e00 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
23e10 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
23e20 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
23e30 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
23e40 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
23e50 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
23e60 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
23e70 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
23e80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
23e90 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
23ea0 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
23eb0 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
23ec0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23ed0 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
23ee0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
23ef0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
23f00 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
23f10 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
23f20 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
23f30 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
23f40 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
23f50 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
23f60 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
23f70 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
23f80 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
23f90 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
23fa0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
23fb0 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
23fc0 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
23fd0 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
23fe0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
23ff0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
24000 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
24010 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
24020 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
24030 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
24040 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
24050 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
24060 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
24070 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
24080 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
24090 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
240a0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
240b0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
240c0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
240d0 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
240e0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
240f0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
24100 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
24110 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
24120 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
24130 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
24140 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
24150 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
24160 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
24170 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
24180 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
24190 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
241a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
241b0 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
241c0 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
241d0 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
241e0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
241f0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
24200 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
24210 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
24220 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
24230 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
24240 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24250 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
24260 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
24270 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
24280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
24290 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
242a0 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
242b0 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
242c0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
242d0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
242e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
242f0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
24300 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
24310 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
24320 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
24330 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
24340 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
24350 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
24360 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
24370 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
24380 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
24390 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
243a0 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
243b0 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
243c0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
243d0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
243e0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
243f0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
24400 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24410 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
24420 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
24430 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
24440 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
24450 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
24460 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
24470 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
24480 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
24490 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
244a0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
244b0 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
244c0 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
244d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
244e0 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
244f0 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
24500 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
24510 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
24520 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
24530 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
24540 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
24550 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
24560 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
24570 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
24580 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
24590 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
245a0 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
245b0 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
245c0 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
245d0 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
245e0 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
245f0 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
24600 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
24610 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
24620 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
24630 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
24640 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
24650 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
24660 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
24670 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
24680 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
24690 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
246a0 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
246b0 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
246c0 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
246d0 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
246e0 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
246f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
24700 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
24710 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
24720 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
24730 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
24740 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
24750 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61  st = nRow + rSca
24760 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d  le + 16;..  /* M
24770 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d  ultiple by log(M
24780 29 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65  ) where M is the
24790 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
247a0 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65  t rows..  ** Use
247b0 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d   the LIMIT for M
247c0 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65   if it is smalle
247d0 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e  r */.  if( (pWIn
247e0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
247f0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
24800 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e  )!=0 && pWInfo->
24810 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20  iLimit<nRow ){. 
24820 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f     nRow = pWInfo
24830 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  ->iLimit;.  }.  
24840 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74  rSortCost += est
24850 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74  Log(nRow);.  ret
24860 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d  urn rSortCost;.}
24870 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
24880 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
24890 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
248a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
248b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
248c0 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
248d0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
248e0 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
248f0 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
24900 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
24910 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
24920 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
24930 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
24940 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
24950 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
24960 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
24970 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
24980 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
24990 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
249a0 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
249b0 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
249c0 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
249d0 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
249e0 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
249f0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
24a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24a10 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
24a20 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
24a30 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
24a40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
24a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24a60 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
24a70 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
24a80 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
24a90 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ab0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
24ac0 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
24ad0 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
24ae0 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
24af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24b00 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
24b10 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
24b20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
24b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
24b40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
24b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
24b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24b70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
24b80 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
24b90 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
24ba0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
24bb0 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
24bc0 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
24bd0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
24be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24bf0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
24c00 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
24c10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24c20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
24c30 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
24c40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
24c50 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rBy;            
24c60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
24c70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
24c80 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  rms */.  LogEst 
24c90 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
24ca0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
24cb0 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
24cc0 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
24cd0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b   mxUnsorted = 0;
24ce0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75      /* Maximum u
24cf0 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
24d00 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f  a set of path */
24d10 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
24d20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
24d30 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
24d40 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
24d50 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
24d60 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
24d70 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
24d80 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
24d90 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
24da0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
24db0 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
24dc0 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
24dd0 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
24de0 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
24df0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
24e00 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
24e10 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
24e20 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
24e30 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
24e40 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
24e50 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
24e60 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
24e70 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
24e80 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
24e90 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
24ea0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
24eb0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
24ec0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
24ed0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
24ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
24ef0 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
24f00 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
24f10 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74  .  LogEst *aSort
24f20 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cost = 0;    /* 
24f30 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74  Sorting and part
24f40 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74  ial sorting cost
24f50 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  s */.  char *pSp
24f60 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
24f70 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
24f80 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
24f90 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  s routine */.  i
24fa0 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20  nt nSpace;      
24fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
24fc0 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
24fd0 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a  ated at pSpace *
24fe0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
24ff0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
25000 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25010 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  .  nLoop = pWInf
25020 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20  o->nLevel;.  /* 
25030 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70  TUNING: For simp
25040 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79  le queries, only
25050 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69   the best path i
25060 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20  s tracked..  ** 
25070 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c  For 2-way joins,
25080 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68   the 5 best path
25090 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a  s are followed..
250a0 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f    ** For joins o
250b0 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  f 3 or more tabl
250c0 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30  es, track the 10
250d0 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20   best paths */. 
250e0 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f   mxChoice = (nLo
250f0 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c  op<=1) ? 1 : (nL
25100 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29  oop==2 ? 5 : 10)
25110 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
25120 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
25130 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57  ist->nSrc );.  W
25140 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
25150 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f   ("---- begin so
25160 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d  lver.  (nRowEst=
25170 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  %d)\n", nRowEst)
25180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77  );..  /* If nRow
25190 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  Est is zero and 
251a0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
251b0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e  R BY clause, ign
251c0 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a  ore it. In this.
251d0 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75    ** case the pu
251e0 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
251f0 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74  ll is to estimat
25200 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
25210 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20  rows returned.  
25220 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c  ** by the overal
25230 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68  l query. Once th
25240 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20  is estimate has 
25250 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
25260 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77  he caller.  ** w
25270 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
25280 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e  function a secon
25290 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20  d time, passing 
252a0 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20  the estimate as 
252b0 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74  the.  ** nRowEst
252c0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a   parameter.  */.
252d0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
252e0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
252f0 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  wEst==0 ){.    n
25300 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
25310 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
25320 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
25330 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
25340 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
25350 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
25360 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61  space for aTo, a
25370 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f  From and aSortCo
25380 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65  st[] */.  nSpace
25390 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
253a0 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
253b0 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
253c0 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53  mxChoice*2;.  nS
253d0 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  pace += sizeof(L
253e0 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
253f0 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  y;.  pSpace = sq
25400 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
25410 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  NN(db, nSpace);.
25420 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
25430 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25440 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54  NOMEM_BKPT;.  aT
25450 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
25460 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
25470 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
25480 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
25490 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
254a0 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
254b0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
254c0 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
254d0 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
254e0 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
254f0 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
25500 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
25510 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
25520 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
25530 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
25540 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
25550 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
25560 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
25570 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
25580 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
25590 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
255a0 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
255b0 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
255c0 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
255d0 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
255e0 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
255f0 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
25600 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
25610 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
25620 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
25630 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
25640 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
25650 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
25660 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
25670 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
25680 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
25690 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
256a0 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
256b0 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
256c0 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
256d0 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
256e0 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
256f0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
25700 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
25710 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
25720 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
25730 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
25740 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
25750 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
25760 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
25770 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
25780 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
25790 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
257a0 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
257b0 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
257c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
257d0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
257e0 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
257f0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
25800 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
25810 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20  ns go above 28. 
25820 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
25830 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
25840 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
25850 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
25860 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
25870 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73  rst 28.  ** rows
25880 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
25890 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
258a0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
258b0 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
258c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
258d0 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74  op, 48);  assert
258e0 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 48==sqlite3Log
258f0 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72  Est(28) );.  nFr
25900 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
25910 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
25920 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
25930 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
25940 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
25950 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
25960 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
25970 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
25980 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
25990 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
259a0 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
259b0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
259c0 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
259d0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
259e0 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
259f0 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
25a00 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
25a10 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
25a20 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
25a30 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
25a40 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
25a50 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
25a60 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
25a70 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
25a80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
25a90 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
25aa0 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
25ab0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
25ac0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
25ad0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
25ae0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
25af0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
25b00 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
25b10 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
25b20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
25b30 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
25b40 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
25b50 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
25b60 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
25b70 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
25b80 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
25b90 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
25ba0 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
25bb0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
25bc0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
25bd0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
25be0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
25bf0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
25c00 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
25c10 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
25c20 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
25c30 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
25c40 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
25c50 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
25c60 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
25c70 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
25c80 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
25c90 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25cb0 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
25cc0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
25cd0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
25ce0 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d00 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
25d10 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
25d20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
25d30 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
25d40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
25d50 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
25d60 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
25d70 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
25d80 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
25d90 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
25da0 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
25db0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
25dc0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
25dd0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
25de0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
25df0 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
25e00 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
25e10 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
25e20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25e30 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
25e40 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
25e50 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
25e60 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
25e70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
25e80 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
25e90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25ea0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
25eb0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
25ec0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
25ed0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25ee0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73   if( (pWLoop->ws
25ef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
25f00 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
25f10 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 33 20 29 7b  pFrom->nRow<3 ){
25f20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
25f30 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
25f40 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
25f50 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
25f60 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
25f70 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
25f80 73 20 74 68 61 6e 20 31 2e 32 35 20 74 69 6d 65  s than 1.25 time
25f90 73 2e 20 20 49 74 20 69 73 20 74 65 6d 70 74 69  s.  It is tempti
25fa0 6e 67 20 74 6f 20 61 6c 73 6f 20 65 78 63 6c 75  ng to also exclu
25fb0 64 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  de.          ** 
25fc0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
25fd0 75 73 61 67 65 20 6f 6e 20 61 6e 20 6f 75 74 65  usage on an oute
25fe0 72 20 6c 6f 6f 70 2c 20 62 75 74 20 73 6f 6d 65  r loop, but some
25ff0 74 69 6d 65 73 20 61 6e 20 61 75 74 6f 6d 61 74  times an automat
26000 69 63 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ic.          ** 
26010 69 6e 64 65 78 20 69 73 20 75 73 65 66 75 6c 20  index is useful 
26020 69 6e 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  in the outer loo
26030 70 20 6f 66 20 61 20 63 6f 72 72 65 6c 61 74 65  p of a correlate
26040 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20  d subquery. */. 
26050 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26060 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
26070 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20  st(2) );.       
26080 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26090 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
260a0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
260b0 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
260c0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
260d0 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
260e0 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
260f0 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
26100 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
26110 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
26120 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
26130 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
26140 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
26150 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
26160 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26170 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46  dd(rUnsorted, pF
26180 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b  rom->rUnsorted);
26190 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
261a0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
261b0 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
261c0 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
261d0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
261e0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
261f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
26200 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
26210 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
26220 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
26230 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
26240 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
26250 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
26260 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
26270 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
26280 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
262b0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
262c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
262d0 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
262e0 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
262f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26300 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
26310 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
26320 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
26330 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74     if( aSortCost
26340 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29  [isOrdered]==0 )
26350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
26360 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
26370 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e  d] = whereSortin
26380 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20  gCost(.         
26390 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e         pWInfo, n
263a0 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79  RowEst, nOrderBy
263b0 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  , isOrdered.    
263c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
263d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
263e0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 41 64 64   /* TUNING:  Add
263f0 20 61 20 73 6d 61 6c 6c 20 65 78 74 72 61 20 70   a small extra p
26400 65 6e 61 6c 74 79 20 28 35 29 20 74 6f 20 73 6f  enalty (5) to so
26410 72 74 69 6e 67 20 61 73 20 61 6e 0a 20 20 20 20  rting as an.    
26420 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20 65        ** extra e
26430 6e 63 6f 75 72 61 67 6d 65 6e 74 20 74 6f 20 74  ncouragment to t
26440 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
26450 20 74 6f 20 73 65 6c 65 63 74 20 61 20 70 6c 61   to select a pla
26460 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  n.          ** w
26470 68 65 72 65 20 74 68 65 20 72 6f 77 73 20 65 6d  here the rows em
26480 65 72 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  erge in the corr
26490 65 63 74 20 6f 72 64 65 72 20 77 69 74 68 6f 75  ect order withou
264a0 74 20 61 6e 79 20 73 6f 72 74 69 6e 67 0a 20 20  t any sorting.  
264b0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69          ** requi
264c0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
264d0 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
264e0 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
264f0 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b  rted, aSortCost[
26500 69 73 4f 72 64 65 72 65 64 5d 29 20 2b 20 35 3b  isOrdered]) + 5;
26510 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ..          WHER
26520 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20  ETRACE(0x002,.  
26530 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d              ("--
26540 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
26550 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61  d (%d/%d) increa
26560 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20  ses cost %3d to 
26570 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %-3d\n",.       
26580 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
26590 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e  t[isOrdered], (n
265a0 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65  OrderBy-isOrdere
265b0 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20  d), nOrderBy, . 
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55                rU
265d0 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29  nsorted, rCost))
265e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
265f0 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
26600 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
26610 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
26620 64 20 2d 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49  d -= 2;  /* TUNI
26630 4e 47 3a 20 20 53 6c 69 67 68 74 20 62 69 61 73  NG:  Slight bias
26640 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d   in favor of no-
26650 73 6f 72 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20  sort plans */.  
26660 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26670 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
26680 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
26690 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
266a0 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20  e set of.       
266b0 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73   ** mxChoice bes
266c0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a  t-so-far paths..
266d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
266e0 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b     ** First look
266f0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
26700 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74   path among best
26710 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20  -so-far paths.  
26720 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
26730 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65  vers the same se
26740 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
26750 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
26760 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  dered.        **
26770 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20   setting as the 
26780 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e  current path can
26790 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20  didate..        
267a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
267b0 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69  e term "((pTo->i
267c0 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
267d0 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73  ed)&0x80)==0" is
267e0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
267f0 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e      ** to (pTo->
26800 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
26810 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  ==(isOrdered==(-
26820 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e  1))" for the ran
26830 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ge.        ** of
26840 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f   legal values fo
26850 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e  r isOrdered, -1.
26860 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  .64..        */.
26870 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
26880 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54  , pTo=aTo; jj<nT
26890 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; jj++, pTo++){
268a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
268b0 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61  To->maskLoop==ma
268c0 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20  skNew.          
268d0 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64   && ((pTo->isOrd
268e0 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
268f0 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  0x80)==0.       
26900 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26910 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
26920 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
26930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26950 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
26960 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
26970 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68     /* None of th
26980 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d  e existing best-
26990 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74  so-far paths mat
269a0 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ch the candidate
269b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
269c0 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
269d0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
269e0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
269f0 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  (rCost==mxCost &
26a00 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55  & rUnsorted>=mxU
26a10 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20  nsorted)).      
26a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26a30 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
26a40 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e  t candidate is n
26a50 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e  o better than an
26a60 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  y of the mxChoic
26a70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
26a80 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79   paths currently
26a90 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d   in the best-so-
26aa0 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20  far buffer.  So 
26ab0 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20  discard.        
26ac0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64      ** this cand
26ad0 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61  idate as not via
26ae0 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ble. */.#ifdef W
26af0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26b00 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
26b10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26b20 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
26b30 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
26b40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26b50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
26b60 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
26b70 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
26ba0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
26bb0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
26bc0 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
26bf0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
26c00 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
26c10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26c20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26c30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26c40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
26c50 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
26c60 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
26c70 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
26c80 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
26c90 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
26ca0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
26cb0 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
26cc0 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
26cd0 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
26ce0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
26cf0 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
26d00 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26d10 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
26d20 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
26d30 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
26d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d50 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
26d60 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
26d70 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
26d80 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
26d90 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
26da0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
26db0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26dc0 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
26dd0 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
26de0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26df0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
26e00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26e10 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
26e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
26e30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26e40 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
26e50 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
26e60 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
26e70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
26e80 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
26e90 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
26ea0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
26eb0 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
26ec0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
26ed0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
26ee0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
26ef0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
26f00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
26f20 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
26f30 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
26f40 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
26f50 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
26f60 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
26f70 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
26f80 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
26f90 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
26fa0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
26fb0 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
26fc0 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
26fd0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
26fe0 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
26ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
27000 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
27010 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
27020 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 20  skipped..       
27030 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
27040 20 2a 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   ** The conditio
27050 6e 61 6c 20 69 73 20 61 6e 20 65 78 70 61 6e 64  nal is an expand
27060 65 64 20 76 65 63 74 6f 72 20 63 6f 6d 70 61 72  ed vector compar
27070 69 73 6f 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  ison equivalent 
27080 74 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to:.          **
27090 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70     (pTo->rCost,p
270a0 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55  To->nRow,pTo->rU
270b0 6e 73 6f 72 74 65 64 29 20 3c 3d 20 28 72 43 6f  nsorted) <= (rCo
270c0 73 74 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65  st,nOut,rUnsorte
270d0 64 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d).          */.
270e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
270f0 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a  o->rCost<rCost .
27100 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
27110 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
27120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27130 26 26 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f  && (pTo->nRow<nO
27140 75 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ut.             
27150 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e        || (pTo->n
27160 52 6f 77 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f  Row==nOut && pTo
27170 2d 3e 72 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e  ->rUnsorted<=rUn
27180 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20  sorted).        
27190 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
271a0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
271b0 20 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20        ){.#ifdef 
271c0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
271d0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
271e0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
271f0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
27200 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
27210 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27220 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
27230 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
27240 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
27250 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
27260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27270 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
27280 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
27290 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
272a0 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
272b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
272c0 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
272d0 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
272e0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
272f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27300 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
27310 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
27320 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
27330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27340 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
27350 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
27360 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
27370 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
27390 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f  ->rUnsorted, pTo
273a0 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
273b0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
273c0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
273d0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
273e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
273f0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64  Discard the cand
27400 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20  idate path from 
27410 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72  further consider
27420 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
27430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27440 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
27450 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27480 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
27490 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b  Cost==rCost+1 );
274a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
274b0 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
274c0 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  re if the candid
274d0 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74  ate path is bett
274e0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
274f0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74        ** pTo pat
27500 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20  h.  Replace pTo 
27510 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61  with the candida
27520 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  te. */.#ifdef WH
27530 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
27540 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
27550 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27560 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
27570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
27580 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27590 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
275a0 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73    "Update %s cos
275b0 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
275c0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
275d0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
275e0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
275f0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
27600 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
27610 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
27620 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
27630 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
27640 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
27650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27660 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
27670 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
27680 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
27690 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
276a0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
276b0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
276c0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
276d0 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
276e0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
276f0 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e  rUnsorted, pTo->
27700 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
27710 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
27720 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
27730 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
27750 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
27760 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
27770 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
27780 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
27790 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
277a0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
277b0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
277c0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
277d0 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
277e0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
277f0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
27800 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
27810 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
27820 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
27830 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
27840 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
27850 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
27860 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
27870 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
27880 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
27890 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
278a0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
278b0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
278c0 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
278d0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
278e0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
278f0 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
27900 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
27910 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
27920 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
27930 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
27940 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
27950 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
27960 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
27970 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
27980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
27990 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
279a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
279b0 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
279c0 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
279d0 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
279e0 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
279f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27a00 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
27a10 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
27a20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
27a30 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
27a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
27a50 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
27a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27a70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27a80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
27a90 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
27aa0 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
27ab0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
27ac0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
27ad0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
27ae0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
27af0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
27b00 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
27b10 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
27b20 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
27b30 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
27b40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27b50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
27b60 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
27b70 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
27b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
27b90 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
27ba0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
27bb0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
27bc0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
27bd0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
27be0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
27bf0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
27c00 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
27c10 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
27c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27c30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
27c40 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
27c50 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
27c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27c80 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
27c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ca0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
27cb0 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
27cc0 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
27cd0 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
27ce0 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
27cf0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
27d00 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
27d10 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
27d20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
27d30 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
27d40 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
27d50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27d60 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
27d70 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
27d80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
27d90 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29  eeNN(db, pSpace)
27da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27db0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
27dc0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
27dd0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
27de0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
27df0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
27e00 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
27e10 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
27e20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
27e30 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
27e40 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
27e50 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
27e60 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
27e70 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
27e80 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
27e90 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
27ea0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
27eb0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
27ec0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
27ed0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
27ee0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
27ef0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
27f00 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
27f10 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
27f20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
27f30 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
27f40 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
27f50 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
27f60 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
27f70 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
27f80 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
27f90 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
27fa0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
27fb0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
27fc0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
27fd0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
27fe0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
27ff0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
28000 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28010 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
28020 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
28030 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
28040 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
28050 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
28060 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
28070 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
28080 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
28090 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
280a0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
280b0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
280d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
280e0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
280f0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
28100 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
28110 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
28120 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
28130 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
28140 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
28150 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
28160 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
28170 0a 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65  .  pWInfo->bOrde
28180 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 30  redInnerLoop = 0
28190 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
281a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
281b0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
281c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
281d0 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
281e0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
281f0 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d  Ordered==pWInfo-
28200 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
28210 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
28220 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
28230 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
28240 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a  RDERED;.      }.
28250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28260 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
28270 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
28280 65 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ed;.      pWInfo
28290 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
282a0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
282b0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
282c0 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20  BSat<=0 ){.     
282d0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61     pWInfo->nOBSa
282e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
282f0 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20  f( nLoop>0 ){.  
28300 20 20 20 20 20 20 20 20 75 33 32 20 77 73 46 6c          u32 wsFl
28310 61 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  ags = pFrom->aLo
28320 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46  op[nLoop-1]->wsF
28330 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
28340 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57  if( (wsFlags & W
28350 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
28360 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
28370 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49  wsFlags&(WHERE_I
28380 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  PK|WHERE_COLUMN_
28390 49 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b  IN))!=(WHERE_IPK
283a0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
283b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
283c0 20 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61             Bitma
283d0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk m = 0;.      
283e0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
283f0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
28400 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
28410 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28420 79 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  y, pFrom,.      
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
28450 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  MIT, nLoop-1, pF
28460 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
28470 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20  -1], &m);.      
28480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
284a0 49 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IPK );.         
284b0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
284c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
284d0 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
284e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57        if( rc==pW
284f0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
28500 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
28510 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62         pWInfo->b
28520 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
28530 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
28540 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
28550 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ask = m;.       
28560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28570 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28580 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
28590 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
285a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
285b0 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
285c0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
285d0 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
285e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
285f0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
28600 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
28610 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
28620 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
28630 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
28640 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
28650 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28660 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
28670 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
28680 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
28690 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
286a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
286b0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
286c0 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
286d0 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
286e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
286f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
28700 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
28710 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
28720 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
28730 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
28740 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
28750 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
28760 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
28770 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
28780 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
28790 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
287a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
287b0 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  N(db, pSpace);. 
287c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
287d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74  K;.}../*.** Most
287e0 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c   queries use onl
287f0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
28800 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a   (they are not j
28810 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a  oins) and have.*
28820 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73  * simple == cons
28830 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
28840 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20  indexed fields. 
28850 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
28860 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61  tempts.** to pla
28870 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63  n those simple c
28880 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20  ases using much 
28890 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68  less ceremony th
288a0 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61  an the.** genera
288b0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
288c0 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65  planner, and the
288d0 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65  reby yield faste
288e0 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
288f0 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72  e().** times for
28900 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
28910 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
28920 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
28930 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72  ss, if this quer
28940 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  y can be handled
28950 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66   by this.** no-f
28960 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e  rills query plan
28970 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ner.  Return zer
28980 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  o if this query 
28990 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65  needs the .** ge
289a0 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
289b0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
289c0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
289d0 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f  ShortCut(WhereLo
289e0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
289f0 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
28a00 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72  o *pWInfo;.  str
28a10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28a20 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65   *pItem;.  Where
28a30 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
28a40 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
28a50 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
28a60 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
28a70 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c  .  int j;.  Tabl
28a80 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
28a90 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66   *pIdx;..  pWInf
28aa0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
28ab0 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
28ac0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
28ad0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28ae0 55 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  USE ) return 0;.
28af0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
28b00 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
28b10 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  >=1 );.  pItem =
28b20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
28b30 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70  t->a;.  pTab = p
28b40 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66  Item->pTab;.  if
28b50 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
28b60 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
28b70 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
28b80 49 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75  IndexedBy ) retu
28b90 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70  rn 0;.  iCur = p
28ba0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
28bb0 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
28bc0 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  sWC;.  pLoop = p
28bd0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
28be0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
28bf0 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53  = 0;.  pLoop->nS
28c00 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  kip = 0;.  pTerm
28c10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
28c20 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
28c30 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c  r, -1, 0, WO_EQ|
28c40 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IS, 0);.  if(
28c50 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65   pTerm ){.    te
28c60 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
28c70 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
28c80 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
28c90 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
28ca0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49  OLUMN_EQ|WHERE_I
28cb0 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  PK|WHERE_ONEROW;
28cc0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  .    pLoop->aLTe
28cd0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
28ce0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
28cf0 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d   = 1;.    pLoop-
28d00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
28d10 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
28d20 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64   Cost of a rowid
28d30 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f   lookup is 10 */
28d40 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e  .    pLoop->rRun
28d50 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73   = 33;  /* 33==s
28d60 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
28d70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
28d80 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
28d90 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
28da0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
28db0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73  .      int opMas
28dc0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
28dd0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
28de0 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
28df0 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rm );.      if( 
28e00 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
28e10 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70  Idx).       || p
28e20 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
28e30 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
28e40 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
28e50 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
28e60 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
28e70 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
28e80 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70        opMask = p
28e90 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
28ea0 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   ? (WO_EQ|WO_IS)
28eb0 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20   : WO_EQ;.      
28ec0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
28ed0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
28ee0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
28ef0 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
28f00 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
28f10 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49  j, 0, opMask, pI
28f20 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
28f30 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
28f40 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  k;.        testc
28f50 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
28f60 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
28f70 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
28f80 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
28f90 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
28fa0 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b   if( j!=pIdx->nK
28fb0 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
28fc0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
28fd0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
28fe0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
28ff0 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
29000 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  XED;.      if( p
29010 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  Idx->isCovering 
29020 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  || (pItem->colUs
29030 65 64 20 26 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f  ed & pIdx->colNo
29040 74 49 64 78 65 64 29 3d 3d 30 20 29 7b 0a 20 20  tIdxed)==0 ){.  
29050 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
29060 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
29070 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
29080 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
29090 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
290a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
290b0 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
290c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
290d0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
290e0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
290f0 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
29100 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
29110 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
29120 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
29130 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
29140 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
29150 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
29160 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
29170 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
29180 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
29190 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
291a0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
291b0 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oop;.    assert(
291c0 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65   pWInfo->sMaskSe
291d0 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d  t.n==1 && iCur==
291e0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
291f0 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c  .ix[0] );.    pL
29200 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
29210 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65  1; /* sqlite3Whe
29220 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
29230 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
29240 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  r); */.    pWInf
29250 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
29260 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
29270 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
29280 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
29290 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
292a0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57  fo->nOBSat =  pW
292b0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
292c0 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  nExpr;.    if( p
292d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
292e0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
292f0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
29300 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
29310 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
29320 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
29330 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
29340 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
29350 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
29360 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
29370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
29390 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78   function for ex
293a0 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  prIsDeterministi
293b0 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  c()..*/.static i
293c0 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74  nt exprNodeIsDet
293d0 65 72 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b 65  erministic(Walke
293e0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
293f0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
29400 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  pExpr->op==TK_FU
29410 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61  NCTION && ExprHa
29420 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
29430 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d   EP_ConstFunc)==
29440 30 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  0 ){.    pWalker
29450 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
29460 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29470 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
29480 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
29490 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
294a0 75 65 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ue if the expres
294b0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  sion contains no
294c0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
294d0 69 63 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74  ic SQL .** funct
294e0 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e  ions. Do not con
294f0 73 69 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d  sider non-determ
29500 69 6e 69 73 74 69 63 20 53 51 4c 20 66 75 6e 63  inistic SQL func
29510 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 0a  tions that are .
29520 2a 2a 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73  ** part of sub-s
29530 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
29540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29550 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73  exprIsDeterminis
29560 74 69 63 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  tic(Expr *p){.  
29570 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
29580 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
29590 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20  (w));.  w.eCode 
295a0 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
295b0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
295c0 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63  eIsDeterministic
295d0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
295e0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
295f0 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20  electWalkFail;. 
29600 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
29610 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
29620 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
29630 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
29640 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
29650 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
29660 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
29670 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
29680 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
29690 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
296a0 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
296b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
296c0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
296d0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
296e0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
296f0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
29700 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
29710 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
29720 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
29730 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
29740 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
29750 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
29760 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
29770 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
29780 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
29790 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
297a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
297b0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
297c0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
297d0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
297e0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
297f0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
29800 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
29810 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
29820 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
29830 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
29840 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
29850 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
29860 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
29870 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
29880 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
29890 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
298a0 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
298b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
298c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
298d0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
298e0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
298f0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
29900 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
29910 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
29920 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
29930 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
29940 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
29950 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
29960 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
29970 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
29980 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
29990 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
299a0 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
299b0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
299c0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
299d0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
299e0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
299f0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
29a00 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
29a10 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
29a40 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
29a50 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
29a80 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
29a90 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
29aa0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
29ab0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
29ac0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
29ad0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
29ae0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
29af0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
29b00 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
29b10 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
29b20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
29b30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
29b40 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
29b50 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
29b60 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
29b70 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
29b80 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
29b90 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
29ba0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
29bb0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
29bc0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
29bd0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
29be0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
29bf0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
29c00 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
29c10 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
29c20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
29c30 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
29c40 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
29c50 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
29c60 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
29c70 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
29c80 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
29c90 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
29ca0 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
29cb0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
29cc0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
29cd0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
29ce0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
29cf0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
29d00 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
29d10 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
29d20 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
29d30 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
29d40 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
29d50 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
29d60 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
29d70 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
29d80 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
29d90 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
29da0 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
29db0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
29dc0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
29dd0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
29de0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
29df0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
29e00 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
29e10 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
29e20 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
29e30 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
29e40 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
29e50 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
29e60 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
29e70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
29e80 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
29e90 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
29ea0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
29eb0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
29ec0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
29ed0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
29ee0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
29ef0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
29f00 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
29f10 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
29f20 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
29f30 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
29f40 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
29f50 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
29f60 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
29f70 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
29f80 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29f90 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
29fa0 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
29fb0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
29fc0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
29fd0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
29fe0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
29ff0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2a000 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2a010 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2a020 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2a030 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2a040 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a050 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2a060 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2a070 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2a080 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2a090 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2a0a0 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2a0b0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2a0c0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2a0d0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2a0e0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2a0f0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2a100 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2a110 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2a120 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2a130 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2a140 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2a150 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2a160 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2a170 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2a180 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2a190 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2a1a0 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2a1b0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2a1c0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2a1d0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2a1e0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2a1f0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2a200 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2a210 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2a220 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2a230 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2a240 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2a250 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2a260 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2a270 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2a280 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2a290 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2a2a0 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
2a2b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2a2c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
2a2d0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
2a2e0 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
2a2f0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
2a300 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
2a310 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
2a320 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
2a330 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
2a340 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
2a350 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
2a360 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
2a370 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2a380 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
2a390 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2a3a0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
2a3b0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
2a3c0 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
2a3d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
2a3e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
2a3f0 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
2a400 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  .** WHERE_OR_SUB
2a410 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
2a420 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75  IdxCur is the cu
2a430 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
2a440 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73  n index.** to us
2a450 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  e for OR clause 
2a460 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2a470 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68   WHERE clause sh
2a480 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a  ould use this.**
2a490 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72   specific cursor
2a4a0 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50  .  If WHERE_ONEP
2a4b0 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73  ASS_DESIRED is s
2a4c0 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72  et, then iIdxCur
2a4d0 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
2a4e0 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72   cursor in an ar
2a4f0 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66  ray of cursors f
2a500 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  or all indices. 
2a510 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a   iIdxCur should.
2a520 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ** be used to co
2a530 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70  mpute the approp
2a540 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70  riate cursor dep
2a550 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
2a560 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64  index is.** used
2a570 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
2a580 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2a590 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
2a5a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2a5b0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2a5c0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
2a5d0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
2a5e0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20  /* FROM clause: 
2a5f0 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
2a600 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
2a610 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
2a620 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20  here,           
2a630 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2a640 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2a650 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
2a660 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
2a670 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
2a680 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
2a690 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
2a6a0 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75  sultSet,   /* Qu
2a6b0 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20  ery result set. 
2a6c0 20 52 65 71 27 64 20 66 6f 72 20 44 49 53 54 49   Req'd for DISTI
2a6d0 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  NCT */.  u16 wct
2a6e0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  rlFlags,        
2a6f0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20   /* The WHERE_* 
2a700 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
2a710 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
2a720 20 20 69 6e 74 20 69 41 75 78 41 72 67 20 20 20    int iAuxArg   
2a730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2a740 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2a750 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78  SE is set, index
2a760 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a780 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57           ** If W
2a790 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20  HERE_USE_LIMIT, 
2a7a0 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61  then the limit a
2a7b0 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mount */.){.  in
2a7c0 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
2a7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
2a7e0 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
2a7f0 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
2a800 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
2a810 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
2a820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a830 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
2a840 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
2a850 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2a860 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
2a870 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
2a880 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2a890 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
2a8a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2a8b0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
2a8c0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
2a8d0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
2a8e0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
2a8f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2a900 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
2a910 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
2a920 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
2a930 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
2a940 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
2a950 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
2a960 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2a970 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
2a980 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2a990 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
2a9a0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
2a9b0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
2a9c0 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
2a9d0 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
2a9e0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
2a9f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2aa00 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
2aa10 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
2aa20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2aa40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2aa50 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2aa70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2aa80 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2aab0 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65  e */.  u8 bForde
2aac0 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
2aad0 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44    /* OPFLAG_FORD
2aae0 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61  ELETE or zero, a
2aaf0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
2ab00 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  ..  assert( (wct
2ab10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ab20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2ab30 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20  )==0 || (.      
2ab40 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20    (wctrlFlags & 
2ab50 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2ab60 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20  SIRED)!=0 .     
2ab70 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2ab80 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2ab90 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a  USE)==0 .  ));..
2aba0 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66    /* Only one of
2abb0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2abc0 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45  USE or WHERE_USE
2abd0 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65  _LIMIT */.  asse
2abe0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2abf0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2ac00 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20  AUSE)==0.       
2ac10 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
2ac20 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
2ac30 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20  LIMIT)==0 );..  
2ac40 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
2ac50 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
2ac60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2ac70 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
2ac80 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
2ac90 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45  );..  /* An ORDE
2aca0 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  R/GROUP BY claus
2acb0 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36  e of more than 6
2acc0 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62  3 terms cannot b
2acd0 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20  e optimized */. 
2ace0 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65   testcase( pOrde
2acf0 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
2ad00 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
2ad10 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
2ad20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
2ad30 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72  pr>=BMS ) pOrder
2ad40 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70  By = 0;.  sWLB.p
2ad50 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2ad60 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
2ad70 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
2ad80 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
2ad90 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2ada0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
2adb0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2adc0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
2add0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
2ade0 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
2adf0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2ae00 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2ae10 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
2ae20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
2ae30 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
2ae40 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
2ae50 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2ae60 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2ae70 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2ae80 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2ae90 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
2aea0 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
2aeb0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
2aec0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
2aed0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
2aee0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
2aef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2af00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2af10 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
2af20 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
2af30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2af40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
2af50 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
2af60 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
2af70 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
2af80 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
2af90 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
2afa0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52   if the WHERE_OR
2afb0 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20  _SUBCLAUSE flag 
2afc0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
2afd0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
2afe0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
2aff0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
2b000 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
2b010 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
2b020 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
2b030 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b040 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
2b050 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
2b060 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
2b070 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
2b080 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2b090 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70  BCLAUSE) ? 1 : p
2b0a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
2b0b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2b0c0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2b0d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2b0e0 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
2b0f0 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
2b100 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
2b110 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
2b120 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2b130 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
2b140 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
2b150 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
2b160 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
2b170 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2b180 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
2b190 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
2b1a0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
2b1b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
2b1c0 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
2b1d0 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
2b1e0 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
2b1f0 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
2b200 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
2b210 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
2b220 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
2b230 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
2b240 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
2b250 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
2b260 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
2b270 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
2b280 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
2b290 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
2b2a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2b2b0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74  ocRawNN(db, nByt
2b2c0 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
2b2d0 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
2b2e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b2f0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
2b300 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
2b310 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
2b320 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
2b330 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2b340 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50    }.  pWInfo->pP
2b350 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2b360 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2b370 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2b380 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2b390 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
2b3a0 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20  WInfo->pWhere = 
2b3b0 70 57 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f  pWhere;.  pWInfo
2b3c0 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
2b3d0 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
2b3e0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2b3f0 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
2b400 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
2b410 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
2b420 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
2b430 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
2b440 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
2b450 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
2b460 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
2b470 61 72 73 65 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  arse);.  pWInfo-
2b480 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
2b490 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
2b4a0 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75  fo->iLimit = iAu
2b4b0 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  xArg;.  pWInfo->
2b4c0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
2b4d0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
2b4e0 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Loop;.  memset(&
2b4f0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
2b500 30 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66  0, .         off
2b510 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c  setof(WhereInfo,
2b520 73 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28  sWC) - offsetof(
2b530 57 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74  WhereInfo,nOBSat
2b540 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57  ));.  memset(&pW
2b550 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  Info->a[0], 0, s
2b560 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
2b570 2b 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66  +nTabList*sizeof
2b580 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
2b590 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2b5a0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2b5b0 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e  SS_OFF );  /* ON
2b5c0 45 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74  EPASS defaults t
2b5d0 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b  o OFF */.  pMask
2b5e0 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  Set = &pWInfo->s
2b5f0 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e  MaskSet;.  sWLB.
2b600 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
2b610 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70  .  sWLB.pWC = &p
2b620 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57  WInfo->sWC;.  sW
2b630 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65  LB.pNew = (Where
2b640 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70  Loop*)(((char*)p
2b650 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66  WInfo)+nByteWInf
2b660 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  o);.  assert( EI
2b670 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2b680 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b  NT(sWLB.pNew) );
2b690 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2b6a0 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
2b6b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2b6c0 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
2b6d0 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
2b6e0 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
2b6f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
2b700 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
2b710 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
2b720 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
2b730 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
2b740 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
2b750 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
2b760 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
2b770 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  kSet);.  sqlite3
2b780 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  WhereClauseInit(
2b790 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
2b7a0 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Info);.  sqlite3
2b7b0 57 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e  WhereSplit(&pWIn
2b7c0 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c  fo->sWC, pWhere,
2b7d0 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
2b7e0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
2b7f0 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
2b800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
2b810 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
2b820 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
2b830 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
2b840 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2b850 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
2b860 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2b870 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
2b880 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
2b890 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
2b8a0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
2b8b0 20 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75   }.    ExplainQu
2b8c0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
2b8d0 20 30 2c 20 22 53 43 41 4e 20 43 4f 4e 53 54 41   0, "SCAN CONSTA
2b8e0 4e 54 20 52 4f 57 22 29 29 3b 0a 20 20 7d 65 6c  NT ROW"));.  }el
2b8f0 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69 67  se{.    /* Assig
2b900 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
2b910 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
2b920 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
2b930 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  OM clause..    *
2b940 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d 74  *.    ** The N-t
2b950 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
2b960 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73  OM clause is ass
2b970 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20  igned a bitmask 
2b980 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a 0a  of 1<<N..    **.
2b990 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20      ** The rule 
2b9a0 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
2b9b0 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73  sentence ensures
2b9c0 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68   thta if X is th
2b9d0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20  e bitmask for.  
2b9e0 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20    ** a table T, 
2b9f0 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20  then X-1 is the 
2ba00 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
2ba10 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
2ba20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20  the left of T.. 
2ba30 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68     ** Knowing th
2ba40 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
2ba50 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2ba60 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
2ba70 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d  oin is.    ** im
2ba80 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
2ba90 20 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a 20   #3015..    **. 
2baa0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2bab0 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
2bac0 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
2bad0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
2bae0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54 61  es in.    ** pTa
2baf0 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
2bb00 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
2bb10 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
2bb20 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
2bb30 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  .    ** equal to
2bb40 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
2bb50 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
2bb60 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
2bb70 68 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 5f  he.    ** WHERE_
2bb80 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61  OR_SUBCLAUSE fla
2bb90 67 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f  g is set..    */
2bba0 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20 20  .    ii = 0;.   
2bbb0 20 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61 74   do{.      creat
2bbc0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
2bbd0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
2bbe0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2bbf0 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46  sqlite3WhereTabF
2bc00 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20  uncArgs(pParse, 
2bc10 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d  &pTabList->a[ii]
2bc20 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
2bc30 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
2bc40 69 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ii)<pTabList->nS
2bc50 72 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53  rc );.  #ifdef S
2bc60 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2bc70 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2bc80 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  mx = 0;.      fo
2bc90 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
2bca0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
2bcb0 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
2bcc0 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  k m = sqlite3Whe
2bcd0 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  reGetMask(pMaskS
2bce0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2bcf0 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
2bd00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e        assert( m>
2bd10 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  =mx );.        m
2bd20 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  x = m;.      }. 
2bd30 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
2bd40 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  }.  .  /* Analyz
2bd50 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
2bd60 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
2bd70 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78    sqlite3WhereEx
2bd80 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
2bd90 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
2bda0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
2bdb0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2bdc0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2bdd0 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
2bde0 63 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d  case: WHERE term
2bdf0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  s that do not re
2be00 66 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65  fer to any table
2be10 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20  s in the join.  
2be20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70  ** (constant exp
2be30 72 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75  ressions). Evalu
2be40 61 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65  ate each such te
2be50 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65  rm, and jump ove
2be60 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67  r all the.  ** g
2be70 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66  enerated code if
2be80 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
2be90 6f 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a  ot true.  .  **.
2bea0 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74    ** Do not do t
2beb0 68 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65  his if the expre
2bec0 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e  ssion contains n
2bed0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
2bee0 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20   functions.  ** 
2bef0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74  that are not wit
2bf00 68 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74  hin a sub-select
2bf10 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74  . This is not st
2bf20 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c  rictly required,
2bf30 20 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72   but.  ** preser
2bf40 76 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67  ves SQLite's leg
2bf50 61 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e  acy behaviour in
2bf60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2bf70 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20  wo cases:.  **. 
2bf80 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
2bf90 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b  HERE random()>0;
2bfa0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76             -- ev
2bfb0 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
2bfc0 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20   per row.  **   
2bfd0 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28  FROM ... WHERE (
2bfe0 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29  SELECT random())
2bff0 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e  >0;  -- eval ran
2c000 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61  dom() once overa
2c010 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  ll.  */.  for(ii
2c020 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d  =0; ii<sWLB.pWC-
2c030 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
2c040 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
2c050 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b   = &sWLB.pWC->a[
2c060 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d  ii];.    if( pT-
2c070 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2c080 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e  VIRTUAL ) contin
2c090 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 2d 3e  ue;.    if( pT->
2c0a0 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26 20  prereqAll==0 && 
2c0b0 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20  (nTabList==0 || 
2c0c0 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73  exprIsDeterminis
2c0d0 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29 20  tic(pT->pExpr)) 
2c0e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c0f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2c100 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20 70  se, pT->pExpr, p
2c110 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
2c120 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2c130 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74 46  );.      pT->wtF
2c140 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
2c150 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
2c160 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2c170 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2c180 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
2c190 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2c1a0 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2c1b0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2c1c0 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
2c1d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2c1e0 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
2c1f0 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
2c200 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
2c210 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2c220 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2c230 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2c240 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2c250 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2c260 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
2c270 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
2c280 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
2c290 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
2c2a0 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
2c2b0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2c2c0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
2c2d0 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
2c2e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2c2f0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
2c300 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
2c310 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
2c320 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2c330 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
2c340 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
2c350 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
2c360 65 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66  ereTrace & 0xfff
2c370 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
2c380 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a  DebugPrintf("***
2c390 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
2c3a0 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73   *** (wctrlFlags
2c3b0 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61  : 0x%x",wctrlFla
2c3c0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74  gs);.    if( wct
2c3d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c3e0 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  USE_LIMIT ){.   
2c3f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2c400 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20  rintf(", limit: 
2c410 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20  %d", iAuxArg);. 
2c420 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c430 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e  DebugPrintf(")\n
2c440 22 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ");.    if( sqli
2c450 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
2c460 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x100 ){.      S
2c470 65 6c 65 63 74 20 73 53 65 6c 65 63 74 3b 0a 20  elect sSelect;. 
2c480 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 65       memset(&sSe
2c490 6c 65 63 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lect, 0, sizeof(
2c4a0 73 53 65 6c 65 63 74 29 29 3b 0a 20 20 20 20 20  sSelect));.     
2c4b0 20 73 53 65 6c 65 63 74 2e 73 65 6c 46 6c 61 67   sSelect.selFlag
2c4c0 73 20 3d 20 53 46 5f 57 68 65 72 65 42 65 67 69  s = SF_WhereBegi
2c4d0 6e 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74  n;.      sSelect
2c4e0 2e 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74  .pSrc = pTabList
2c4f0 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e  ;.      sSelect.
2c500 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
2c510 0a 20 20 20 20 20 20 73 53 65 6c 65 63 74 2e 70  .      sSelect.p
2c520 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2c530 42 79 3b 0a 20 20 20 20 20 20 73 53 65 6c 65 63  By;.      sSelec
2c540 74 2e 70 45 4c 69 73 74 20 3d 20 70 52 65 73 75  t.pEList = pResu
2c550 6c 74 53 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  ltSet;.      sql
2c560 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2c570 63 74 28 30 2c 20 26 73 53 65 6c 65 63 74 2c 20  ct(0, &sSelect, 
2c580 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
2c590 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2c5a0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2c5b0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2c5c0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2c5d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2c5e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2c5f0 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57  usePrint(sWLB.pW
2c600 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
2c610 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
2c620 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
2c630 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
2c640 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2c650 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
2c660 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c670 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2c680 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
2c690 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2c6a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2c6b0 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
2c6c0 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2c6d0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2c6e0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
2c6f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
2c700 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2c710 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2c720 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
2c730 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
2c740 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2c750 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2c790 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
2c7a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
2c7b0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
2c7c0 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
2c7d0 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
2c7e0 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
2c7f0 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c  bel[i%(sizeof(zL
2c800 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20  abel)-1)];.     
2c810 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2c820 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
2c830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2c840 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
2c850 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2c860 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
2c870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c880 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c890 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
2c8a0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2c8b0 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
2c8c0 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
2c8d0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
2c8e0 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
2c8f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2c900 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2c910 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
2c920 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
2c930 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
2c940 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
2c950 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
2c960 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
2c970 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
2c980 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20  = ALLBITS;.  }. 
2c990 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2c9a0 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
2c9b0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
2c9c0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2c9d0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
2c9e0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2c9f0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2ca00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2ca10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
2ca20 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
2ca30 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
2ca40 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
2ca50 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
2ca60 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
2ca70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2ca80 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
2ca90 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
2caa0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
2cab0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
2cac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
2cad0 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
2cae0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
2caf0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
2cb00 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
2cb10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2cb20 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
2cb30 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
2cb40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2cb50 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2cb60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2cb70 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2cb80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2cb90 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2cba0 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
2cbb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2cbc0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
2cbd0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2cbe0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
2cbf0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2cc00 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2cc10 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
2cc20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2cc30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2cc40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2cc50 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
2cc60 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
2cc70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
2cc80 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2cc90 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
2cca0 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
2ccb0 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
2ccc0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
2ccd0 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
2cce0 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
2ccf0 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61  in that do not a
2cd00 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
2cd10 2e 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62  ..  ** For a tab
2cd20 6c 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74  le to not affect
2cd30 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65   the result, the
2cd40 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20   following must 
2cd50 62 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  be true:.  **.  
2cd60 2a 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72  **   1) The quer
2cd70 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e  y must not be an
2cd80 20 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a   aggregate..  **
2cd90 20 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20     2) The table 
2cda0 6d 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20  must be the RHS 
2cdb0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
2cdc0 20 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72    **   3) Either
2cdd0 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2cde0 62 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20  be DISTINCT, or 
2cdf0 65 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55  else the ON or U
2ce00 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a  SING clause.  **
2ce10 20 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61        must conta
2ce20 69 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  in a constraint 
2ce30 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20  that limits the 
2ce40 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  scan of the tabl
2ce50 65 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20  e to .  **      
2ce60 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65  at most a single
2ce70 20 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20   row..  **   4) 
2ce80 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e  The table must n
2ce90 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64  ot be referenced
2cea0 20 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20   by any part of 
2ceb0 74 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a  the query apart.
2cec0 20 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69    **      from i
2ced0 74 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20  ts own USING or 
2cee0 4f 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  ON clause..  **.
2cef0 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
2cf00 2c 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20  , given:.  **.  
2cf10 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
2cf20 42 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47  BLE t1(ipk INTEG
2cf30 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2cf40 76 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  v1);.  **     CR
2cf50 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70  EATE TABLE t2(ip
2cf60 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
2cf70 59 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a  Y KEY, v2);.  **
2cf80 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2cf90 45 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52  E t3(ipk INTEGER
2cfa0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33   PRIMARY KEY, v3
2cfb0 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65  );.  **.  ** the
2cfc0 6e 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62  n table t2 can b
2cfd0 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
2cfe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2cff0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2d000 43 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74  CT v1, v3 FROM t
2d010 31 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45  1 .  **       LE
2d020 46 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47  FT JOIN t2 USING
2d030 20 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29   (t1.ipk=t2.ipk)
2d040 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54  .  **       LEFT
2d050 20 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28   JOIN t3 USING (
2d060 74 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20  t1.ipk=t3.ipk). 
2d070 20 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d   **.  ** or from
2d080 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2d090 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2d0a0 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a  v1, v3 FROM t1 .
2d0b0 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2d0c0 4a 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20  JOIN t2.  **    
2d0d0 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20     LEFT JOIN t3 
2d0e0 55 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33  USING (t1.ipk=t3
2d0f0 2e 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 6e 6f 74  .ipk).  */.  not
2d100 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
2d110 6b 29 30 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  k)0;.  if( pWInf
2d120 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
2d130 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
2d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d150 2a 20 67 75 61 72 61 6e 74 65 65 73 20 63 6f 6e  * guarantees con
2d160 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65  dition (1) above
2d170 20 2a 2f 0a 20 20 20 26 26 20 4f 70 74 69 6d 69   */.   && Optimi
2d180 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2d190 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
2d1a0 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
2d1b0 69 6e 74 20 69 3b 0a 20 20 20 20 42 69 74 6d 61  int i;.    Bitma
2d1c0 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
2d1d0 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
2d1e0 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
2d1f0 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20   pResultSet);.  
2d200 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65    if( sWLB.pOrde
2d210 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62  rBy ){.      tab
2d220 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57  Used |= sqlite3W
2d230 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
2d240 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
2d250 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2d260 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 57 49 6e  }.    for(i=pWIn
2d270 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
2d280 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; i--){.      
2d290 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2d2a0 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 73  , *pEnd;.      s
2d2b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d2c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2d2d0 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
2d2e0 3e 61 5b 69 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[i].pWLoop;.  
2d2f0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 57 49      pItem = &pWI
2d300 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2d310 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 3b 0a 20  [pLoop->iTab];. 
2d320 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d       if( (pItem-
2d330 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2d340 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 63 6f 6e  T_LEFT)==0 ) con
2d350 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2d360 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2d370 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2d380 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
2d390 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2d3a0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
2d3b0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
2d3c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2d3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d3e0 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f   (tabUsed & pLoo
2d3f0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  p->maskSelf)!=0 
2d400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d410 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
2d420 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
2d430 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
2d440 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
2d450 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
2d460 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2d470 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2d480 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
2d490 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2d4a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d4b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d4c0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
2d4d0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
2d4e0 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
2d4f0 3e 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f  >pExpr->iRightJo
2d500 69 6e 54 61 62 6c 65 21 3d 70 49 74 65 6d 2d 3e  inTable!=pItem->
2d510 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 20  iCursor.        
2d520 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2d530 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d540 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d550 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d560 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 63 6f 6e  pTerm<pEnd ) con
2d570 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45  tinue;.      WHE
2d580 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
2d590 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
2d5a0 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
2d5b0 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
2d5c0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
2d5d0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2d5e0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
2d5f0 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
2d600 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
2d610 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2d620 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
2d630 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
2d640 65 6c 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  elf)!=0 ){.     
2d650 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2d660 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2d670 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  D;.        }.   
2d680 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2d690 21 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  !=pWInfo->nLevel
2d6a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  -1 ){.        in
2d6b0 74 20 6e 42 79 74 65 20 3d 20 28 70 57 49 6e 66  t nByte = (pWInf
2d6c0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a  o->nLevel-1-i) *
2d6d0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76   sizeof(WhereLev
2d6e0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  el);.        mem
2d6f0 6d 6f 76 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b  move(&pWInfo->a[
2d700 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  i], &pWInfo->a[i
2d710 2b 31 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  +1], nByte);.   
2d720 20 20 20 7d 0a 20 20 20 20 20 20 70 57 49 6e 66     }.      pWInf
2d730 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
2d740 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
2d750 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
2d760 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
2d770 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2d780 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2d790 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
2d7a0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
2d7b0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
2d7c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2d7d0 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
2d7e0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2d7f0 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
2d800 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
2d810 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
2d820 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
2d830 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
2d840 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
2d850 2a 0a 20 20 2a 2a 20 41 20 6f 6e 65 2d 70 61 73  *.  ** A one-pas
2d860 73 20 61 70 70 72 6f 61 63 68 20 63 61 6e 20 62  s approach can b
2d870 65 20 75 73 65 64 20 69 66 20 74 68 65 20 63 61  e used if the ca
2d880 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
2d890 65 64 20 6f 6e 65 0a 20 20 2a 2a 20 61 6e 64 20  ed one.  ** and 
2d8a0 65 69 74 68 65 72 20 28 61 29 20 74 68 65 20 73  either (a) the s
2d8b0 63 61 6e 20 76 69 73 69 74 73 20 61 74 20 6d 6f  can visits at mo
2d8c0 73 74 20 6f 6e 65 20 72 6f 77 20 6f 72 20 28 62  st one row or (b
2d8d0 29 20 65 61 63 68 0a 20 20 2a 2a 20 6f 66 20 74  ) each.  ** of t
2d8e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2d8f0 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
2d900 20 20 20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20     * the caller 
2d910 68 61 73 20 69 6e 64 69 63 61 74 65 64 20 74 68  has indicated th
2d920 61 74 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70  at a one-pass ap
2d930 70 72 6f 61 63 68 20 63 61 6e 20 62 65 20 75 73  proach can be us
2d940 65 64 0a 20 20 2a 2a 20 20 20 20 20 77 69 74 68  ed.  **     with
2d950 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 28   multiple rows (
2d960 62 79 20 73 65 74 74 69 6e 67 20 57 48 45 52 45  by setting WHERE
2d970 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2d980 57 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a  W), and.  **   *
2d990 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
2d9a0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
2d9b0 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 2a 20  e, and.  **   * 
2d9c0 65 69 74 68 65 72 20 74 68 65 20 73 63 61 6e 20  either the scan 
2d9d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65  does not use the
2d9e0 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
2d9f0 20 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   or the caller. 
2da00 20 2a 2a 20 20 20 20 20 69 73 20 61 20 44 45 4c   **     is a DEL
2da10 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 28 57  ETE operation (W
2da20 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2da30 4f 4b 20 69 73 20 6f 6e 6c 79 20 73 70 65 63 69  OK is only speci
2da40 66 69 65 64 0a 20 20 2a 2a 20 20 20 20 20 66 6f  fied.  **     fo
2da50 72 20 44 45 4c 45 54 45 29 2e 0a 20 20 2a 2a 0a  r DELETE)..  **.
2da60 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 71 75    ** The last qu
2da70 61 6c 69 66 69 63 61 74 69 6f 6e 20 69 73 20 62  alification is b
2da80 65 63 61 75 73 65 20 61 6e 20 55 50 44 41 54 45  ecause an UPDATE
2da90 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 73 0a   statement uses.
2daa0 20 20 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61    ** WhereInfo.a
2dab0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 74  iCurOnePass[1] t
2dac0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2dad0 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 72 65  her or not it re
2dae0 61 6c 6c 79 20 63 61 6e 0a 20 20 2a 2a 20 75 73  ally can.  ** us
2daf0 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 70 70  e a one-pass app
2db00 72 6f 61 63 68 2c 20 61 6e 64 20 74 68 69 73 20  roach, and this 
2db10 69 73 20 6e 6f 74 20 73 65 74 20 61 63 63 75 72  is not set accur
2db20 61 74 65 6c 79 20 66 6f 72 20 73 63 61 6e 73 0a  ately for scans.
2db30 20 20 2a 2a 20 74 68 61 74 20 75 73 65 20 74 68    ** that use th
2db40 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
2db50 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2db60 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2db70 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2db80 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2db90 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2dba0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2dbb0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2dbc0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2dbd0 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
2dbe0 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
2dbf0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2dc00 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
2dc10 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
2dc20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
2dc30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  ;.    assert( !(
2dc40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2dc50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 7c 7c  VIRTUALTABLE) ||
2dc60 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c   IsVirtual(pTabL
2dc70 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2dc80 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72  );.    if( bOner
2dc90 6f 77 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  ow || (.        
2dca0 30 21 3d 28 77 63 74 72 6c 46 6c 61 67 73 20 26  0!=(wctrlFlags &
2dcb0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2dcc0 55 4c 54 49 52 4f 57 29 0a 20 20 20 20 20 26 26  ULTIROW).     &&
2dcd0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
2dce0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
2dcf0 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 77 73  .     && (0==(ws
2dd00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2dd10 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72  LTI_OR) || (wctr
2dd20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2dd30 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 29 0a 20  UPLICATES_OK)). 
2dd40 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 57 49     )){.      pWI
2dd50 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20  nfo->eOnePass = 
2dd60 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53  bOnerow ? ONEPAS
2dd70 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41  S_SINGLE : ONEPA
2dd80 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20  SS_MULTI;.      
2dd90 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
2dda0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2ddb0 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20  ) && (wsFlags & 
2ddc0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2ddd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
2dde0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ddf0 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
2de00 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
2de10 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46  bFordelete = OPF
2de20 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20  LAG_FORDELETE;. 
2de30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de40 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
2de50 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
2de60 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52  (wsFlags & ~WHER
2de70 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20  E_IDX_ONLY);.   
2de80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2de90 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
2dea0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
2deb0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
2dec0 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
2ded0 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
2dee0 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2def0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20   */.  for(ii=0, 
2df00 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2df10 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
2df20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2df30 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2df40 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2df50 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2df60 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2df70 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2df80 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2df90 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
2dfa0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2dfb0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
2dfc0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
2dfd0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2dfe0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2dff0 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
2e000 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
2e010 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2e020 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2e030 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
2e040 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2e050 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
2e060 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2e070 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2e080 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
2e090 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
2e0a0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
2e0b0 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
2e0c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2e0d0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2e0e0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2e0f0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2e100 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
2e110 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
2e120 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
2e130 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
2e140 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2e150 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
2e160 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2e170 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
2e180 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2e190 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
2e1a0 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
2e1b0 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
2e1c0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2e1d0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
2e1e0 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
2e1f0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2e200 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2e210 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2e220 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
2e230 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2e240 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2e250 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
2e260 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
2e270 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Read;.      if( 
2e280 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2e290 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
2e2a0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2e2b0 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2e2c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2e2d0 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54  rOnePass[0] = pT
2e2e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2e2f0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
2e300 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
2e310 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
2e320 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
2e330 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
2e340 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2e350 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65  em->iCursor==pLe
2e360 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a  vel->iTabCur );.
2e370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e380 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2e390 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2e3a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2e3b0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
2e3c0 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
2e3d0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2e3e0 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2e3f0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2e400 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2e410 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2e420 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  F && pTab->nCol<
2e430 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
2e440 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2e450 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
2e460 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
2e470 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2e480 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
2e490 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
2e4a0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
2e4b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2e4c0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54  , -1, SQLITE_INT
2e4d0 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
2e4e0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
2e4f0 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
2e500 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
2e510 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e520 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
2e530 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  S.      if( pLoo
2e540 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2e550 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x!=0 ){.        
2e560 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2e570 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
2e580 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29  EKEQ|bFordelete)
2e590 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2e5a0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
2e5b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e5c0 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72  ChangeP5(v, bFor
2e5d0 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
2e5e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2e5f0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2e600 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
2e610 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
2e620 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
2e630 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
2e640 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
2e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e660 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
2e670 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
2e680 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
2e690 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
2e6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2e6b0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2e6c0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2e6d0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2e6e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2e6f0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2e700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2e710 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
2e720 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
2e730 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2e740 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
2e750 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
2e760 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
2e770 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78  d;.      /* iAux
2e780 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  Arg is always se
2e790 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20  t to a positive 
2e7a0 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53  value if ONEPASS
2e7b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   is possible */.
2e7c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41        assert( iA
2e7d0 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49  uxArg!=0 || (pWI
2e7e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2e7f0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2e800 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20  DESIRED)==0 );. 
2e810 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2e820 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
2e830 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2e840 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63  x).       && (wc
2e850 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e860 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
2e870 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
2e880 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e     /* This is on
2e890 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d  e term of an OR-
2e8a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69  optimization usi
2e8b0 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2e8c0 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  EY of a.        
2e8d0 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ** WITHOUT ROWID
2e8e0 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64   table.  No need
2e8f0 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20   for a separate 
2e900 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
2e910 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
2e920 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
2e930 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20        op = 0;.  
2e940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
2e950 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2e960 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2e970 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
2e980 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2e990 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
2e9a0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
2e9b0 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
2e9c0 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
2e9d0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2e9e0 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
2e9f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
2ea00 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
2ea10 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
2ea20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
2ea30 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
2ea40 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
2ea50 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2ea60 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
2ea70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
2ea80 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
2ea90 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
2eaa0 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67  else if( iAuxArg
2eab0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2eac0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2ead0 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  AUSE)!=0 ){.    
2eae0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2eaf0 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
2eb00 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49   op = OP_ReopenI
2eb10 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dx;.      }else{
2eb20 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2eb30 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2eb40 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
2eb50 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
2eb60 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  ur = iIndexCur;.
2eb70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2eb80 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
2eb90 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
2eba0 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
2ebb0 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
2ebc0 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20   if( op ){.     
2ebd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ebe0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64  dOp3(v, op, iInd
2ebf0 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
2ec00 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
2ec10 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
2ec20 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
2ec30 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pIx);.        if
2ec40 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2ec50 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
2ec60 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20  AINT)!=0.       
2ec70 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
2ec80 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
2ec90 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
2eca0 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20  _SKIPSCAN))==0. 
2ecb0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
2ecc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2ecd0 52 45 5f 42 49 47 4e 55 4c 4c 5f 53 4f 52 54 29  RE_BIGNULL_SORT)
2ece0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2ecf0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2ed00 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
2ed10 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  Y_MIN)==0.      
2ed20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
2ed30 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45 5f 44  istinct!=WHERE_D
2ed40 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a  ISTINCT_ORDERED.
2ed50 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2ed60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed70 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2ed80 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48  AG_SEEKEQ); /* H
2ed90 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f  int to COMDB2 */
2eda0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2edb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2edc0 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
2edd0 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ame));.#ifdef SQ
2ede0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2edf0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
2ee00 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2ee10 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d 20 30   u64 colUsed = 0
2ee20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2ee30 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  ii, jj;.        
2ee40 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2ee50 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  Ix->nColumn; ii+
2ee60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2ee70 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75  jj = pIx->aiColu
2ee80 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  mn[ii];.        
2ee90 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29 20 63      if( jj<0 ) c
2eea0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2eeb0 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33 20 29       if( jj>63 )
2eec0 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20 20   jj = 63;.      
2eed0 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49        if( (pTabI
2eee0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  tem->colUsed & M
2eef0 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29  ASKBIT(jj))==0 )
2ef00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ef10 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
2ef20 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69 69 3c  = ((u64)1)<<(ii<
2ef30 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20  63 ? ii : 63);. 
2ef40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ef50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ef60 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
2ef70 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49  _ColumnsUsed, iI
2ef80 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20  ndexCur, 0, 0,. 
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2efb0 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50 34  u8*)&colUsed, P4
2efc0 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
2efd0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
2efe0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2eff0 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20  N_USED_MASK */. 
2f000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f010 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71   if( iDb>=0 ) sq
2f020 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2f030 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2f040 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
2f050 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
2f060 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f070 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
2f080 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2f090 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2f0a0 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
2f0b0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
2f0c0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
2f0d0 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
2f0e0 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
2f0f0 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
2f100 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
2f110 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
2f120 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
2f130 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 66  rogram..  */.  f
2f140 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
2f150 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
2f160 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
2f170 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  ;.    int wsFlag
2f180 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  s;.    pLevel = 
2f190 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
2f1a0 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c      wsFlags = pL
2f1b0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
2f1c0 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53  Flags;.#ifndef S
2f1d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2f1e0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
2f1f0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
2f200 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2f210 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
2f220 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2f230 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
2f240 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
2f250 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
2f260 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
2f270 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2f280 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
2f290 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
2f2a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2f2b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2f2c0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
2f2d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64   }.#endif.    ad
2f2e0 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
2f2f0 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
2f300 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
2f310 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2f320 2c 20 70 4c 65 76 65 6c 2c 20 77 63 74 72 6c 46  , pLevel, wctrlF
2f330 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20  lags.    );.    
2f340 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2f350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2f360 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2f370 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c    notReady = sql
2f380 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65  ite3WhereCodeOne
2f390 4c 6f 6f 70 53 74 61 72 74 28 70 50 61 72 73 65  LoopStart(pParse
2f3a0 2c 76 2c 70 57 49 6e 66 6f 2c 69 69 2c 70 4c 65  ,v,pWInfo,ii,pLe
2f3b0 76 65 6c 2c 6e 6f 74 52 65 61 64 79 29 3b 0a 20  vel,notReady);. 
2f3c0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2f3d0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2f3e0 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
2f3f0 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
2f400 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
2f410 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2f420 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2f430 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2f440 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2f450 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
2f460 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
2f470 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
2f480 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
2f490 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2f4a0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
2f4b0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2f4c0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
2f4d0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
2f4e0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2f4f0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
2f500 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
2f510 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
2f520 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2f530 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2f540 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
2f550 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2f560 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
2f570 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
2f580 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 57 68  art of sqlite3Wh
2f590 65 72 65 45 6e 64 28 29 20 77 69 6c 6c 20 72 65  ereEnd() will re
2f5a0 77 72 69 74 65 20 6f 70 63 6f 64 65 73 20 74 6f  write opcodes to
2f5b0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 0a 2a   reference the.*
2f5c0 2a 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  * index rather t
2f5d0 68 61 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62  han the main tab
2f5e0 6c 65 2e 20 20 49 6e 20 53 51 4c 49 54 45 5f 44  le.  In SQLITE_D
2f5f0 45 42 55 47 20 6d 6f 64 65 2c 20 77 65 20 77 61  EBUG mode, we wa
2f600 6e 74 0a 2a 2a 20 74 6f 20 74 72 61 63 65 20 74  nt.** to trace t
2f610 68 6f 73 65 20 63 68 61 6e 67 65 73 20 69 66 20  hose changes if 
2f620 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
2f630 70 74 72 61 63 65 3d 6f 6e 2e 20 20 54 68 69 73  ptrace=on.  This
2f640 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
2f650 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65   that..*/.#ifnde
2f660 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
2f670 20 64 65 66 69 6e 65 20 4f 70 63 6f 64 65 52 65   define OpcodeRe
2f680 77 72 69 74 65 54 72 61 63 65 28 44 2c 4b 2c 50  writeTrace(D,K,P
2f690 29 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65  ) /* no-op */.#e
2f6a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4f 70 63  lse.# define Opc
2f6b0 6f 64 65 52 65 77 72 69 74 65 54 72 61 63 65 28  odeRewriteTrace(
2f6c0 44 2c 4b 2c 50 29 20 73 71 6c 69 74 65 33 57 68  D,K,P) sqlite3Wh
2f6d0 65 72 65 4f 70 63 6f 64 65 52 65 77 72 69 74 65  ereOpcodeRewrite
2f6e0 54 72 61 63 65 28 44 2c 4b 2c 50 29 0a 20 20 73  Trace(D,K,P).  s
2f6f0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2f700 65 33 57 68 65 72 65 4f 70 63 6f 64 65 52 65 77  e3WhereOpcodeRew
2f710 72 69 74 65 54 72 61 63 65 28 0a 20 20 20 20 73  riteTrace(.    s
2f720 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 20 20  qlite3 *db,.    
2f730 69 6e 74 20 70 63 2c 0a 20 20 20 20 56 64 62 65  int pc,.    Vdbe
2f740 4f 70 20 2a 70 4f 70 0a 20 20 29 7b 0a 20 20 20  Op *pOp.  ){.   
2f750 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
2f760 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
2f770 6f 70 54 72 61 63 65 29 3d 3d 30 20 29 20 72 65  opTrace)==0 ) re
2f780 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
2f790 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
2f7a0 70 63 2c 20 70 4f 70 29 3b 0a 20 20 7d 0a 23 65  pc, pOp);.  }.#e
2f7b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
2f7c0 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
2f7d0 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
2f7e0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
2f7f0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
2f800 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
2f810 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2f820 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2f830 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
2f840 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2f850 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f860 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2f870 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
2f880 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2f890 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
2f8a0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57  vel *pLevel;.  W
2f8b0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2f8c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2f8d0 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2f8e0 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
2f8f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2f900 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
2f910 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
2f920 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
2f930 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2f940 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2f950 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 66 6f  RE-core"));.  fo
2f960 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2f970 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2f980 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
2f990 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2f9a0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2f9b0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2f9c0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
2f9d0 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
2f9e0 6f 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  oop ){.#ifndef S
2f9f0 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b  QLITE_DISABLE_SK
2fa00 49 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54  IPAHEAD_DISTINCT
2fa10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2fa20 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 49  eek = 0;.      I
2fa30 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
2fa40 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
2fa50 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
2fa60 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
2fa70 49 4e 43 54 5f 4f 52 44 45 52 45 44 0a 20 20 20  INCT_ORDERED.   
2fa80 20 20 20 20 26 26 20 69 3d 3d 70 57 49 6e 66 6f      && i==pWInfo
2fa90 2d 3e 6e 4c 65 76 65 6c 2d 31 20 20 2f 2a 20 54  ->nLevel-1  /* T
2faa0 69 63 6b 65 74 20 5b 65 66 39 33 31 38 37 35 37  icket [ef9318757
2fab0 62 31 35 32 65 33 5d 20 32 30 31 37 2d 31 30 2d  b152e3] 2017-10-
2fac0 32 31 20 2a 2f 0a 20 20 20 20 20 20 20 26 26 20  21 */.       && 
2fad0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2fae0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2faf0 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  !=0.       && (p
2fb00 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2fb10 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61  tree.pIndex)->ha
2fb20 73 53 74 61 74 31 0a 20 20 20 20 20 20 20 26 26  sStat1.       &&
2fb30 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   (n = pLoop->u.b
2fb40 74 72 65 65 2e 6e 44 69 73 74 69 6e 63 74 43 6f  tree.nDistinctCo
2fb50 6c 29 3e 30 0a 20 20 20 20 20 20 20 26 26 20 70  l)>0.       && p
2fb60 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
2fb70 5b 6e 5d 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b  [n]>=36.      ){
2fb80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
2fb90 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2fba0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c  ;.        int j,
2fbb0 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   op;.        for
2fbc0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=0; j<n; j++){
2fbd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fbe0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2fbf0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65  OP_Column, pLeve
2fc00 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  l->iIdxCur, j, r
2fc10 31 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  1+j);.        }.
2fc20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2fc30 6e 4d 65 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20  nMem += n+1;.   
2fc40 20 20 20 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c       op = pLevel
2fc50 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20  ->op==OP_Prev ? 
2fc60 4f 50 5f 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53  OP_SeekLT : OP_S
2fc70 65 65 6b 47 54 3b 0a 20 20 20 20 20 20 20 20 61  eekGT;.        a
2fc80 64 64 72 53 65 65 6b 20 3d 20 73 71 6c 69 74 65  ddrSeek = sqlite
2fc90 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2fca0 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  , op, pLevel->iI
2fcb0 64 78 43 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29  dxCur, 0, r1, n)
2fcc0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2fcd0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2fce0 4f 50 5f 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20  OP_SeekLT);.    
2fcf0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2fd00 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
2fd10 6b 47 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  kGT);.        sq
2fd20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fd30 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70  v, OP_Goto, 1, p
2fd40 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
2fd50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2fd60 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49  LITE_DISABLE_SKI
2fd70 50 41 48 45 41 44 5f 44 49 53 54 49 4e 43 54 20  PAHEAD_DISTINCT 
2fd80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  */.      /* The 
2fd90 63 6f 6d 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76  common case: Adv
2fda0 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
2fdb0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 73 71   row */.      sq
2fdc0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2fdd0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2fde0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
2fdf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fe00 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op3(v, pLevel->o
2fe10 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
2fe20 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65  Level->p2, pLeve
2fe30 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71  l->p3);.      sq
2fe40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2fe50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
2fe60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2fe70 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2fe80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2fe90 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2fea0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62  Next);.      Vdb
2feb0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2fec0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72  Level->op==OP_Pr
2fed0 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ev);.      VdbeC
2fee0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
2fef0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78  vel->op==OP_VNex
2ff00 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  t);.      if( pL
2ff10 65 76 65 6c 2d 3e 72 65 67 42 69 67 6e 75 6c 6c  evel->regBignull
2ff20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ff30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2ff40 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2ff50 64 64 72 42 69 67 6e 75 6c 6c 29 3b 0a 20 20 20  ddrBignull);.   
2ff60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ff70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
2ff80 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 4c 65 76 65  rJumpZero, pLeve
2ff90 6c 2d 3e 72 65 67 42 69 67 6e 75 6c 6c 2c 20 70  l->regBignull, p
2ffa0 4c 65 76 65 6c 2d 3e 70 32 2d 31 29 3b 0a 20 20  Level->p2-1);.  
2ffb0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ffc0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ge(v);.      }.#
2ffd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2ffe0 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f  SABLE_SKIPAHEAD_
2fff0 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69  DISTINCT.      i
30000 66 28 20 61 64 64 72 53 65 65 6b 20 29 20 73 71  f( addrSeek ) sq
30010 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30020 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a  e(v, addrSeek);.
30030 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
30040 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
30050 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30060 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
30070 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
30080 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
30090 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
300a0 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
300b0 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
300c0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
300d0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
300e0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
300f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30100 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
30110 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
30120 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
30130 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
30140 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
30150 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
30160 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
30170 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30180 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
30190 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
301a0 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  if( pIn->eEndLoo
301b0 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  pOp!=OP_Noop ){.
301c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
301d0 6e 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  n->nPrefix ){.  
301e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
301f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
30200 20 26 20 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c   & WHERE_IN_EARL
30210 59 4f 55 54 20 29 3b 0a 20 20 20 20 20 20 20 20  YOUT );.        
30220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30230 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
30240 66 4e 6f 48 6f 70 65 2c 20 70 4c 65 76 65 6c 2d  fNoHope, pLevel-
30250 3e 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20  >iIdxCur,.      
30260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30280 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
30290 29 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )+2,.           
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302b0 20 20 20 70 49 6e 2d 3e 69 42 61 73 65 2c 20 70     pIn->iBase, p
302c0 49 6e 2d 3e 6e 50 72 65 66 69 78 29 3b 0a 20 20  In->nPrefix);.  
302d0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
302e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
302f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30310 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
30320 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
30330 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
30340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
30350 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30360 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
30370 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
30380 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
30390 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ev);.          V
303a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
303b0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
303c0 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20  ==OP_Next);.    
303d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
303e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
303f0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
30400 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
30410 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30420 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30430 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
30440 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
30450 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
30460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30470 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
30480 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
30490 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
304a0 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
304b0 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
304c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
304d0 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
304e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
304f0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
30500 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
30510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
30520 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
30530 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
30540 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
30550 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
30560 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
30570 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
30580 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
30590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
305a0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
305b0 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65  pZero, (int)(pLe
305c0 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
305d0 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20  r>>1),.         
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
305f0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
30600 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ep);.      VdbeC
30610 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
30620 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
30630 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
30640 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
30650 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
30660 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ags;.      addr 
30670 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
30680 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
30690 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
306a0 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
306b0 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
306c0 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  rt( (ws & WHERE_
306d0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
306e0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
306f0 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
30700 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
30710 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
30720 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30730 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
30740 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ==pTabList->a[pL
30750 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
30760 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
30770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30780 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
30790 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
307a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
307b0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
307c0 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20  _INDEXED) .     
307d0 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52    || ((ws & WHER
307e0 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70  E_MULTI_OR) && p
307f0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
30800 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
30810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30820 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
30830 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
30840 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
30850 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
30860 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
30870 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30890 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
308a0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
308b0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
308c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
308d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
308e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
308f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
30900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
30910 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
30920 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
30930 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
30940 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
30950 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
30960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30970 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
30980 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30990 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
309a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
309b0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
309c0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
309d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
309e0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
309f0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
30a00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30a10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
30a20 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
30a30 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
30a40 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
30a50 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
30a60 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
30a70 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
30a80 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
30a90 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
30aa0 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
30ab0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
30ac0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
30ad0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
30ae0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
30af0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
30b00 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
30b10 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
30b20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
30b30 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
30b40 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
30b50 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
30b60 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
30b70 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
30b80 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
30b90 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
30ba0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
30bb0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
30bc0 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
30bd0 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
30be0 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
30bf0 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
30c00 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
30c10 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
30c20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
30c30 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
30c40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
30c50 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  e( pParse->db->m
30c60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
30c70 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
30c80 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73  lumnToCopy(pPars
30c90 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  e, pLevel->addrB
30ca0 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
30cb0 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cd0 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
30ce0 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
30cf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
30d00 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30d10 45 4e 41 42 4c 45 5f 45 41 52 4c 59 5f 43 55 52  ENABLE_EARLY_CUR
30d20 53 4f 52 5f 43 4c 4f 53 45 0a 20 20 20 20 2f 2a  SOR_CLOSE.    /*
30d30 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
30d40 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
30d50 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
30d60 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
30d70 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
30d80 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72  do not close cur
30d90 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62  sors that will b
30da0 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20  e reused by the 
30db0 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  OR optimization.
30dc0 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 52      ** (WHERE_OR
30dd0 5f 53 55 42 43 4c 41 55 53 45 29 2e 20 20 41 6e  _SUBCLAUSE).  An
30de0 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
30df0 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
30e00 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
30e10 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
30e20 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
30e30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
30e40 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
30e50 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
30e60 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
30e70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
30e80 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
30e90 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
30ea0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
30eb0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
30ec0 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
30ed0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
30ee0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
30ef0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
30f00 46 46 20 26 26 20 28 77 73 20 26 20 57 48 45 52  FF && (ws & WHER
30f10 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
30f20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30f30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30f40 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
30f50 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
30f60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
30f70 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
30f80 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
30f90 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50   (ws & (WHERE_IP
30fa0 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  K|WHERE_AUTO_IND
30fb0 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  EX))==0 .       
30fc0 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  && pLevel->iIdxC
30fd0 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ur!=pWInfo->aiCu
30fe0 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20  rOnePass[1].    
30ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
31000 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31010 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76  , OP_Close, pLev
31020 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
31030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
31040 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
31050 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
31060 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45  index, make VDBE
31070 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
31080 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
31090 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
310a0 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
310b0 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  f from the table
310c0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
310d0 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a    In some cases.
310e0 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69      ** this opti
310f0 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74  mization prevent
31100 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  s the table from
31110 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64   ever being read
31120 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20  , which can.    
31130 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69  ** yield a signi
31140 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e  ficant performan
31150 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a  ce boost..    **
31160 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
31170 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
31180 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
31190 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
311a0 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
311b0 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
311c0 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
311d0 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
311e0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
311f0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
31200 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
31210 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
31220 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
31230 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
31240 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
31250 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
31260 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
31270 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
31280 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
31290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
312a0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
312b0 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
312c0 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  |WHERE_IDX_ONLY)
312d0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
312e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
312f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
31300 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  e if( pLoop->wsF
31310 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
31320 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  TI_OR ){.      p
31330 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  Idx = pLevel->u.
31340 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20  pCovidx;.    }. 
31350 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20     if( pIdx.    
31360 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e   && (pWInfo->eOn
31370 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
31380 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  FF || !HasRowid(
31390 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20  pIdx->pTable)). 
313a0 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c      && !db->mall
313b0 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a  ocFailed.    ){.
313c0 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
313d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
313e0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20  ddr(v);.      k 
313f0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f  = pLevel->addrBo
31400 64 79 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dy;.#ifdef SQLIT
31410 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
31420 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
31430 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
31440 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
31450 72 69 6e 74 66 28 22 54 52 41 4e 53 4c 41 54 45  rintf("TRANSLATE
31460 20 6f 70 63 6f 64 65 73 20 69 6e 20 72 61 6e 67   opcodes in rang
31470 65 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 6b 2c 20  e %d..%d\n", k, 
31480 6c 61 73 74 2d 31 29 3b 0a 20 20 20 20 20 20 7d  last-1);.      }
31490 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4f  .#endif.      pO
314a0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
314b0 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20  etOp(v, k);.    
314c0 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20    for(; k<last; 
314d0 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
314e0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
314f0 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
31500 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
31510 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
31520 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
31530 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
31540 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
31550 5f 46 55 4e 43 0a 20 20 20 20 20 20 20 20 20 7c  _FUNC.         |
31560 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
31570 50 5f 4f 66 66 73 65 74 0a 23 65 6e 64 69 66 0a  P_Offset.#endif.
31580 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
31590 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70       int x = pOp
315a0 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
315b0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54  assert( pIdx->pT
315c0 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
315d0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
315e0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
315f0 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
31600 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
31610 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
31620 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
31630 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c    x = pPk->aiCol
31640 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20  umn[x];.        
31650 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
31660 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   );.          }e
31670 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
31680 20 74 65 73 74 63 61 73 65 28 20 78 21 3d 73 71   testcase( x!=sq
31690 6c 69 74 65 33 53 74 6f 72 61 67 65 43 6f 6c 75  lite3StorageColu
316a0 6d 6e 54 6f 54 61 62 6c 65 28 70 54 61 62 2c 78  mnToTable(pTab,x
316b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
316c0 20 78 20 3d 20 73 71 6c 69 74 65 33 53 74 6f 72   x = sqlite3Stor
316d0 61 67 65 43 6f 6c 75 6d 6e 54 6f 54 61 62 6c 65  ageColumnToTable
316e0 28 70 54 61 62 2c 78 29 3b 0a 20 20 20 20 20 20  (pTab,x);.      
316f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31700 78 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  x = sqlite3Table
31710 43 6f 6c 75 6d 6e 54 6f 49 6e 64 65 78 28 70 49  ColumnToIndex(pI
31720 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
31730 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
31740 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
31750 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
31760 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
31770 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
31780 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
31790 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
317a0 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
317b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
317c0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
317d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
317e0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
317f0 78 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x>=0 .          
31800 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65      || pWInfo->e
31810 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20  OnePass );.     
31820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
31830 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
31840 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
31850 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
31860 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
31870 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
31880 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
31890 20 20 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65            Opcode
318a0 52 65 77 72 69 74 65 54 72 61 63 65 28 64 62 2c  RewriteTrace(db,
318b0 20 6b 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20   k, pOp);.      
318c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
318d0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 75  >opcode==OP_IfNu
318e0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  llRow ){.       
318f0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
31900 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
31910 20 20 20 20 20 20 20 20 4f 70 63 6f 64 65 52 65          OpcodeRe
31920 77 72 69 74 65 54 72 61 63 65 28 64 62 2c 20 6b  writeTrace(db, k
31930 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
31940 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
31950 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31960 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
31970 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
31980 64 64 6f 70 54 72 61 63 65 20 29 20 70 72 69 6e  ddopTrace ) prin
31990 74 66 28 22 54 52 41 4e 53 4c 41 54 45 20 63 6f  tf("TRANSLATE co
319a0 6d 70 6c 65 74 65 5c 6e 22 29 3b 0a 23 65 6e 64  mplete\n");.#end
319b0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
319c0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
319d0 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
319e0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
319f0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
31a00 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
31a10 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
31a20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.